mirror of
https://github.com/aaru-dps/Aaru.Server.git
synced 2025-12-16 19:24:27 +00:00
REFACTOR: Invert 'if' statement to reduce nesting.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
}
|
||||
|
||||
@@ -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--;
|
||||
|
||||
@@ -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:
|
||||
{
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user