diff --git a/Deheader/Headerer.cs b/Deheader/Headerer.cs index 3ec4d87c..397bf636 100644 --- a/Deheader/Headerer.cs +++ b/Deheader/Headerer.cs @@ -9,11 +9,29 @@ namespace SabreTools /// /// Entry class for the Deheader application /// - class Headerer + public class Headerer { + // Private instance variables + private string _input; + private bool _flag; + private Logger _logger; + + // Private required variables private static string _dbName = "Headerer.sqlite"; private static string _connectionString = "Data Source=" + _dbName + ";Version = 3;"; - private static Logger logger; + + /// + /// Create a new Headerer object + /// + /// Input file or folder name + /// True if we're extracting headers (default), false if we're replacing them + /// Logger object for file and console output + public Headerer(string input, bool flag, Logger logger) + { + _input = input; + _flag = flag; + _logger = logger; + } /// /// Start deheader operation with supplied parameters @@ -28,7 +46,7 @@ namespace SabreTools } // Perform initial setup and verification - logger = new Logger(true, "headerer.log"); + Logger logger = new Logger(true, "headerer.log"); logger.Start(); DBTools.EnsureDatabase(_dbName, _connectionString); @@ -39,7 +57,8 @@ namespace SabreTools return; } - if (args.Length == 0 || args.Length > 2) + // If we have no arguments, show the help + if (args.Length == 0) { Build.Help(); logger.Close(); @@ -50,38 +69,107 @@ namespace SabreTools Build.Start("Headerer"); // Get the filename (or foldername) - string file = ""; - bool deheader = true; - if (args.Length == 1) + string input = ""; + bool help = false, + flag = true, + headerer = true; + foreach (string arg in args) { - file = args[0]; + string temparg = arg.Replace("\"", "").Replace("file://", ""); + switch (temparg) + { + case "-?": + case "-h": + case "--help": + help = true; + break; + case "-e": + case "--extract": + flag = true; + break; + case "-r": + case "--replace": + flag = false; + break; + default: + if (File.Exists(temparg) || Directory.Exists(temparg)) + { + input = 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 (String.IsNullOrEmpty(input) && (headerer)) + { + logger.Error("This feature requires at exactly one input"); + Build.Help(); + logger.Close(); + return; + } + + // If we're in headerer mode + if (headerer) + { + InitHeaderer(input, flag, logger); + } + + // If nothing is set, show the help else { - - if (args[0] == "-e") - { - deheader = true; - } - else if (args[0] == "-r") - { - deheader = false; - } - - file = args[1]; + Build.Help(); } - if (deheader) + logger.Close(); + return; + } + + /// + /// Wrap extracting and replacing headers + /// + /// Input file or folder name + /// True if we're extracting headers (default), false if we're replacing them + /// Logger object for file and console output + private static void InitHeaderer(string input, bool flag, Logger logger) + { + Headerer headerer = new Headerer(input, flag, logger); + headerer.Process(); + } + + /// + /// Extract and remove or replace headers + /// + /// True if it succeeded, false otherwise + public bool Process() + { + if (_flag) { // If it's a single file, just check it - if (File.Exists(file)) + if (File.Exists(_input)) { - DetectSkipperAndTransform(file); + DetectSkipperAndTransform(_input); } // If it's a directory, recursively check all - else if (Directory.Exists(file)) + else if (Directory.Exists(_input)) { - foreach (string sub in Directory.GetFiles(file)) + foreach (string sub in Directory.EnumerateFiles(_input, "*", SearchOption.AllDirectories)) { if (sub != ".." && sub != ".") { @@ -89,23 +177,18 @@ namespace SabreTools } } } - // Else, show that help text - else - { - Build.Help(); - } } else { // If it's a single file, just check it - if (File.Exists(file)) + if (File.Exists(_input)) { - ReplaceHeader(file); + ReplaceHeader(_input); } // If it's a directory, recursively check all - else if (Directory.Exists(file)) + else if (Directory.Exists(_input)) { - foreach (string sub in Directory.GetFiles(file)) + foreach (string sub in Directory.GetFiles(_input)) { if (sub != ".." && sub != ".") { @@ -113,13 +196,9 @@ namespace SabreTools } } } - // Else, show that help text - else - { - Build.Help(); - } } - logger.Close(); + + return true; } /// @@ -127,19 +206,19 @@ namespace SabreTools /// /// Name of the file to be parsed /// True if the output file was created, false otherwise - private static bool DetectSkipperAndTransform(string file) + public bool DetectSkipperAndTransform(string file) { - logger.User("\nGetting skipper information for '" + file + "'"); + _logger.User("\nGetting skipper information for '" + file + "'"); // Then, if the file was headered, store it to the database int headerSize = -1; - HeaderType type = Skippers.GetFileHeaderType(file, out headerSize, logger); + HeaderType type = Skippers.GetFileHeaderType(file, out headerSize, _logger); // If we have a valid HeaderType, remove the correct byte count - logger.User("File has header: " + (type != HeaderType.None)); + _logger.User("File has header: " + (type != HeaderType.None)); if (type != HeaderType.None) { - logger.Log("Deteched header type: " + type); + _logger.Log("Deteched header type: " + type); // Now take care of the header and new output file string hstr = string.Empty; @@ -154,7 +233,7 @@ namespace SabreTools } // Then find an apply the exact rule to the file - SkipperRule rule = Skippers.MatchesSkipper(file, "", logger); + SkipperRule rule = Skippers.MatchesSkipper(file, "", _logger); // If we have an empty rule, return false if (rule.Tests == null || rule.Tests.Count == 0) @@ -163,7 +242,7 @@ namespace SabreTools } // Otherwise, apply the rule ot the file - Skippers.TransformFile(file, file + ".new", rule, logger); + Skippers.TransformFile(file, file + ".new", rule, _logger); // If the output file doesn't exist, return false if (!File.Exists(file + ".new")) @@ -185,7 +264,7 @@ namespace SabreTools /// String representing the header bytes /// SHA-1 of the deheadered file /// HeaderType representing the detected header - private static void AddHeaderToDatabase(string header, string SHA1, HeaderType type) + public void AddHeaderToDatabase(string header, string SHA1, HeaderType type) { bool exists = false; @@ -213,7 +292,7 @@ namespace SabreTools dbc.Open(); using (SqliteCommand slc = new SqliteCommand(query, dbc)) { - logger.Log("Result of inserting header: " + slc.ExecuteNonQuery()); + _logger.Log("Result of inserting header: " + slc.ExecuteNonQuery()); } } } @@ -223,7 +302,8 @@ namespace SabreTools /// Detect and replace header(s) to the given file /// /// Name of the file to be parsed - private static void ReplaceHeader(string file) + /// True if a header was found and appended, false otherwise + public bool ReplaceHeader(string file) { // First, get the SHA-1 hash of the file Rom rom = RomTools.GetSingleFileInfo(file); @@ -244,22 +324,24 @@ namespace SabreTools int sub = 0; while (sldr.Read()) { - logger.Log("Found match with rom type " + sldr.GetString(1)); + _logger.Log("Found match with rom type " + sldr.GetString(1)); header = sldr.GetString(0); - logger.User("Creating reheadered file: " + file + ".new" + sub); + _logger.User("Creating reheadered file: " + file + ".new" + sub); Output.AppendBytesToFile(file, file + ".new" + sub, header, string.Empty); - logger.User("Reheadered file created!"); + _logger.User("Reheadered file created!"); } } else { - logger.Warning("No matching header could be found!"); - return; + _logger.Warning("No matching header could be found!"); + return false; } } } } + + return true; } } } diff --git a/SabreTools.Helper/Tools/ArchiveTools.cs b/SabreTools.Helper/Tools/ArchiveTools.cs index 2ae048b4..9862b58b 100644 --- a/SabreTools.Helper/Tools/ArchiveTools.cs +++ b/SabreTools.Helper/Tools/ArchiveTools.cs @@ -162,7 +162,7 @@ namespace SabreTools.Helper { encounteredErrors = true; } - catch (Exception ex) + catch (Exception) { // Don't log file open errors encounteredErrors = true;