using System.Collections.Generic; using System.Linq; using SabreTools.Core.Tools; using SabreTools.DatItems; using SabreTools.DatItems.Formats; namespace SabreTools.Filtering { /// /// Replace fields in DatItems /// public static class Replacer { /// /// Replace fields with given values /// /// Machine to replace fields in /// Machine to pull new information from /// List of fields representing what should be updated /// True if descriptions should only be replaced if the game name is the same, false otherwise public static void ReplaceFields(Machine machine, Machine repMachine, List machineFieldNames, bool onlySame) { // If we have an invalid input, return if (machine == null || repMachine == null || machineFieldNames == null) return; // Loop through and replace fields foreach (string fieldName in machineFieldNames) { // Special case for description if (machineFieldNames.Contains(Models.Metadata.Machine.DescriptionKey)) { if (!onlySame || (onlySame && machine.GetStringFieldValue(Models.Metadata.Machine.NameKey) == machine.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey))) machine.SetFieldValue(Models.Metadata.Machine.DescriptionKey, repMachine.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey)); continue; } machine.ReplaceField(repMachine, fieldName); } } /// /// Replace fields with given values /// /// DatItem to replace fields in /// DatItem to pull new information from /// List of fields representing what should be updated public static void ReplaceFields(DatItem datItem, DatItem repDatItem, Dictionary> itemFieldNames) { // If we have an invalid input, return if (datItem == null || repDatItem == null || itemFieldNames == null) return; #region Common if (datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) != repDatItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey)) return; // If there are no field names for this type or generic, return string? itemType = datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue().AsStringValue(); if (itemType == null || (!itemFieldNames.ContainsKey(itemType) && !itemFieldNames.ContainsKey("item"))) return; // Get the combined list of fields to remove var fieldNames = new List(); if (itemFieldNames.ContainsKey(itemType)) fieldNames.AddRange(itemFieldNames[itemType]); if (itemFieldNames.ContainsKey("item")) fieldNames.AddRange(itemFieldNames["item"]); fieldNames = fieldNames.Distinct().ToList(); // If the field specifically contains Name, set it separately if (fieldNames.Contains(Models.Metadata.Rom.NameKey)) datItem.SetName(repDatItem.GetName()); #endregion #region Item-Specific // Handle normal sets first foreach (var fieldName in fieldNames) { datItem.ReplaceField(repDatItem, fieldName); } // TODO: Filter out hashes before here so these checks actually work // Handle special cases switch (datItem, repDatItem) { case (Disk disk, Disk repDisk): ReplaceFields(disk, repDisk, fieldNames); break; case (Media media, Media repMedia): ReplaceFields(media, repMedia, fieldNames); break; case (Rom rom, Rom repRom): ReplaceFields(rom, repRom, fieldNames); break; } #endregion } /// /// Replace fields with given values /// /// Disk to remove replace fields in /// Disk to pull new information from /// List of fields representing what should be updated private static void ReplaceFields(Disk disk, Disk newItem, List datItemFields) { if (datItemFields.Contains(Models.Metadata.Disk.MD5Key)) { if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Disk.MD5Key))) disk.SetFieldValue(Models.Metadata.Disk.MD5Key, newItem.GetStringFieldValue(Models.Metadata.Disk.MD5Key)); } if (datItemFields.Contains(Models.Metadata.Disk.SHA1Key)) { if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))) disk.SetFieldValue(Models.Metadata.Disk.SHA1Key, newItem.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)); } } /// /// Replace fields with given values /// /// Media to remove replace fields in /// Media to pull new information from /// List of fields representing what should be updated private static void ReplaceFields(Media media, Media newItem, List datItemFields) { if (datItemFields.Contains(Models.Metadata.Media.MD5Key)) { if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.MD5Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Media.MD5Key))) media.SetFieldValue(Models.Metadata.Media.MD5Key, newItem.GetStringFieldValue(Models.Metadata.Media.MD5Key)); } if (datItemFields.Contains(Models.Metadata.Media.SHA1Key)) { if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Media.SHA1Key))) media.SetFieldValue(Models.Metadata.Media.SHA1Key, newItem.GetStringFieldValue(Models.Metadata.Media.SHA1Key)); } if (datItemFields.Contains(Models.Metadata.Media.SHA256Key)) { if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA256Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Media.SHA256Key))) media.SetFieldValue(Models.Metadata.Media.SHA256Key, newItem.GetStringFieldValue(Models.Metadata.Media.SHA256Key)); } if (datItemFields.Contains(Models.Metadata.Media.SpamSumKey)) { if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Media.SpamSumKey))) media.SetFieldValue(Models.Metadata.Media.SpamSumKey, newItem.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)); } } /// /// Replace fields with given values /// /// Rom to remove replace fields in /// Rom to pull new information from /// List of fields representing what should be updated private static void ReplaceFields(Rom rom, Rom newItem, List datItemFields) { if (datItemFields.Contains(Models.Metadata.Rom.CRCKey)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey))) rom.SetFieldValue(Models.Metadata.Rom.CRCKey, newItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey)); } if (datItemFields.Contains(Models.Metadata.Rom.MD5Key)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key))) rom.SetFieldValue(Models.Metadata.Rom.MD5Key, newItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key)); } if (datItemFields.Contains(Models.Metadata.Rom.SHA1Key)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))) rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, newItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)); } if (datItemFields.Contains(Models.Metadata.Rom.SHA256Key)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))) rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, newItem.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)); } if (datItemFields.Contains(Models.Metadata.Rom.SHA384Key)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))) rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, newItem.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)); } if (datItemFields.Contains(Models.Metadata.Rom.SHA512Key)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))) rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, newItem.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)); } if (datItemFields.Contains(Models.Metadata.Rom.SpamSumKey)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey))) rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, newItem.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)); } } } }