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) foreach(CdrWinTrack track in _discImage.Tracks)
_imageInfo.ImageSize += track.Bps * track.Sectors; _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++) for(int s = 0; s < sessions.Length; s++)
{ {
if(!_discImage.Tracks[(int)sessions[s].StartTrack - 1].Indexes. if(!_discImage.Tracks[(int)sessions[s].StartTrack - 1].Indexes.
@@ -1287,8 +1309,6 @@ namespace Aaru.DiscImages
Partitions = new List<Partition>(); Partitions = new List<Partition>();
ulong partitionSequence = 0; ulong partitionSequence = 0;
ulong previousPartitionsSize = 0;
string previousFile = _discImage.Tracks[0].TrackFile.DataFilter.GetBasePath();
_offsetMap = new Dictionary<uint, ulong>(); _offsetMap = new Dictionary<uint, ulong>();
@@ -1315,27 +1335,17 @@ namespace Aaru.DiscImages
partitionSequence++; 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)) 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 && else if(_discImage.IsRedumpGigadisc &&
_discImage.Tracks[i].Sequence == 3) _discImage.Tracks[i].Sequence == 3)
{
_offsetMap.Add(_discImage.Tracks[i].Sequence, gdRomSession2Offset); _offsetMap.Add(_discImage.Tracks[i].Sequence, gdRomSession2Offset);
previousPartitionsSize = gdRomSession2Offset;
}
else if(_discImage.Tracks[i].Sequence > 1) else if(_discImage.Tracks[i].Sequence > 1)
_offsetMap.Add(_discImage.Tracks[i].Sequence, _offsetMap.Add(_discImage.Tracks[i].Sequence,
(ulong)(_discImage.Tracks[i].Indexes[1] - _discImage.Tracks[i].Pregap) + (ulong)(_discImage.Tracks[i].Indexes[1] - _discImage.Tracks[i].Pregap));
previousPartitionsSize);
else else
_offsetMap.Add(_discImage.Tracks[i].Sequence, _offsetMap.Add(_discImage.Tracks[i].Sequence,
(ulong)_discImage.Tracks[i].Indexes[1] + previousPartitionsSize); (ulong)_discImage.Tracks[i].Indexes[1]);
Partitions.Add(partition); Partitions.Add(partition);
} }