From fec1d15a1ff215e56ac13d29ca56b96f1787f1fb Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 5 Oct 2016 17:23:44 -0700 Subject: [PATCH] [SimpleSort, ALL] Consolodate ArchiveScanLevel to a single flag --- SabreTools.Helper/Data/Enums.cs | 10 -- SabreTools.Helper/Data/Flags.cs | 27 +++++ SabreTools.Helper/Objects/Dat/DatFile.cs | 13 +-- SabreTools.Helper/Objects/SimpleSort.cs | 31 ++---- SabreTools.Helper/Tools/ArchiveTools.cs | 134 ++++++++++++++++------- SabreTools/Partials/SabreTools_Inits.cs | 10 +- SimpleSort/SimpleSortApp.cs | 10 +- 7 files changed, 153 insertions(+), 82 deletions(-) diff --git a/SabreTools.Helper/Data/Enums.cs b/SabreTools.Helper/Data/Enums.cs index dafe8081..20691f94 100644 --- a/SabreTools.Helper/Data/Enums.cs +++ b/SabreTools.Helper/Data/Enums.cs @@ -140,16 +140,6 @@ ERROR, } - /// - /// Determines the level to scan archives at - /// - public enum ArchiveScanLevel - { - Both = 0, - Internal, - External, - } - #endregion #region Archival diff --git a/SabreTools.Helper/Data/Flags.cs b/SabreTools.Helper/Data/Flags.cs index 6e630e72..0fb52ef5 100644 --- a/SabreTools.Helper/Data/Flags.cs +++ b/SabreTools.Helper/Data/Flags.cs @@ -92,6 +92,33 @@ namespace SabreTools.Helper Bit2 = 0x0004, } + /// + /// Determines the level to scan archives at + /// + [Flags] + public enum ArchiveScanLevel + { + // 7zip + SevenZipExternal = 0x0001, + SevenZipInternal = 0x0002, + SevenZipBoth = SevenZipExternal | SevenZipInternal, + + // GZip + GZipExternal = 0x0010, + GZipInternal = 0x0020, + GZipBoth = GZipExternal | GZipInternal, + + // RAR + RarExternal = 0x0100, + RarInternal = 0x0200, + RarBoth = RarExternal | RarInternal, + + // Zip + ZipExternal = 0x1000, + ZipInternal = 0x2000, + ZipBoth = ZipExternal | ZipInternal, + } + /// /// Zipfile special status /// diff --git a/SabreTools.Helper/Objects/Dat/DatFile.cs b/SabreTools.Helper/Objects/Dat/DatFile.cs index 627c96e5..e418ad05 100644 --- a/SabreTools.Helper/Objects/Dat/DatFile.cs +++ b/SabreTools.Helper/Objects/Dat/DatFile.cs @@ -4913,13 +4913,12 @@ namespace SabreTools.Helper // Otherwise, attempt to extract the files to the temporary directory else { - bool encounteredErrors = ArchiveTools.ExtractArchive(newItem, - tempSubDir, - (archivesAsFiles ? ArchiveScanLevel.External : ArchiveScanLevel.Internal), - (!archivesAsFiles && enableGzip ? ArchiveScanLevel.Internal : ArchiveScanLevel.External), - (archivesAsFiles ? ArchiveScanLevel.External : ArchiveScanLevel.Internal), - (archivesAsFiles ? ArchiveScanLevel.External : ArchiveScanLevel.Internal), - logger); + ArchiveScanLevel asl = (archivesAsFiles ? ArchiveScanLevel.SevenZipExternal : ArchiveScanLevel.SevenZipInternal) + | (!archivesAsFiles && enableGzip ? ArchiveScanLevel.GZipInternal : ArchiveScanLevel.GZipExternal) + | (archivesAsFiles ? ArchiveScanLevel.RarExternal : ArchiveScanLevel.RarInternal) + | (archivesAsFiles ? ArchiveScanLevel.ZipExternal : ArchiveScanLevel.ZipInternal); + + bool encounteredErrors = ArchiveTools.ExtractArchive(newItem, tempSubDir, asl, logger); // If the file was an archive and was extracted successfully, check it if (!encounteredErrors) diff --git a/SabreTools.Helper/Objects/SimpleSort.cs b/SabreTools.Helper/Objects/SimpleSort.cs index 43099594..38fea0c7 100644 --- a/SabreTools.Helper/Objects/SimpleSort.cs +++ b/SabreTools.Helper/Objects/SimpleSort.cs @@ -20,10 +20,7 @@ namespace SabreTools.Helper private bool? _torrentX; // True is for TorrentZip, False is for TorrentGZ, Null is for standard zip private bool _romba; private bool _updateDat; - private ArchiveScanLevel _7z; - private ArchiveScanLevel _gz; - private ArchiveScanLevel _rar; - private ArchiveScanLevel _zip; + private ArchiveScanLevel _archiveScanLevel; private Logger _logger; private int _maxDegreeOfParallelism = 4; // Hardcoded for now, should be an input later @@ -45,15 +42,12 @@ namespace SabreTools.Helper /// True if input files should be deleted, false otherwise /// True is for TorrentZip, False is for TorrentGZ, Null is for standard zip /// True if files should be output in Romba depot folders, false otherwise - /// Integer representing the archive handling level for 7z - /// Integer representing the archive handling level for GZip - /// Integer representing the archive handling level for RAR - /// Integer representing the archive handling level for Zip + /// ArchiveScanLevel representing the archive handling levels /// True if the updated DAT should be output, false otherwise /// Logger object for file and console output public SimpleSort(DatFile datdata, List inputs, string outDir, string tempDir, - bool quickScan, bool toFolder, bool verify, bool delete, bool? torrentX, bool romba, int sevenzip, - int gz, int rar, int zip, bool updateDat, Logger logger) + bool quickScan, bool toFolder, bool verify, bool delete, bool? torrentX, bool romba, + ArchiveScanLevel archiveScanLevel, bool updateDat, Logger logger) { _datdata = datdata; _inputs = inputs; @@ -65,10 +59,7 @@ namespace SabreTools.Helper _delete = delete; _torrentX = torrentX; _romba = romba; - _7z = (ArchiveScanLevel)(sevenzip < 0 || sevenzip > 2 ? 0 : sevenzip); - _gz = (ArchiveScanLevel)(gz < 0 || gz > 2 ? 0 : gz); - _rar = (ArchiveScanLevel)(rar < 0 || rar > 2 ? 0 : rar); - _zip = (ArchiveScanLevel)(zip < 0 || zip > 2 ? 0 : zip); + _archiveScanLevel = archiveScanLevel; _updateDat = updateDat; _logger = logger; @@ -300,7 +291,7 @@ namespace SabreTools.Helper // Get if the file should be scanned internally and externally bool shouldExternalScan, shouldInternalScan; - ArchiveTools.GetInternalExternalProcess(input, _7z, _gz, _rar, _zip, _logger, out shouldExternalScan, out shouldInternalScan); + ArchiveTools.GetInternalExternalProcess(input, _archiveScanLevel, _logger, out shouldExternalScan, out shouldInternalScan); // Hash and match the external files if (shouldExternalScan) @@ -598,7 +589,7 @@ namespace SabreTools.Helper else { // Now, if the file is a supported archive type, also run on all files within - bool encounteredErrors = ArchiveTools.ExtractArchive(input, _tempDir, _7z, _gz, _rar, _zip, _logger); + bool encounteredErrors = ArchiveTools.ExtractArchive(input, _tempDir, _archiveScanLevel, _logger); // Remove the current file if we are in recursion so it's not picked up in the next step if (recurse) @@ -698,7 +689,7 @@ namespace SabreTools.Helper { // Get if the file should be scanned internally and externally bool shouldExternalScan, shouldInternalScan; - ArchiveTools.GetInternalExternalProcess(file, _7z, _gz, _rar, _zip, _logger, out shouldExternalScan, out shouldInternalScan); + ArchiveTools.GetInternalExternalProcess(file, _archiveScanLevel, _logger, out shouldExternalScan, out shouldInternalScan); // Hash and match the external files if (shouldExternalScan) @@ -726,7 +717,7 @@ namespace SabreTools.Helper else { // Now, if the file is a supported archive type, also run on all files within - bool encounteredErrors = ArchiveTools.ExtractArchive(file, _tempDir, _7z, _gz, _rar, _zip, _logger); + bool encounteredErrors = ArchiveTools.ExtractArchive(file, _tempDir, _archiveScanLevel, _logger); // If we succeeded in extracting, loop through the files if (!encounteredErrors) @@ -1035,7 +1026,7 @@ namespace SabreTools.Helper // Get if the file should be scanned internally and externally bool shouldExternalProcess, shouldInternalProcess; - ArchiveTools.GetInternalExternalProcess(input, _7z, _gz, _rar, _zip, _logger, out shouldExternalProcess, out shouldInternalProcess); + ArchiveTools.GetInternalExternalProcess(input, _archiveScanLevel, _logger, out shouldExternalProcess, out shouldInternalProcess); // Do an external scan of the file, if necessary if (shouldExternalProcess) @@ -1059,7 +1050,7 @@ namespace SabreTools.Helper if (shouldInternalProcess) { // Now, if the file is a supported archive type, also run on all files within - bool encounteredErrors = ArchiveTools.ExtractArchive(input, _tempDir, _7z, _gz, _rar, _zip, _logger); + bool encounteredErrors = ArchiveTools.ExtractArchive(input, _tempDir, _archiveScanLevel, _logger); // If no errors were encountered, we loop through the temp directory if (!encounteredErrors) diff --git a/SabreTools.Helper/Tools/ArchiveTools.cs b/SabreTools.Helper/Tools/ArchiveTools.cs index 744417c5..eecd9b87 100644 --- a/SabreTools.Helper/Tools/ArchiveTools.cs +++ b/SabreTools.Helper/Tools/ArchiveTools.cs @@ -69,7 +69,7 @@ namespace SabreTools.Helper /// True if the extraction was a success, false otherwise public static bool ExtractArchive(string input, string tempDir, Logger logger) { - return ExtractArchive(input, tempDir, ArchiveScanLevel.Both, ArchiveScanLevel.External, ArchiveScanLevel.External, ArchiveScanLevel.Both, logger); + return ExtractArchive(input, tempDir, GetArchiveScanLevelFromNumbers(0, 2, 2, 0), logger); } /// @@ -77,30 +77,10 @@ namespace SabreTools.Helper /// /// Name of the file to be extracted /// Temporary directory for archive extraction - /// Integer representing the archive handling level for 7z - /// Integer representing the archive handling level for GZip - /// Integer representing the archive handling level for RAR - /// Integer representing the archive handling level for Zip + /// ArchiveScanLevel representing the archive handling levels /// Logger object for file and console output /// True if the extraction was a success, false otherwise - public static bool ExtractArchive(string input, string tempDir, int sevenzip, int gz, int rar, int zip, Logger logger) - { - return ExtractArchive(input, tempDir, (ArchiveScanLevel)sevenzip, (ArchiveScanLevel)gz, (ArchiveScanLevel)rar, (ArchiveScanLevel)zip, logger); - } - - /// - /// Attempt to extract a file as an archive - /// - /// Name of the file to be extracted - /// Temporary directory for archive extraction - /// Archive handling level for 7z - /// Archive handling level for GZip - /// Archive handling level for RAR - /// Archive handling level for Zip - /// Logger object for file and console output - /// True if the extraction was a success, false otherwise - public static bool ExtractArchive(string input, string tempDir, ArchiveScanLevel sevenzip, - ArchiveScanLevel gz, ArchiveScanLevel rar, ArchiveScanLevel zip, Logger logger) + public static bool ExtractArchive(string input, string tempDir, ArchiveScanLevel archiveScanLevel, Logger logger) { bool encounteredErrors = true; @@ -115,7 +95,7 @@ namespace SabreTools.Helper try { - if (at == ArchiveType.SevenZip && sevenzip != ArchiveScanLevel.External) + if (at == ArchiveType.SevenZip && (archiveScanLevel & ArchiveScanLevel.SevenZipInternal) != 0) { logger.Verbose("Found archive of type: " + at); @@ -132,7 +112,7 @@ namespace SabreTools.Helper sza.Dispose(); } - else if (at == ArchiveType.GZip && gz != ArchiveScanLevel.External) + else if (at == ArchiveType.GZip && (archiveScanLevel & ArchiveScanLevel.GZipInternal) != 0) { logger.Verbose("Found archive of type: " + at); @@ -150,8 +130,8 @@ namespace SabreTools.Helper encounteredErrors = false; } - else if ((at == ArchiveType.Zip && zip != ArchiveScanLevel.External) - || (at == ArchiveType.Rar && rar != ArchiveScanLevel.External)) + else if ((at == ArchiveType.Zip && (archiveScanLevel & ArchiveScanLevel.ZipInternal) != 0) + || (at == ArchiveType.Rar && (archiveScanLevel & ArchiveScanLevel.RarInternal) != 0)) { logger.Verbose("Found archive of type: " + at); @@ -522,15 +502,12 @@ namespace SabreTools.Helper /// Get if the current file should be scanned internally and externally /// /// Name of the input file to check - /// User-defined scan level for 7z archives - /// User-defined scan level for GZ archives - /// User-defined scan level for RAR archives - /// User-defined scan level for Zip archives + /// ArchiveScanLevel representing the archive handling levels /// Logger object for file and console output /// Output parameter determining if file should be processed externally /// Output parameter determining if file should be processed internally - public static void GetInternalExternalProcess(string input, ArchiveScanLevel sevenzip, ArchiveScanLevel gzip, - ArchiveScanLevel rar, ArchiveScanLevel zip, Logger logger, out bool shouldExternalProcess, out bool shouldInternalProcess) + public static void GetInternalExternalProcess(string input, ArchiveScanLevel archiveScanLevel, + Logger logger, out bool shouldExternalProcess, out bool shouldInternalProcess) { shouldExternalProcess = true; shouldInternalProcess = true; @@ -543,24 +520,99 @@ namespace SabreTools.Helper shouldInternalProcess = false; break; case ArchiveType.GZip: - shouldExternalProcess = (gzip != ArchiveScanLevel.Internal); - shouldInternalProcess = (gzip != ArchiveScanLevel.External); + shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.GZipExternal) != 0); + shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.GZipInternal) != 0); break; case ArchiveType.Rar: - shouldExternalProcess = (rar != ArchiveScanLevel.Internal); - shouldInternalProcess = (rar != ArchiveScanLevel.External); + shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.RarExternal) != 0); + shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.RarInternal) != 0); break; case ArchiveType.SevenZip: - shouldExternalProcess = (sevenzip != ArchiveScanLevel.Internal); - shouldInternalProcess = (sevenzip != ArchiveScanLevel.External); + shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.SevenZipExternal) != 0); + shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.SevenZipInternal) != 0); break; case ArchiveType.Zip: - shouldExternalProcess = (zip != ArchiveScanLevel.Internal); - shouldInternalProcess = (zip != ArchiveScanLevel.External); + shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.ZipExternal) != 0); + shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.ZipInternal) != 0); break; } } + /// + /// Get the archive scan level based on the inputs + /// + /// User-defined scan level for 7z archives + /// User-defined scan level for GZ archives + /// User-defined scan level for RAR archives + /// User-defined scan level for Zip archives + /// ArchiveScanLevel representing the levels + public static ArchiveScanLevel GetArchiveScanLevelFromNumbers(int sevenzip, int gzip, int rar, int zip) + { + ArchiveScanLevel archiveScanLevel = 0x0000; + + // 7z + sevenzip = (sevenzip < 0 || sevenzip > 2 ? 0 : sevenzip); + switch (sevenzip) + { + case 0: + archiveScanLevel |= ArchiveScanLevel.SevenZipBoth; + break; + case 1: + archiveScanLevel |= ArchiveScanLevel.SevenZipInternal; + break; + case 2: + archiveScanLevel |= ArchiveScanLevel.SevenZipExternal; + break; + } + + // GZip + gzip = (gzip < 0 || gzip > 2 ? 0 : gzip); + switch (gzip) + { + case 0: + archiveScanLevel |= ArchiveScanLevel.GZipBoth; + break; + case 1: + archiveScanLevel |= ArchiveScanLevel.GZipInternal; + break; + case 2: + archiveScanLevel |= ArchiveScanLevel.GZipExternal; + break; + } + + // RAR + rar = (rar < 0 || rar > 2 ? 0 : rar); + switch (rar) + { + case 0: + archiveScanLevel |= ArchiveScanLevel.RarBoth; + break; + case 1: + archiveScanLevel |= ArchiveScanLevel.RarInternal; + break; + case 2: + archiveScanLevel |= ArchiveScanLevel.RarExternal; + break; + } + + // Zip + zip = (zip < 0 || zip > 2 ? 0 : zip); + switch (zip) + { + case 0: + archiveScanLevel |= ArchiveScanLevel.ZipBoth; + break; + case 1: + archiveScanLevel |= ArchiveScanLevel.ZipInternal; + break; + case 2: + archiveScanLevel |= ArchiveScanLevel.ZipExternal; + break; + } + + return archiveScanLevel; + } + /// /// Read the information from an input 7z file /// diff --git a/SabreTools/Partials/SabreTools_Inits.cs b/SabreTools/Partials/SabreTools_Inits.cs index 05518d94..a37955b6 100644 --- a/SabreTools/Partials/SabreTools_Inits.cs +++ b/SabreTools/Partials/SabreTools_Inits.cs @@ -27,6 +27,9 @@ namespace SabreTools public static bool InitConvertFolderTGZ(List inputs, string outDir, string tempDir, bool delete, bool romba, int sevenzip, int gz, int rar, int zip, Logger logger) { + // Get the archive scanning levels + ArchiveScanLevel asl = ArchiveTools.GetArchiveScanLevelFromNumbers(sevenzip, gz, rar, zip); + // Get all individual files from the inputs List newinputs = new List(); foreach (string input in inputs) @@ -44,7 +47,7 @@ namespace SabreTools } } - SimpleSort ss = new SimpleSort(new DatFile(), newinputs, outDir, tempDir, false, false, false, delete, false, romba, sevenzip, gz, rar, zip, false, logger); + SimpleSort ss = new SimpleSort(new DatFile(), newinputs, outDir, tempDir, false, false, false, delete, false, romba, asl, false, logger); return ss.Convert(); } @@ -288,6 +291,9 @@ namespace SabreTools private static void InitSortVerify(List datfiles, List inputs, string outDir, string tempDir, bool quickScan, bool toFolder, bool verify, bool delete, bool? torrentX, bool romba, int sevenzip, int gz, int rar, int zip, bool updateDat, Logger logger) { + // Get the archive scanning level + ArchiveScanLevel asl = ArchiveTools.GetArchiveScanLevelFromNumbers(sevenzip, gz, rar, zip); + // Add all of the input DATs into one huge internal DAT DatFile datdata = new DatFile(); foreach (string datfile in datfiles) @@ -296,7 +302,7 @@ namespace SabreTools } SimpleSort ss = new SimpleSort(datdata, inputs, outDir, tempDir, quickScan, toFolder, verify, - delete, torrentX, romba, sevenzip, gz, rar, zip, updateDat, logger); + delete, torrentX, romba, asl, updateDat, logger); ss.StartProcessing(); } diff --git a/SimpleSort/SimpleSortApp.cs b/SimpleSort/SimpleSortApp.cs index b0ae8dec..e3e0c18c 100644 --- a/SimpleSort/SimpleSortApp.cs +++ b/SimpleSort/SimpleSortApp.cs @@ -249,6 +249,9 @@ namespace SabreTools private static void InitSortVerify(List datfiles, List inputs, string outDir, string tempDir, bool quickScan, bool toFolder, bool verify, bool delete, bool? torrentX, bool romba, int sevenzip, int gz, int rar, int zip, bool updateDat, Logger logger) { + // Get the archive scanning level + ArchiveScanLevel asl = ArchiveTools.GetArchiveScanLevelFromNumbers(sevenzip, gz, rar, zip); + // Add all of the input DATs into one huge internal DAT DatFile datdata = new DatFile(); foreach (string datfile in datfiles) @@ -257,7 +260,7 @@ namespace SabreTools } SimpleSort ss = new SimpleSort(datdata, inputs, outDir, tempDir, quickScan, toFolder, verify, - delete, torrentX, romba, sevenzip, gz, rar, zip, updateDat, logger); + delete, torrentX, romba, asl, updateDat, logger); ss.StartProcessing(); } @@ -277,6 +280,9 @@ namespace SabreTools public static bool InitConvertFolderTGZ(List inputs, string outDir, string tempDir, bool delete, bool romba, int sevenzip, int gz, int rar, int zip, Logger logger) { + // Get the archive scanning level + ArchiveScanLevel asl = ArchiveTools.GetArchiveScanLevelFromNumbers(sevenzip, gz, rar, zip); + // Get all individual files from the inputs List newinputs = new List(); foreach (string input in inputs) @@ -295,7 +301,7 @@ namespace SabreTools } SimpleSort ss = new SimpleSort(new DatFile(), newinputs, outDir, tempDir, false, false, false, - delete, false, romba, sevenzip, gz, rar, zip, false, logger); + delete, false, romba, asl, false, logger); return ss.Convert(); } }