diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 57ce251c..3faea580 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -3080,60 +3080,62 @@ namespace SabreTools.Library.DatFiles /// /// Split a DAT by best available hashes /// - /// Name of the directory to write the DATs out to - /// True if split succeeded, false otherwise - /// TODO: Can this follow the same pattern as type split? - public bool SplitByHash(string outDir) + /// Dictionary of Field to DatFile mappings + public Dictionary SplitByHash() { // Create each of the respective output DATs Globals.Logger.User("Creating and populating new DATs"); - DatFile nodump = Create(Header.CloneStandard()); - nodump.Header.FileName += " (Nodump)"; - nodump.Header.Name += " (Nodump)"; - nodump.Header.Description += " (Nodump)"; + // Create the set of field-to-dat mappings + Dictionary fieldDats = new Dictionary(); - DatFile sha512 = Create(Header.CloneStandard()); - sha512.Header.FileName += " (SHA-512)"; - sha512.Header.Name += " (SHA-512)"; - sha512.Header.Description += " (SHA-512)"; + // TODO: Can this be made into a loop? + fieldDats[Field.DatItem_Status] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_Status].Header.FileName += " (Nodump)"; + fieldDats[Field.DatItem_Status].Header.Name += " (Nodump)"; + fieldDats[Field.DatItem_Status].Header.Description += " (Nodump)"; - DatFile sha384 = Create(Header.CloneStandard()); - sha384.Header.FileName += " (SHA-384)"; - sha384.Header.Name += " (SHA-384)"; - sha384.Header.Description += " (SHA-384)"; + fieldDats[Field.DatItem_SHA512] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_SHA512].Header.FileName += " (SHA-512)"; + fieldDats[Field.DatItem_SHA512].Header.Name += " (SHA-512)"; + fieldDats[Field.DatItem_SHA512].Header.Description += " (SHA-512)"; - DatFile sha256 = Create(Header.CloneStandard()); - sha256.Header.FileName += " (SHA-256)"; - sha256.Header.Name += " (SHA-256)"; - sha256.Header.Description += " (SHA-256)"; + fieldDats[Field.DatItem_SHA384] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_SHA384].Header.FileName += " (SHA-384)"; + fieldDats[Field.DatItem_SHA384].Header.Name += " (SHA-384)"; + fieldDats[Field.DatItem_SHA384].Header.Description += " (SHA-384)"; - DatFile sha1 = Create(Header.CloneStandard()); - sha1.Header.FileName += " (SHA-1)"; - sha1.Header.Name += " (SHA-1)"; - sha1.Header.Description += " (SHA-1)"; + fieldDats[Field.DatItem_SHA256] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_SHA256].Header.FileName += " (SHA-256)"; + fieldDats[Field.DatItem_SHA256].Header.Name += " (SHA-256)"; + fieldDats[Field.DatItem_SHA256].Header.Description += " (SHA-256)"; + + fieldDats[Field.DatItem_SHA1] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_SHA1].Header.FileName += " (SHA-1)"; + fieldDats[Field.DatItem_SHA1].Header.Name += " (SHA-1)"; + fieldDats[Field.DatItem_SHA1].Header.Description += " (SHA-1)"; #if NET_FRAMEWORK - DatFile ripemd160 = Create(Header.CloneStandard()); - ripemd160.Header.FileName += " (RIPEMD160)"; - ripemd160.Header.Name += " (RIPEMD160)"; - ripemd160.Header.Description += " (RIPEMD160)"; + fieldDats[Field.DatItem_RIPEMD160] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_RIPEMD160].Header.FileName += " (RIPEMD160)"; + fieldDats[Field.DatItem_RIPEMD160].Header.Name += " (RIPEMD160)"; + fieldDats[Field.DatItem_RIPEMD160].Header.Description += " (RIPEMD160)"; #endif - DatFile md5 = Create(Header.CloneStandard()); - md5.Header.FileName += " (MD5)"; - md5.Header.Name += " (MD5)"; - md5.Header.Description += " (MD5)"; + fieldDats[Field.DatItem_MD5] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_MD5].Header.FileName += " (MD5)"; + fieldDats[Field.DatItem_MD5].Header.Name += " (MD5)"; + fieldDats[Field.DatItem_MD5].Header.Description += " (MD5)"; - DatFile crc = Create(Header.CloneStandard()); - crc.Header.FileName += " (CRC)"; - crc.Header.Name += " (CRC)"; - crc.Header.Description += " (CRC)"; + fieldDats[Field.DatItem_CRC] = Create(Header.CloneStandard()); + fieldDats[Field.DatItem_CRC].Header.FileName += " (CRC)"; + fieldDats[Field.DatItem_CRC].Header.Name += " (CRC)"; + fieldDats[Field.DatItem_CRC].Header.Description += " (CRC)"; - DatFile other = Create(Header.CloneStandard()); - other.Header.FileName += " (Other)"; - other.Header.Name += " (Other)"; - other.Header.Description += " (Other)"; + fieldDats[Field.NULL] = Create(Header.CloneStandard()); + fieldDats[Field.NULL].Header.FileName += " (Other)"; + fieldDats[Field.NULL].Header.Name += " (Other)"; + fieldDats[Field.NULL].Header.Description += " (Other)"; // Now populate each of the DAT objects in turn Parallel.ForEach(Items.Keys, Globals.ParallelOptions, key => @@ -3149,26 +3151,26 @@ namespace SabreTools.Library.DatFiles if ((item.ItemType == ItemType.Rom && (item as Rom).ItemStatus == ItemStatus.Nodump) || (item.ItemType == ItemType.Disk && (item as Disk).ItemStatus == ItemStatus.Nodump)) { - nodump.Items.Add(key, item); + fieldDats[Field.DatItem_Status].Items.Add(key, item); } // If the file has a SHA-512 else if ((item.ItemType == ItemType.Rom && !string.IsNullOrWhiteSpace((item as Rom).SHA512))) { - sha512.Items.Add(key, item); + fieldDats[Field.DatItem_SHA512].Items.Add(key, item); } // If the file has a SHA-384 else if ((item.ItemType == ItemType.Rom && !string.IsNullOrWhiteSpace((item as Rom).SHA384))) { - sha384.Items.Add(key, item); + fieldDats[Field.DatItem_SHA384].Items.Add(key, item); } // If the file has a SHA-256 else if ((item.ItemType == ItemType.Media && !string.IsNullOrWhiteSpace((item as Media).SHA256)) || (item.ItemType == ItemType.Rom && !string.IsNullOrWhiteSpace((item as Rom).SHA256))) { - sha256.Items.Add(key, item); + fieldDats[Field.DatItem_SHA256].Items.Add(key, item); } // If the file has a SHA-1 @@ -3176,14 +3178,14 @@ namespace SabreTools.Library.DatFiles || (item.ItemType == ItemType.Media && !string.IsNullOrWhiteSpace((item as Media).SHA1)) || (item.ItemType == ItemType.Rom && !string.IsNullOrWhiteSpace((item as Rom).SHA1))) { - sha1.Items.Add(key, item); + fieldDats[Field.DatItem_SHA1].Items.Add(key, item); } #if NET_FRAMEWORK // If the file has a RIPEMD160 else if ((item.ItemType == ItemType.Rom && !string.IsNullOrWhiteSpace((item as Rom).RIPEMD160))) { - ripemd160.Items.Add(key, item); + fieldDats[Field.DatItem_RIPEMD160].Items.Add(key, item); } #endif @@ -3192,37 +3194,23 @@ namespace SabreTools.Library.DatFiles || (item.ItemType == ItemType.Media && !string.IsNullOrWhiteSpace((item as Media).MD5)) || (item.ItemType == ItemType.Rom && !string.IsNullOrWhiteSpace((item as Rom).MD5))) { - md5.Items.Add(key, item); + fieldDats[Field.DatItem_MD5].Items.Add(key, item); } // If the file has a CRC else if ((item.ItemType == ItemType.Rom && !string.IsNullOrWhiteSpace((item as Rom).CRC))) { - crc.Items.Add(key, item); + fieldDats[Field.DatItem_CRC].Items.Add(key, item); } else { - other.Items.Add(key, item); + fieldDats[Field.NULL].Items.Add(key, item); } } }); - // Now, output all of the files to the output directory - Globals.Logger.User("DAT information created, outputting new files"); - bool success = true; - success &= nodump.Write(outDir); - success &= sha512.Write(outDir); - success &= sha384.Write(outDir); - success &= sha256.Write(outDir); - success &= sha1.Write(outDir); -#if NET_FRAMEWORK - success &= ripemd160.Write(outDir); -#endif - success &= md5.Write(outDir); - success &= crc.Write(outDir); - - return success; + return fieldDats; } /// diff --git a/SabreTools/Features/Split.cs b/SabreTools/Features/Split.cs index 7347dca1..05f487d1 100644 --- a/SabreTools/Features/Split.cs +++ b/SabreTools/Features/Split.cs @@ -77,7 +77,19 @@ namespace SabreTools.Features // Hash splitting if (splittingMode.HasFlag(SplittingMode.Hash)) - internalDat.SplitByHash(OutputDir); + { + Dictionary typeDats = internalDat.SplitByHash(); + + InternalStopwatch watch = new InternalStopwatch("Outputting hash-split DATs"); + + // Loop through each type DatFile + Parallel.ForEach(typeDats.Keys, Globals.ParallelOptions, itemType => + { + typeDats[itemType].Write(OutputDir); + }); + + watch.Stop(); + } // Level splitting if (splittingMode.HasFlag(SplittingMode.Level))