diff --git a/SabreTools.Library/Dats/Archive.cs b/SabreTools.Library/Dats/Archive.cs index 81f43288..ba9cd3b2 100644 --- a/SabreTools.Library/Dats/Archive.cs +++ b/SabreTools.Library/Dats/Archive.cs @@ -3,7 +3,7 @@ using SabreTools.Library.Data; namespace SabreTools.Library.Dats { - public class Archive : DatItem, ICloneable + public class Archive : DatItem { #region Constructors @@ -20,7 +20,7 @@ namespace SabreTools.Library.Dats #region Cloning Methods - public object Clone() + public new object Clone() { return new Archive() { @@ -28,7 +28,7 @@ namespace SabreTools.Library.Dats Type = this.Type, Dupe = this.Dupe, - Machine = this.Machine, + Machine = (Machine)this.Machine.Clone(), Supported = this.Supported, Publisher = this.Publisher, diff --git a/SabreTools.Library/Dats/BiosSet.cs b/SabreTools.Library/Dats/BiosSet.cs index 508f39c6..266f512f 100644 --- a/SabreTools.Library/Dats/BiosSet.cs +++ b/SabreTools.Library/Dats/BiosSet.cs @@ -3,7 +3,7 @@ using SabreTools.Library.Data; namespace SabreTools.Library.Dats { - public class BiosSet : DatItem, ICloneable + public class BiosSet : DatItem { #region Private instance variables @@ -42,7 +42,7 @@ namespace SabreTools.Library.Dats #region Cloning Methods - public object Clone() + public new object Clone() { return new BiosSet() { @@ -50,7 +50,7 @@ namespace SabreTools.Library.Dats Type = this.Type, Dupe = this.Dupe, - Machine = this.Machine, + Machine = (Machine)this.Machine.Clone(), Supported = this.Supported, Publisher = this.Publisher, diff --git a/SabreTools.Library/Dats/DatItem.cs b/SabreTools.Library/Dats/DatItem.cs index 422ad19c..ef034eed 100644 --- a/SabreTools.Library/Dats/DatItem.cs +++ b/SabreTools.Library/Dats/DatItem.cs @@ -14,7 +14,7 @@ using NaturalSort; namespace SabreTools.Library.Dats { - public abstract class DatItem : IEquatable, IComparable + public abstract class DatItem : IEquatable, IComparable, ICloneable { #region Protected instance variables @@ -144,6 +144,31 @@ namespace SabreTools.Library.Dats #region Instance Methods + #region Cloning Methods + + public object Clone() + { + switch (_itemType) + { + case ItemType.Archive: + return ((Archive)this).Clone(); + case ItemType.BiosSet: + return ((BiosSet)this).Clone(); + case ItemType.Disk: + return ((Disk)this).Clone(); + case ItemType.Release: + return ((Release)this).Clone(); + case ItemType.Rom: + return ((Rom)this).Clone(); + case ItemType.Sample: + return ((Sample)this).Clone(); + } + + return null; + } + + #endregion + #region Comparision Methods public int CompareTo(DatItem other) diff --git a/SabreTools.Library/Dats/Disk.cs b/SabreTools.Library/Dats/Disk.cs index f10afefa..178ac08d 100644 --- a/SabreTools.Library/Dats/Disk.cs +++ b/SabreTools.Library/Dats/Disk.cs @@ -4,7 +4,7 @@ using SabreTools.Library.Data; namespace SabreTools.Library.Dats { - public class Disk : DatItem, ICloneable + public class Disk : DatItem { #region Private instance variables @@ -71,7 +71,7 @@ namespace SabreTools.Library.Dats #region Cloning Methods - public object Clone() + public new object Clone() { return new Disk() { @@ -79,7 +79,7 @@ namespace SabreTools.Library.Dats Type = this.Type, Dupe = this.Dupe, - Machine = this.Machine, + Machine = (Machine)this.Machine.Clone(), Supported = this.Supported, Publisher = this.Publisher, diff --git a/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs b/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs index 98ae42bc..9fe89007 100644 --- a/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs +++ b/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs @@ -250,41 +250,37 @@ namespace SabreTools.Library.Dats List newItems = new List(); Parallel.ForEach(items, Globals.ParallelOptions, item => { - try + // Clone the item first for easier working + DatItem newItem = (DatItem)item.Clone(); + + // Update machine name + if (!String.IsNullOrEmpty(newItem.Machine.Name) && mapping.ContainsKey(newItem.Machine.Name)) { - // Update machine name - if (item.Machine.Name != null && mapping.ContainsKey(item.Machine.Name)) - { - item.Machine.Name = mapping[item.Machine.Name]; - } - - // Update cloneof - if (item.Machine.CloneOf != null && mapping.ContainsKey(item.Machine.CloneOf)) - { - item.Machine.CloneOf = mapping[item.Machine.CloneOf]; - } - - // Update romof - if (item.Machine.RomOf != null && mapping.ContainsKey(item.Machine.RomOf)) - { - item.Machine.RomOf = mapping[item.Machine.RomOf]; - } - - // Update sampleof - if (item.Machine.SampleOf != null && mapping.ContainsKey(item.Machine.SampleOf)) - { - item.Machine.SampleOf = mapping[item.Machine.SampleOf]; - } - - // Add the new item to the output list - lock (newItems) - { - newItems.Add(item); - } + newItem.Machine.Name = mapping[newItem.Machine.Name]; } - catch (Exception ex) + + // Update cloneof + if (!String.IsNullOrEmpty(newItem.Machine.CloneOf) && mapping.ContainsKey(newItem.Machine.CloneOf)) { - Globals.Logger.Warning(ex.ToString()); + newItem.Machine.CloneOf = mapping[newItem.Machine.CloneOf]; + } + + // Update romof + if (!String.IsNullOrEmpty(newItem.Machine.RomOf) && mapping.ContainsKey(newItem.Machine.RomOf)) + { + newItem.Machine.RomOf = mapping[newItem.Machine.RomOf]; + } + + // Update sampleof + if (!String.IsNullOrEmpty(newItem.Machine.SampleOf) && mapping.ContainsKey(newItem.Machine.SampleOf)) + { + newItem.Machine.SampleOf = mapping[newItem.Machine.SampleOf]; + } + + // Add the new newItem to the output list + lock (newItems) + { + newItems.Add(newItem); } }); diff --git a/SabreTools.Library/Dats/Release.cs b/SabreTools.Library/Dats/Release.cs index 3d4b9c21..6412732d 100644 --- a/SabreTools.Library/Dats/Release.cs +++ b/SabreTools.Library/Dats/Release.cs @@ -4,7 +4,7 @@ using SabreTools.Library.Data; namespace SabreTools.Library.Dats { - public class Release : DatItem, ICloneable + public class Release : DatItem { #region Private instance variables @@ -59,7 +59,7 @@ namespace SabreTools.Library.Dats #region Cloning Methods - public object Clone() + public new object Clone() { return new Release() { @@ -67,7 +67,7 @@ namespace SabreTools.Library.Dats Type = this.Type, Dupe = this.Dupe, - Machine = this.Machine, + Machine = (Machine)this.Machine.Clone(), Supported = this.Supported, Publisher = this.Publisher, diff --git a/SabreTools.Library/Dats/Rom.cs b/SabreTools.Library/Dats/Rom.cs index 8d1f9da1..b8cae250 100644 --- a/SabreTools.Library/Dats/Rom.cs +++ b/SabreTools.Library/Dats/Rom.cs @@ -107,7 +107,7 @@ namespace SabreTools.Library.Dats Type = this.Type, Dupe = this.Dupe, - Machine = this.Machine, + Machine = (Machine)this.Machine.Clone(), Supported = this.Supported, Publisher = this.Publisher, diff --git a/SabreTools.Library/Dats/Sample.cs b/SabreTools.Library/Dats/Sample.cs index fd73fc6b..2740e8a2 100644 --- a/SabreTools.Library/Dats/Sample.cs +++ b/SabreTools.Library/Dats/Sample.cs @@ -4,7 +4,7 @@ using SabreTools.Library.Data; namespace SabreTools.Library.Dats { - public class Sample : DatItem, ICloneable + public class Sample : DatItem { #region Constructors @@ -21,7 +21,7 @@ namespace SabreTools.Library.Dats #region Cloning Methods - public object Clone() + public new object Clone() { return new Sample() { @@ -29,7 +29,7 @@ namespace SabreTools.Library.Dats Type = this.Type, Dupe = this.Dupe, - Machine = this.Machine, + Machine = (Machine)this.Machine.Clone(), Supported = this.Supported, Publisher = this.Publisher,