diff --git a/SabreTools.Core/Enums.cs b/SabreTools.Core/Enums.cs index 2b7f1bb8..d65e7211 100644 --- a/SabreTools.Core/Enums.cs +++ b/SabreTools.Core/Enums.cs @@ -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, diff --git a/SabreTools.DatFiles/DatFile.MetadataConverter.cs b/SabreTools.DatFiles/DatFile.MetadataConverter.cs index bc38dd9b..ee2c047c 100644 --- a/SabreTools.DatFiles/DatFile.MetadataConverter.cs +++ b/SabreTools.DatFiles/DatFile.MetadataConverter.cs @@ -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.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.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); datItem.CopyMachineInformation(machine); ParseAddHelper(datItem, statsOnly); diff --git a/SabreTools.DatFiles/Formats/Listxml.Reader.cs b/SabreTools.DatFiles/Formats/Listxml.Reader.cs index afda3757..0a3f7d3c 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Reader.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Reader.cs @@ -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(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); diff --git a/SabreTools.DatFiles/Formats/Listxml.Writer.cs b/SabreTools.DatFiles/Formats/Listxml.Writer.cs index c2e67802..101f703f 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Writer.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Writer.cs @@ -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 /// /// Create a DeviceRef from the current DeviceReference DatItem /// - private static Models.Listxml.DeviceRef CreateDeviceRef(DeviceReference item) + private static Models.Listxml.DeviceRef CreateDeviceRef(DeviceRef item) { var deviceref = new Models.Listxml.DeviceRef { diff --git a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs index 0ebb0b99..e50dc189 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs @@ -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 /// /// Create a DeviceRef from the current Chip DatItem /// - private static Models.Logiqx.DeviceRef CreateDeviceRef(DeviceReference item) + private static Models.Logiqx.DeviceRef CreateDeviceRef(DeviceRef item) { var deviceref = new Models.Logiqx.DeviceRef { diff --git a/SabreTools.DatFiles/Formats/SabreJSON.cs b/SabreTools.DatFiles/Formats/SabreJSON.cs index 066caa4d..174f325d 100644 --- a/SabreTools.DatFiles/Formats/SabreJSON.cs +++ b/SabreTools.DatFiles/Formats/SabreJSON.cs @@ -250,8 +250,8 @@ namespace SabreTools.DatFiles.Formats case ItemType.Device: datItem = datItemObj.ToObject(); break; - case ItemType.DeviceReference: - datItem = datItemObj.ToObject(); + case ItemType.DeviceRef: + datItem = datItemObj.ToObject(); break; case ItemType.DipLocation: datItem = datItemObj.ToObject(); @@ -319,8 +319,8 @@ namespace SabreTools.DatFiles.Formats case ItemType.Serials: datItem = datItemObj.ToObject(); break; - case ItemType.SharedFeature: - datItem = datItemObj.ToObject(); + case ItemType.SharedFeat: + datItem = datItemObj.ToObject(); break; case ItemType.Slot: datItem = datItemObj.ToObject(); diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs b/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs index c738adde..ad39518a 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs @@ -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(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); sharedfeatItem.SetFieldValue(Models.Metadata.SharedFeat.ValueKey, sharedfeat.Value); diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs index 30583cb2..26ba313e 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs @@ -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 /// /// Create a SharedFeat from the current SharedFeature DatItem /// - private static Models.SoftwareList.SharedFeat CreateSharedFeat(SharedFeature item) + private static Models.SoftwareList.SharedFeat CreateSharedFeat(SharedFeat item) { var sharedfeat = new Models.SoftwareList.SharedFeat { diff --git a/SabreTools.DatFiles/Setter.cs b/SabreTools.DatFiles/Setter.cs index 483b5dd1..bbf885bd 100644 --- a/SabreTools.DatFiles/Setter.cs +++ b/SabreTools.DatFiles/Setter.cs @@ -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 diff --git a/SabreTools.DatItems/DatItem.cs b/SabreTools.DatItems/DatItem.cs index 9e2017bf..f701153d 100644 --- a/SabreTools.DatItems/DatItem.cs +++ b/SabreTools.DatItems/DatItem.cs @@ -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 /// public abstract class DatItem : DatItem, IEquatable>, IComparable>, ICloneable where T : Models.Metadata.DatItem { + // TODO: Move to base class after implementation #region Fields /// @@ -710,6 +711,11 @@ namespace SabreTools.DatItems /// protected abstract ItemType ItemType { get; } + /// + /// Key for accessing the item name, if it exists + /// + protected abstract string? NameKey { get; } + #endregion #region Constructors @@ -739,6 +745,26 @@ namespace SabreTools.DatItems #endregion + #region Accessors + + /// + public override string? GetName() + { + if (NameKey != null) + return GetFieldValue(NameKey); + + return null; + } + + /// + 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 /// /// Clone of the DatItem - public override abstract object Clone(); + public override object Clone() + { + var clone = Activator.CreateInstance>(); + clone._internal = _internal?.Clone() as T ?? Activator.CreateInstance(); + return clone; + } #endregion diff --git a/SabreTools.DatItems/Formats/Adjuster.cs b/SabreTools.DatItems/Formats/Adjuster.cs index abb0cd00..e18281e0 100644 --- a/SabreTools.DatItems/Formats/Adjuster.cs +++ b/SabreTools.DatItems/Formats/Adjuster.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents which Adjuster(s) is associated with a set /// [JsonObject("adjuster"), XmlRoot("adjuster")] - public class Adjuster : DatItem + public sealed class Adjuster : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.Adjuster; + + /// /> + protected override string? NameKey => Models.Metadata.Adjuster.NameKey; + [JsonIgnore] public bool ConditionsSpecified { @@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Adjuster.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Adjuster.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty Adjuster object - /// - public Adjuster() - { - _internal = new Models.Metadata.Adjuster(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Adjuster); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create an Adjuster object from the internal model - /// - public Adjuster(Models.Metadata.Adjuster item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Adjuster); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Analog.cs b/SabreTools.DatItems/Formats/Analog.cs index 5fb6f73d..d8ce98d7 100644 --- a/SabreTools.DatItems/Formats/Analog.cs +++ b/SabreTools.DatItems/Formats/Analog.cs @@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents a single analog item /// [JsonObject("analog"), XmlRoot("analog")] - public class Analog : DatItem + public sealed class Analog : DatItem { - #region Constructors + #region Fields - /// - /// Create a default, empty Analog object - /// - public Analog() - { - _internal = new Models.Metadata.Analog(); + /// /> + protected override ItemType ItemType => ItemType.Analog; - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Analog); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create an Analog object from the internal model - /// - public Analog(Models.Metadata.Analog item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Analog); - SetFieldValue(DatItem.MachineKey, new Machine()); - } + /// /> + protected override string? NameKey => null; #endregion - #region Cloning Methods + #region Constructors - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Archive.cs b/SabreTools.DatItems/Formats/Archive.cs index 07a79e18..5dd7a184 100644 --- a/SabreTools.DatItems/Formats/Archive.cs +++ b/SabreTools.DatItems/Formats/Archive.cs @@ -8,7 +8,7 @@ namespace SabreTools.DatItems.Formats /// Represents generic archive files to be included in a set /// [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 - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Archive.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Archive.NameKey, name); - - #endregion - #region Constructors /// @@ -116,6 +106,16 @@ namespace SabreTools.DatItems.Formats #endregion + #region Accessors + + /// + public override string? GetName() => GetFieldValue(Models.Metadata.Archive.NameKey); + + /// + public override void SetName(string? name) => SetFieldValue(Models.Metadata.Archive.NameKey, name); + + #endregion + #region Cloning Methods /// diff --git a/SabreTools.DatItems/Formats/Auxiliary.cs b/SabreTools.DatItems/Formats/Auxiliary.cs index a0abc707..7a47b2e8 100644 --- a/SabreTools.DatItems/Formats/Auxiliary.cs +++ b/SabreTools.DatItems/Formats/Auxiliary.cs @@ -14,7 +14,7 @@ namespace SabreTools.DatItems.Formats /// Represents the OpenMSX original value /// [JsonObject("original"), XmlRoot("original")] - public class Original + public sealed class Original { [JsonProperty("value"), XmlElement("value")] public bool? Value diff --git a/SabreTools.DatItems/Formats/BiosSet.cs b/SabreTools.DatItems/Formats/BiosSet.cs index 4546084d..7564941c 100644 --- a/SabreTools.DatItems/Formats/BiosSet.cs +++ b/SabreTools.DatItems/Formats/BiosSet.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents which BIOS(es) is associated with a set /// [JsonObject("biosset"), XmlRoot("biosset")] - public class BiosSet : DatItem + public sealed class BiosSet : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.BiosSet.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Analog; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.BiosSet.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.BiosSet.NameKey; #endregion #region Constructors - /// - /// Create a default, empty BiosSet object - /// - public BiosSet() - { - _internal = new Models.Metadata.BiosSet(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.BiosSet); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a BiosSet object from the internal model - /// - public BiosSet(Models.Metadata.BiosSet item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.BiosSet); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Blank.cs b/SabreTools.DatItems/Formats/Blank.cs index 8e6be093..a099c560 100644 --- a/SabreTools.DatItems/Formats/Blank.cs +++ b/SabreTools.DatItems/Formats/Blank.cs @@ -8,7 +8,7 @@ namespace SabreTools.DatItems.Formats /// Represents a blank set from an input DAT /// [JsonObject("blank"), XmlRoot("blank")] - public class Blank : DatItem + public sealed class Blank : DatItem { #region Constructors diff --git a/SabreTools.DatItems/Formats/Chip.cs b/SabreTools.DatItems/Formats/Chip.cs index b9de0ad6..f1d78491 100644 --- a/SabreTools.DatItems/Formats/Chip.cs +++ b/SabreTools.DatItems/Formats/Chip.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents which Chip(s) is associated with a set /// [JsonObject("chip"), XmlRoot("chip")] - public class Chip : DatItem + public sealed class Chip : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Chip.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Chip; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Chip.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Chip.NameKey; #endregion #region Constructors - /// - /// Create a default, empty Chip object - /// - public Chip() - { - _internal = new Models.Metadata.Chip(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Chip); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Chip object from the internal model - /// - public Chip(Models.Metadata.Chip item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Chip); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Condition.cs b/SabreTools.DatItems/Formats/Condition.cs index a93f8d10..1a92ee5f 100644 --- a/SabreTools.DatItems/Formats/Condition.cs +++ b/SabreTools.DatItems/Formats/Condition.cs @@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents a condition on a machine or other item /// [JsonObject("condition"), XmlRoot("condition")] - public class Condition : DatItem + public sealed class Condition : DatItem { - #region Constructors + #region Fields - /// - /// Create a default, empty Condition object - /// - public Condition() - { - _internal = new Models.Metadata.Condition(); + /// /> + protected override ItemType ItemType => ItemType.Condition; - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Condition); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Condition object from the internal model - /// - public Condition(Models.Metadata.Condition item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Condition); - SetFieldValue(DatItem.MachineKey, new Machine()); - } + /// /> + protected override string? NameKey => null; #endregion - #region Cloning Methods + #region Constructors - /// - 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 } diff --git a/SabreTools.DatItems/Formats/ConfLocation.cs b/SabreTools.DatItems/Formats/ConfLocation.cs index 09f4c7d0..63bca63b 100644 --- a/SabreTools.DatItems/Formats/ConfLocation.cs +++ b/SabreTools.DatItems/Formats/ConfLocation.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents one conflocation /// [JsonObject("conflocation"), XmlRoot("conflocation")] - public class ConfLocation : DatItem + public sealed class ConfLocation : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.ConfLocation.NameKey); + /// /> + protected override ItemType ItemType => ItemType.ConfLocation; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.ConfLocation.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.ConfLocation.NameKey; #endregion #region Constructors - /// - /// Create a default, empty ConfLocation object - /// - public ConfLocation() - { - _internal = new Models.Metadata.ConfLocation(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.ConfLocation); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a ConfLocation object from the internal model - /// - public ConfLocation(Models.Metadata.ConfLocation item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.ConfLocation); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/ConfSetting.cs b/SabreTools.DatItems/Formats/ConfSetting.cs index 904ae5a1..59cb2ec7 100644 --- a/SabreTools.DatItems/Formats/ConfSetting.cs +++ b/SabreTools.DatItems/Formats/ConfSetting.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents one ListXML confsetting /// [JsonObject("confsetting"), XmlRoot("confsetting")] - public class ConfSetting : DatItem + public sealed class ConfSetting : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.ConfSetting; + + /// /> + protected override string? NameKey => Models.Metadata.ConfSetting.NameKey; + [JsonIgnore] public bool ConditionsSpecified { @@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.ConfSetting.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.ConfSetting.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty ConfSetting object - /// - public ConfSetting() - { - _internal = new Models.Metadata.ConfSetting(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.ConfSetting); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a ConfSetting object from the internal model - /// - public ConfSetting(Models.Metadata.ConfSetting item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.ConfSetting); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Configuration.cs b/SabreTools.DatItems/Formats/Configuration.cs index be9c5533..da5fc17c 100644 --- a/SabreTools.DatItems/Formats/Configuration.cs +++ b/SabreTools.DatItems/Formats/Configuration.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents which Configuration(s) is associated with a set /// [JsonObject("configuration"), XmlRoot("configuration")] - public class Configuration : DatItem + public sealed class Configuration : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.Configuration; + + /// /> + protected override string? NameKey => Models.Metadata.Configuration.NameKey; + [JsonIgnore] public bool ConditionsSpecified { @@ -44,53 +50,10 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Configuration.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Configuration.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty Configuration object - /// - public Configuration() - { - _internal = new Models.Metadata.Configuration(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Configuration); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Configuration object from the internal model - /// - public Configuration(Models.Metadata.Configuration item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Configuration); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Control.cs b/SabreTools.DatItems/Formats/Control.cs index 584f5c62..ccee242a 100644 --- a/SabreTools.DatItems/Formats/Control.cs +++ b/SabreTools.DatItems/Formats/Control.cs @@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents control for an input /// [JsonObject("control"), XmlRoot("control")] - public class Control : DatItem + public sealed class Control : DatItem { - #region Constructors + #region Fields - /// - /// Create a default, empty Control object - /// - public Control() - { - _internal = new Models.Metadata.Control(); + /// /> + protected override ItemType ItemType => ItemType.Control; - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Control); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Control object from the internal model - /// - public Control(Models.Metadata.Control item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Control); - SetFieldValue(DatItem.MachineKey, new Machine()); - } + /// /> + protected override string? NameKey => null; #endregion - #region Cloning Methods + #region Constructors - /// - 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 } diff --git a/SabreTools.DatItems/Formats/DataArea.cs b/SabreTools.DatItems/Formats/DataArea.cs index be002297..125b7ea2 100644 --- a/SabreTools.DatItems/Formats/DataArea.cs +++ b/SabreTools.DatItems/Formats/DataArea.cs @@ -9,55 +9,22 @@ namespace SabreTools.DatItems.Formats /// /// One DataArea can contain multiple Rom items [JsonObject("dataarea"), XmlRoot("dataarea")] - public class DataArea : DatItem + public sealed class DataArea : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.DataArea.NameKey); + /// /> + protected override ItemType ItemType => ItemType.DataArea; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.DataArea.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.DataArea.NameKey; #endregion #region Constructors - /// - /// Create a default, empty DataArea object - /// - public DataArea() - { - _internal = new Models.Metadata.DataArea(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DataArea); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a DataArea object from the internal model - /// - public DataArea(Models.Metadata.DataArea item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DataArea); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Device.cs b/SabreTools.DatItems/Formats/Device.cs index 0fe77eea..0f4d891b 100644 --- a/SabreTools.DatItems/Formats/Device.cs +++ b/SabreTools.DatItems/Formats/Device.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents a single device on the machine /// [JsonObject("device"), XmlRoot("device")] - public class Device : DatItem + public sealed class Device : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.Device; + + /// /> + protected override string? NameKey => null; + [JsonIgnore] public bool InstancesSpecified { @@ -36,40 +42,8 @@ namespace SabreTools.DatItems.Formats #region Constructors - /// - /// Create a default, empty Device object - /// - public Device() - { - _internal = new Models.Metadata.Device(); - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Device); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Device object from the internal model - /// - public Device(Models.Metadata.Device item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Device); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/DeviceRef.cs b/SabreTools.DatItems/Formats/DeviceRef.cs new file mode 100644 index 00000000..cb31e83f --- /dev/null +++ b/SabreTools.DatItems/Formats/DeviceRef.cs @@ -0,0 +1,30 @@ +using System.Xml.Serialization; +using Newtonsoft.Json; +using SabreTools.Core; + +namespace SabreTools.DatItems.Formats +{ + /// + /// Represents which Device Reference(s) is associated with a set + /// + [JsonObject("device_ref"), XmlRoot("device_ref")] + public sealed class DeviceRef : DatItem + { + #region Fields + + /// /> + protected override ItemType ItemType => ItemType.DeviceRef; + + /// /> + protected override string? NameKey => Models.Metadata.DeviceRef.NameKey; + + #endregion + + #region Constructors + + public DeviceRef() : base() { } + public DeviceRef(Models.Metadata.DeviceRef item) : base(item) { } + + #endregion + } +} diff --git a/SabreTools.DatItems/Formats/DeviceReference.cs b/SabreTools.DatItems/Formats/DeviceReference.cs deleted file mode 100644 index 11b7e24d..00000000 --- a/SabreTools.DatItems/Formats/DeviceReference.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Xml.Serialization; -using Newtonsoft.Json; -using SabreTools.Core; - -namespace SabreTools.DatItems.Formats -{ - /// - /// Represents which Device Reference(s) is associated with a set - /// - [JsonObject("device_ref"), XmlRoot("device_ref")] - public class DeviceReference : DatItem - { - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.DeviceRef.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.DeviceRef.NameKey, name); - - #endregion - - #region Constructors - - /// - /// Create a default, empty DeviceReference object - /// - public DeviceReference() - { - _internal = new Models.Metadata.DeviceRef(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DeviceReference); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a DeviceReference object from the internal model - /// - public DeviceReference(Models.Metadata.DeviceRef item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DeviceReference); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - public override object Clone() - { - return new DeviceReference() - { - _internal = this._internal?.Clone() as Models.Metadata.DeviceRef ?? [], - }; - } - - #endregion - } -} diff --git a/SabreTools.DatItems/Formats/DipLocation.cs b/SabreTools.DatItems/Formats/DipLocation.cs index e7a84aa0..7329c1b3 100644 --- a/SabreTools.DatItems/Formats/DipLocation.cs +++ b/SabreTools.DatItems/Formats/DipLocation.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents one diplocation /// [JsonObject("diplocation"), XmlRoot("diplocation")] - public class DipLocation : DatItem + public sealed class DipLocation : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.DipLocation.NameKey); + /// /> + protected override ItemType ItemType => ItemType.DipLocation; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.DipLocation.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.DipLocation.NameKey; #endregion #region Constructors - /// - /// Create a default, empty DipLocation object - /// - public DipLocation() - { - _internal = new Models.Metadata.DipLocation(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DipLocation); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a DipLocation object from the internal model - /// - public DipLocation(Models.Metadata.DipLocation item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DipLocation); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/DipSwitch.cs b/SabreTools.DatItems/Formats/DipSwitch.cs index 18508e31..e8cf00e7 100644 --- a/SabreTools.DatItems/Formats/DipSwitch.cs +++ b/SabreTools.DatItems/Formats/DipSwitch.cs @@ -8,7 +8,7 @@ namespace SabreTools.DatItems.Formats /// Represents which DIP Switch(es) is associated with a set /// [JsonObject("dipswitch"), XmlRoot("dipswitch")] - public class DipSwitch : DatItem + public sealed class DipSwitch : DatItem { #region Constants @@ -21,6 +21,12 @@ namespace SabreTools.DatItems.Formats #region Fields + /// /> + protected override ItemType ItemType => ItemType.DipSwitch; + + /// /> + protected override string? NameKey => Models.Metadata.DipSwitch.NameKey; + [JsonIgnore] public bool ConditionsSpecified { @@ -65,53 +71,10 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.DipSwitch.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.DipSwitch.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty DipSwitch object - /// - public DipSwitch() - { - _internal = new Models.Metadata.DipSwitch(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DipSwitch); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a DipSwitch object from the internal model - /// - public DipSwitch(Models.Metadata.DipSwitch item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DipSwitch); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/DipValue.cs b/SabreTools.DatItems/Formats/DipValue.cs index efe471df..076d4ce8 100644 --- a/SabreTools.DatItems/Formats/DipValue.cs +++ b/SabreTools.DatItems/Formats/DipValue.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents one ListXML dipvalue /// [JsonObject("dipvalue"), XmlRoot("dipvalue")] - public class DipValue : DatItem + public sealed class DipValue : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.DipValue; + + /// /> + protected override string? NameKey => Models.Metadata.DipValue.NameKey; + [JsonIgnore] public bool ConditionsSpecified { @@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.DipValue.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.DipValue.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty DipValue object - /// - public DipValue() - { - _internal = new Models.Metadata.DipValue(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DipValue); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a DipValue object from the internal model - /// - public DipValue(Models.Metadata.DipValue item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DipValue); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Disk.cs b/SabreTools.DatItems/Formats/Disk.cs index ad2efc83..7b6b5959 100644 --- a/SabreTools.DatItems/Formats/Disk.cs +++ b/SabreTools.DatItems/Formats/Disk.cs @@ -10,7 +10,7 @@ namespace SabreTools.DatItems.Formats /// Represents Compressed Hunks of Data (CHD) formatted disks which use internal hashes /// [JsonObject("disk"), XmlRoot("disk")] - public class Disk : DatItem + public sealed class Disk : DatItem { #region Constants @@ -28,6 +28,12 @@ namespace SabreTools.DatItems.Formats #region Fields + /// /> + protected override ItemType ItemType => ItemType.Disk; + + /// /> + protected override string? NameKey => Models.Metadata.Disk.NameKey; + [JsonIgnore] public bool DiskAreaSpecified { @@ -52,73 +58,34 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Disk.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Disk.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty Disk object - /// - public Disk() + public Disk() : base() { - _internal = new Models.Metadata.Disk(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Disk); SetFieldValue(DatItem.DupeTypeKey, 0x00); - SetFieldValue(DatItem.MachineKey, new Machine()); SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.None); } - /// - /// Create a Disk object from a BaseFile - /// - public Disk(BaseFile baseFile) + public Disk(Models.Metadata.Disk item) : base(item) { - _internal = new Models.Metadata.Disk(); + SetFieldValue(DatItem.DupeTypeKey, 0x00); + SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.None); + } + public Disk(BaseFile baseFile) : base() + { SetName(baseFile.Filename); SetFieldValue(Models.Metadata.Disk.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); SetFieldValue(Models.Metadata.Disk.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Disk); SetFieldValue(DatItem.DupeTypeKey, 0x00); - SetFieldValue(DatItem.MachineKey, new Machine()); SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.None); } - /// - /// Create a Disk object from the internal model - /// - public Disk(Models.Metadata.Disk item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Disk); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - #endregion #region Cloning Methods - /// - public override object Clone() - { - return new Disk() - { - _internal = this._internal?.Clone() as Models.Metadata.Disk ?? [], - }; - } - /// /// Convert Disk object to a BaseFile /// diff --git a/SabreTools.DatItems/Formats/DiskArea.cs b/SabreTools.DatItems/Formats/DiskArea.cs index 251c2054..f46a40f2 100644 --- a/SabreTools.DatItems/Formats/DiskArea.cs +++ b/SabreTools.DatItems/Formats/DiskArea.cs @@ -9,55 +9,22 @@ namespace SabreTools.DatItems.Formats /// /// One DiskArea can contain multiple Disk items [JsonObject("diskarea"), XmlRoot("diskarea")] - public class DiskArea : DatItem + public sealed class DiskArea : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.DiskArea.NameKey); + /// /> + protected override ItemType ItemType => ItemType.DiskArea; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.DiskArea.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.DiskArea.NameKey; #endregion #region Constructors - /// - /// Create a default, empty DiskArea object - /// - public DiskArea() - { - _internal = new Models.Metadata.DiskArea(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DiskArea); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a DiskArea object from the internal model - /// - public DiskArea(Models.Metadata.DiskArea item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.DiskArea); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Display.cs b/SabreTools.DatItems/Formats/Display.cs index 52762b98..a5d1607e 100644 --- a/SabreTools.DatItems/Formats/Display.cs +++ b/SabreTools.DatItems/Formats/Display.cs @@ -8,55 +8,27 @@ namespace SabreTools.DatItems.Formats /// Represents one machine display /// [JsonObject("display"), XmlRoot("display")] - public class Display : DatItem + public sealed class Display : DatItem { - #region Constructors + #region Fields - /// - /// Create a default, empty Display object - /// - public Display() - { - _internal = new Models.Metadata.Display(); + /// /> + protected override ItemType ItemType => ItemType.Display; - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Display); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Display object from the internal model - /// - public Display(Models.Metadata.Display item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Display); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Display object from the internal model - /// - public Display(Models.Metadata.Video item) - { - // TODO: Determine what transformation is needed here - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Display); - SetFieldValue(DatItem.MachineKey, new Machine()); - } + /// /> + protected override string? NameKey => null; #endregion - #region Cloning Methods + #region Constructors - /// - 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 diff --git a/SabreTools.DatItems/Formats/Driver.cs b/SabreTools.DatItems/Formats/Driver.cs index 251335bd..4506fb06 100644 --- a/SabreTools.DatItems/Formats/Driver.cs +++ b/SabreTools.DatItems/Formats/Driver.cs @@ -7,48 +7,23 @@ namespace SabreTools.DatItems.Formats /// /// Represents the a driver of the machine /// - /// - /// TODO: Add new fields to documentation - /// [JsonObject("driver"), XmlRoot("driver")] - public class Driver : DatItem + public sealed class Driver : DatItem { - #region Constructors + #region Fields - /// - /// Create a default, empty Driver object - /// - public Driver() - { - _internal = new Models.Metadata.Driver(); + /// /> + protected override ItemType ItemType => ItemType.Driver; - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Driver); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Driver object from the internal model - /// - public Driver(Models.Metadata.Driver item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Driver); - SetFieldValue(DatItem.MachineKey, new Machine()); - } + /// /> + protected override string? NameKey => null; #endregion - #region Cloning Methods + #region Constructors - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Extension.cs b/SabreTools.DatItems/Formats/Extension.cs index b2dbfde5..2e69f6a5 100644 --- a/SabreTools.DatItems/Formats/Extension.cs +++ b/SabreTools.DatItems/Formats/Extension.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents a matchable extension /// [JsonObject("extension"), XmlRoot("extension")] - public class Extension : DatItem + public sealed class Extension : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Extension.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Extension; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Extension.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Extension.NameKey; #endregion #region Constructors - /// - /// Create a default, empty Extension object - /// - public Extension() - { - _internal = new Models.Metadata.Extension(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Extension); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create an Extension object from the internal model - /// - public Extension(Models.Metadata.Extension item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Extension); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Feature.cs b/SabreTools.DatItems/Formats/Feature.cs index f0013820..7e68438b 100644 --- a/SabreTools.DatItems/Formats/Feature.cs +++ b/SabreTools.DatItems/Formats/Feature.cs @@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents the a feature of the machine /// [JsonObject("feature"), XmlRoot("feature")] - public class Feature : DatItem + public sealed class Feature : DatItem { - #region Constructors + #region Fields - /// - /// Create a default, empty Feature object - /// - public Feature() - { - _internal = new Models.Metadata.Feature(); + /// /> + protected override ItemType ItemType => ItemType.Feature; - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Feature); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Feature object from the internal model - /// - public Feature(Models.Metadata.Feature item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Feature); - SetFieldValue(DatItem.MachineKey, new Machine()); - } + /// /> + protected override string? NameKey => null; #endregion - #region Cloning Methods + #region Constructors - /// - 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 } diff --git a/SabreTools.DatItems/Formats/File.cs b/SabreTools.DatItems/Formats/File.cs index 9516f776..2dc60a3f 100644 --- a/SabreTools.DatItems/Formats/File.cs +++ b/SabreTools.DatItems/Formats/File.cs @@ -14,7 +14,7 @@ namespace SabreTools.DatItems.Formats /// Represents a single file item /// [JsonObject("file"), XmlRoot("file")] - public class File : DatItem + public sealed class File : DatItem { #region Private instance variables diff --git a/SabreTools.DatItems/Formats/Info.cs b/SabreTools.DatItems/Formats/Info.cs index 6097cf6b..f5398e5f 100644 --- a/SabreTools.DatItems/Formats/Info.cs +++ b/SabreTools.DatItems/Formats/Info.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents special information about a machine /// [JsonObject("info"), XmlRoot("info")] - public class Info : DatItem + public sealed class Info : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Info.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Info; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Info.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Instance.NameKey; #endregion #region Constructors - /// - /// Create a default, empty Info object - /// - public Info() - { - _internal = new Models.Metadata.Info(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Info); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create an Info object from the internal model - /// - public Info(Models.Metadata.Info item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Info); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Input.cs b/SabreTools.DatItems/Formats/Input.cs index 640dc1ff..0650a96c 100644 --- a/SabreTools.DatItems/Formats/Input.cs +++ b/SabreTools.DatItems/Formats/Input.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents one ListXML input /// [JsonObject("input"), XmlRoot("input")] - public class Input : DatItem + public sealed class Input : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.Input; + + /// /> + protected override string? NameKey => null; + [JsonIgnore] public bool ControlsSpecified { @@ -26,40 +32,8 @@ namespace SabreTools.DatItems.Formats #region Constructors - /// - /// Create a default, empty Input object - /// - public Input() - { - _internal = new Models.Metadata.Input(); - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Input); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create an Input object from the internal model - /// - public Input(Models.Metadata.Input item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Input); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Instance.cs b/SabreTools.DatItems/Formats/Instance.cs index b8e8be9f..1e929ca6 100644 --- a/SabreTools.DatItems/Formats/Instance.cs +++ b/SabreTools.DatItems/Formats/Instance.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents a single instance of another item /// [JsonObject("instance"), XmlRoot("instance")] - public class Instance : DatItem + public sealed class Instance : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Instance.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Instance; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Instance.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Instance.NameKey; #endregion #region Constructors - /// - /// Create a default, empty Instance object - /// - public Instance() - { - _internal = new Models.Metadata.Instance(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Instance); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create an Instance object from the internal model - /// - public Instance(Models.Metadata.Instance item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Instance); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Media.cs b/SabreTools.DatItems/Formats/Media.cs index e21de2cc..28e1fd63 100644 --- a/SabreTools.DatItems/Formats/Media.cs +++ b/SabreTools.DatItems/Formats/Media.cs @@ -10,77 +10,45 @@ namespace SabreTools.DatItems.Formats /// Represents Aaruformat images which use internal hashes /// [JsonObject("media"), XmlRoot("media")] - public class Media : DatItem + public sealed class Media : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Media.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Media; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Media.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Media.NameKey; #endregion #region Constructors - /// - /// Create a default, empty Media object - /// - public Media() + public Media() : base() { - _internal = new Models.Metadata.Media(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Media); SetFieldValue(DatItem.DupeTypeKey, 0x00); - SetFieldValue(DatItem.MachineKey, new Machine()); } - /// - /// Create a Media object from the internal model - /// - public Media(Models.Metadata.Media item) + public Media(Models.Metadata.Media item) : base(item) { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Media); SetFieldValue(DatItem.DupeTypeKey, 0x00); - SetFieldValue(DatItem.MachineKey, new Machine()); } - /// - /// Create a Media object from a BaseFile - /// - /// - public Media(BaseFile baseFile) + public Media(BaseFile baseFile) : base() { - _internal = new Models.Metadata.Media(); - SetName(baseFile.Filename); SetFieldValue(Models.Metadata.Media.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); SetFieldValue(Models.Metadata.Media.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); SetFieldValue(Models.Metadata.Media.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256)); SetFieldValue(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? [])); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Media); SetFieldValue(DatItem.DupeTypeKey, 0x00); - SetFieldValue(DatItem.MachineKey, new Machine()); } #endregion #region Cloning Methods - /// - public override object Clone() - { - return new Media() - { - _internal = this._internal?.Clone() as Models.Metadata.Media ?? [], - }; - } - /// /// Convert Media object to a BaseFile /// diff --git a/SabreTools.DatItems/Formats/Part.cs b/SabreTools.DatItems/Formats/Part.cs index 0deb4da6..35446488 100644 --- a/SabreTools.DatItems/Formats/Part.cs +++ b/SabreTools.DatItems/Formats/Part.cs @@ -9,10 +9,16 @@ namespace SabreTools.DatItems.Formats /// /// One Part can contain multiple PartFeature, DataArea, DiskArea, and DipSwitch items [JsonObject("part"), XmlRoot("part")] - public class Part : DatItem + public sealed class Part : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.Part; + + /// /> + protected override string? NameKey => Models.Metadata.Part.NameKey; + [JsonIgnore] public bool FeaturesSpecified { @@ -25,53 +31,10 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Part.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Part.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty Part object - /// - public Part() - { - _internal = new Models.Metadata.Part(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Part); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Part object from the internal model - /// - public Part(Models.Metadata.Part item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Part); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/PartFeature.cs b/SabreTools.DatItems/Formats/PartFeature.cs index bf2ae0e8..eab6bc60 100644 --- a/SabreTools.DatItems/Formats/PartFeature.cs +++ b/SabreTools.DatItems/Formats/PartFeature.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents one part feature object /// [JsonObject("part_feature"), XmlRoot("part_feature")] - public class PartFeature : DatItem + public sealed class PartFeature : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Feature.NameKey); + /// /> + protected override ItemType ItemType => ItemType.PartFeature; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Feature.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Feature.NameKey; #endregion #region Constructors - /// - /// Create a default, empty PartFeature object - /// - public PartFeature() - { - _internal = new Models.Metadata.Feature(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.PartFeature); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a PartFeature object from the internal model - /// - public PartFeature(Models.Metadata.Feature item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.PartFeature); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Port.cs b/SabreTools.DatItems/Formats/Port.cs index 00d9c678..7081f221 100644 --- a/SabreTools.DatItems/Formats/Port.cs +++ b/SabreTools.DatItems/Formats/Port.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents a single port on a machine /// [JsonObject("port"), XmlRoot("port")] - public class Port : DatItem + public sealed class Port : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.Port; + + /// /> + protected override string? NameKey => null; + [JsonIgnore] public bool AnalogsSpecified { @@ -26,40 +32,8 @@ namespace SabreTools.DatItems.Formats #region Constructors - /// - /// Create a default, empty Port object - /// - public Port() - { - _internal = new Models.Metadata.Port(); - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Port); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Port object from the internal model - /// - public Port(Models.Metadata.Port item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Port); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/RamOption.cs b/SabreTools.DatItems/Formats/RamOption.cs index 2d9dca24..a9889326 100644 --- a/SabreTools.DatItems/Formats/RamOption.cs +++ b/SabreTools.DatItems/Formats/RamOption.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents which RAM option(s) is associated with a set /// [JsonObject("ramoption"), XmlRoot("ramoption")] - public class RamOption : DatItem + public sealed class RamOption : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.RamOption.NameKey); + /// /> + protected override ItemType ItemType => ItemType.RamOption; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.RamOption.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.RamOption.NameKey; #endregion #region Constructors - /// - /// Create a default, empty RamOption object - /// - public RamOption() - { - _internal = new Models.Metadata.RamOption(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.RamOption); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a RamOption object from the internal model - /// - public RamOption(Models.Metadata.RamOption item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.RamOption); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Release.cs b/SabreTools.DatItems/Formats/Release.cs index c2ad263e..b19d9eab 100644 --- a/SabreTools.DatItems/Formats/Release.cs +++ b/SabreTools.DatItems/Formats/Release.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents release information about a set /// [JsonObject("release"), XmlRoot("release")] - public class Release : DatItem + public sealed class Release : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Release.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Release; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Release.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Release.NameKey; #endregion #region Constructors - /// - /// Create a default, empty Release object - /// - public Release() - { - _internal = new Models.Metadata.Release(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Release); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Release object from the internal model - /// - public Release(Models.Metadata.Release item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Release); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/ReleaseDetails.cs b/SabreTools.DatItems/Formats/ReleaseDetails.cs index 389d3d2b..587e6477 100644 --- a/SabreTools.DatItems/Formats/ReleaseDetails.cs +++ b/SabreTools.DatItems/Formats/ReleaseDetails.cs @@ -9,7 +9,7 @@ namespace SabreTools.DatItems.Formats /// Represents a single release details item /// [JsonObject("release_details"), XmlRoot("release_details")] - public class ReleaseDetails : DatItem + public sealed class ReleaseDetails : DatItem { #region Fields diff --git a/SabreTools.DatItems/Formats/Rom.cs b/SabreTools.DatItems/Formats/Rom.cs index 2bd830e6..a6f8aebf 100644 --- a/SabreTools.DatItems/Formats/Rom.cs +++ b/SabreTools.DatItems/Formats/Rom.cs @@ -10,7 +10,7 @@ namespace SabreTools.DatItems.Formats /// Represents a generic file within a set /// [JsonObject("rom"), XmlRoot("rom")] - public class Rom : DatItem + public sealed class Rom : DatItem { #region Constants @@ -28,6 +28,12 @@ namespace SabreTools.DatItems.Formats #region Fields + /// /> + protected override ItemType ItemType => ItemType.Rom; + + /// /> + protected override string? NameKey => Models.Metadata.Rom.NameKey; + [JsonIgnore] public bool ItemStatusSpecified { @@ -76,100 +82,50 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Rom.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Rom.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty Rom object - /// - public Rom() + public Rom() : base() { - _internal = new Models.Metadata.Rom(); - - SetName(null); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Rom); SetFieldValue(DatItem.DupeTypeKey, 0x00); - SetFieldValue(DatItem.MachineKey, new Machine()); SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); } - /// - /// Create a "blank" Rom object - /// - /// - /// - /// - public Rom(string name, string machineName) + public Rom(string name, string machineName) : base() { - _internal = new Models.Metadata.Rom(); SetName(name); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Rom); SetFieldValue(Models.Metadata.Rom.SizeKey, null); SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); - - SetFieldValue(DatItem.MachineKey, new Machine()); GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.DescriptionKey, machineName); GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, machineName); } - /// - /// Create a Rom object from a BaseFile - /// - /// - public Rom(BaseFile baseFile) + public Rom(BaseFile baseFile) : base() { - _internal = new Models.Metadata.Rom(); - SetName(baseFile.Filename); - SetFieldValue(Models.Metadata.Rom.SizeKey, baseFile.Size); + SetFieldValue(Models.Metadata.Rom.DateKey, baseFile.Date); SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.ByteArrayToString(baseFile.CRC)); SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); SetFieldValue(Models.Metadata.Rom.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); SetFieldValue(Models.Metadata.Rom.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256)); SetFieldValue(Models.Metadata.Rom.SHA384Key, TextHelper.ByteArrayToString(baseFile.SHA384)); SetFieldValue(Models.Metadata.Rom.SHA512Key, TextHelper.ByteArrayToString(baseFile.SHA512)); + SetFieldValue(Models.Metadata.Rom.SizeKey, baseFile.Size); SetFieldValue(Models.Metadata.Rom.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? [])); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Rom); SetFieldValue(DatItem.DupeTypeKey, 0x00); - SetFieldValue(DatItem.MachineKey, new Machine()); SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); - SetFieldValue(Models.Metadata.Rom.DateKey, baseFile.Date); } - /// - /// Create a Rom object from the internal model - /// - public Rom(Models.Metadata.Rom item) + public Rom(Models.Metadata.Rom item) : base(item) { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Rom); - SetFieldValue(DatItem.MachineKey, new Machine()); + SetFieldValue(DatItem.DupeTypeKey, 0x00); + SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); } #endregion #region Cloning Methods - /// - public override object Clone() - { - return new Rom() - { - _internal = this._internal?.Clone() as Models.Metadata.Rom ?? [], - }; - } - /// /// Convert Rom object to a BaseFile /// diff --git a/SabreTools.DatItems/Formats/Sample.cs b/SabreTools.DatItems/Formats/Sample.cs index 5d8fd091..b25666ac 100644 --- a/SabreTools.DatItems/Formats/Sample.cs +++ b/SabreTools.DatItems/Formats/Sample.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents a (usually WAV-formatted) sample to be included for use in the set /// [JsonObject("sample"), XmlRoot("sample")] - public class Sample : DatItem + public class Sample : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Sample.NameKey); + /// /> + protected override ItemType ItemType => ItemType.Sample; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Sample.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.Sample.NameKey; #endregion #region Constructors - /// - /// Create a default, empty Sample object - /// - public Sample() - { - _internal = new Models.Metadata.Sample(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Sample); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Sample object from the internal model - /// - public Sample(Models.Metadata.Sample item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Sample); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/Serials.cs b/SabreTools.DatItems/Formats/Serials.cs index b02ddbfd..051d67d8 100644 --- a/SabreTools.DatItems/Formats/Serials.cs +++ b/SabreTools.DatItems/Formats/Serials.cs @@ -9,7 +9,7 @@ namespace SabreTools.DatItems.Formats /// Represents a single serials item /// [JsonObject("serials"), XmlRoot("serials")] - public class Serials : DatItem + public sealed class Serials : DatItem { #region Fields diff --git a/SabreTools.DatItems/Formats/SharedFeat.cs b/SabreTools.DatItems/Formats/SharedFeat.cs new file mode 100644 index 00000000..94360dc4 --- /dev/null +++ b/SabreTools.DatItems/Formats/SharedFeat.cs @@ -0,0 +1,30 @@ +using System.Xml.Serialization; +using Newtonsoft.Json; +using SabreTools.Core; + +namespace SabreTools.DatItems.Formats +{ + /// + /// Represents one shared feature object + /// + [JsonObject("sharedfeat"), XmlRoot("sharedfeat")] + public sealed class SharedFeat : DatItem + { + #region Fields + + /// /> + protected override ItemType ItemType => ItemType.SharedFeat; + + /// /> + protected override string? NameKey => Models.Metadata.SharedFeat.NameKey; + + #endregion + + #region Constructors + + public SharedFeat() : base() { } + public SharedFeat(Models.Metadata.SharedFeat item) : base(item) { } + + #endregion + } +} diff --git a/SabreTools.DatItems/Formats/SharedFeature.cs b/SabreTools.DatItems/Formats/SharedFeature.cs deleted file mode 100644 index 4a08ba8b..00000000 --- a/SabreTools.DatItems/Formats/SharedFeature.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Xml.Serialization; -using Newtonsoft.Json; -using SabreTools.Core; - -namespace SabreTools.DatItems.Formats -{ - /// - /// Represents one shared feature object - /// - [JsonObject("sharedfeat"), XmlRoot("sharedfeat")] - public class SharedFeature : DatItem - { - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.SharedFeat.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.SharedFeat.NameKey, name); - - #endregion - - #region Constructors - - /// - /// Create a default, empty SharedFeature object - /// - public SharedFeature() - { - _internal = new Models.Metadata.SharedFeat(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.SharedFeature); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a SharedFeature object from the internal model - /// - public SharedFeature(Models.Metadata.SharedFeat item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.SharedFeature); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - public override object Clone() - { - return new SharedFeature() - { - _internal = this._internal?.Clone() as Models.Metadata.SharedFeat ?? [], - }; - } - - #endregion - } -} diff --git a/SabreTools.DatItems/Formats/Slot.cs b/SabreTools.DatItems/Formats/Slot.cs index 84011997..7819aa9d 100644 --- a/SabreTools.DatItems/Formats/Slot.cs +++ b/SabreTools.DatItems/Formats/Slot.cs @@ -8,10 +8,16 @@ namespace SabreTools.DatItems.Formats /// Represents which Slot(s) is associated with a set /// [JsonObject("slot"), XmlRoot("slot")] - public class Slot : DatItem + public sealed class Slot : DatItem { #region Fields + /// /> + protected override ItemType ItemType => ItemType.Slot; + + /// /> + protected override string? NameKey => Models.Metadata.Slot.NameKey; + [JsonIgnore] public bool SlotOptionsSpecified { @@ -24,53 +30,10 @@ namespace SabreTools.DatItems.Formats #endregion - #region Accessors - - /// - public override string? GetName() => GetFieldValue(Models.Metadata.Slot.NameKey); - - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.Slot.NameKey, name); - - #endregion - #region Constructors - /// - /// Create a default, empty Slot object - /// - public Slot() - { - _internal = new Models.Metadata.Slot(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Slot); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Slot object from the internal model - /// - public Slot(Models.Metadata.Slot item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Slot); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/SlotOption.cs b/SabreTools.DatItems/Formats/SlotOption.cs index 6d477f21..316910c5 100644 --- a/SabreTools.DatItems/Formats/SlotOption.cs +++ b/SabreTools.DatItems/Formats/SlotOption.cs @@ -8,55 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents one ListXML slotoption /// [JsonObject("slotoption"), XmlRoot("slotoption")] - public class SlotOption : DatItem + public sealed class SlotOption : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.SlotOption.NameKey); + /// /> + protected override ItemType ItemType => ItemType.SlotOption; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.SlotOption.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.SlotOption.NameKey; #endregion #region Constructors - /// - /// Create a default, empty SlotOption object - /// - public SlotOption() - { - _internal = new Models.Metadata.SlotOption(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.SlotOption); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a SlotOption object from the internal model - /// - public SlotOption(Models.Metadata.SlotOption item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.SlotOption); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - #endregion - - #region Cloning Methods - - /// - 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 } diff --git a/SabreTools.DatItems/Formats/SoftwareList.cs b/SabreTools.DatItems/Formats/SoftwareList.cs index e702f156..7cf4cfbf 100644 --- a/SabreTools.DatItems/Formats/SoftwareList.cs +++ b/SabreTools.DatItems/Formats/SoftwareList.cs @@ -7,58 +7,23 @@ namespace SabreTools.DatItems.Formats /// /// Represents which SoftwareList(s) is associated with a set /// - /// - /// TODO: Add new fields to documentation - /// [JsonObject("softwarelist"), XmlRoot("softwarelist")] - public class SoftwareList : DatItem + public sealed class SoftwareList : DatItem { - #region Accessors + #region Fields - /// - public override string? GetName() => GetFieldValue(Models.Metadata.SoftwareList.NameKey); + /// /> + protected override ItemType ItemType => ItemType.SoftwareList; - /// - public override void SetName(string? name) => SetFieldValue(Models.Metadata.SoftwareList.NameKey, name); + /// /> + protected override string? NameKey => Models.Metadata.SoftwareList.NameKey; #endregion #region Constructors - /// - /// Create a default, empty SoftwareList object - /// - public SoftwareList() - { - _internal = new Models.Metadata.SoftwareList(); - - SetName(string.Empty); - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.SoftwareList); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a SoftwareList object from the internal model - /// - public SoftwareList(Models.Metadata.SoftwareList item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.SoftwareList); - SetFieldValue(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 } diff --git a/SabreTools.DatItems/Formats/Sound.cs b/SabreTools.DatItems/Formats/Sound.cs index 5d06d395..589bc1dd 100644 --- a/SabreTools.DatItems/Formats/Sound.cs +++ b/SabreTools.DatItems/Formats/Sound.cs @@ -8,44 +8,22 @@ namespace SabreTools.DatItems.Formats /// Represents the sound output for a machine /// [JsonObject("sound"), XmlRoot("sound")] - public class Sound : DatItem + public sealed class Sound : DatItem { - #region Constructors + #region Fields - /// - /// Create a default, empty Sound object - /// - public Sound() - { - _internal = new Models.Metadata.Sound(); + /// /> + protected override ItemType ItemType => ItemType.Sound; - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Sound); - SetFieldValue(DatItem.MachineKey, new Machine()); - } - - /// - /// Create a Sound object from the internal model - /// - public Sound(Models.Metadata.Sound item) - { - _internal = item; - - SetFieldValue(Models.Metadata.DatItem.TypeKey, ItemType.Sound); - SetFieldValue(DatItem.MachineKey, new Machine()); - } + /// /> + protected override string? NameKey => null; #endregion - #region Cloning Methods + #region Constructors - /// - 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 } diff --git a/SabreTools.DatItems/Formats/SourceDetails.cs b/SabreTools.DatItems/Formats/SourceDetails.cs index 08bdea96..feabc857 100644 --- a/SabreTools.DatItems/Formats/SourceDetails.cs +++ b/SabreTools.DatItems/Formats/SourceDetails.cs @@ -9,7 +9,7 @@ namespace SabreTools.DatItems.Formats /// Represents a single source details item /// [JsonObject("source_details"), XmlRoot("source_details")] - public class SourceDetails : DatItem + public sealed class SourceDetails : DatItem { #region Fields diff --git a/SabreTools.Filtering/Splitter.cs b/SabreTools.Filtering/Splitter.cs index e84b762c..81b3887b 100644 --- a/SabreTools.Filtering/Splitter.cs +++ b/SabreTools.Filtering/Splitter.cs @@ -295,8 +295,8 @@ namespace SabreTools.Filtering // Get all device reference names from the current machine List 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); } diff --git a/SabreTools.Test/Core/ConvertersTests.cs b/SabreTools.Test/Core/ConvertersTests.cs index b6746e58..83206535 100644 --- a/SabreTools.Test/Core/ConvertersTests.cs +++ b/SabreTools.Test/Core/ConvertersTests.cs @@ -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")]