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