Fix consistency issues in converting to metadata

This commit is contained in:
Matt Nadareski
2025-01-11 23:34:26 -05:00
parent 41ab9826a3
commit a5e9de2fdc
39 changed files with 281 additions and 235 deletions

View File

@@ -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;
}
/// <summary>
/// Convert header information
/// </summary>
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>() == MergingFlag.None)
header.Remove(Models.Metadata.Header.ForceMergingKey);
if (header.ReadString(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>() == NodumpFlag.None)
header.Remove(Models.Metadata.Header.ForceNodumpKey);
if (header.ReadString(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>() == 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.OfflineList.Images>(Models.Metadata.Header.ImagesKey);
if (Header.InfosSpecified)
header[Models.Metadata.Header.InfosKey] = Header.GetFieldValue<Models.OfflineList.Infos>(Models.Metadata.Header.InfosKey);
if (Header.NewDatSpecified)
header[Models.Metadata.Header.NewDatKey] = Header.GetFieldValue<Models.OfflineList.NewDat>(Models.Metadata.Header.NewDatKey);
if (Header.SearchSpecified)
header[Models.Metadata.Header.SearchKey] = Header.GetFieldValue<Models.OfflineList.Search>(Models.Metadata.Header.SearchKey);
return header;
}
/// <summary>
/// Convert machines information
/// </summary>
@@ -146,7 +115,7 @@ namespace SabreTools.DatFiles
switch (item)
{
case DatItems.Formats.Adjuster adjuster:
var adjusterItem = ProcessItem(adjuster);
var adjusterItem = adjuster.GetInternalClone();
EnsureMachineKey<Models.Metadata.Adjuster?>(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<Models.Metadata.Configuration?>(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<Models.Metadata.Device?>(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<Models.Metadata.DipSwitch?>(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<Models.Metadata.Input?>(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<Models.Metadata.Port?>(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<Models.Metadata.Slot?>(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<Models.Metadata.Adjuster?>(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<Models.Metadata.Configuration?>(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<Models.Metadata.Device?>(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<Models.Metadata.DipSwitch?>(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<Models.Metadata.Input?>(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<Models.Metadata.Port?>(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<Models.Metadata.Slot?>(machine, Models.Metadata.Machine.SlotKey);
AppendToMachineKey(machine, Models.Metadata.Machine.SlotKey, slotItem);
break;
@@ -934,133 +903,15 @@ namespace SabreTools.DatFiles
return [.. machines];
}
/// <summary>
/// Convert Adjuster information
/// </summary>
/// <param name="item">Item to convert</param>
private static Models.Metadata.Adjuster ProcessItem(DatItems.Formats.Adjuster item)
{
var adjusterItem = item.GetInternalClone();
var condition = item.GetFieldValue<DatItems.Formats.Condition?>(Models.Metadata.Adjuster.ConditionKey);
if (condition != null)
adjusterItem[Models.Metadata.Adjuster.ConditionKey] = condition.GetInternalClone();
return adjusterItem;
}
/// <summary>
/// Convert Configuration information
/// </summary>
/// <param name="item">Item to convert</param>
private static Models.Metadata.Configuration ProcessItem(DatItems.Formats.Configuration item)
{
var configurationItem = item.GetInternalClone();
var condition = item.GetFieldValue<DatItems.Formats.Condition?>(Models.Metadata.Configuration.ConditionKey);
if (condition != null)
configurationItem[Models.Metadata.Configuration.ConditionKey] = condition.GetInternalClone();
var confLocations = item.GetFieldValue<DatItems.Formats.ConfLocation[]?>(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<DatItems.Formats.ConfSetting[]?>(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<DatItems.Formats.Condition>(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;
}
/// <summary>
/// Convert Device information
/// </summary>
/// <param name="item">Item to convert</param>
private static Models.Metadata.Device ProcessItem(DatItems.Formats.Device item)
{
var deviceItem = item.GetInternalClone();
var instance = item.GetFieldValue<DatItems.Formats.Instance?>(Models.Metadata.Device.InstanceKey);
if (instance != null)
deviceItem[Models.Metadata.Device.InstanceKey] = instance.GetInternalClone();
var extensions = item.GetFieldValue<DatItems.Formats.Extension[]?>(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;
}
/// <summary>
/// Convert DipSwitch information
/// </summary>
/// <param name="item">Item to convert</param>
/// <param name="machine">Machine to use for Part</param>
private static Models.Metadata.DipSwitch ProcessItem(DatItems.Formats.DipSwitch item)
{
var dipSwitchItem = item.GetInternalClone();
var condition = item.GetFieldValue<DatItems.Formats.Condition?>(Models.Metadata.DipSwitch.ConditionKey);
if (condition != null)
dipSwitchItem[Models.Metadata.DipSwitch.ConditionKey] = condition.GetInternalClone();
var dipLocations = item.GetFieldValue<DatItems.Formats.DipLocation[]?>(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<DatItems.Formats.DipValue[]?>(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<DatItems.Formats.Condition>(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;
}
/// <summary>
/// Convert Display information
/// </summary>
/// <param name="item">Item to convert</param>
/// <param name="machine">Machine to use for Video</param>
/// <remarks>
/// This method is required because both a Display and a Video
/// item might be created and added for a given Display input.
/// </remarks>
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;
}
/// <summary>
/// Convert Input information
/// </summary>
/// <param name="item">Item to convert</param>
private static Models.Metadata.Input ProcessItem(DatItems.Formats.Input item)
{
var inputItem = item.GetInternalClone();
var controls = item.GetFieldValue<DatItems.Formats.Control[]?>(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;
}
/// <summary>
/// Convert Port information
/// </summary>
/// <param name="item">Item to convert</param>
private static Models.Metadata.Port ProcessItem(DatItems.Formats.Port item)
{
var slotItem = item.GetInternalClone();
var analogs = item.GetFieldValue<DatItems.Formats.Analog[]?>(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;
}
/// <summary>
/// Convert Rom information
/// </summary>
/// <param name="item">Item to convert</param>
/// <param name="machine">Machine to use for Part and DataArea</param>
/// <remarks>
/// This method is required because both a Rom and a Dump
/// item might be created and added for a given Rom input.
/// </remarks>
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;
}
/// <summary>
/// Convert Slot information
/// </summary>
/// <param name="item">Item to convert</param>
private static Models.Metadata.Slot ProcessItem(DatItems.Formats.Slot item)
{
var slotItem = item.GetInternalClone();
var slotOptions = item.GetFieldValue<DatItems.Formats.SlotOption[]?>(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;
}
/// <summary>
/// Ensure a key in a machine
/// </summary>

View File

@@ -163,15 +163,6 @@ namespace SabreTools.DatFiles
#endregion
#region Accessors
/// <summary>
/// Get a clone of the current internal model
/// </summary>
public Models.Metadata.Header GetInternalClone() => (_internal.Clone() as Models.Metadata.Header)!;
#endregion
#region Cloning Methods
/// <summary>
@@ -257,6 +248,36 @@ namespace SabreTools.DatFiles
return header;
}
/// <summary>
/// Get a clone of the current internal model
/// </summary>
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>() == MergingFlag.None)
header.Remove(Models.Metadata.Header.ForceMergingKey);
if (header.ReadString(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>() == NodumpFlag.None)
header.Remove(Models.Metadata.Header.ForceNodumpKey);
if (header.ReadString(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>() == 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.OfflineList.Images>(Models.Metadata.Header.ImagesKey);
if (InfosSpecified)
header[Models.Metadata.Header.InfosKey] = GetFieldValue<Models.OfflineList.Infos>(Models.Metadata.Header.InfosKey);
if (NewDatSpecified)
header[Models.Metadata.Header.NewDatKey] = GetFieldValue<Models.OfflineList.NewDat>(Models.Metadata.Header.NewDatKey);
if (SearchSpecified)
header[Models.Metadata.Header.SearchKey] = GetFieldValue<Models.OfflineList.Search>(Models.Metadata.Header.SearchKey);
return header;
}
/// <summary>
/// Overwrite local values from another DatHeader if not default
/// </summary>

View File

@@ -609,7 +609,7 @@ namespace SabreTools.DatItems
/// Get a clone of the current internal model
/// </summary>
/// TODO: Make virtual so individuals can handle conversion
public T GetInternalClone() => (_internal.Clone() as T)!;
public virtual T GetInternalClone() => (_internal.Clone() as T)!;
#endregion

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.Adjuster GetInternalClone()
{
var adjusterItem = base.GetInternalClone();
var condition = GetFieldValue<Condition?>(Models.Metadata.Adjuster.ConditionKey);
if (condition != null)
adjusterItem[Models.Metadata.Adjuster.ConditionKey] = condition.GetInternalClone();
return adjusterItem;
}
#endregion
}
}

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Analog() : base() { }
public Analog(Models.Metadata.Analog item) : base(item) { }
#endregion

View File

@@ -89,6 +89,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Archive() : base() { }
public Archive(Models.Metadata.Archive item) : base(item) { }
#endregion

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public BiosSet() : base() { }
public BiosSet(Models.Metadata.BiosSet item) : base(item)
{
// Process flag values

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Chip() : base() { }
public Chip(Models.Metadata.Chip item) : base(item)
{
// Process flag values

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Condition() : base() { }
public Condition(Models.Metadata.Condition item) : base(item)
{
// Process flag values

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public ConfLocation() : base() { }
public ConfLocation(Models.Metadata.ConfLocation item) : base(item)
{
// Process flag values

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.ConfSetting GetInternalClone()
{
var confSettingItem = base.GetInternalClone();
// Handle subitems
var condition = GetFieldValue<Condition>(Models.Metadata.ConfSetting.ConditionKey);
if (condition != null)
confSettingItem[Models.Metadata.ConfSetting.ConditionKey] = condition.GetInternalClone();
return confSettingItem;
}
#endregion
}
}

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.Configuration GetInternalClone()
{
var configurationItem = base.GetInternalClone();
var condition = GetFieldValue<Condition?>(Models.Metadata.Configuration.ConditionKey);
if (condition != null)
configurationItem[Models.Metadata.Configuration.ConditionKey] = condition.GetInternalClone();
var confLocations = GetFieldValue<ConfLocation[]?>(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<ConfSetting[]?>(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
}
}

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Control() : base() { }
public Control(Models.Metadata.Control item) : base(item)
{
// Process flag values

View File

@@ -24,6 +24,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public DataArea() : base() { }
public DataArea(Models.Metadata.DataArea item) : base(item)
{
// Process flag values

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.Device GetInternalClone()
{
var deviceItem = base.GetInternalClone();
var instance = GetFieldValue<Instance?>(Models.Metadata.Device.InstanceKey);
if (instance != null)
deviceItem[Models.Metadata.Device.InstanceKey] = instance.GetInternalClone();
var extensions = GetFieldValue<Extension[]?>(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
}
}

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public DeviceRef() : base() { }
public DeviceRef(Models.Metadata.DeviceRef item) : base(item) { }
#endregion

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public DipLocation() : base() { }
public DipLocation(Models.Metadata.DipLocation item) : base(item)
{
// Process flag values

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.DipSwitch GetInternalClone()
{
var dipSwitchItem = base.GetInternalClone();
var condition = GetFieldValue<Condition?>(Models.Metadata.DipSwitch.ConditionKey);
if (condition != null)
dipSwitchItem[Models.Metadata.DipSwitch.ConditionKey] = condition.GetInternalClone();
var dipLocations = GetFieldValue<DipLocation[]?>(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<DipValue[]?>(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
}
}

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.DipValue GetInternalClone()
{
var dipValueItem = base.GetInternalClone();
// Handle subitems
var subCondition = GetFieldValue<Condition>(Models.Metadata.DipValue.ConditionKey);
if (subCondition != null)
dipValueItem[Models.Metadata.DipValue.ConditionKey] = subCondition.GetInternalClone();
return dipValueItem;
}
#endregion
}
}

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public DiskArea() : base() { }
public DiskArea(Models.Metadata.DiskArea item) : base(item) { }
#endregion

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Display() : base() { }
public Display(Models.Metadata.Display item) : base(item)
{
// Process flag values

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Driver() : base() { }
public Driver(Models.Metadata.Driver item) : base(item)
{
// Process flag values

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Extension() : base() { }
public Extension(Models.Metadata.Extension item) : base(item) { }
#endregion

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Feature() : base() { }
public Feature(Models.Metadata.Feature item) : base(item)
{
// Process flag values

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Info() : base() { }
public Info(Models.Metadata.Info item) : base(item) { }
#endregion

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.Input GetInternalClone()
{
var inputItem = base.GetInternalClone();
var controls = GetFieldValue<Control[]?>(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
}
}

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Instance() : base() { }
public Instance(Models.Metadata.Instance item) : base(item) { }
#endregion

View File

@@ -33,6 +33,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Part() : base() { }
public Part(Models.Metadata.Part item) : base(item) { }
#endregion

View File

@@ -32,6 +32,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public PartFeature() : base() { }
public PartFeature(Models.Metadata.Feature item) : base(item)
{
// Process flag values

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.Port GetInternalClone()
{
var portItem = base.GetInternalClone();
var analogs = GetFieldValue<Analog[]?>(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
}
}

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public RamOption() : base() { }
public RamOption(Models.Metadata.RamOption item) : base(item)
{
// Process flag values

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Release() : base() { }
public Release(Models.Metadata.Release item) : base(item)
{
// Process flag values

View File

@@ -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

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Sample() : base() { }
public Sample(Models.Metadata.Sample item) : base(item) { }
#endregion

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public SharedFeat() : base() { }
public SharedFeat(Models.Metadata.SharedFeat item) : base(item) { }
#endregion

View File

@@ -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
/// <inheritdoc/>
public override Models.Metadata.Slot GetInternalClone()
{
var slotItem = base.GetInternalClone();
var slotOptions = GetFieldValue<SlotOption[]?>(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
}
}

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public SlotOption() : base() { }
public SlotOption(Models.Metadata.SlotOption item) : base(item)
{
// Process flag values

View File

@@ -23,6 +23,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public SoftwareList() : base() { }
public SoftwareList(Models.Metadata.SoftwareList item) : base(item)
{
// Process flag values

View File

@@ -22,6 +22,7 @@ namespace SabreTools.DatItems.Formats
#region Constructors
public Sound() : base() { }
public Sound(Models.Metadata.Sound item) : base(item)
{
// Process flag values