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