Fix setting index sectors on multi-file CDRWin disc images. Fixes #643

This commit is contained in:
2021-07-23 12:02:20 +01:00
parent 501fcd69eb
commit 09a89fa51c

View File

@@ -1238,6 +1238,28 @@ namespace Aaru.DiscImages
foreach(CdrWinTrack track in _discImage.Tracks)
_imageInfo.ImageSize += track.Bps * track.Sectors;
int currentSector = 0;
int currentFileStartSector = 0;
string currentFilePath = "";
foreach(CdrWinTrack track in _discImage.Tracks)
{
if(track.TrackFile.DataFilter.GetBasePath() != currentFilePath)
{
currentFileStartSector = currentSector;
currentFilePath = track.TrackFile.DataFilter.GetBasePath();
}
Dictionary<ushort, int> newIndexes = new Dictionary<ushort, int>();
foreach(KeyValuePair<ushort, int> index in track.Indexes)
newIndexes[index.Key] = index.Value + currentFileStartSector;
track.Indexes = newIndexes;
currentSector += (int)track.Sectors;
}
for(int s = 0; s < sessions.Length; s++)
{
if(!_discImage.Tracks[(int)sessions[s].StartTrack - 1].Indexes.
@@ -1287,8 +1309,6 @@ namespace Aaru.DiscImages
Partitions = new List<Partition>();
ulong partitionSequence = 0;
ulong previousPartitionsSize = 0;
string previousFile = _discImage.Tracks[0].TrackFile.DataFilter.GetBasePath();
_offsetMap = new Dictionary<uint, ulong>();
@@ -1315,27 +1335,17 @@ namespace Aaru.DiscImages
partitionSequence++;
if(_discImage.Tracks[i].TrackFile.DataFilter.GetBasePath() != previousFile)
{
previousPartitionsSize += _discImage.Tracks[i - 1].Sectors;
previousFile = _discImage.Tracks[i].TrackFile.DataFilter.GetBasePath();
}
if(_discImage.Tracks[i].Indexes.TryGetValue(0, out int idx0))
_offsetMap.Add(_discImage.Tracks[i].Sequence, (ulong)idx0 + previousPartitionsSize);
_offsetMap.Add(_discImage.Tracks[i].Sequence, (ulong)idx0);
else if(_discImage.IsRedumpGigadisc &&
_discImage.Tracks[i].Sequence == 3)
{
_offsetMap.Add(_discImage.Tracks[i].Sequence, gdRomSession2Offset);
previousPartitionsSize = gdRomSession2Offset;
}
else if(_discImage.Tracks[i].Sequence > 1)
_offsetMap.Add(_discImage.Tracks[i].Sequence,
(ulong)(_discImage.Tracks[i].Indexes[1] - _discImage.Tracks[i].Pregap) +
previousPartitionsSize);
(ulong)(_discImage.Tracks[i].Indexes[1] - _discImage.Tracks[i].Pregap));
else
_offsetMap.Add(_discImage.Tracks[i].Sequence,
(ulong)_discImage.Tracks[i].Indexes[1] + previousPartitionsSize);
(ulong)_discImage.Tracks[i].Indexes[1]);
Partitions.Add(partition);
}