diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index d397e1a93..54d8d6c54 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -6,7 +6,6 @@ - @@ -36,6 +35,7 @@ + @@ -61,7 +61,7 @@ - + @@ -76,6 +76,7 @@ + @@ -2073,6 +2074,7 @@ + diff --git a/DiscImageChef.Filesystems/ISO9660/Dir.cs b/DiscImageChef.Filesystems/ISO9660/Dir.cs index 2d3cb41c8..f4a5dab5c 100644 --- a/DiscImageChef.Filesystems/ISO9660/Dir.cs +++ b/DiscImageChef.Filesystems/ISO9660/Dir.cs @@ -132,8 +132,46 @@ namespace DiscImageChef.Filesystems.ISO9660 Dictionary DecodeCdiDirectory(byte[] data) => throw new NotImplementedException(); - Dictionary DecodeHighSierraDirectory(byte[] data) => - throw new NotImplementedException(); + Dictionary DecodeHighSierraDirectory(byte[] data) + { + Dictionary entries = new Dictionary(); + int entryOff = 0; + + while(entryOff + DirectoryRecordSize < data.Length) + { + HighSierraDirectoryRecord record = + Marshal.ByteArrayToStructureLittleEndian(data, entryOff, + Marshal + .SizeOf()); + + if(record.length == 0) break; + + // Special entries for current and parent directories, skip them + if(record.name_len == 1) + if(data[entryOff + DirectoryRecordSize] == 0 || data[entryOff + DirectoryRecordSize] == 1) + { + entryOff += record.length; + continue; + } + + DecodedDirectoryEntry entry = new DecodedDirectoryEntry + { + Extent = record.size == 0 ? 0 : record.extent, + Size = record.size, + Flags = record.flags, + Interleave = record.interleave, + VolumeSequenceNumber = record.volume_sequence_number, + IsoFilename = + Encoding.ASCII.GetString(data, entryOff + DirectoryRecordSize, record.name_len) + }; + + if(!entries.ContainsKey(entry.IsoFilename)) entries.Add(entry.IsoFilename, entry); + + entryOff += record.length; + } + + return entries; + } // TODO: Implement system area Dictionary DecodeIsoDirectory(byte[] data)