mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Process track entries from CloneCD disc images.
This commit is contained in:
@@ -64,5 +64,7 @@ namespace Aaru.DiscImages
|
||||
const string ENTRY_PLBA = @"^\s*PLBA\s*=\s*(?<value>\d+)";
|
||||
const string CDTEXT_ENTRIES = @"^\s*Entries\s*=\s*(?<value>\d+)";
|
||||
const string CDTEXT_ENTRY = @"^\s*Entry\s*(?<number>\d+)\s*=\s*(?<value>([0-9a-fA-F]+\s*)+)";
|
||||
const string TRACK_MODE = @"^\s*MODE\s*=\s*(?<value>\d+)";
|
||||
const string TRACK_INDEX = @"^\s*INDEX\s*(?<index>\d+)\s*=\s*(?<lba>\d+)";
|
||||
}
|
||||
}
|
||||
@@ -91,18 +91,23 @@ namespace Aaru.DiscImages
|
||||
var entPlbaRegex = new Regex(ENTRY_PLBA);
|
||||
var cdtEntsRegex = new Regex(CDTEXT_ENTRIES);
|
||||
var cdtEntRegex = new Regex(CDTEXT_ENTRY);
|
||||
var trkModeRegex = new Regex(TRACK_MODE);
|
||||
var trkIndexRegex = new Regex(TRACK_INDEX);
|
||||
|
||||
bool inCcd = false;
|
||||
bool inDisk = false;
|
||||
bool inSession = false;
|
||||
bool inEntry = false;
|
||||
bool inTrack = false;
|
||||
bool inCdText = false;
|
||||
var cdtMs = new MemoryStream();
|
||||
int minSession = int.MaxValue;
|
||||
int maxSession = int.MinValue;
|
||||
var currentEntry = new FullTOC.TrackDataDescriptor();
|
||||
List<FullTOC.TrackDataDescriptor> entries = new List<FullTOC.TrackDataDescriptor>();
|
||||
bool inCcd = false;
|
||||
bool inDisk = false;
|
||||
bool inSession = false;
|
||||
bool inEntry = false;
|
||||
bool inTrack = false;
|
||||
bool inCdText = false;
|
||||
var cdtMs = new MemoryStream();
|
||||
int minSession = int.MaxValue;
|
||||
int maxSession = int.MinValue;
|
||||
var currentEntry = new FullTOC.TrackDataDescriptor();
|
||||
byte currentTrackEntry = 0;
|
||||
Dictionary<byte, int> trackModes = new Dictionary<byte, int>();
|
||||
Dictionary<byte, Dictionary<byte, int>> trackIndexes = new Dictionary<byte, Dictionary<byte, int>>();
|
||||
List<FullTOC.TrackDataDescriptor> entries = new List<FullTOC.TrackDataDescriptor>();
|
||||
_scrambled = false;
|
||||
_catalog = null;
|
||||
|
||||
@@ -154,6 +159,9 @@ namespace Aaru.DiscImages
|
||||
inEntry = entryIdMatch.Success;
|
||||
inTrack = trackIdMatch.Success;
|
||||
inCdText = cdtIdMatch.Success;
|
||||
|
||||
if(inTrack)
|
||||
currentTrackEntry = Convert.ToByte(trackIdMatch.Groups["number"].Value, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -331,6 +339,26 @@ namespace Aaru.DiscImages
|
||||
else if(entPlbaMatch.Success)
|
||||
AaruConsole.DebugWriteLine("CloneCD plugin", "Found PLBA at line {0}", lineNumber);
|
||||
}
|
||||
else if(inTrack)
|
||||
{
|
||||
Match trkModeMatch = trkModeRegex.Match(line);
|
||||
Match trkIndexMatch = trkIndexRegex.Match(line);
|
||||
|
||||
if(trkModeMatch.Success &&
|
||||
currentTrackEntry > 0)
|
||||
trackModes[currentTrackEntry] = Convert.ToByte(trkModeMatch.Groups["value"].Value, 10);
|
||||
else if(trkIndexMatch.Success &&
|
||||
currentTrackEntry > 0)
|
||||
{
|
||||
byte indexNo = Convert.ToByte(trkIndexMatch.Groups["index"].Value, 10);
|
||||
int indexLba = Convert.ToInt32(trkIndexMatch.Groups["lba"].Value, 10);
|
||||
|
||||
if(!trackIndexes.TryGetValue(currentTrackEntry, out _))
|
||||
trackIndexes[currentTrackEntry] = new Dictionary<byte, int>();
|
||||
|
||||
trackIndexes[currentTrackEntry][indexNo] = indexLba;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -573,6 +601,25 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
}
|
||||
|
||||
if(trackModes.TryGetValue((byte)tmpTrack.TrackSequence, out int trackMode))
|
||||
tmpTrack.TrackType = trackMode switch
|
||||
{
|
||||
1 => TrackType.CdMode1,
|
||||
2 => TrackType.CdMode2Formless
|
||||
};
|
||||
|
||||
if(trackIndexes.TryGetValue((byte)tmpTrack.TrackSequence, out Dictionary<byte, int> indexes))
|
||||
{
|
||||
foreach(KeyValuePair<byte, int> trackIndex in indexes.OrderBy(i => i.Key))
|
||||
{
|
||||
if(trackIndex.Key <= 1)
|
||||
continue;
|
||||
|
||||
// Untested as of 20210711
|
||||
tmpTrack.Indexes[trackIndex.Key] = tmpTrack.Indexes[1] + trackIndex.Value;
|
||||
}
|
||||
}
|
||||
|
||||
if(tmpTrack.TrackType == TrackType.Data)
|
||||
{
|
||||
for(int s = 225; s < 750; s++)
|
||||
|
||||
Reference in New Issue
Block a user