diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index a2877fa7..b2f4c600 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -315,291 +315,9 @@ namespace SabreTools.Library.DatFiles List dupes = Items.GetDuplicates(datItem, sorted: true); DatItem newDatItem = datItem.Clone() as DatItem; - // Cast versions of the new DatItem for use below - var archive = newDatItem as Archive; - var biosSet = newDatItem as BiosSet; - var blank = newDatItem as Blank; - var disk = newDatItem as Disk; - var release = newDatItem as Release; - var rom = newDatItem as Rom; - var sample = newDatItem as Sample; - + // Replace fields from the first duplicate, if we have one if (dupes.Count > 0) - { - // Get the first duplicate for grabbing information from - var firstDupe = dupes.First(); - var archiveDupe = firstDupe as Archive; - var biosSetDupe = firstDupe as BiosSet; - var blankDupe = firstDupe as Blank; - var diskDupe = firstDupe as Disk; - var releaseDupe = firstDupe as Release; - var romDupe = firstDupe as Rom; - var sampleDupe = firstDupe as Sample; - - #region Non-hash fields - - if (updateFields.Contains(Field.Name)) - newDatItem.Name = firstDupe.Name; - - if (updateFields.Contains(Field.PartName)) - newDatItem.PartName = firstDupe.PartName; - - if (updateFields.Contains(Field.PartInterface)) - newDatItem.PartInterface = firstDupe.PartInterface; - - if (updateFields.Contains(Field.Features)) - newDatItem.Features = firstDupe.Features; - - if (updateFields.Contains(Field.AreaName)) - newDatItem.AreaName = firstDupe.AreaName; - - if (updateFields.Contains(Field.AreaSize)) - newDatItem.AreaSize = firstDupe.AreaSize; - - if (updateFields.Contains(Field.BiosDescription)) - { - if (newDatItem.ItemType == ItemType.BiosSet) - biosSet.Description = biosSetDupe.Description; - } - - if (updateFields.Contains(Field.Default)) - { - if (newDatItem.ItemType == ItemType.BiosSet) - biosSet.Default = biosSetDupe.Default; - - else if (newDatItem.ItemType == ItemType.Release) - release.Default = releaseDupe.Default; - } - - if (updateFields.Contains(Field.Language)) - { - if (newDatItem.ItemType == ItemType.Release) - release.Language = releaseDupe.Language; - } - - if (updateFields.Contains(Field.Date)) - { - if (newDatItem.ItemType == ItemType.Release) - release.Date = releaseDupe.Date; - - else if (newDatItem.ItemType == ItemType.Rom) - rom.Date = romDupe.Date; - } - - if (updateFields.Contains(Field.Bios)) - { - if (newDatItem.ItemType == ItemType.Rom) - rom.Bios = romDupe.Bios; - } - - if (updateFields.Contains(Field.Size)) - { - if (newDatItem.ItemType == ItemType.Rom) - rom.Size = romDupe.Size; - } - - if (updateFields.Contains(Field.Offset)) - { - if (newDatItem.ItemType == ItemType.Rom) - rom.Offset = romDupe.Offset; - } - - if (updateFields.Contains(Field.Merge)) - { - if (newDatItem.ItemType == ItemType.Disk) - disk.MergeTag = diskDupe.MergeTag; - - else if (newDatItem.ItemType == ItemType.Rom) - rom.MergeTag = romDupe.MergeTag; - } - - if (updateFields.Contains(Field.Region)) - { - if (newDatItem.ItemType == ItemType.Disk) - disk.Region = diskDupe.Region; - - else if (newDatItem.ItemType == ItemType.Release) - release.Region = releaseDupe.Region; - - else if (newDatItem.ItemType == ItemType.Rom) - rom.Region = romDupe.Region; - } - - if (updateFields.Contains(Field.Index)) - { - if (newDatItem.ItemType == ItemType.Disk) - disk.Index = diskDupe.Index; - } - - if (updateFields.Contains(Field.Writable)) - { - if (newDatItem.ItemType == ItemType.Disk) - disk.Writable = diskDupe.Writable; - } - - if (updateFields.Contains(Field.Optional)) - { - if (newDatItem.ItemType == ItemType.Disk) - disk.Optional = diskDupe.Optional; - - else if (newDatItem.ItemType == ItemType.Rom) - rom.Optional = romDupe.Optional; - } - - if (updateFields.Contains(Field.Status)) - { - if (newDatItem.ItemType == ItemType.Disk) - disk.ItemStatus = diskDupe.ItemStatus; - - else if (newDatItem.ItemType == ItemType.Rom) - rom.ItemStatus = romDupe.ItemStatus; - } - - if (updateFields.Contains(Field.Inverted)) - { - if (newDatItem.ItemType == ItemType.Rom) - rom.Inverted = romDupe.Inverted; - } - - #endregion - - #region Hash fields - - if (updateFields.Contains(Field.CRC)) - { - if (newDatItem.ItemType == ItemType.Rom) - { - if (string.IsNullOrEmpty(rom.CRC) && !string.IsNullOrEmpty(romDupe.CRC)) - rom.CRC = romDupe.CRC; - } - } - - if (updateFields.Contains(Field.MD5)) - { - if (newDatItem.ItemType == ItemType.Disk) - { - if (string.IsNullOrEmpty(disk.MD5) && !string.IsNullOrEmpty(diskDupe.MD5)) - disk.MD5 = diskDupe.MD5; - } - - if (newDatItem.ItemType == ItemType.Rom) - { - if (string.IsNullOrEmpty(rom.MD5) && !string.IsNullOrEmpty(romDupe.MD5)) - rom.MD5 = romDupe.MD5; - } - } - -#if NET_FRAMEWORK - if (updateFields.Contains(Field.RIPEMD160)) - { - if (newDatItem.ItemType == ItemType.Disk) - { - if (string.IsNullOrEmpty(disk.RIPEMD160) && !string.IsNullOrEmpty(diskDupe.RIPEMD160)) - disk.RIPEMD160 = diskDupe.RIPEMD160; - } - - if (newDatItem.ItemType == ItemType.Rom) - { - if (string.IsNullOrEmpty(rom.RIPEMD160) && !string.IsNullOrEmpty(romDupe.RIPEMD160)) - rom.RIPEMD160 = romDupe.RIPEMD160; - } - } -#endif - - if (updateFields.Contains(Field.SHA1)) - { - if (newDatItem.ItemType == ItemType.Disk) - { - if (string.IsNullOrEmpty(disk.SHA1) && !string.IsNullOrEmpty(diskDupe.SHA1)) - disk.SHA1 = diskDupe.SHA1; - } - - if (newDatItem.ItemType == ItemType.Rom) - { - if (string.IsNullOrEmpty(rom.SHA1) && !string.IsNullOrEmpty(romDupe.SHA1)) - rom.SHA1 = romDupe.SHA1; - } - } - - if (updateFields.Contains(Field.SHA256)) - { - if (newDatItem.ItemType == ItemType.Disk) - { - if (string.IsNullOrEmpty(disk.SHA256) && !string.IsNullOrEmpty(diskDupe.SHA256)) - disk.SHA256 = diskDupe.SHA256; - } - - if (newDatItem.ItemType == ItemType.Rom) - { - if (string.IsNullOrEmpty(rom.SHA256) && !string.IsNullOrEmpty(romDupe.SHA256)) - rom.SHA256 = romDupe.SHA256; - } - } - - if (updateFields.Contains(Field.SHA384)) - { - if (newDatItem.ItemType == ItemType.Disk) - { - if (string.IsNullOrEmpty(disk.SHA384) && !string.IsNullOrEmpty(diskDupe.SHA384)) - disk.SHA384 = diskDupe.SHA384; - } - - if (newDatItem.ItemType == ItemType.Rom) - { - if (string.IsNullOrEmpty(rom.SHA384) && !string.IsNullOrEmpty(romDupe.SHA384)) - rom.SHA384 = romDupe.SHA384; - } - } - - if (updateFields.Contains(Field.SHA512)) - { - if (newDatItem.ItemType == ItemType.Disk) - { - if (string.IsNullOrEmpty(disk.SHA512) && !string.IsNullOrEmpty(diskDupe.SHA512)) - disk.SHA512 = diskDupe.SHA512; - } - - if (newDatItem.ItemType == ItemType.Rom) - { - if (string.IsNullOrEmpty(rom.SHA512) && !string.IsNullOrEmpty(romDupe.SHA512)) - rom.SHA512 = romDupe.SHA512; - } - } - - #endregion - - // Now assign back the duplicate archive to the original - switch (newDatItem.ItemType) - { - case ItemType.Archive: - newDatItem = archive.Clone() as Archive; - break; - - case ItemType.BiosSet: - newDatItem = biosSet.Clone() as BiosSet; - break; - - case ItemType.Blank: - newDatItem = blank.Clone() as Blank; - break; - - case ItemType.Disk: - newDatItem = disk.Clone() as Disk; - break; - - case ItemType.Release: - newDatItem = release.Clone() as Release; - break; - - case ItemType.Rom: - newDatItem = rom.Clone() as Rom; - break; - - case ItemType.Sample: - newDatItem = sample.Clone() as Sample; - break; - } - } + newDatItem.ReplaceFields(dupes.First(), updateFields); newDatItems.Add(newDatItem); } @@ -626,69 +344,7 @@ namespace SabreTools.Library.DatFiles { DatItem newDatItem = datItem.Clone() as DatItem; if (Items.ContainsKey(key) && Items[key].Count() > 0) - { - var firstDupe = Items[key][0]; - - if (updateFields.Contains(Field.MachineName)) - newDatItem.MachineName = firstDupe.MachineName; - - if (updateFields.Contains(Field.Comment)) - newDatItem.Comment = firstDupe.Comment; - - if (updateFields.Contains(Field.Description)) - { - if (!onlySame || (onlySame && newDatItem.MachineName == newDatItem.MachineDescription)) - newDatItem.MachineDescription = firstDupe.MachineDescription; - } - - if (updateFields.Contains(Field.Year)) - newDatItem.Year = firstDupe.Year; - - if (updateFields.Contains(Field.Manufacturer)) - newDatItem.Manufacturer = firstDupe.Manufacturer; - - if (updateFields.Contains(Field.Publisher)) - newDatItem.Publisher = firstDupe.Publisher; - - if (updateFields.Contains(Field.Category)) - newDatItem.Category = firstDupe.Category; - - if (updateFields.Contains(Field.RomOf)) - newDatItem.RomOf = firstDupe.RomOf; - - if (updateFields.Contains(Field.CloneOf)) - newDatItem.CloneOf = firstDupe.CloneOf; - - if (updateFields.Contains(Field.SampleOf)) - newDatItem.SampleOf = firstDupe.SampleOf; - - if (updateFields.Contains(Field.Supported)) - newDatItem.Supported = firstDupe.Supported; - - if (updateFields.Contains(Field.SourceFile)) - newDatItem.SourceFile = firstDupe.SourceFile; - - if (updateFields.Contains(Field.Runnable)) - newDatItem.Runnable = firstDupe.Runnable; - - if (updateFields.Contains(Field.Board)) - newDatItem.Board = firstDupe.Board; - - if (updateFields.Contains(Field.RebuildTo)) - newDatItem.RebuildTo = firstDupe.RebuildTo; - - if (updateFields.Contains(Field.Devices)) - newDatItem.Devices = firstDupe.Devices; - - if (updateFields.Contains(Field.SlotOptions)) - newDatItem.SlotOptions = firstDupe.SlotOptions; - - if (updateFields.Contains(Field.Infos)) - newDatItem.Infos = firstDupe.Infos; - - if (updateFields.Contains(Field.MachineType)) - newDatItem.MachineType = firstDupe.MachineType; - } + newDatItem.ReplaceMachineFields(Items[key][0], updateFields, onlySame); newDatItems.Add(newDatItem); } diff --git a/SabreTools.Library/DatItems/BiosSet.cs b/SabreTools.Library/DatItems/BiosSet.cs index b5f4d547..5ae42f79 100644 --- a/SabreTools.Library/DatItems/BiosSet.cs +++ b/SabreTools.Library/DatItems/BiosSet.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Security.Permissions; using Newtonsoft.Json; namespace SabreTools.Library.DatItems @@ -135,5 +134,34 @@ namespace SabreTools.Library.DatItems } #endregion + + #region Sorting and Merging + + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List updateFields) + { + // Replace common fields first + base.ReplaceFields(item, updateFields); + + // If we don't have a BiosSet to replace from, ignore specific fields + if (item.ItemType != ItemType.BiosSet) + return; + + // Cast for easier access + BiosSet newItem = item as BiosSet; + + // Replace the fields + if (updateFields.Contains(Field.BiosDescription)) + Description = newItem.Description; + + if (updateFields.Contains(Field.Default)) + Default = newItem.Default; + } + + #endregion } } diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 6c482ba5..063be6bf 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -958,6 +958,101 @@ namespace SabreTools.Library.DatItems return key; } + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public virtual void ReplaceFields(DatItem item, List updateFields) + { + if (updateFields.Contains(Field.Name)) + Name = item.Name; + + if (updateFields.Contains(Field.PartName)) + PartName = item.PartName; + + if (updateFields.Contains(Field.PartInterface)) + PartInterface = item.PartInterface; + + if (updateFields.Contains(Field.Features)) + Features = item.Features; + + if (updateFields.Contains(Field.AreaName)) + AreaName = item.AreaName; + + if (updateFields.Contains(Field.AreaSize)) + AreaSize = item.AreaSize; + } + + /// + /// Replace machine fields from another item + /// + /// DatItem 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 void ReplaceMachineFields(DatItem item, List updateFields, bool onlySame) + { + if (updateFields.Contains(Field.MachineName)) + MachineName = item.MachineName; + + if (updateFields.Contains(Field.Comment)) + Comment = item.Comment; + + if (updateFields.Contains(Field.Description)) + { + if (!onlySame || (onlySame && MachineName == MachineDescription)) + MachineDescription = item.MachineDescription; + } + + if (updateFields.Contains(Field.Year)) + Year = item.Year; + + if (updateFields.Contains(Field.Manufacturer)) + Manufacturer = item.Manufacturer; + + if (updateFields.Contains(Field.Publisher)) + Publisher = item.Publisher; + + if (updateFields.Contains(Field.Category)) + Category = item.Category; + + if (updateFields.Contains(Field.RomOf)) + RomOf = item.RomOf; + + if (updateFields.Contains(Field.CloneOf)) + CloneOf = item.CloneOf; + + if (updateFields.Contains(Field.SampleOf)) + SampleOf = item.SampleOf; + + if (updateFields.Contains(Field.Supported)) + Supported = item.Supported; + + if (updateFields.Contains(Field.SourceFile)) + SourceFile = item.SourceFile; + + if (updateFields.Contains(Field.Runnable)) + Runnable = item.Runnable; + + if (updateFields.Contains(Field.Board)) + Board = item.Board; + + if (updateFields.Contains(Field.RebuildTo)) + RebuildTo = item.RebuildTo; + + if (updateFields.Contains(Field.Devices)) + Devices = item.Devices; + + if (updateFields.Contains(Field.SlotOptions)) + SlotOptions = item.SlotOptions; + + if (updateFields.Contains(Field.Infos)) + Infos = item.Infos; + + if (updateFields.Contains(Field.MachineType)) + MachineType = item.MachineType; + } + #endregion #endregion // Instance Methods diff --git a/SabreTools.Library/DatItems/Disk.cs b/SabreTools.Library/DatItems/Disk.cs index 2633b905..4e69a03f 100644 --- a/SabreTools.Library/DatItems/Disk.cs +++ b/SabreTools.Library/DatItems/Disk.cs @@ -536,6 +536,81 @@ namespace SabreTools.Library.DatItems return key; } + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List updateFields) + { + // Replace common fields first + base.ReplaceFields(item, updateFields); + + // If we don't have a Disk to replace from, ignore specific fields + if (item.ItemType != ItemType.Disk) + return; + + // Cast for easier access + Disk newItem = item as Disk; + + // Replace the fields + if (updateFields.Contains(Field.MD5)) + { + if (string.IsNullOrEmpty(MD5) && !string.IsNullOrEmpty(newItem.MD5)) + MD5 = newItem.MD5; + } + +#if NET_FRAMEWORK + if (updateFields.Contains(Field.RIPEMD160)) + { + if (string.IsNullOrEmpty(RIPEMD160) && !string.IsNullOrEmpty(newItem.RIPEMD160)) + RIPEMD160 = newItem.RIPEMD160; + } +#endif + + if (updateFields.Contains(Field.SHA1)) + { + if (string.IsNullOrEmpty(SHA1) && !string.IsNullOrEmpty(newItem.SHA1)) + SHA1 = newItem.SHA1; + } + + if (updateFields.Contains(Field.SHA256)) + { + if (string.IsNullOrEmpty(SHA256) && !string.IsNullOrEmpty(newItem.SHA256)) + SHA256 = newItem.SHA256; + } + + if (updateFields.Contains(Field.SHA384)) + { + if (string.IsNullOrEmpty(SHA384) && !string.IsNullOrEmpty(newItem.SHA384)) + SHA384 = newItem.SHA384; + } + + if (updateFields.Contains(Field.SHA512)) + { + if (string.IsNullOrEmpty(SHA512) && !string.IsNullOrEmpty(newItem.SHA512)) + SHA512 = newItem.SHA512; + } + + if (updateFields.Contains(Field.Merge)) + MergeTag = newItem.MergeTag; + + if (updateFields.Contains(Field.Region)) + Region = newItem.Region; + + if (updateFields.Contains(Field.Index)) + Index = newItem.Index; + + if (updateFields.Contains(Field.Writable)) + Writable = newItem.Writable; + + if (updateFields.Contains(Field.Status)) + ItemStatus = newItem.ItemStatus; + + if (updateFields.Contains(Field.Optional)) + Optional = newItem.Optional; + } + #endregion } } diff --git a/SabreTools.Library/DatItems/Release.cs b/SabreTools.Library/DatItems/Release.cs index 98650736..be31e8a5 100644 --- a/SabreTools.Library/DatItems/Release.cs +++ b/SabreTools.Library/DatItems/Release.cs @@ -162,5 +162,40 @@ namespace SabreTools.Library.DatItems } #endregion + + #region Sorting and Merging + + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List updateFields) + { + // Replace common fields first + base.ReplaceFields(item, updateFields); + + // If we don't have a Release to replace from, ignore specific fields + if (item.ItemType != ItemType.Release) + return; + + // Cast for easier access + Release newItem = item as Release; + + // Replace the fields + if (updateFields.Contains(Field.Region)) + Region = newItem.Region; + + if (updateFields.Contains(Field.Language)) + Language = newItem.Language; + + if (updateFields.Contains(Field.Date)) + Date = newItem.Date; + + if (updateFields.Contains(Field.Default)) + Default = newItem.Default; + } + + #endregion } } diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index bf345906..709cbe81 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -565,6 +565,96 @@ namespace SabreTools.Library.DatItems return key; } + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List updateFields) + { + // Replace common fields first + base.ReplaceFields(item, updateFields); + + // If we don't have a Rom to replace from, ignore specific fields + if (item.ItemType != ItemType.Rom) + return; + + // Cast for easier access + Rom newItem = item as Rom; + + // Replace the fields + if (updateFields.Contains(Field.Bios)) + Bios = newItem.Bios; + + if (updateFields.Contains(Field.Size)) + Size = newItem.Size; + + if (updateFields.Contains(Field.CRC)) + { + if (string.IsNullOrEmpty(CRC) && !string.IsNullOrEmpty(newItem.CRC)) + CRC = newItem.CRC; + } + + if (updateFields.Contains(Field.MD5)) + { + if (string.IsNullOrEmpty(MD5) && !string.IsNullOrEmpty(newItem.MD5)) + MD5 = newItem.MD5; + } + +#if NET_FRAMEWORK + if (updateFields.Contains(Field.RIPEMD160)) + { + if (string.IsNullOrEmpty(RIPEMD160) && !string.IsNullOrEmpty(newItem.RIPEMD160)) + RIPEMD160 = newItem.RIPEMD160; + } +#endif + + if (updateFields.Contains(Field.SHA1)) + { + if (string.IsNullOrEmpty(SHA1) && !string.IsNullOrEmpty(newItem.SHA1)) + SHA1 = newItem.SHA1; + } + + if (updateFields.Contains(Field.SHA256)) + { + if (string.IsNullOrEmpty(SHA256) && !string.IsNullOrEmpty(newItem.SHA256)) + SHA256 = newItem.SHA256; + } + + if (updateFields.Contains(Field.SHA384)) + { + if (string.IsNullOrEmpty(SHA384) && !string.IsNullOrEmpty(newItem.SHA384)) + SHA384 = newItem.SHA384; + } + + if (updateFields.Contains(Field.SHA512)) + { + if (string.IsNullOrEmpty(SHA512) && !string.IsNullOrEmpty(newItem.SHA512)) + SHA512 = newItem.SHA512; + } + + if (updateFields.Contains(Field.Merge)) + MergeTag = newItem.MergeTag; + + if (updateFields.Contains(Field.Region)) + Region = newItem.Region; + + if (updateFields.Contains(Field.Offset)) + Offset = newItem.Offset; + + if (updateFields.Contains(Field.Date)) + Date = newItem.Date; + + if (updateFields.Contains(Field.Status)) + ItemStatus = newItem.ItemStatus; + + if (updateFields.Contains(Field.Optional)) + Optional = newItem.Optional; + + if (updateFields.Contains(Field.Inverted)) + Inverted = newItem.Inverted; + } + #endregion } }