diff --git a/SabreTools.DatFiles/DatFile.ToMetadata.cs b/SabreTools.DatFiles/DatFile.ToMetadata.cs index 7d7d43e0..7fe4c0ef 100644 --- a/SabreTools.DatFiles/DatFile.ToMetadata.cs +++ b/SabreTools.DatFiles/DatFile.ToMetadata.cs @@ -23,7 +23,7 @@ namespace SabreTools.DatFiles var metadataFile = new Models.Metadata.MetadataFile(); // Convert and assign the header - var header = ConvertHeader(); + var header = Header.GetInternalClone(); if (header != null) metadataFile[Models.Metadata.MetadataFile.HeaderKey] = header; @@ -48,7 +48,7 @@ namespace SabreTools.DatFiles var metadataFile = new Models.Metadata.MetadataFile(); // Convert and assign the header - var header = ConvertHeader(); + var header = Header.GetInternalClone(); if (header != null) metadataFile[Models.Metadata.MetadataFile.HeaderKey] = header; @@ -60,37 +60,6 @@ namespace SabreTools.DatFiles return metadataFile; } - /// - /// Convert header information - /// - private Models.Metadata.Header? ConvertHeader() - { - // Create an internal header - var header = Header.GetInternalClone(); - - // Remove fields with default values - if (header.ReadString(Models.Metadata.Header.ForceMergingKey).AsEnumValue() == MergingFlag.None) - header.Remove(Models.Metadata.Header.ForceMergingKey); - if (header.ReadString(Models.Metadata.Header.ForceNodumpKey).AsEnumValue() == NodumpFlag.None) - header.Remove(Models.Metadata.Header.ForceNodumpKey); - if (header.ReadString(Models.Metadata.Header.ForcePackingKey).AsEnumValue() == PackingFlag.None) - header.Remove(Models.Metadata.Header.ForcePackingKey); - - // Convert subheader values - if (Header.CanOpenSpecified) - header[Models.Metadata.Header.CanOpenKey] = new Models.OfflineList.CanOpen { Extension = Header.GetStringArrayFieldValue(Models.Metadata.Header.CanOpenKey) }; - if (Header.ImagesSpecified) - header[Models.Metadata.Header.ImagesKey] = Header.GetFieldValue(Models.Metadata.Header.ImagesKey); - if (Header.InfosSpecified) - header[Models.Metadata.Header.InfosKey] = Header.GetFieldValue(Models.Metadata.Header.InfosKey); - if (Header.NewDatSpecified) - header[Models.Metadata.Header.NewDatKey] = Header.GetFieldValue(Models.Metadata.Header.NewDatKey); - if (Header.SearchSpecified) - header[Models.Metadata.Header.SearchKey] = Header.GetFieldValue(Models.Metadata.Header.SearchKey); - - return header; - } - /// /// Convert machines information /// @@ -146,7 +115,7 @@ namespace SabreTools.DatFiles switch (item) { case DatItems.Formats.Adjuster adjuster: - var adjusterItem = ProcessItem(adjuster); + var adjusterItem = adjuster.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.AdjusterKey); AppendToMachineKey(machine, Models.Metadata.Machine.AdjusterKey, adjusterItem); break; @@ -166,12 +135,12 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.ChipKey, chipItem); break; case DatItems.Formats.Configuration configuration: - var configurationItem = ProcessItem(configuration); + var configurationItem = configuration.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.ConfigurationKey); AppendToMachineKey(machine, Models.Metadata.Machine.ConfigurationKey, configurationItem); break; case DatItems.Formats.Device device: - var deviceItem = ProcessItem(device); + var deviceItem = device.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.DeviceKey); AppendToMachineKey(machine, Models.Metadata.Machine.DeviceKey, deviceItem); break; @@ -181,7 +150,7 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.DeviceRefKey, deviceRefItem); break; case DatItems.Formats.DipSwitch dipSwitch: - var dipSwitchItem = ProcessItem(dipSwitch); + var dipSwitchItem = dipSwitch.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.DipSwitchKey); AppendToMachineKey(machine, Models.Metadata.Machine.DipSwitchKey, dipSwitchItem); @@ -238,7 +207,7 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.InfoKey, infoItem); break; case DatItems.Formats.Input input: - var inputItem = ProcessItem(input); + var inputItem = input.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.InputKey); AppendToMachineKey(machine, Models.Metadata.Machine.InputKey, inputItem); break; @@ -262,7 +231,7 @@ namespace SabreTools.DatFiles } break; case DatItems.Formats.Port port: - var portItem = ProcessItem(port); + var portItem = port.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.PortKey); AppendToMachineKey(machine, Models.Metadata.Machine.PortKey, portItem); break; @@ -309,7 +278,7 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.SharedFeatKey, sharedFeatItem); break; case DatItems.Formats.Slot slot: - var slotItem = ProcessItem(slot); + var slotItem = slot.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.SlotKey); AppendToMachineKey(machine, Models.Metadata.Machine.SlotKey, slotItem); break; @@ -566,7 +535,7 @@ namespace SabreTools.DatFiles switch (item.Value) { case DatItems.Formats.Adjuster adjuster: - var adjusterItem = ProcessItem(adjuster); + var adjusterItem = adjuster.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.AdjusterKey); AppendToMachineKey(machine, Models.Metadata.Machine.AdjusterKey, adjusterItem); break; @@ -586,12 +555,12 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.ChipKey, chipItem); break; case DatItems.Formats.Configuration configuration: - var configurationItem = ProcessItem(configuration); + var configurationItem = configuration.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.ConfigurationKey); AppendToMachineKey(machine, Models.Metadata.Machine.ConfigurationKey, configurationItem); break; case DatItems.Formats.Device device: - var deviceItem = ProcessItem(device); + var deviceItem = device.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.DeviceKey); AppendToMachineKey(machine, Models.Metadata.Machine.DeviceKey, deviceItem); break; @@ -601,7 +570,7 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.DeviceRefKey, deviceRefItem); break; case DatItems.Formats.DipSwitch dipSwitch: - var dipSwitchItem = ProcessItem(dipSwitch); + var dipSwitchItem = dipSwitch.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.DipSwitchKey); AppendToMachineKey(machine, Models.Metadata.Machine.DipSwitchKey, dipSwitchItem); @@ -658,7 +627,7 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.InfoKey, infoItem); break; case DatItems.Formats.Input input: - var inputItem = ProcessItem(input); + var inputItem = input.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.InputKey); AppendToMachineKey(machine, Models.Metadata.Machine.InputKey, inputItem); break; @@ -682,7 +651,7 @@ namespace SabreTools.DatFiles } break; case DatItems.Formats.Port port: - var portItem = ProcessItem(port); + var portItem = port.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.PortKey); AppendToMachineKey(machine, Models.Metadata.Machine.PortKey, portItem); break; @@ -729,7 +698,7 @@ namespace SabreTools.DatFiles AppendToMachineKey(machine, Models.Metadata.Machine.SharedFeatKey, sharedFeatItem); break; case DatItems.Formats.Slot slot: - var slotItem = ProcessItem(slot); + var slotItem = slot.GetInternalClone(); EnsureMachineKey(machine, Models.Metadata.Machine.SlotKey); AppendToMachineKey(machine, Models.Metadata.Machine.SlotKey, slotItem); break; @@ -934,133 +903,15 @@ namespace SabreTools.DatFiles return [.. machines]; } - /// - /// Convert Adjuster information - /// - /// Item to convert - private static Models.Metadata.Adjuster ProcessItem(DatItems.Formats.Adjuster item) - { - var adjusterItem = item.GetInternalClone(); - - var condition = item.GetFieldValue(Models.Metadata.Adjuster.ConditionKey); - if (condition != null) - adjusterItem[Models.Metadata.Adjuster.ConditionKey] = condition.GetInternalClone(); - - return adjusterItem; - } - - /// - /// Convert Configuration information - /// - /// Item to convert - private static Models.Metadata.Configuration ProcessItem(DatItems.Formats.Configuration item) - { - var configurationItem = item.GetInternalClone(); - - var condition = item.GetFieldValue(Models.Metadata.Configuration.ConditionKey); - if (condition != null) - configurationItem[Models.Metadata.Configuration.ConditionKey] = condition.GetInternalClone(); - - var confLocations = item.GetFieldValue(Models.Metadata.Configuration.ConfLocationKey); - if (confLocations != null) - { - Models.Metadata.ConfLocation[] confLocationItems = Array.ConvertAll(confLocations, confLocation => confLocation.GetInternalClone()); - configurationItem[Models.Metadata.Configuration.ConfLocationKey] = confLocationItems; - } - - var confSettings = item.GetFieldValue(Models.Metadata.Configuration.ConfSettingKey); - if (confSettings != null) - { - Models.Metadata.ConfSetting[] confSettingItems = new Models.Metadata.ConfSetting[confSettings.Length]; - for (int i = 0; i < confSettings.Length; i++) - { - var confSetting = confSettings[i]; - Models.Metadata.ConfSetting confSettingItem = confSetting.GetInternalClone(); - - // Handle subitems - var subCondition = confSetting.GetFieldValue(Models.Metadata.ConfSetting.ConditionKey); - if (subCondition != null) - confSettingItem[Models.Metadata.ConfSetting.ConditionKey] = subCondition.GetInternalClone(); - - confSettingItems[i] = confSettingItem; - } - - configurationItem[Models.Metadata.Configuration.ConfSettingKey] = confSettingItems; - } - - return configurationItem; - } - - /// - /// Convert Device information - /// - /// Item to convert - private static Models.Metadata.Device ProcessItem(DatItems.Formats.Device item) - { - var deviceItem = item.GetInternalClone(); - - var instance = item.GetFieldValue(Models.Metadata.Device.InstanceKey); - if (instance != null) - deviceItem[Models.Metadata.Device.InstanceKey] = instance.GetInternalClone(); - - var extensions = item.GetFieldValue(Models.Metadata.Device.ExtensionKey); - if (extensions != null) - { - Models.Metadata.Extension[] extensionItems = Array.ConvertAll(extensions, extension => extension.GetInternalClone()); - deviceItem[Models.Metadata.Device.ExtensionKey] = extensionItems; - } - - return deviceItem; - } - - /// - /// Convert DipSwitch information - /// - /// Item to convert - /// Machine to use for Part - private static Models.Metadata.DipSwitch ProcessItem(DatItems.Formats.DipSwitch item) - { - var dipSwitchItem = item.GetInternalClone(); - - var condition = item.GetFieldValue(Models.Metadata.DipSwitch.ConditionKey); - if (condition != null) - dipSwitchItem[Models.Metadata.DipSwitch.ConditionKey] = condition.GetInternalClone(); - - var dipLocations = item.GetFieldValue(Models.Metadata.DipSwitch.DipLocationKey); - if (dipLocations != null) - { - Models.Metadata.DipLocation[] dipLocationItems = Array.ConvertAll(dipLocations, dipLocation => dipLocation.GetInternalClone()); - dipSwitchItem[Models.Metadata.DipSwitch.DipLocationKey] = dipLocationItems; - } - - var dipValues = item.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey); - if (dipValues != null) - { - Models.Metadata.DipValue[] dipValueItems = new Models.Metadata.DipValue[dipValues.Length]; - for (int i = 0; i < dipValues.Length; i++) - { - var dipValue = dipValues[i]; - Models.Metadata.DipValue dipValueItem = dipValue.GetInternalClone(); - - // Handle subitems - var subCondition = dipValue.GetFieldValue(Models.Metadata.DipValue.ConditionKey); - if (subCondition != null) - dipValueItem[Models.Metadata.DipValue.ConditionKey] = subCondition.GetInternalClone(); - - dipValueItems[i] = dipValueItem; - } - - dipSwitchItem[Models.Metadata.DipSwitch.DipValueKey] = dipValueItems; - } - - return dipSwitchItem; - } - /// /// Convert Display information /// /// Item to convert /// Machine to use for Video + /// + /// This method is required because both a Display and a Video + /// item might be created and added for a given Display input. + /// private static Models.Metadata.Display ProcessItem(DatItems.Formats.Display item, Models.Metadata.Machine machine) { var displayItem = item.GetInternalClone(); @@ -1095,47 +946,15 @@ namespace SabreTools.DatFiles return displayItem; } - /// - /// Convert Input information - /// - /// Item to convert - private static Models.Metadata.Input ProcessItem(DatItems.Formats.Input item) - { - var inputItem = item.GetInternalClone(); - - var controls = item.GetFieldValue(Models.Metadata.Input.ControlKey); - if (controls != null) - { - Models.Metadata.Control[] controlItems = Array.ConvertAll(controls, control => control.GetInternalClone()); - inputItem[Models.Metadata.Input.ControlKey] = controlItems; - } - - return inputItem; - } - - /// - /// Convert Port information - /// - /// Item to convert - private static Models.Metadata.Port ProcessItem(DatItems.Formats.Port item) - { - var slotItem = item.GetInternalClone(); - - var analogs = item.GetFieldValue(Models.Metadata.Port.AnalogKey); - if (analogs != null) - { - Models.Metadata.Analog[] analogItems = Array.ConvertAll(analogs, analog => analog.GetInternalClone()); - slotItem[Models.Metadata.Port.AnalogKey] = analogItems; - } - - return slotItem; - } - /// /// Convert Rom information /// /// Item to convert /// Machine to use for Part and DataArea + /// + /// This method is required because both a Rom and a Dump + /// item might be created and added for a given Rom input. + /// private static Models.Metadata.Rom ProcessItem(DatItems.Formats.Rom item, Models.Metadata.Machine machine) { var romItem = item.GetInternalClone(); @@ -1231,24 +1050,6 @@ namespace SabreTools.DatFiles return romItem; } - /// - /// Convert Slot information - /// - /// Item to convert - private static Models.Metadata.Slot ProcessItem(DatItems.Formats.Slot item) - { - var slotItem = item.GetInternalClone(); - - var slotOptions = item.GetFieldValue(Models.Metadata.Slot.SlotOptionKey); - if (slotOptions != null) - { - Models.Metadata.SlotOption[] slotOptionItems = Array.ConvertAll(slotOptions, slotOption => slotOption.GetInternalClone()); - slotItem[Models.Metadata.Slot.SlotOptionKey] = slotOptionItems; - } - - return slotItem; - } - /// /// Ensure a key in a machine /// diff --git a/SabreTools.DatFiles/DatHeader.cs b/SabreTools.DatFiles/DatHeader.cs index 23aeacdf..32b20888 100644 --- a/SabreTools.DatFiles/DatHeader.cs +++ b/SabreTools.DatFiles/DatHeader.cs @@ -163,15 +163,6 @@ namespace SabreTools.DatFiles #endregion - #region Accessors - - /// - /// Get a clone of the current internal model - /// - public Models.Metadata.Header GetInternalClone() => (_internal.Clone() as Models.Metadata.Header)!; - - #endregion - #region Cloning Methods /// @@ -257,6 +248,36 @@ namespace SabreTools.DatFiles return header; } + /// + /// Get a clone of the current internal model + /// + public Models.Metadata.Header GetInternalClone() + { + var header = (_internal.Clone() as Models.Metadata.Header)!; + + // Remove fields with default values + if (header.ReadString(Models.Metadata.Header.ForceMergingKey).AsEnumValue() == MergingFlag.None) + header.Remove(Models.Metadata.Header.ForceMergingKey); + if (header.ReadString(Models.Metadata.Header.ForceNodumpKey).AsEnumValue() == NodumpFlag.None) + header.Remove(Models.Metadata.Header.ForceNodumpKey); + if (header.ReadString(Models.Metadata.Header.ForcePackingKey).AsEnumValue() == PackingFlag.None) + header.Remove(Models.Metadata.Header.ForcePackingKey); + + // Convert subheader values + if (CanOpenSpecified) + header[Models.Metadata.Header.CanOpenKey] = new Models.OfflineList.CanOpen { Extension = GetStringArrayFieldValue(Models.Metadata.Header.CanOpenKey) }; + if (ImagesSpecified) + header[Models.Metadata.Header.ImagesKey] = GetFieldValue(Models.Metadata.Header.ImagesKey); + if (InfosSpecified) + header[Models.Metadata.Header.InfosKey] = GetFieldValue(Models.Metadata.Header.InfosKey); + if (NewDatSpecified) + header[Models.Metadata.Header.NewDatKey] = GetFieldValue(Models.Metadata.Header.NewDatKey); + if (SearchSpecified) + header[Models.Metadata.Header.SearchKey] = GetFieldValue(Models.Metadata.Header.SearchKey); + + return header; + } + /// /// Overwrite local values from another DatHeader if not default /// diff --git a/SabreTools.DatItems/DatItem.cs b/SabreTools.DatItems/DatItem.cs index c7083ddf..83d31e02 100644 --- a/SabreTools.DatItems/DatItem.cs +++ b/SabreTools.DatItems/DatItem.cs @@ -609,7 +609,7 @@ namespace SabreTools.DatItems /// Get a clone of the current internal model /// /// TODO: Make virtual so individuals can handle conversion - public T GetInternalClone() => (_internal.Clone() as T)!; + public virtual T GetInternalClone() => (_internal.Clone() as T)!; #endregion diff --git a/SabreTools.DatItems/Formats/Adjuster.cs b/SabreTools.DatItems/Formats/Adjuster.cs index ac578535..92576a13 100644 --- a/SabreTools.DatItems/Formats/Adjuster.cs +++ b/SabreTools.DatItems/Formats/Adjuster.cs @@ -33,6 +33,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Adjuster() : base() { } + public Adjuster(Models.Metadata.Adjuster item) : base(item) { // Process flag values @@ -46,5 +47,21 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.Adjuster GetInternalClone() + { + var adjusterItem = base.GetInternalClone(); + + var condition = GetFieldValue(Models.Metadata.Adjuster.ConditionKey); + if (condition != null) + adjusterItem[Models.Metadata.Adjuster.ConditionKey] = condition.GetInternalClone(); + + return adjusterItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/Analog.cs b/SabreTools.DatItems/Formats/Analog.cs index ec4223bd..c9fd5fb6 100644 --- a/SabreTools.DatItems/Formats/Analog.cs +++ b/SabreTools.DatItems/Formats/Analog.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Analog() : base() { } + public Analog(Models.Metadata.Analog item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/Archive.cs b/SabreTools.DatItems/Formats/Archive.cs index 17dd6e59..b967e7ee 100644 --- a/SabreTools.DatItems/Formats/Archive.cs +++ b/SabreTools.DatItems/Formats/Archive.cs @@ -89,6 +89,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Archive() : base() { } + public Archive(Models.Metadata.Archive item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/BiosSet.cs b/SabreTools.DatItems/Formats/BiosSet.cs index 84656fb4..3a01c2fb 100644 --- a/SabreTools.DatItems/Formats/BiosSet.cs +++ b/SabreTools.DatItems/Formats/BiosSet.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public BiosSet() : base() { } + public BiosSet(Models.Metadata.BiosSet item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Chip.cs b/SabreTools.DatItems/Formats/Chip.cs index 348123b6..99e66228 100644 --- a/SabreTools.DatItems/Formats/Chip.cs +++ b/SabreTools.DatItems/Formats/Chip.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Chip() : base() { } + public Chip(Models.Metadata.Chip item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Condition.cs b/SabreTools.DatItems/Formats/Condition.cs index 6e98e315..618ced62 100644 --- a/SabreTools.DatItems/Formats/Condition.cs +++ b/SabreTools.DatItems/Formats/Condition.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Condition() : base() { } + public Condition(Models.Metadata.Condition item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/ConfLocation.cs b/SabreTools.DatItems/Formats/ConfLocation.cs index da31e10a..3d6914cc 100644 --- a/SabreTools.DatItems/Formats/ConfLocation.cs +++ b/SabreTools.DatItems/Formats/ConfLocation.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public ConfLocation() : base() { } + public ConfLocation(Models.Metadata.ConfLocation item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/ConfSetting.cs b/SabreTools.DatItems/Formats/ConfSetting.cs index de706906..e6a07d18 100644 --- a/SabreTools.DatItems/Formats/ConfSetting.cs +++ b/SabreTools.DatItems/Formats/ConfSetting.cs @@ -33,6 +33,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public ConfSetting() : base() { } + public ConfSetting(Models.Metadata.ConfSetting item) : base(item) { // Process flag values @@ -46,5 +47,22 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.ConfSetting GetInternalClone() + { + var confSettingItem = base.GetInternalClone(); + + // Handle subitems + var condition = GetFieldValue(Models.Metadata.ConfSetting.ConditionKey); + if (condition != null) + confSettingItem[Models.Metadata.ConfSetting.ConditionKey] = condition.GetInternalClone(); + + return confSettingItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/Configuration.cs b/SabreTools.DatItems/Formats/Configuration.cs index e54cb1d3..29a39b1e 100644 --- a/SabreTools.DatItems/Formats/Configuration.cs +++ b/SabreTools.DatItems/Formats/Configuration.cs @@ -54,6 +54,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Configuration() : base() { } + public Configuration(Models.Metadata.Configuration item) : base(item) { // Handle subitems @@ -77,5 +78,35 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.Configuration GetInternalClone() + { + var configurationItem = base.GetInternalClone(); + + var condition = GetFieldValue(Models.Metadata.Configuration.ConditionKey); + if (condition != null) + configurationItem[Models.Metadata.Configuration.ConditionKey] = condition.GetInternalClone(); + + var confLocations = GetFieldValue(Models.Metadata.Configuration.ConfLocationKey); + if (confLocations != null) + { + Models.Metadata.ConfLocation[] confLocationItems = Array.ConvertAll(confLocations, confLocation => confLocation.GetInternalClone()); + configurationItem[Models.Metadata.Configuration.ConfLocationKey] = confLocationItems; + } + + var confSettings = GetFieldValue(Models.Metadata.Configuration.ConfSettingKey); + if (confSettings != null) + { + Models.Metadata.ConfSetting[] confSettingItems = Array.ConvertAll(confSettings, confSetting => confSetting.GetInternalClone()); + configurationItem[Models.Metadata.Configuration.ConfSettingKey] = confSettingItems; + } + + return configurationItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/Control.cs b/SabreTools.DatItems/Formats/Control.cs index ea31437b..e2ca2819 100644 --- a/SabreTools.DatItems/Formats/Control.cs +++ b/SabreTools.DatItems/Formats/Control.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Control() : base() { } + public Control(Models.Metadata.Control item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/DataArea.cs b/SabreTools.DatItems/Formats/DataArea.cs index 88c93080..7121cd4e 100644 --- a/SabreTools.DatItems/Formats/DataArea.cs +++ b/SabreTools.DatItems/Formats/DataArea.cs @@ -24,6 +24,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public DataArea() : base() { } + public DataArea(Models.Metadata.DataArea item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Device.cs b/SabreTools.DatItems/Formats/Device.cs index da9fbbbf..75a60ee6 100644 --- a/SabreTools.DatItems/Formats/Device.cs +++ b/SabreTools.DatItems/Formats/Device.cs @@ -45,6 +45,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Device() : base() { } + public Device(Models.Metadata.Device item) : base(item) { // Process flag values @@ -67,5 +68,28 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.Device GetInternalClone() + { + var deviceItem = base.GetInternalClone(); + + var instance = GetFieldValue(Models.Metadata.Device.InstanceKey); + if (instance != null) + deviceItem[Models.Metadata.Device.InstanceKey] = instance.GetInternalClone(); + + var extensions = GetFieldValue(Models.Metadata.Device.ExtensionKey); + if (extensions != null) + { + Models.Metadata.Extension[] extensionItems = Array.ConvertAll(extensions, extension => extension.GetInternalClone()); + deviceItem[Models.Metadata.Device.ExtensionKey] = extensionItems; + } + + return deviceItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/DeviceRef.cs b/SabreTools.DatItems/Formats/DeviceRef.cs index 4b400903..9e1ccb2c 100644 --- a/SabreTools.DatItems/Formats/DeviceRef.cs +++ b/SabreTools.DatItems/Formats/DeviceRef.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public DeviceRef() : base() { } + public DeviceRef(Models.Metadata.DeviceRef item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/DipLocation.cs b/SabreTools.DatItems/Formats/DipLocation.cs index fb11fc81..f9cbc9f0 100644 --- a/SabreTools.DatItems/Formats/DipLocation.cs +++ b/SabreTools.DatItems/Formats/DipLocation.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public DipLocation() : base() { } + public DipLocation(Models.Metadata.DipLocation item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/DipSwitch.cs b/SabreTools.DatItems/Formats/DipSwitch.cs index 5c5cf8f8..0e9406b8 100644 --- a/SabreTools.DatItems/Formats/DipSwitch.cs +++ b/SabreTools.DatItems/Formats/DipSwitch.cs @@ -76,6 +76,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public DipSwitch() : base() { } + public DipSwitch(Models.Metadata.DipSwitch item) : base(item) { // Process flag values @@ -103,5 +104,35 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.DipSwitch GetInternalClone() + { + var dipSwitchItem = base.GetInternalClone(); + + var condition = GetFieldValue(Models.Metadata.DipSwitch.ConditionKey); + if (condition != null) + dipSwitchItem[Models.Metadata.DipSwitch.ConditionKey] = condition.GetInternalClone(); + + var dipLocations = GetFieldValue(Models.Metadata.DipSwitch.DipLocationKey); + if (dipLocations != null) + { + Models.Metadata.DipLocation[] dipLocationItems = Array.ConvertAll(dipLocations, dipLocation => dipLocation.GetInternalClone()); + dipSwitchItem[Models.Metadata.DipSwitch.DipLocationKey] = dipLocationItems; + } + + var dipValues = GetFieldValue(Models.Metadata.DipSwitch.DipValueKey); + if (dipValues != null) + { + Models.Metadata.DipValue[] dipValueItems = Array.ConvertAll(dipValues, dipValue => dipValue.GetInternalClone()); + dipSwitchItem[Models.Metadata.DipSwitch.DipValueKey] = dipValueItems; + } + + return dipSwitchItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/DipValue.cs b/SabreTools.DatItems/Formats/DipValue.cs index 3082307c..7a130152 100644 --- a/SabreTools.DatItems/Formats/DipValue.cs +++ b/SabreTools.DatItems/Formats/DipValue.cs @@ -33,6 +33,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public DipValue() : base() { } + public DipValue(Models.Metadata.DipValue item) : base(item) { // Process flag values @@ -46,5 +47,22 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.DipValue GetInternalClone() + { + var dipValueItem = base.GetInternalClone(); + + // Handle subitems + var subCondition = GetFieldValue(Models.Metadata.DipValue.ConditionKey); + if (subCondition != null) + dipValueItem[Models.Metadata.DipValue.ConditionKey] = subCondition.GetInternalClone(); + + return dipValueItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/DiskArea.cs b/SabreTools.DatItems/Formats/DiskArea.cs index 930c12e0..488e45a4 100644 --- a/SabreTools.DatItems/Formats/DiskArea.cs +++ b/SabreTools.DatItems/Formats/DiskArea.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public DiskArea() : base() { } + public DiskArea(Models.Metadata.DiskArea item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/Display.cs b/SabreTools.DatItems/Formats/Display.cs index 9405fb31..8967d38c 100644 --- a/SabreTools.DatItems/Formats/Display.cs +++ b/SabreTools.DatItems/Formats/Display.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Display() : base() { } + public Display(Models.Metadata.Display item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Driver.cs b/SabreTools.DatItems/Formats/Driver.cs index f70c4f6e..6b5fca92 100644 --- a/SabreTools.DatItems/Formats/Driver.cs +++ b/SabreTools.DatItems/Formats/Driver.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Driver() : base() { } + public Driver(Models.Metadata.Driver item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Extension.cs b/SabreTools.DatItems/Formats/Extension.cs index 4ef41743..3ad73b2d 100644 --- a/SabreTools.DatItems/Formats/Extension.cs +++ b/SabreTools.DatItems/Formats/Extension.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Extension() : base() { } + public Extension(Models.Metadata.Extension item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/Feature.cs b/SabreTools.DatItems/Formats/Feature.cs index 73c2f2a3..da34b373 100644 --- a/SabreTools.DatItems/Formats/Feature.cs +++ b/SabreTools.DatItems/Formats/Feature.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Feature() : base() { } + public Feature(Models.Metadata.Feature item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Info.cs b/SabreTools.DatItems/Formats/Info.cs index e51c0937..11567358 100644 --- a/SabreTools.DatItems/Formats/Info.cs +++ b/SabreTools.DatItems/Formats/Info.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Info() : base() { } + public Info(Models.Metadata.Info item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/Input.cs b/SabreTools.DatItems/Formats/Input.cs index 14f21b3d..4a77cabb 100644 --- a/SabreTools.DatItems/Formats/Input.cs +++ b/SabreTools.DatItems/Formats/Input.cs @@ -35,6 +35,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Input() : base() { } + public Input(Models.Metadata.Input item) : base(item) { // Process flag values @@ -59,5 +60,24 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.Input GetInternalClone() + { + var inputItem = base.GetInternalClone(); + + var controls = GetFieldValue(Models.Metadata.Input.ControlKey); + if (controls != null) + { + Models.Metadata.Control[] controlItems = Array.ConvertAll(controls, control => control.GetInternalClone()); + inputItem[Models.Metadata.Input.ControlKey] = controlItems; + } + + return inputItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/Instance.cs b/SabreTools.DatItems/Formats/Instance.cs index cbd2ae1d..069ea5a4 100644 --- a/SabreTools.DatItems/Formats/Instance.cs +++ b/SabreTools.DatItems/Formats/Instance.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Instance() : base() { } + public Instance(Models.Metadata.Instance item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/Part.cs b/SabreTools.DatItems/Formats/Part.cs index 91d8bec4..4d0bff5a 100644 --- a/SabreTools.DatItems/Formats/Part.cs +++ b/SabreTools.DatItems/Formats/Part.cs @@ -33,6 +33,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Part() : base() { } + public Part(Models.Metadata.Part item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/PartFeature.cs b/SabreTools.DatItems/Formats/PartFeature.cs index 6e7b7d4c..b082d171 100644 --- a/SabreTools.DatItems/Formats/PartFeature.cs +++ b/SabreTools.DatItems/Formats/PartFeature.cs @@ -32,6 +32,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public PartFeature() : base() { } + public PartFeature(Models.Metadata.Feature item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Port.cs b/SabreTools.DatItems/Formats/Port.cs index 0ec814ab..fe9adc1e 100644 --- a/SabreTools.DatItems/Formats/Port.cs +++ b/SabreTools.DatItems/Formats/Port.cs @@ -34,6 +34,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Port() : base() { } + public Port(Models.Metadata.Port item) : base(item) { // Handle subitems @@ -46,5 +47,24 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.Port GetInternalClone() + { + var portItem = base.GetInternalClone(); + + var analogs = GetFieldValue(Models.Metadata.Port.AnalogKey); + if (analogs != null) + { + Models.Metadata.Analog[] analogItems = Array.ConvertAll(analogs, analog => analog.GetInternalClone()); + portItem[Models.Metadata.Port.AnalogKey] = analogItems; + } + + return portItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/RamOption.cs b/SabreTools.DatItems/Formats/RamOption.cs index f74d0726..6439de7c 100644 --- a/SabreTools.DatItems/Formats/RamOption.cs +++ b/SabreTools.DatItems/Formats/RamOption.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public RamOption() : base() { } + public RamOption(Models.Metadata.RamOption item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/Release.cs b/SabreTools.DatItems/Formats/Release.cs index 6d13926f..dd1e33d2 100644 --- a/SabreTools.DatItems/Formats/Release.cs +++ b/SabreTools.DatItems/Formats/Release.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Release() : base() { } + public Release(Models.Metadata.Release item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/ReleaseDetails.cs b/SabreTools.DatItems/Formats/ReleaseDetails.cs index b5017e01..7b19d40d 100644 --- a/SabreTools.DatItems/Formats/ReleaseDetails.cs +++ b/SabreTools.DatItems/Formats/ReleaseDetails.cs @@ -1,6 +1,5 @@ using System.Xml.Serialization; using Newtonsoft.Json; -using SabreTools.Core; using SabreTools.Core.Tools; // TODO: Add item mappings for all fields diff --git a/SabreTools.DatItems/Formats/Sample.cs b/SabreTools.DatItems/Formats/Sample.cs index b70891fc..ba9d3cc2 100644 --- a/SabreTools.DatItems/Formats/Sample.cs +++ b/SabreTools.DatItems/Formats/Sample.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Sample() : base() { } + public Sample(Models.Metadata.Sample item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/SharedFeat.cs b/SabreTools.DatItems/Formats/SharedFeat.cs index 0fa32a42..6944ab94 100644 --- a/SabreTools.DatItems/Formats/SharedFeat.cs +++ b/SabreTools.DatItems/Formats/SharedFeat.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public SharedFeat() : base() { } + public SharedFeat(Models.Metadata.SharedFeat item) : base(item) { } #endregion diff --git a/SabreTools.DatItems/Formats/Slot.cs b/SabreTools.DatItems/Formats/Slot.cs index f32d1561..461281b1 100644 --- a/SabreTools.DatItems/Formats/Slot.cs +++ b/SabreTools.DatItems/Formats/Slot.cs @@ -34,6 +34,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Slot() : base() { } + public Slot(Models.Metadata.Slot item) : base(item) { // Handle subitems @@ -46,5 +47,24 @@ namespace SabreTools.DatItems.Formats } #endregion + + #region Cloning Methods + + /// + public override Models.Metadata.Slot GetInternalClone() + { + var slotItem = base.GetInternalClone(); + + var slotOptions = GetFieldValue(Models.Metadata.Slot.SlotOptionKey); + if (slotOptions != null) + { + Models.Metadata.SlotOption[] slotOptionItems = Array.ConvertAll(slotOptions, slotOption => slotOption.GetInternalClone()); + slotItem[Models.Metadata.Slot.SlotOptionKey] = slotOptionItems; + } + + return slotItem; + } + + #endregion } } diff --git a/SabreTools.DatItems/Formats/SlotOption.cs b/SabreTools.DatItems/Formats/SlotOption.cs index 0ccf804c..9820c7fb 100644 --- a/SabreTools.DatItems/Formats/SlotOption.cs +++ b/SabreTools.DatItems/Formats/SlotOption.cs @@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public SlotOption() : base() { } + public SlotOption(Models.Metadata.SlotOption item) : base(item) { // Process flag values diff --git a/SabreTools.DatItems/Formats/SoftwareList.cs b/SabreTools.DatItems/Formats/SoftwareList.cs index 42d2387d..4795a241 100644 --- a/SabreTools.DatItems/Formats/SoftwareList.cs +++ b/SabreTools.DatItems/Formats/SoftwareList.cs @@ -23,12 +23,13 @@ namespace SabreTools.DatItems.Formats #region Constructors public SoftwareList() : base() { } + public SoftwareList(Models.Metadata.SoftwareList item) : base(item) { // Process flag values if (GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey) != null) SetFieldValue(Models.Metadata.SoftwareList.StatusKey, GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue().AsStringValue()); - + // Handle subitems // TODO: Handle the Software subitem } diff --git a/SabreTools.DatItems/Formats/Sound.cs b/SabreTools.DatItems/Formats/Sound.cs index 8f9eac17..f984ec97 100644 --- a/SabreTools.DatItems/Formats/Sound.cs +++ b/SabreTools.DatItems/Formats/Sound.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats #region Constructors public Sound() : base() { } + public Sound(Models.Metadata.Sound item) : base(item) { // Process flag values