diff --git a/DiscImageChef.Filesystems/ISO9660/Dir.cs b/DiscImageChef.Filesystems/ISO9660/Dir.cs index 49f810a70..1cee0d95d 100644 --- a/DiscImageChef.Filesystems/ISO9660/Dir.cs +++ b/DiscImageChef.Filesystems/ISO9660/Dir.cs @@ -175,7 +175,7 @@ namespace DiscImageChef.Filesystems.ISO9660 } // TODO: Implement system area - Dictionary DecodeIsoDirectory(byte[] data) + Dictionary DecodeIsoDirectory(byte[] data, bool joliet = false) { Dictionary entries = new Dictionary(); int entryOff = 0; @@ -204,19 +204,25 @@ namespace DiscImageChef.Filesystems.ISO9660 FileUnitSize = record.file_unit_size, Interleave = record.interleave, VolumeSequenceNumber = record.volume_sequence_number, - IsoFilename = - Encoding.ASCII.GetString(data, entryOff + DirectoryRecordSize, record.name_len), - Timestamp = DecodeIsoDateTime(record.date) + Timestamp = DecodeIsoDateTime(record.date) }; + if(joliet) + entry.JolietFilename = + Encoding.BigEndianUnicode.GetString(data, entryOff + DirectoryRecordSize, record.name_len); + else + entry.IsoFilename = Encoding.ASCII.GetString(data, entryOff + DirectoryRecordSize, record.name_len); + // TODO: Multi-extent files 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; + if(entries.ContainsKey(joliet ? entry.JolietFilename : entry.IsoFilename)) + entries[joliet ? entry.JolietFilename : entry.IsoFilename].AssociatedFile = entry; else - entries[entry.IsoFilename] = new DecodedDirectoryEntry + { + entries[joliet ? entry.JolietFilename : entry.IsoFilename] = new DecodedDirectoryEntry { Extent = 0, Size = 0, @@ -229,12 +235,22 @@ namespace DiscImageChef.Filesystems.ISO9660 Timestamp = DecodeIsoDateTime(record.date), AssociatedFile = entry }; + + if(joliet) + entries[entry.JolietFilename].JolietFilename = + Encoding.BigEndianUnicode.GetString(data, entryOff + DirectoryRecordSize, + record.name_len); + else + entries[entry.IsoFilename].IsoFilename = + Encoding.ASCII.GetString(data, entryOff + DirectoryRecordSize, record.name_len); + } } else { - if(entries.ContainsKey(entry.IsoFilename)) - entry.AssociatedFile = entries[entry.IsoFilename].AssociatedFile; - entries[entry.IsoFilename] = entry; + if(entries.ContainsKey(joliet ? entry.JolietFilename : entry.IsoFilename)) + entry.AssociatedFile = + entries[joliet ? entry.JolietFilename : entry.IsoFilename].AssociatedFile; + entries[joliet ? entry.JolietFilename : entry.IsoFilename] = entry; } entryOff += record.length; diff --git a/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs b/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs index 8c13a9a51..f54ccef83 100644 --- a/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs +++ b/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs @@ -66,8 +66,9 @@ namespace DiscImageChef.Filesystems.ISO9660 public uint Size; public DateTime? Timestamp; public ushort VolumeSequenceNumber; + public string JolietFilename; - public override string ToString() => IsoFilename; + public override string ToString() => JolietFilename ?? IsoFilename; } } } \ No newline at end of file