Convert remaining items, add NameKey

This commit is contained in:
Matt Nadareski
2024-03-10 20:39:54 -04:00
parent 2c8f2ce495
commit 97542bf966
58 changed files with 463 additions and 1601 deletions

View File

@@ -447,7 +447,7 @@ namespace SabreTools.Core
Device,
[Mapping("device_ref", "deviceref")]
DeviceReference,
DeviceRef,
[Mapping("diplocation")]
DipLocation,
@@ -510,7 +510,7 @@ namespace SabreTools.Core
Serials,
[Mapping("sharedfeat", "shared_feat", "sharedfeature", "shared_feature")]
SharedFeature,
SharedFeat,
[Mapping("slot")]
Slot,

View File

@@ -400,7 +400,7 @@ namespace SabreTools.DatFiles
// Loop through the items and add
foreach (var item in items)
{
var datItem = new DatItems.Formats.DeviceReference(item);
var datItem = new DatItems.Formats.DeviceRef(item);
datItem.SetFieldValue<DatItems.Source?>(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename });
datItem.CopyMachineInformation(machine);
ParseAddHelper(datItem, statsOnly);
@@ -859,7 +859,7 @@ namespace SabreTools.DatFiles
// Loop through the items and add
foreach (var item in items)
{
var datItem = new DatItems.Formats.SharedFeature(item);
var datItem = new DatItems.Formats.SharedFeat(item);
datItem.SetFieldValue<DatItems.Source?>(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename });
datItem.CopyMachineInformation(machine);
ParseAddHelper(datItem, statsOnly);

View File

@@ -272,7 +272,7 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
foreach (var deviceref in devicerefs)
{
var item = new DeviceReference();
var item = new DeviceRef();
item.SetName(deviceref.Name);
item.SetFieldValue<Source?>(DatItem.SourceKey, new Source { Index = indexId, Name = filename });

View File

@@ -24,7 +24,7 @@ namespace SabreTools.DatFiles.Formats
ItemType.Condition,
ItemType.Configuration,
ItemType.Device,
ItemType.DeviceReference,
ItemType.DeviceRef,
ItemType.DipSwitch,
ItemType.Disk,
ItemType.Display,
@@ -76,7 +76,7 @@ namespace SabreTools.DatFiles.Formats
}
break;
case DeviceReference deviceref:
case DeviceRef deviceref:
if (string.IsNullOrEmpty(deviceref.GetName()))
missingFields.Add(Models.Metadata.DeviceRef.NameKey);
break;
@@ -290,7 +290,7 @@ namespace SabreTools.DatFiles.Formats
case Disk disk:
disks.Add(CreateDisk(disk));
break;
case DeviceReference deviceref:
case DeviceRef deviceref:
deviceRefs.Add(CreateDeviceRef(deviceref));
break;
case Sample sample:
@@ -459,7 +459,7 @@ namespace SabreTools.DatFiles.Formats
/// <summary>
/// Create a DeviceRef from the current DeviceReference DatItem
/// <summary>
private static Models.Listxml.DeviceRef CreateDeviceRef(DeviceReference item)
private static Models.Listxml.DeviceRef CreateDeviceRef(DeviceRef item)
{
var deviceref = new Models.Listxml.DeviceRef
{

View File

@@ -87,7 +87,7 @@ namespace SabreTools.DatFiles.Formats
}
break;
case DeviceReference deviceref:
case DeviceRef deviceref:
if (string.IsNullOrEmpty(deviceref.GetName()))
missingFields.Add(Models.Metadata.DeviceRef.NameKey);
break;
@@ -352,7 +352,7 @@ namespace SabreTools.DatFiles.Formats
case Archive archive:
archives.Add(CreateArchive(archive));
break;
case DeviceReference deviceref:
case DeviceRef deviceref:
devicerefs.Add(CreateDeviceRef(deviceref));
break;
case Driver driver:
@@ -595,7 +595,7 @@ namespace SabreTools.DatFiles.Formats
/// <summary>
/// Create a DeviceRef from the current Chip DatItem
/// <summary>
private static Models.Logiqx.DeviceRef CreateDeviceRef(DeviceReference item)
private static Models.Logiqx.DeviceRef CreateDeviceRef(DeviceRef item)
{
var deviceref = new Models.Logiqx.DeviceRef
{

View File

@@ -250,8 +250,8 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Device:
datItem = datItemObj.ToObject<Device>();
break;
case ItemType.DeviceReference:
datItem = datItemObj.ToObject<DeviceReference>();
case ItemType.DeviceRef:
datItem = datItemObj.ToObject<DeviceRef>();
break;
case ItemType.DipLocation:
datItem = datItemObj.ToObject<DipLocation>();
@@ -319,8 +319,8 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Serials:
datItem = datItemObj.ToObject<Serials>();
break;
case ItemType.SharedFeature:
datItem = datItemObj.ToObject<SharedFeature>();
case ItemType.SharedFeat:
datItem = datItemObj.ToObject<SharedFeat>();
break;
case ItemType.Slot:
datItem = datItemObj.ToObject<Slot>();

View File

@@ -120,7 +120,7 @@ namespace SabreTools.DatFiles.Formats
// Add all SharedFeat objects
foreach (var sharedfeat in software.SharedFeat ?? [])
{
var sharedfeatItem = new SharedFeature();
var sharedfeatItem = new SharedFeat();
sharedfeatItem.SetName(sharedfeat.Name);
sharedfeatItem.SetFieldValue<Source?>(DatItem.SourceKey, new Source { Index = indexId, Name = filename });
sharedfeatItem.SetFieldValue<string?>(Models.Metadata.SharedFeat.ValueKey, sharedfeat.Value);

View File

@@ -22,7 +22,7 @@ namespace SabreTools.DatFiles.Formats
ItemType.Disk,
ItemType.Info,
ItemType.Rom,
ItemType.SharedFeature,
ItemType.SharedFeat,
];
}
@@ -120,7 +120,7 @@ namespace SabreTools.DatFiles.Formats
}
break;
case SharedFeature sharedFeat:
case SharedFeat sharedFeat:
if (string.IsNullOrEmpty(sharedFeat.GetName()))
missingFields.Add(Models.Metadata.SharedFeat.NameKey);
break;
@@ -222,7 +222,7 @@ namespace SabreTools.DatFiles.Formats
case Info info:
infos.Add(CreateInfo(info));
break;
case SharedFeature sharedFeature:
case SharedFeat sharedFeature:
sharedfeats.Add(CreateSharedFeat(sharedFeature));
break;
case Rom rom:
@@ -287,7 +287,7 @@ namespace SabreTools.DatFiles.Formats
/// <summary>
/// Create a SharedFeat from the current SharedFeature DatItem
/// <summary>
private static Models.SoftwareList.SharedFeat CreateSharedFeat(SharedFeature item)
private static Models.SoftwareList.SharedFeat CreateSharedFeat(SharedFeat item)
{
var sharedfeat = new Models.SoftwareList.SharedFeat
{

View File

@@ -207,7 +207,10 @@ namespace SabreTools.DatFiles
// If the field specifically contains Name, set it separately
if (fieldMappings.Keys.Contains(Models.Metadata.Rom.NameKey))
{
datItem.SetName(fieldMappings[Models.Metadata.Rom.NameKey]);
fieldMappings.Remove(Models.Metadata.Rom.NameKey);
}
#endregion

View File

@@ -30,7 +30,7 @@ namespace SabreTools.DatItems
[XmlInclude(typeof(Control))]
[XmlInclude(typeof(DataArea))]
[XmlInclude(typeof(Device))]
[XmlInclude(typeof(DeviceReference))]
[XmlInclude(typeof(DeviceRef))]
[XmlInclude(typeof(DipLocation))]
[XmlInclude(typeof(DipSwitch))]
[XmlInclude(typeof(DipValue))]
@@ -51,7 +51,7 @@ namespace SabreTools.DatItems
[XmlInclude(typeof(Release))]
[XmlInclude(typeof(Rom))]
[XmlInclude(typeof(Sample))]
[XmlInclude(typeof(SharedFeature))]
[XmlInclude(typeof(SharedFeat))]
[XmlInclude(typeof(Slot))]
[XmlInclude(typeof(SlotOption))]
[XmlInclude(typeof(SoftwareList))]
@@ -703,6 +703,7 @@ namespace SabreTools.DatItems
/// </summary>
public abstract class DatItem<T> : DatItem, IEquatable<DatItem<T>>, IComparable<DatItem<T>>, ICloneable where T : Models.Metadata.DatItem
{
// TODO: Move to base class after implementation
#region Fields
/// <summary>
@@ -710,6 +711,11 @@ namespace SabreTools.DatItems
/// </summary>
protected abstract ItemType ItemType { get; }
/// <summary>
/// Key for accessing the item name, if it exists
/// </summary>
protected abstract string? NameKey { get; }
#endregion
#region Constructors
@@ -739,6 +745,26 @@ namespace SabreTools.DatItems
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName()
{
if (NameKey != null)
return GetFieldValue<string?>(NameKey);
return null;
}
/// <inheritdoc/>
public override void SetName(string? name)
{
if (NameKey != null)
SetFieldValue(NameKey, name);
}
#endregion
// TODO: Figure out how to replace individual versions with this
#region Cloning Methods
@@ -746,7 +772,12 @@ namespace SabreTools.DatItems
/// Clone the DatItem
/// </summary>
/// <returns>Clone of the DatItem</returns>
public override abstract object Clone();
public override object Clone()
{
var clone = Activator.CreateInstance<DatItem<T>>();
clone._internal = _internal?.Clone() as T ?? Activator.CreateInstance<T>();
return clone;
}
#endregion

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents which Adjuster(s) is associated with a set
/// </summary>
[JsonObject("adjuster"), XmlRoot("adjuster")]
public class Adjuster : DatItem
public sealed class Adjuster : DatItem<Models.Metadata.Adjuster>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Adjuster;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Adjuster.NameKey;
[JsonIgnore]
public bool ConditionsSpecified
{
@@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Adjuster.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Adjuster.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Adjuster object
/// </summary>
public Adjuster()
{
_internal = new Models.Metadata.Adjuster();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Adjuster);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create an Adjuster object from the internal model
/// </summary>
public Adjuster(Models.Metadata.Adjuster item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Adjuster);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Adjuster()
{
_internal = this._internal?.Clone() as Models.Metadata.Adjuster ?? [],
};
}
public Adjuster() : base() { }
public Adjuster(Models.Metadata.Adjuster item) : base(item) { }
#endregion
}

View File

@@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents a single analog item
/// </summary>
[JsonObject("analog"), XmlRoot("analog")]
public class Analog : DatItem
public sealed class Analog : DatItem<Models.Metadata.Analog>
{
#region Constructors
#region Fields
/// <summary>
/// Create a default, empty Analog object
/// </summary>
public Analog()
{
_internal = new Models.Metadata.Analog();
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Analog;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Analog);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create an Analog object from the internal model
/// </summary>
public Analog(Models.Metadata.Analog item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Analog);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <inheritdoc>/>
protected override string? NameKey => null;
#endregion
#region Cloning Methods
#region Constructors
/// <inheritdoc/>
public override object Clone()
{
return new Analog()
{
_internal = this._internal?.Clone() as Models.Metadata.Analog ?? [],
};
}
public Analog() : base() { }
public Analog(Models.Metadata.Analog item) : base(item) { }
#endregion
}

View File

@@ -8,7 +8,7 @@ namespace SabreTools.DatItems.Formats
/// Represents generic archive files to be included in a set
/// </summary>
[JsonObject("archive"), XmlRoot("archive")]
public class Archive : DatItem
public sealed class Archive : DatItem
{
#region Fields
@@ -79,16 +79,6 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Archive.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Archive.NameKey, name);
#endregion
#region Constructors
/// <summary>
@@ -116,6 +106,16 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Archive.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Archive.NameKey, name);
#endregion
#region Cloning Methods
/// <inheritdoc/>

View File

@@ -14,7 +14,7 @@ namespace SabreTools.DatItems.Formats
/// Represents the OpenMSX original value
/// </summary>
[JsonObject("original"), XmlRoot("original")]
public class Original
public sealed class Original
{
[JsonProperty("value"), XmlElement("value")]
public bool? Value

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents which BIOS(es) is associated with a set
/// </summary>
[JsonObject("biosset"), XmlRoot("biosset")]
public class BiosSet : DatItem
public sealed class BiosSet : DatItem<Models.Metadata.BiosSet>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.BiosSet.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Analog;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.BiosSet.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.BiosSet.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty BiosSet object
/// </summary>
public BiosSet()
{
_internal = new Models.Metadata.BiosSet();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.BiosSet);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a BiosSet object from the internal model
/// </summary>
public BiosSet(Models.Metadata.BiosSet item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.BiosSet);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new BiosSet()
{
_internal = this._internal?.Clone() as Models.Metadata.BiosSet ?? [],
};
}
public BiosSet() : base() { }
public BiosSet(Models.Metadata.BiosSet item) : base(item) { }
#endregion
}

View File

@@ -8,7 +8,7 @@ namespace SabreTools.DatItems.Formats
/// Represents a blank set from an input DAT
/// </summary>
[JsonObject("blank"), XmlRoot("blank")]
public class Blank : DatItem
public sealed class Blank : DatItem
{
#region Constructors

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents which Chip(s) is associated with a set
/// </summary>
[JsonObject("chip"), XmlRoot("chip")]
public class Chip : DatItem
public sealed class Chip : DatItem<Models.Metadata.Chip>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Chip.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Chip;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Chip.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Chip.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Chip object
/// </summary>
public Chip()
{
_internal = new Models.Metadata.Chip();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Chip);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Chip object from the internal model
/// </summary>
public Chip(Models.Metadata.Chip item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Chip);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Chip()
{
_internal = this._internal?.Clone() as Models.Metadata.Chip ?? [],
};
}
public Chip() : base() { }
public Chip(Models.Metadata.Chip item) : base(item) { }
#endregion
}

View File

@@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents a condition on a machine or other item
/// </summary>
[JsonObject("condition"), XmlRoot("condition")]
public class Condition : DatItem
public sealed class Condition : DatItem<Models.Metadata.Condition>
{
#region Constructors
#region Fields
/// <summary>
/// Create a default, empty Condition object
/// </summary>
public Condition()
{
_internal = new Models.Metadata.Condition();
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Condition;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Condition);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Condition object from the internal model
/// </summary>
public Condition(Models.Metadata.Condition item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Condition);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <inheritdoc>/>
protected override string? NameKey => null;
#endregion
#region Cloning Methods
#region Constructors
/// <inheritdoc/>
public override object Clone()
{
return new Condition()
{
_internal = this._internal?.Clone() as Models.Metadata.Condition ?? [],
};
}
public Condition() : base() { }
public Condition(Models.Metadata.Condition item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents one conflocation
/// </summary>
[JsonObject("conflocation"), XmlRoot("conflocation")]
public class ConfLocation : DatItem
public sealed class ConfLocation : DatItem<Models.Metadata.ConfLocation>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.ConfLocation.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.ConfLocation;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.ConfLocation.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.ConfLocation.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty ConfLocation object
/// </summary>
public ConfLocation()
{
_internal = new Models.Metadata.ConfLocation();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.ConfLocation);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a ConfLocation object from the internal model
/// </summary>
public ConfLocation(Models.Metadata.ConfLocation item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.ConfLocation);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new ConfLocation()
{
_internal = this._internal?.Clone() as Models.Metadata.ConfLocation ?? [],
};
}
public ConfLocation() : base() { }
public ConfLocation(Models.Metadata.ConfLocation item) : base(item) { }
#endregion
}

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents one ListXML confsetting
/// </summary>
[JsonObject("confsetting"), XmlRoot("confsetting")]
public class ConfSetting : DatItem
public sealed class ConfSetting : DatItem<Models.Metadata.ConfSetting>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.ConfSetting;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.ConfSetting.NameKey;
[JsonIgnore]
public bool ConditionsSpecified
{
@@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.ConfSetting.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.ConfSetting.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty ConfSetting object
/// </summary>
public ConfSetting()
{
_internal = new Models.Metadata.ConfSetting();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.ConfSetting);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a ConfSetting object from the internal model
/// </summary>
public ConfSetting(Models.Metadata.ConfSetting item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.ConfSetting);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new ConfSetting()
{
_internal = this._internal?.Clone() as Models.Metadata.ConfSetting ?? [],
};
}
public ConfSetting() : base() { }
public ConfSetting(Models.Metadata.ConfSetting item) : base(item) { }
#endregion
}

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents which Configuration(s) is associated with a set
/// </summary>
[JsonObject("configuration"), XmlRoot("configuration")]
public class Configuration : DatItem
public sealed class Configuration : DatItem<Models.Metadata.Configuration>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Configuration;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Configuration.NameKey;
[JsonIgnore]
public bool ConditionsSpecified
{
@@ -44,53 +50,10 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Configuration.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Configuration.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Configuration object
/// </summary>
public Configuration()
{
_internal = new Models.Metadata.Configuration();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Configuration);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Configuration object from the internal model
/// </summary>
public Configuration(Models.Metadata.Configuration item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Configuration);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Configuration()
{
_internal = this._internal?.Clone() as Models.Metadata.Configuration ?? [],
};
}
public Configuration() : base() { }
public Configuration(Models.Metadata.Configuration item) : base(item) { }
#endregion
}

View File

@@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents control for an input
/// </summary>
[JsonObject("control"), XmlRoot("control")]
public class Control : DatItem
public sealed class Control : DatItem<Models.Metadata.Control>
{
#region Constructors
#region Fields
/// <summary>
/// Create a default, empty Control object
/// </summary>
public Control()
{
_internal = new Models.Metadata.Control();
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Control;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Control);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Control object from the internal model
/// </summary>
public Control(Models.Metadata.Control item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Control);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <inheritdoc>/>
protected override string? NameKey => null;
#endregion
#region Cloning Methods
#region Constructors
/// <inheritdoc/>
public override object Clone()
{
return new Control()
{
_internal = this._internal?.Clone() as Models.Metadata.Control ?? [],
};
}
public Control() : base() { }
public Control(Models.Metadata.Control item) : base(item) { }
#endregion
}

View File

@@ -9,55 +9,22 @@ namespace SabreTools.DatItems.Formats
/// </summary>
/// <remarks>One DataArea can contain multiple Rom items</remarks>
[JsonObject("dataarea"), XmlRoot("dataarea")]
public class DataArea : DatItem
public sealed class DataArea : DatItem<Models.Metadata.DataArea>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.DataArea.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.DataArea;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.DataArea.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.DataArea.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty DataArea object
/// </summary>
public DataArea()
{
_internal = new Models.Metadata.DataArea();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DataArea);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a DataArea object from the internal model
/// </summary>
public DataArea(Models.Metadata.DataArea item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DataArea);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new DataArea()
{
_internal = this._internal?.Clone() as Models.Metadata.DataArea ?? [],
};
}
public DataArea() : base() { }
public DataArea(Models.Metadata.DataArea item) : base(item) { }
#endregion
}

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents a single device on the machine
/// </summary>
[JsonObject("device"), XmlRoot("device")]
public class Device : DatItem
public sealed class Device : DatItem<Models.Metadata.Device>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Device;
/// <inheritdoc>/>
protected override string? NameKey => null;
[JsonIgnore]
public bool InstancesSpecified
{
@@ -36,40 +42,8 @@ namespace SabreTools.DatItems.Formats
#region Constructors
/// <summary>
/// Create a default, empty Device object
/// </summary>
public Device()
{
_internal = new Models.Metadata.Device();
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Device);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Device object from the internal model
/// </summary>
public Device(Models.Metadata.Device item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Device);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Device()
{
_internal = this._internal?.Clone() as Models.Metadata.Device ?? [],
};
}
public Device() : base() { }
public Device(Models.Metadata.Device item) : base(item) { }
#endregion
}

View File

@@ -0,0 +1,30 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
namespace SabreTools.DatItems.Formats
{
/// <summary>
/// Represents which Device Reference(s) is associated with a set
/// </summary>
[JsonObject("device_ref"), XmlRoot("device_ref")]
public sealed class DeviceRef : DatItem<Models.Metadata.DeviceRef>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.DeviceRef;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.DeviceRef.NameKey;
#endregion
#region Constructors
public DeviceRef() : base() { }
public DeviceRef(Models.Metadata.DeviceRef item) : base(item) { }
#endregion
}
}

View File

@@ -1,63 +0,0 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
namespace SabreTools.DatItems.Formats
{
/// <summary>
/// Represents which Device Reference(s) is associated with a set
/// </summary>
[JsonObject("device_ref"), XmlRoot("device_ref")]
public class DeviceReference : DatItem
{
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.DeviceRef.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.DeviceRef.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty DeviceReference object
/// </summary>
public DeviceReference()
{
_internal = new Models.Metadata.DeviceRef();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DeviceReference);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a DeviceReference object from the internal model
/// </summary>
public DeviceReference(Models.Metadata.DeviceRef item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DeviceReference);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new DeviceReference()
{
_internal = this._internal?.Clone() as Models.Metadata.DeviceRef ?? [],
};
}
#endregion
}
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents one diplocation
/// </summary>
[JsonObject("diplocation"), XmlRoot("diplocation")]
public class DipLocation : DatItem
public sealed class DipLocation : DatItem<Models.Metadata.DipLocation>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.DipLocation.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.DipLocation;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.DipLocation.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.DipLocation.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty DipLocation object
/// </summary>
public DipLocation()
{
_internal = new Models.Metadata.DipLocation();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DipLocation);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a DipLocation object from the internal model
/// </summary>
public DipLocation(Models.Metadata.DipLocation item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DipLocation);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new DipLocation()
{
_internal = this._internal?.Clone() as Models.Metadata.DipLocation ?? [],
};
}
public DipLocation() : base() { }
public DipLocation(Models.Metadata.DipLocation item) : base(item) { }
#endregion
}

View File

@@ -8,7 +8,7 @@ namespace SabreTools.DatItems.Formats
/// Represents which DIP Switch(es) is associated with a set
/// </summary>
[JsonObject("dipswitch"), XmlRoot("dipswitch")]
public class DipSwitch : DatItem
public sealed class DipSwitch : DatItem<Models.Metadata.DipSwitch>
{
#region Constants
@@ -21,6 +21,12 @@ namespace SabreTools.DatItems.Formats
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.DipSwitch;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.DipSwitch.NameKey;
[JsonIgnore]
public bool ConditionsSpecified
{
@@ -65,53 +71,10 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.DipSwitch.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.DipSwitch.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty DipSwitch object
/// </summary>
public DipSwitch()
{
_internal = new Models.Metadata.DipSwitch();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DipSwitch);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a DipSwitch object from the internal model
/// </summary>
public DipSwitch(Models.Metadata.DipSwitch item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DipSwitch);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new DipSwitch()
{
_internal = this._internal?.Clone() as Models.Metadata.DipSwitch ?? [],
};
}
public DipSwitch() : base() { }
public DipSwitch(Models.Metadata.DipSwitch item) : base(item) { }
#endregion
}

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents one ListXML dipvalue
/// </summary>
[JsonObject("dipvalue"), XmlRoot("dipvalue")]
public class DipValue : DatItem
public sealed class DipValue : DatItem<Models.Metadata.DipValue>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.DipValue;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.DipValue.NameKey;
[JsonIgnore]
public bool ConditionsSpecified
{
@@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.DipValue.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.DipValue.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty DipValue object
/// </summary>
public DipValue()
{
_internal = new Models.Metadata.DipValue();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DipValue);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a DipValue object from the internal model
/// </summary>
public DipValue(Models.Metadata.DipValue item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DipValue);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new DipValue()
{
_internal = this._internal?.Clone() as Models.Metadata.DipValue ?? [],
};
}
public DipValue() : base() { }
public DipValue(Models.Metadata.DipValue item) : base(item) { }
#endregion
}

View File

@@ -10,7 +10,7 @@ namespace SabreTools.DatItems.Formats
/// Represents Compressed Hunks of Data (CHD) formatted disks which use internal hashes
/// </summary>
[JsonObject("disk"), XmlRoot("disk")]
public class Disk : DatItem
public sealed class Disk : DatItem<Models.Metadata.Disk>
{
#region Constants
@@ -28,6 +28,12 @@ namespace SabreTools.DatItems.Formats
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Disk;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Disk.NameKey;
[JsonIgnore]
public bool DiskAreaSpecified
{
@@ -52,73 +58,34 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Disk.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Disk.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Disk object
/// </summary>
public Disk()
public Disk() : base()
{
_internal = new Models.Metadata.Disk();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Disk);
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, ItemStatus.None);
}
/// <summary>
/// Create a Disk object from a BaseFile
/// </summary>
public Disk(BaseFile baseFile)
public Disk(Models.Metadata.Disk item) : base(item)
{
_internal = new Models.Metadata.Disk();
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, ItemStatus.None);
}
public Disk(BaseFile baseFile) : base()
{
SetName(baseFile.Filename);
SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5));
SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1));
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Disk);
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, ItemStatus.None);
}
/// <summary>
/// Create a Disk object from the internal model
/// </summary>
public Disk(Models.Metadata.Disk item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Disk);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Disk()
{
_internal = this._internal?.Clone() as Models.Metadata.Disk ?? [],
};
}
/// <summary>
/// Convert Disk object to a BaseFile
/// </summary>

View File

@@ -9,55 +9,22 @@ namespace SabreTools.DatItems.Formats
/// </summary>
/// <remarks>One DiskArea can contain multiple Disk items</remarks>
[JsonObject("diskarea"), XmlRoot("diskarea")]
public class DiskArea : DatItem
public sealed class DiskArea : DatItem<Models.Metadata.DiskArea>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.DiskArea.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.DiskArea;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.DiskArea.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.DiskArea.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty DiskArea object
/// </summary>
public DiskArea()
{
_internal = new Models.Metadata.DiskArea();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DiskArea);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a DiskArea object from the internal model
/// </summary>
public DiskArea(Models.Metadata.DiskArea item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.DiskArea);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new DiskArea()
{
_internal = this._internal?.Clone() as Models.Metadata.DiskArea ?? [],
};
}
public DiskArea() : base() { }
public DiskArea(Models.Metadata.DiskArea item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,27 @@ namespace SabreTools.DatItems.Formats
/// Represents one machine display
/// </summary>
[JsonObject("display"), XmlRoot("display")]
public class Display : DatItem
public sealed class Display : DatItem<Models.Metadata.Display>
{
#region Constructors
#region Fields
/// <summary>
/// Create a default, empty Display object
/// </summary>
public Display()
{
_internal = new Models.Metadata.Display();
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Display;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Display);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Display object from the internal model
/// </summary>
public Display(Models.Metadata.Display item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Display);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Display object from the internal model
/// </summary>
public Display(Models.Metadata.Video item)
{
// TODO: Determine what transformation is needed here
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Display);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <inheritdoc>/>
protected override string? NameKey => null;
#endregion
#region Cloning Methods
#region Constructors
/// <inheritdoc/>
public override object Clone()
public Display() : base() { }
public Display(Models.Metadata.Display item) : base(item) { }
public Display(Models.Metadata.Video item) : base()
{
return new Display()
{
_internal = this._internal?.Clone() as Models.Metadata.Display ?? [],
};
// TODO: Determine what transformation is needed here
_internal = item;
}
#endregion

View File

@@ -7,48 +7,23 @@ namespace SabreTools.DatItems.Formats
/// <summary>
/// Represents the a driver of the machine
/// </summary>
/// <remarks>
/// TODO: Add new fields to documentation
/// </remarks>
[JsonObject("driver"), XmlRoot("driver")]
public class Driver : DatItem
public sealed class Driver : DatItem<Models.Metadata.Driver>
{
#region Constructors
#region Fields
/// <summary>
/// Create a default, empty Driver object
/// </summary>
public Driver()
{
_internal = new Models.Metadata.Driver();
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Driver;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Driver);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Driver object from the internal model
/// </summary>
public Driver(Models.Metadata.Driver item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Driver);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <inheritdoc>/>
protected override string? NameKey => null;
#endregion
#region Cloning Methods
#region Constructors
/// <inheritdoc/>
public override object Clone()
{
return new Driver()
{
_internal = this._internal?.Clone() as Models.Metadata.Driver ?? [],
};
}
public Driver() : base() { }
public Driver(Models.Metadata.Driver item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents a matchable extension
/// </summary>
[JsonObject("extension"), XmlRoot("extension")]
public class Extension : DatItem
public sealed class Extension : DatItem<Models.Metadata.Extension>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Extension.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Extension;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Extension.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Extension.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Extension object
/// </summary>
public Extension()
{
_internal = new Models.Metadata.Extension();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Extension);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create an Extension object from the internal model
/// </summary>
public Extension(Models.Metadata.Extension item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Extension);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Extension()
{
_internal = this._internal?.Clone() as Models.Metadata.Extension ?? [],
};
}
public Extension() : base() { }
public Extension(Models.Metadata.Extension item) : base(item) { }
#endregion
}

View File

@@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents the a feature of the machine
/// </summary>
[JsonObject("feature"), XmlRoot("feature")]
public class Feature : DatItem
public sealed class Feature : DatItem<Models.Metadata.Feature>
{
#region Constructors
#region Fields
/// <summary>
/// Create a default, empty Feature object
/// </summary>
public Feature()
{
_internal = new Models.Metadata.Feature();
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Feature;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Feature);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Feature object from the internal model
/// </summary>
public Feature(Models.Metadata.Feature item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Feature);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <inheritdoc>/>
protected override string? NameKey => null;
#endregion
#region Cloning Methods
#region Constructors
/// <inheritdoc/>
public override object Clone()
{
return new Feature()
{
_internal = this._internal?.Clone() as Models.Metadata.Feature ?? [],
};
}
public Feature() : base() { }
public Feature(Models.Metadata.Feature item) : base(item) { }
#endregion
}

View File

@@ -14,7 +14,7 @@ namespace SabreTools.DatItems.Formats
/// Represents a single file item
/// </summary>
[JsonObject("file"), XmlRoot("file")]
public class File : DatItem
public sealed class File : DatItem
{
#region Private instance variables

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents special information about a machine
/// </summary>
[JsonObject("info"), XmlRoot("info")]
public class Info : DatItem
public sealed class Info : DatItem<Models.Metadata.Info>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Info.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Info;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Info.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Instance.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Info object
/// </summary>
public Info()
{
_internal = new Models.Metadata.Info();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Info);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create an Info object from the internal model
/// </summary>
public Info(Models.Metadata.Info item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Info);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Info()
{
_internal = this._internal?.Clone() as Models.Metadata.Info ?? [],
};
}
public Info() : base() { }
public Info(Models.Metadata.Info item) : base(item) { }
#endregion
}

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents one ListXML input
/// </summary>
[JsonObject("input"), XmlRoot("input")]
public class Input : DatItem
public sealed class Input : DatItem<Models.Metadata.Input>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Input;
/// <inheritdoc>/>
protected override string? NameKey => null;
[JsonIgnore]
public bool ControlsSpecified
{
@@ -26,40 +32,8 @@ namespace SabreTools.DatItems.Formats
#region Constructors
/// <summary>
/// Create a default, empty Input object
/// </summary>
public Input()
{
_internal = new Models.Metadata.Input();
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Input);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create an Input object from the internal model
/// </summary>
public Input(Models.Metadata.Input item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Input);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Input()
{
_internal = this._internal?.Clone() as Models.Metadata.Input ?? [],
};
}
public Input() : base() { }
public Input(Models.Metadata.Input item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents a single instance of another item
/// </summary>
[JsonObject("instance"), XmlRoot("instance")]
public class Instance : DatItem
public sealed class Instance : DatItem<Models.Metadata.Instance>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Instance.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Instance;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Instance.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Instance.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Instance object
/// </summary>
public Instance()
{
_internal = new Models.Metadata.Instance();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Instance);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create an Instance object from the internal model
/// </summary>
public Instance(Models.Metadata.Instance item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Instance);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Instance()
{
_internal = this._internal?.Clone() as Models.Metadata.Instance ?? [],
};
}
public Instance() : base() { }
public Instance(Models.Metadata.Instance item) : base(item) { }
#endregion
}

View File

@@ -10,77 +10,45 @@ namespace SabreTools.DatItems.Formats
/// Represents Aaruformat images which use internal hashes
/// </summary>
[JsonObject("media"), XmlRoot("media")]
public class Media : DatItem
public sealed class Media : DatItem<Models.Metadata.Media>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Media.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Media;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Media.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Media.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Media object
/// </summary>
public Media()
public Media() : base()
{
_internal = new Models.Metadata.Media();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Media);
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Media object from the internal model
/// </summary>
public Media(Models.Metadata.Media item)
public Media(Models.Metadata.Media item) : base(item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Media);
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Media object from a BaseFile
/// </summary>
/// <param name="baseFile"></param>
public Media(BaseFile baseFile)
public Media(BaseFile baseFile) : base()
{
_internal = new Models.Metadata.Media();
SetName(baseFile.Filename);
SetFieldValue<string?>(Models.Metadata.Media.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5));
SetFieldValue<string?>(Models.Metadata.Media.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1));
SetFieldValue<string?>(Models.Metadata.Media.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256));
SetFieldValue<string?>(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []));
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Media);
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Media()
{
_internal = this._internal?.Clone() as Models.Metadata.Media ?? [],
};
}
/// <summary>
/// Convert Media object to a BaseFile
/// </summary>

View File

@@ -9,10 +9,16 @@ namespace SabreTools.DatItems.Formats
/// </summary>
/// <remarks>One Part can contain multiple PartFeature, DataArea, DiskArea, and DipSwitch items</remarks>
[JsonObject("part"), XmlRoot("part")]
public class Part : DatItem
public sealed class Part : DatItem<Models.Metadata.Part>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Part;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Part.NameKey;
[JsonIgnore]
public bool FeaturesSpecified
{
@@ -25,53 +31,10 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Part.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Part.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Part object
/// </summary>
public Part()
{
_internal = new Models.Metadata.Part();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Part);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Part object from the internal model
/// </summary>
public Part(Models.Metadata.Part item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Part);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Part()
{
_internal = this._internal?.Clone() as Models.Metadata.Part ?? [],
};
}
public Part() : base() { }
public Part(Models.Metadata.Part item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents one part feature object
/// </summary>
[JsonObject("part_feature"), XmlRoot("part_feature")]
public class PartFeature : DatItem
public sealed class PartFeature : DatItem<Models.Metadata.Feature>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Feature.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.PartFeature;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Feature.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Feature.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty PartFeature object
/// </summary>
public PartFeature()
{
_internal = new Models.Metadata.Feature();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.PartFeature);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a PartFeature object from the internal model
/// </summary>
public PartFeature(Models.Metadata.Feature item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.PartFeature);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new PartFeature()
{
_internal = this._internal?.Clone() as Models.Metadata.Feature ?? [],
};
}
public PartFeature() : base() { }
public PartFeature(Models.Metadata.Feature item) : base(item) { }
#endregion
}

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents a single port on a machine
/// </summary>
[JsonObject("port"), XmlRoot("port")]
public class Port : DatItem
public sealed class Port : DatItem<Models.Metadata.Port>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Port;
/// <inheritdoc>/>
protected override string? NameKey => null;
[JsonIgnore]
public bool AnalogsSpecified
{
@@ -26,40 +32,8 @@ namespace SabreTools.DatItems.Formats
#region Constructors
/// <summary>
/// Create a default, empty Port object
/// </summary>
public Port()
{
_internal = new Models.Metadata.Port();
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Port);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Port object from the internal model
/// </summary>
public Port(Models.Metadata.Port item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Port);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Port()
{
_internal = this._internal?.Clone() as Models.Metadata.Port ?? [],
};
}
public Port() : base() { }
public Port(Models.Metadata.Port item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents which RAM option(s) is associated with a set
/// </summary>
[JsonObject("ramoption"), XmlRoot("ramoption")]
public class RamOption : DatItem
public sealed class RamOption : DatItem<Models.Metadata.RamOption>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.RamOption.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.RamOption;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.RamOption.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.RamOption.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty RamOption object
/// </summary>
public RamOption()
{
_internal = new Models.Metadata.RamOption();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.RamOption);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a RamOption object from the internal model
/// </summary>
public RamOption(Models.Metadata.RamOption item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.RamOption);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new RamOption()
{
_internal = this._internal?.Clone() as Models.Metadata.RamOption ?? [],
};
}
public RamOption() : base() { }
public RamOption(Models.Metadata.RamOption item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents release information about a set
/// </summary>
[JsonObject("release"), XmlRoot("release")]
public class Release : DatItem
public sealed class Release : DatItem<Models.Metadata.Release>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Release.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Release;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Release.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Release.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Release object
/// </summary>
public Release()
{
_internal = new Models.Metadata.Release();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Release);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Release object from the internal model
/// </summary>
public Release(Models.Metadata.Release item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Release);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Release()
{
_internal = this._internal?.Clone() as Models.Metadata.Release ?? [],
};
}
public Release() : base() { }
public Release(Models.Metadata.Release item) : base(item) { }
#endregion
}

View File

@@ -9,7 +9,7 @@ namespace SabreTools.DatItems.Formats
/// Represents a single release details item
/// </summary>
[JsonObject("release_details"), XmlRoot("release_details")]
public class ReleaseDetails : DatItem
public sealed class ReleaseDetails : DatItem
{
#region Fields

View File

@@ -10,7 +10,7 @@ namespace SabreTools.DatItems.Formats
/// Represents a generic file within a set
/// </summary>
[JsonObject("rom"), XmlRoot("rom")]
public class Rom : DatItem
public sealed class Rom : DatItem<Models.Metadata.Rom>
{
#region Constants
@@ -28,6 +28,12 @@ namespace SabreTools.DatItems.Formats
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Rom;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Rom.NameKey;
[JsonIgnore]
public bool ItemStatusSpecified
{
@@ -76,100 +82,50 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Rom.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Rom.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Rom object
/// </summary>
public Rom()
public Rom() : base()
{
_internal = new Models.Metadata.Rom();
SetName(null);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Rom);
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
}
/// <summary>
/// Create a "blank" Rom object
/// </summary>
/// <param name="name"></param>
/// <param name="machineName"></param>
/// <param name="omitFromScan"></param>
public Rom(string name, string machineName)
public Rom(string name, string machineName) : base()
{
_internal = new Models.Metadata.Rom();
SetName(name);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Rom);
SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
GetFieldValue<Machine>(DatItem.MachineKey)!.SetFieldValue<string?>(Models.Metadata.Machine.DescriptionKey, machineName);
GetFieldValue<Machine>(DatItem.MachineKey)!.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, machineName);
}
/// <summary>
/// Create a Rom object from a BaseFile
/// </summary>
/// <param name="baseFile"></param>
public Rom(BaseFile baseFile)
public Rom(BaseFile baseFile) : base()
{
_internal = new Models.Metadata.Rom();
SetName(baseFile.Filename);
SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, baseFile.Size);
SetFieldValue<string?>(Models.Metadata.Rom.DateKey, baseFile.Date);
SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, TextHelper.ByteArrayToString(baseFile.CRC));
SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5));
SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1));
SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256));
SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, TextHelper.ByteArrayToString(baseFile.SHA384));
SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, TextHelper.ByteArrayToString(baseFile.SHA512));
SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, baseFile.Size);
SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []));
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Rom);
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
SetFieldValue<string?>(Models.Metadata.Rom.DateKey, baseFile.Date);
}
/// <summary>
/// Create a Rom object from the internal model
/// </summary>
public Rom(Models.Metadata.Rom item)
public Rom(Models.Metadata.Rom item) : base(item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Rom);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
SetFieldValue<DupeType>(DatItem.DupeTypeKey, 0x00);
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Rom()
{
_internal = this._internal?.Clone() as Models.Metadata.Rom ?? [],
};
}
/// <summary>
/// Convert Rom object to a BaseFile
/// </summary>

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents a (usually WAV-formatted) sample to be included for use in the set
/// </summary>
[JsonObject("sample"), XmlRoot("sample")]
public class Sample : DatItem
public class Sample : DatItem<Models.Metadata.Sample>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Sample.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Sample;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Sample.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Sample.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Sample object
/// </summary>
public Sample()
{
_internal = new Models.Metadata.Sample();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Sample);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Sample object from the internal model
/// </summary>
public Sample(Models.Metadata.Sample item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Sample);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Sample()
{
_internal = this._internal?.Clone() as Models.Metadata.Sample ?? [],
};
}
public Sample() : base() { }
public Sample(Models.Metadata.Sample item) : base(item) { }
#endregion
}

View File

@@ -9,7 +9,7 @@ namespace SabreTools.DatItems.Formats
/// Represents a single serials item
/// </summary>
[JsonObject("serials"), XmlRoot("serials")]
public class Serials : DatItem
public sealed class Serials : DatItem
{
#region Fields

View File

@@ -0,0 +1,30 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
namespace SabreTools.DatItems.Formats
{
/// <summary>
/// Represents one shared feature object
/// </summary>
[JsonObject("sharedfeat"), XmlRoot("sharedfeat")]
public sealed class SharedFeat : DatItem<Models.Metadata.SharedFeat>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.SharedFeat;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.SharedFeat.NameKey;
#endregion
#region Constructors
public SharedFeat() : base() { }
public SharedFeat(Models.Metadata.SharedFeat item) : base(item) { }
#endregion
}
}

View File

@@ -1,63 +0,0 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
namespace SabreTools.DatItems.Formats
{
/// <summary>
/// Represents one shared feature object
/// </summary>
[JsonObject("sharedfeat"), XmlRoot("sharedfeat")]
public class SharedFeature : DatItem
{
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.SharedFeat.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.SharedFeat.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty SharedFeature object
/// </summary>
public SharedFeature()
{
_internal = new Models.Metadata.SharedFeat();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.SharedFeature);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a SharedFeature object from the internal model
/// </summary>
public SharedFeature(Models.Metadata.SharedFeat item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.SharedFeature);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new SharedFeature()
{
_internal = this._internal?.Clone() as Models.Metadata.SharedFeat ?? [],
};
}
#endregion
}
}

View File

@@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats
/// Represents which Slot(s) is associated with a set
/// </summary>
[JsonObject("slot"), XmlRoot("slot")]
public class Slot : DatItem
public sealed class Slot : DatItem<Models.Metadata.Slot>
{
#region Fields
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Slot;
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.Slot.NameKey;
[JsonIgnore]
public bool SlotOptionsSpecified
{
@@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.Slot.NameKey);
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.Slot.NameKey, name);
#endregion
#region Constructors
/// <summary>
/// Create a default, empty Slot object
/// </summary>
public Slot()
{
_internal = new Models.Metadata.Slot();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Slot);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Slot object from the internal model
/// </summary>
public Slot(Models.Metadata.Slot item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Slot);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new Slot()
{
_internal = this._internal?.Clone() as Models.Metadata.Slot ?? [],
};
}
public Slot() : base() { }
public Slot(Models.Metadata.Slot item) : base(item) { }
#endregion
}

View File

@@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents one ListXML slotoption
/// </summary>
[JsonObject("slotoption"), XmlRoot("slotoption")]
public class SlotOption : DatItem
public sealed class SlotOption : DatItem<Models.Metadata.SlotOption>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.SlotOption.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.SlotOption;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.SlotOption.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.SlotOption.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty SlotOption object
/// </summary>
public SlotOption()
{
_internal = new Models.Metadata.SlotOption();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.SlotOption);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a SlotOption object from the internal model
/// </summary>
public SlotOption(Models.Metadata.SlotOption item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.SlotOption);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone()
{
return new SlotOption()
{
_internal = this._internal?.Clone() as Models.Metadata.SlotOption ?? [],
};
}
public SlotOption() : base() { }
public SlotOption(Models.Metadata.SlotOption item) : base(item) { }
#endregion
}

View File

@@ -7,58 +7,23 @@ namespace SabreTools.DatItems.Formats
/// <summary>
/// Represents which SoftwareList(s) is associated with a set
/// </summary>
/// <remarks>
/// TODO: Add new fields to documentation
/// </remarks>
[JsonObject("softwarelist"), XmlRoot("softwarelist")]
public class SoftwareList : DatItem
public sealed class SoftwareList : DatItem<Models.Metadata.SoftwareList>
{
#region Accessors
#region Fields
/// <inheritdoc/>
public override string? GetName() => GetFieldValue<string>(Models.Metadata.SoftwareList.NameKey);
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.SoftwareList;
/// <inheritdoc/>
public override void SetName(string? name) => SetFieldValue(Models.Metadata.SoftwareList.NameKey, name);
/// <inheritdoc>/>
protected override string? NameKey => Models.Metadata.SoftwareList.NameKey;
#endregion
#region Constructors
/// <summary>
/// Create a default, empty SoftwareList object
/// </summary>
public SoftwareList()
{
_internal = new Models.Metadata.SoftwareList();
SetName(string.Empty);
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.SoftwareList);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a SoftwareList object from the internal model
/// </summary>
public SoftwareList(Models.Metadata.SoftwareList item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.SoftwareList);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
#endregion
#region Cloning Methods
public override object Clone()
{
return new SoftwareList()
{
_internal = this._internal?.Clone() as Models.Metadata.SoftwareList ?? [],
};
}
public SoftwareList() : base() { }
public SoftwareList(Models.Metadata.SoftwareList item) : base(item) { }
#endregion
}

View File

@@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats
/// Represents the sound output for a machine
/// </summary>
[JsonObject("sound"), XmlRoot("sound")]
public class Sound : DatItem
public sealed class Sound : DatItem<Models.Metadata.Sound>
{
#region Constructors
#region Fields
/// <summary>
/// Create a default, empty Sound object
/// </summary>
public Sound()
{
_internal = new Models.Metadata.Sound();
/// <inheritdoc>/>
protected override ItemType ItemType => ItemType.Sound;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Sound);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <summary>
/// Create a Sound object from the internal model
/// </summary>
public Sound(Models.Metadata.Sound item)
{
_internal = item;
SetFieldValue<ItemType>(Models.Metadata.DatItem.TypeKey, ItemType.Sound);
SetFieldValue<Machine>(DatItem.MachineKey, new Machine());
}
/// <inheritdoc>/>
protected override string? NameKey => null;
#endregion
#region Cloning Methods
#region Constructors
/// <inheritdoc/>
public override object Clone()
{
return new Sound()
{
_internal = this._internal?.Clone() as Models.Metadata.Sound ?? [],
};
}
public Sound() : base() { }
public Sound(Models.Metadata.Sound item) : base(item) { }
#endregion
}

View File

@@ -9,7 +9,7 @@ namespace SabreTools.DatItems.Formats
/// Represents a single source details item
/// </summary>
[JsonObject("source_details"), XmlRoot("source_details")]
public class SourceDetails : DatItem
public sealed class SourceDetails : DatItem
{
#region Fields

View File

@@ -295,8 +295,8 @@ namespace SabreTools.Filtering
// Get all device reference names from the current machine
List<string?> deviceReferences = datFile.Items[machine]!
.Where(i => i is DeviceReference)
.Select(i => i as DeviceReference)
.Where(i => i is DeviceRef)
.Select(i => i as DeviceRef)
.Select(dr => dr!.GetName())
.Distinct()
.ToList();
@@ -328,8 +328,8 @@ namespace SabreTools.Filtering
continue;
newDeviceReferences.AddRange(devItems
.Where(i => i is DeviceReference)
.Select(i => (i as DeviceReference)!.GetName()!));
.Where(i => i is DeviceRef)
.Select(i => (i as DeviceRef)!.GetName()!));
// Set new machine information and add to the current machine
DatItem copyFrom = datFile.Items[machine]![0];
@@ -354,7 +354,7 @@ namespace SabreTools.Filtering
{
if (!deviceReferences.Contains(deviceReference))
{
var deviceRef = new DeviceReference();
var deviceRef = new DeviceRef();
deviceRef.SetName(deviceReference);
datFile.Items[machine]!.Add(deviceRef);
}

View File

@@ -179,8 +179,8 @@ namespace SabreTools.Test.Core
[InlineData("control", ItemType.Control)]
[InlineData("dataarea", ItemType.DataArea)]
[InlineData("device", ItemType.Device)]
[InlineData("deviceref", ItemType.DeviceReference)]
[InlineData("device_ref", ItemType.DeviceReference)]
[InlineData("deviceref", ItemType.DeviceRef)]
[InlineData("device_ref", ItemType.DeviceRef)]
[InlineData("diplocation", ItemType.DipLocation)]
[InlineData("dipswitch", ItemType.DipSwitch)]
[InlineData("dipvalue", ItemType.DipValue)]
@@ -207,10 +207,10 @@ namespace SabreTools.Test.Core
[InlineData("rom", ItemType.Rom)]
[InlineData("sample", ItemType.Sample)]
[InlineData("serials", ItemType.Serials)]
[InlineData("sharedfeat", ItemType.SharedFeature)]
[InlineData("shared_feat", ItemType.SharedFeature)]
[InlineData("sharedfeature", ItemType.SharedFeature)]
[InlineData("shared_feature", ItemType.SharedFeature)]
[InlineData("sharedfeat", ItemType.SharedFeat)]
[InlineData("shared_feat", ItemType.SharedFeat)]
[InlineData("sharedfeature", ItemType.SharedFeat)]
[InlineData("shared_feature", ItemType.SharedFeat)]
[InlineData("slot", ItemType.Slot)]
[InlineData("slotoption", ItemType.SlotOption)]
[InlineData("slot_option", ItemType.SlotOption)]
@@ -548,7 +548,7 @@ namespace SabreTools.Test.Core
[InlineData(ItemType.Control, "control")]
[InlineData(ItemType.DataArea, "dataarea")]
[InlineData(ItemType.Device, "device")]
[InlineData(ItemType.DeviceReference, "device_ref")]
[InlineData(ItemType.DeviceRef, "device_ref")]
[InlineData(ItemType.DipLocation, "diplocation")]
[InlineData(ItemType.DipSwitch, "dipswitch")]
[InlineData(ItemType.DipValue, "dipvalue")]
@@ -572,7 +572,7 @@ namespace SabreTools.Test.Core
[InlineData(ItemType.Rom, "rom")]
[InlineData(ItemType.Sample, "sample")]
[InlineData(ItemType.Serials, "serials")]
[InlineData(ItemType.SharedFeature, "sharedfeat")]
[InlineData(ItemType.SharedFeat, "sharedfeat")]
[InlineData(ItemType.Slot, "slot")]
[InlineData(ItemType.SlotOption, "slotoption")]
[InlineData(ItemType.SoftwareList, "softwarelist")]