mirror of
https://github.com/aaru-dps/Aaru.Server.git
synced 2025-12-16 19:24:27 +00:00
REFACTOR: Convert 'if' statement to 'switch' statement.
This commit is contained in:
@@ -145,12 +145,20 @@ namespace DiscImageChef.DiscImages
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 8:
|
||||
if(fdihdr.heads == 1) ImageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
else if(fdihdr.heads == 2) ImageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
switch(fdihdr.heads) {
|
||||
case 1: ImageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
break;
|
||||
case 2: ImageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
if(fdihdr.heads == 1) ImageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
else if(fdihdr.heads == 2) ImageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
switch(fdihdr.heads) {
|
||||
case 1: ImageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
break;
|
||||
case 2: ImageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -222,8 +230,12 @@ namespace DiscImageChef.DiscImages
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 16:
|
||||
if(fdihdr.heads == 1) ImageInfo.MediaType = MediaType.NEC_525_SS;
|
||||
else if(fdihdr.heads == 2) ImageInfo.MediaType = MediaType.NEC_525_DS;
|
||||
switch(fdihdr.heads) {
|
||||
case 1: ImageInfo.MediaType = MediaType.NEC_525_SS;
|
||||
break;
|
||||
case 2: ImageInfo.MediaType = MediaType.NEC_525_DS;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -232,12 +244,20 @@ namespace DiscImageChef.DiscImages
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 8:
|
||||
if(fdihdr.heads == 1) ImageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
else if(fdihdr.heads == 2) ImageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
switch(fdihdr.heads) {
|
||||
case 1: ImageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
break;
|
||||
case 2: ImageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
if(fdihdr.heads == 1) ImageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
else if(fdihdr.heads == 2) ImageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
switch(fdihdr.heads) {
|
||||
case 1: ImageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
break;
|
||||
case 2: ImageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
if(fdihdr.heads == 2) ImageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
|
||||
@@ -288,13 +288,17 @@ namespace DiscImageChef.DiscImages
|
||||
if(imageHeader.DataSize == 0 && imageHeader.Blocks == 0 &&
|
||||
imageHeader.ImageFormat != PRODOS_SECTOR_ORDER) return false;
|
||||
|
||||
if(imageHeader.ImageFormat == PRODOS_SECTOR_ORDER && imageHeader.Blocks == 0) return false;
|
||||
|
||||
if(imageHeader.ImageFormat == PRODOS_SECTOR_ORDER) imageHeader.DataSize = imageHeader.Blocks * 512;
|
||||
else if(imageHeader.Blocks == 0 && imageHeader.DataSize != 0)
|
||||
imageHeader.Blocks = imageHeader.DataSize / 256;
|
||||
else if(imageHeader.DataSize == 0 && imageHeader.Blocks != 0)
|
||||
imageHeader.DataSize = imageHeader.Blocks * 256;
|
||||
switch(imageHeader.ImageFormat) {
|
||||
case PRODOS_SECTOR_ORDER when imageHeader.Blocks == 0: return false;
|
||||
case PRODOS_SECTOR_ORDER: imageHeader.DataSize = imageHeader.Blocks * 512;
|
||||
break;
|
||||
default:
|
||||
if(imageHeader.Blocks == 0 && imageHeader.DataSize != 0)
|
||||
imageHeader.Blocks = imageHeader.DataSize / 256;
|
||||
else if(imageHeader.DataSize == 0 && imageHeader.Blocks != 0)
|
||||
imageHeader.DataSize = imageHeader.Blocks * 256;
|
||||
break;
|
||||
}
|
||||
|
||||
ImageInfo.SectorSize = (uint)(imageHeader.ImageFormat == PRODOS_SECTOR_ORDER ? 512 : 256);
|
||||
|
||||
|
||||
@@ -735,12 +735,14 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
long sectorSize = dataFile.Length / dataFile.Sectors;
|
||||
if(sectorSize > 2352)
|
||||
if(sectorSize - 2352 == 16) chars.Subchannel = TrackSubchannelType.Q16Interleaved;
|
||||
else if(sectorSize - 2352 == 96) chars.Subchannel = TrackSubchannelType.PackedInterleaved;
|
||||
else
|
||||
{
|
||||
DicConsole.ErrorWriteLine("BlindWrite5 found unknown subchannel size: {0}", sectorSize - 2352);
|
||||
return false;
|
||||
switch(sectorSize - 2352) {
|
||||
case 16: chars.Subchannel = TrackSubchannelType.Q16Interleaved;
|
||||
break;
|
||||
case 96: chars.Subchannel = TrackSubchannelType.PackedInterleaved;
|
||||
break;
|
||||
default:
|
||||
DicConsole.ErrorWriteLine("BlindWrite5 found unknown subchannel size: {0}", sectorSize - 2352);
|
||||
return false;
|
||||
}
|
||||
else chars.Subchannel = TrackSubchannelType.None;
|
||||
|
||||
@@ -1114,8 +1116,12 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
if(isBd && ImageInfo.Sectors > 24438784)
|
||||
{
|
||||
if(ImageInfo.MediaType == MediaType.BDR) ImageInfo.MediaType = MediaType.BDRXL;
|
||||
if(ImageInfo.MediaType == MediaType.BDRE) ImageInfo.MediaType = MediaType.BDREXL;
|
||||
switch(ImageInfo.MediaType) {
|
||||
case MediaType.BDR: ImageInfo.MediaType = MediaType.BDRXL;
|
||||
break;
|
||||
case MediaType.BDRE: ImageInfo.MediaType = MediaType.BDREXL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DicConsole.DebugWriteLine("BlindWrite5 plugin", "ImageInfo.mediaType = {0}", ImageInfo.MediaType);
|
||||
|
||||
@@ -2038,17 +2038,17 @@ namespace DiscImageChef.DiscImages
|
||||
uint sector_size;
|
||||
|
||||
if(tag == SectorTagType.CdSectorSubchannel)
|
||||
if(track.TrackSubchannelType == TrackSubchannelType.None)
|
||||
throw new FeatureNotPresentImageException("Requested sector does not contain subchannel");
|
||||
else if(track.TrackSubchannelType == TrackSubchannelType.RawInterleaved)
|
||||
{
|
||||
sector_offset = (uint)track.TrackRawBytesPerSector;
|
||||
sector_size = 96;
|
||||
switch(track.TrackSubchannelType) {
|
||||
case TrackSubchannelType.None: throw new FeatureNotPresentImageException("Requested sector does not contain subchannel");
|
||||
case TrackSubchannelType.RawInterleaved:
|
||||
sector_offset = (uint)track.TrackRawBytesPerSector;
|
||||
sector_size = 96;
|
||||
break;
|
||||
default:
|
||||
throw new
|
||||
FeatureSupportedButNotImplementedImageException(string.Format("Unsupported subchannel type {0}",
|
||||
track.TrackSubchannelType));
|
||||
}
|
||||
else
|
||||
throw new
|
||||
FeatureSupportedButNotImplementedImageException(string.Format("Unsupported subchannel type {0}",
|
||||
track.TrackSubchannelType));
|
||||
else
|
||||
switch(track.TrackType)
|
||||
{
|
||||
|
||||
@@ -407,9 +407,14 @@ namespace DiscImageChef.DiscImages
|
||||
ImageInfo.MediaType = MediaType.NEC_8_SD;
|
||||
else if(bps == IBMSectorSizeCode.QuarterKilo)
|
||||
{
|
||||
if(trkCounter == 80 && spt == 16) ImageInfo.MediaType = MediaType.NEC_525_SS;
|
||||
else if(trkCounter == 154 && spt == 26) ImageInfo.MediaType = MediaType.NEC_8_DD;
|
||||
else if(trkCounter == 160 && spt == 16) ImageInfo.MediaType = MediaType.NEC_525_DS;
|
||||
switch(trkCounter) {
|
||||
case 80 when spt == 16: ImageInfo.MediaType = MediaType.NEC_525_SS;
|
||||
break;
|
||||
case 154 when spt == 26: ImageInfo.MediaType = MediaType.NEC_8_DD;
|
||||
break;
|
||||
case 160 when spt == 16: ImageInfo.MediaType = MediaType.NEC_525_DS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(trkCounter == 154 && spt == 8 && bps == IBMSectorSizeCode.Kilo)
|
||||
ImageInfo.MediaType = MediaType.NEC_525_HD;
|
||||
|
||||
@@ -927,10 +927,10 @@ namespace DiscImageChef.DiscImages
|
||||
break;
|
||||
}
|
||||
case SectorTagType.CdSectorSubchannel:
|
||||
if(_track.TrackSubchannelType == TrackSubchannelType.None)
|
||||
throw new ArgumentException("Unsupported tag requested for this track", nameof(tag));
|
||||
if(_track.TrackSubchannelType == TrackSubchannelType.Q16Interleaved)
|
||||
throw new ArgumentException("Q16 subchannel not yet supported");
|
||||
switch(_track.TrackSubchannelType) {
|
||||
case TrackSubchannelType.None: throw new ArgumentException("Unsupported tag requested for this track", nameof(tag));
|
||||
case TrackSubchannelType.Q16Interleaved: throw new ArgumentException("Q16 subchannel not yet supported");
|
||||
}
|
||||
|
||||
sectorOffset = 2352;
|
||||
sectorSize = 96;
|
||||
@@ -968,10 +968,10 @@ namespace DiscImageChef.DiscImages
|
||||
break;
|
||||
}
|
||||
case SectorTagType.CdSectorSubchannel:
|
||||
if(_track.TrackSubchannelType == TrackSubchannelType.None)
|
||||
throw new ArgumentException("Unsupported tag requested for this track", nameof(tag));
|
||||
if(_track.TrackSubchannelType == TrackSubchannelType.Q16Interleaved)
|
||||
throw new ArgumentException("Q16 subchannel not yet supported");
|
||||
switch(_track.TrackSubchannelType) {
|
||||
case TrackSubchannelType.None: throw new ArgumentException("Unsupported tag requested for this track", nameof(tag));
|
||||
case TrackSubchannelType.Q16Interleaved: throw new ArgumentException("Q16 subchannel not yet supported");
|
||||
}
|
||||
|
||||
sectorOffset = 2352;
|
||||
sectorSize = 96;
|
||||
@@ -987,10 +987,10 @@ namespace DiscImageChef.DiscImages
|
||||
switch(tag)
|
||||
{
|
||||
case SectorTagType.CdSectorSubchannel:
|
||||
if(_track.TrackSubchannelType == TrackSubchannelType.None)
|
||||
throw new ArgumentException("Unsupported tag requested for this track", nameof(tag));
|
||||
if(_track.TrackSubchannelType == TrackSubchannelType.Q16Interleaved)
|
||||
throw new ArgumentException("Q16 subchannel not yet supported");
|
||||
switch(_track.TrackSubchannelType) {
|
||||
case TrackSubchannelType.None: throw new ArgumentException("Unsupported tag requested for this track", nameof(tag));
|
||||
case TrackSubchannelType.Q16Interleaved: throw new ArgumentException("Q16 subchannel not yet supported");
|
||||
}
|
||||
|
||||
sectorOffset = 2352;
|
||||
sectorSize = 96;
|
||||
|
||||
@@ -292,17 +292,21 @@ namespace DiscImageChef.DiscImages
|
||||
kvp[1] = kvp[1].Trim();
|
||||
DicConsole.DebugWriteLine("KryoFlux plugin", "\"{0}\" = \"{1}\"", kvp[0], kvp[1]);
|
||||
|
||||
if(kvp[0] == hostDate)
|
||||
{
|
||||
if(DateTime.TryParseExact(kvp[1], "yyyy.MM.dd", CultureInfo.InvariantCulture,
|
||||
DateTimeStyles.AssumeLocal, out blockDate))
|
||||
foundDate = true;
|
||||
switch(kvp[0]) {
|
||||
case hostDate:
|
||||
if(DateTime.TryParseExact(kvp[1], "yyyy.MM.dd", CultureInfo.InvariantCulture,
|
||||
DateTimeStyles.AssumeLocal, out blockDate))
|
||||
foundDate = true;
|
||||
break;
|
||||
case hostTime:
|
||||
DateTime.TryParseExact(kvp[1], "HH:mm:ss", CultureInfo.InvariantCulture,
|
||||
DateTimeStyles.AssumeLocal, out blockTime);
|
||||
break;
|
||||
case kfName: ImageInfo.ImageApplication = kvp[1];
|
||||
break;
|
||||
case kfVersion: ImageInfo.ImageApplicationVersion = kvp[1];
|
||||
break;
|
||||
}
|
||||
else if(kvp[0] == hostTime)
|
||||
DateTime.TryParseExact(kvp[1], "HH:mm:ss", CultureInfo.InvariantCulture,
|
||||
DateTimeStyles.AssumeLocal, out blockTime);
|
||||
else if(kvp[0] == kfName) ImageInfo.ImageApplication = kvp[1];
|
||||
else if(kvp[0] == kfVersion) ImageInfo.ImageApplicationVersion = kvp[1];
|
||||
}
|
||||
|
||||
if(foundDate)
|
||||
|
||||
@@ -325,14 +325,12 @@ namespace DiscImageChef.DiscImages
|
||||
bChnk.sector += (uint)ImageInfo.Sectors;
|
||||
|
||||
// TODO: Handle compressed chunks
|
||||
if(bChnk.type == CHUNK_TYPE_KENCODE)
|
||||
throw new ImageNotSupportedException("Chunks compressed with KenCode are not yet supported.");
|
||||
if(bChnk.type == CHUNK_TYPE_RLE)
|
||||
throw new ImageNotSupportedException("Chunks compressed with RLE are not yet supported.");
|
||||
if(bChnk.type == CHUNK_TYPE_LZH)
|
||||
throw new ImageNotSupportedException("Chunks compressed with LZH are not yet supported.");
|
||||
if(bChnk.type == CHUNK_TYPE_STUFFIT)
|
||||
throw new ImageNotSupportedException("Chunks compressed with StuffIt! are not yet supported.");
|
||||
switch(bChnk.type) {
|
||||
case CHUNK_TYPE_KENCODE: throw new ImageNotSupportedException("Chunks compressed with KenCode are not yet supported.");
|
||||
case CHUNK_TYPE_RLE: throw new ImageNotSupportedException("Chunks compressed with RLE are not yet supported.");
|
||||
case CHUNK_TYPE_LZH: throw new ImageNotSupportedException("Chunks compressed with LZH are not yet supported.");
|
||||
case CHUNK_TYPE_STUFFIT: throw new ImageNotSupportedException("Chunks compressed with StuffIt! are not yet supported.");
|
||||
}
|
||||
|
||||
// TODO: Handle compressed chunks
|
||||
if(bChnk.type > CHUNK_TYPE_COPY && bChnk.type < CHUNK_TYPE_KENCODE ||
|
||||
@@ -543,26 +541,23 @@ namespace DiscImageChef.DiscImages
|
||||
return sector;
|
||||
}
|
||||
|
||||
if(currentChunk.type == CHUNK_TYPE_NOCOPY)
|
||||
{
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
switch(currentChunk.type) {
|
||||
case CHUNK_TYPE_NOCOPY:
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
}
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
case CHUNK_TYPE_COPY:
|
||||
imageStream.Seek(currentChunk.offset + relOff, SeekOrigin.Begin);
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
imageStream.Read(sector, 0, sector.Length);
|
||||
|
||||
if(currentChunk.type == CHUNK_TYPE_COPY)
|
||||
{
|
||||
imageStream.Seek(currentChunk.offset + relOff, SeekOrigin.Begin);
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
imageStream.Read(sector, 0, sector.Length);
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
}
|
||||
|
||||
throw new ImageNotSupportedException(string.Format("Unsupported chunk type 0x{0:X8} found",
|
||||
|
||||
@@ -461,19 +461,17 @@ namespace DiscImageChef.DiscImages
|
||||
bChnk.sector += bHdr.sectorStart;
|
||||
bChnk.offset += bHdr.dataOffset;
|
||||
|
||||
// TODO: Handle comments
|
||||
if(bChnk.type == CHUNK_TYPE_COMMNT) continue;
|
||||
|
||||
// TODO: Handle compressed chunks
|
||||
if(bChnk.type == CHUNK_TYPE_KENCODE)
|
||||
throw new
|
||||
ImageNotSupportedException("Chunks compressed with KenCode are not yet supported.");
|
||||
if(bChnk.type == CHUNK_TYPE_RLE)
|
||||
throw new ImageNotSupportedException("Chunks compressed with RLE are not yet supported.");
|
||||
if(bChnk.type == CHUNK_TYPE_LZH)
|
||||
throw new ImageNotSupportedException("Chunks compressed with LZH are not yet supported.");
|
||||
if(bChnk.type == CHUNK_TYPE_LZFSE)
|
||||
throw new ImageNotSupportedException("Chunks compressed with lzfse are not yet supported.");
|
||||
switch(bChnk.type) {
|
||||
// TODO: Handle comments
|
||||
case CHUNK_TYPE_COMMNT: continue;
|
||||
// TODO: Handle compressed chunks
|
||||
case CHUNK_TYPE_KENCODE:
|
||||
throw new
|
||||
ImageNotSupportedException("Chunks compressed with KenCode are not yet supported.");
|
||||
case CHUNK_TYPE_RLE: throw new ImageNotSupportedException("Chunks compressed with RLE are not yet supported.");
|
||||
case CHUNK_TYPE_LZH: throw new ImageNotSupportedException("Chunks compressed with LZH are not yet supported.");
|
||||
case CHUNK_TYPE_LZFSE: throw new ImageNotSupportedException("Chunks compressed with lzfse are not yet supported.");
|
||||
}
|
||||
|
||||
if(bChnk.type > CHUNK_TYPE_NOCOPY && bChnk.type < CHUNK_TYPE_COMMNT ||
|
||||
bChnk.type > CHUNK_TYPE_LZFSE && bChnk.type < CHUNK_TYPE_END)
|
||||
@@ -551,14 +549,17 @@ namespace DiscImageChef.DiscImages
|
||||
MemoryStream cmpMs = new MemoryStream(cmpBuffer);
|
||||
Stream decStream;
|
||||
|
||||
if(currentChunk.type == CHUNK_TYPE_ADC) decStream = new ADCStream(cmpMs, CompressionMode.Decompress);
|
||||
else if(currentChunk.type == CHUNK_TYPE_ZLIB)
|
||||
decStream = new Ionic.Zlib.ZlibStream(cmpMs, Ionic.Zlib.CompressionMode.Decompress);
|
||||
else if(currentChunk.type == CHUNK_TYPE_BZIP)
|
||||
decStream = new BZip2Stream(cmpMs, CompressionMode.Decompress);
|
||||
else
|
||||
throw new ImageNotSupportedException(string.Format("Unsupported chunk type 0x{0:X8} found",
|
||||
currentChunk.type));
|
||||
switch(currentChunk.type) {
|
||||
case CHUNK_TYPE_ADC: decStream = new ADCStream(cmpMs, CompressionMode.Decompress);
|
||||
break;
|
||||
case CHUNK_TYPE_ZLIB: decStream = new Ionic.Zlib.ZlibStream(cmpMs, Ionic.Zlib.CompressionMode.Decompress);
|
||||
break;
|
||||
case CHUNK_TYPE_BZIP: decStream = new BZip2Stream(cmpMs, CompressionMode.Decompress);
|
||||
break;
|
||||
default:
|
||||
throw new ImageNotSupportedException(string.Format("Unsupported chunk type 0x{0:X8} found",
|
||||
currentChunk.type));
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
try
|
||||
@@ -598,26 +599,24 @@ namespace DiscImageChef.DiscImages
|
||||
return sector;
|
||||
}
|
||||
|
||||
if(currentChunk.type == CHUNK_TYPE_NOCOPY || currentChunk.type == CHUNK_TYPE_ZERO)
|
||||
{
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
switch(currentChunk.type) {
|
||||
case CHUNK_TYPE_NOCOPY:
|
||||
case CHUNK_TYPE_ZERO:
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
}
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
case CHUNK_TYPE_COPY:
|
||||
imageStream.Seek((long)currentChunk.offset + relOff, SeekOrigin.Begin);
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
imageStream.Read(sector, 0, sector.Length);
|
||||
|
||||
if(currentChunk.type == CHUNK_TYPE_COPY)
|
||||
{
|
||||
imageStream.Seek((long)currentChunk.offset + relOff, SeekOrigin.Begin);
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
imageStream.Read(sector, 0, sector.Length);
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
}
|
||||
|
||||
throw new ImageNotSupportedException(string.Format("Unsupported chunk type 0x{0:X8} found",
|
||||
|
||||
@@ -694,19 +694,24 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
MemoryStream sectorBmpMs = new MemoryStream();
|
||||
foreach(ulong pt in sectorBitmapPointers)
|
||||
if((pt & BAT_FLAGS_MASK) == SECTOR_BITMAP_NOT_PRESENT) sectorBmpMs.Write(new byte[1048576], 0, 1048576);
|
||||
else if((pt & BAT_FLAGS_MASK) == SECTOR_BITMAP_PRESENT)
|
||||
{
|
||||
stream.Seek((long)((pt & BAT_FILE_OFFSET_MASK) * 1048576), SeekOrigin.Begin);
|
||||
byte[] bmp = new byte[1048576];
|
||||
stream.Read(bmp, 0, bmp.Length);
|
||||
sectorBmpMs.Write(bmp, 0, bmp.Length);
|
||||
switch(pt & BAT_FLAGS_MASK) {
|
||||
case SECTOR_BITMAP_NOT_PRESENT: sectorBmpMs.Write(new byte[1048576], 0, 1048576);
|
||||
break;
|
||||
case SECTOR_BITMAP_PRESENT:
|
||||
stream.Seek((long)((pt & BAT_FILE_OFFSET_MASK) * 1048576), SeekOrigin.Begin);
|
||||
byte[] bmp = new byte[1048576];
|
||||
stream.Read(bmp, 0, bmp.Length);
|
||||
sectorBmpMs.Write(bmp, 0, bmp.Length);
|
||||
break;
|
||||
default:
|
||||
if((pt & BAT_FLAGS_MASK) != 0)
|
||||
throw new
|
||||
ImageNotSupportedException(string
|
||||
.Format("Unsupported sector bitmap block flags (0x{0:X16}) found, not proceeding.",
|
||||
pt & BAT_FLAGS_MASK));
|
||||
|
||||
break;
|
||||
}
|
||||
else if((pt & BAT_FLAGS_MASK) != 0)
|
||||
throw new
|
||||
ImageNotSupportedException(string
|
||||
.Format("Unsupported sector bitmap block flags (0x{0:X16}) found, not proceeding.",
|
||||
pt & BAT_FLAGS_MASK));
|
||||
|
||||
sectorBitmap = sectorBmpMs.ToArray();
|
||||
sectorBmpMs.Close();
|
||||
@@ -835,11 +840,12 @@ namespace DiscImageChef.DiscImages
|
||||
throw new ImageNotSupportedException(string.Format("Unknown flags (0x{0:X16}) set in block pointer",
|
||||
blkPtr & BAT_RESERVED_MASK));
|
||||
|
||||
if((blkFlags & BAT_FLAGS_MASK) == PAYLOAD_BLOCK_NOT_PRESENT)
|
||||
return hasParent ? parentImage.ReadSector(sectorAddress) : new byte[logicalSectorSize];
|
||||
|
||||
if((blkFlags & BAT_FLAGS_MASK) == PAYLOAD_BLOCK_UNDEFINED || (blkFlags & BAT_FLAGS_MASK) == PAYLOAD_BLOCK_ZERO ||
|
||||
(blkFlags & BAT_FLAGS_MASK) == PAYLOAD_BLOCK_UNMAPPER) return new byte[logicalSectorSize];
|
||||
switch(blkFlags & BAT_FLAGS_MASK) {
|
||||
case PAYLOAD_BLOCK_NOT_PRESENT: return hasParent ? parentImage.ReadSector(sectorAddress) : new byte[logicalSectorSize];
|
||||
case PAYLOAD_BLOCK_UNDEFINED:
|
||||
case PAYLOAD_BLOCK_ZERO:
|
||||
case PAYLOAD_BLOCK_UNMAPPER: return new byte[logicalSectorSize];
|
||||
}
|
||||
|
||||
bool partialBlock;
|
||||
partialBlock = !((blkFlags & BAT_FLAGS_MASK) == PAYLOAD_BLOCK_FULLY_PRESENT);
|
||||
|
||||
@@ -739,28 +739,26 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
Stream dataStream;
|
||||
|
||||
if(currentExtent.Type == "ZERO")
|
||||
{
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
switch(currentExtent.Type) {
|
||||
case "ZERO":
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
}
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
case "FLAT":
|
||||
case "VMFS":
|
||||
dataStream = currentExtent.Filter.GetDataForkStream();
|
||||
dataStream.Seek((long)((currentExtent.Offset + (sectorAddress - extentStartSector)) * SECTOR_SIZE),
|
||||
SeekOrigin.Begin);
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
dataStream.Read(sector, 0, sector.Length);
|
||||
|
||||
if(currentExtent.Type == "FLAT" || currentExtent.Type == "VMFS")
|
||||
{
|
||||
dataStream = currentExtent.Filter.GetDataForkStream();
|
||||
dataStream.Seek((long)((currentExtent.Offset + (sectorAddress - extentStartSector)) * SECTOR_SIZE),
|
||||
SeekOrigin.Begin);
|
||||
sector = new byte[SECTOR_SIZE];
|
||||
dataStream.Read(sector, 0, sector.Length);
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
if(sectorCache.Count >= maxCachedSectors) sectorCache.Clear();
|
||||
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
sectorCache.Add(sectorAddress, sector);
|
||||
return sector;
|
||||
}
|
||||
|
||||
ulong index = sectorAddress / grainSize;
|
||||
|
||||
@@ -123,70 +123,77 @@ namespace DiscImageChef.DiscImages
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
extension = Path.GetExtension(imageFilter.GetFilename()).ToLower();
|
||||
if(extension == ".iso" && imageFilter.GetDataForkLength() % 2048 == 0) ImageInfo.SectorSize = 2048;
|
||||
else if(extension == ".d81" && imageFilter.GetDataForkLength() == 819200) ImageInfo.SectorSize = 256;
|
||||
else if((extension == ".adf" || extension == ".adl" || extension == ".ssd" || extension == ".dsd") &&
|
||||
(imageFilter.GetDataForkLength() == 163840 || imageFilter.GetDataForkLength() == 327680 ||
|
||||
imageFilter.GetDataForkLength() == 655360)) ImageInfo.SectorSize = 256;
|
||||
else if((extension == ".adf" || extension == ".adl") && imageFilter.GetDataForkLength() == 819200)
|
||||
ImageInfo.SectorSize = 1024;
|
||||
else
|
||||
switch(imageFilter.GetDataForkLength())
|
||||
{
|
||||
case 242944:
|
||||
case 256256:
|
||||
case 495872:
|
||||
case 92160:
|
||||
case 133120:
|
||||
ImageInfo.SectorSize = 128;
|
||||
break;
|
||||
case 116480:
|
||||
case 287488: // T0S0 = 128bps
|
||||
case 988416: // T0S0 = 128bps
|
||||
case 995072: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1021696: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 232960:
|
||||
case 143360:
|
||||
case 286720:
|
||||
case 512512:
|
||||
case 102400:
|
||||
case 204800:
|
||||
case 655360:
|
||||
case 80384: // T0S0 = 128bps
|
||||
case 325632: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 653312: // T0S0 = 128bps, T0S1 = 256bps
|
||||
|
||||
#region Commodore
|
||||
case 174848:
|
||||
case 175531:
|
||||
case 196608:
|
||||
case 197376:
|
||||
case 349696:
|
||||
case 351062:
|
||||
case 822400:
|
||||
#endregion Commodore
|
||||
|
||||
ImageInfo.SectorSize = 256;
|
||||
break;
|
||||
case 81664:
|
||||
ImageInfo.SectorSize = 319;
|
||||
break;
|
||||
case 306432: // T0S0 = 128bps
|
||||
case 1146624: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1177344: // T0S0 = 128bps, T0S1 = 256bps
|
||||
ImageInfo.SectorSize = 512;
|
||||
break;
|
||||
case 1222400: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1304320: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1255168: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1261568:
|
||||
case 1638400:
|
||||
switch(extension) {
|
||||
case ".iso" when imageFilter.GetDataForkLength() % 2048 == 0: ImageInfo.SectorSize = 2048;
|
||||
break;
|
||||
case ".d81" when imageFilter.GetDataForkLength() == 819200: ImageInfo.SectorSize = 256;
|
||||
break;
|
||||
default:
|
||||
if((extension == ".adf" || extension == ".adl" || extension == ".ssd" || extension == ".dsd") &&
|
||||
(imageFilter.GetDataForkLength() == 163840 || imageFilter.GetDataForkLength() == 327680 ||
|
||||
imageFilter.GetDataForkLength() == 655360)) ImageInfo.SectorSize = 256;
|
||||
else if((extension == ".adf" || extension == ".adl") && imageFilter.GetDataForkLength() == 819200)
|
||||
ImageInfo.SectorSize = 1024;
|
||||
break;
|
||||
default:
|
||||
ImageInfo.SectorSize = 512;
|
||||
break;
|
||||
}
|
||||
else
|
||||
switch(imageFilter.GetDataForkLength())
|
||||
{
|
||||
case 242944:
|
||||
case 256256:
|
||||
case 495872:
|
||||
case 92160:
|
||||
case 133120:
|
||||
ImageInfo.SectorSize = 128;
|
||||
break;
|
||||
case 116480:
|
||||
case 287488: // T0S0 = 128bps
|
||||
case 988416: // T0S0 = 128bps
|
||||
case 995072: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1021696: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 232960:
|
||||
case 143360:
|
||||
case 286720:
|
||||
case 512512:
|
||||
case 102400:
|
||||
case 204800:
|
||||
case 655360:
|
||||
case 80384: // T0S0 = 128bps
|
||||
case 325632: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 653312: // T0S0 = 128bps, T0S1 = 256bps
|
||||
|
||||
#region Commodore
|
||||
case 174848:
|
||||
case 175531:
|
||||
case 196608:
|
||||
case 197376:
|
||||
case 349696:
|
||||
case 351062:
|
||||
case 822400:
|
||||
#endregion Commodore
|
||||
|
||||
ImageInfo.SectorSize = 256;
|
||||
break;
|
||||
case 81664:
|
||||
ImageInfo.SectorSize = 319;
|
||||
break;
|
||||
case 306432: // T0S0 = 128bps
|
||||
case 1146624: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1177344: // T0S0 = 128bps, T0S1 = 256bps
|
||||
ImageInfo.SectorSize = 512;
|
||||
break;
|
||||
case 1222400: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1304320: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1255168: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1261568:
|
||||
case 1638400:
|
||||
ImageInfo.SectorSize = 1024;
|
||||
break;
|
||||
default:
|
||||
ImageInfo.SectorSize = 512;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
ImageInfo.ImageSize = (ulong)imageFilter.GetDataForkLength();
|
||||
ImageInfo.ImageCreationTime = imageFilter.GetCreationTime();
|
||||
|
||||
Reference in New Issue
Block a user