diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs index d66e1182..9aac47fc 100644 --- a/SabreTools.DatFiles/DatFile.cs +++ b/SabreTools.DatFiles/DatFile.cs @@ -178,96 +178,7 @@ namespace SabreTools.DatFiles /// True to only add item statistics while parsing, false otherwise /// The key for the item protected string ParseAddHelper(DatItem item, bool statsOnly) - { - string key; - - // If we have a Disk, Media, or Rom, clean the hash data - if (item is Disk disk) - { - // If the file has aboslutely no hashes, skip and log - if (disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue() != ItemStatus.Nodump - && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)) - && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))) - { - logger.Verbose($"Incomplete entry for '{disk.GetName()}' will be output as nodump"); - disk.SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.Nodump.AsStringValue()); - } - - item = disk; - } - if (item is Media media) - { - // If the file has aboslutely no hashes, skip and log - if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.MD5Key)) - && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key)) - && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA256Key)) - && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SpamSumKey))) - { - logger.Verbose($"Incomplete entry for '{media.GetName()}' will be output as nodump"); - } - - item = media; - } - else if (item is Rom rom) - { - long? size = rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey); - - // If we have the case where there is SHA-1 and nothing else, we don't fill in any other part of the data - if (size == null && !rom.HasHashes()) - { - // No-op, just catch it so it doesn't go further - logger.Verbose($"{Header.GetStringFieldValue(DatHeader.FileNameKey)}: Entry with only SHA-1 found - '{rom.GetName()}'"); - } - - // 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 - else if ((size == 0 || size == null) - && (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)) || rom.HasZeroHash())) - { - rom.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); - rom.SetFieldValue(Models.Metadata.Rom.CRCKey, Constants.CRCZero); - rom.SetFieldValue(Models.Metadata.Rom.MD5Key, Constants.MD5Zero); - rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, Constants.SHA1Zero); - rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, null); // Constants.SHA256Zero; - rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, null); // Constants.SHA384Zero; - rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, null); // Constants.SHA512Zero; - rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, null); // Constants.SpamSumZero; - } - - // If the file has no size and it's not the above case, skip and log - else if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue() != ItemStatus.Nodump && (size == 0 || size == null)) - { - logger.Verbose($"{Header.GetStringFieldValue(DatHeader.FileNameKey)}: Incomplete entry for '{rom.GetName()}' will be output as nodump"); - rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump.AsStringValue()); - } - - // If the file has a size but aboslutely no hashes, skip and log - else if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue() != ItemStatus.Nodump - && size != null && size > 0 - && !rom.HasHashes()) - { - logger.Verbose($"{Header.GetStringFieldValue(DatHeader.FileNameKey)}: Incomplete entry for '{rom.GetName()}' will be output as nodump"); - rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump.AsStringValue()); - } - - item = rom; - } - - // Get the key and add the file - key = item.GetKey(ItemKey.Machine); - - // If only adding statistics, we add an empty key for games and then just item stats - if (statsOnly) - { - Items.EnsureKey(key); - Items.DatStatistics.AddItemStatistics(item); - } - else - { - Items.Add(key, item); - } - - return key; - } + => Items.AddItem(item, statsOnly); #endregion diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs index df965733..957470c3 100644 --- a/SabreTools.DatFiles/ItemDictionary.cs +++ b/SabreTools.DatFiles/ItemDictionary.cs @@ -11,6 +11,7 @@ using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; using SabreTools.Core.Filter; +using SabreTools.Core.Tools; using SabreTools.DatItems; using SabreTools.DatItems.Formats; using SabreTools.Hashing; @@ -180,6 +181,104 @@ namespace SabreTools.DatFiles AddRange(key, value); } + /// + /// Add a DatItem to the dictionary after checking + /// + /// Item data to check against + /// True to only add item statistics while parsing, false otherwise + /// The key for the item + public string AddItem(DatItem item, bool statsOnly) + { + string key; + + // If we have a Disk, Media, or Rom, clean the hash data + if (item is Disk disk) + { + // If the file has aboslutely no hashes, skip and log + if (disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue() != ItemStatus.Nodump + && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)) + && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))) + { + logger.Verbose($"Incomplete entry for '{disk.GetName()}' will be output as nodump"); + disk.SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.Nodump.AsStringValue()); + } + + item = disk; + } + if (item is Media media) + { + // If the file has aboslutely no hashes, skip and log + if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.MD5Key)) + && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key)) + && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA256Key)) + && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SpamSumKey))) + { + logger.Verbose($"Incomplete entry for '{media.GetName()}' will be output as nodump"); + } + + item = media; + } + else if (item is Rom rom) + { + long? size = rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey); + + // If we have the case where there is SHA-1 and nothing else, we don't fill in any other part of the data + if (size == null && !rom.HasHashes()) + { + // No-op, just catch it so it doesn't go further + //logger.Verbose($"{Header.GetStringFieldValue(DatHeader.FileNameKey)}: Entry with only SHA-1 found - '{rom.GetName()}'"); + } + + // 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 + else if ((size == 0 || size == null) + && (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)) || rom.HasZeroHash())) + { + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, Constants.CRCZero); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, Constants.MD5Zero); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, Constants.SHA1Zero); + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, null); // Constants.SHA256Zero; + rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, null); // Constants.SHA384Zero; + rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, null); // Constants.SHA512Zero; + rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, null); // Constants.SpamSumZero; + } + + // If the file has no size and it's not the above case, skip and log + else if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue() != ItemStatus.Nodump && (size == 0 || size == null)) + { + //logger.Verbose($"{Header.GetStringFieldValue(DatHeader.FileNameKey)}: Incomplete entry for '{rom.GetName()}' will be output as nodump"); + rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump.AsStringValue()); + } + + // If the file has a size but aboslutely no hashes, skip and log + else if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue() != ItemStatus.Nodump + && size != null && size > 0 + && !rom.HasHashes()) + { + //logger.Verbose($"{Header.GetStringFieldValue(DatHeader.FileNameKey)}: Incomplete entry for '{rom.GetName()}' will be output as nodump"); + rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump.AsStringValue()); + } + + item = rom; + } + + // Get the key and add the file + key = item.GetKey(ItemKey.Machine); + + // If only adding statistics, we add an empty key for games and then just item stats + if (statsOnly) + { + EnsureKey(key); + DatStatistics.AddItemStatistics(item); + } + else + { + Add(key, item); + } + + return key; + } + /// /// Add a range of values to the file dictionary ///