mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
In DiscJuggler disc images do not generate long sectors on non-CD media. Fixes #499
This commit is contained in:
@@ -46,6 +46,7 @@ namespace Aaru.DiscImages
|
|||||||
byte[] _cdtext;
|
byte[] _cdtext;
|
||||||
ImageInfo _imageInfo;
|
ImageInfo _imageInfo;
|
||||||
Stream _imageStream;
|
Stream _imageStream;
|
||||||
|
bool _isCd;
|
||||||
Dictionary<uint, ulong> _offsetMap;
|
Dictionary<uint, ulong> _offsetMap;
|
||||||
SectorBuilder _sectorBuilder;
|
SectorBuilder _sectorBuilder;
|
||||||
Dictionary<uint, byte> _trackFlags;
|
Dictionary<uint, byte> _trackFlags;
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ namespace Aaru.DiscImages
|
|||||||
track.Indexes[idx.Key] = (int)track.TrackStartSector + leftLen;
|
track.Indexes[idx.Key] = (int)track.TrackStartSector + leftLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
track.TrackEndSector = (track.TrackStartSector + trackLen) - 1;
|
track.TrackEndSector = track.TrackStartSector + trackLen - 1;
|
||||||
AaruConsole.DebugWriteLine("DiscJuggler plugin", "\ttrackEnd = {0}", track.TrackEndSector);
|
AaruConsole.DebugWriteLine("DiscJuggler plugin", "\ttrackEnd = {0}", track.TrackEndSector);
|
||||||
position += 4;
|
position += 4;
|
||||||
|
|
||||||
@@ -722,12 +722,26 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
_sectorBuilder = new SectorBuilder();
|
_sectorBuilder = new SectorBuilder();
|
||||||
|
|
||||||
if(mediumType != 152)
|
_isCd = mediumType == 152;
|
||||||
foreach(Track track in Tracks)
|
|
||||||
{
|
if(_isCd)
|
||||||
track.TrackPregap = 0;
|
return true;
|
||||||
track.Indexes?.Clear();
|
|
||||||
}
|
foreach(Track track in Tracks)
|
||||||
|
{
|
||||||
|
track.TrackPregap = 0;
|
||||||
|
track.Indexes?.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSync);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorHeader);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSubHeader);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEcc);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccP);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccQ);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags);
|
||||||
|
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -762,9 +776,8 @@ namespace Aaru.DiscImages
|
|||||||
{
|
{
|
||||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
|
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
|
||||||
from track in Tracks where track.TrackSequence == kvp.Key
|
from track in Tracks where track.TrackSequence == kvp.Key
|
||||||
where sectorAddress - kvp.Value <
|
where sectorAddress - kvp.Value <
|
||||||
(track.TrackEndSector - track.TrackStartSector) + 1
|
track.TrackEndSector - track.TrackStartSector + 1 select kvp)
|
||||||
select kvp)
|
|
||||||
return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key);
|
return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key);
|
||||||
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
|
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
|
||||||
@@ -774,9 +787,8 @@ namespace Aaru.DiscImages
|
|||||||
{
|
{
|
||||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
|
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
|
||||||
from track in Tracks where track.TrackSequence == kvp.Key
|
from track in Tracks where track.TrackSequence == kvp.Key
|
||||||
where sectorAddress - kvp.Value <
|
where sectorAddress - kvp.Value <
|
||||||
(track.TrackEndSector - track.TrackStartSector) + 1
|
track.TrackEndSector - track.TrackStartSector + 1 select kvp)
|
||||||
select kvp)
|
|
||||||
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag);
|
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag);
|
||||||
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
|
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
|
||||||
@@ -799,9 +811,9 @@ namespace Aaru.DiscImages
|
|||||||
if(aaruTrack is null)
|
if(aaruTrack is null)
|
||||||
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
||||||
|
|
||||||
if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1)
|
if(length + sectorAddress > aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1)
|
||||||
throw new ArgumentOutOfRangeException(nameof(length),
|
throw new ArgumentOutOfRangeException(nameof(length),
|
||||||
$"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks");
|
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1}), won't cross tracks");
|
||||||
|
|
||||||
uint sectorOffset;
|
uint sectorOffset;
|
||||||
uint sectorSize;
|
uint sectorSize;
|
||||||
@@ -920,9 +932,9 @@ namespace Aaru.DiscImages
|
|||||||
if(aaruTrack is null)
|
if(aaruTrack is null)
|
||||||
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
||||||
|
|
||||||
if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1)
|
if(length + sectorAddress > aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1)
|
||||||
throw new ArgumentOutOfRangeException(nameof(length),
|
throw new ArgumentOutOfRangeException(nameof(length),
|
||||||
$"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks");
|
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1}), won't cross tracks");
|
||||||
|
|
||||||
if(aaruTrack.TrackType == TrackType.Data)
|
if(aaruTrack.TrackType == TrackType.Data)
|
||||||
throw new ArgumentException("Unsupported tag requested", nameof(tag));
|
throw new ArgumentException("Unsupported tag requested", nameof(tag));
|
||||||
@@ -1172,9 +1184,8 @@ namespace Aaru.DiscImages
|
|||||||
{
|
{
|
||||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
|
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
|
||||||
from track in Tracks where track.TrackSequence == kvp.Key
|
from track in Tracks where track.TrackSequence == kvp.Key
|
||||||
where sectorAddress - kvp.Value <
|
where sectorAddress - kvp.Value <
|
||||||
(track.TrackEndSector - track.TrackStartSector) + 1
|
track.TrackEndSector - track.TrackStartSector + 1 select kvp)
|
||||||
select kvp)
|
|
||||||
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key);
|
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key);
|
||||||
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
|
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
|
||||||
@@ -1182,6 +1193,9 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track)
|
public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track)
|
||||||
{
|
{
|
||||||
|
if(!_isCd)
|
||||||
|
return ReadSectors(sectorAddress, length, track);
|
||||||
|
|
||||||
var aaruTrack = new Track
|
var aaruTrack = new Track
|
||||||
{
|
{
|
||||||
TrackSequence = 0
|
TrackSequence = 0
|
||||||
@@ -1197,9 +1211,9 @@ namespace Aaru.DiscImages
|
|||||||
if(aaruTrack is null)
|
if(aaruTrack is null)
|
||||||
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
||||||
|
|
||||||
if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1)
|
if(length + sectorAddress > aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1)
|
||||||
throw new ArgumentOutOfRangeException(nameof(length),
|
throw new ArgumentOutOfRangeException(nameof(length),
|
||||||
$"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks");
|
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1}), won't cross tracks");
|
||||||
|
|
||||||
uint sectorSize = (uint)aaruTrack.TrackRawBytesPerSector;
|
uint sectorSize = (uint)aaruTrack.TrackRawBytesPerSector;
|
||||||
uint sectorSkip = 0;
|
uint sectorSkip = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user