From 9f927a8ed2c47af4a26f5e163007a4366e6ebb5a Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 23 Aug 2025 05:04:55 +0100 Subject: [PATCH] Implement detection of ZOO archives. --- Aaru.Archives/Zoo/Info.cs | 57 ++++++++++++++++++++++++++++++ Aaru.Archives/Zoo/Unimplemented.cs | 3 -- 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 Aaru.Archives/Zoo/Info.cs diff --git a/Aaru.Archives/Zoo/Info.cs b/Aaru.Archives/Zoo/Info.cs new file mode 100644 index 000000000..f50e53616 --- /dev/null +++ b/Aaru.Archives/Zoo/Info.cs @@ -0,0 +1,57 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Consts.cs +// Author(s) : Natalia Portillo +// +// Component : Zoo plugin. +// +// --[ 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-2025 Natalia Portillo +// ****************************************************************************/ + +using System.IO; +using Aaru.CommonTypes.Interfaces; +using Aaru.Helpers; + +namespace Aaru.Archives; + +public sealed partial class Zoo +{ +#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); + + ZooHeader header = Marshal.ByteArrayToStructureLittleEndian(hdr); + + return header.zoo_tag == ZOO_TAG && header.zoo_start + header.zoo_minus == 0; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Archives/Zoo/Unimplemented.cs b/Aaru.Archives/Zoo/Unimplemented.cs index 460268cc0..e9329b6f3 100644 --- a/Aaru.Archives/Zoo/Unimplemented.cs +++ b/Aaru.Archives/Zoo/Unimplemented.cs @@ -40,9 +40,6 @@ public sealed partial class Zoo { #region IArchive Members - /// - public bool Identify(IFilter filter) => throw new NotImplementedException(); - /// public ErrorNumber Open(IFilter filter, Encoding encoding) => throw new NotImplementedException();