diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index ad5099af..a53e000e 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -10,6 +10,7 @@ using SabreTools.Library.DatItems; using SabreTools.Library.IO; using SabreTools.Library.Tools; +// TODO: Use softwarelist.dtd and *try* to make this write more correctly namespace SabreTools.Library.DatFiles { /// @@ -251,7 +252,7 @@ namespace SabreTools.Library.DatFiles areaEndinaness; long? areasize = null; SoftwareListPart part = null; - List features = null; + List features = null; List items = new List(); while (!reader.EOF) @@ -283,13 +284,13 @@ namespace SabreTools.Library.DatFiles break; case "feature": - var feature = new SoftwareListFeature(); + var feature = new PartFeature(); feature.Name = reader.GetAttribute("name"); feature.Value = reader.GetAttribute("value"); // Ensure the list exists if (features == null) - features = new List(); + features = new List(); features.Add(feature); @@ -661,9 +662,6 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("softwarelist"); xtw.WriteRequiredAttributeString("name", Header.Name); xtw.WriteRequiredAttributeString("description", Header.Description); - xtw.WriteOptionalAttributeString("forcepacking", Header.ForcePacking.FromPackingFlag(false)); - xtw.WriteOptionalAttributeString("forcemerging", Header.ForceMerging.FromMergingFlag(false)); - xtw.WriteOptionalAttributeString("forcenodump", Header.ForceNodump.FromNodumpFlag()); xtw.Flush(); } @@ -692,16 +690,13 @@ namespace SabreTools.Library.DatFiles // Build the state xtw.WriteStartElement("software"); xtw.WriteRequiredAttributeString("name", datItem.Machine.Name); - if (!string.Equals(datItem.Machine.Name, datItem.Machine.CloneOf, StringComparison.OrdinalIgnoreCase)) xtw.WriteOptionalAttributeString("cloneof", datItem.Machine.CloneOf); - xtw.WriteOptionalAttributeString("supported", datItem.Machine.Supported.FromSupported(false)); xtw.WriteOptionalElementString("description", datItem.Machine.Description); xtw.WriteOptionalElementString("year", datItem.Machine.Year); xtw.WriteOptionalElementString("publisher", datItem.Machine.Publisher); - xtw.WriteOptionalElementString("category", datItem.Machine.Category); xtw.Flush(); } @@ -751,21 +746,6 @@ namespace SabreTools.Library.DatFiles ProcessItemName(datItem, true); // Build the state - xtw.WriteStartElement("part"); - xtw.WriteRequiredAttributeString("name", datItem.Part?.Name); - xtw.WriteRequiredAttributeString("interface", datItem.Part?.Interface); - - if (datItem.Features != null && datItem.Features.Count > 0) - { - foreach (SoftwareListFeature kvp in datItem.Features) - { - xtw.WriteStartElement("feature"); - xtw.WriteRequiredAttributeString("name", kvp.Name); - xtw.WriteRequiredAttributeString("value", kvp.Value); - xtw.WriteEndElement(); - } - } - string areaName = datItem.AreaName; switch (datItem.ItemType) { @@ -794,6 +774,21 @@ namespace SabreTools.Library.DatFiles if (string.IsNullOrWhiteSpace(areaName)) areaName = "cdrom"; + xtw.WriteStartElement("part"); + xtw.WriteRequiredAttributeString("name", datItem.Part?.Name); + xtw.WriteRequiredAttributeString("interface", datItem.Part?.Interface); + + if (datItem.Features != null && datItem.Features.Count > 0) + { + foreach (PartFeature partFeature in datItem.Features) + { + xtw.WriteStartElement("feature"); + xtw.WriteRequiredAttributeString("name", partFeature.Name); + xtw.WriteRequiredAttributeString("value", partFeature.Value); + xtw.WriteEndElement(); + } + } + xtw.WriteStartElement("diskarea"); xtw.WriteRequiredAttributeString("name", areaName); xtw.WriteOptionalAttributeString("size", disk.AreaSize.ToString()); @@ -808,6 +803,9 @@ namespace SabreTools.Library.DatFiles // End diskarea xtw.WriteEndElement(); + + // End part + xtw.WriteEndElement(); break; case ItemType.Info: @@ -823,6 +821,21 @@ namespace SabreTools.Library.DatFiles if (string.IsNullOrWhiteSpace(areaName)) areaName = "rom"; + xtw.WriteStartElement("part"); + xtw.WriteRequiredAttributeString("name", datItem.Part?.Name); + xtw.WriteRequiredAttributeString("interface", datItem.Part?.Interface); + + if (datItem.Features != null && datItem.Features.Count > 0) + { + foreach (PartFeature kvp in datItem.Features) + { + xtw.WriteStartElement("feature"); + xtw.WriteRequiredAttributeString("name", kvp.Name); + xtw.WriteRequiredAttributeString("value", kvp.Value); + xtw.WriteEndElement(); + } + } + xtw.WriteStartElement("dataarea"); xtw.WriteRequiredAttributeString("name", areaName); xtw.WriteOptionalAttributeString("size", rom.AreaSize.ToString()); @@ -849,6 +862,9 @@ namespace SabreTools.Library.DatFiles // End dataarea xtw.WriteEndElement(); + + // End part + xtw.WriteEndElement(); break; case ItemType.SharedFeature: @@ -860,9 +876,6 @@ namespace SabreTools.Library.DatFiles break; } - // End part - xtw.WriteEndElement(); - xtw.Flush(); } catch (Exception ex) diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index 445b6d49..2dd7586b 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -37,8 +37,9 @@ namespace SabreTools.Library.DatItems /// /// Represents one SoftwareList feature object /// - [JsonObject("feature")] - public class SoftwareListFeature + /// TODO: Promote this to DatItem + [JsonObject("part_feature")] + public class PartFeature { [JsonProperty("name")] public string Name { get; set; } diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 409b77fd..d0ba7b53 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -114,7 +114,7 @@ namespace SabreTools.Library.DatItems /// Features provided to/by the item /// [JsonProperty("features", DefaultValueHandling = DefaultValueHandling.Ignore)] - public List Features { get; set; } + public List Features { get; set; } /// /// Original hardware part name within an item