diff --git a/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj b/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj index 777c64f84..adcf12614 100644 --- a/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj +++ b/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj @@ -66,6 +66,7 @@ + @@ -127,4 +128,4 @@ - \ No newline at end of file + diff --git a/DiscImageChef.CommonTypes/Interfaces/IArchive.cs b/DiscImageChef.CommonTypes/Interfaces/IArchive.cs new file mode 100644 index 000000000..b71dab40e --- /dev/null +++ b/DiscImageChef.CommonTypes/Interfaces/IArchive.cs @@ -0,0 +1,253 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : IArchive.cs +// Author(s) : Michael Drüing +// +// Component : Archives. +// +// --[ Description ] ---------------------------------------------------------- +// +// Defines the interface for an Archive. +// +// --[ 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-2019 Michael Drüing +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.IO; +using System.Collections.Generic; + +namespace DiscImageChef.CommonTypes.Interfaces +{ + [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, + }; + + public interface IArchive + { + /// Descriptive name of the plugin + string Name { get; } + + /// Unique UUID of the plugin + Guid Id { get; } + + /// + /// Identifies if the specified path contains data recognizable by this archive instance + /// + /// Path. + bool Identify(string path); + + /// + /// Identifies if the specified stream contains data recognizable by this archive instance + /// + /// Stream. + bool Identify(Stream stream); + + /// + /// Identifies if the specified buffer contains data recognizable by this archive instance + /// + /// Buffer. + bool Identify(byte[] buffer); + + /// + /// Opens the specified path with this archive instance + /// + /// Path. + void Open(string path); + + /// + /// Opens the specified stream with this archive instance + /// + /// Stream. + void Open(Stream stream); + + /// + /// Opens the specified buffer with this archive instance + /// + /// Buffer. + void Open(byte[] buffer); + + /// + /// 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. + /// + /// This should be a constant, tied to the archive type, not to the particular + /// features used by the currently-opened archive file. + /// + 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 retreive 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 retreive 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 retreive the XAttr. + /// Extended attribute, alternate data stream or fork name. + /// Buffer with the XAttr data. + byte[] GetXattr(int entryNumber, string xattr); + + /// + /// 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); + } +} +