From 2c07e1ace2ec7f78ef37e481706481c6918dc449 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 22 Jul 2019 01:08:05 +0100 Subject: [PATCH] Handle associated files in ISO9660. --- .../.idea/contentModel.xml | 13 +++++---- DiscImageChef.Filesystems/ISO9660/Dir.cs | 27 ++++++++++++++++++- .../ISO9660/Structs/Internal.cs | 17 ++++++------ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 54d8d6c54..7354018f0 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -35,7 +35,6 @@ - @@ -61,7 +60,7 @@ - + @@ -76,7 +75,6 @@ - @@ -1303,27 +1301,33 @@ + + + + - + + + @@ -2074,7 +2078,6 @@ - diff --git a/DiscImageChef.Filesystems/ISO9660/Dir.cs b/DiscImageChef.Filesystems/ISO9660/Dir.cs index 7286dc7da..49f810a70 100644 --- a/DiscImageChef.Filesystems/ISO9660/Dir.cs +++ b/DiscImageChef.Filesystems/ISO9660/Dir.cs @@ -210,7 +210,32 @@ namespace DiscImageChef.Filesystems.ISO9660 }; // 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; } diff --git a/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs b/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs index f3067a3a0..8c13a9a51 100644 --- a/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs +++ b/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs @@ -57,14 +57,15 @@ namespace DiscImageChef.Filesystems.ISO9660 class DecodedDirectoryEntry { - public uint Extent; - public byte FileUnitSize; - public FileFlags Flags; - public byte Interleave; - public string IsoFilename; - public uint Size; - public DateTime? Timestamp; - public ushort VolumeSequenceNumber; + public DecodedDirectoryEntry AssociatedFile; + public uint Extent; + public byte FileUnitSize; + public FileFlags Flags; + public byte Interleave; + public string IsoFilename; + public uint Size; + public DateTime? Timestamp; + public ushort VolumeSequenceNumber; public override string ToString() => IsoFilename; }