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;
}