From 9a178d1456a1291c5659e5db33391231f01253e4 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 8 Oct 2017 20:41:54 +0100 Subject: [PATCH] Refactor: Split ISO9660. --- .../DiscImageChef.Filesystems.csproj | 12 +- DiscImageChef.Filesystems/ISO9660/Dir.cs | 48 +++ DiscImageChef.Filesystems/ISO9660/Extent.cs | 42 +++ DiscImageChef.Filesystems/ISO9660/File.cs | 52 ++++ DiscImageChef.Filesystems/ISO9660/ISO9660.cs | 58 ++++ .../{ISO9660.cs => ISO9660/Info.cs} | 286 +----------------- DiscImageChef.Filesystems/ISO9660/Structs.cs | 226 ++++++++++++++ DiscImageChef.Filesystems/ISO9660/Super.cs | 57 ++++ DiscImageChef.Filesystems/ISO9660/Xattr.cs | 48 +++ DiscImageChef.Tests/Filesystems/ISO9660.cs | 2 +- 10 files changed, 548 insertions(+), 283 deletions(-) create mode 100644 DiscImageChef.Filesystems/ISO9660/Dir.cs create mode 100644 DiscImageChef.Filesystems/ISO9660/Extent.cs create mode 100644 DiscImageChef.Filesystems/ISO9660/File.cs create mode 100644 DiscImageChef.Filesystems/ISO9660/ISO9660.cs rename DiscImageChef.Filesystems/{ISO9660.cs => ISO9660/Info.cs} (62%) create mode 100644 DiscImageChef.Filesystems/ISO9660/Structs.cs create mode 100644 DiscImageChef.Filesystems/ISO9660/Super.cs create mode 100644 DiscImageChef.Filesystems/ISO9660/Xattr.cs diff --git a/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj b/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj index e78dcfa9..f6967055 100644 --- a/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj +++ b/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj @@ -48,7 +48,6 @@ - @@ -137,6 +136,14 @@ + + + + + + + + @@ -179,6 +186,7 @@ + @@ -194,7 +202,7 @@ - + diff --git a/DiscImageChef.Filesystems/ISO9660/Dir.cs b/DiscImageChef.Filesystems/ISO9660/Dir.cs new file mode 100644 index 00000000..002d71e0 --- /dev/null +++ b/DiscImageChef.Filesystems/ISO9660/Dir.cs @@ -0,0 +1,48 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Dir.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ +using System.Collections.Generic; + +namespace DiscImageChef.Filesystems.ISO9660 +{ + public partial class ISO9660 : Filesystem + { + public override Errno ReadLink(string path, ref string dest) + { + return Errno.NotImplemented; + } + + public override Errno ReadDir(string path, ref List contents) + { + return Errno.NotImplemented; + } + } +} diff --git a/DiscImageChef.Filesystems/ISO9660/Extent.cs b/DiscImageChef.Filesystems/ISO9660/Extent.cs new file mode 100644 index 00000000..00431ae2 --- /dev/null +++ b/DiscImageChef.Filesystems/ISO9660/Extent.cs @@ -0,0 +1,42 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Extent.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Filesystems.ISO9660 +{ + public partial class ISO9660 : Filesystem + { + public override Errno MapBlock(string path, long fileBlock, ref long deviceBlock) + { + return Errno.NotImplemented; + } + } +} diff --git a/DiscImageChef.Filesystems/ISO9660/File.cs b/DiscImageChef.Filesystems/ISO9660/File.cs new file mode 100644 index 00000000..b5fd9c32 --- /dev/null +++ b/DiscImageChef.Filesystems/ISO9660/File.cs @@ -0,0 +1,52 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : File.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Filesystems.ISO9660 +{ + public partial class ISO9660 : Filesystem + { + public override Errno GetAttributes(string path, ref FileAttributes attributes) + { + return Errno.NotImplemented; + } + + public override Errno Read(string path, long offset, long size, ref byte[] buf) + { + return Errno.NotImplemented; + } + + public override Errno Stat(string path, ref FileEntryInfo stat) + { + return Errno.NotImplemented; + } + } +} diff --git a/DiscImageChef.Filesystems/ISO9660/ISO9660.cs b/DiscImageChef.Filesystems/ISO9660/ISO9660.cs new file mode 100644 index 00000000..9a1b0ee7 --- /dev/null +++ b/DiscImageChef.Filesystems/ISO9660/ISO9660.cs @@ -0,0 +1,58 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ISO9660.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ +using System; +using System.Text; +using DiscImageChef.CommonTypes; + +namespace DiscImageChef.Filesystems.ISO9660 +{ + // This is coded following ECMA-119. + // TODO: Differentiate ISO Level 1, 2, 3 and ISO 9660:1999 + // TODO: Apple extensiones, requires XA or advance RR interpretation. + public partial class ISO9660 : Filesystem + { + public ISO9660() + { + Name = "ISO9660 Filesystem"; + PluginUUID = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); + CurrentEncoding = Encoding.ASCII; + } + + public ISO9660(ImagePlugins.ImagePlugin imagePlugin, Partition partition, Encoding encoding) + { + Name = "ISO9660 Filesystem"; + PluginUUID = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); + if(encoding == null) + CurrentEncoding = Encoding.ASCII; + } + } +} diff --git a/DiscImageChef.Filesystems/ISO9660.cs b/DiscImageChef.Filesystems/ISO9660/Info.cs similarity index 62% rename from DiscImageChef.Filesystems/ISO9660.cs rename to DiscImageChef.Filesystems/ISO9660/Info.cs index 7a4a7464..0356b012 100644 --- a/DiscImageChef.Filesystems/ISO9660.cs +++ b/DiscImageChef.Filesystems/ISO9660/Info.cs @@ -2,14 +2,14 @@ // The Disc Image Chef // ---------------------------------------------------------------------------- // -// Filename : ISO9660.cs +// Filename : Info.cs // Author(s) : Natalia Portillo // -// Component : ISO 9660 filesystem plugin. +// Component : Component // // --[ Description ] ---------------------------------------------------------- // -// Identifies the ISO 9660 filesystem and shows information. +// Description // // --[ License ] -------------------------------------------------------------- // @@ -29,136 +29,18 @@ // ---------------------------------------------------------------------------- // Copyright © 2011-2017 Natalia Portillo // ****************************************************************************/ - using System; -using System.Collections.Generic; -using System.Globalization; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; using DiscImageChef.Console; -namespace DiscImageChef.Filesystems +namespace DiscImageChef.Filesystems.ISO9660 { - // This is coded following ECMA-119. - // TODO: Differentiate ISO Level 1, 2, 3 and ISO 9660:1999 - // TODO: Apple extensiones, requires XA or advance RR interpretation. - // TODO: Needs a major rewrite - public class ISO9660Plugin : Filesystem + public partial class ISO9660 : Filesystem { - //static bool alreadyLaunched; - - public ISO9660Plugin() - { - Name = "ISO9660 Filesystem"; - PluginUUID = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); - CurrentEncoding = Encoding.ASCII; - } - - public ISO9660Plugin(ImagePlugins.ImagePlugin imagePlugin, Partition partition, Encoding encoding) - { - Name = "ISO9660 Filesystem"; - PluginUUID = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); - if(encoding == null) - CurrentEncoding = Encoding.ASCII; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct PrimaryVolumeDescriptor - { - public byte type; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] - public byte[] id; - public byte version; - // Only used in SVDs - public byte flags; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] - public byte[] system_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] - public byte[] volume_id; - public ulong reserved2; - public ulong volume_space_size; - // Only used in SVDs - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] - public byte[] escape_sequences; - public uint volume_set_size; - public uint volume_sequence_number; - public uint logical_block_size; - public ulong path_table_size; - public uint type_1_path_table; - public uint opt_type_1_path_table; - public uint type_m_path_table; - public uint opt_type_m_path_table; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 34)] - public byte[] root_directory_record; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] - public byte[] volume_set_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] - public byte[] publisher_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] - public byte[] preparer_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] - public byte[] application_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 37)] - public byte[] copyright_file_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 37)] - public byte[] abstract_file_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 37)] - public byte[] bibliographic_file_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] - public byte[] creation_date; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] - public byte[] modification_date; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] - public byte[] expiration_date; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] - public byte[] effective_date; - public byte file_structure_version; - public byte reserved4; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] - public byte[] application_data; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 653)] - public byte[] reserved5; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BootRecord - { - public byte type; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] - public byte[] id; - public byte version; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] - public byte[] system_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] - public byte[] boot_id; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1977)] - public byte[] boot_use; - } - - struct DecodedVolumeDescriptor - { - public string SystemIdentifier; - public string VolumeIdentifier; - public string VolumeSetIdentifier; - public string PublisherIdentifier; - public string DataPreparerIdentifier; - public string ApplicationIdentifier; - public DateTime CreationTime; - public bool HasModificationTime; - public DateTime ModificationTime; - public bool HasExpirationTime; - public DateTime ExpirationTime; - public bool HasEffectiveTime; - public DateTime EffectiveTime; - } - public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition) { - /* if (alreadyLaunched) - return false; - alreadyLaunched = true;*/ - byte VDType; // ISO9660 is designed for 2048 bytes/sector devices @@ -505,161 +387,5 @@ namespace DiscImageChef.Filesystems information = ISOMetadata.ToString(); } - - static DecodedVolumeDescriptor DecodeJolietDescriptor(PrimaryVolumeDescriptor jolietvd) - { - DecodedVolumeDescriptor decodedVD = new DecodedVolumeDescriptor(); - - decodedVD.SystemIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.system_id).TrimEnd().Trim(new[] { '\u0000' }); - decodedVD.VolumeIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.volume_id).TrimEnd().Trim(new[] { '\u0000' }); - decodedVD.VolumeSetIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.volume_set_id).TrimEnd().Trim(new[] { '\u0000' }); - decodedVD.PublisherIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.publisher_id).TrimEnd().Trim(new[] { '\u0000' }); - decodedVD.DataPreparerIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.preparer_id).TrimEnd().Trim(new[] { '\u0000' }); - decodedVD.ApplicationIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.application_id).TrimEnd().Trim(new[] { '\u0000' }); - if(jolietvd.creation_date[0] < 0x31 || jolietvd.creation_date[0] > 0x39) - decodedVD.CreationTime = DateTime.MinValue; - else - decodedVD.CreationTime = DateHandlers.ISO9660ToDateTime(jolietvd.creation_date); - - if(jolietvd.modification_date[0] < 0x31 || jolietvd.modification_date[0] > 0x39) - { - decodedVD.HasModificationTime = false; - } - else - { - decodedVD.HasModificationTime = true; - decodedVD.ModificationTime = DateHandlers.ISO9660ToDateTime(jolietvd.modification_date); - } - - if(jolietvd.expiration_date[0] < 0x31 || jolietvd.expiration_date[0] > 0x39) - { - decodedVD.HasExpirationTime = false; - } - else - { - decodedVD.HasExpirationTime = true; - decodedVD.ExpirationTime = DateHandlers.ISO9660ToDateTime(jolietvd.expiration_date); - } - - if(jolietvd.effective_date[0] < 0x31 || jolietvd.effective_date[0] > 0x39) - { - decodedVD.HasEffectiveTime = false; - } - else - { - decodedVD.HasEffectiveTime = true; - decodedVD.EffectiveTime = DateHandlers.ISO9660ToDateTime(jolietvd.effective_date); - } - - return decodedVD; - } - - static DecodedVolumeDescriptor DecodeVolumeDescriptor(PrimaryVolumeDescriptor pvd) - { - DecodedVolumeDescriptor decodedVD = new DecodedVolumeDescriptor(); - - decodedVD.SystemIdentifier = Encoding.ASCII.GetString(pvd.system_id).TrimEnd().Trim(new[] { '\0' }); - decodedVD.VolumeIdentifier = Encoding.ASCII.GetString(pvd.volume_id).TrimEnd().Trim(new[] { '\0' }); - decodedVD.VolumeSetIdentifier = Encoding.ASCII.GetString(pvd.volume_set_id).TrimEnd().Trim(new[] { '\0' }); - decodedVD.PublisherIdentifier = Encoding.ASCII.GetString(pvd.publisher_id).TrimEnd().Trim(new[] { '\0' }); - decodedVD.DataPreparerIdentifier = Encoding.ASCII.GetString(pvd.preparer_id).TrimEnd().Trim(new[] { '\0' }); - decodedVD.ApplicationIdentifier = Encoding.ASCII.GetString(pvd.application_data).TrimEnd().Trim(new[] { '\0' }); - if(pvd.creation_date[0] == '0' || pvd.creation_date[0] == 0x00) - decodedVD.CreationTime = DateTime.MinValue; - else - decodedVD.CreationTime = DateHandlers.ISO9660ToDateTime(pvd.creation_date); - - if(pvd.modification_date[0] == '0' || pvd.modification_date[0] == 0x00) - { - decodedVD.HasModificationTime = false; - } - else - { - decodedVD.HasModificationTime = true; - decodedVD.ModificationTime = DateHandlers.ISO9660ToDateTime(pvd.modification_date); - } - - if(pvd.expiration_date[0] == '0' || pvd.expiration_date[0] == 0x00) - { - decodedVD.HasExpirationTime = false; - } - else - { - decodedVD.HasExpirationTime = true; - decodedVD.ExpirationTime = DateHandlers.ISO9660ToDateTime(pvd.expiration_date); - } - - if(pvd.effective_date[0] == '0' || pvd.effective_date[0] == 0x00) - { - decodedVD.HasEffectiveTime = false; - } - else - { - decodedVD.HasEffectiveTime = true; - decodedVD.EffectiveTime = DateHandlers.ISO9660ToDateTime(pvd.effective_date); - } - - return decodedVD; - } - - public override Errno Mount() - { - return Errno.NotImplemented; - } - - public override Errno Mount(bool debug) - { - return Errno.NotImplemented; - } - - public override Errno Unmount() - { - return Errno.NotImplemented; - } - - public override Errno MapBlock(string path, long fileBlock, ref long deviceBlock) - { - return Errno.NotImplemented; - } - - public override Errno GetAttributes(string path, ref FileAttributes attributes) - { - return Errno.NotImplemented; - } - - public override Errno ListXAttr(string path, ref List xattrs) - { - return Errno.NotImplemented; - } - - public override Errno GetXattr(string path, string xattr, ref byte[] buf) - { - return Errno.NotImplemented; - } - - public override Errno Read(string path, long offset, long size, ref byte[] buf) - { - return Errno.NotImplemented; - } - - public override Errno ReadDir(string path, ref List contents) - { - return Errno.NotImplemented; - } - - public override Errno StatFs(ref FileSystemInfo stat) - { - return Errno.NotImplemented; - } - - public override Errno Stat(string path, ref FileEntryInfo stat) - { - return Errno.NotImplemented; - } - - public override Errno ReadLink(string path, ref string dest) - { - return Errno.NotImplemented; - } } -} \ No newline at end of file +} diff --git a/DiscImageChef.Filesystems/ISO9660/Structs.cs b/DiscImageChef.Filesystems/ISO9660/Structs.cs new file mode 100644 index 00000000..a22168af --- /dev/null +++ b/DiscImageChef.Filesystems/ISO9660/Structs.cs @@ -0,0 +1,226 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Structs.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace DiscImageChef.Filesystems.ISO9660 +{ + public partial class ISO9660 : Filesystem + { + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct PrimaryVolumeDescriptor + { + public byte type; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] + public byte[] id; + public byte version; + // Only used in SVDs + public byte flags; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] system_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] volume_id; + public ulong reserved2; + public ulong volume_space_size; + // Only used in SVDs + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] escape_sequences; + public uint volume_set_size; + public uint volume_sequence_number; + public uint logical_block_size; + public ulong path_table_size; + public uint type_1_path_table; + public uint opt_type_1_path_table; + public uint type_m_path_table; + public uint opt_type_m_path_table; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 34)] + public byte[] root_directory_record; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] + public byte[] volume_set_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] + public byte[] publisher_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] + public byte[] preparer_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] + public byte[] application_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 37)] + public byte[] copyright_file_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 37)] + public byte[] abstract_file_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 37)] + public byte[] bibliographic_file_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] + public byte[] creation_date; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] + public byte[] modification_date; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] + public byte[] expiration_date; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] + public byte[] effective_date; + public byte file_structure_version; + public byte reserved4; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] + public byte[] application_data; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 653)] + public byte[] reserved5; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct BootRecord + { + public byte type; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] + public byte[] id; + public byte version; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] system_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] boot_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1977)] + public byte[] boot_use; + } + + struct DecodedVolumeDescriptor + { + public string SystemIdentifier; + public string VolumeIdentifier; + public string VolumeSetIdentifier; + public string PublisherIdentifier; + public string DataPreparerIdentifier; + public string ApplicationIdentifier; + public DateTime CreationTime; + public bool HasModificationTime; + public DateTime ModificationTime; + public bool HasExpirationTime; + public DateTime ExpirationTime; + public bool HasEffectiveTime; + public DateTime EffectiveTime; + } + + static DecodedVolumeDescriptor DecodeJolietDescriptor(PrimaryVolumeDescriptor jolietvd) + { + DecodedVolumeDescriptor decodedVD = new DecodedVolumeDescriptor(); + + decodedVD.SystemIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.system_id).TrimEnd().Trim(new[] { '\u0000' }); + decodedVD.VolumeIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.volume_id).TrimEnd().Trim(new[] { '\u0000' }); + decodedVD.VolumeSetIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.volume_set_id).TrimEnd().Trim(new[] { '\u0000' }); + decodedVD.PublisherIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.publisher_id).TrimEnd().Trim(new[] { '\u0000' }); + decodedVD.DataPreparerIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.preparer_id).TrimEnd().Trim(new[] { '\u0000' }); + decodedVD.ApplicationIdentifier = Encoding.BigEndianUnicode.GetString(jolietvd.application_id).TrimEnd().Trim(new[] { '\u0000' }); + if(jolietvd.creation_date[0] < 0x31 || jolietvd.creation_date[0] > 0x39) + decodedVD.CreationTime = DateTime.MinValue; + else + decodedVD.CreationTime = DateHandlers.ISO9660ToDateTime(jolietvd.creation_date); + + if(jolietvd.modification_date[0] < 0x31 || jolietvd.modification_date[0] > 0x39) + { + decodedVD.HasModificationTime = false; + } + else + { + decodedVD.HasModificationTime = true; + decodedVD.ModificationTime = DateHandlers.ISO9660ToDateTime(jolietvd.modification_date); + } + + if(jolietvd.expiration_date[0] < 0x31 || jolietvd.expiration_date[0] > 0x39) + { + decodedVD.HasExpirationTime = false; + } + else + { + decodedVD.HasExpirationTime = true; + decodedVD.ExpirationTime = DateHandlers.ISO9660ToDateTime(jolietvd.expiration_date); + } + + if(jolietvd.effective_date[0] < 0x31 || jolietvd.effective_date[0] > 0x39) + { + decodedVD.HasEffectiveTime = false; + } + else + { + decodedVD.HasEffectiveTime = true; + decodedVD.EffectiveTime = DateHandlers.ISO9660ToDateTime(jolietvd.effective_date); + } + + return decodedVD; + } + + static DecodedVolumeDescriptor DecodeVolumeDescriptor(PrimaryVolumeDescriptor pvd) + { + DecodedVolumeDescriptor decodedVD = new DecodedVolumeDescriptor(); + + decodedVD.SystemIdentifier = Encoding.ASCII.GetString(pvd.system_id).TrimEnd().Trim(new[] { '\0' }); + decodedVD.VolumeIdentifier = Encoding.ASCII.GetString(pvd.volume_id).TrimEnd().Trim(new[] { '\0' }); + decodedVD.VolumeSetIdentifier = Encoding.ASCII.GetString(pvd.volume_set_id).TrimEnd().Trim(new[] { '\0' }); + decodedVD.PublisherIdentifier = Encoding.ASCII.GetString(pvd.publisher_id).TrimEnd().Trim(new[] { '\0' }); + decodedVD.DataPreparerIdentifier = Encoding.ASCII.GetString(pvd.preparer_id).TrimEnd().Trim(new[] { '\0' }); + decodedVD.ApplicationIdentifier = Encoding.ASCII.GetString(pvd.application_data).TrimEnd().Trim(new[] { '\0' }); + if(pvd.creation_date[0] == '0' || pvd.creation_date[0] == 0x00) + decodedVD.CreationTime = DateTime.MinValue; + else + decodedVD.CreationTime = DateHandlers.ISO9660ToDateTime(pvd.creation_date); + + if(pvd.modification_date[0] == '0' || pvd.modification_date[0] == 0x00) + { + decodedVD.HasModificationTime = false; + } + else + { + decodedVD.HasModificationTime = true; + decodedVD.ModificationTime = DateHandlers.ISO9660ToDateTime(pvd.modification_date); + } + + if(pvd.expiration_date[0] == '0' || pvd.expiration_date[0] == 0x00) + { + decodedVD.HasExpirationTime = false; + } + else + { + decodedVD.HasExpirationTime = true; + decodedVD.ExpirationTime = DateHandlers.ISO9660ToDateTime(pvd.expiration_date); + } + + if(pvd.effective_date[0] == '0' || pvd.effective_date[0] == 0x00) + { + decodedVD.HasEffectiveTime = false; + } + else + { + decodedVD.HasEffectiveTime = true; + decodedVD.EffectiveTime = DateHandlers.ISO9660ToDateTime(pvd.effective_date); + } + + return decodedVD; + } + } +} diff --git a/DiscImageChef.Filesystems/ISO9660/Super.cs b/DiscImageChef.Filesystems/ISO9660/Super.cs new file mode 100644 index 00000000..1e4a8dfa --- /dev/null +++ b/DiscImageChef.Filesystems/ISO9660/Super.cs @@ -0,0 +1,57 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Super.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Filesystems.ISO9660 +{ + public partial class ISO9660 : Filesystem + { + public override Errno Mount() + { + return Errno.NotImplemented; + } + + public override Errno Mount(bool debug) + { + return Errno.NotImplemented; + } + + public override Errno Unmount() + { + return Errno.NotImplemented; + } + + public override Errno StatFs(ref FileSystemInfo stat) + { + return Errno.NotImplemented; + } + } +} diff --git a/DiscImageChef.Filesystems/ISO9660/Xattr.cs b/DiscImageChef.Filesystems/ISO9660/Xattr.cs new file mode 100644 index 00000000..9c0a3d14 --- /dev/null +++ b/DiscImageChef.Filesystems/ISO9660/Xattr.cs @@ -0,0 +1,48 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Xattr.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ +using System.Collections.Generic; + +namespace DiscImageChef.Filesystems.ISO9660 +{ + public partial class ISO9660 : Filesystem + { + public override Errno ListXAttr(string path, ref List xattrs) + { + return Errno.NotImplemented; + } + + public override Errno GetXattr(string path, string xattr, ref byte[] buf) + { + return Errno.NotImplemented; + } + } +} diff --git a/DiscImageChef.Tests/Filesystems/ISO9660.cs b/DiscImageChef.Tests/Filesystems/ISO9660.cs index 9ddd5dbe..b1339827 100644 --- a/DiscImageChef.Tests/Filesystems/ISO9660.cs +++ b/DiscImageChef.Tests/Filesystems/ISO9660.cs @@ -142,7 +142,7 @@ namespace DiscImageChef.Tests.Filesystems Assert.AreEqual(mediatypes[i], image.ImageInfo.mediaType, testfiles[i]); Assert.AreEqual(sectors[i], image.ImageInfo.sectors, testfiles[i]); Assert.AreEqual(sectorsize[i], image.ImageInfo.sectorSize, testfiles[i]); - Filesystem fs = new ISO9660Plugin(); + Filesystem fs = new DiscImageChef.Filesystems.ISO9660.ISO9660(); Partition wholePart = new Partition { Name = "Whole device",