Fix longstanding TODOs around Software items

This commit is contained in:
Matt Nadareski
2026-04-03 16:02:44 -04:00
parent fb711001e9
commit e3927ca3e6
26 changed files with 307 additions and 49 deletions

View File

@@ -51,6 +51,7 @@ namespace SabreTools.Metadata.DatItems
[XmlInclude(typeof(SharedFeat))]
[XmlInclude(typeof(Slot))]
[XmlInclude(typeof(SlotOption))]
[XmlInclude(typeof(Software))]
[XmlInclude(typeof(SoftwareList))]
[XmlInclude(typeof(Sound))]
[XmlInclude(typeof(SourceDetails))]

View File

@@ -1,11 +1,12 @@
using System.Xml.Serialization;
using System;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
namespace SabreTools.Metadata.DatItems.Formats
{
/// <summary>
/// SoftwareList part information
/// PartList part information
/// </summary>
/// <remarks>One Part can contain multiple PartFeature, DataArea, DiskArea, and DipSwitch items</remarks>
[JsonObject("part"), XmlRoot("part")]
@@ -60,6 +61,42 @@ namespace SabreTools.Metadata.DatItems.Formats
/// <inheritdoc/>
public override object Clone() => new Part(_internal.DeepClone() as Data.Models.Metadata.Part ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Part GetInternalClone()
{
var partItem = base.GetInternalClone();
var dataAreas = Read<DataArea[]?>(Data.Models.Metadata.Part.DataAreaKey);
if (dataAreas is not null)
{
Data.Models.Metadata.DataArea[] dataAreaItems = Array.ConvertAll(dataAreas, dataArea => dataArea.GetInternalClone());
partItem[Data.Models.Metadata.Part.DataAreaKey] = dataAreaItems;
}
var diskAreas = Read<DiskArea[]?>(Data.Models.Metadata.Part.DiskAreaKey);
if (diskAreas is not null)
{
Data.Models.Metadata.DiskArea[] diskAreaItems = Array.ConvertAll(diskAreas, diskArea => diskArea.GetInternalClone());
partItem[Data.Models.Metadata.Part.DiskAreaKey] = diskAreaItems;
}
var dipSwitches = Read<DipSwitch[]?>(Data.Models.Metadata.Part.DipSwitchKey);
if (dipSwitches is not null)
{
Data.Models.Metadata.DipSwitch[] dipSwitchItems = Array.ConvertAll(dipSwitches, dipSwitch => dipSwitch.GetInternalClone());
partItem[Data.Models.Metadata.Part.DipSwitchKey] = dipSwitchItems;
}
var features = Read<Feature[]?>(Data.Models.Metadata.Part.FeatureKey);
if (features is not null)
{
Data.Models.Metadata.Feature[] featureItems = Array.ConvertAll(features, feature => feature.GetInternalClone());
partItem[Data.Models.Metadata.Part.FeatureKey] = featureItems;
}
return partItem;
}
#endregion
}
}

View File

@@ -0,0 +1,115 @@
using System;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
namespace SabreTools.Metadata.DatItems.Formats
{
/// <summary>
/// Represents one ListXML software
/// </summary>
[JsonObject("software"), XmlRoot("software")]
public sealed class Software : DatItem<Data.Models.Metadata.Software>
{
#region Properties
public string? Description
{
get => (_internal as Data.Models.Metadata.Software)?.Description;
set => (_internal as Data.Models.Metadata.Software)?.Description = value;
}
/// <inheritdoc>/>
public override Data.Models.Metadata.ItemType ItemType
=> Data.Models.Metadata.ItemType.Software;
public string? Name
{
get => (_internal as Data.Models.Metadata.Software)?.Name;
set => (_internal as Data.Models.Metadata.Software)?.Name = value;
}
public Data.Models.Metadata.Supported? Supported
{
get => (_internal as Data.Models.Metadata.Software)?.Supported;
set => (_internal as Data.Models.Metadata.Software)?.Supported = value;
}
#endregion
#region Constructors
public Software() : base() { }
public Software(Data.Models.Metadata.Software item) : base(item)
{
// Handle subitems
var infos = item.ReadArray<Data.Models.Metadata.Info>(Data.Models.Metadata.Software.InfoKey);
if (infos is not null)
{
Info[] infoItems = Array.ConvertAll(infos, info => new Info(info));
Write<Info[]?>(Data.Models.Metadata.Software.InfoKey, infoItems);
}
var parts = item.ReadArray<Data.Models.Metadata.Part>(Data.Models.Metadata.Software.PartKey);
if (parts is not null)
{
Part[] partItems = Array.ConvertAll(parts, part => new Part(part));
Write<Part[]?>(Data.Models.Metadata.Software.PartKey, partItems);
}
var sharedFeats = item.ReadArray<Data.Models.Metadata.SharedFeat>(Data.Models.Metadata.Software.SharedFeatKey);
if (sharedFeats is not null)
{
SharedFeat[] sharedFeatItems = Array.ConvertAll(sharedFeats, sharedFeat => new SharedFeat(sharedFeat));
Write<SharedFeat[]?>(Data.Models.Metadata.Software.SharedFeatKey, sharedFeatItems);
}
}
public Software(Data.Models.Metadata.Software item, Machine machine, Source source) : this(item)
{
Source = source;
CopyMachineInformation(machine);
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
/// <inheritdoc/>
public override object Clone() => new Software(_internal.DeepClone() as Data.Models.Metadata.Software ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Software GetInternalClone()
{
var softwareItem = base.GetInternalClone();
var infos = Read<Info[]?>(Data.Models.Metadata.Software.InfoKey);
if (infos is not null)
{
Data.Models.Metadata.Info[] infoItems = Array.ConvertAll(infos, info => info.GetInternalClone());
softwareItem[Data.Models.Metadata.Software.InfoKey] = infoItems;
}
var parts = Read<Part[]?>(Data.Models.Metadata.Software.PartKey);
if (parts is not null)
{
Data.Models.Metadata.Part[] partItems = Array.ConvertAll(parts, part => part.GetInternalClone());
softwareItem[Data.Models.Metadata.Software.PartKey] = partItems;
}
var sharedFeats = Read<SharedFeat[]?>(Data.Models.Metadata.Software.SharedFeatKey);
if (sharedFeats is not null)
{
Data.Models.Metadata.SharedFeat[] sharedFeatItems = Array.ConvertAll(sharedFeats, sharedFeat => sharedFeat.GetInternalClone());
softwareItem[Data.Models.Metadata.Software.SharedFeatKey] = sharedFeatItems;
}
return softwareItem;
}
#endregion
}
}

View File

@@ -1,4 +1,5 @@
using System.Xml.Serialization;
using System;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
@@ -18,6 +19,12 @@ namespace SabreTools.Metadata.DatItems.Formats
set => (_internal as Data.Models.Metadata.SoftwareList)?.Description = value;
}
public string? Filter
{
get => (_internal as Data.Models.Metadata.SoftwareList)?.Filter;
set => (_internal as Data.Models.Metadata.SoftwareList)?.Filter = value;
}
/// <inheritdoc>/>
public override Data.Models.Metadata.ItemType ItemType
=> Data.Models.Metadata.ItemType.SoftwareList;
@@ -28,6 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
set => (_internal as Data.Models.Metadata.SoftwareList)?.Name = value;
}
public string? Notes
{
get => (_internal as Data.Models.Metadata.SoftwareList)?.Notes;
set => (_internal as Data.Models.Metadata.SoftwareList)?.Notes = value;
}
public Data.Models.Metadata.SoftwareListStatus? Status
{
get => (_internal as Data.Models.Metadata.SoftwareList)?.Status;
@@ -49,7 +62,12 @@ namespace SabreTools.Metadata.DatItems.Formats
public SoftwareList(Data.Models.Metadata.SoftwareList item) : base(item)
{
// Handle subitems
// TODO: Handle the Software subitem
var softwares = item.ReadArray<Data.Models.Metadata.Software>(Data.Models.Metadata.SoftwareList.SoftwareKey);
if (softwares is not null)
{
Software[] softwareItems = Array.ConvertAll(softwares, software => new Software(software));
Write<Software[]?>(Data.Models.Metadata.SoftwareList.SoftwareKey, softwareItems);
}
}
public SoftwareList(Data.Models.Metadata.SoftwareList item, Machine machine, Source source) : this(item)
@@ -65,6 +83,21 @@ namespace SabreTools.Metadata.DatItems.Formats
/// <inheritdoc/>
public override object Clone() => new SoftwareList(_internal.DeepClone() as Data.Models.Metadata.SoftwareList ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.SoftwareList GetInternalClone()
{
var softwareListItem = base.GetInternalClone();
var softwares = Read<Software[]?>(Data.Models.Metadata.SoftwareList.SoftwareKey);
if (softwares is not null)
{
Data.Models.Metadata.Software[] softwareItems = Array.ConvertAll(softwares, software => software.GetInternalClone());
softwareListItem[Data.Models.Metadata.SoftwareList.SoftwareKey] = softwareItems;
}
return softwareListItem;
}
#endregion
}
}