From 3a45dcc1a5add3104c72bebc7880865ddc692983 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 15 Feb 2018 22:06:20 -0800 Subject: [PATCH] [Enums, FileTypes/, Utilities] Use new enum, new class Add a new "BaseFile" class for potential future use. This should be the "base" for all future files and folders that could exist. This is likely to change over time. --- SabreTools.Library/Data/Enums.cs | 12 ++- SabreTools.Library/FileTypes/BaseArchive.cs | 8 +- SabreTools.Library/FileTypes/BaseFile.cs | 92 +++++++++++++++++++ SabreTools.Library/FileTypes/CHDFile.cs | 3 +- .../FileTypes/CoreRarArchive.cs | 54 ++++++++++- SabreTools.Library/FileTypes/Folder.cs | 2 + SabreTools.Library/FileTypes/GZipArchive.cs | 4 +- SabreTools.Library/FileTypes/LRZipArchive.cs | 3 +- SabreTools.Library/FileTypes/LZ4Archive.cs | 3 +- SabreTools.Library/FileTypes/RarArchive.cs | 8 +- .../FileTypes/SevenZipArchive.cs | 4 +- SabreTools.Library/FileTypes/TapeArchive.cs | 3 +- .../FileTypes/TorrentZipArchive.cs | 3 +- SabreTools.Library/FileTypes/XZArchive.cs | 3 +- SabreTools.Library/FileTypes/ZPAQArchive.cs | 3 +- SabreTools.Library/FileTypes/ZstdArchive.cs | 3 +- SabreTools.Library/SabreTools.Library.csproj | 1 + SabreTools.Library/Tools/Utilities.cs | 19 ++-- 18 files changed, 192 insertions(+), 36 deletions(-) create mode 100644 SabreTools.Library/FileTypes/BaseFile.cs diff --git a/SabreTools.Library/Data/Enums.cs b/SabreTools.Library/Data/Enums.cs index ff3f857a..43dec0a9 100644 --- a/SabreTools.Library/Data/Enums.cs +++ b/SabreTools.Library/Data/Enums.cs @@ -96,13 +96,21 @@ { None = 0, + // Bare types + CHD, + Folder, + // Archival types SevenZipArchive, - CHD, GZipArchive, + LRZipArchive, + LZ4Archive, RarArchive, - TarArchive, + TapeArchive, + XZArchive, ZipArchive, + ZPAQArchive, + ZstdArchive, } /// diff --git a/SabreTools.Library/FileTypes/BaseArchive.cs b/SabreTools.Library/FileTypes/BaseArchive.cs index f270a12d..e852bbf9 100644 --- a/SabreTools.Library/FileTypes/BaseArchive.cs +++ b/SabreTools.Library/FileTypes/BaseArchive.cs @@ -9,20 +9,16 @@ using System.IO; using MemoryStream = System.IO.MemoryStream; using Stream = System.IO.Stream; #endif -using SharpCompress.Common; namespace SabreTools.Library.FileTypes { - public abstract class BaseArchive + public abstract class BaseArchive : BaseFile { #region Protected instance variables // Buffer size used by archives protected const int _bufferSize = 4096 * 128; - protected ArchiveType _archiveType; - protected string _filename; - #endregion #region Construtors @@ -39,8 +35,8 @@ namespace SabreTools.Library.FileTypes /// /// Name of the file to use as an archive public BaseArchive(string filename) + : base(filename) { - _filename = filename; } #endregion diff --git a/SabreTools.Library/FileTypes/BaseFile.cs b/SabreTools.Library/FileTypes/BaseFile.cs new file mode 100644 index 00000000..072609ab --- /dev/null +++ b/SabreTools.Library/FileTypes/BaseFile.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; + +using SabreTools.Library.Data; + +namespace SabreTools.Library.FileTypes +{ + public abstract class BaseFile + { + #region Protected instance variables + + protected FileType _fileType; + protected string _filename; + protected List _children; + + // External hash values for the file + protected long? _size; + protected byte[] _crc; + protected byte[] _md5; + protected byte[] _sha1; + protected byte[] _sha256; + protected byte[] _sha384; + protected byte[] _sha512; + + #endregion + + #region Publicly facing variables + + // TODO: Get all of these values automatically so there is no public "set" + public string Filename + { + get { return _filename; } + set { _filename = value; } + } + public long? Size + { + get { return _size; } + set { _size = value; } + } + public byte[] CRC + { + get { return _crc; } + set { _crc = value; } + } + public byte[] MD5 + { + get { return _md5; } + set { _md5 = value; } + } + public byte[] SHA1 + { + get { return _sha1; } + set { _sha1 = value; } + } + public byte[] SHA256 + { + get { return _sha256; } + set { _sha256 = value; } + } + public byte[] SHA384 + { + get { return _sha384; } + set { _sha384 = value; } + } + public byte[] SHA512 + { + get { return _sha512; } + set { _sha512 = value; } + } + + #endregion + + #region Construtors + + /// + /// Create a new Archive with no base file + /// + public BaseFile() + { + } + + /// + /// Create a new Archive from the given file + /// + /// Name of the file to use as an archive + public BaseFile(string filename) + { + _filename = filename; + } + + #endregion + } +} diff --git a/SabreTools.Library/FileTypes/CHDFile.cs b/SabreTools.Library/FileTypes/CHDFile.cs index b423367f..d95cb821 100644 --- a/SabreTools.Library/FileTypes/CHDFile.cs +++ b/SabreTools.Library/FileTypes/CHDFile.cs @@ -88,7 +88,7 @@ namespace SabreTools.Library.FileTypes /// 0x68-0x7b - Parent SHA-1 /// ---------------------------------------------- /// - public class CHDFile : IDisposable + public class CHDFile : BaseFile, IDisposable { #region Private instance variables @@ -122,6 +122,7 @@ namespace SabreTools.Library.FileTypes /// Stream representing the CHD file public CHDFile(Stream chdstream) { + _fileType = FileType.CHD; m_br = new BinaryReader(chdstream); } diff --git a/SabreTools.Library/FileTypes/CoreRarArchive.cs b/SabreTools.Library/FileTypes/CoreRarArchive.cs index 69a5967a..d81d4931 100644 --- a/SabreTools.Library/FileTypes/CoreRarArchive.cs +++ b/SabreTools.Library/FileTypes/CoreRarArchive.cs @@ -1,7 +1,8 @@ using System; using System.Collections.Generic; - +using System.IO; using SabreTools.Library.Data; +using SabreTools.Library.DatItems; /// /// This code is based on the header format described at http://www.rarlab.com/technote.htm#srvheaders @@ -116,7 +117,7 @@ using SabreTools.Library.Data; /// namespace SabreTools.Library.FileTypes { - public class CoreRarArchive + public class CoreRarArchive : BaseArchive { // SFX Module Information public byte[] SFX; @@ -148,6 +149,55 @@ namespace SabreTools.Library.FileTypes // Entry Information public List Entries = new List(); + + #region Unimplemented methods + + public override bool ExtractAll(string outDir) + { + throw new NotImplementedException(); + } + + public override string ExtractEntry(string entryName, string outDir) + { + throw new NotImplementedException(); + } + + public override (MemoryStream, string) ExtractEntryStream(string entryName) + { + throw new NotImplementedException(); + } + + public override List GetArchiveFileInfo(Hash omitFromScan = Hash.DeepHashes, bool date = false) + { + throw new NotImplementedException(); + } + + public override List GetEmptyFolders() + { + throw new NotImplementedException(); + } + + public override bool IsTorrent() + { + throw new NotImplementedException(); + } + + public override bool Write(string inputFile, string outDir, Rom rom, bool date = false, bool romba = false) + { + throw new NotImplementedException(); + } + + public override bool Write(Stream inputStream, string outDir, Rom rom, bool date = false, bool romba = false) + { + throw new NotImplementedException(); + } + + public override bool Write(List inputFiles, string outDir, List roms, bool date = false, bool romba = false) + { + throw new NotImplementedException(); + } + + #endregion } public class CoreRarArchiveEntry diff --git a/SabreTools.Library/FileTypes/Folder.cs b/SabreTools.Library/FileTypes/Folder.cs index a2fbe6c7..69cde234 100644 --- a/SabreTools.Library/FileTypes/Folder.cs +++ b/SabreTools.Library/FileTypes/Folder.cs @@ -37,6 +37,7 @@ namespace SabreTools.Library.FileTypes public Folder() : base() { + _fileType = FileType.Folder; } /// @@ -47,6 +48,7 @@ namespace SabreTools.Library.FileTypes public Folder(string filename) : base(filename) { + _fileType = FileType.Folder; } #endregion diff --git a/SabreTools.Library/FileTypes/GZipArchive.cs b/SabreTools.Library/FileTypes/GZipArchive.cs index f102dc0b..98ef07fa 100644 --- a/SabreTools.Library/FileTypes/GZipArchive.cs +++ b/SabreTools.Library/FileTypes/GZipArchive.cs @@ -21,7 +21,6 @@ using SeekOrigin = System.IO.SeekOrigin; using Stream = System.IO.Stream; #endif using Ionic.Zlib; -using SharpCompress.Common; namespace SabreTools.Library.FileTypes { @@ -38,6 +37,7 @@ namespace SabreTools.Library.FileTypes public GZipArchive() : base() { + _fileType = FileType.GZipArchive; } /// @@ -48,7 +48,7 @@ namespace SabreTools.Library.FileTypes public GZipArchive(string filename) : base(filename) { - _archiveType = ArchiveType.GZip; + _fileType = FileType.GZipArchive; } #endregion diff --git a/SabreTools.Library/FileTypes/LRZipArchive.cs b/SabreTools.Library/FileTypes/LRZipArchive.cs index 9cb46e0e..212f6c1b 100644 --- a/SabreTools.Library/FileTypes/LRZipArchive.cs +++ b/SabreTools.Library/FileTypes/LRZipArchive.cs @@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes public LRZipArchive() : base() { + _fileType = FileType.LRZipArchive; } /// @@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes public LRZipArchive(string filename) : base(filename) { - //_archiveType = ArchiveType.LRZip; + _fileType = FileType.LRZipArchive; } #endregion diff --git a/SabreTools.Library/FileTypes/LZ4Archive.cs b/SabreTools.Library/FileTypes/LZ4Archive.cs index 9ef909e3..bd20b142 100644 --- a/SabreTools.Library/FileTypes/LZ4Archive.cs +++ b/SabreTools.Library/FileTypes/LZ4Archive.cs @@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes public LZ4Archive() : base() { + _fileType = FileType.LZ4Archive; } /// @@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes public LZ4Archive(string filename) : base(filename) { - //_archiveType = ArchiveType.LRZip; + _fileType = FileType.LZ4Archive; } #endregion diff --git a/SabreTools.Library/FileTypes/RarArchive.cs b/SabreTools.Library/FileTypes/RarArchive.cs index 81451b26..e543f1f7 100644 --- a/SabreTools.Library/FileTypes/RarArchive.cs +++ b/SabreTools.Library/FileTypes/RarArchive.cs @@ -20,7 +20,6 @@ using Stream = System.IO.Stream; #endif using SharpCompress.Archives; using SharpCompress.Archives.Rar; -using SharpCompress.Common; using SharpCompress.Readers; namespace SabreTools.Library.FileTypes @@ -38,6 +37,7 @@ namespace SabreTools.Library.FileTypes public RarArchive() : base() { + _fileType = FileType.RarArchive; } /// @@ -48,7 +48,7 @@ namespace SabreTools.Library.FileTypes public RarArchive(string filename) : base(filename) { - _archiveType = ArchiveType.Rar; + _fileType = FileType.RarArchive; } #endregion @@ -252,13 +252,13 @@ namespace SabreTools.Library.FileTypes // Check for the signature first (Skipping the SFX Module) byte[] signature = br.ReadBytes(8); int startpos = 0; - while (startpos < Constants.MibiByte && BitConverter.ToString(signature, 0, 7) != Constants.RarSignature && BitConverter.ToString(signature) != Constants.RarFiveSig) + while (startpos < Constants.MibiByte && !signature.StartsWith(Constants.RarSignature, exact: true) && !signature.StartsWith(Constants.RarFiveSignature, exact: true)) { startpos++; br.BaseStream.Position = startpos; signature = br.ReadBytes(8); } - if (BitConverter.ToString(signature, 0, 7) != Constants.RarSignature && BitConverter.ToString(signature) != Constants.RarFiveSig) + if (!signature.StartsWith(Constants.RarSignature, exact: true) && !signature.StartsWith(Constants.RarFiveSignature, exact: true)) { return; } diff --git a/SabreTools.Library/FileTypes/SevenZipArchive.cs b/SabreTools.Library/FileTypes/SevenZipArchive.cs index 7ae2b907..9f577eac 100644 --- a/SabreTools.Library/FileTypes/SevenZipArchive.cs +++ b/SabreTools.Library/FileTypes/SevenZipArchive.cs @@ -22,7 +22,6 @@ using ROMVault2.SupportedFiles.Zip; using SevenZip; // TODO: Remove this when 7zip write is implemented in SharpCompress using SharpCompress.Archives; using SharpCompress.Archives.SevenZip; -using SharpCompress.Common; using SharpCompress.Readers; namespace SabreTools.Library.FileTypes @@ -41,6 +40,7 @@ namespace SabreTools.Library.FileTypes public SevenZipArchive() : base() { + _fileType = FileType.SevenZipArchive; } /// @@ -51,7 +51,7 @@ namespace SabreTools.Library.FileTypes public SevenZipArchive(string filename) : base(filename) { - _archiveType = ArchiveType.SevenZip; + _fileType = FileType.SevenZipArchive; } #endregion diff --git a/SabreTools.Library/FileTypes/TapeArchive.cs b/SabreTools.Library/FileTypes/TapeArchive.cs index e6d25496..b2d90863 100644 --- a/SabreTools.Library/FileTypes/TapeArchive.cs +++ b/SabreTools.Library/FileTypes/TapeArchive.cs @@ -40,6 +40,7 @@ namespace SabreTools.Library.FileTypes public TapeArchive() : base() { + _fileType = FileType.TapeArchive; } /// @@ -50,7 +51,7 @@ namespace SabreTools.Library.FileTypes public TapeArchive(string filename) : base(filename) { - _archiveType = ArchiveType.Tar; + _fileType = FileType.TapeArchive; } #endregion diff --git a/SabreTools.Library/FileTypes/TorrentZipArchive.cs b/SabreTools.Library/FileTypes/TorrentZipArchive.cs index 8aa6615f..340254b0 100644 --- a/SabreTools.Library/FileTypes/TorrentZipArchive.cs +++ b/SabreTools.Library/FileTypes/TorrentZipArchive.cs @@ -36,6 +36,7 @@ namespace SabreTools.Library.FileTypes public TorrentZipArchive() : base() { + _fileType = FileType.ZipArchive; } /// @@ -46,7 +47,7 @@ namespace SabreTools.Library.FileTypes public TorrentZipArchive(string filename) : base(filename) { - _archiveType = ArchiveType.Zip; + _fileType = FileType.ZipArchive; } #endregion diff --git a/SabreTools.Library/FileTypes/XZArchive.cs b/SabreTools.Library/FileTypes/XZArchive.cs index f84ab620..90f85ce3 100644 --- a/SabreTools.Library/FileTypes/XZArchive.cs +++ b/SabreTools.Library/FileTypes/XZArchive.cs @@ -40,6 +40,7 @@ namespace SabreTools.Library.FileTypes public XZArchive() : base() { + _fileType = FileType.XZArchive; } /// @@ -50,7 +51,7 @@ namespace SabreTools.Library.FileTypes public XZArchive(string filename) : base(filename) { - //_archiveType = ArchiveType.XZip; + _fileType = FileType.XZArchive; } #endregion diff --git a/SabreTools.Library/FileTypes/ZPAQArchive.cs b/SabreTools.Library/FileTypes/ZPAQArchive.cs index 487b520a..969dafda 100644 --- a/SabreTools.Library/FileTypes/ZPAQArchive.cs +++ b/SabreTools.Library/FileTypes/ZPAQArchive.cs @@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes public ZPAQArchive() : base() { + _fileType = FileType.ZPAQArchive; } /// @@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes public ZPAQArchive(string filename) : base(filename) { - //_archiveType = ArchiveType.LRZip; + _fileType = FileType.ZPAQArchive; } #endregion diff --git a/SabreTools.Library/FileTypes/ZstdArchive.cs b/SabreTools.Library/FileTypes/ZstdArchive.cs index ddae145a..3e861b35 100644 --- a/SabreTools.Library/FileTypes/ZstdArchive.cs +++ b/SabreTools.Library/FileTypes/ZstdArchive.cs @@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes public ZstdArchive() : base() { + _fileType = FileType.ZstdArchive; } /// @@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes public ZstdArchive(string filename) : base(filename) { - //_archiveType = ArchiveType.LRZip; + _fileType = FileType.ZstdArchive; } #endregion diff --git a/SabreTools.Library/SabreTools.Library.csproj b/SabreTools.Library/SabreTools.Library.csproj index 035fe3aa..c9272f63 100644 --- a/SabreTools.Library/SabreTools.Library.csproj +++ b/SabreTools.Library/SabreTools.Library.csproj @@ -133,6 +133,7 @@ + diff --git a/SabreTools.Library/Tools/Utilities.cs b/SabreTools.Library/Tools/Utilities.cs index 5092b451..1e6d237b 100644 --- a/SabreTools.Library/Tools/Utilities.cs +++ b/SabreTools.Library/Tools/Utilities.cs @@ -466,13 +466,12 @@ namespace SabreTools.Library.Tools case FileType.SevenZipArchive: archive = new SevenZipArchive(input); break; - case FileType.TarArchive: + case FileType.TapeArchive: archive = new TapeArchive(input); break; case FileType.ZipArchive: archive = new TorrentZipArchive(input); break; - case FileType.CHD: default: // We ignore these types for now break; @@ -496,7 +495,7 @@ namespace SabreTools.Library.Tools return new RarArchive(); case FileType.SevenZipArchive: return new SevenZipArchive(); - case FileType.TarArchive: + case FileType.TapeArchive: return new TapeArchive(); case FileType.ZipArchive: return new TorrentZipArchive(); @@ -1320,7 +1319,7 @@ namespace SabreTools.Library.Tools } else if (magic.StartsWith(Constants.TarSignature) || magic.StartsWith(Constants.TarZeroSignature)) { - outFileType = FileType.TarArchive; + outFileType = FileType.TapeArchive; } else if (magic.StartsWith(Constants.ZipSignature) || magic.StartsWith(Constants.ZipSignatureEmpty) || magic.StartsWith(Constants.ZipSignatureSpanned)) { @@ -1350,12 +1349,7 @@ namespace SabreTools.Library.Tools FileType? fileType = GetFileType(input); switch (fileType) - { - case FileType.CHD: - case null: - shouldExternalProcess = true; - shouldInternalProcess = false; - break; + { case FileType.GZipArchive: shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.GZipExternal) != 0); shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.GZipInternal) != 0); @@ -1372,6 +1366,11 @@ namespace SabreTools.Library.Tools shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.ZipExternal) != 0); shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.ZipInternal) != 0); break; + case null: + default: + shouldExternalProcess = true; + shouldInternalProcess = false; + break; } }