REFACTOR: Invert 'if' statement to reduce nesting.

This commit is contained in:
2017-12-21 06:06:19 +00:00
parent 9cd1869d1d
commit 4d886dae25
138 changed files with 9447 additions and 9806 deletions

View File

@@ -828,9 +828,10 @@ namespace DiscImageChef.DiscImages
{
AlcoholTrackExtra extra;
if(track.point == kvp.Key && alcTrackExtras.TryGetValue(track.point, out extra))
if(sectorAddress - kvp.Value < extra.sectors)
return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key);
if(track.point != kvp.Key || !alcTrackExtras.TryGetValue(track.point, out extra)) continue;
if(sectorAddress - kvp.Value < extra.sectors)
return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key);
}
throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found");
@@ -844,9 +845,10 @@ namespace DiscImageChef.DiscImages
{
AlcoholTrackExtra extra;
if(track.point == kvp.Key && alcTrackExtras.TryGetValue(track.point, out extra))
if(sectorAddress - kvp.Value < extra.sectors)
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag);
if(track.point != kvp.Key || !alcTrackExtras.TryGetValue(track.point, out extra)) continue;
if(sectorAddress - kvp.Value < extra.sectors)
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag);
}
throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found");
@@ -1296,9 +1298,10 @@ namespace DiscImageChef.DiscImages
{
AlcoholTrackExtra extra;
if(track.point == kvp.Key && alcTrackExtras.TryGetValue(track.point, out extra))
if(sectorAddress - kvp.Value < extra.sectors)
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key);
if(track.point != kvp.Key || !alcTrackExtras.TryGetValue(track.point, out extra)) continue;
if(sectorAddress - kvp.Value < extra.sectors)
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key);
}
throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found");
@@ -1393,40 +1396,39 @@ namespace DiscImageChef.DiscImages
}
AlcoholTrackExtra extra;
if(alcTrackExtras.TryGetValue(track.point, out extra))
if(!alcTrackExtras.TryGetValue(track.point, out extra)) continue;
Track _track = new Track();
_track.Indexes = new Dictionary<int, ulong>();
_track.Indexes.Add(1, track.startLba);
_track.TrackStartSector = track.startLba;
_track.TrackEndSector = extra.sectors - 1;
_track.TrackPregap = extra.pregap;
_track.TrackSession = sessionNo;
_track.TrackSequence = track.point;
_track.TrackType = AlcoholTrackTypeToTrackType(track.mode);
_track.TrackFilter = alcImage;
_track.TrackFile = alcImage.GetFilename();
_track.TrackFileOffset = track.startOffset;
_track.TrackFileType = "BINARY";
_track.TrackRawBytesPerSector = track.sectorSize;
_track.TrackBytesPerSector = AlcoholTrackModeToCookedBytesPerSector(track.mode);
switch(track.subMode)
{
Track _track = new Track();
_track.Indexes = new Dictionary<int, ulong>();
_track.Indexes.Add(1, track.startLba);
_track.TrackStartSector = track.startLba;
_track.TrackEndSector = extra.sectors - 1;
_track.TrackPregap = extra.pregap;
_track.TrackSession = sessionNo;
_track.TrackSequence = track.point;
_track.TrackType = AlcoholTrackTypeToTrackType(track.mode);
_track.TrackFilter = alcImage;
_track.TrackFile = alcImage.GetFilename();
_track.TrackFileOffset = track.startOffset;
_track.TrackFileType = "BINARY";
_track.TrackRawBytesPerSector = track.sectorSize;
_track.TrackBytesPerSector = AlcoholTrackModeToCookedBytesPerSector(track.mode);
switch(track.subMode)
{
case AlcoholSubchannelMode.Interleaved:
_track.TrackSubchannelFilter = alcImage;
_track.TrackSubchannelFile = alcImage.GetFilename();
_track.TrackSubchannelOffset = track.startOffset;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
_track.TrackRawBytesPerSector += 96;
break;
case AlcoholSubchannelMode.None:
_track.TrackSubchannelType = TrackSubchannelType.None;
break;
}
tracks.Add(_track);
case AlcoholSubchannelMode.Interleaved:
_track.TrackSubchannelFilter = alcImage;
_track.TrackSubchannelFile = alcImage.GetFilename();
_track.TrackSubchannelOffset = track.startOffset;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
_track.TrackRawBytesPerSector += 96;
break;
case AlcoholSubchannelMode.None:
_track.TrackSubchannelType = TrackSubchannelType.None;
break;
}
tracks.Add(_track);
}
return tracks;
@@ -1455,40 +1457,39 @@ namespace DiscImageChef.DiscImages
}
AlcoholTrackExtra extra;
if(alcTrackExtras.TryGetValue(track.point, out extra) && session == sessionNo)
if(!alcTrackExtras.TryGetValue(track.point, out extra) || session != sessionNo) continue;
Track _track = new Track();
_track.Indexes = new Dictionary<int, ulong>();
_track.Indexes.Add(1, track.startLba);
_track.TrackStartSector = track.startLba;
_track.TrackEndSector = extra.sectors - 1;
_track.TrackPregap = extra.pregap;
_track.TrackSession = sessionNo;
_track.TrackSequence = track.point;
_track.TrackType = AlcoholTrackTypeToTrackType(track.mode);
_track.TrackFilter = alcImage;
_track.TrackFile = alcImage.GetFilename();
_track.TrackFileOffset = track.startOffset;
_track.TrackFileType = "BINARY";
_track.TrackRawBytesPerSector = track.sectorSize;
_track.TrackBytesPerSector = AlcoholTrackModeToCookedBytesPerSector(track.mode);
switch(track.subMode)
{
Track _track = new Track();
_track.Indexes = new Dictionary<int, ulong>();
_track.Indexes.Add(1, track.startLba);
_track.TrackStartSector = track.startLba;
_track.TrackEndSector = extra.sectors - 1;
_track.TrackPregap = extra.pregap;
_track.TrackSession = sessionNo;
_track.TrackSequence = track.point;
_track.TrackType = AlcoholTrackTypeToTrackType(track.mode);
_track.TrackFilter = alcImage;
_track.TrackFile = alcImage.GetFilename();
_track.TrackFileOffset = track.startOffset;
_track.TrackFileType = "BINARY";
_track.TrackRawBytesPerSector = track.sectorSize;
_track.TrackBytesPerSector = AlcoholTrackModeToCookedBytesPerSector(track.mode);
switch(track.subMode)
{
case AlcoholSubchannelMode.Interleaved:
_track.TrackSubchannelFilter = alcImage;
_track.TrackSubchannelFile = alcImage.GetFilename();
_track.TrackSubchannelOffset = track.startOffset;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
_track.TrackRawBytesPerSector += 96;
break;
case AlcoholSubchannelMode.None:
_track.TrackSubchannelType = TrackSubchannelType.None;
break;
}
tracks.Add(_track);
case AlcoholSubchannelMode.Interleaved:
_track.TrackSubchannelFilter = alcImage;
_track.TrackSubchannelFile = alcImage.GetFilename();
_track.TrackSubchannelOffset = track.startOffset;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
_track.TrackRawBytesPerSector += 96;
break;
case AlcoholSubchannelMode.None:
_track.TrackSubchannelType = TrackSubchannelType.None;
break;
}
tracks.Add(_track);
}
return tracks;

View File

@@ -593,12 +593,15 @@ namespace DiscImageChef.DiscImages
session.Tracks[tSeq].session);
DicConsole.DebugWriteLine("BlindWrite5 plugin", "session[{0}].track[{1}].unknown8 = 0x{2:X4}", ses,
tSeq, session.Tracks[tSeq].unknown8);
if(session.Tracks[tSeq].type != Bw5TrackType.Dvd &&
session.Tracks[tSeq].type != Bw5TrackType.NotData)
if(session.Tracks[tSeq].type == Bw5TrackType.Dvd ||
session.Tracks[tSeq].type == Bw5TrackType.NotData) continue;
{
for(int i = 0; i < session.Tracks[tSeq].unknown9.Length; i++)
DicConsole.DebugWriteLine("BlindWrite5 plugin",
"session[{0}].track[{1}].unknown9[{2}] = 0x{3:X8}", ses, tSeq, i,
session.Tracks[tSeq].unknown9[i]);
}
}
bwSessions.Add(session);
@@ -795,121 +798,120 @@ namespace DiscImageChef.DiscImages
fullTocStream.WriteByte(trk.psec);
fullTocStream.WriteByte(trk.pframe);
if(trk.point < 0xA0)
if(trk.point >= 0xA0) continue;
Track track = new Track();
Partition partition = new Partition();
trackFlags.Add(trk.point, trk.ctl);
switch(trk.type)
{
Track track = new Track();
Partition partition = new Partition();
case Bw5TrackType.Audio:
track.TrackBytesPerSector = 2352;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2352) ImageInfo.SectorSize = 2352;
break;
case Bw5TrackType.Mode1:
case Bw5TrackType.Mode2F1:
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
track.TrackBytesPerSector = 2048;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2048) ImageInfo.SectorSize = 2048;
break;
case Bw5TrackType.Mode2:
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
track.TrackBytesPerSector = 2336;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2336) ImageInfo.SectorSize = 2336;
break;
case Bw5TrackType.Mode2F2:
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
track.TrackBytesPerSector = 2336;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2324) ImageInfo.SectorSize = 2324;
break;
case Bw5TrackType.Dvd:
track.TrackBytesPerSector = 2048;
track.TrackRawBytesPerSector = 2048;
if(ImageInfo.SectorSize < 2048) ImageInfo.SectorSize = 2048;
isDvd = true;
break;
}
trackFlags.Add(trk.point, trk.ctl);
track.TrackDescription = string.Format("Track {0}", trk.point);
track.TrackStartSector = (ulong)(trk.startLba + trk.pregap);
track.TrackEndSector = (ulong)(trk.sectors + trk.startLba);
switch(trk.type)
foreach(DataFileCharacteristics chars in filePaths)
if(trk.startLba >= chars.StartLba &&
trk.startLba + trk.sectors <= chars.StartLba + chars.Sectors)
{
case Bw5TrackType.Audio:
track.TrackBytesPerSector = 2352;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2352) ImageInfo.SectorSize = 2352;
break;
case Bw5TrackType.Mode1:
case Bw5TrackType.Mode2F1:
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
track.TrackBytesPerSector = 2048;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2048) ImageInfo.SectorSize = 2048;
break;
case Bw5TrackType.Mode2:
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
track.TrackBytesPerSector = 2336;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2336) ImageInfo.SectorSize = 2336;
break;
case Bw5TrackType.Mode2F2:
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
track.TrackBytesPerSector = 2336;
track.TrackRawBytesPerSector = 2352;
if(ImageInfo.SectorSize < 2324) ImageInfo.SectorSize = 2324;
break;
case Bw5TrackType.Dvd:
track.TrackBytesPerSector = 2048;
track.TrackRawBytesPerSector = 2048;
if(ImageInfo.SectorSize < 2048) ImageInfo.SectorSize = 2048;
isDvd = true;
break;
}
track.TrackDescription = string.Format("Track {0}", trk.point);
track.TrackStartSector = (ulong)(trk.startLba + trk.pregap);
track.TrackEndSector = (ulong)(trk.sectors + trk.startLba);
foreach(DataFileCharacteristics chars in filePaths)
if(trk.startLba >= chars.StartLba &&
trk.startLba + trk.sectors <= chars.StartLba + chars.Sectors)
track.TrackFilter = chars.FileFilter;
track.TrackFile = chars.FileFilter.GetFilename();
if(trk.startLba >= 0)
track.TrackFileOffset = (ulong)((trk.startLba - chars.StartLba) * chars.SectorSize);
else track.TrackFileOffset = (ulong)(trk.startLba * -1 * chars.SectorSize);
track.TrackFileType = "BINARY";
if(chars.Subchannel != TrackSubchannelType.None)
{
track.TrackFilter = chars.FileFilter;
track.TrackFile = chars.FileFilter.GetFilename();
if(trk.startLba >= 0)
track.TrackFileOffset = (ulong)((trk.startLba - chars.StartLba) * chars.SectorSize);
else track.TrackFileOffset = (ulong)(trk.startLba * -1 * chars.SectorSize);
track.TrackFileType = "BINARY";
if(chars.Subchannel != TrackSubchannelType.None)
{
track.TrackSubchannelFilter = track.TrackFilter;
track.TrackSubchannelFile = track.TrackFile;
track.TrackSubchannelType = chars.Subchannel;
track.TrackSubchannelOffset = track.TrackFileOffset;
track.TrackSubchannelFilter = track.TrackFilter;
track.TrackSubchannelFile = track.TrackFile;
track.TrackSubchannelType = chars.Subchannel;
track.TrackSubchannelOffset = track.TrackFileOffset;
if(chars.Subchannel == TrackSubchannelType.PackedInterleaved)
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
}
break;
if(chars.Subchannel == TrackSubchannelType.PackedInterleaved)
if(!ImageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
ImageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
}
track.TrackPregap = trk.pregap;
track.TrackSequence = trk.point;
track.TrackType = BlindWriteTrackTypeToTrackType(trk.type);
track.Indexes = new Dictionary<int, ulong>();
track.Indexes.Add(1, track.TrackStartSector);
break;
}
partition.Description = track.TrackDescription;
partition.Size = (track.TrackEndSector - track.TrackStartSector) *
(ulong)track.TrackRawBytesPerSector;
partition.Length = track.TrackEndSector - track.TrackStartSector;
partition.Sequence = track.TrackSequence;
partition.Offset = offsetBytes;
partition.Start = track.TrackStartSector;
partition.Type = track.TrackType.ToString();
track.TrackPregap = trk.pregap;
track.TrackSequence = trk.point;
track.TrackType = BlindWriteTrackTypeToTrackType(trk.type);
track.Indexes = new Dictionary<int, ulong>();
track.Indexes.Add(1, track.TrackStartSector);
offsetBytes += partition.Size;
partition.Description = track.TrackDescription;
partition.Size = (track.TrackEndSector - track.TrackStartSector) *
(ulong)track.TrackRawBytesPerSector;
partition.Length = track.TrackEndSector - track.TrackStartSector;
partition.Sequence = track.TrackSequence;
partition.Offset = offsetBytes;
partition.Start = track.TrackStartSector;
partition.Type = track.TrackType.ToString();
tracks.Add(track);
partitions.Add(partition);
offsetmap.Add(track.TrackSequence, track.TrackStartSector);
ImageInfo.Sectors += partition.Length;
}
offsetBytes += partition.Size;
tracks.Add(track);
partitions.Add(partition);
offsetmap.Add(track.TrackSequence, track.TrackStartSector);
ImageInfo.Sectors += partition.Length;
}
}

View File

@@ -446,12 +446,12 @@ namespace DiscImageChef.DiscImages
if(matchComment.Success)
{
// Ignore "// Track X" comments
if(!matchComment.Groups["comment"].Value.StartsWith(" Track ", StringComparison.Ordinal))
{
DicConsole.DebugWriteLine("CDRDAO plugin", "Found comment \"{1}\" at line {0}", line,
matchComment.Groups["comment"].Value.Trim());
commentBuilder.AppendLine(matchComment.Groups["comment"].Value.Trim());
}
if(matchComment.Groups["comment"].Value.StartsWith(" Track ", StringComparison.Ordinal))
continue;
DicConsole.DebugWriteLine("CDRDAO plugin", "Found comment \"{1}\" at line {0}", line,
matchComment.Groups["comment"].Value.Trim());
commentBuilder.AppendLine(matchComment.Groups["comment"].Value.Trim());
}
else if(matchDiskType.Success)
{
@@ -1241,31 +1241,31 @@ namespace DiscImageChef.DiscImages
{
case CDRDAO_TRACK_TYPE_MODE1:
case CDRDAO_TRACK_TYPE_MODE2_FORM1:
if(tag == SectorTagType.CdSectorSubchannel)
{
sectorOffset = 2048;
sectorSize = 96;
break;
}
if(tag != SectorTagType.CdSectorSubchannel)
throw new ArgumentException("No tags in image for requested track", nameof(tag));
sectorOffset = 2048;
sectorSize = 96;
break;
throw new ArgumentException("No tags in image for requested track", nameof(tag));
case CDRDAO_TRACK_TYPE_MODE2_FORM2:
case CDRDAO_TRACK_TYPE_MODE2_MIX:
if(tag == SectorTagType.CdSectorSubchannel)
{
sectorOffset = 2336;
sectorSize = 96;
break;
}
if(tag != SectorTagType.CdSectorSubchannel)
throw new ArgumentException("No tags in image for requested track", nameof(tag));
sectorOffset = 2336;
sectorSize = 96;
break;
throw new ArgumentException("No tags in image for requested track", nameof(tag));
case CDRDAO_TRACK_TYPE_AUDIO:
if(tag == SectorTagType.CdSectorSubchannel)
{
sectorOffset = 2352;
sectorSize = 96;
break;
}
if(tag != SectorTagType.CdSectorSubchannel)
throw new ArgumentException("No tags in image for requested track", nameof(tag));
sectorOffset = 2352;
sectorSize = 96;
break;
throw new ArgumentException("No tags in image for requested track", nameof(tag));
case CDRDAO_TRACK_TYPE_MODE1_RAW:
@@ -1328,12 +1328,12 @@ namespace DiscImageChef.DiscImages
break;
}
case CDRDAO_TRACK_TYPE_MODE2_RAW: // Requires reading sector
if(tag == SectorTagType.CdSectorSubchannel)
{
sectorOffset = 2352;
sectorSize = 96;
break;
}
if(tag != SectorTagType.CdSectorSubchannel)
throw new FeatureSupportedButNotImplementedImageException("Feature not yet implemented");
sectorOffset = 2352;
sectorSize = 96;
break;
throw new FeatureSupportedButNotImplementedImageException("Feature not yet implemented");
default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type");

View File

@@ -453,17 +453,16 @@ namespace DiscImageChef.DiscImages
string _line = cueStream.ReadLine();
matchTrack = regexTrack.Match(_line);
if(matchTrack.Success)
{
uint trackSeq = uint.Parse(matchTrack.Groups[1].Value);
if(trackCount + 1 != trackSeq)
throw new
FeatureUnsupportedImageException(string
.Format("Found TRACK {0} out of order in line {1}",
trackSeq, line));
if(!matchTrack.Success) continue;
trackCount++;
}
uint trackSeq = uint.Parse(matchTrack.Groups[1].Value);
if(trackCount + 1 != trackSeq)
throw new
FeatureUnsupportedImageException(string
.Format("Found TRACK {0} out of order in line {1}",
trackSeq, line));
trackCount++;
}
if(trackCount == 0) throw new FeatureUnsupportedImageException("No tracks found");

View File

@@ -1647,127 +1647,126 @@ namespace DiscImageChef.DiscImages
{
byte[] hunk;
if(!hunkCache.TryGetValue(hunkNo, out hunk))
if(hunkCache.TryGetValue(hunkNo, out hunk)) return hunk;
switch(mapVersion)
{
switch(mapVersion)
{
case 1:
ulong offset = hunkTable[hunkNo] & 0x00000FFFFFFFFFFF;
ulong length = hunkTable[hunkNo] >> 44;
case 1:
ulong offset = hunkTable[hunkNo] & 0x00000FFFFFFFFFFF;
ulong length = hunkTable[hunkNo] >> 44;
byte[] compHunk = new byte[length];
imageStream.Seek((long)offset, SeekOrigin.Begin);
imageStream.Read(compHunk, 0, compHunk.Length);
byte[] compHunk = new byte[length];
imageStream.Seek((long)offset, SeekOrigin.Begin);
imageStream.Read(compHunk, 0, compHunk.Length);
if(length == sectorsPerHunk * ImageInfo.SectorSize) hunk = compHunk;
else if((ChdCompression)hdrCompression > ChdCompression.Zlib)
throw new ImageNotSupportedException(string.Format("Unsupported compression {0}",
(ChdCompression)hdrCompression));
else
{
DeflateStream zStream =
new DeflateStream(new MemoryStream(compHunk), CompressionMode.Decompress);
hunk = new byte[sectorsPerHunk * ImageInfo.SectorSize];
int read = zStream.Read(hunk, 0, (int)(sectorsPerHunk * ImageInfo.SectorSize));
if(read != sectorsPerHunk * ImageInfo.SectorSize)
throw new
IOException(string
.Format("Unable to decompress hunk correctly, got {0} bytes, expected {1}",
read, sectorsPerHunk * ImageInfo.SectorSize));
if(length == sectorsPerHunk * ImageInfo.SectorSize) hunk = compHunk;
else if((ChdCompression)hdrCompression > ChdCompression.Zlib)
throw new ImageNotSupportedException(string.Format("Unsupported compression {0}",
(ChdCompression)hdrCompression));
else
{
DeflateStream zStream =
new DeflateStream(new MemoryStream(compHunk), CompressionMode.Decompress);
hunk = new byte[sectorsPerHunk * ImageInfo.SectorSize];
int read = zStream.Read(hunk, 0, (int)(sectorsPerHunk * ImageInfo.SectorSize));
if(read != sectorsPerHunk * ImageInfo.SectorSize)
throw new
IOException(string
.Format("Unable to decompress hunk correctly, got {0} bytes, expected {1}",
read, sectorsPerHunk * ImageInfo.SectorSize));
zStream.Close();
zStream = null;
}
zStream.Close();
zStream = null;
}
break;
case 3:
byte[] entryBytes = new byte[16];
Array.Copy(hunkMap, (int)(hunkNo * 16), entryBytes, 0, 16);
ChdMapV3Entry entry = BigEndianMarshal.ByteArrayToStructureBigEndian<ChdMapV3Entry>(entryBytes);
switch((Chdv3EntryFlags)(entry.flags & 0x0F))
{
case Chdv3EntryFlags.Invalid: throw new ArgumentException("Invalid hunk found.");
case Chdv3EntryFlags.Compressed:
switch((ChdCompression)hdrCompression)
{
case ChdCompression.None: goto uncompressedV3;
case ChdCompression.Zlib:
case ChdCompression.ZlibPlus:
if(isHdd)
{
byte[] zHunk = new byte[(entry.lengthLsb << 16) + entry.lengthLsb];
imageStream.Seek((long)entry.offset, SeekOrigin.Begin);
imageStream.Read(zHunk, 0, zHunk.Length);
DeflateStream zStream =
new DeflateStream(new MemoryStream(zHunk), CompressionMode.Decompress);
hunk = new byte[bytesPerHunk];
int read = zStream.Read(hunk, 0, (int)bytesPerHunk);
if(read != bytesPerHunk)
throw new
IOException(string
.Format("Unable to decompress hunk correctly, got {0} bytes, expected {1}",
read, bytesPerHunk));
zStream.Close();
zStream = null;
}
// TODO: Guess wth is MAME doing with these hunks
else
break;
case 3:
byte[] entryBytes = new byte[16];
Array.Copy(hunkMap, (int)(hunkNo * 16), entryBytes, 0, 16);
ChdMapV3Entry entry = BigEndianMarshal.ByteArrayToStructureBigEndian<ChdMapV3Entry>(entryBytes);
switch((Chdv3EntryFlags)(entry.flags & 0x0F))
{
case Chdv3EntryFlags.Invalid: throw new ArgumentException("Invalid hunk found.");
case Chdv3EntryFlags.Compressed:
switch((ChdCompression)hdrCompression)
{
case ChdCompression.None: goto uncompressedV3;
case ChdCompression.Zlib:
case ChdCompression.ZlibPlus:
if(isHdd)
{
byte[] zHunk = new byte[(entry.lengthLsb << 16) + entry.lengthLsb];
imageStream.Seek((long)entry.offset, SeekOrigin.Begin);
imageStream.Read(zHunk, 0, zHunk.Length);
DeflateStream zStream =
new DeflateStream(new MemoryStream(zHunk), CompressionMode.Decompress);
hunk = new byte[bytesPerHunk];
int read = zStream.Read(hunk, 0, (int)bytesPerHunk);
if(read != bytesPerHunk)
throw new
ImageNotSupportedException("Compressed CD/GD-ROM hunks are not yet supported");
IOException(string
.Format("Unable to decompress hunk correctly, got {0} bytes, expected {1}",
read, bytesPerHunk));
break;
case ChdCompression.Av:
zStream.Close();
zStream = null;
}
// TODO: Guess wth is MAME doing with these hunks
else
throw new
ImageNotSupportedException(string.Format("Unsupported compression {0}",
(ChdCompression)hdrCompression));
}
ImageNotSupportedException("Compressed CD/GD-ROM hunks are not yet supported");
break;
case Chdv3EntryFlags.Uncompressed:
uncompressedV3:
hunk = new byte[bytesPerHunk];
imageStream.Seek((long)entry.offset, SeekOrigin.Begin);
imageStream.Read(hunk, 0, hunk.Length);
break;
case Chdv3EntryFlags.Mini:
hunk = new byte[bytesPerHunk];
byte[] mini = new byte[8];
mini = BigEndianBitConverter.GetBytes(entry.offset);
for(int i = 0; i < bytesPerHunk; i++) hunk[i] = mini[i % 8];
break;
case ChdCompression.Av:
throw new
ImageNotSupportedException(string.Format("Unsupported compression {0}",
(ChdCompression)hdrCompression));
}
break;
case Chdv3EntryFlags.SelfHunk: return GetHunk(entry.offset);
case Chdv3EntryFlags.ParentHunk:
throw new ImageNotSupportedException("Parent images are not supported");
case Chdv3EntryFlags.SecondCompressed:
throw new ImageNotSupportedException("FLAC is not supported");
default:
throw new ImageNotSupportedException(string.Format("Hunk type {0} is not supported",
entry.flags & 0xF));
}
break;
case 5:
if(hdrCompression == 0)
{
break;
case Chdv3EntryFlags.Uncompressed:
uncompressedV3:
hunk = new byte[bytesPerHunk];
imageStream.Seek(hunkTableSmall[hunkNo] * bytesPerHunk, SeekOrigin.Begin);
imageStream.Seek((long)entry.offset, SeekOrigin.Begin);
imageStream.Read(hunk, 0, hunk.Length);
}
else throw new ImageNotSupportedException("Compressed v5 hunks not yet supported");
break;
case Chdv3EntryFlags.Mini:
hunk = new byte[bytesPerHunk];
byte[] mini = new byte[8];
mini = BigEndianBitConverter.GetBytes(entry.offset);
for(int i = 0; i < bytesPerHunk; i++) hunk[i] = mini[i % 8];
break;
default:
throw new ImageNotSupportedException(string.Format("Unsupported hunk map version {0}",
mapVersion));
}
break;
case Chdv3EntryFlags.SelfHunk: return GetHunk(entry.offset);
case Chdv3EntryFlags.ParentHunk:
throw new ImageNotSupportedException("Parent images are not supported");
case Chdv3EntryFlags.SecondCompressed:
throw new ImageNotSupportedException("FLAC is not supported");
default:
throw new ImageNotSupportedException(string.Format("Hunk type {0} is not supported",
entry.flags & 0xF));
}
if(hunkCache.Count >= maxBlockCache) hunkCache.Clear();
break;
case 5:
if(hdrCompression == 0)
{
hunk = new byte[bytesPerHunk];
imageStream.Seek(hunkTableSmall[hunkNo] * bytesPerHunk, SeekOrigin.Begin);
imageStream.Read(hunk, 0, hunk.Length);
}
else throw new ImageNotSupportedException("Compressed v5 hunks not yet supported");
hunkCache.Add(hunkNo, hunk);
break;
default:
throw new ImageNotSupportedException(string.Format("Unsupported hunk map version {0}",
mapVersion));
}
if(hunkCache.Count >= maxBlockCache) hunkCache.Clear();
hunkCache.Add(hunkNo, hunk);
return hunk;
}

View File

@@ -304,16 +304,15 @@ namespace DiscImageChef.DiscImages
{
ccdVerMatch = ccdVerRegex.Match(_line);
if(ccdVerMatch.Success)
{
DicConsole.DebugWriteLine("CloneCD plugin", "Found Version at line {0}", line);
if(!ccdVerMatch.Success) continue;
ImageInfo.ImageVersion = ccdVerMatch.Groups["value"].Value;
if(ImageInfo.ImageVersion != "2" && ImageInfo.ImageVersion != "3")
DicConsole
.ErrorWriteLine("(CloneCD plugin): Warning! Unknown CCD image version {0}, may not work!",
ImageInfo.ImageVersion);
}
DicConsole.DebugWriteLine("CloneCD plugin", "Found Version at line {0}", line);
ImageInfo.ImageVersion = ccdVerMatch.Groups["value"].Value;
if(ImageInfo.ImageVersion != "2" && ImageInfo.ImageVersion != "3")
DicConsole
.ErrorWriteLine("(CloneCD plugin): Warning! Unknown CCD image version {0}, may not work!",
ImageInfo.ImageVersion);
}
else if(inDisk)
{

View File

@@ -376,13 +376,12 @@ namespace DiscImageChef.DiscImages
sechdr = (SectorHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SectorHeader));
handle.Free();
if(sechdr.spt != spt || sechdr.n != bps)
{
DicConsole.DebugWriteLine("D88 plugin",
"Disk tracks are not same size. spt = {0} (expected {1}), bps = {2} (expected {3}) at track {4} sector {5}",
sechdr.spt, spt, sechdr.n, bps, i, j, sechdr.deleted_mark);
allEqual = false;
}
if(sechdr.spt == spt && sechdr.n == bps) continue;
DicConsole.DebugWriteLine("D88 plugin",
"Disk tracks are not same size. spt = {0} (expected {1}), bps = {2} (expected {3}) at track {4} sector {5}",
sechdr.spt, spt, sechdr.n, bps, i, j, sechdr.deleted_mark);
allEqual = false;
}
secB = new byte[sechdr.size_of_data];

View File

@@ -218,19 +218,17 @@ namespace DiscImageChef.DiscImages
int bLen = descriptor[position];
position++;
DicConsole.DebugWriteLine("DiscJuggler plugin", "\tc[{1}][{2}].Length = {0}", bLen, c, cb);
if(bLen > 0)
{
byte[] textBlk = new byte[bLen];
Array.Copy(descriptor, position, textBlk, 0, bLen);
position += bLen;
// Track title
if(cb == 10)
{
track.TrackDescription = Encoding.Default.GetString(textBlk, 0, bLen);
DicConsole.DebugWriteLine("DiscJuggler plugin", "\tTrack title = {0}",
track.TrackDescription);
}
}
if(bLen <= 0) continue;
byte[] textBlk = new byte[bLen];
Array.Copy(descriptor, position, textBlk, 0, bLen);
position += bLen;
// Track title
if(cb != 10) continue;
track.TrackDescription = Encoding.Default.GetString(textBlk, 0, bLen);
DicConsole.DebugWriteLine("DiscJuggler plugin", "\tTrack title = {0}",
track.TrackDescription);
}
}
@@ -519,17 +517,16 @@ namespace DiscImageChef.DiscImages
addedATrack = true;
}
if(addedATrack)
{
lastSessionTrack = session.EndTrack;
sessions.Add(session);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.StartTrack = {0}", session.StartTrack);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.StartSector = {0}", session.StartSector);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.EndTrack = {0}", session.EndTrack);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.EndSector = {0}", session.EndSector);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.SessionSequence = {0}",
session.SessionSequence);
}
if(!addedATrack) continue;
lastSessionTrack = session.EndTrack;
sessions.Add(session);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.StartTrack = {0}", session.StartTrack);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.StartSector = {0}", session.StartSector);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.EndTrack = {0}", session.EndTrack);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.EndSector = {0}", session.EndSector);
DicConsole.DebugWriteLine("DiscJuggler plugin", "session.SessionSequence = {0}",
session.SessionSequence);
}
// Skip unknown

View File

@@ -231,14 +231,11 @@ namespace DiscImageChef.DiscImages
return false;
}
if(tmpHeader.FmtByte == kInvalidFmtByte)
{
DicConsole.DebugWriteLine("DC42 plugin", "Image says it's unformatted");
if(tmpHeader.FmtByte != kInvalidFmtByte) return true;
return false;
}
DicConsole.DebugWriteLine("DC42 plugin", "Image says it's unformatted");
return true;
return false;
}
public override bool OpenImage(Filter imageFilter)
@@ -646,18 +643,17 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DC42 plugin", "Calculated data checksum = 0x{0:X8}", dataChk);
DicConsole.DebugWriteLine("DC42 plugin", "Stored data checksum = 0x{0:X8}", header.DataChecksum);
if(header.TagSize > 0)
{
DicConsole.DebugWriteLine("DC42 plugin", "Reading tags");
Stream tagstream = dc42ImageFilter.GetDataForkStream();
tagstream.Seek(tagOffset, SeekOrigin.Begin);
tagstream.Read(tags, 0, (int)header.TagSize);
if(header.TagSize <= 0) return dataChk == header.DataChecksum && tagsChk == header.TagChecksum;
DicConsole.DebugWriteLine("DC42 plugin", "Calculating tag checksum");
tagsChk = DC42CheckSum(tags);
DicConsole.DebugWriteLine("DC42 plugin", "Calculated tag checksum = 0x{0:X8}", tagsChk);
DicConsole.DebugWriteLine("DC42 plugin", "Stored tag checksum = 0x{0:X8}", header.TagChecksum);
}
DicConsole.DebugWriteLine("DC42 plugin", "Reading tags");
Stream tagstream = dc42ImageFilter.GetDataForkStream();
tagstream.Seek(tagOffset, SeekOrigin.Begin);
tagstream.Read(tags, 0, (int)header.TagSize);
DicConsole.DebugWriteLine("DC42 plugin", "Calculating tag checksum");
tagsChk = DC42CheckSum(tags);
DicConsole.DebugWriteLine("DC42 plugin", "Calculated tag checksum = 0x{0:X8}", tagsChk);
DicConsole.DebugWriteLine("DC42 plugin", "Stored tag checksum = 0x{0:X8}", header.TagChecksum);
return dataChk == header.DataChecksum && tagsChk == header.TagChecksum;
}

View File

@@ -1572,128 +1572,128 @@ namespace DiscImageChef.DiscImages
for(uint i = 1; i <= neroTracks.Count; i++)
{
NeroTrack neroTrack;
if(neroTracks.TryGetValue(i, out neroTrack))
if(!neroTracks.TryGetValue(i, out neroTrack)) continue;
DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsession = {0}", currentsession);
DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsessionmaxtrack = {0}",
currentsessionmaxtrack);
DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsessioncurrenttrack = {0}",
currentsessioncurrenttrack);
Track _track = new Track();
if(neroTrack.Sequence == 1) neroTrack.Index0 = neroTrack.Index1;
_track.Indexes = new Dictionary<int, ulong>();
if(neroTrack.Index0 < neroTrack.Index1)
_track.Indexes.Add(0, neroTrack.Index0 / neroTrack.SectorSize);
_track.Indexes.Add(1, neroTrack.Index1 / neroTrack.SectorSize);
_track.TrackDescription = StringHandlers.CToString(neroTrack.Isrc);
_track.TrackEndSector = neroTrack.Length / neroTrack.SectorSize + neroTrack.StartLba - 1;
_track.TrackPregap = (neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize;
_track.TrackSequence = neroTrack.Sequence;
_track.TrackSession = currentsession;
_track.TrackStartSector = neroTrack.StartLba;
_track.TrackType = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode);
_track.TrackFile = imageFilter.GetFilename();
_track.TrackFilter = imageFilter;
_track.TrackFileOffset = neroTrack.Offset;
_track.TrackFileType = "BINARY";
_track.TrackSubchannelType = TrackSubchannelType.None;
switch((DaoMode)neroTrack.Mode)
{
DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsession = {0}", currentsession);
DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsessionmaxtrack = {0}",
currentsessionmaxtrack);
DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsessioncurrenttrack = {0}",
currentsessioncurrenttrack);
case DaoMode.Audio:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2352;
break;
case DaoMode.AudioSub:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
case DaoMode.Data:
case DaoMode.DataM2F1:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2048;
break;
case DaoMode.DataM2F2:
_track.TrackBytesPerSector = 2336;
_track.TrackRawBytesPerSector = 2336;
break;
case DaoMode.DataM2Raw:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2352;
break;
case DaoMode.DataM2RawSub:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
case DaoMode.DataRaw:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2352;
break;
case DaoMode.DataRawSub:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
}
Track _track = new Track();
if(neroTrack.Sequence == 1) neroTrack.Index0 = neroTrack.Index1;
if(_track.TrackSubchannelType == TrackSubchannelType.RawInterleaved)
{
_track.TrackSubchannelFilter = imageFilter;
_track.TrackSubchannelFile = imageFilter.GetFilename();
_track.TrackSubchannelOffset = neroTrack.Offset;
}
_track.Indexes = new Dictionary<int, ulong>();
if(neroTrack.Index0 < neroTrack.Index1)
_track.Indexes.Add(0, neroTrack.Index0 / neroTrack.SectorSize);
_track.Indexes.Add(1, neroTrack.Index1 / neroTrack.SectorSize);
_track.TrackDescription = StringHandlers.CToString(neroTrack.Isrc);
_track.TrackEndSector = neroTrack.Length / neroTrack.SectorSize + neroTrack.StartLba - 1;
_track.TrackPregap = (neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize;
_track.TrackSequence = neroTrack.Sequence;
_track.TrackSession = currentsession;
_track.TrackStartSector = neroTrack.StartLba;
_track.TrackType = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode);
_track.TrackFile = imageFilter.GetFilename();
_track.TrackFilter = imageFilter;
_track.TrackFileOffset = neroTrack.Offset;
_track.TrackFileType = "BINARY";
_track.TrackSubchannelType = TrackSubchannelType.None;
switch((DaoMode)neroTrack.Mode)
{
case DaoMode.Audio:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2352;
break;
case DaoMode.AudioSub:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
case DaoMode.Data:
case DaoMode.DataM2F1:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2048;
break;
case DaoMode.DataM2F2:
_track.TrackBytesPerSector = 2336;
_track.TrackRawBytesPerSector = 2336;
break;
case DaoMode.DataM2Raw:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2352;
break;
case DaoMode.DataM2RawSub:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
case DaoMode.DataRaw:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2352;
break;
case DaoMode.DataRawSub:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
}
imageTracks.Add(_track);
if(_track.TrackSubchannelType == TrackSubchannelType.RawInterleaved)
{
_track.TrackSubchannelFilter = imageFilter;
_track.TrackSubchannelFile = imageFilter.GetFilename();
_track.TrackSubchannelOffset = neroTrack.Offset;
}
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackDescription = {0}",
_track.TrackDescription);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackEndSector = {0}",
_track.TrackEndSector);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackPregap = {0}", _track.TrackPregap);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSequence = {0}",
_track.TrackSequence);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSession = {0}", _track.TrackSession);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackStartSector = {0}",
_track.TrackStartSector);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackType = {0}", _track.TrackType);
imageTracks.Add(_track);
if(currentsessioncurrenttrack == 1)
{
currentsessionstruct = new Session();
currentsessionstruct.SessionSequence = currentsession;
currentsessionstruct.StartSector = _track.TrackStartSector;
currentsessionstruct.StartTrack = _track.TrackSequence;
}
currentsessioncurrenttrack++;
if(currentsessioncurrenttrack > currentsessionmaxtrack)
{
currentsession++;
neroSessions.TryGetValue(currentsession, out currentsessionmaxtrack);
currentsessioncurrenttrack = 1;
currentsessionstruct.EndTrack = _track.TrackSequence;
currentsessionstruct.EndSector = _track.TrackEndSector;
imageSessions.Add(currentsessionstruct);
}
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackDescription = {0}",
_track.TrackDescription);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackEndSector = {0}",
_track.TrackEndSector);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackPregap = {0}", _track.TrackPregap);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSequence = {0}",
_track.TrackSequence);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSession = {0}", _track.TrackSession);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackStartSector = {0}",
_track.TrackStartSector);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackType = {0}", _track.TrackType);
if(i == neroTracks.Count)
{
neroSessions.TryGetValue(currentsession, out currentsessionmaxtrack);
currentsessioncurrenttrack = 1;
currentsessionstruct.EndTrack = _track.TrackSequence;
currentsessionstruct.EndSector = _track.TrackEndSector;
imageSessions.Add(currentsessionstruct);
}
if(currentsessioncurrenttrack == 1)
{
currentsessionstruct = new Session();
currentsessionstruct.SessionSequence = currentsession;
currentsessionstruct.StartSector = _track.TrackStartSector;
currentsessionstruct.StartTrack = _track.TrackSequence;
}
currentsessioncurrenttrack++;
if(currentsessioncurrenttrack > currentsessionmaxtrack)
{
currentsession++;
neroSessions.TryGetValue(currentsession, out currentsessionmaxtrack);
currentsessioncurrenttrack = 1;
currentsessionstruct.EndTrack = _track.TrackSequence;
currentsessionstruct.EndSector = _track.TrackEndSector;
imageSessions.Add(currentsessionstruct);
}
offsetmap.Add(_track.TrackSequence, _track.TrackStartSector);
DicConsole.DebugWriteLine("Nero plugin", "\t\t Offset[{0}]: {1}", _track.TrackSequence,
_track.TrackStartSector);
if(i == neroTracks.Count)
{
neroSessions.TryGetValue(currentsession, out currentsessionmaxtrack);
currentsessioncurrenttrack = 1;
currentsessionstruct.EndTrack = _track.TrackSequence;
currentsessionstruct.EndSector = _track.TrackEndSector;
imageSessions.Add(currentsessionstruct);
}
Partition partition;
offsetmap.Add(_track.TrackSequence, _track.TrackStartSector);
DicConsole.DebugWriteLine("Nero plugin", "\t\t Offset[{0}]: {1}", _track.TrackSequence,
_track.TrackStartSector);
Partition partition;
/*if(_neroTrack.Index0 < _neroTrack.Index1)
/*if(_neroTrack.Index0 < _neroTrack.Index1)
{
partition = new Partition();
partition.PartitionDescription = string.Format("Track {0} Index 0", _track.TrackSequence);
@@ -1708,20 +1708,19 @@ namespace DiscImageChef.DiscImages
PartitionSequence++;
}*/
partition = new Partition();
partition.Description = string.Format("Track {0} Index 1", _track.TrackSequence);
partition.Size = neroTrack.EndOfTrack - neroTrack.Index1;
partition.Name = StringHandlers.CToString(neroTrack.Isrc);
partition.Length = partition.Size / neroTrack.SectorSize;
partition.Sequence = partitionSequence;
partition.Offset = partitionStartByte;
partition.Start = neroTrack.StartLba +
(neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize;
partition.Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode).ToString();
imagePartitions.Add(partition);
partitionSequence++;
partitionStartByte += partition.Size;
}
partition = new Partition();
partition.Description = string.Format("Track {0} Index 1", _track.TrackSequence);
partition.Size = neroTrack.EndOfTrack - neroTrack.Index1;
partition.Name = StringHandlers.CToString(neroTrack.Isrc);
partition.Length = partition.Size / neroTrack.SectorSize;
partition.Sequence = partitionSequence;
partition.Offset = partitionStartByte;
partition.Start = neroTrack.StartLba +
(neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize;
partition.Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode).ToString();
imagePartitions.Add(partition);
partitionSequence++;
partitionStartByte += partition.Size;
}
this.imageFilter = imageFilter;

View File

@@ -250,11 +250,10 @@ namespace DiscImageChef.DiscImages
{
l1Mask <<= 1;
if(c < 64 - l1Shift)
{
l1Mask += 1;
c++;
}
if(c >= 64 - l1Shift) continue;
l1Mask += 1;
c++;
}
l2Mask = 0;

View File

@@ -297,11 +297,10 @@ namespace DiscImageChef.DiscImages
{
l1Mask <<= 1;
if(c < 64 - l1Shift)
{
l1Mask += 1;
c++;
}
if(c >= 64 - l1Shift) continue;
l1Mask += 1;
c++;
}
l2Mask = 0;

View File

@@ -264,11 +264,10 @@ namespace DiscImageChef.DiscImages
{
l1Mask <<= 1;
if(c < 64 - l1Shift)
{
l1Mask += 1;
c++;
}
if(c >= 64 - l1Shift) continue;
l1Mask += 1;
c++;
}
sectorMask = 0;

View File

@@ -261,14 +261,12 @@ namespace DiscImageChef.DiscImages
#region Unsupported features
public override byte[] ReadDiskTag(MediaTagType tag)
{
if(ImageInfo.ReadableMediaTags.Contains(tag) && tag == MediaTagType.ATA_IDENTIFY)
{
byte[] buffer = new byte[512];
Array.Copy(identify, 0, buffer, 0, 512);
return buffer;
}
if(!ImageInfo.ReadableMediaTags.Contains(tag) || tag != MediaTagType.ATA_IDENTIFY)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
byte[] buffer = new byte[512];
Array.Copy(identify, 0, buffer, 0, 512);
return buffer;
}
public override byte[] ReadSectorTag(ulong sectorAddress, SectorTagType tag)

View File

@@ -546,16 +546,15 @@ namespace DiscImageChef.DiscImages
teleDiskSector.Flags = (byte)stream.ReadByte();
teleDiskSector.Crc = (byte)stream.ReadByte();
if((teleDiskSector.Flags & FLAGS_SECTOR_DATALESS) != FLAGS_SECTOR_DATALESS &&
(teleDiskSector.Flags & FLAGS_SECTOR_SKIPPED) != FLAGS_SECTOR_SKIPPED)
{
stream.Read(dataSizeBytes, 0, 2);
teleDiskData.DataSize = BitConverter.ToUInt16(dataSizeBytes, 0);
teleDiskData.DataSize--; // Sydex decided to including dataEncoding byte as part of it
teleDiskData.DataEncoding = (byte)stream.ReadByte();
data = new byte[teleDiskData.DataSize];
stream.Read(data, 0, teleDiskData.DataSize);
}
if((teleDiskSector.Flags & FLAGS_SECTOR_DATALESS) == FLAGS_SECTOR_DATALESS ||
(teleDiskSector.Flags & FLAGS_SECTOR_SKIPPED) == FLAGS_SECTOR_SKIPPED) continue;
stream.Read(dataSizeBytes, 0, 2);
teleDiskData.DataSize = BitConverter.ToUInt16(dataSizeBytes, 0);
teleDiskData.DataSize--; // Sydex decided to including dataEncoding byte as part of it
teleDiskData.DataEncoding = (byte)stream.ReadByte();
data = new byte[teleDiskData.DataSize];
stream.Read(data, 0, teleDiskData.DataSize);
}
}
@@ -671,21 +670,22 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("TeleDisk plugin", "\t\tLBA: {0}", lba);
if((teleDiskSector.Flags & FLAGS_SECTOR_NO_ID) != FLAGS_SECTOR_NO_ID)
if(sectorsData[teleDiskTrack.Cylinder][teleDiskTrack.Head][teleDiskSector.SectorNumber] != null)
if((teleDiskSector.Flags & FLAGS_SECTOR_DUPLICATE) == FLAGS_SECTOR_DUPLICATE)
DicConsole.DebugWriteLine("TeleDisk plugin",
"\t\tSector {0} on cylinder {1} head {2} is duplicate, and marked so",
teleDiskSector.SectorNumber, teleDiskSector.Cylinder, teleDiskSector.Head);
else
DicConsole.DebugWriteLine("TeleDisk plugin",
"\t\tSector {0} on cylinder {1} head {2} is duplicate, but is not marked so",
teleDiskSector.SectorNumber, teleDiskSector.Cylinder, teleDiskSector.Head);
if((teleDiskSector.Flags & FLAGS_SECTOR_NO_ID) == FLAGS_SECTOR_NO_ID) continue;
if(sectorsData[teleDiskTrack.Cylinder][teleDiskTrack.Head][teleDiskSector.SectorNumber] != null)
if((teleDiskSector.Flags & FLAGS_SECTOR_DUPLICATE) == FLAGS_SECTOR_DUPLICATE)
DicConsole.DebugWriteLine("TeleDisk plugin",
"\t\tSector {0} on cylinder {1} head {2} is duplicate, and marked so",
teleDiskSector.SectorNumber, teleDiskSector.Cylinder, teleDiskSector.Head);
else
{
sectorsData[teleDiskTrack.Cylinder][teleDiskTrack.Head][teleDiskSector.SectorNumber] = decodedData;
totalDiskSize += (uint)decodedData.Length;
}
DicConsole.DebugWriteLine("TeleDisk plugin",
"\t\tSector {0} on cylinder {1} head {2} is duplicate, but is not marked so",
teleDiskSector.SectorNumber, teleDiskSector.Cylinder, teleDiskSector.Head);
else
{
sectorsData[teleDiskTrack.Cylinder][teleDiskTrack.Head][teleDiskSector.SectorNumber] = decodedData;
totalDiskSize += (uint)decodedData.Length;
}
}
}
@@ -1147,14 +1147,12 @@ namespace DiscImageChef.DiscImages
public override byte[] ReadDiskTag(MediaTagType tag)
{
if(tag == MediaTagType.Floppy_LeadOut)
{
if(leadOut != null) return leadOut;
if(tag != MediaTagType.Floppy_LeadOut)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
throw new FeatureNotPresentImageException("Lead-out not present in disk image");
}
if(leadOut != null) return leadOut;
throw new FeatureUnsupportedImageException("Feature not supported by image format");
throw new FeatureNotPresentImageException("Lead-out not present in disk image");
}
#endregion
@@ -1538,28 +1536,26 @@ namespace DiscImageChef.DiscImages
k = ++freq[c];
/* swap nodes to keep the tree freq-ordered */
if(k > freq[l = c + 1])
{
while(k > freq[++l]) { }
if(k <= freq[l = c + 1]) continue;
;
l--;
freq[c] = freq[l];
freq[l] = (ushort)k;
while(k > freq[++l]) { }
i = son[c];
prnt[i] = (short)l;
if(i < T) prnt[i + 1] = (short)l;
l--;
freq[c] = freq[l];
freq[l] = (ushort)k;
j = son[l];
son[l] = (short)i;
i = son[c];
prnt[i] = (short)l;
if(i < T) prnt[i + 1] = (short)l;
prnt[j] = (short)c;
if(j < T) prnt[j + 1] = (short)c;
son[c] = (short)j;
j = son[l];
son[l] = (short)i;
c = l;
}
prnt[j] = (short)c;
if(j < T) prnt[j + 1] = (short)c;
son[c] = (short)j;
c = l;
}
while((c = prnt[c]) != 0); /* do it until reaching the root */
}

View File

@@ -237,16 +237,17 @@ namespace DiscImageChef.DiscImages
}
// For empty cylinders
if(sectorsOff[cyl][head].Length == 0)
if(cyl + 1 == hdr.cylinders ||
// Next cylinder is also empty
sectorsOff[cyl + 1][head].Length == 0) emptyCyl = true;
// Create empty sectors
else
{
sectorsData[cyl][head] = new byte[spt][];
for(int i = 0; i < spt; i++) sectorsData[cyl][head][i] = new byte[ImageInfo.SectorSize];
}
if(sectorsOff[cyl][head].Length != 0) continue;
if(cyl + 1 == hdr.cylinders ||
// Next cylinder is also empty
sectorsOff[cyl + 1][head].Length == 0) emptyCyl = true;
// Create empty sectors
else
{
sectorsData[cyl][head] = new byte[spt][];
for(int i = 0; i < spt; i++) sectorsData[cyl][head][i] = new byte[ImageInfo.SectorSize];
}
}
if(emptyCyl) ImageInfo.Cylinders--;

View File

@@ -1081,28 +1081,25 @@ namespace DiscImageChef.DiscImages
*/
// Sector has been written, read from child image
if(dirty)
{
/* Too noisy
if(!dirty) return parentImage.ReadSector(sectorAddress);
/* Too noisy
DicConsole.DebugWriteLine("VirtualPC plugin", "Sector {0} is dirty", sectorAddress);
*/
byte[] data = new byte[512];
uint sectorOffset = blockAllocationTable[blockNumber] + bitmapSize + sectorInBlock;
thisStream = thisFilter.GetDataForkStream();
byte[] data = new byte[512];
uint sectorOffset = blockAllocationTable[blockNumber] + bitmapSize + sectorInBlock;
thisStream = thisFilter.GetDataForkStream();
thisStream.Seek(sectorOffset * 512, SeekOrigin.Begin);
thisStream.Read(data, 0, 512);
thisStream.Seek(sectorOffset * 512, SeekOrigin.Begin);
thisStream.Read(data, 0, 512);
return data;
}
return data;
/* Too noisy
DicConsole.DebugWriteLine("VirtualPC plugin", "Sector {0} is clean", sectorAddress);
*/
// Read sector from parent image
return parentImage.ReadSector(sectorAddress);
}
default: return ReadSectors(sectorAddress, 1);
}
@@ -1170,15 +1167,12 @@ namespace DiscImageChef.DiscImages
else Array.Clear(prefix, 0, prefix.Length);
// If we needed to read from another block, join all the data
if(suffix != null)
{
byte[] data = new byte[512 * length];
Array.Copy(prefix, 0, data, 0, prefix.Length);
Array.Copy(suffix, 0, data, prefix.Length, suffix.Length);
return data;
}
if(suffix == null) return prefix;
return prefix;
byte[] data = new byte[512 * length];
Array.Copy(prefix, 0, data, 0, prefix.Length);
Array.Copy(suffix, 0, data, prefix.Length, suffix.Length);
return data;
}
case TYPE_DIFFERENCING:
{

View File

@@ -614,11 +614,10 @@ namespace DiscImageChef.DiscImages
{
parentFilter =
new FiltersList().GetFilter(Path.Combine(imageFilter.GetParentFolder(), relEntry));
if(parentFilter != null && parentImage.OpenImage(parentFilter))
{
parentWorks = true;
break;
}
if(parentFilter == null || !parentImage.OpenImage(parentFilter)) continue;
parentWorks = true;
break;
}
catch { continue; }
}
@@ -634,11 +633,10 @@ namespace DiscImageChef.DiscImages
{
parentFilter =
new FiltersList().GetFilter(Path.Combine(imageFilter.GetParentFolder(), entryValue));
if(parentFilter != null && parentImage.OpenImage(parentFilter))
{
parentWorks = true;
break;
}
if(parentFilter == null || !parentImage.OpenImage(parentFilter)) continue;
parentWorks = true;
break;
}
catch { continue; }
}

View File

@@ -234,16 +234,17 @@ namespace DiscImageChef.DiscImages
stream.Read(ddfMagic, 0, 0x15);
vmCHdr = new VMwareCowHeader();
if(stream.Length > Marshal.SizeOf(vmCHdr))
{
stream.Seek(0, SeekOrigin.Begin);
byte[] vmCHdrB = new byte[Marshal.SizeOf(vmCHdr)];
stream.Read(vmCHdrB, 0, Marshal.SizeOf(vmCHdr));
headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vmCHdr));
Marshal.Copy(vmCHdrB, 0, headerPtr, Marshal.SizeOf(vmCHdr));
vmCHdr = (VMwareCowHeader)Marshal.PtrToStructure(headerPtr, typeof(VMwareCowHeader));
Marshal.FreeHGlobal(headerPtr);
}
if(stream.Length <= Marshal.SizeOf(vmCHdr))
return ddfMagicBytes.SequenceEqual(ddfMagic) || vmEHdr.magic == VMWARE_EXTENT_MAGIC ||
vmCHdr.magic == VMWARE_COW_MAGIC;
stream.Seek(0, SeekOrigin.Begin);
byte[] vmCHdrB = new byte[Marshal.SizeOf(vmCHdr)];
stream.Read(vmCHdrB, 0, Marshal.SizeOf(vmCHdr));
headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vmCHdr));
Marshal.Copy(vmCHdrB, 0, headerPtr, Marshal.SizeOf(vmCHdr));
vmCHdr = (VMwareCowHeader)Marshal.PtrToStructure(headerPtr, typeof(VMwareCowHeader));
Marshal.FreeHGlobal(headerPtr);
return ddfMagicBytes.SequenceEqual(ddfMagic) || vmEHdr.magic == VMWARE_EXTENT_MAGIC ||
vmCHdr.magic == VMWARE_COW_MAGIC;
@@ -522,43 +523,42 @@ namespace DiscImageChef.DiscImages
if(extent.Access == "NOACCESS") throw new Exception("Cannot access NOACCESS extents ;).");
if(extent.Type != "FLAT" && extent.Type != "ZERO" && extent.Type != "VMFS" && !cowD)
if(extent.Type == "FLAT" || extent.Type == "ZERO" || extent.Type == "VMFS" || cowD) continue;
Stream extentStream = extent.Filter.GetDataForkStream();
extentStream.Seek(0, SeekOrigin.Begin);
if(extentStream.Length < SECTOR_SIZE)
throw new Exception(string.Format("Extent {0} is too small.", extent.Filename));
VMwareExtentHeader extentHdr = new VMwareExtentHeader();
byte[] extentHdrB = new byte[Marshal.SizeOf(extentHdr)];
extentStream.Read(extentHdrB, 0, Marshal.SizeOf(extentHdr));
IntPtr extentHdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(extentHdr));
Marshal.Copy(extentHdrB, 0, extentHdrPtr, Marshal.SizeOf(extentHdr));
extentHdr = (VMwareExtentHeader)Marshal.PtrToStructure(extentHdrPtr, typeof(VMwareExtentHeader));
Marshal.FreeHGlobal(extentHdrPtr);
if(extentHdr.magic != VMWARE_EXTENT_MAGIC)
throw new Exception(string.Format("{0} is not an VMware extent.", extent.Filter));
if(extentHdr.capacity < extent.Sectors)
throw new
Exception(string.Format("Extent contains incorrect number of sectors, {0}. {1} were expected",
extentHdr.capacity, extent.Sectors));
// TODO: Support compressed extents
if(extentHdr.compression != COMPRESSION_NONE)
throw new ImageNotSupportedException("Compressed extents are not yet supported.");
if(!vmEHdrSet)
{
Stream extentStream = extent.Filter.GetDataForkStream();
extentStream.Seek(0, SeekOrigin.Begin);
if(extentStream.Length < SECTOR_SIZE)
throw new Exception(string.Format("Extent {0} is too small.", extent.Filename));
VMwareExtentHeader extentHdr = new VMwareExtentHeader();
byte[] extentHdrB = new byte[Marshal.SizeOf(extentHdr)];
extentStream.Read(extentHdrB, 0, Marshal.SizeOf(extentHdr));
IntPtr extentHdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(extentHdr));
Marshal.Copy(extentHdrB, 0, extentHdrPtr, Marshal.SizeOf(extentHdr));
extentHdr = (VMwareExtentHeader)Marshal.PtrToStructure(extentHdrPtr, typeof(VMwareExtentHeader));
Marshal.FreeHGlobal(extentHdrPtr);
if(extentHdr.magic != VMWARE_EXTENT_MAGIC)
throw new Exception(string.Format("{0} is not an VMware extent.", extent.Filter));
if(extentHdr.capacity < extent.Sectors)
throw new
Exception(string.Format("Extent contains incorrect number of sectors, {0}. {1} were expected",
extentHdr.capacity, extent.Sectors));
// TODO: Support compressed extents
if(extentHdr.compression != COMPRESSION_NONE)
throw new ImageNotSupportedException("Compressed extents are not yet supported.");
if(!vmEHdrSet)
{
vmEHdr = extentHdr;
gdFilter = extent.Filter;
vmEHdrSet = true;
}
oneNoFlat = true;
vmEHdr = extentHdr;
gdFilter = extent.Filter;
vmEHdrSet = true;
}
oneNoFlat = true;
}
if(oneNoFlat && !vmEHdrSet && !cowD)

View File

@@ -78,40 +78,39 @@ namespace DiscImageChef.DiscImages
public override bool IdentifyImage(Filter imageFilter)
{
// Check if file is not multiple of 512
if(imageFilter.GetDataForkLength() % 512 != 0)
if(imageFilter.GetDataForkLength() % 512 == 0) return true;
extension = Path.GetExtension(imageFilter.GetFilename()).ToLower();
if(extension == ".hdf" && ImageInfo.ImageSize % 256 == 0) return true;
// Check known disk sizes with sectors smaller than 512
switch(imageFilter.GetDataForkLength())
{
extension = Path.GetExtension(imageFilter.GetFilename()).ToLower();
#region Commodore
case 174848:
case 175531:
case 197376:
case 351062:
case 822400:
#endregion Commodore
if(extension == ".hdf" && ImageInfo.ImageSize % 256 == 0) return true;
// Check known disk sizes with sectors smaller than 512
switch(imageFilter.GetDataForkLength())
{
#region Commodore
case 174848:
case 175531:
case 197376:
case 351062:
case 822400:
#endregion Commodore
case 81664:
case 116480:
case 242944:
case 256256:
case 287488:
case 306432:
case 495872:
case 988416:
case 995072:
case 1021696:
case 1146624:
case 1177344:
case 1222400:
case 1304320:
case 1255168: return true;
default: return false;
}
case 81664:
case 116480:
case 242944:
case 256256:
case 287488:
case 306432:
case 495872:
case 988416:
case 995072:
case 1021696:
case 1146624:
case 1177344:
case 1222400:
case 1304320:
case 1255168: return true;
default: return false;
}
return true;
@@ -761,148 +760,132 @@ namespace DiscImageChef.DiscImages
public override List<Track> GetTracks()
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackEndSector = ImageInfo.Sectors - 1;
trk.TrackFile = rawImageFilter.GetFilename();
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackEndSector = ImageInfo.Sectors - 1;
trk.TrackFile = rawImageFilter.GetFilename();
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
public override List<Track> GetSessionTracks(Session session)
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
if(session.SessionSequence != 1)
throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported");
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackEndSector = ImageInfo.Sectors - 1;
trk.TrackFilter = rawImageFilter;
trk.TrackFile = rawImageFilter.GetFilename();
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
if(session.SessionSequence != 1)
throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackEndSector = ImageInfo.Sectors - 1;
trk.TrackFilter = rawImageFilter;
trk.TrackFile = rawImageFilter.GetFilename();
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
public override List<Track> GetSessionTracks(ushort session)
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
if(session != 1)
throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported");
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackEndSector = ImageInfo.Sectors - 1;
trk.TrackFilter = rawImageFilter;
trk.TrackFile = rawImageFilter.GetFilename();
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
if(session != 1)
throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackEndSector = ImageInfo.Sectors - 1;
trk.TrackFilter = rawImageFilter;
trk.TrackFile = rawImageFilter.GetFilename();
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.SectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
public override List<Session> GetSessions()
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
Session sess = new Session();
sess.EndSector = ImageInfo.Sectors - 1;
sess.EndTrack = 1;
sess.SessionSequence = 1;
sess.StartSector = 0;
sess.StartTrack = 1;
List<Session> lst = new List<Session>();
lst.Add(sess);
return lst;
}
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
Session sess = new Session();
sess.EndSector = ImageInfo.Sectors - 1;
sess.EndTrack = 1;
sess.SessionSequence = 1;
sess.StartSector = 0;
sess.StartTrack = 1;
List<Session> lst = new List<Session>();
lst.Add(sess);
return lst;
}
public override byte[] ReadSector(ulong sectorAddress, uint track)
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSector(sectorAddress);
}
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSector(sectorAddress);
}
public override byte[] ReadSectors(ulong sectorAddress, uint length, uint track)
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSectors(sectorAddress, length);
}
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSectors(sectorAddress, length);
}
public override byte[] ReadSectorLong(ulong sectorAddress, uint track)
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSector(sectorAddress);
}
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSector(sectorAddress);
}
public override byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track)
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSectors(sectorAddress, length);
}
if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
return ReadSectors(sectorAddress, length);
}
#region Private methods
@@ -1124,23 +1107,21 @@ namespace DiscImageChef.DiscImages
public override List<Partition> GetPartitions()
{
if(ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{
List<Partition> parts = new List<Partition>();
Partition part = new Partition
{
Start = 0,
Length = ImageInfo.Sectors,
Offset = 0,
Sequence = 0,
Type = "MODE1/2048",
Size = ImageInfo.Sectors * ImageInfo.SectorSize
};
parts.Add(part);
return parts;
}
if(ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
throw new FeatureUnsupportedImageException("Feature not supported by image format");
throw new FeatureUnsupportedImageException("Feature not supported by image format");
List<Partition> parts = new List<Partition>();
Partition part = new Partition
{
Start = 0,
Length = ImageInfo.Sectors,
Offset = 0,
Sequence = 0,
Type = "MODE1/2048",
Size = ImageInfo.Sectors * ImageInfo.SectorSize
};
parts.Add(part);
return parts;
}
public override byte[] ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag)