From d70415b989757f1a0ba4088059e7afb3d1a6ce7e Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 7 Sep 2020 14:47:27 -0700 Subject: [PATCH] Add some XML serialization attributes --- SabreTools.Library/DatFiles/DatFile.cs | 4 + SabreTools.Library/DatFiles/DatHeader.cs | 102 +++++++++++++++++++++++ SabreTools.Library/DatItems/Auxiliary.cs | 10 +-- SabreTools.Library/DatItems/DatItem.cs | 44 ++++++++++ SabreTools.Library/DatItems/Machine.cs | 69 +++++++++++++++ SabreTools.Library/DatItems/Rom.cs | 74 ++++++++++++++++ 6 files changed, 295 insertions(+), 8 deletions(-) diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 74de6a46..1384e564 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Net; using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Xml.Serialization; using SabreTools.Library.Data; using SabreTools.Library.DatItems; @@ -24,6 +25,7 @@ namespace SabreTools.Library.DatFiles /// Represents a format-agnostic DAT /// [JsonObject("datfile")] + [XmlRoot("datfile")] public abstract class DatFile { #region Fields @@ -32,12 +34,14 @@ namespace SabreTools.Library.DatFiles /// Header values /// [JsonProperty("header")] + [XmlElement("header")] public DatHeader Header { get; set; } = new DatHeader(); /// /// DatItems and related statistics /// [JsonProperty("items")] + [XmlElement("items")] public ItemDictionary Items { get; set; } = new ItemDictionary(); #endregion diff --git a/SabreTools.Library/DatFiles/DatHeader.cs b/SabreTools.Library/DatFiles/DatHeader.cs index 22663ee8..068ff81a 100644 --- a/SabreTools.Library/DatFiles/DatHeader.cs +++ b/SabreTools.Library/DatFiles/DatHeader.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Xml.Serialization; using SabreTools.Library.DatItems; using SabreTools.Library.IO; @@ -14,6 +15,7 @@ namespace SabreTools.Library.DatFiles /// Represents all possible DAT header information /// [JsonObject("header")] + [XmlRoot("header")] public class DatHeader : ICloneable { #region Fields @@ -24,108 +26,126 @@ namespace SabreTools.Library.DatFiles /// External name of the DAT /// [JsonProperty("filename", DefaultValueHandling = DefaultValueHandling.Include)] + [XmlElement("filename")] public string FileName { get; set; } /// /// Internal name of the DAT /// [JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Include)] + [XmlElement("name")] public string Name { get; set; } /// /// DAT description /// [JsonProperty("description", DefaultValueHandling = DefaultValueHandling.Include)] + [XmlElement("description")] public string Description { get; set; } /// /// Root directory for the files; currently TruRip/EmuARC-exclusive /// [JsonProperty("rootdir", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("rootdir")] public string RootDir { get; set; } /// /// General category of items found in the DAT /// [JsonProperty("category", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("category")] public string Category { get; set; } /// /// Version of the DAT /// [JsonProperty("version", DefaultValueHandling = DefaultValueHandling.Include)] + [XmlElement("version")] public string Version { get; set; } /// /// Creation or modification date /// [JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("date")] public string Date { get; set; } /// /// List of authors who contributed to the DAT /// [JsonProperty("author", DefaultValueHandling = DefaultValueHandling.Include)] + [XmlElement("author")] public string Author { get; set; } /// /// Email address for DAT author(s) /// [JsonProperty("email", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("email")] public string Email { get; set; } /// /// Author or distribution homepage name /// [JsonProperty("homepage", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("homepage")] public string Homepage { get; set; } /// /// Author or distribution URL /// [JsonProperty("url", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("url")] public string Url { get; set; } /// /// Any comment that does not already fit an existing field /// [JsonProperty("comment", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("comment")] public string Comment { get; set; } /// /// Header skipper to be used when loading the DAT /// [JsonProperty("header", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("header")] public string HeaderSkipper { get; set; } /// /// Classification of the DAT. Generally only used for SuperDAT /// [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("type")] public string Type { get; set; } /// /// Force a merging style when loaded /// [JsonProperty("forcemerging", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("forcemerging")] public MergingFlag ForceMerging { get; set; } /// /// Force nodump handling when loaded /// [JsonProperty("forcenodump", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("forcenodump")] public NodumpFlag ForceNodump { get; set; } /// /// Force output packing when loaded /// [JsonProperty("forcepacking", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("forcepacking")] public PackingFlag ForcePacking { get; set; } /// /// Read or write format /// [JsonIgnore] + [XmlIgnore] public DatFormat DatFormat { get; set; } #endregion @@ -137,12 +157,14 @@ namespace SabreTools.Library.DatFiles /// /// Also in Logiqx [JsonProperty("debug", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("debug")] public bool? Debug { get; set; } = null; /// /// MAME configuration name /// [JsonProperty("mameconfig", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("mameconfig")] public string MameConfig { get; set; } #endregion @@ -153,12 +175,14 @@ namespace SabreTools.Library.DatFiles /// Build version /// [JsonProperty("build", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("build")] public string Build { get; set; } /// /// Logiqx/RomCenter plugin, OfflineList System /// [JsonProperty("system", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("system")] public string System { get; set; } /// @@ -166,6 +190,7 @@ namespace SabreTools.Library.DatFiles /// /// (merged|split|unmerged) "split" [JsonProperty("rommode", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("rommode")] public MergingFlag RomMode { get; set; } /// @@ -173,6 +198,7 @@ namespace SabreTools.Library.DatFiles /// /// (merged|split|unmerged) "split" [JsonProperty("biosmode", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("biosmode")] public MergingFlag BiosMode { get; set; } /// @@ -180,24 +206,28 @@ namespace SabreTools.Library.DatFiles /// /// (merged|unmerged) "merged" [JsonProperty("samplemode", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("samplemode")] public MergingFlag SampleMode { get; set; } /// /// RomCenter lock rom mode /// [JsonProperty("lockrommode", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("lockrommode")] public bool? LockRomMode { get; set; } /// /// RomCenter lock bios mode /// [JsonProperty("lockbiosmode", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("lockbiosmode")] public bool? LockBiosMode { get; set; } /// /// RomCenter lock sample mode /// [JsonProperty("locksamplemode", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("locksamplemode")] public bool? LockSampleMode { get; set; } #endregion @@ -208,6 +238,7 @@ namespace SabreTools.Library.DatFiles /// Output the item name /// [JsonIgnore] + [XmlIgnore] public bool UseRomName { get; set; } #endregion @@ -218,24 +249,28 @@ namespace SabreTools.Library.DatFiles /// Screenshots width /// [JsonProperty("screenshotswidth", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("screenshotswidth")] public string ScreenshotsWidth { get; set; } /// /// Screenshots height /// [JsonProperty("screenshotsheight", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("screenshotsheight")] public string ScreenshotsHeight { get; set; } /// /// OfflineList info list /// [JsonProperty("infos", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("infos")] public List Infos { get; set; } /// /// OfflineList can-open extensions /// [JsonProperty("canopen", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("canopen")] public List CanOpen { get; set; } // TODO: Implement the following header values: @@ -250,6 +285,7 @@ namespace SabreTools.Library.DatFiles /// Rom title /// [JsonProperty("romtitle", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("romtitle")] public string RomTitle { get; set; } #endregion @@ -260,6 +296,7 @@ namespace SabreTools.Library.DatFiles /// RomCenter DAT format version /// [JsonProperty("rcversion", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("rcversion")] public string RomCenterVersion { get; set; } #endregion @@ -270,58 +307,123 @@ namespace SabreTools.Library.DatFiles /// Text to prepend to all outputted lines /// [JsonIgnore] + [XmlIgnore] public string Prefix { get; set; } /// /// Text to append to all outputted lines /// [JsonIgnore] + [XmlIgnore] public string Postfix { get; set; } /// /// Add a new extension to all items /// [JsonIgnore] + [XmlIgnore] public string AddExtension { get; set; } /// /// Replace all item extensions /// [JsonIgnore] + [XmlIgnore] public string ReplaceExtension { get; set; } /// /// Remove all item extensions /// [JsonIgnore] + [XmlIgnore] public bool RemoveExtension { get; set; } /// /// Output the machine name /// [JsonIgnore] + [XmlIgnore] public bool GameName { get; set; } /// /// Wrap quotes around the entire line, sans prefix and postfix /// [JsonIgnore] + [XmlIgnore] public bool Quotes { get; set; } #endregion + #region XML Serialization Nullable Specifications + + #region Common + + [JsonIgnore] + public bool ForceMergingSpecified { get { return ForceMerging != MergingFlag.None; } } + + [JsonIgnore] + public bool ForceNodumpSpecified { get { return ForceNodump != NodumpFlag.None; } } + + [JsonIgnore] + public bool ForcePackingSpecified { get { return ForcePacking != PackingFlag.None; } } + + #endregion + + #region ListXML + + [JsonIgnore] + public bool DebugSpecified { get { return Debug != null; } } + + #endregion + + #region Logiqx + + [JsonIgnore] + public bool RomModeSpecified { get { return RomMode != MergingFlag.None; } } + + [JsonIgnore] + public bool BiosModeSpecified { get { return BiosMode != MergingFlag.None; } } + + [JsonIgnore] + public bool SampleModeSpecified { get { return SampleMode != MergingFlag.None; } } + + [JsonIgnore] + public bool LockRomModeSpecified { get { return LockRomMode != null; } } + + [JsonIgnore] + public bool LockBiosModeSpecified { get { return LockBiosMode != null; } } + + [JsonIgnore] + public bool LockSampleModeSpecified { get { return LockSampleMode != null; } } + + #endregion + + #region OfflineList + + [JsonIgnore] + public bool InfosSpecified { get { return Infos != null; } } + + [JsonIgnore] + public bool CanOpenSpecified { get { return CanOpen != null; } } + + #endregion + + #endregion // XML Serialization Nullable Specifications + #region Depot Information /// /// Input depot information /// [JsonIgnore] + [XmlIgnore] public DepotInformation InputDepot { get; set; } /// /// Output depot information /// [JsonIgnore] + [XmlIgnore] public DepotInformation OutputDepot { get; set; } #endregion diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index ec61a292..99397f35 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -1,13 +1,6 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; +using System.Xml.Serialization; -using SabreTools.Library.DatItems; -using SabreTools.Library.Filtering; -using SabreTools.Library.Tools; using Newtonsoft.Json; -using Newtonsoft.Json.Converters; /// /// This holds all of the auxiliary types needed for proper parsing @@ -22,6 +15,7 @@ namespace SabreTools.Library.DatItems /// Represents the OpenMSX original value /// [JsonObject("original")] + [XmlRoot("original")] public class Original { [JsonProperty("value")] diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 4e8a8c73..0d8438bd 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Xml.Serialization; using SabreTools.Library.Data; using SabreTools.Library.FileTypes; @@ -17,6 +18,44 @@ namespace SabreTools.Library.DatItems /// Base class for all items included in a set /// [JsonObject("datitem")] + [XmlRoot("datitem")] + [XmlInclude(typeof(Adjuster))] + [XmlInclude(typeof(Analog))] + [XmlInclude(typeof(Archive))] + [XmlInclude(typeof(BiosSet))] + [XmlInclude(typeof(Blank))] + [XmlInclude(typeof(Chip))] + [XmlInclude(typeof(Condition))] + [XmlInclude(typeof(Configuration))] + [XmlInclude(typeof(Control))] + [XmlInclude(typeof(DataArea))] + [XmlInclude(typeof(Device))] + [XmlInclude(typeof(DeviceReference))] + [XmlInclude(typeof(DipSwitch))] + [XmlInclude(typeof(Disk))] + [XmlInclude(typeof(DiskArea))] + [XmlInclude(typeof(Display))] + [XmlInclude(typeof(Driver))] + [XmlInclude(typeof(Extension))] + [XmlInclude(typeof(Feature))] + [XmlInclude(typeof(Info))] + [XmlInclude(typeof(Input))] + [XmlInclude(typeof(Instance))] + [XmlInclude(typeof(Location))] + [XmlInclude(typeof(Media))] + [XmlInclude(typeof(Part))] + [XmlInclude(typeof(PartFeature))] + [XmlInclude(typeof(Port))] + [XmlInclude(typeof(RamOption))] + [XmlInclude(typeof(Release))] + [XmlInclude(typeof(Rom))] + [XmlInclude(typeof(Sample))] + [XmlInclude(typeof(Setting))] + [XmlInclude(typeof(SharedFeature))] + [XmlInclude(typeof(Slot))] + [XmlInclude(typeof(SlotOption))] + [XmlInclude(typeof(SoftwareList))] + [XmlInclude(typeof(Sound))] public abstract class DatItem : IEquatable, IComparable, ICloneable { #region Fields @@ -28,12 +67,14 @@ namespace SabreTools.Library.DatItems /// [JsonProperty("type")] [JsonConverter(typeof(StringEnumConverter))] + [XmlAttribute("type")] public ItemType ItemType { get; set; } /// /// Duplicate type when compared to another item /// [JsonIgnore] + [XmlIgnore] public DupeType DupeType { get; set; } #endregion @@ -44,6 +85,7 @@ namespace SabreTools.Library.DatItems /// Machine values /// [JsonIgnore] + [XmlIgnore] public Machine Machine { get; set; } = new Machine(); #endregion @@ -54,12 +96,14 @@ namespace SabreTools.Library.DatItems /// Source information /// [JsonIgnore] + [XmlIgnore] public Source Source { get; set; } = new Source(); /// /// Flag if item should be removed /// [JsonIgnore] + [XmlIgnore] public bool Remove { get; set; } #endregion diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs index 23944f6a..9bc0da70 100644 --- a/SabreTools.Library/DatItems/Machine.cs +++ b/SabreTools.Library/DatItems/Machine.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Xml.Serialization; using SabreTools.Library.Filtering; using SabreTools.Library.Tools; @@ -13,6 +14,7 @@ namespace SabreTools.Library.DatItems /// Represents the information specific to a set/game/machine /// [JsonObject("machine")] + [XmlRoot("machine")] public class Machine : ICloneable { #region Fields @@ -23,6 +25,7 @@ namespace SabreTools.Library.DatItems /// Name of the machine /// [JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Include)] + [XmlAttribute("name")] public string Name { get; set; } = null; /// @@ -30,54 +33,63 @@ namespace SabreTools.Library.DatItems /// /// Known as "Extra" in AttractMode [JsonProperty("comment", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("comment")] public string Comment { get; set; } = null; /// /// Extended description /// [JsonProperty("description", DefaultValueHandling = DefaultValueHandling.Include)] + [XmlElement("description")] public string Description { get; set; } = null; /// /// Year(s) of release/manufacture /// [JsonProperty("year", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("year")] public string Year { get; set; } = null; /// /// Manufacturer, if available /// [JsonProperty("manufacturer", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("manufacturer")] public string Manufacturer { get; set; } = null; /// /// Publisher, if available /// [JsonProperty("publisher", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("publisher")] public string Publisher { get; set; } = null; /// /// Category, if available /// [JsonProperty("category", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("category")] public string Category { get; set; } = null; /// /// fomof parent /// [JsonProperty("romof", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlAttribute("romof")] public string RomOf { get; set; } = null; /// /// cloneof parent /// [JsonProperty("cloneof", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlAttribute("cloneof")] public string CloneOf { get; set; } = null; /// /// sampleof parent /// [JsonProperty("sampleof", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlAttribute("sampleof")] public string SampleOf { get; set; } = null; /// @@ -85,6 +97,7 @@ namespace SabreTools.Library.DatItems /// [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)] [JsonConverter(typeof(StringEnumConverter))] + [XmlAttribute("type")] public MachineType MachineType { get; set; } = 0x0; #endregion @@ -96,42 +109,49 @@ namespace SabreTools.Library.DatItems /// /// Also in Logiqx EmuArc [JsonProperty("players", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("players")] public string Players { get; set; } = null; /// /// Screen rotation /// [JsonProperty("rotation", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("rotation")] public string Rotation { get; set; } = null; /// /// Control method /// [JsonProperty("control", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("control")] public string Control { get; set; } = null; /// /// Support status /// [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("status")] public string Status { get; set; } = null; /// /// Display count /// [JsonProperty("displaycount", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("displaycount")] public string DisplayCount { get; set; } = null; /// /// Display type /// [JsonProperty("displaytype", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("displaytype")] public string DisplayType { get; set; } = null; /// /// Number of input buttons /// [JsonProperty("buttons", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("buttons")] public string Buttons { get; set; } = null; #endregion @@ -143,6 +163,7 @@ namespace SabreTools.Library.DatItems /// /// Also in Logiqx [JsonProperty("sourcefile", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlAttribute("sourcefile")] public string SourceFile { get; set; } = null; /// @@ -150,6 +171,7 @@ namespace SabreTools.Library.DatItems /// /// Also in Logiqx [JsonProperty("runnable", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlAttribute("runnable")] public Runnable Runnable { get; set; } = Runnable.NULL; #endregion @@ -160,12 +182,14 @@ namespace SabreTools.Library.DatItems /// Machine board name /// [JsonProperty("board", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlAttribute("board")] public string Board { get; set; } = null; /// /// Rebuild location if different than machine name /// [JsonProperty("rebuildto", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlAttribute("rebuildto")] public string RebuildTo { get; set; } = null; #endregion @@ -177,54 +201,63 @@ namespace SabreTools.Library.DatItems /// Title ID /// [JsonProperty("titleid", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("titleid")] public string TitleID { get; set; } = null; /// /// Machine developer /// [JsonProperty("developer", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("developer")] public string Developer { get; set; } = null; /// /// Game genre /// [JsonProperty("genre", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("genre")] public string Genre { get; set; } = null; /// /// Game subgenre /// [JsonProperty("subgenre", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("subgenre")] public string Subgenre { get; set; } = null; /// /// Game ratings /// [JsonProperty("ratings", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("ratings")] public string Ratings { get; set; } = null; /// /// Game score /// [JsonProperty("score", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("score")] public string Score { get; set; } = null; /// /// Is the machine enabled /// [JsonProperty("enabled", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("enabled")] public string Enabled { get; set; } = null; // bool? /// /// Does the game have a CRC check /// [JsonProperty("hascrc", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("hascrc")] public bool? Crc { get; set; } = null; /// /// Machine relations /// [JsonProperty("relatedto", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("relatedto")] public string RelatedTo { get; set; } = null; #endregion @@ -235,18 +268,21 @@ namespace SabreTools.Library.DatItems /// Generation MSX ID /// [JsonProperty("genmsxid", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("genmsxid")] public string GenMSXID { get; set; } = null; /// /// MSX System /// [JsonProperty("system", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("system")] public string System { get; set; } = null; /// /// Machine country of origin /// [JsonProperty("country", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("country")] public string Country { get; set; } = null; #endregion @@ -257,10 +293,43 @@ namespace SabreTools.Library.DatItems /// Support status /// [JsonProperty("supported", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("supported")] public Supported Supported { get; set; } = Supported.NULL; #endregion + #region XML Serialization Nullable Specifications + + #region Common + + [JsonIgnore] + public bool MachineTypeSpecified { get { return MachineType != 0x0 && MachineType != MachineType.NULL; } } + + #endregion + + #region ListXML + + [JsonIgnore] + public bool RunnableSpecified { get { return Runnable != Runnable.NULL; } } + + #endregion + + #region Logiqx EmuArc Fields + + [JsonIgnore] + public bool CrcSpecified { get { return Crc != null; } } + + #endregion + + #region SoftwareList + + [JsonIgnore] + public bool SupportedSpecified { get { return Supported != Supported.NULL; } } + + #endregion + + #endregion // XML Serialization Nullable Specifications + #endregion #region Accessors diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index eed2f3a4..af6645dc 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using System.Xml.Serialization; using SabreTools.Library.Data; using SabreTools.Library.FileTypes; @@ -17,6 +18,7 @@ namespace SabreTools.Library.DatItems /// Represents a generic file within a set /// [JsonObject("rom")] + [XmlRoot("rom")] public class Rom : DatItem { #region Private instance variables @@ -42,24 +44,28 @@ namespace SabreTools.Library.DatItems /// Name of the item /// [JsonProperty("name")] + [XmlAttribute("name")] public string Name { get; set; } /// /// What BIOS is required for this rom /// [JsonProperty("bios", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("bios")] public string Bios { get; set; } /// /// Byte size of the rom /// [JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("size")] public long? Size { get; set; } /// /// File CRC32 hash /// [JsonProperty("crc", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("crc")] public string CRC { get { return _crc.IsNullOrEmpty() ? null : Utilities.ByteArrayToString(_crc); } @@ -70,6 +76,7 @@ namespace SabreTools.Library.DatItems /// File MD5 hash /// [JsonProperty("md5", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("md5")] public string MD5 { get { return _md5.IsNullOrEmpty() ? null : Utilities.ByteArrayToString(_md5); } @@ -81,6 +88,7 @@ namespace SabreTools.Library.DatItems /// File RIPEMD160 hash /// [JsonProperty("ripemd160", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("ripemd160")] public string RIPEMD160 { get { return _ripemd160.IsNullOrEmpty() ? null : Utilities.ByteArrayToString(_ripemd160); } @@ -92,6 +100,7 @@ namespace SabreTools.Library.DatItems /// File SHA-1 hash /// [JsonProperty("sha1", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("sha1")] public string SHA1 { get { return _sha1.IsNullOrEmpty() ? null : Utilities.ByteArrayToString(_sha1); } @@ -102,6 +111,7 @@ namespace SabreTools.Library.DatItems /// File SHA-256 hash /// [JsonProperty("sha256", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("sha256")] public string SHA256 { get { return _sha256.IsNullOrEmpty() ? null : Utilities.ByteArrayToString(_sha256); } @@ -112,6 +122,7 @@ namespace SabreTools.Library.DatItems /// File SHA-384 hash /// [JsonProperty("sha384", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("sha384")] public string SHA384 { get { return _sha384.IsNullOrEmpty() ? null : Utilities.ByteArrayToString(_sha384); } @@ -122,6 +133,7 @@ namespace SabreTools.Library.DatItems /// File SHA-512 hash /// [JsonProperty("sha512", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("sha512")] public string SHA512 { get { return _sha512.IsNullOrEmpty() ? null : Utilities.ByteArrayToString(_sha512); } @@ -132,6 +144,7 @@ namespace SabreTools.Library.DatItems /// File SpamSum fuzzy hash /// [JsonProperty("spamsum", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("spamsum")] public string SpamSum { get { return _spamsum.IsNullOrEmpty() ? null : Encoding.UTF8.GetString(_spamsum); } @@ -142,24 +155,28 @@ namespace SabreTools.Library.DatItems /// Rom name to merge from parent /// [JsonProperty("merge", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("merge")] public string MergeTag { get; set; } /// /// Rom region /// [JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("biregionos")] public string Region { get; set; } /// /// Data offset within rom /// [JsonProperty("offset", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("offset")] public string Offset { get; set; } /// /// File created date /// [JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("date")] public string Date { get; set; } /// @@ -167,18 +184,21 @@ namespace SabreTools.Library.DatItems /// [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore)] [JsonConverter(typeof(StringEnumConverter))] + [XmlElement("status")] public ItemStatus ItemStatus { get; set; } /// /// Determine if the rom is optional in the set /// [JsonProperty("optional", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("optional")] public bool? Optional { get; set; } /// /// Determine if the CRC32 hash is inverted /// [JsonProperty("inverted", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("inverted")] public bool? Inverted { get; set; } #endregion @@ -189,12 +209,14 @@ namespace SabreTools.Library.DatItems /// Alternate name for the item /// [JsonProperty("alt_romname", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("alt_romname")] public string AltName { get; set; } /// /// Alternate title for the item /// [JsonProperty("alt_title", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("alt_title")] public string AltTitle { get; set; } #endregion @@ -205,12 +227,14 @@ namespace SabreTools.Library.DatItems /// OpenMSX sub item type /// [JsonProperty("original", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("original")] public Original Original { get; set; } /// /// OpenMSX sub item type /// [JsonProperty("openmsx_subtype", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("openmsx_subtype")] [JsonConverter(typeof(StringEnumConverter))] public OpenMSXSubType OpenMSXSubType { get; set; } @@ -219,18 +243,21 @@ namespace SabreTools.Library.DatItems /// /// Not related to the subtype above [JsonProperty("openmsx_type", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("openmsx_type")] public string OpenMSXType { get; set; } /// /// Item remark (like a comment) /// [JsonProperty("remark", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("remark")] public string Remark { get; set; } /// /// Boot state /// [JsonProperty("boot", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("boot")] public string Boot { get; set; } #endregion @@ -241,12 +268,14 @@ namespace SabreTools.Library.DatItems /// Data area information /// [JsonProperty("dataarea", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("dataarea")] public DataArea DataArea { get; set; } /// /// Loading flag /// [JsonProperty("loadflag", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("loadflag")] [JsonConverter(typeof(StringEnumConverter))] public LoadFlag LoadFlag { get; set; } @@ -254,16 +283,61 @@ namespace SabreTools.Library.DatItems /// Original hardware part associated with the item /// [JsonProperty("part", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("part")] public Part Part { get; set; } /// /// SoftwareList value associated with the item /// [JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("value")] public string Value { get; set; } #endregion + #region XML Serialization Nullable Specifications + + #region Common + + [JsonIgnore] + public bool SizeSpecified { get { return Size != null; } } + + [JsonIgnore] + public bool ItemStatusSpecified { get { return ItemStatus != ItemStatus.NULL && ItemStatus != ItemStatus.None; } } + + [JsonIgnore] + public bool OptionalSpecified { get { return Optional != null; } } + + [JsonIgnore] + public bool InvertedSpecified { get { return Inverted != null; } } + + #endregion + + #region OpenMSX + + [JsonIgnore] + public bool OriginalSpecified { get { return Original != null && Original != default; } } + + [JsonIgnore] + public bool OpenMSXSubTypeSpecified { get { return OpenMSXSubType != OpenMSXSubType.NULL; } } + + #endregion + + #region SoftwareList + + [JsonIgnore] + public bool DataAreaSpecified { get { return DataArea != null && DataArea != default; } } + + [JsonIgnore] + public bool LoadFlagSpecified { get { return LoadFlag != LoadFlag.NULL; } } + + [JsonIgnore] + public bool PartSpecified { get { return Part != null && Part != default; } } + + #endregion + + #endregion // XML Serialization Nullable Specifications + #endregion // Fields #region Accessors