Handle associated files in ISO9660.

This commit is contained in:
2019-07-22 01:08:05 +01:00
parent 824d02878d
commit 2c07e1ace2
3 changed files with 43 additions and 14 deletions

View File

@@ -35,7 +35,6 @@
<e p="Entropy.cs" t="Include" /> <e p="Entropy.cs" t="Include" />
<e p="ExtractFiles.cs" t="Include" /> <e p="ExtractFiles.cs" t="Include" />
<e p="Formats.cs" t="Include" /> <e p="Formats.cs" t="Include" />
<e p="Gui.cs" t="Include" />
<e p="ImageInfo.cs" t="Include" /> <e p="ImageInfo.cs" t="Include" />
<e p="ListDevices.cs" t="Include" /> <e p="ListDevices.cs" t="Include" />
<e p="ListEncodings.cs" t="Include" /> <e p="ListEncodings.cs" t="Include" />
@@ -61,7 +60,7 @@
<e p="bin" t="ExcludeRecursive" /> <e p="bin" t="ExcludeRecursive" />
<e p="obj" t="ExcludeRecursive"> <e p="obj" t="ExcludeRecursive">
<e p="Debug" t="Include"> <e p="Debug" t="Include">
<e p="net461" t="Include"> <e p="netcoreapp2.0" t="Include">
<e p="DiscImageChef.AssemblyInfo.cs" t="Include" /> <e p="DiscImageChef.AssemblyInfo.cs" t="Include" />
</e> </e>
</e> </e>
@@ -76,7 +75,6 @@
<e p="DiscImageChef.Checksums.csproj" t="IncludeRecursive" /> <e p="DiscImageChef.Checksums.csproj" t="IncludeRecursive" />
<e p="FletcherContext.cs" t="Include" /> <e p="FletcherContext.cs" t="Include" />
<e p="MD5Context.cs" t="Include" /> <e p="MD5Context.cs" t="Include" />
<e p="RIPEMD160Context.cs" t="Include" />
<e p="ReedSolomon.cs" t="Include" /> <e p="ReedSolomon.cs" t="Include" />
<e p="Register.cs" t="Include" /> <e p="Register.cs" t="Include" />
<e p="SHA1Context.cs" t="Include" /> <e p="SHA1Context.cs" t="Include" />
@@ -1303,27 +1301,33 @@
<e p="ElTorito.cs" t="Include" /> <e p="ElTorito.cs" t="Include" />
<e p="HighSierra.cs" t="Include" /> <e p="HighSierra.cs" t="Include" />
<e p="ISO.cs" t="Include" /> <e p="ISO.cs" t="Include" />
<e p="Internal.cs" t="Include" />
<e p="RRIP.cs" t="Include" /> <e p="RRIP.cs" t="Include" />
<e p="SUSP.cs" t="Include" /> <e p="SUSP.cs" t="Include" />
<e p="XA.cs" t="Include" /> <e p="XA.cs" t="Include" />
<e p="Ziso.cs" t="Include" /> <e p="Ziso.cs" t="Include" />
</e> </e>
<e p="Date.cs" t="Include" />
<e p="Dir.cs" t="Include" />
<e p="File.cs" t="Include" />
<e p="ISO9660.cs" t="Include" /> <e p="ISO9660.cs" t="Include" />
<e p="Info.cs" t="Include" /> <e p="Info.cs" t="Include" />
<e p="Structs" t="Include"> <e p="Structs" t="Include">
<e p="Amiga.cs" t="Include" /> <e p="Amiga.cs" t="Include" />
<e p="Apple.cs" t="Include" /> <e p="Apple.cs" t="Include" />
<e p="CDi.cs" t="Include" /> <e p="CDi.cs" t="Include" />
<e p="Common.cs" t="Include" />
<e p="ElTorito.cs" t="Include" /> <e p="ElTorito.cs" t="Include" />
<e p="HighSierra.cs" t="Include" /> <e p="HighSierra.cs" t="Include" />
<e p="ISO.cs" t="Include" /> <e p="ISO.cs" t="Include" />
<e p="Internal.cs" t="Include" />
<e p="Joliet.cs" t="Include" /> <e p="Joliet.cs" t="Include" />
<e p="RRIP.cs" t="Include" /> <e p="RRIP.cs" t="Include" />
<e p="SUSP.cs" t="Include" /> <e p="SUSP.cs" t="Include" />
<e p="XA.cs" t="Include" /> <e p="XA.cs" t="Include" />
<e p="Ziso.cs" t="Include" /> <e p="Ziso.cs" t="Include" />
</e> </e>
<e p="Super.cs" t="Include" />
<e p="Xattr.cs" t="Include" />
</e> </e>
<e p="JFS.cs" t="Include" /> <e p="JFS.cs" t="Include" />
<e p="LIF.cs" t="Include" /> <e p="LIF.cs" t="Include" />
@@ -2074,7 +2078,6 @@
<e p="CRC32.cs" t="Include" /> <e p="CRC32.cs" t="Include" />
<e p="CRC64.cs" t="Include" /> <e p="CRC64.cs" t="Include" />
<e p="MD5.cs" t="Include" /> <e p="MD5.cs" t="Include" />
<e p="RIPEMD160.cs" t="Include" />
<e p="SHA1.cs" t="Include" /> <e p="SHA1.cs" t="Include" />
<e p="SHA256.cs" t="Include" /> <e p="SHA256.cs" t="Include" />
<e p="SHA384.cs" t="Include" /> <e p="SHA384.cs" t="Include" />

View File

@@ -210,7 +210,32 @@ namespace DiscImageChef.Filesystems.ISO9660
}; };
// TODO: Multi-extent files // TODO: Multi-extent files
if(!entries.ContainsKey(entry.IsoFilename)) entries.Add(entry.IsoFilename, entry); if(entry.Flags.HasFlag(FileFlags.Associated))
{
// TODO: Detect if Apple extensions, as associated files contain the resource fork there
if(entries.ContainsKey(entry.IsoFilename)) entries[entry.IsoFilename].AssociatedFile = entry;
else
entries[entry.IsoFilename] = new DecodedDirectoryEntry
{
Extent = 0,
Size = 0,
Flags = record.flags ^ FileFlags.Associated,
FileUnitSize = 0,
Interleave = 0,
VolumeSequenceNumber = record.volume_sequence_number,
IsoFilename =
Encoding.ASCII.GetString(data, entryOff + DirectoryRecordSize, record.name_len),
Timestamp = DecodeIsoDateTime(record.date),
AssociatedFile = entry
};
}
else
{
if(entries.ContainsKey(entry.IsoFilename))
entry.AssociatedFile = entries[entry.IsoFilename].AssociatedFile;
entries[entry.IsoFilename] = entry;
}
entryOff += record.length; entryOff += record.length;
} }

View File

@@ -57,14 +57,15 @@ namespace DiscImageChef.Filesystems.ISO9660
class DecodedDirectoryEntry class DecodedDirectoryEntry
{ {
public uint Extent; public DecodedDirectoryEntry AssociatedFile;
public byte FileUnitSize; public uint Extent;
public FileFlags Flags; public byte FileUnitSize;
public byte Interleave; public FileFlags Flags;
public string IsoFilename; public byte Interleave;
public uint Size; public string IsoFilename;
public DateTime? Timestamp; public uint Size;
public ushort VolumeSequenceNumber; public DateTime? Timestamp;
public ushort VolumeSequenceNumber;
public override string ToString() => IsoFilename; public override string ToString() => IsoFilename;
} }