mirror of
https://github.com/aaru-dps/Aaru.Server.git
synced 2025-12-16 19:24:27 +00:00
Code cleanup.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user