using System; using System.Collections.Generic; using System.IO; using SabreTools.Helper; using SharpCompress.Common; namespace SabreTools { public class TGZTest { // User-defined variables private List _inputs; private string _outdir; private string _tempdir; private bool _delete; private bool _romba; private ArchiveScanLevel _7z; private ArchiveScanLevel _gz; private ArchiveScanLevel _rar; private ArchiveScanLevel _zip; private Logger _logger; /// /// Create a new TGZTest object /// /// List of all inputted files and folders /// Output directory (empty for default directory) /// Temporary directory for archive extraction /// True if input files should be deleted, false otherwise /// 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 /// Logger object for file and console output public TGZTest(List inputs, string outdir, string tempdir, bool delete, bool romba, int sevenzip, int gz, int rar, int zip, Logger logger) { _inputs = inputs; _outdir = (String.IsNullOrEmpty(outdir) ? "tgz" : outdir); _delete = delete; _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); _logger = logger; } /// /// Main entry point for the program /// /// List of arguments to be parsed public static void Main(string[] args) { // If output is being redirected, don't allow clear screens if (!Console.IsOutputRedirected) { Console.Clear(); } // Perform initial setup and verification Logger logger = new Logger(true, "tgztest.log"); logger.Start(); // Credits take precidence over all if ((new List(args)).Contains("--credits")) { Build.Credits(); return; } // If there's no arguments, show help if (args.Length == 0) { Build.Help(); logger.Close(); return; } // Output the title Build.Start("TGZTest"); // Set all default values bool help = false, delete = false, romba = false, tgz = true; int sevenzip = 0, gz = 2, rar = 2, zip = 0; string outdir = "", tempdir = ""; List inputs = new List(); // Determine which switches are enabled (with values if necessary) foreach (string arg in args) { string temparg = arg.Replace("\"", "").Replace("file://", ""); switch (temparg) { case "-?": case "-h": case "--help": help = true; break; case "-d": case "--delete": delete = true; break; case "-r": case "--romba": romba = true; break; default: if (temparg.StartsWith("-7z=") || temparg.StartsWith("--7z=")) { if (!Int32.TryParse(temparg.Split('=')[1], out sevenzip)) { sevenzip = 0; } } else if (temparg.StartsWith("-gz=") || temparg.StartsWith("--gz=")) { if (!Int32.TryParse(temparg.Split('=')[1], out gz)) { gz = 2; } } else if (temparg.StartsWith("-out=") || temparg.StartsWith("--out=")) { outdir = temparg.Split('=')[1]; } else if (temparg.StartsWith("-rar=") || temparg.StartsWith("--rar=")) { if (!Int32.TryParse(temparg.Split('=')[1], out rar)) { rar = 2; } } else if (temparg.StartsWith("-t=") || temparg.StartsWith("--temp=")) { tempdir = temparg.Split('=')[1]; } else if (temparg.StartsWith("-zip=") || temparg.StartsWith("--zip=")) { if (!Int32.TryParse(temparg.Split('=')[1], out zip)) { zip = 0; } } else if (File.Exists(temparg) || Directory.Exists(temparg)) { inputs.Add(temparg); } else { logger.Error("Invalid input detected: " + arg); Console.WriteLine(); Build.Help(); logger.Close(); return; } break; } } // If help is set, show the help screen if (help) { Build.Help(); logger.Close(); return; } // If a switch that requires a filename is set and no file is, show the help screen if (inputs.Count == 0 && tgz) { logger.Error("This feature requires at least one input"); Build.Help(); logger.Close(); return; } // If we are doing a simple sort if (tgz) { InitTGZTest(inputs, outdir, tempdir, delete, romba, sevenzip, gz, rar, zip, logger); } // If nothing is set, show the help else { Build.Help(); } logger.Close(); return; } /// /// Wrap sorting files using an input DAT /// /// List of all inputted files and folders /// Output directory (empty for default directory) /// Temporary directory for archive extraction /// True if input files should be deleted, false otherwise /// 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 /// Logger object for file and console output public static bool InitTGZTest(List inputs, string outdir, string tempdir, bool delete, bool romba, int sevenzip, int gz, int rar, int zip, Logger logger) { // Get all individual files from the inputs List newinputs = new List(); foreach (string input in inputs) { if (File.Exists(input)) { newinputs.Add(Path.GetFullPath(input)); } else if (Directory.Exists(input)) { foreach (string file in Directory.EnumerateFiles(input, "*", SearchOption.AllDirectories)) { newinputs.Add(Path.GetFullPath(file)); } } } TGZTest tgztest = new TGZTest(newinputs, outdir, tempdir, delete, romba, sevenzip, gz, rar, zip, logger); return tgztest.Process(); } /// /// Process all input files /// /// True if processing was a success, false otherwise public bool Process() { foreach (string input in _inputs) { _logger.User("Processing file " + input); // Get if the file should be scanned internally and externally bool shouldExternalProcess = true; bool shouldInternalProcess = true; ArchiveType? archiveType = ArchiveTools.GetCurrentArchiveType(input, _logger); switch (archiveType) { case null: shouldExternalProcess = true; shouldInternalProcess = false; break; case ArchiveType.GZip: shouldExternalProcess = (_gz != ArchiveScanLevel.Internal); shouldInternalProcess = (_gz != ArchiveScanLevel.External); break; case ArchiveType.Rar: shouldExternalProcess = (_rar != ArchiveScanLevel.Internal); shouldInternalProcess = (_rar != ArchiveScanLevel.External); break; case ArchiveType.SevenZip: shouldExternalProcess = (_7z != ArchiveScanLevel.Internal); shouldInternalProcess = (_7z != ArchiveScanLevel.External); break; case ArchiveType.Zip: shouldExternalProcess = (_zip != ArchiveScanLevel.Internal); shouldInternalProcess = (_zip != ArchiveScanLevel.External); break; } // Do an external scan of the file, if necessary if (shouldExternalProcess) { ArchiveTools.WriteTorrentGZ(input, _outdir, _romba, _logger); } // Process the file as an archive, if necessary if (shouldInternalProcess) { // DO THINGS } // Delete the soruce file if we're supposed to if (_delete) { try { _logger.User("Attempting to delete " + input); File.Delete(input); } catch (Exception ex) { _logger.Error(ex.ToString()); } } } // Now one final delete of the temp directory while (Directory.Exists(_tempdir)) { try { Directory.Delete(_tempdir, true); } catch { continue; } } return true; } } }