// /*************************************************************************** // Aaru Data Preservation Suite // ---------------------------------------------------------------------------- // // Filename : IArchive.cs // Author(s) : Michael Drüing // // Component : Archives. // // --[ Description ] ---------------------------------------------------------- // // Defines the interface for implementing archive plugins. // // --[ 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 © 2018-2023 Michael Drüing // Copyright © 2011-2023 Natalia Portillo // ****************************************************************************/ // ReSharper disable UnusedMember.Global using System; using System.Collections.Generic; using System.IO; using System.Text; using Aaru.CommonTypes.Enums; namespace Aaru.CommonTypes.Interfaces; /// Supported archive features [Flags] public enum ArchiveSupportedFeature : uint { /// The archive supports filenames for its entries. If this flag is not set, files can only be accessed by number. SupportsFilenames = 1 << 0, /// /// The archive supports compression. If this flag is not set, compressed and uncompressed lengths are always the /// same. /// SupportsCompression = 1 << 1, /// /// The archive supports subdirectories. If this flag is not set, all filenames are guaranteed to not contain any /// "/" character. /// SupportsSubdirectories = 1 << 2, /// /// The archive supports explicit entries for directories (like Zip, for example). If this flag is not set, /// directories are implicit by the relative name of the files. /// HasExplicitDirectories = 1 << 3, /// The archive stores a timestamp with each entry if this flag is set. HasEntryTimestamp = 1 << 4, /// If this flag is set, individual files or the whole archive might be encrypted or password-protected. SupportsProtection = 1 << 5, // TODO: not implemented yet /// If this flag is set, the archive supports returning extended attributes (Xattrs) for each entry. SupportsXAttrs = 1 << 6 } /// Defines the interface to handle an archive (e.g. ZIP, WAD, etc) public interface IArchive { /// Descriptive name of the plugin string Name { get; } /// Unique UUID of the plugin Guid Id { get; } /// Plugin author string Author { get; } /// Identifies if the specified filter contains data recognizable by this archive instance /// Filter that contains the archive. This allows use to handle .tar.gz and similars. bool Identify(IFilter filter); /// Opens the specified stream with this archive instance /// Filter that contains the archive. This allows use to handle .tar.gz and similars. ErrorNumber Open(IFilter filter, Encoding encoding); /// /// Returns true if the archive has a file/stream/buffer currently opened and no /// has been issued. /// bool IsOpened(); /// Closes all opened streams. void Close(); /// Return a bitfield indicating the features supported by this archive type. /// The ArchiveSupportedFeature bitfield. /// /// If the archive is not opened, this returns the capabilities of the archive format, otherwise it returns the /// capabilities in use by the currently opened archive. /// ArchiveSupportedFeature GetArchiveFeatures(); /// Gets the number of entries (i.e. files) that are contained in this archive. /// /// Entries in this context can also mean directories or volume labels, for some types of archives that store /// these explicitly. Do not rely on all entries being regular files! /// /// The number of files. int GetNumberOfEntries(); /// Gets the file name (and path) of the given entry in the archive. /// /// The path components are separated by a forward slash "/".
The path should not start with a leading /// slash (i.e. it should be relative, not absolute). ///
/// /// The entry in the archive for which to return the file name. /// The file name, with (relative) path string GetFilename(int entryNumber); /// /// Gets the entry number for a particular file path in the archive. fileName is the relative path of the /// file in the archive. If the file cannot be found, -1 is returned. /// /// /// The path should be relative (no leading slash), using regular slashes as path separator, and be normalized, /// i.e. no "foo//bar" or "foo/../bar" path components. /// /// The relative path for which to get the entry number. /// If set, do a case insensitive matching and return the first file that matches. /// The number of the entry corresponding to the given path, or -1 if the path does not exist. int GetEntryNumber(string fileName, bool caseInsensitiveMatch); /// Gets the (compressed) size of the given entry. /// The entry for which to get the compressed size. /// The compressed size of the entry, or 0 if the entry is not a regular file. /// The return value is equal to the return value of GetUncompressedSize() if the file is not compressed. /// long GetCompressedSize(int entryNumber); /// Gets the uncompressed size of the given entry. /// The entry for which to get the uncompressed size. /// The uncompressed size of the entry, or 0 if the entry is not a regular file. /// The return value is equal to the return value of GetCompressedSize() if the file is not compressed. /// long GetUncompressedSize(int entryNumber); /// Gets the attributes of a file or directory. /// /// Error number. /// The entry in the archive for which to retrieve the attributes. /// File attributes, or zero if the archive does not support attributes. FileAttributes GetAttributes(int entryNumber); /// Lists all extended attributes, alternate data streams and forks of the given file. /// The entry in the archive for which to retrieve the list of attributes. /// List of extended attributes, alternate data streams and forks. List GetXAttrs(int entryNumber); /// Reads an extended attribute, alternate data stream or fork from the given file. /// Error number. /// The entry in the archive for which to retrieve the XAttr. /// Extended attribute, alternate data stream or fork name. /// Buffer where the extended attribute data will be stored. /// Buffer with the XAttr data. ErrorNumber GetXattr(int entryNumber, string xattr, out byte[] buffer); /// Gets information about an entry in the archive. /// Note that some of the data might be incomplete or not available at all, depending on the type of archive. /// /// /// The entry int he archive for which to get the information /// The available information about the entry in the archive FileSystemInfo Stat(int entryNumber); /// /// Returns the Filter for the given entry. It will return null if the entry in question is not a regular /// file (i.e. directory, volume label, etc.) /// /// The entry for which the Filter should be returned. /// The Filter for the given entry. IFilter GetEntry(int entryNumber); void GetInformation(IFilter filter, Encoding encoding, out string information); }