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