From 9b73018589d31a2da27b5215fe7f213647fb16b1 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 27 Feb 2017 00:01:24 -0800 Subject: [PATCH] [ALL] Nearly all work for SHA384/512 support --- RombaSharp/Partials/RombaSharp.Helpers.cs | 4 +- RombaSharp/Partials/RombaSharp.Inits.cs | 6 +- SabreTools.Helper/Data/Enums.cs | 2 + SabreTools.Helper/Data/Flags.cs | 34 +-- SabreTools.Helper/Dats/DatFile.cs | 12 + SabreTools.Helper/Dats/Disk.cs | 6 +- SabreTools.Helper/Dats/Filter.cs | 100 ++++++++ .../Dats/Partials/DatFile.Bucketing.cs | 142 +++++++++++ .../Dats/Partials/DatFile.Parsers.cs | 230 +++++++++++++++++- .../Dats/Partials/DatFile.Rebuild.cs | 8 +- .../Dats/Partials/DatFile.Writers.cs | 78 +++++- SabreTools.Helper/Dats/Rom.cs | 8 +- SabreTools.Helper/Tools/FileTools.cs | 11 +- 13 files changed, 607 insertions(+), 34 deletions(-) diff --git a/RombaSharp/Partials/RombaSharp.Helpers.cs b/RombaSharp/Partials/RombaSharp.Helpers.cs index c2c28e0a..7b23b66c 100644 --- a/RombaSharp/Partials/RombaSharp.Helpers.cs +++ b/RombaSharp/Partials/RombaSharp.Helpers.cs @@ -404,7 +404,7 @@ namespace RombaSharp // First get a list of SHA-1's from the input DATs DatFile datroot = new DatFile { Type = "SuperDAT", }; - datroot.PopulateFromDir(_dats, false, false, true, false, false, false, false, false, _tmpdir, false, null, 4, _logger); + datroot.PopulateFromDir(_dats, Hash.SHA256 & Hash.SHA384 & Hash.SHA512, false, false, false, false, false, _tmpdir, false, null, 4, _logger); datroot.BucketBySHA1(false, _logger, false); // Create a List of dat hashes in the database (SHA-1) @@ -618,7 +618,7 @@ namespace RombaSharp // Now rescan the depot itself DatFile depot = new DatFile(); - depot.PopulateFromDir(depotname, false, false, true, false, false, true, false, false, _tmpdir, false, null, _workers, _logger); + depot.PopulateFromDir(depotname, Hash.SHA256 & Hash.SHA384 & Hash.SHA512, false, false, true, false, false, _tmpdir, false, null, _workers, _logger); depot.BucketBySHA1(false, _logger, false); // Set the base queries to use diff --git a/RombaSharp/Partials/RombaSharp.Inits.cs b/RombaSharp/Partials/RombaSharp.Inits.cs index 54e3b7fc..1cdb2dd3 100644 --- a/RombaSharp/Partials/RombaSharp.Inits.cs +++ b/RombaSharp/Partials/RombaSharp.Inits.cs @@ -41,12 +41,12 @@ namespace RombaSharp DatFile df = new DatFile(); foreach (string dir in onlyDirs) { - df.PopulateFromDir(dir, false, false, true, false, false, true, false, false, _tmpdir, false, null, _workers, _logger); + df.PopulateFromDir(dir, Hash.SHA256 & Hash.SHA384 & Hash.SHA512, false, false, true, false, false, _tmpdir, false, null, _workers, _logger); // If we're looking for only needed, consider the zipfiles themselves too if (onlyNeeded) { - df.PopulateFromDir(dir, false, false, true, false, true, true, false, false, _tmpdir, false, null, _workers, _logger); + df.PopulateFromDir(dir, Hash.SHA256 & Hash.SHA384 & Hash.SHA512, false, true, true, false, false, _tmpdir, false, null, _workers, _logger); } } @@ -250,7 +250,7 @@ namespace RombaSharp Logger logger = new Logger(); foreach (string input in inputs) { - datdata.PopulateFromDir(input, false /* noMD5 */, false /* noSHA1 */, true /* noSHA256 */, true /* bare */, false /* archivesAsFiles */, + datdata.PopulateFromDir(input, Hash.SHA256 & Hash.SHA384 & Hash.SHA512 /* omitFromScan */, true /* bare */, false /* archivesAsFiles */, true /* enableGzip */, false /* addBlanks */, false /* addDate */, _tmpdir /* tempDir */, false /* copyFiles */, null /* headerToCheckAgainst */, _workers /* maxDegreeOfParallelism */, _logger); datdata.WriteToFile("", logger); diff --git a/SabreTools.Helper/Data/Enums.cs b/SabreTools.Helper/Data/Enums.cs index b0dafea7..41c9d823 100644 --- a/SabreTools.Helper/Data/Enums.cs +++ b/SabreTools.Helper/Data/Enums.cs @@ -254,6 +254,8 @@ MD5, SHA1, SHA256, + SHA384, + SHA512, Game, } diff --git a/SabreTools.Helper/Data/Flags.cs b/SabreTools.Helper/Data/Flags.cs index cde22def..216e377e 100644 --- a/SabreTools.Helper/Data/Flags.cs +++ b/SabreTools.Helper/Data/Flags.cs @@ -192,23 +192,25 @@ namespace SabreTools.Helper.Data [Flags] public enum DatFormat { - Logiqx = 0x0001, - ClrMamePro = 0x0002, - RomCenter = 0x0004, - DOSCenter = 0x0008, - MissFile = 0x0010, - SabreDat = 0x0020, - RedumpMD5 = 0x0040, - RedumpSHA1 = 0x0080, - RedumpSFV = 0x0100, - SoftwareList = 0x0200, - OfflineList = 0x0400, - TSV = 0x0800, - CSV = 0x1000, - AttractMode = 0x2000, - RedumpSHA256 = 0x4000, + Logiqx = 0x00001, + ClrMamePro = 0x00002, + RomCenter = 0x00004, + DOSCenter = 0x00008, + MissFile = 0x00010, + SabreDat = 0x00020, + RedumpMD5 = 0x00040, + RedumpSHA1 = 0x00080, + RedumpSFV = 0x00100, + SoftwareList = 0x00200, + OfflineList = 0x00400, + TSV = 0x00800, + CSV = 0x01000, + AttractMode = 0x02000, + RedumpSHA256 = 0x04000, + RedumpSHA384 = 0x08000, + RedumpSHA512 = 0x10000, - ALL = 0xFFFF, + ALL = 0xFFFFF, } /// diff --git a/SabreTools.Helper/Dats/DatFile.cs b/SabreTools.Helper/Dats/DatFile.cs index 1b6359b6..cc7f4d40 100644 --- a/SabreTools.Helper/Dats/DatFile.cs +++ b/SabreTools.Helper/Dats/DatFile.cs @@ -53,6 +53,8 @@ namespace SabreTools.Helper.Dats private long _md5Count; private long _sha1Count; private long _sha256Count; + private long _sha384Count; + private long _sha512Count; private long _baddumpCount; private long _nodumpCount; @@ -255,6 +257,16 @@ namespace SabreTools.Helper.Dats get { return _sha256Count; } set { _sha256Count = value; } } + public long SHA384Count + { + get { return _sha384Count; } + set { _sha384Count = value; } + } + public long SHA512Count + { + get { return _sha512Count; } + set { _sha512Count = value; } + } public long BaddumpCount { get { return _baddumpCount; } diff --git a/SabreTools.Helper/Dats/Disk.cs b/SabreTools.Helper/Dats/Disk.cs index 7c19502a..e02eb317 100644 --- a/SabreTools.Helper/Dats/Disk.cs +++ b/SabreTools.Helper/Dats/Disk.cs @@ -98,6 +98,8 @@ namespace SabreTools.Helper.Dats MD5 = this.MD5, SHA1 = this.SHA1, SHA256 = this.SHA256, + SHA384 = this.SHA384, + SHA512 = this.SHA512, ItemStatus = this.ItemStatus, }; } @@ -127,7 +129,9 @@ namespace SabreTools.Helper.Dats if (((String.IsNullOrEmpty(_md5) || String.IsNullOrEmpty(newOther.MD5)) || this.MD5 == newOther.MD5) && ((String.IsNullOrEmpty(this.SHA1) || String.IsNullOrEmpty(newOther.SHA1)) || this.SHA1 == newOther.SHA1) - && ((String.IsNullOrEmpty(this.SHA256) || String.IsNullOrEmpty(newOther.SHA256)) || this.SHA256 == newOther.SHA256)) + && ((String.IsNullOrEmpty(this.SHA256) || String.IsNullOrEmpty(newOther.SHA256)) || this.SHA256 == newOther.SHA256) + && ((String.IsNullOrEmpty(this.SHA384) || String.IsNullOrEmpty(newOther.SHA384)) || this.SHA384 == newOther.SHA384) + && ((String.IsNullOrEmpty(this.SHA512) || String.IsNullOrEmpty(newOther.SHA512)) || this.SHA256 == newOther.SHA512)) { dupefound = true; } diff --git a/SabreTools.Helper/Dats/Filter.cs b/SabreTools.Helper/Dats/Filter.cs index df323368..e2d853cc 100644 --- a/SabreTools.Helper/Dats/Filter.cs +++ b/SabreTools.Helper/Dats/Filter.cs @@ -19,6 +19,8 @@ namespace SabreTools.Helper.Dats private List _md5s; private List _sha1s; private List _sha256s; + private List _sha384s; + private List _sha512s; private ItemStatus _itemStatuses; private MachineType _machineTypes; @@ -33,6 +35,8 @@ namespace SabreTools.Helper.Dats private List _notMd5s; private List _notSha1s; private List _notSha256s; + private List _notSha384s; + private List _notSha512s; private ItemStatus _itemNotStatuses; private MachineType _machineNotTypes; @@ -89,6 +93,16 @@ namespace SabreTools.Helper.Dats get { return _sha256s; } set { _sha256s = value; } } + public List SHA384s + { + get { return _sha384s; } + set { _sha384s = value; } + } + public List SHA512s + { + get { return _sha512s; } + set { _sha512s = value; } + } public ItemStatus ItemStatuses { get { return _itemStatuses; } @@ -139,6 +153,16 @@ namespace SabreTools.Helper.Dats get { return _notSha256s; } set { _notSha256s = value; } } + public List NotSHA384s + { + get { return _notSha384s; } + set { _notSha384s = value; } + } + public List NotSHA512s + { + get { return _notSha512s; } + set { _notSha512s = value; } + } public ItemStatus NotItemStatuses { get { return _itemNotStatuses; } @@ -199,6 +223,8 @@ namespace SabreTools.Helper.Dats _md5s = new List(); _sha1s = new List(); _sha256s = new List(); + _sha384s = new List(); + _sha512s = new List(); _itemStatuses = ItemStatus.NULL; _machineTypes = MachineType.NULL; @@ -210,6 +236,8 @@ namespace SabreTools.Helper.Dats _notMd5s = new List(); _notSha1s = new List(); _notSha256s = new List(); + _notSha384s = new List(); + _notSha512s = new List(); _itemNotStatuses = ItemStatus.NULL; _machineNotTypes = MachineType.NULL; @@ -364,6 +392,42 @@ namespace SabreTools.Helper.Dats return false; } } + + // Filter on SHA384 + if (_sha384s.Count > 0) + { + // If the SHA-1 isn't in the list, return false + if (!FindValueInList(_sha384s, rom.SHA384)) + { + return false; + } + } + if (_notSha384s.Count > 0) + { + // If the SHA-1 is in the list, return false + if (FindValueInList(_notSha384s, rom.SHA384)) + { + return false; + } + } + + // Filter on SHA512 + if (_sha512s.Count > 0) + { + // If the SHA-1 isn't in the list, return false + if (!FindValueInList(_sha512s, rom.SHA512)) + { + return false; + } + } + if (_notSha512s.Count > 0) + { + // If the SHA-1 is in the list, return false + if (FindValueInList(_notSha512s, rom.SHA512)) + { + return false; + } + } } else if (item.Type == ItemType.Disk) { @@ -432,6 +496,42 @@ namespace SabreTools.Helper.Dats return false; } } + + // Filter on SHA384 + if (_sha384s.Count > 0) + { + // If the SHA-1 isn't in the list, return false + if (!FindValueInList(_sha384s, rom.SHA384)) + { + return false; + } + } + if (_notSha384s.Count > 0) + { + // If the SHA-1 is in the list, return false + if (FindValueInList(_notSha384s, rom.SHA384)) + { + return false; + } + } + + // Filter on SHA512 + if (_sha512s.Count > 0) + { + // If the SHA-1 isn't in the list, return false + if (!FindValueInList(_sha512s, rom.SHA512)) + { + return false; + } + } + if (_notSha512s.Count > 0) + { + // If the SHA-1 is in the list, return false + if (FindValueInList(_notSha512s, rom.SHA512)) + { + return false; + } + } } // Filter on game name diff --git a/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs b/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs index d9be01f4..fd23f2cc 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs @@ -375,6 +375,148 @@ namespace SabreTools.Helper.Dats _files = sortable; } + /// + /// Take the arbitrarily sorted Files Dictionary and convert to one sorted by SHA384 + /// + /// True if roms should be deduped, false otherwise + /// Logger object for file and console output + /// True if the number of hashes counted is to be output (default), false otherwise + public void BucketBySHA384(bool mergeroms, Logger logger, bool output = true) + { + // If we already have the right sorting, trust it + if (_sortedBy == SortedBy.SHA384) + { + return; + } + + // Set the sorted type + _sortedBy = SortedBy.SHA384; + + SortedDictionary> sortable = new SortedDictionary>(); + long count = 0; + + logger.User("Organizing " + (mergeroms ? "and merging " : "") + "roms by SHA-384"); + + // Process each all of the roms + List keys = Keys.ToList(); + foreach (string key in keys) + { + List roms = this[key]; + + // If we're merging the roms, do so + if (mergeroms) + { + roms = DatItem.Merge(roms, logger); + } + + // Now add each of the roms to their respective games + foreach (DatItem rom in roms) + { + count++; + string newkey = (rom.Type == ItemType.Rom + ? ((Rom)rom).SHA384 + : (rom.Type == ItemType.Disk + ? ((Disk)rom).SHA384 + : Constants.SHA384Zero)); + + if (!sortable.ContainsKey(newkey)) + { + sortable.Add(newkey, new List()); + } + sortable[newkey].Add(rom); + } + } + + // Now go through and sort all of the lists + keys = sortable.Keys.ToList(); + foreach (string key in keys) + { + List sortedlist = sortable[key]; + DatItem.Sort(ref sortedlist, false); + sortable[key] = sortedlist; + } + + // Output the count if told to + if (output) + { + logger.User("A total of " + count + " file hashes will be written out to file"); + } + + // Now assign the dictionary back + _files = sortable; + } + + /// + /// Take the arbitrarily sorted Files Dictionary and convert to one sorted by SHA512 + /// + /// True if roms should be deduped, false otherwise + /// Logger object for file and console output + /// True if the number of hashes counted is to be output (default), false otherwise + public void BucketBySHA512(bool mergeroms, Logger logger, bool output = true) + { + // If we already have the right sorting, trust it + if (_sortedBy == SortedBy.SHA512) + { + return; + } + + // Set the sorted type + _sortedBy = SortedBy.SHA512; + + SortedDictionary> sortable = new SortedDictionary>(); + long count = 0; + + logger.User("Organizing " + (mergeroms ? "and merging " : "") + "roms by SHA-512"); + + // Process each all of the roms + List keys = Keys.ToList(); + foreach (string key in keys) + { + List roms = this[key]; + + // If we're merging the roms, do so + if (mergeroms) + { + roms = DatItem.Merge(roms, logger); + } + + // Now add each of the roms to their respective games + foreach (DatItem rom in roms) + { + count++; + string newkey = (rom.Type == ItemType.Rom + ? ((Rom)rom).SHA512 + : (rom.Type == ItemType.Disk + ? ((Disk)rom).SHA512 + : Constants.SHA512Zero)); + + if (!sortable.ContainsKey(newkey)) + { + sortable.Add(newkey, new List()); + } + sortable[newkey].Add(rom); + } + } + + // Now go through and sort all of the lists + keys = sortable.Keys.ToList(); + foreach (string key in keys) + { + List sortedlist = sortable[key]; + DatItem.Sort(ref sortedlist, false); + sortable[key] = sortedlist; + } + + // Output the count if told to + if (output) + { + logger.User("A total of " + count + " file hashes will be written out to file"); + } + + // Now assign the dictionary back + _files = sortable; + } + /// /// Take the arbitrarily sorted Files Dictionary and convert to one sorted by Size /// diff --git a/SabreTools.Helper/Dats/Partials/DatFile.Parsers.cs b/SabreTools.Helper/Dats/Partials/DatFile.Parsers.cs index b67eb619..948637ac 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.Parsers.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.Parsers.cs @@ -88,7 +88,8 @@ namespace SabreTools.Helper.Dats { ext = ext.Substring(1); } - if (ext != "dat" && ext != "csv" && ext != "md5" && ext != "sfv" && ext != "sha1" && ext != "sha256" && ext != "tsv" && ext != "txt" && ext != "xml") + if (ext != "dat" && ext != "csv" && ext != "md5" && ext != "sfv" && ext != "sha1" && ext != "sha256" + && ext != "sha384" && ext != "sha512" && ext != "tsv" && ext != "txt" && ext != "xml") { return; } @@ -130,6 +131,12 @@ namespace SabreTools.Helper.Dats case DatFormat.RedumpSHA256: ParseRedumpSHA256(filename, sysid, srcid, filter, trim, single, root, logger, clean); break; + case DatFormat.RedumpSHA384: + ParseRedumpSHA384(filename, sysid, srcid, filter, trim, single, root, logger, clean); + break; + case DatFormat.RedumpSHA512: + ParseRedumpSHA512(filename, sysid, srcid, filter, trim, single, root, logger, clean); + break; case DatFormat.RomCenter: ParseRC(filename, sysid, srcid, filter, trim, single, root, logger, clean, descAsName); break; @@ -493,6 +500,20 @@ namespace SabreTools.Helper.Dats i++; ((Rom)item).SHA256 = gc[i].Replace("\"", "").ToLowerInvariant(); } + + // Get the SHA384 from the next part + else if (gc[i] == "sha384") + { + i++; + ((Rom)item).SHA384 = gc[i].Replace("\"", "").ToLowerInvariant(); + } + + // Get the SHA512 from the next part + else if (gc[i] == "sha512") + { + i++; + ((Rom)item).SHA512 = gc[i].Replace("\"", "").ToLowerInvariant(); + } } // Now process and add the rom @@ -623,6 +644,34 @@ namespace SabreTools.Helper.Dats ((Disk)item).SHA256 = quoteless.ToLowerInvariant(); } break; + case "sha384": + if (item.Type == ItemType.Rom) + { + i++; + quoteless = gc[i].Replace("\"", ""); + ((Rom)item).SHA384 = quoteless.ToLowerInvariant(); + } + else if (item.Type == ItemType.Disk) + { + i++; + quoteless = gc[i].Replace("\"", ""); + ((Disk)item).SHA384 = quoteless.ToLowerInvariant(); + } + break; + case "sha512": + if (item.Type == ItemType.Rom) + { + i++; + quoteless = gc[i].Replace("\"", ""); + ((Rom)item).SHA512 = quoteless.ToLowerInvariant(); + } + else if (item.Type == ItemType.Disk) + { + i++; + quoteless = gc[i].Replace("\"", ""); + ((Disk)item).SHA512 = quoteless.ToLowerInvariant(); + } + break; case "status": case "flags": i++; @@ -978,6 +1027,18 @@ namespace SabreTools.Helper.Dats case "sha-256 hash": columns.Add("DatItem.SHA256"); break; + case "sha384": + case "sha-384": + case "sha384 hash": + case "sha-384 hash": + columns.Add("DatItem.SHA384"); + break; + case "sha512": + case "sha-512": + case "sha512 hash": + case "sha-512 hash": + columns.Add("DatItem.SHA512"); + break; case "nodump": case "no dump": case "status": @@ -1001,7 +1062,8 @@ namespace SabreTools.Helper.Dats } // Set the output item information - string machineName = null, machineDesc = null, name = null, crc = null, md5 = null, sha1 = null, sha256 = null; + string machineName = null, machineDesc = null, name = null, crc = null, md5 = null, sha1 = null, + sha256 = null, sha384 = null, sha512 = null; long size = -1; ItemType itemType = ItemType.Rom; ItemStatus status = ItemStatus.None; @@ -1073,6 +1135,12 @@ namespace SabreTools.Helper.Dats case "DatItem.SHA256": sha256 = value; break; + case "DatItem.SHA384": + sha384 = value; + break; + case "DatItem.SHA512": + sha512 = value; + break; case "DatItem.Nodump": switch (value.ToLowerInvariant()) { @@ -1137,6 +1205,8 @@ namespace SabreTools.Helper.Dats MD5 = md5, SHA1 = sha1, SHA256 = sha256, + SHA384 = sha384, + SHA512 = sha512, Machine = new Machine() { @@ -1172,6 +1242,8 @@ namespace SabreTools.Helper.Dats MD5 = md5, SHA1 = sha1, SHA256 = sha256, + SHA384 = sha384, + SHA512 = sha512, Machine = new Machine() { @@ -2107,6 +2179,8 @@ namespace SabreTools.Helper.Dats MD5 = subreader.GetAttribute("md5")?.ToLowerInvariant(), SHA1 = subreader.GetAttribute("sha1")?.ToLowerInvariant(), SHA256 = subreader.GetAttribute("sha256")?.ToLowerInvariant(), + SHA384 = subreader.GetAttribute("sha384")?.ToLowerInvariant(), + SHA512 = subreader.GetAttribute("sha512")?.ToLowerInvariant(), MergeTag = merge, ItemStatus = its, @@ -2136,6 +2210,8 @@ namespace SabreTools.Helper.Dats MD5 = subreader.GetAttribute("md5")?.ToLowerInvariant(), SHA1 = subreader.GetAttribute("sha1")?.ToLowerInvariant(), SHA256 = subreader.GetAttribute("sha256")?.ToLowerInvariant(), + SHA384 = subreader.GetAttribute("sha384")?.ToLowerInvariant(), + SHA512 = subreader.GetAttribute("sha512")?.ToLowerInvariant(), ItemStatus = its, MergeTag = merge, Date = date, @@ -2302,6 +2378,8 @@ namespace SabreTools.Helper.Dats MD5 = xtr.GetAttribute("md5")?.ToLowerInvariant(), SHA1 = xtr.GetAttribute("sha1")?.ToLowerInvariant(), SHA256 = xtr.GetAttribute("sha256")?.ToLowerInvariant(), + SHA384 = xtr.GetAttribute("sha384")?.ToLowerInvariant(), + SHA512 = xtr.GetAttribute("sha512")?.ToLowerInvariant(), ItemStatus = its, Machine = dir, @@ -2321,6 +2399,8 @@ namespace SabreTools.Helper.Dats MD5 = xtr.GetAttribute("md5")?.ToLowerInvariant(), SHA1 = xtr.GetAttribute("sha1")?.ToLowerInvariant(), SHA256 = xtr.GetAttribute("sha256")?.ToLowerInvariant(), + SHA384 = xtr.GetAttribute("sha384")?.ToLowerInvariant(), + SHA512 = xtr.GetAttribute("sha512")?.ToLowerInvariant(), ItemStatus = its, Date = date, @@ -2603,6 +2683,130 @@ namespace SabreTools.Helper.Dats sr.Dispose(); } + /// + /// Parse a Redump SHA-256 and return all found games and roms within + /// + /// Name of the file to be parsed + /// System ID for the DAT + /// Source ID for the DAT + /// Filter object for passing to the DatItem level + /// True if we are supposed to trim names to NTFS length, false otherwise + /// True if all games should be replaced by '!', false otherwise + /// String representing root directory to compare against for length calculation + /// Logger object for console and/or file output + /// True if game names are sanitized, false otherwise (default) + private void ParseRedumpSHA384( + // Standard Dat parsing + string filename, + int sysid, + int srcid, + + // Rom filtering + Filter filter, + + // Rom renaming + bool trim, + bool single, + string root, + + // Miscellaneous + Logger logger, + bool clean) + { + // Open a file reader + Encoding enc = Style.GetEncoding(filename); + StreamReader sr = new StreamReader(File.OpenRead(filename), enc); + + while (!sr.EndOfStream) + { + string line = sr.ReadLine(); + + Rom rom = new Rom + { + Name = line.Split(' ')[1].Replace("*", String.Empty), + Size = -1, + SHA384 = line.Split(' ')[0], + ItemStatus = ItemStatus.None, + + Machine = new Machine + { + Name = Path.GetFileNameWithoutExtension(filename), + }, + + SystemID = sysid, + SourceID = srcid, + }; + + // Now process and add the rom + string key = ""; + ParseAddHelper(rom, filter, trim, single, root, clean, logger, out key); + } + + sr.Dispose(); + } + + /// + /// Parse a Redump SHA-512 and return all found games and roms within + /// + /// Name of the file to be parsed + /// System ID for the DAT + /// Source ID for the DAT + /// Filter object for passing to the DatItem level + /// True if we are supposed to trim names to NTFS length, false otherwise + /// True if all games should be replaced by '!', false otherwise + /// String representing root directory to compare against for length calculation + /// Logger object for console and/or file output + /// True if game names are sanitized, false otherwise (default) + private void ParseRedumpSHA512( + // Standard Dat parsing + string filename, + int sysid, + int srcid, + + // Rom filtering + Filter filter, + + // Rom renaming + bool trim, + bool single, + string root, + + // Miscellaneous + Logger logger, + bool clean) + { + // Open a file reader + Encoding enc = Style.GetEncoding(filename); + StreamReader sr = new StreamReader(File.OpenRead(filename), enc); + + while (!sr.EndOfStream) + { + string line = sr.ReadLine(); + + Rom rom = new Rom + { + Name = line.Split(' ')[1].Replace("*", String.Empty), + Size = -1, + SHA512 = line.Split(' ')[0], + ItemStatus = ItemStatus.None, + + Machine = new Machine + { + Name = Path.GetFileNameWithoutExtension(filename), + }, + + SystemID = sysid, + SourceID = srcid, + }; + + // Now process and add the rom + string key = ""; + ParseAddHelper(rom, filter, trim, single, root, clean, logger, out key); + } + + sr.Dispose(); + } + /// /// Parse a RomCenter DAT and return all found games and roms within /// @@ -2816,19 +3020,25 @@ namespace SabreTools.Helper.Dats itemRom.MD5 = Style.CleanHashData(itemRom.MD5, Constants.MD5Length); itemRom.SHA1 = Style.CleanHashData(itemRom.SHA1, Constants.SHA1Length); itemRom.SHA256 = Style.CleanHashData(itemRom.SHA256, Constants.SHA256Length); + itemRom.SHA384 = Style.CleanHashData(itemRom.SHA384, Constants.SHA384Length); + itemRom.SHA512 = Style.CleanHashData(itemRom.SHA512, Constants.SHA512Length); // If we have a rom and it's missing size AND the hashes match a 0-byte file, fill in the rest of the info if ((itemRom.Size == 0 || itemRom.Size == -1) && ((itemRom.CRC == Constants.CRCZero || String.IsNullOrEmpty(itemRom.CRC)) || itemRom.MD5 == Constants.MD5Zero || itemRom.SHA1 == Constants.SHA1Zero - || itemRom.SHA256 == Constants.SHA256Zero)) + || itemRom.SHA256 == Constants.SHA256Zero + || itemRom.SHA384 == Constants.SHA384Zero + || itemRom.SHA512 == Constants.SHA512Zero)) { itemRom.Size = Constants.SizeZero; itemRom.CRC = Constants.CRCZero; itemRom.MD5 = Constants.MD5Zero; itemRom.SHA1 = Constants.SHA1Zero; itemRom.SHA256 = Constants.SHA256Zero; + itemRom.SHA384 = Constants.SHA384Zero; + itemRom.SHA512 = Constants.SHA512Zero; } // If the file has no size and it's not the above case, skip and log else if (itemRom.ItemStatus != ItemStatus.Nodump && (itemRom.Size == 0 || itemRom.Size == -1)) @@ -2842,7 +3052,9 @@ namespace SabreTools.Helper.Dats && String.IsNullOrEmpty(itemRom.CRC) && String.IsNullOrEmpty(itemRom.MD5) && String.IsNullOrEmpty(itemRom.SHA1) - && String.IsNullOrEmpty(itemRom.SHA256)) + && String.IsNullOrEmpty(itemRom.SHA256) + && String.IsNullOrEmpty(itemRom.SHA384) + && String.IsNullOrEmpty(itemRom.SHA512)) { logger.Verbose("Incomplete entry for \"" + itemRom.Name + "\" will be output as nodump"); itemRom.ItemStatus = ItemStatus.Nodump; @@ -2858,12 +3070,16 @@ namespace SabreTools.Helper.Dats itemDisk.MD5 = Style.CleanHashData(itemDisk.MD5, Constants.MD5Length); itemDisk.SHA1 = Style.CleanHashData(itemDisk.SHA1, Constants.SHA1Length); itemDisk.SHA256 = Style.CleanHashData(itemDisk.SHA256, Constants.SHA256Length); + itemDisk.SHA384 = Style.CleanHashData(itemDisk.SHA384, Constants.SHA384Length); + itemDisk.SHA512 = Style.CleanHashData(itemDisk.SHA512, Constants.SHA512Length); // If the file has aboslutely no hashes, skip and log if (itemDisk.ItemStatus != ItemStatus.Nodump && String.IsNullOrEmpty(itemDisk.MD5) && String.IsNullOrEmpty(itemDisk.SHA1) - && String.IsNullOrEmpty(itemDisk.SHA256)) + && String.IsNullOrEmpty(itemDisk.SHA256) + && String.IsNullOrEmpty(itemDisk.SHA384) + && String.IsNullOrEmpty(itemDisk.SHA512)) { logger.Verbose("Incomplete entry for \"" + itemDisk.Name + "\" will be output as nodump"); itemDisk.ItemStatus = ItemStatus.Nodump; @@ -2912,6 +3128,8 @@ namespace SabreTools.Helper.Dats MD5Count += (String.IsNullOrEmpty(((Disk)item).MD5) ? 0 : 1); SHA1Count += (String.IsNullOrEmpty(((Disk)item).SHA1) ? 0 : 1); SHA256Count += (String.IsNullOrEmpty(((Disk)item).SHA256) ? 0 : 1); + SHA384Count += (String.IsNullOrEmpty(((Disk)item).SHA384) ? 0 : 1); + SHA512Count += (String.IsNullOrEmpty(((Disk)item).SHA512) ? 0 : 1); BaddumpCount += (((Disk)item).ItemStatus == ItemStatus.BadDump ? 1 : 0); NodumpCount += (((Disk)item).ItemStatus == ItemStatus.Nodump ? 1 : 0); break; @@ -2925,6 +3143,8 @@ namespace SabreTools.Helper.Dats MD5Count += (String.IsNullOrEmpty(((Rom)item).MD5) ? 0 : 1); SHA1Count += (String.IsNullOrEmpty(((Rom)item).SHA1) ? 0 : 1); SHA256Count += (String.IsNullOrEmpty(((Rom)item).SHA256) ? 0 : 1); + SHA384Count += (String.IsNullOrEmpty(((Rom)item).SHA384) ? 0 : 1); + SHA512Count += (String.IsNullOrEmpty(((Rom)item).SHA512) ? 0 : 1); BaddumpCount += (((Rom)item).ItemStatus == ItemStatus.BadDump ? 1 : 0); NodumpCount += (((Rom)item).ItemStatus == ItemStatus.Nodump ? 1 : 0); break; diff --git a/SabreTools.Helper/Dats/Partials/DatFile.Rebuild.cs b/SabreTools.Helper/Dats/Partials/DatFile.Rebuild.cs index 8bf58555..3c00d11d 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.Rebuild.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.Rebuild.cs @@ -389,7 +389,7 @@ namespace SabreTools.Helper.Dats // If we're supposed to scan the file externally if (shouldExternalProcess) { - Rom rom = FileTools.GetFileInfo(file, logger, noMD5: quickScan, noSHA1: quickScan, header: headerToCheckAgainst); + Rom rom = FileTools.GetFileInfo(file, logger, omitFromScan: (quickScan ? Hash.DeepHashes : 0x0), header: headerToCheckAgainst); usedExternally = RebuildIndividualFile(rom, file, outDir, tempSubDir, date, inverse, outputFormat, romba, updateDat, false /* isZip */, headerToCheckAgainst, logger); } @@ -423,7 +423,7 @@ namespace SabreTools.Helper.Dats List extracted = Directory.EnumerateFiles(tempSubDir, "*", SearchOption.AllDirectories).ToList(); foreach (string entry in extracted) { - Rom rom = FileTools.GetFileInfo(entry, logger, noMD5: quickScan, noSHA1: quickScan); + Rom rom = FileTools.GetFileInfo(entry, logger, omitFromScan: (quickScan ? Hash.DeepHashes : 0x0)); usedInternally &= RebuildIndividualFile(rom, entry, outDir, tempSubDir, date, inverse, outputFormat, romba, updateDat, false /* isZip */, headerToCheckAgainst, logger); } @@ -431,7 +431,7 @@ namespace SabreTools.Helper.Dats // Otherwise, just get the info on the file itself else if (File.Exists(file)) { - Rom rom = FileTools.GetFileInfo(file, logger, noMD5: quickScan, noSHA1: quickScan); + Rom rom = FileTools.GetFileInfo(file, logger, omitFromScan: (quickScan ? Hash.DeepHashes : 0x0)); usedExternally = RebuildIndividualFile(rom, file, outDir, tempSubDir, date, inverse, outputFormat, romba, updateDat, false /* isZip */, headerToCheckAgainst, logger); } @@ -914,7 +914,7 @@ namespace SabreTools.Helper.Dats foreach (string input in inputs) { // TODO: Eventually migrate noSHA256 to quickScan instead of true - PopulateFromDir(input, quickScan /* noMD5 */, quickScan /* noSHA1 */, true /* noSHA256 */, true /* bare */, false /* archivesAsFiles */, + PopulateFromDir(input, (quickScan ? Hash.DeepHashes : 0x0) /* omitFromScan */, true /* bare */, false /* archivesAsFiles */, true /* enableGzip */, false /* addBlanks */, false /* addDate */, tempDir /* tempDir */, false /* copyFiles */, headerToCheckAgainst, 4 /* maxDegreeOfParallelism */, logger); } diff --git a/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs b/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs index 64d6b90e..09ffb338 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs @@ -180,7 +180,9 @@ namespace SabreTools.Helper.Dats && ((Rom)rom).CRC == "null" && ((Rom)rom).MD5 == "null" && ((Rom)rom).SHA1 == "null" - && ((Rom)rom).SHA256 == "null") + && ((Rom)rom).SHA256 == "null" + && ((Rom)rom).SHA384 == "null" + && ((Rom)rom).SHA512 == "null") { logger.Verbose("Empty folder found: " + rom.Machine.Name); @@ -196,6 +198,8 @@ namespace SabreTools.Helper.Dats ((Rom)rom).MD5 = Constants.MD5Zero; ((Rom)rom).SHA1 = Constants.SHA1Zero; ((Rom)rom).SHA256 = Constants.SHA256Zero; + ((Rom)rom).SHA384 = Constants.SHA384Zero; + ((Rom)rom).SHA512 = Constants.SHA512Zero; } // Otherwise, set the new path and such, write out, and continue @@ -696,6 +700,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Disk)rom).MD5) ? " md5 " + ((Disk)rom).MD5.ToLowerInvariant() : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA1) ? " sha1 " + ((Disk)rom).SHA1.ToLowerInvariant() : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA256) ? " sha256 " + ((Disk)rom).SHA256.ToLowerInvariant() : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA384) ? " sha384 " + ((Disk)rom).SHA384.ToLowerInvariant() : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA512) ? " sha512 " + ((Disk)rom).SHA512.ToLowerInvariant() : "") + (((Disk)rom).ItemStatus != ItemStatus.None ? " flags " + ((Disk)rom).ItemStatus.ToString().ToLowerInvariant() : "") + " )\n"; break; @@ -716,6 +722,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Rom)rom).MD5) ? " md5 " + ((Rom)rom).MD5.ToLowerInvariant() : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA1) ? " sha1 " + ((Rom)rom).SHA1.ToLowerInvariant() : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA256) ? " sha256 " + ((Rom)rom).SHA256.ToLowerInvariant() : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA384) ? " sha384 " + ((Rom)rom).SHA384.ToLowerInvariant() : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA512) ? " sha512 " + ((Rom)rom).SHA512.ToLowerInvariant() : "") + (!String.IsNullOrEmpty(((Rom)rom).Date) ? " date \"" + ((Rom)rom).Date + "\"" : "") + (((Rom)rom).ItemStatus != ItemStatus.None ? " flags " + ((Rom)rom).ItemStatus.ToString().ToLowerInvariant() : "") + " )\n"; @@ -747,6 +755,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Rom)rom).MD5) .Replace("%sha1%", ((Rom)rom).SHA1) .Replace("%sha256%", ((Rom)rom).SHA256) + .Replace("%sha384%", ((Rom)rom).SHA384) + .Replace("%sha512%", ((Rom)rom).SHA512) .Replace("%size%", ((Rom)rom).Size.ToString()); post = post .Replace("%game%", rom.Machine.Name) @@ -755,6 +765,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Rom)rom).MD5) .Replace("%sha1%", ((Rom)rom).SHA1) .Replace("%sha256%", ((Rom)rom).SHA256) + .Replace("%sha384%", ((Rom)rom).SHA384) + .Replace("%sha512%", ((Rom)rom).SHA512) .Replace("%size%", ((Rom)rom).Size.ToString()); } else if (rom.Type == ItemType.Disk) @@ -767,6 +779,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Disk)rom).MD5) .Replace("%sha1%", ((Disk)rom).SHA1) .Replace("%sha256%", ((Disk)rom).SHA256) + .Replace("%sha384%", ((Disk)rom).SHA384) + .Replace("%sha512%", ((Disk)rom).SHA512) .Replace("%size%", string.Empty);; post = post .Replace("%game%", rom.Machine.Name) @@ -775,6 +789,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Disk)rom).MD5) .Replace("%sha1%", ((Disk)rom).SHA1) .Replace("%sha256%", ((Disk)rom).SHA256) + .Replace("%sha384%", ((Disk)rom).SHA384) + .Replace("%sha512%", ((Disk)rom).SHA512) .Replace("%size%", string.Empty);; } else @@ -811,6 +827,8 @@ namespace SabreTools.Helper.Dats + ",\"" + ((Rom)rom).MD5 + "\"" + ",\"" + ((Rom)rom).SHA1 + "\"" + ",\"" + ((Rom)rom).SHA256 + "\"" + // + ",\"" + ((Rom)rom).SHA384 + "\"" + // + ",\"" + ((Rom)rom).SHA512 + "\"" + "," + (((Rom)rom).ItemStatus != ItemStatus.None ? "\"" + ((Rom)rom).ItemStatus.ToString() + "\"" : "\"\""); state += pre + inline + post + "\n"; } @@ -829,6 +847,8 @@ namespace SabreTools.Helper.Dats + ",\"" + ((Disk)rom).MD5 + "\"" + ",\"" + ((Disk)rom).SHA1 + "\"" + ",\"" + ((Disk)rom).SHA256 + "\"" + // + ",\"" + ((Rom)rom).SHA384 + "\"" + // + ",\"" + ((Rom)rom).SHA512 + "\"" + "," + (((Disk)rom).ItemStatus != ItemStatus.None ? "\"" + ((Disk)rom).ItemStatus.ToString() + "\"" : "\"\""); state += pre + inline + post + "\n"; } @@ -872,6 +892,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Disk)rom).MD5) ? " md5=\"" + ((Disk)rom).MD5.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA1) ? " sha1=\"" + ((Disk)rom).SHA1.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA256) ? " sha256=\"" + ((Disk)rom).SHA256.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA384) ? " sha384=\"" + ((Disk)rom).SHA384.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA512) ? " sha512=\"" + ((Disk)rom).SHA512.ToLowerInvariant() + "\"" : "") + (((Disk)rom).ItemStatus != ItemStatus.None ? " status=\"" + ((Disk)rom).ItemStatus.ToString().ToLowerInvariant() + "\"" : "") + "/>\n"; break; @@ -892,6 +914,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Rom)rom).MD5) ? " md5=\"" + ((Rom)rom).MD5.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA1) ? " sha1=\"" + ((Rom)rom).SHA1.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA256) ? " sha256=\"" + ((Rom)rom).SHA256.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA384) ? " sha384=\"" + ((Rom)rom).SHA384.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA512) ? " sha512=\"" + ((Rom)rom).SHA512.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).Date) ? " date=\"" + ((Rom)rom).Date + "\"" : "") + (((Rom)rom).ItemStatus != ItemStatus.None ? " status=\"" + ((Rom)rom).ItemStatus.ToString().ToLowerInvariant() + "\"" : "") + "/>\n"; @@ -916,6 +940,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Rom)rom).MD5) .Replace("%sha1%", ((Rom)rom).SHA1) .Replace("%sha256%", ((Rom)rom).SHA256) + .Replace("%sha384%", ((Rom)rom).SHA384) + .Replace("%sha512%", ((Rom)rom).SHA512) .Replace("%size%", ((Rom)rom).Size.ToString()); post = post .Replace("%game%", rom.Machine.Name) @@ -924,6 +950,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Rom)rom).MD5) .Replace("%sha1%", ((Rom)rom).SHA1) .Replace("%sha256%", ((Rom)rom).SHA256) + .Replace("%sha384%", ((Rom)rom).SHA384) + .Replace("%sha512%", ((Rom)rom).SHA512) .Replace("%size%", ((Rom)rom).Size.ToString()); } else if (rom.Type == ItemType.Disk) @@ -936,6 +964,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Disk)rom).MD5) .Replace("%sha1%", ((Disk)rom).SHA1) .Replace("%sha256%", ((Disk)rom).SHA256) + .Replace("%sha384%", ((Disk)rom).SHA384) + .Replace("%sha512%", ((Disk)rom).SHA512) .Replace("%size%", string.Empty); post = post .Replace("%game%", rom.Machine.Name) @@ -944,6 +974,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Disk)rom).MD5) .Replace("%sha1%", ((Disk)rom).SHA1) .Replace("%sha256%", ((Disk)rom).SHA256) + .Replace("%sha384%", ((Disk)rom).SHA384) + .Replace("%sha512%", ((Disk)rom).SHA512) .Replace("%size%", string.Empty); } else @@ -1112,6 +1144,26 @@ namespace SabreTools.Helper.Dats state += ((Disk)rom).SHA256 + " *" + (GameName ? rom.Machine.Name + Path.DirectorySeparatorChar : "") + rom.Name + "\n"; } break; + case DatFormat.RedumpSHA384: + if (rom.Type == ItemType.Rom) + { + state += ((Rom)rom).SHA384 + " *" + (GameName ? rom.Machine.Name + Path.DirectorySeparatorChar : "") + rom.Name + "\n"; + } + else if (rom.Type == ItemType.Disk) + { + state += ((Disk)rom).SHA384 + " *" + (GameName ? rom.Machine.Name + Path.DirectorySeparatorChar : "") + rom.Name + "\n"; + } + break; + case DatFormat.RedumpSHA512: + if (rom.Type == ItemType.Rom) + { + state += ((Rom)rom).SHA512 + " *" + (GameName ? rom.Machine.Name + Path.DirectorySeparatorChar : "") + rom.Name + "\n"; + } + else if (rom.Type == ItemType.Disk) + { + state += ((Disk)rom).SHA512 + " *" + (GameName ? rom.Machine.Name + Path.DirectorySeparatorChar : "") + rom.Name + "\n"; + } + break; case DatFormat.RomCenter: if (rom.Type == ItemType.Rom) { @@ -1161,6 +1213,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Disk)rom).MD5) ? " md5=\"" + ((Disk)rom).MD5.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA1) ? " sha1=\"" + ((Disk)rom).SHA1.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA256) ? " sha256=\"" + ((Disk)rom).SHA256.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA384) ? " sha384=\"" + ((Disk)rom).SHA384.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA512) ? " sha512=\"" + ((Disk)rom).SHA512.ToLowerInvariant() + "\"" : "") + (((Disk)rom).ItemStatus != ItemStatus.None ? prefix + "/>\n" + prefix + "\t\n" + prefix + "\t\t\n" + prefix + "\t\n" + @@ -1183,6 +1237,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Rom)rom).MD5) ? " md5=\"" + ((Rom)rom).MD5.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA1) ? " sha1=\"" + ((Rom)rom).SHA1.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA256) ? " sha256=\"" + ((Rom)rom).SHA256.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA384) ? " sha384=\"" + ((Rom)rom).SHA384.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA512) ? " sha512=\"" + ((Rom)rom).SHA512.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).Date) ? " date=\"" + ((Rom)rom).Date + "\"" : "") + (((Rom)rom).ItemStatus != ItemStatus.None ? prefix + "/>\n" + prefix + "\t\n" + prefix + "\t\t\n" + @@ -1230,6 +1286,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Disk)rom).MD5) ? " md5=\"" + ((Disk)rom).MD5.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA1) ? " sha1=\"" + ((Disk)rom).SHA1.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Disk)rom).SHA256) ? " sha256=\"" + ((Disk)rom).SHA256.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA384) ? " sha384=\"" + ((Disk)rom).SHA384.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Disk)rom).SHA512) ? " sha512=\"" + ((Disk)rom).SHA512.ToLowerInvariant() + "\"" : "") + (((Disk)rom).ItemStatus != ItemStatus.None ? " status=\"" + ((Disk)rom).ItemStatus.ToString().ToLowerInvariant() + "\"" : "") + "/>\n" + "\t\t\t\n"; @@ -1256,6 +1314,8 @@ namespace SabreTools.Helper.Dats + (!String.IsNullOrEmpty(((Rom)rom).MD5) ? " md5=\"" + ((Rom)rom).MD5.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA1) ? " sha1=\"" + ((Rom)rom).SHA1.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).SHA256) ? " sha256=\"" + ((Rom)rom).SHA256.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA384) ? " sha384=\"" + ((Rom)rom).SHA384.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(((Rom)rom).SHA512) ? " sha512=\"" + ((Rom)rom).SHA512.ToLowerInvariant() + "\"" : "") + (!String.IsNullOrEmpty(((Rom)rom).Date) ? " date=\"" + ((Rom)rom).Date + "\"" : "") + (((Rom)rom).ItemStatus != ItemStatus.None ? " status=\"" + ((Rom)rom).ItemStatus.ToString().ToLowerInvariant() + "\"" : "") + "/>\n" @@ -1292,6 +1352,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Rom)rom).MD5) .Replace("%sha1%", ((Rom)rom).SHA1) .Replace("%sha256%", ((Rom)rom).SHA256) + .Replace("%sha384%", ((Rom)rom).SHA384) + .Replace("%sha512%", ((Rom)rom).SHA512) .Replace("%size%", ((Rom)rom).Size.ToString()); post = post .Replace("%game%", rom.Machine.Name) @@ -1300,6 +1362,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Rom)rom).MD5) .Replace("%sha1%", ((Rom)rom).SHA1) .Replace("%sha256%", ((Rom)rom).SHA256) + .Replace("%sha384%", ((Rom)rom).SHA384) + .Replace("%sha512%", ((Rom)rom).SHA512) .Replace("%size%", ((Rom)rom).Size.ToString()); } else if (rom.Type == ItemType.Disk) @@ -1312,6 +1376,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Disk)rom).MD5) .Replace("%sha1%", ((Disk)rom).SHA1) .Replace("%sha256%", ((Disk)rom).SHA256) + .Replace("%sha384%", ((Disk)rom).SHA384) + .Replace("%sha512%", ((Disk)rom).SHA512) .Replace("%size%", string.Empty); post = post .Replace("%game%", rom.Machine.Name) @@ -1320,6 +1386,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", ((Disk)rom).MD5) .Replace("%sha1%", ((Disk)rom).SHA1) .Replace("%sha256%", ((Disk)rom).SHA256) + .Replace("%sha384%", ((Disk)rom).SHA384) + .Replace("%sha512%", ((Disk)rom).SHA512) .Replace("%size%", string.Empty);; } else @@ -1332,6 +1400,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", string.Empty) .Replace("%sha1%", string.Empty) .Replace("%sha256%", string.Empty) + .Replace("%sha384%", string.Empty) + .Replace("%sha512%", string.Empty) .Replace("%size%", string.Empty); post = post .Replace("%game%", rom.Machine.Name) @@ -1340,6 +1410,8 @@ namespace SabreTools.Helper.Dats .Replace("%md5%", string.Empty) .Replace("%sha1%", string.Empty) .Replace("%sha256%", string.Empty) + .Replace("%sha384%", string.Empty) + .Replace("%sha512%", string.Empty) .Replace("%size%", string.Empty);; } @@ -1359,6 +1431,8 @@ namespace SabreTools.Helper.Dats + "\t\"" + ((Rom)rom).MD5 + "\"" + "\t\"" + ((Rom)rom).SHA1 + "\"" + "\t\"" + ((Rom)rom).SHA256 + "\"" + // + "\t\"" + ((Rom)rom).SHA384 + "\"" + // + "\t\"" + ((Rom)rom).SHA512 + "\"" + "\t" + (((Rom)rom).ItemStatus != ItemStatus.None ? "\"" + ((Rom)rom).ItemStatus.ToString() + "\"" : "\"\""); state += pre + inline + post + "\n"; } @@ -1377,6 +1451,8 @@ namespace SabreTools.Helper.Dats + "\t\"" + ((Disk)rom).MD5 + "\"" + "\t\"" + ((Disk)rom).SHA1 + "\"" + "\t\"" + ((Disk)rom).SHA256 + "\"" + // + "\t\"" + ((Disk)rom).SHA384 + "\"" + // + "\t\"" + ((Disk)rom).SHA512 + "\"" + "\t" + (((Disk)rom).ItemStatus != ItemStatus.None ? "\"" + ((Disk)rom).ItemStatus.ToString() + "\"" : "\"\""); state += pre + inline + post + "\n"; } diff --git a/SabreTools.Helper/Dats/Rom.cs b/SabreTools.Helper/Dats/Rom.cs index 582b7a22..75344b14 100644 --- a/SabreTools.Helper/Dats/Rom.cs +++ b/SabreTools.Helper/Dats/Rom.cs @@ -64,6 +64,8 @@ namespace SabreTools.Helper.Dats _md5 = "null"; _sha1 = "null"; _sha256 = "null"; + _sha384 = "null"; + _sha512 = "null"; _itemStatus = ItemStatus.None; _machine = new Machine @@ -104,6 +106,8 @@ namespace SabreTools.Helper.Dats MD5 = this.MD5, SHA1 = this.SHA1, SHA256 = this.SHA256, + SHA384 = this.SHA384, + SHA512 = this.SHA512, ItemStatus = this.ItemStatus, Size = this.Size, CRC = this.CRC, @@ -138,7 +142,9 @@ namespace SabreTools.Helper.Dats && ((String.IsNullOrEmpty(this.CRC) || String.IsNullOrEmpty(newOther.CRC)) || this.CRC == newOther.CRC) && ((String.IsNullOrEmpty(this.MD5) || String.IsNullOrEmpty(newOther.MD5)) || this.MD5 == newOther.MD5) && ((String.IsNullOrEmpty(this.SHA1) || String.IsNullOrEmpty(newOther.SHA1)) || this.SHA1 == newOther.SHA1) - && ((String.IsNullOrEmpty(this.SHA256) || String.IsNullOrEmpty(newOther.SHA256)) || this.SHA256 == newOther.SHA256)) + && ((String.IsNullOrEmpty(this.SHA256) || String.IsNullOrEmpty(newOther.SHA256)) || this.SHA256 == newOther.SHA256) + && ((String.IsNullOrEmpty(this.SHA384) || String.IsNullOrEmpty(newOther.SHA384)) || this.SHA384 == newOther.SHA384) + && ((String.IsNullOrEmpty(this.SHA512) || String.IsNullOrEmpty(newOther.SHA512)) || this.SHA512 == newOther.SHA512)) { dupefound = true; } diff --git a/SabreTools.Helper/Tools/FileTools.cs b/SabreTools.Helper/Tools/FileTools.cs index 4ef0505a..3a9a7d47 100644 --- a/SabreTools.Helper/Tools/FileTools.cs +++ b/SabreTools.Helper/Tools/FileTools.cs @@ -73,7 +73,8 @@ namespace SabreTools.Helper.Tools { ext = ext.Substring(1); } - if (ext != "csv" && ext != "dat" && ext != "md5" && ext != "sfv" && ext != "sha1" && ext != "tsv" && ext != "txt" && ext != "xml") + if (ext != "csv" && ext != "dat" && ext != "md5" && ext != "sfv" && ext != "sha1" + && ext != "sha384" && ext != "sha512" && ext != "tsv" && ext != "txt" && ext != "xml") { return 0; } @@ -105,6 +106,14 @@ namespace SabreTools.Helper.Tools { return DatFormat.RedumpSHA256; } + if (ext == "sha384") + { + return DatFormat.RedumpSHA384; + } + if (ext == "sha512") + { + return DatFormat.RedumpSHA512; + } // For everything else, we need to read it try