diff --git a/Aaru.Archives/Aaru.Archives.csproj.DotSettings b/Aaru.Archives/Aaru.Archives.csproj.DotSettings index 07960c943..9f75b5a63 100644 --- a/Aaru.Archives/Aaru.Archives.csproj.DotSettings +++ b/Aaru.Archives/Aaru.Archives.csproj.DotSettings @@ -4,6 +4,7 @@ xml:space="preserve"> True True + True True True True diff --git a/Aaru.Archives/Ha/Consts.cs b/Aaru.Archives/Ha/Consts.cs new file mode 100644 index 000000000..2a6147522 --- /dev/null +++ b/Aaru.Archives/Ha/Consts.cs @@ -0,0 +1,6 @@ +namespace Aaru.Archives; + +public sealed partial class Ha +{ + const ushort HA_MAGIC = 0x4148; +} \ No newline at end of file diff --git a/Aaru.Archives/Ha/Ha.cs b/Aaru.Archives/Ha/Ha.cs index e38a94948..bb5b28af0 100644 --- a/Aaru.Archives/Ha/Ha.cs +++ b/Aaru.Archives/Ha/Ha.cs @@ -10,7 +10,7 @@ public sealed partial class Ha : IArchive /// public string Name => "HA"; /// - public Guid Id { get; } + public Guid Id => new("2FB42964-82A0-4819-9C2D-CC2F24E35526"); /// public string Author => Authors.NataliaPortillo; /// diff --git a/Aaru.Archives/Ha/Info.cs b/Aaru.Archives/Ha/Info.cs new file mode 100644 index 000000000..3153d628c --- /dev/null +++ b/Aaru.Archives/Ha/Info.cs @@ -0,0 +1,62 @@ +using System.IO; +using System.Text; +using Aaru.CommonTypes.Interfaces; +using Aaru.Helpers; + +namespace Aaru.Archives; + +public sealed partial class Ha +{ +#region IArchive Members + + /// + public bool Identify(IFilter filter) + { + if(filter.DataForkLength < Marshal.SizeOf()) return false; + + Stream stream = filter.GetDataForkStream(); + stream.Position = 0; + + byte[] hdr = new byte[Marshal.SizeOf()]; + + stream.ReadExactly(hdr, 0, hdr.Length); + + HaHeader header = Marshal.ByteArrayToStructureLittleEndian(hdr); + + // Not a valid magic + return header.magic == HA_MAGIC; + } + + /// + public void GetInformation(IFilter filter, Encoding encoding, out string information) + { + information = ""; + + if(filter.DataForkLength < Marshal.SizeOf()) return; + + Stream stream = filter.GetDataForkStream(); + stream.Position = 0; + + byte[] hdr = new byte[Marshal.SizeOf()]; + + stream.ReadExactly(hdr, 0, hdr.Length); + + HaHeader header = Marshal.ByteArrayToStructureLittleEndian(hdr); + + // Not a valid magic + if(header.magic != HA_MAGIC) return; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.HA_archive); + + int vertype = stream.ReadByte(); + + sb.AppendFormat(Localization.Created_with_HA_version_0, vertype >> 4).AppendLine(); + + sb.AppendFormat(Localization.Archive_contains_0_files, header.count).AppendLine(); + + information = sb.ToString(); + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Archives/Ha/Structs.cs b/Aaru.Archives/Ha/Structs.cs new file mode 100644 index 000000000..8922bbb88 --- /dev/null +++ b/Aaru.Archives/Ha/Structs.cs @@ -0,0 +1,47 @@ +using System.Runtime.InteropServices; + +namespace Aaru.Archives; + +public sealed partial class Ha +{ +#region Nested type: FHeader + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + readonly struct FHeader + { + // First nibble is archive version, second nibble is compression type + public readonly byte VerType; + + // Compressed length + public readonly ushort clen; + + // Original length + public readonly ushort olen; + + // Unclear if DOS packed date or what + public readonly ushort date; + public readonly ushort time; + + // CRC32 + public readonly uint crc; + + // Follows null-terminated path + // Follows null-terminated filename + // Follows 1-byte machine dependent information length + // Follows machine dependent information + // Follows compressed data + } + +#endregion + +#region Nested type: HaHeader + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + readonly struct HaHeader + { + public readonly ushort magic; + public readonly ushort count; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Archives/Ha/Unimplemented.cs b/Aaru.Archives/Ha/Unimplemented.cs index 9548e3ad8..be6a1bc43 100644 --- a/Aaru.Archives/Ha/Unimplemented.cs +++ b/Aaru.Archives/Ha/Unimplemented.cs @@ -12,9 +12,6 @@ public sealed partial class Ha { #region IArchive Members - /// - public bool Identify(IFilter filter) => throw new NotImplementedException(); - /// public ErrorNumber Open(IFilter filter, Encoding encoding) => throw new NotImplementedException(); @@ -54,11 +51,5 @@ public sealed partial class Ha /// public ErrorNumber GetEntry(int entryNumber, out IFilter filter) => throw new NotImplementedException(); - /// - public void GetInformation(IFilter filter, Encoding encoding, out string information) - { - throw new NotImplementedException(); - } - #endregion } \ No newline at end of file diff --git a/Aaru.Archives/Localization/Localization.Designer.cs b/Aaru.Archives/Localization/Localization.Designer.cs index 0e7092805..04288ce2e 100644 --- a/Aaru.Archives/Localization/Localization.Designer.cs +++ b/Aaru.Archives/Localization/Localization.Designer.cs @@ -680,5 +680,23 @@ namespace Aaru.Archives { return ResourceManager.GetString("Archive_comment", resourceCulture); } } + + internal static string HA_archive { + get { + return ResourceManager.GetString("HA_archive", resourceCulture); + } + } + + internal static string Created_with_HA_version_0 { + get { + return ResourceManager.GetString("Created_with_HA_version_0", resourceCulture); + } + } + + internal static string Archive_contains_0_files { + get { + return ResourceManager.GetString("Archive_contains_0_files", resourceCulture); + } + } } } diff --git a/Aaru.Archives/Localization/Localization.es.resx b/Aaru.Archives/Localization/Localization.es.resx index f909f2567..c723101dd 100644 --- a/Aaru.Archives/Localization/Localization.es.resx +++ b/Aaru.Archives/Localization/Localization.es.resx @@ -333,4 +333,13 @@ [bold][blue]Archivo ARC[/][/] + + [bold][blue]Archivo HA[/][/] + + + [slateblue1]Creado con HA versión [green]{0}[/][/] + + + [slateblue1]El archivo contiene [green]{0}[/] ficheros[/] + \ No newline at end of file diff --git a/Aaru.Archives/Localization/Localization.resx b/Aaru.Archives/Localization/Localization.resx index 03164da76..c8cbb1d25 100644 --- a/Aaru.Archives/Localization/Localization.resx +++ b/Aaru.Archives/Localization/Localization.resx @@ -341,4 +341,13 @@ [bold][slateblue1]Archive comment:[/][/] + + [bold][blue]HA archive[/][/] + + + [slateblue1]Created with HA version [green]{0}[/][/] + + + [slateblue1]Archive contains [green]{0}[/] files[/] + \ No newline at end of file