Fix multisession BlindWrite 5/6 images.

This commit is contained in:
2020-06-18 02:03:19 +01:00
parent 1a47117527
commit 3f1e417774
2 changed files with 25 additions and 34 deletions

View File

@@ -615,6 +615,7 @@ namespace Aaru.DiscImages
chars.SectorSize = sectorSize; chars.SectorSize = sectorSize;
chars.StartLba = dataFile.StartLba; chars.StartLba = dataFile.StartLba;
chars.Sectors = dataFile.Sectors; chars.Sectors = dataFile.Sectors;
chars.Offset = dataFile.Offset;
filePaths.Add(chars); filePaths.Add(chars);
} }
@@ -778,7 +779,8 @@ namespace Aaru.DiscImages
track.TrackFile = chars.FileFilter.GetFilename(); track.TrackFile = chars.FileFilter.GetFilename();
if(trk.startLba >= 0) if(trk.startLba >= 0)
track.TrackFileOffset = (ulong)((trk.startLba - chars.StartLba) * chars.SectorSize); track.TrackFileOffset =
(ulong)((trk.startLba - chars.StartLba) * chars.SectorSize) + chars.Offset;
else else
track.TrackFileOffset = (ulong)(trk.startLba * -1 * chars.SectorSize); track.TrackFileOffset = (ulong)(trk.startLba * -1 * chars.SectorSize);
@@ -828,6 +830,9 @@ namespace Aaru.DiscImages
offsetBytes += partition.Size; offsetBytes += partition.Size;
if(track.TrackStartSector >= trk.pregap)
track.TrackStartSector -= trk.pregap;
Tracks.Add(track); Tracks.Add(track);
Partitions.Add(partition); Partitions.Add(partition);
offsetmap.Add(track.TrackSequence, track.TrackStartSector); offsetmap.Add(track.TrackSequence, track.TrackStartSector);
@@ -1230,7 +1235,6 @@ namespace Aaru.DiscImages
{ {
// TODO: Cross data files // TODO: Cross data files
var aaruTrack = new Track(); var aaruTrack = new Track();
var chars = new DataFileCharacteristics();
aaruTrack.TrackSequence = 0; aaruTrack.TrackSequence = 0;
@@ -1248,16 +1252,12 @@ namespace Aaru.DiscImages
throw new ArgumentOutOfRangeException(nameof(length), throw new ArgumentOutOfRangeException(nameof(length),
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks"); $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks");
foreach(DataFileCharacteristics characteristics in filePaths.Where(characteristics => DataFileCharacteristics chars = (from characteristics in filePaths let firstSector =
(long)sectorAddress >= characteristics.StartLba let lastSector =
characteristics.StartLba && (firstSector + characteristics.Sectors) - 1 let wantedSector =
length < (ulong)characteristics. (int)(sectorAddress + aaruTrack.TrackStartSector)
Sectors - sectorAddress)) where wantedSector >= firstSector && wantedSector <= lastSector
{ select characteristics).FirstOrDefault();
chars = characteristics;
break;
}
if(string.IsNullOrEmpty(chars.FilePath) || if(string.IsNullOrEmpty(chars.FilePath) ||
chars.FileFilter == null) chars.FileFilter == null)
@@ -1369,7 +1369,6 @@ namespace Aaru.DiscImages
{ {
// TODO: Cross data files // TODO: Cross data files
var aaruTrack = new Track(); var aaruTrack = new Track();
var chars = new DataFileCharacteristics();
aaruTrack.TrackSequence = 0; aaruTrack.TrackSequence = 0;
@@ -1387,16 +1386,12 @@ namespace Aaru.DiscImages
throw new ArgumentOutOfRangeException(nameof(length), throw new ArgumentOutOfRangeException(nameof(length),
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks"); $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks");
foreach(DataFileCharacteristics characteristics in filePaths.Where(characteristics => DataFileCharacteristics chars = (from characteristics in filePaths let firstSector =
(long)sectorAddress >= characteristics.StartLba let lastSector =
characteristics.StartLba && (firstSector + characteristics.Sectors) - 1 let wantedSector =
length < (ulong)characteristics. (int)(sectorAddress + aaruTrack.TrackStartSector)
Sectors - sectorAddress)) where wantedSector >= firstSector && wantedSector <= lastSector
{ select characteristics).FirstOrDefault();
chars = characteristics;
break;
}
if(string.IsNullOrEmpty(chars.FilePath) || if(string.IsNullOrEmpty(chars.FilePath) ||
chars.FileFilter == null) chars.FileFilter == null)
@@ -1706,7 +1701,6 @@ namespace Aaru.DiscImages
{ {
// TODO: Cross data files // TODO: Cross data files
var aaruTrack = new Track(); var aaruTrack = new Track();
var chars = new DataFileCharacteristics();
aaruTrack.TrackSequence = 0; aaruTrack.TrackSequence = 0;
@@ -1724,16 +1718,12 @@ namespace Aaru.DiscImages
throw new ArgumentOutOfRangeException(nameof(length), throw new ArgumentOutOfRangeException(nameof(length),
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks"); $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks");
foreach(DataFileCharacteristics characteristics in filePaths.Where(characteristics => DataFileCharacteristics chars = (from characteristics in filePaths let firstSector =
(long)sectorAddress >= characteristics.StartLba let lastSector =
characteristics.StartLba && (firstSector + characteristics.Sectors) - 1 let wantedSector =
length < (ulong)characteristics. (int)(sectorAddress + aaruTrack.TrackStartSector)
Sectors - sectorAddress)) where wantedSector >= firstSector && wantedSector <= lastSector
{ select characteristics).FirstOrDefault();
chars = characteristics;
break;
}
if(string.IsNullOrEmpty(chars.FilePath) || if(string.IsNullOrEmpty(chars.FilePath) ||
chars.FileFilter == null) chars.FileFilter == null)

View File

@@ -162,6 +162,7 @@ namespace Aaru.DiscImages
public long SectorSize; public long SectorSize;
public int StartLba; public int StartLba;
public int Sectors; public int Sectors;
public uint Offset;
} }
} }
} }