Code cleanup.

This commit is contained in:
2018-06-22 08:08:38 +01:00
parent 82f474c7e3
commit 88da8fc019
581 changed files with 22423 additions and 20839 deletions

View File

@@ -42,8 +42,8 @@ namespace DiscImageChef.Filters
/// </summary>
public class AppleDouble : IFilter
{
const uint AppleDoubleMagic = 0x00051607;
const uint AppleDoubleVersion = 0x00010000;
const uint AppleDoubleMagic = 0x00051607;
const uint AppleDoubleVersion = 0x00010000;
const uint AppleDoubleVersion2 = 0x00020000;
readonly byte[] DOSHome =
{0x4D, 0x53, 0x2D, 0x44, 0x4F, 0x53, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
@@ -58,18 +58,18 @@ namespace DiscImageChef.Filters
{0x55, 0x6E, 0x69, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
readonly byte[] VMXHome =
{0x56, 0x41, 0x58, 0x20, 0x56, 0x4D, 0x53, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
string basePath;
string basePath;
DateTime creationTime;
AppleDoubleEntry dataFork;
AppleDoubleEntry dataFork;
AppleDoubleHeader header;
string headerPath;
DateTime lastWriteTime;
bool opened;
AppleDoubleEntry rsrcFork;
string headerPath;
DateTime lastWriteTime;
bool opened;
AppleDoubleEntry rsrcFork;
public string Name => "AppleDouble";
public Guid Id => new Guid("1B2165EE-C9DF-4B21-BBBB-9E5892B2DF4D");
public Guid Id => new Guid("1B2165EE-C9DF-4B21-BBBB-9E5892B2DF4D");
public void Close()
{
@@ -153,12 +153,13 @@ namespace DiscImageChef.Filters
public bool Identify(string path)
{
string filename = Path.GetFileName(path);
string filename = Path.GetFileName(path);
string filenameNoExt = Path.GetFileNameWithoutExtension(path);
string parentFolder = Path.GetDirectoryName(path);
string parentFolder = Path.GetDirectoryName(path);
// Prepend data fork name with "R."
string ProDosAppleDouble = Path.Combine(parentFolder ?? throw new InvalidOperationException(), "R." + filename);
string ProDosAppleDouble =
Path.Combine(parentFolder ?? throw new InvalidOperationException(), "R." + filename);
// Prepend data fork name with '%'
string UNIXAppleDouble = Path.Combine(parentFolder, "%" + filename);
// Change file extension to ADF
@@ -166,8 +167,8 @@ namespace DiscImageChef.Filters
// Change file extension to adf
string DOSAppleDoubleLower = Path.Combine(parentFolder, filenameNoExt + ".adf");
// Store AppleDouble header file in ".AppleDouble" folder with same name
string NetatalkAppleDouble = Path.Combine(parentFolder, ".AppleDouble",
filename ?? throw new InvalidOperationException());
string NetatalkAppleDouble =
Path.Combine(parentFolder, ".AppleDouble", filename ?? throw new InvalidOperationException());
// Store AppleDouble header file in "resource.frk" folder with same name
string DAVEAppleDouble = Path.Combine(parentFolder, "resource.frk", filename);
// Prepend data fork name with "._"
@@ -313,12 +314,13 @@ namespace DiscImageChef.Filters
public void Open(string path)
{
string filename = Path.GetFileName(path);
string filename = Path.GetFileName(path);
string filenameNoExt = Path.GetFileNameWithoutExtension(path);
string parentFolder = Path.GetDirectoryName(path);
string parentFolder = Path.GetDirectoryName(path);
// Prepend data fork name with "R."
string ProDosAppleDouble = Path.Combine(parentFolder ?? throw new InvalidOperationException(), "R." + filename);
string ProDosAppleDouble =
Path.Combine(parentFolder ?? throw new InvalidOperationException(), "R." + filename);
// Prepend data fork name with '%'
string UNIXAppleDouble = Path.Combine(parentFolder, "%" + filename);
// Change file extension to ADF
@@ -326,8 +328,8 @@ namespace DiscImageChef.Filters
// Change file extension to adf
string DOSAppleDoubleLower = Path.Combine(parentFolder, filenameNoExt + ".adf");
// Store AppleDouble header file in ".AppleDouble" folder with same name
string NetatalkAppleDouble = Path.Combine(parentFolder, ".AppleDouble",
filename ?? throw new InvalidOperationException());
string NetatalkAppleDouble =
Path.Combine(parentFolder, ".AppleDouble", filename ?? throw new InvalidOperationException());
// Store AppleDouble header file in "resource.frk" folder with same name
string DAVEAppleDouble = Path.Combine(parentFolder, "resource.frk", filename);
// Prepend data fork name with "._"
@@ -478,7 +480,7 @@ namespace DiscImageChef.Filters
entries[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDoubleEntry>(entry);
}
creationTime = DateTime.UtcNow;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
foreach(AppleDoubleEntry entry in entries)
switch((AppleDoubleEntryID)entry.id)
@@ -492,7 +494,7 @@ namespace DiscImageChef.Filters
fs.Read(dates_b, 0, 16);
AppleDoubleFileDates dates =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDoubleFileDates>(dates_b);
creationTime = DateHandlers.UnixUnsignedToDateTime(dates.creationDate);
creationTime = DateHandlers.UnixUnsignedToDateTime(dates.creationDate);
lastWriteTime = DateHandlers.UnixUnsignedToDateTime(dates.modificationDate);
break;
case AppleDoubleEntryID.FileInfo:
@@ -503,21 +505,21 @@ namespace DiscImageChef.Filters
{
AppleDoubleMacFileInfo macinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDoubleMacFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(macinfo.modificationDate);
}
else if(ProDOSHome.SequenceEqual(header.homeFilesystem))
{
AppleDoubleProDOSFileInfo prodosinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDoubleProDOSFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(prodosinfo.modificationDate);
}
else if(UNIXHome.SequenceEqual(header.homeFilesystem))
{
AppleDoubleUNIXFileInfo unixinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDoubleUNIXFileInfo>(finfo);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
lastWriteTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.modificationDate);
}
else if(DOSHome.SequenceEqual(header.homeFilesystem))
@@ -527,6 +529,7 @@ namespace DiscImageChef.Filters
lastWriteTime =
DateHandlers.DosToDateTime(dosinfo.modificationDate, dosinfo.modificationTime);
}
break;
case AppleDoubleEntryID.ResourceFork:
rsrcFork = entry;
@@ -542,28 +545,28 @@ namespace DiscImageChef.Filters
}
fs.Close();
opened = true;
opened = true;
basePath = path;
}
enum AppleDoubleEntryID : uint
{
Invalid = 0,
DataFork = 1,
ResourceFork = 2,
RealName = 3,
Comment = 4,
Icon = 5,
ColorIcon = 6,
FileInfo = 7,
FileDates = 8,
FinderInfo = 9,
MacFileInfo = 10,
Invalid = 0,
DataFork = 1,
ResourceFork = 2,
RealName = 3,
Comment = 4,
Icon = 5,
ColorIcon = 6,
FileInfo = 7,
FileDates = 8,
FinderInfo = 9,
MacFileInfo = 10,
ProDOSFileInfo = 11,
DOSFileInfo = 12,
ShortName = 13,
AFPFileInfo = 14,
DirectoryID = 15
DOSFileInfo = 12,
ShortName = 13,
AFPFileInfo = 14,
DirectoryID = 15
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -571,7 +574,8 @@ namespace DiscImageChef.Filters
{
public uint magic;
public uint version;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] homeFilesystem;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] homeFilesystem;
public ushort entries;
}
@@ -620,12 +624,12 @@ namespace DiscImageChef.Filters
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleDoubleProDOSFileInfo
{
public uint creationDate;
public uint modificationDate;
public uint backupDate;
public uint creationDate;
public uint modificationDate;
public uint backupDate;
public ushort access;
public ushort fileType;
public uint auxType;
public uint auxType;
}
}
}

View File

@@ -42,8 +42,8 @@ namespace DiscImageChef.Filters
/// </summary>
public class AppleSingle : IFilter
{
const uint AppleSingleMagic = 0x00051600;
const uint AppleSingleVersion = 0x00010000;
const uint AppleSingleMagic = 0x00051600;
const uint AppleSingleVersion = 0x00010000;
const uint AppleSingleVersion2 = 0x00020000;
readonly byte[] DOSHome =
{0x4D, 0x53, 0x2D, 0x44, 0x4F, 0x53, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
@@ -58,28 +58,28 @@ namespace DiscImageChef.Filters
{0x55, 0x6E, 0x69, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
readonly byte[] VMSHome =
{0x56, 0x41, 0x58, 0x20, 0x56, 0x4D, 0x53, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
string basePath;
byte[] bytes;
string basePath;
byte[] bytes;
DateTime creationTime;
AppleSingleEntry dataFork;
AppleSingleEntry dataFork;
AppleSingleHeader header;
bool isBytes, isStream, isPath, opened;
DateTime lastWriteTime;
AppleSingleEntry rsrcFork;
Stream stream;
bool isBytes, isStream, isPath, opened;
DateTime lastWriteTime;
AppleSingleEntry rsrcFork;
Stream stream;
public string Name => "AppleSingle";
public Guid Id => new Guid("A69B20E8-F4D3-42BB-BD2B-4A7263394A05");
public Guid Id => new Guid("A69B20E8-F4D3-42BB-BD2B-4A7263394A05");
public void Close()
{
bytes = null;
stream?.Close();
isBytes = false;
isBytes = false;
isStream = false;
isPath = false;
opened = false;
isPath = false;
opened = false;
}
public string GetBasePath()
@@ -101,7 +101,7 @@ namespace DiscImageChef.Filters
{
if(dataFork.length == 0) return null;
if(isBytes) return new OffsetStream(bytes, dataFork.offset, dataFork.offset + dataFork.length - 1);
if(isBytes) return new OffsetStream(bytes, dataFork.offset, dataFork.offset + dataFork.length - 1);
if(isStream) return new OffsetStream(stream, dataFork.offset, dataFork.offset + dataFork.length - 1);
if(isPath)
return new OffsetStream(basePath, FileMode.Open, FileAccess.Read, dataFork.offset,
@@ -144,7 +144,7 @@ namespace DiscImageChef.Filters
{
if(rsrcFork.length == 0) return null;
if(isBytes) return new OffsetStream(bytes, rsrcFork.offset, rsrcFork.offset + rsrcFork.length - 1);
if(isBytes) return new OffsetStream(bytes, rsrcFork.offset, rsrcFork.offset + rsrcFork.length - 1);
if(isStream) return new OffsetStream(stream, rsrcFork.offset, rsrcFork.offset + rsrcFork.length - 1);
if(isPath)
return new OffsetStream(basePath, FileMode.Open, FileAccess.Read, rsrcFork.offset,
@@ -219,7 +219,7 @@ namespace DiscImageChef.Filters
entries[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleEntry>(entry);
}
creationTime = DateTime.UtcNow;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
foreach(AppleSingleEntry entry in entries)
switch((AppleSingleEntryID)entry.id)
@@ -233,7 +233,7 @@ namespace DiscImageChef.Filters
ms.Read(dates_b, 0, 16);
AppleSingleFileDates dates =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleFileDates>(dates_b);
creationTime = DateHandlers.UnixUnsignedToDateTime(dates.creationDate);
creationTime = DateHandlers.UnixUnsignedToDateTime(dates.creationDate);
lastWriteTime = DateHandlers.UnixUnsignedToDateTime(dates.modificationDate);
break;
case AppleSingleEntryID.FileInfo:
@@ -244,21 +244,21 @@ namespace DiscImageChef.Filters
{
AppleSingleMacFileInfo macinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleMacFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(macinfo.modificationDate);
}
else if(ProDOSHome.SequenceEqual(header.homeFilesystem))
{
AppleSingleProDOSFileInfo prodosinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleProDOSFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(prodosinfo.modificationDate);
}
else if(UNIXHome.SequenceEqual(header.homeFilesystem))
{
AppleSingleUNIXFileInfo unixinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleUNIXFileInfo>(finfo);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
lastWriteTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.modificationDate);
}
else if(DOSHome.SequenceEqual(header.homeFilesystem))
@@ -268,6 +268,7 @@ namespace DiscImageChef.Filters
lastWriteTime =
DateHandlers.DosToDateTime(dosinfo.modificationDate, dosinfo.modificationTime);
}
break;
case AppleSingleEntryID.ResourceFork:
rsrcFork = entry;
@@ -275,9 +276,9 @@ namespace DiscImageChef.Filters
}
ms.Close();
opened = true;
opened = true;
isBytes = true;
bytes = buffer;
bytes = buffer;
}
public void Open(Stream stream)
@@ -296,7 +297,7 @@ namespace DiscImageChef.Filters
entries[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleEntry>(entry);
}
creationTime = DateTime.UtcNow;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
foreach(AppleSingleEntry entry in entries)
switch((AppleSingleEntryID)entry.id)
@@ -310,7 +311,7 @@ namespace DiscImageChef.Filters
stream.Read(dates_b, 0, 16);
AppleSingleFileDates dates =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleFileDates>(dates_b);
creationTime = DateHandlers.MacToDateTime(dates.creationDate);
creationTime = DateHandlers.MacToDateTime(dates.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(dates.modificationDate);
break;
case AppleSingleEntryID.FileInfo:
@@ -321,21 +322,21 @@ namespace DiscImageChef.Filters
{
AppleSingleMacFileInfo macinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleMacFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(macinfo.modificationDate);
}
else if(ProDOSHome.SequenceEqual(header.homeFilesystem))
{
AppleSingleProDOSFileInfo prodosinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleProDOSFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(prodosinfo.modificationDate);
}
else if(UNIXHome.SequenceEqual(header.homeFilesystem))
{
AppleSingleUNIXFileInfo unixinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleUNIXFileInfo>(finfo);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
lastWriteTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.modificationDate);
}
else if(DOSHome.SequenceEqual(header.homeFilesystem))
@@ -345,6 +346,7 @@ namespace DiscImageChef.Filters
lastWriteTime =
DateHandlers.DosToDateTime(dosinfo.modificationDate, dosinfo.modificationTime);
}
break;
case AppleSingleEntryID.ResourceFork:
rsrcFork = entry;
@@ -352,8 +354,8 @@ namespace DiscImageChef.Filters
}
stream.Seek(0, SeekOrigin.Begin);
opened = true;
isStream = true;
opened = true;
isStream = true;
this.stream = stream;
}
@@ -374,7 +376,7 @@ namespace DiscImageChef.Filters
entries[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleEntry>(entry);
}
creationTime = DateTime.UtcNow;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
foreach(AppleSingleEntry entry in entries)
switch((AppleSingleEntryID)entry.id)
@@ -388,7 +390,7 @@ namespace DiscImageChef.Filters
fs.Read(dates_b, 0, 16);
AppleSingleFileDates dates =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleFileDates>(dates_b);
creationTime = DateHandlers.MacToDateTime(dates.creationDate);
creationTime = DateHandlers.MacToDateTime(dates.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(dates.modificationDate);
break;
case AppleSingleEntryID.FileInfo:
@@ -399,21 +401,21 @@ namespace DiscImageChef.Filters
{
AppleSingleMacFileInfo macinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleMacFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(macinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(macinfo.modificationDate);
}
else if(ProDOSHome.SequenceEqual(header.homeFilesystem))
{
AppleSingleProDOSFileInfo prodosinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleProDOSFileInfo>(finfo);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
creationTime = DateHandlers.MacToDateTime(prodosinfo.creationDate);
lastWriteTime = DateHandlers.MacToDateTime(prodosinfo.modificationDate);
}
else if(UNIXHome.SequenceEqual(header.homeFilesystem))
{
AppleSingleUNIXFileInfo unixinfo =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleSingleUNIXFileInfo>(finfo);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
creationTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.creationDate);
lastWriteTime = DateHandlers.UnixUnsignedToDateTime(unixinfo.modificationDate);
}
else if(DOSHome.SequenceEqual(header.homeFilesystem))
@@ -423,6 +425,7 @@ namespace DiscImageChef.Filters
lastWriteTime =
DateHandlers.DosToDateTime(dosinfo.modificationDate, dosinfo.modificationTime);
}
break;
case AppleSingleEntryID.ResourceFork:
rsrcFork = entry;
@@ -430,29 +433,29 @@ namespace DiscImageChef.Filters
}
fs.Close();
opened = true;
isPath = true;
opened = true;
isPath = true;
basePath = path;
}
enum AppleSingleEntryID : uint
{
Invalid = 0,
DataFork = 1,
ResourceFork = 2,
RealName = 3,
Comment = 4,
Icon = 5,
ColorIcon = 6,
FileInfo = 7,
FileDates = 8,
FinderInfo = 9,
MacFileInfo = 10,
Invalid = 0,
DataFork = 1,
ResourceFork = 2,
RealName = 3,
Comment = 4,
Icon = 5,
ColorIcon = 6,
FileInfo = 7,
FileDates = 8,
FinderInfo = 9,
MacFileInfo = 10,
ProDOSFileInfo = 11,
DOSFileInfo = 12,
ShortName = 13,
AFPFileInfo = 14,
DirectoryID = 15
DOSFileInfo = 12,
ShortName = 13,
AFPFileInfo = 14,
DirectoryID = 15
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -460,7 +463,8 @@ namespace DiscImageChef.Filters
{
public uint magic;
public uint version;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] homeFilesystem;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] homeFilesystem;
public ushort entries;
}
@@ -509,12 +513,12 @@ namespace DiscImageChef.Filters
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleSingleProDOSFileInfo
{
public uint creationDate;
public uint modificationDate;
public uint backupDate;
public uint creationDate;
public uint modificationDate;
public uint backupDate;
public ushort access;
public ushort fileType;
public uint auxType;
public uint auxType;
}
}
}

View File

@@ -42,23 +42,23 @@ namespace DiscImageChef.Filters
/// </summary>
public class BZip2 : IFilter
{
string basePath;
string basePath;
DateTime creationTime;
Stream dataStream;
long decompressedSize;
Stream innerStream;
Stream dataStream;
long decompressedSize;
Stream innerStream;
DateTime lastWriteTime;
bool opened;
bool opened;
public string Name => "BZip2";
public Guid Id => new Guid("FCCFB0C3-32EF-40D8-9714-2333F6AC72A9");
public Guid Id => new Guid("FCCFB0C3-32EF-40D8-9714-2333F6AC72A9");
public void Close()
{
dataStream?.Close();
dataStream = null;
basePath = null;
opened = false;
basePath = null;
opened = false;
}
public string GetBasePath()
@@ -122,7 +122,7 @@ namespace DiscImageChef.Filters
if(!File.Exists(path)) return false;
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4];
byte[] buffer = new byte[4];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(buffer, 0, 4);
@@ -142,37 +142,37 @@ namespace DiscImageChef.Filters
public void Open(byte[] buffer)
{
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
innerStream = new ForcedSeekStream<BZip2Stream>(dataStream, CompressionMode.Decompress, false, false);
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
innerStream = new ForcedSeekStream<BZip2Stream>(dataStream, CompressionMode.Decompress, false, false);
decompressedSize = innerStream.Length;
opened = true;
opened = true;
}
public void Open(Stream stream)
{
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
innerStream = new ForcedSeekStream<BZip2Stream>(dataStream, CompressionMode.Decompress, false, false);
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
innerStream = new ForcedSeekStream<BZip2Stream>(dataStream, CompressionMode.Decompress, false, false);
decompressedSize = innerStream.Length;
opened = true;
opened = true;
}
public void Open(string path)
{
dataStream = new FileStream(path, FileMode.Open, FileAccess.Read);
basePath = Path.GetFullPath(path);
basePath = Path.GetFullPath(path);
FileInfo fi = new FileInfo(path);
creationTime = fi.CreationTimeUtc;
lastWriteTime = fi.LastWriteTimeUtc;
innerStream = new ForcedSeekStream<BZip2Stream>(dataStream, CompressionMode.Decompress, false, false);
creationTime = fi.CreationTimeUtc;
lastWriteTime = fi.LastWriteTimeUtc;
innerStream = new ForcedSeekStream<BZip2Stream>(dataStream, CompressionMode.Decompress, false, false);
decompressedSize = innerStream.Length;
opened = true;
opened = true;
}
public DateTime GetCreationTime()

View File

@@ -49,7 +49,7 @@ namespace DiscImageChef.Filters
public FiltersList()
{
Assembly assembly = Assembly.GetAssembly(typeof(IFilter));
Filters = new SortedDictionary<string, IFilter>();
Filters = new SortedDictionary<string, IFilter>();
foreach(Type type in assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IFilter))))
try

View File

@@ -41,11 +41,11 @@ namespace DiscImageChef.Filters
/// </summary>
public class ForcedSeekStream<T> : Stream where T : Stream
{
const int BUFFER_LEN = 1048576;
string backFile;
const int BUFFER_LEN = 1048576;
string backFile;
FileStream backStream;
T baseStream;
long streamLength;
T baseStream;
long streamLength;
/// <summary>
/// Initializes a new instance of the <see cref="T:DiscImageChef.Filters.ForcedSeekStream`1" /> class.
@@ -55,9 +55,9 @@ namespace DiscImageChef.Filters
public ForcedSeekStream(long length, params object[] args)
{
streamLength = length;
baseStream = (T)Activator.CreateInstance(typeof(T), args);
backFile = Path.GetTempFileName();
backStream = new FileStream(backFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
baseStream = (T)Activator.CreateInstance(typeof(T), args);
backFile = Path.GetTempFileName();
backStream = new FileStream(backFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
if(length == 0) CalculateLength();
}
@@ -68,7 +68,7 @@ namespace DiscImageChef.Filters
public ForcedSeekStream(params object[] args)
{
baseStream = (T)Activator.CreateInstance(typeof(T), args);
backFile = Path.GetTempFileName();
backFile = Path.GetTempFileName();
backStream = new FileStream(backFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
CalculateLength();
}
@@ -105,7 +105,7 @@ namespace DiscImageChef.Filters
}
while(read == BUFFER_LEN);
streamLength = backStream.Length;
streamLength = backStream.Length;
backStream.Position = 0;
}
@@ -120,9 +120,9 @@ namespace DiscImageChef.Filters
}
backStream.Position = backStream.Length;
long toposition = position - backStream.Position;
int fullBufferReads = (int)(toposition / BUFFER_LEN);
int restToRead = (int)(toposition % BUFFER_LEN);
long toposition = position - backStream.Position;
int fullBufferReads = (int)(toposition / BUFFER_LEN);
int restToRead = (int)(toposition % BUFFER_LEN);
byte[] buffer;
for(int i = 0; i < fullBufferReads; i++)

View File

@@ -41,23 +41,23 @@ namespace DiscImageChef.Filters
/// </summary>
public class GZip : IFilter
{
string basePath;
string basePath;
DateTime creationTime;
Stream dataStream;
uint decompressedSize;
Stream dataStream;
uint decompressedSize;
DateTime lastWriteTime;
bool opened;
Stream zStream;
bool opened;
Stream zStream;
public string Name => "GZip";
public Guid Id => new Guid("F4996661-4A29-42C9-A2C7-3904EF40F3B0");
public Guid Id => new Guid("F4996661-4A29-42C9-A2C7-3904EF40F3B0");
public void Close()
{
dataStream?.Close();
dataStream = null;
basePath = null;
opened = false;
basePath = null;
opened = false;
}
public string GetBasePath()
@@ -106,7 +106,7 @@ namespace DiscImageChef.Filters
if(!File.Exists(path)) return false;
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[3];
byte[] buffer = new byte[3];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(buffer, 0, 3);
@@ -121,7 +121,7 @@ namespace DiscImageChef.Filters
byte[] isize_b = new byte[4];
dataStream = new MemoryStream(buffer);
basePath = null;
basePath = null;
dataStream.Seek(4, SeekOrigin.Begin);
dataStream.Read(mtime_b, 0, 4);
@@ -133,9 +133,10 @@ namespace DiscImageChef.Filters
uint isize = BitConverter.ToUInt32(isize_b, 0);
decompressedSize = isize;
creationTime = DateHandlers.UnixUnsignedToDateTime(mtime);
lastWriteTime = creationTime;
zStream = new ForcedSeekStream<GZipStream>(decompressedSize, dataStream, CompressionMode.Decompress);
creationTime = DateHandlers.UnixUnsignedToDateTime(mtime);
lastWriteTime = creationTime;
zStream =
new ForcedSeekStream<GZipStream>(decompressedSize, dataStream, CompressionMode.Decompress);
opened = true;
}
@@ -145,7 +146,7 @@ namespace DiscImageChef.Filters
byte[] isize_b = new byte[4];
dataStream = stream;
basePath = null;
basePath = null;
dataStream.Seek(4, SeekOrigin.Begin);
dataStream.Read(mtime_b, 0, 4);
@@ -157,9 +158,10 @@ namespace DiscImageChef.Filters
uint isize = BitConverter.ToUInt32(isize_b, 0);
decompressedSize = isize;
creationTime = DateHandlers.UnixUnsignedToDateTime(mtime);
lastWriteTime = creationTime;
zStream = new ForcedSeekStream<GZipStream>(decompressedSize, dataStream, CompressionMode.Decompress);
creationTime = DateHandlers.UnixUnsignedToDateTime(mtime);
lastWriteTime = creationTime;
zStream =
new ForcedSeekStream<GZipStream>(decompressedSize, dataStream, CompressionMode.Decompress);
opened = true;
}
@@ -169,7 +171,7 @@ namespace DiscImageChef.Filters
byte[] isize_b = new byte[4];
dataStream = new FileStream(path, FileMode.Open, FileAccess.Read);
basePath = Path.GetFullPath(path);
basePath = Path.GetFullPath(path);
dataStream.Seek(4, SeekOrigin.Begin);
dataStream.Read(mtime_b, 0, 4);
@@ -182,10 +184,10 @@ namespace DiscImageChef.Filters
decompressedSize = isize;
FileInfo fi = new FileInfo(path);
creationTime = fi.CreationTimeUtc;
creationTime = fi.CreationTimeUtc;
lastWriteTime = DateHandlers.UnixUnsignedToDateTime(mtime);
zStream = new ForcedSeekStream<GZipStream>(decompressedSize, dataStream, CompressionMode.Decompress);
opened = true;
zStream = new ForcedSeekStream<GZipStream>(decompressedSize, dataStream, CompressionMode.Decompress);
opened = true;
}
public DateTime GetCreationTime()

View File

@@ -42,23 +42,23 @@ namespace DiscImageChef.Filters
/// </summary>
public class LZip : IFilter
{
string basePath;
string basePath;
DateTime creationTime;
Stream dataStream;
long decompressedSize;
Stream innerStream;
Stream dataStream;
long decompressedSize;
Stream innerStream;
DateTime lastWriteTime;
bool opened;
bool opened;
public string Name => "LZip";
public Guid Id => new Guid("09D715E9-20C0-48B1-A8D9-D8897CEC57C9");
public Guid Id => new Guid("09D715E9-20C0-48B1-A8D9-D8897CEC57C9");
public void Close()
{
dataStream?.Close();
dataStream = null;
basePath = null;
opened = false;
basePath = null;
opened = false;
}
public string GetBasePath()
@@ -109,7 +109,7 @@ namespace DiscImageChef.Filters
if(!File.Exists(path)) return false;
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[5];
byte[] buffer = new byte[5];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(buffer, 0, 5);
@@ -121,10 +121,10 @@ namespace DiscImageChef.Filters
public void Open(byte[] buffer)
{
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
decompressedSize = BitConverter.ToInt64(buffer, buffer.Length - 16);
innerStream =
new ForcedSeekStream<LZipStream>(decompressedSize, dataStream, CompressionMode.Decompress, false);
@@ -133,9 +133,9 @@ namespace DiscImageChef.Filters
public void Open(Stream stream)
{
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
byte[] tmp = new byte[8];
dataStream.Seek(-16, SeekOrigin.End);
@@ -150,10 +150,10 @@ namespace DiscImageChef.Filters
public void Open(string path)
{
dataStream = new FileStream(path, FileMode.Open, FileAccess.Read);
basePath = Path.GetFullPath(path);
basePath = Path.GetFullPath(path);
FileInfo fi = new FileInfo(path);
creationTime = fi.CreationTimeUtc;
creationTime = fi.CreationTimeUtc;
lastWriteTime = fi.LastWriteTimeUtc;
byte[] tmp = new byte[8];
dataStream.Seek(-16, SeekOrigin.End);

View File

@@ -44,29 +44,29 @@ namespace DiscImageChef.Filters
public class MacBinary : IFilter
{
const uint MACBINARY_MAGIC = 0x6D42494E;
string basePath;
byte[] bytes;
DateTime creationTime;
string basePath;
byte[] bytes;
DateTime creationTime;
long dataForkOff;
string filename;
long dataForkOff;
string filename;
MacBinaryHeader header;
bool isBytes, isStream, isPath, opened;
DateTime lastWriteTime;
long rsrcForkOff;
Stream stream;
bool isBytes, isStream, isPath, opened;
DateTime lastWriteTime;
long rsrcForkOff;
Stream stream;
public string Name => "MacBinary";
public Guid Id => new Guid("D7C321D3-E51F-45DF-A150-F6BFDF0D7704");
public Guid Id => new Guid("D7C321D3-E51F-45DF-A150-F6BFDF0D7704");
public void Close()
{
bytes = null;
stream?.Close();
isBytes = false;
isBytes = false;
isStream = false;
isPath = false;
opened = false;
isPath = false;
opened = false;
}
public string GetBasePath()
@@ -88,7 +88,7 @@ namespace DiscImageChef.Filters
{
if(header.dataLength == 0) return null;
if(isBytes) return new OffsetStream(bytes, dataForkOff, dataForkOff + header.dataLength - 1);
if(isBytes) return new OffsetStream(bytes, dataForkOff, dataForkOff + header.dataLength - 1);
if(isStream) return new OffsetStream(stream, dataForkOff, dataForkOff + header.dataLength - 1);
if(isPath)
return new OffsetStream(basePath, FileMode.Open, FileAccess.Read, dataForkOff,
@@ -131,7 +131,7 @@ namespace DiscImageChef.Filters
{
if(header.resourceLength == 0) return null;
if(isBytes) return new OffsetStream(bytes, rsrcForkOff, rsrcForkOff + header.resourceLength - 1);
if(isBytes) return new OffsetStream(bytes, rsrcForkOff, rsrcForkOff + header.resourceLength - 1);
if(isStream) return new OffsetStream(stream, rsrcForkOff, rsrcForkOff + header.resourceLength - 1);
if(isPath)
return new OffsetStream(basePath, FileMode.Open, FileAccess.Read, rsrcForkOff,
@@ -153,8 +153,9 @@ namespace DiscImageChef.Filters
Array.Copy(buffer, 0, hdr_b, 0, 128);
header = BigEndianMarshal.ByteArrayToStructureBigEndian<MacBinaryHeader>(hdr_b);
return header.magic == MACBINARY_MAGIC || header.version == 0 && header.filename[0] > 0 &&
header.filename[0] < 64 && header.zero1 == 0 && header.zero2 == 0 && header.reserved == 0 &&
return header.magic == MACBINARY_MAGIC || header.version == 0 && header.filename[0] > 0 &&
header.filename[0] < 64 && header.zero1 == 0 &&
header.zero2 == 0 && header.reserved == 0 &&
(header.dataLength > 0 || header.resourceLength > 0);
}
@@ -167,8 +168,9 @@ namespace DiscImageChef.Filters
stream.Read(hdr_b, 0, 128);
header = BigEndianMarshal.ByteArrayToStructureBigEndian<MacBinaryHeader>(hdr_b);
return header.magic == MACBINARY_MAGIC || header.version == 0 && header.filename[0] > 0 &&
header.filename[0] < 64 && header.zero1 == 0 && header.zero2 == 0 && header.reserved == 0 &&
return header.magic == MACBINARY_MAGIC || header.version == 0 && header.filename[0] > 0 &&
header.filename[0] < 64 && header.zero1 == 0 &&
header.zero2 == 0 && header.reserved == 0 &&
(header.dataLength > 0 || header.resourceLength > 0);
}
@@ -182,8 +184,9 @@ namespace DiscImageChef.Filters
header = BigEndianMarshal.ByteArrayToStructureBigEndian<MacBinaryHeader>(hdr_b);
fstream.Close();
return header.magic == MACBINARY_MAGIC || header.version == 0 && header.filename[0] > 0 &&
header.filename[0] < 64 && header.zero1 == 0 && header.zero2 == 0 && header.reserved == 0 &&
return header.magic == MACBINARY_MAGIC || header.version == 0 && header.filename[0] > 0 &&
header.filename[0] < 64 && header.zero1 == 0 &&
header.zero2 == 0 && header.reserved == 0 &&
(header.dataLength > 0 || header.resourceLength > 0);
}
@@ -203,20 +206,20 @@ namespace DiscImageChef.Filters
uint blocks = 1;
blocks += (uint)(header.secondaryHeaderLength / 128);
if(header.secondaryHeaderLength % 128 > 0) blocks++;
dataForkOff = blocks * 128;
blocks += header.dataLength / 128;
if(header.dataLength % 128 > 0) blocks++;
rsrcForkOff = blocks * 128;
if(header.secondaryHeaderLength % 128 > 0) blocks++;
dataForkOff = blocks * 128;
blocks += header.dataLength / 128;
if(header.dataLength % 128 > 0) blocks++;
rsrcForkOff = blocks * 128;
filename = StringHandlers.PascalToString(header.filename, Encoding.GetEncoding("macintosh"));
creationTime = DateHandlers.MacToDateTime(header.creationTime);
filename = StringHandlers.PascalToString(header.filename, Encoding.GetEncoding("macintosh"));
creationTime = DateHandlers.MacToDateTime(header.creationTime);
lastWriteTime = DateHandlers.MacToDateTime(header.modificationTime);
ms.Close();
opened = true;
opened = true;
isBytes = true;
bytes = buffer;
bytes = buffer;
}
public void Open(Stream stream)
@@ -229,19 +232,19 @@ namespace DiscImageChef.Filters
uint blocks = 1;
blocks += (uint)(header.secondaryHeaderLength / 128);
if(header.secondaryHeaderLength % 128 > 0) blocks++;
dataForkOff = blocks * 128;
blocks += header.dataLength / 128;
if(header.dataLength % 128 > 0) blocks++;
rsrcForkOff = blocks * 128;
if(header.secondaryHeaderLength % 128 > 0) blocks++;
dataForkOff = blocks * 128;
blocks += header.dataLength / 128;
if(header.dataLength % 128 > 0) blocks++;
rsrcForkOff = blocks * 128;
filename = StringHandlers.PascalToString(header.filename, Encoding.GetEncoding("macintosh"));
creationTime = DateHandlers.MacToDateTime(header.creationTime);
filename = StringHandlers.PascalToString(header.filename, Encoding.GetEncoding("macintosh"));
creationTime = DateHandlers.MacToDateTime(header.creationTime);
lastWriteTime = DateHandlers.MacToDateTime(header.modificationTime);
stream.Seek(0, SeekOrigin.Begin);
opened = true;
isStream = true;
opened = true;
isStream = true;
this.stream = stream;
}
@@ -256,19 +259,19 @@ namespace DiscImageChef.Filters
uint blocks = 1;
blocks += (uint)(header.secondaryHeaderLength / 128);
if(header.secondaryHeaderLength % 128 > 0) blocks++;
dataForkOff = blocks * 128;
blocks += header.dataLength / 128;
if(header.dataLength % 128 > 0) blocks++;
rsrcForkOff = blocks * 128;
if(header.secondaryHeaderLength % 128 > 0) blocks++;
dataForkOff = blocks * 128;
blocks += header.dataLength / 128;
if(header.dataLength % 128 > 0) blocks++;
rsrcForkOff = blocks * 128;
filename = StringHandlers.PascalToString(header.filename, Encoding.GetEncoding("macintosh"));
creationTime = DateHandlers.MacToDateTime(header.creationTime);
filename = StringHandlers.PascalToString(header.filename, Encoding.GetEncoding("macintosh"));
creationTime = DateHandlers.MacToDateTime(header.creationTime);
lastWriteTime = DateHandlers.MacToDateTime(header.modificationTime);
fs.Close();
opened = true;
isPath = true;
opened = true;
isPath = true;
basePath = path;
}
@@ -282,7 +285,8 @@ namespace DiscImageChef.Filters
/// <summary>
/// 0x01, Str63 Pascal filename
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] filename;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] filename;
/// <summary>
/// 0x41, File type
/// </summary>

View File

@@ -43,8 +43,8 @@ namespace DiscImageChef.Filters
public class OffsetStream : Stream
{
readonly Stream baseStream;
readonly long streamEnd;
readonly long streamStart;
readonly long streamEnd;
readonly long streamStart;
public OffsetStream(Stream stream, long start, long end)
{
@@ -53,22 +53,22 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = stream;
if(end > baseStream.Length) throw new ArgumentOutOfRangeException(nameof(end), "End is after stream end.");
}
public OffsetStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize,
FileOptions options, long start, long end)
public OffsetStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize,
FileOptions options, long start, long end)
{
if(start < 0) throw new ArgumentOutOfRangeException(nameof(start), "Start can't be a negative number.");
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode, access, share, bufferSize, options);
@@ -82,7 +82,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(handle, access);
@@ -96,7 +96,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(handle, access, bufferSize);
@@ -104,21 +104,22 @@ namespace DiscImageChef.Filters
}
public OffsetStream(SafeFileHandle handle, FileAccess access, int bufferSize, bool isAsync, long start,
long end)
long end)
{
if(start < 0) throw new ArgumentOutOfRangeException(nameof(start), "Start can't be a negative number.");
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(handle, access, bufferSize, isAsync);
if(end > baseStream.Length) throw new ArgumentOutOfRangeException(nameof(end), "End is after stream end.");
}
public OffsetStream(string path, FileMode mode, FileSystemRights rights, FileShare share, int bufferSize,
public OffsetStream(string path, FileMode mode, FileSystemRights rights, FileShare share,
int bufferSize,
FileOptions options, long start, long end)
{
if(start < 0) throw new ArgumentOutOfRangeException(nameof(start), "Start can't be a negative number.");
@@ -126,14 +127,15 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode, rights, share, bufferSize, options);
if(end > baseStream.Length) throw new ArgumentOutOfRangeException(nameof(end), "End is after stream end.");
}
public OffsetStream(string path, FileMode mode, FileSystemRights rights, FileShare share, int bufferSize,
public OffsetStream(string path, FileMode mode, FileSystemRights rights, FileShare share,
int bufferSize,
FileOptions options, FileSecurity fileSecurity, long start, long end)
{
if(start < 0) throw new ArgumentOutOfRangeException(nameof(start), "Start can't be a negative number.");
@@ -141,22 +143,22 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode, rights, share, bufferSize, options, fileSecurity);
if(end > baseStream.Length) throw new ArgumentOutOfRangeException(nameof(end), "End is after stream end.");
}
public OffsetStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize,
bool useAsync, long start, long end)
public OffsetStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize,
bool useAsync, long start, long end)
{
if(start < 0) throw new ArgumentOutOfRangeException(nameof(start), "Start can't be a negative number.");
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode, access, share, bufferSize, useAsync);
@@ -164,14 +166,14 @@ namespace DiscImageChef.Filters
}
public OffsetStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, long start,
long end)
long end)
{
if(start < 0) throw new ArgumentOutOfRangeException(nameof(start), "Start can't be a negative number.");
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode, access, share, bufferSize);
@@ -185,7 +187,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode, access, share);
@@ -199,7 +201,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode, access);
@@ -213,7 +215,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new FileStream(path, mode);
@@ -221,14 +223,14 @@ namespace DiscImageChef.Filters
}
public OffsetStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible, long start,
long end)
long end)
{
if(start < 0) throw new ArgumentOutOfRangeException(nameof(start), "Start can't be a negative number.");
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new MemoryStream(buffer, index, count, writable, publiclyVisible);
@@ -242,7 +244,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new MemoryStream(buffer, index, count, writable);
@@ -256,7 +258,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new MemoryStream(buffer, index, count);
@@ -270,7 +272,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new MemoryStream(buffer, writable);
@@ -284,7 +286,7 @@ namespace DiscImageChef.Filters
if(end < 0) throw new ArgumentOutOfRangeException(nameof(end), "End can't be a negative number.");
streamStart = start;
streamEnd = end;
streamEnd = end;
baseStream = new MemoryStream(buffer);

View File

@@ -44,21 +44,21 @@ namespace DiscImageChef.Filters
/// </summary>
public class PCExchange : IFilter
{
const string FILE_ID = "FILEID.DAT";
const string FILE_ID = "FILEID.DAT";
const string FINDER_INFO = "FINDER.DAT";
const string RESOURCES = "RESOURCE.FRK";
string basePath;
DateTime creationTime;
long dataLen;
string dataPath;
DateTime lastWriteTime;
const string RESOURCES = "RESOURCE.FRK";
string basePath;
DateTime creationTime;
long dataLen;
string dataPath;
DateTime lastWriteTime;
bool opened;
long rsrcLen;
bool opened;
long rsrcLen;
string rsrcPath;
public string Name => "PCExchange";
public Guid Id => new Guid("9264EB9F-D634-4F9B-BE12-C24CD44988C6");
public Guid Id => new Guid("9264EB9F-D634-4F9B-BE12-C24CD44988C6");
public void Close()
{
@@ -155,16 +155,17 @@ namespace DiscImageChef.Filters
while(finderDatStream.Position + 0x5C <= finderDatStream.Length)
{
PCExchangeEntry datEntry = new PCExchangeEntry();
byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)];
PCExchangeEntry datEntry = new PCExchangeEntry();
byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)];
finderDatStream.Read(datEntry_b, 0, Marshal.SizeOf(datEntry));
datEntry = BigEndianMarshal.ByteArrayToStructureBigEndian<PCExchangeEntry>(datEntry_b);
// TODO: Add support for encoding on filters
string macName = StringHandlers.PascalToString(datEntry.macName, Encoding.GetEncoding("macintosh"));
string macName =
StringHandlers.PascalToString(datEntry.macName, Encoding.GetEncoding("macintosh"));
byte[] tmpDosName_b = new byte[8];
byte[] tmpDosExt_b = new byte[3];
byte[] tmpDosExt_b = new byte[3];
Array.Copy(datEntry.dosName, 0, tmpDosName_b, 0, 8);
Array.Copy(datEntry.dosName, 8, tmpDosExt_b, 0, 3);
Array.Copy(datEntry.dosName, 8, tmpDosExt_b, 0, 3);
string dosName = Encoding.ASCII.GetString(tmpDosName_b).Trim() + "." +
Encoding.ASCII.GetString(tmpDosExt_b).Trim();
string dosNameLow = dosName.ToLower(CultureInfo.CurrentCulture);
@@ -173,7 +174,7 @@ namespace DiscImageChef.Filters
dataFound |=
File.Exists(Path.Combine(parentFolder, macName ?? throw new InvalidOperationException())) ||
File.Exists(Path.Combine(parentFolder, dosName)) ||
File.Exists(Path.Combine(parentFolder, dosName)) ||
File.Exists(Path.Combine(parentFolder, dosNameLow));
rsrcFound |= File.Exists(Path.Combine(parentFolder, RESOURCES, dosName)) ||
@@ -213,15 +214,16 @@ namespace DiscImageChef.Filters
while(finderDatStream.Position + 0x5C <= finderDatStream.Length)
{
PCExchangeEntry datEntry = new PCExchangeEntry();
byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)];
PCExchangeEntry datEntry = new PCExchangeEntry();
byte[] datEntry_b = new byte[Marshal.SizeOf(datEntry)];
finderDatStream.Read(datEntry_b, 0, Marshal.SizeOf(datEntry));
datEntry = BigEndianMarshal.ByteArrayToStructureBigEndian<PCExchangeEntry>(datEntry_b);
string macName = StringHandlers.PascalToString(datEntry.macName, Encoding.GetEncoding("macintosh"));
string macName =
StringHandlers.PascalToString(datEntry.macName, Encoding.GetEncoding("macintosh"));
byte[] tmpDosName_b = new byte[8];
byte[] tmpDosExt_b = new byte[3];
byte[] tmpDosExt_b = new byte[3];
Array.Copy(datEntry.dosName, 0, tmpDosName_b, 0, 8);
Array.Copy(datEntry.dosName, 8, tmpDosExt_b, 0, 3);
Array.Copy(datEntry.dosName, 8, tmpDosExt_b, 0, 3);
string dosName = Encoding.ASCII.GetString(tmpDosName_b).Trim() + "." +
Encoding.ASCII.GetString(tmpDosExt_b).Trim();
string dosNameLow = dosName.ToLower(CultureInfo.CurrentCulture);
@@ -233,17 +235,17 @@ namespace DiscImageChef.Filters
else if(File.Exists(Path.Combine(parentFolder, dosName)))
dataPath = Path.Combine(parentFolder, dosName);
else if(File.Exists(Path.Combine(parentFolder, dosNameLow)))
dataPath = Path.Combine(parentFolder, dosNameLow);
dataPath = Path.Combine(parentFolder, dosNameLow);
else dataPath = null;
if(File.Exists(Path.Combine(parentFolder, RESOURCES, dosName)))
rsrcPath = Path.Combine(parentFolder, RESOURCES, dosName);
else if(File.Exists(Path.Combine(parentFolder, RESOURCES, dosNameLow)))
rsrcPath = Path.Combine(parentFolder, RESOURCES, dosNameLow);
rsrcPath = Path.Combine(parentFolder, RESOURCES, dosNameLow);
else rsrcPath = null;
lastWriteTime = DateHandlers.MacToDateTime(datEntry.modificationDate);
creationTime = DateHandlers.MacToDateTime(datEntry.creationDate);
creationTime = DateHandlers.MacToDateTime(datEntry.creationDate);
break;
}
@@ -252,7 +254,7 @@ namespace DiscImageChef.Filters
rsrcLen = new FileInfo(rsrcPath ?? throw new InvalidOperationException()).Length;
basePath = path;
opened = true;
opened = true;
finderDatStream.Close();
}
@@ -264,7 +266,8 @@ namespace DiscImageChef.Filters
/// Name in Macintosh. If PCExchange version supports FAT's LFN they are the same.
/// Illegal characters for FAT get substituted with '_' both here and in FAT's LFN entry.
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] macName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] macName;
/// <summary>
/// File type
/// </summary>
@@ -288,7 +291,8 @@ namespace DiscImageChef.Filters
/// <summary>
/// Unknown, all bytes are empty but last, except in volume's label entry
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)] public byte[] unknown1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)]
public byte[] unknown1;
/// <summary>
/// File's creation date
/// </summary>
@@ -310,7 +314,8 @@ namespace DiscImageChef.Filters
/// Name as in FAT entry (not LFN).
/// Resource fork file is always using this name, never LFN.
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] dosName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public byte[] dosName;
/// <summary>
/// Unknown, flags?
/// </summary>

View File

@@ -41,23 +41,23 @@ namespace DiscImageChef.Filters
/// </summary>
public class XZ : IFilter
{
string basePath;
string basePath;
DateTime creationTime;
Stream dataStream;
long decompressedSize;
Stream innerStream;
Stream dataStream;
long decompressedSize;
Stream innerStream;
DateTime lastWriteTime;
bool opened;
bool opened;
public string Name => "XZ";
public Guid Id => new Guid("666A8617-0444-4C05-9F4F-DF0FD758D0D2");
public Guid Id => new Guid("666A8617-0444-4C05-9F4F-DF0FD758D0D2");
public void Close()
{
dataStream?.Close();
dataStream = null;
basePath = null;
opened = false;
basePath = null;
opened = false;
}
public string GetBasePath()
@@ -87,9 +87,9 @@ namespace DiscImageChef.Filters
public bool Identify(byte[] buffer)
{
return buffer[0] == 0xFD && buffer[1] == 0x37 && buffer[2] == 0x7A && buffer[3] == 0x58 &&
return buffer[0] == 0xFD && buffer[1] == 0x37 && buffer[2] == 0x7A && buffer[3] == 0x58 &&
buffer[4] == 0x5A && buffer[5] == 0x00 && buffer[buffer.Length - 2] == 0x59 &&
buffer[buffer.Length - 1] == 0x5A;
buffer[buffer.Length - 1] == 0x5A;
}
public bool Identify(Stream stream)
@@ -112,12 +112,12 @@ namespace DiscImageChef.Filters
if(!File.Exists(path)) return false;
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[6];
byte[] footer = new byte[2];
byte[] buffer = new byte[6];
byte[] footer = new byte[2];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(buffer, 0, 6);
stream.Seek(0, SeekOrigin.Begin);
stream.Seek(0, SeekOrigin.Begin);
stream.Seek(-2, SeekOrigin.End);
stream.Read(footer, 0, 2);
stream.Seek(0, SeekOrigin.Begin);
@@ -126,85 +126,39 @@ namespace DiscImageChef.Filters
buffer[4] == 0x5A && buffer[5] == 0x00 && footer[0] == 0x59 && footer[1] == 0x5A;
}
void GuessSize()
{
decompressedSize = 0;
// Seek to footer backwards size field
dataStream.Seek(-8, SeekOrigin.End);
byte[] tmp = new byte[4];
dataStream.Read(tmp, 0, 4);
uint backwardSize = (BitConverter.ToUInt32(tmp, 0) + 1) * 4;
// Seek to first indexed record
dataStream.Seek(-12 - (backwardSize - 2), SeekOrigin.End);
// Skip compressed size
tmp = new byte[backwardSize - 2];
dataStream.Read(tmp, 0, tmp.Length);
ulong number = 0;
int ignore = Decode(tmp, tmp.Length, ref number);
// Get compressed size
dataStream.Seek(-12 - (backwardSize - 2 - ignore), SeekOrigin.End);
tmp = new byte[backwardSize - 2 - ignore];
dataStream.Read(tmp, 0, tmp.Length);
Decode(tmp, tmp.Length, ref number);
decompressedSize = (long)number;
dataStream.Seek(0, SeekOrigin.Begin);
}
int Decode(byte[] buf, int sizeMax, ref ulong num)
{
if(sizeMax == 0) return 0;
if(sizeMax > 9) sizeMax = 9;
num = (ulong)(buf[0] & 0x7F);
int i = 0;
while((buf[i++] & 0x80) == 0x80)
{
if(i >= sizeMax || buf[i] == 0x00) return 0;
num |= (ulong)(buf[i] & 0x7F) << (i * 7);
}
return i;
}
public void Open(byte[] buffer)
{
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
GuessSize();
innerStream = new ForcedSeekStream<XZStream>(decompressedSize, dataStream);
opened = true;
opened = true;
}
public void Open(Stream stream)
{
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
GuessSize();
innerStream = new ForcedSeekStream<XZStream>(decompressedSize, dataStream);
opened = true;
opened = true;
}
public void Open(string path)
{
dataStream = new FileStream(path, FileMode.Open, FileAccess.Read);
basePath = Path.GetFullPath(path);
basePath = Path.GetFullPath(path);
FileInfo fi = new FileInfo(path);
creationTime = fi.CreationTimeUtc;
creationTime = fi.CreationTimeUtc;
lastWriteTime = fi.LastWriteTimeUtc;
GuessSize();
innerStream = new ForcedSeekStream<XZStream>(decompressedSize, dataStream);
opened = true;
opened = true;
}
public DateTime GetCreationTime()
@@ -251,5 +205,51 @@ namespace DiscImageChef.Filters
{
return opened;
}
void GuessSize()
{
decompressedSize = 0;
// Seek to footer backwards size field
dataStream.Seek(-8, SeekOrigin.End);
byte[] tmp = new byte[4];
dataStream.Read(tmp, 0, 4);
uint backwardSize = (BitConverter.ToUInt32(tmp, 0) + 1) * 4;
// Seek to first indexed record
dataStream.Seek(-12 - (backwardSize - 2), SeekOrigin.End);
// Skip compressed size
tmp = new byte[backwardSize - 2];
dataStream.Read(tmp, 0, tmp.Length);
ulong number = 0;
int ignore = Decode(tmp, tmp.Length, ref number);
// Get compressed size
dataStream.Seek(-12 - (backwardSize - 2 - ignore), SeekOrigin.End);
tmp = new byte[backwardSize - 2 - ignore];
dataStream.Read(tmp, 0, tmp.Length);
Decode(tmp, tmp.Length, ref number);
decompressedSize = (long)number;
dataStream.Seek(0, SeekOrigin.Begin);
}
int Decode(byte[] buf, int sizeMax, ref ulong num)
{
if(sizeMax == 0) return 0;
if(sizeMax > 9) sizeMax = 9;
num = (ulong)(buf[0] & 0x7F);
int i = 0;
while((buf[i++] & 0x80) == 0x80)
{
if(i >= sizeMax || buf[i] == 0x00) return 0;
num |= (ulong)(buf[i] & 0x7F) << (i * 7);
}
return i;
}
}
}

View File

@@ -40,21 +40,21 @@ namespace DiscImageChef.Filters
/// </summary>
public class ZZZNoFilter : IFilter
{
string basePath;
string basePath;
DateTime creationTime;
Stream dataStream;
Stream dataStream;
DateTime lastWriteTime;
bool opened;
bool opened;
public string Name => "No filter";
public Guid Id => new Guid("12345678-AAAA-BBBB-CCCC-123456789000");
public Guid Id => new Guid("12345678-AAAA-BBBB-CCCC-123456789000");
public void Close()
{
dataStream?.Close();
dataStream = null;
basePath = null;
opened = false;
basePath = null;
opened = false;
}
public string GetBasePath()
@@ -100,30 +100,30 @@ namespace DiscImageChef.Filters
public void Open(byte[] buffer)
{
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
dataStream = new MemoryStream(buffer);
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
opened = true;
opened = true;
}
public void Open(Stream stream)
{
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
dataStream = stream;
basePath = null;
creationTime = DateTime.UtcNow;
lastWriteTime = creationTime;
opened = true;
opened = true;
}
public void Open(string path)
{
dataStream = new FileStream(path, FileMode.Open, FileAccess.Read);
basePath = Path.GetFullPath(path);
basePath = Path.GetFullPath(path);
FileInfo fi = new FileInfo(path);
creationTime = fi.CreationTimeUtc;
creationTime = fi.CreationTimeUtc;
lastWriteTime = fi.LastWriteTimeUtc;
opened = true;
opened = true;
}
public DateTime GetCreationTime()