From 5ae5c069a2402e433ec25af45aae495d88a48288 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 11 Jul 2021 19:44:13 +0100 Subject: [PATCH] Process track entries from CloneCD disc images. --- Aaru.Images/CloneCD/Constants.cs | 2 + Aaru.Images/CloneCD/Read.cs | 69 +++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/Aaru.Images/CloneCD/Constants.cs b/Aaru.Images/CloneCD/Constants.cs index 54ba96884..4478911b9 100644 --- a/Aaru.Images/CloneCD/Constants.cs +++ b/Aaru.Images/CloneCD/Constants.cs @@ -64,5 +64,7 @@ namespace Aaru.DiscImages const string ENTRY_PLBA = @"^\s*PLBA\s*=\s*(?\d+)"; const string CDTEXT_ENTRIES = @"^\s*Entries\s*=\s*(?\d+)"; const string CDTEXT_ENTRY = @"^\s*Entry\s*(?\d+)\s*=\s*(?([0-9a-fA-F]+\s*)+)"; + const string TRACK_MODE = @"^\s*MODE\s*=\s*(?\d+)"; + const string TRACK_INDEX = @"^\s*INDEX\s*(?\d+)\s*=\s*(?\d+)"; } } \ No newline at end of file diff --git a/Aaru.Images/CloneCD/Read.cs b/Aaru.Images/CloneCD/Read.cs index 40f2402b5..46bcafe7e 100644 --- a/Aaru.Images/CloneCD/Read.cs +++ b/Aaru.Images/CloneCD/Read.cs @@ -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 entries = new List(); + 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 trackModes = new Dictionary(); + Dictionary> trackIndexes = new Dictionary>(); + List entries = new List(); _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(); + + 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 indexes)) + { + foreach(KeyValuePair 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++)