diff --git a/SabreTools.Data.Models/Logiqx/Header.cs b/SabreTools.Data.Models/Logiqx/Header.cs index 86619e68..504615e9 100644 --- a/SabreTools.Data.Models/Logiqx/Header.cs +++ b/SabreTools.Data.Models/Logiqx/Header.cs @@ -52,6 +52,9 @@ namespace SabreTools.Data.Models.Logiqx [XmlElement("type")] public string? Type { get; set; } + [XmlElement("romvault")] + public RomVault? RomVault { get; set; } + [XmlElement("clrmamepro")] public ClrMamePro? ClrMamePro { get; set; } diff --git a/SabreTools.Data.Models/Logiqx/RomVault.cs b/SabreTools.Data.Models/Logiqx/RomVault.cs new file mode 100644 index 00000000..3bccee00 --- /dev/null +++ b/SabreTools.Data.Models/Logiqx/RomVault.cs @@ -0,0 +1,25 @@ +using System.Xml; +using System.Xml.Serialization; +using SabreTools.Data.Models.Metadata; + +namespace SabreTools.Data.Models.Logiqx +{ + [XmlRoot("romvault")] + public class RomVault + { + [XmlAttribute("header")] + public string? Header { get; set; } + + /// (none|split|merged|nonmerged|fullmerged|device|full) "split" + [XmlAttribute("forcemerging")] + public MergingFlag ForceMerging { get; set; } + + /// (obsolete|required|ignore) "obsolete" + [XmlAttribute("forcenodump")] + public NodumpFlag ForceNodump { get; set; } + + /// (zip|unzip) "zip" + [XmlAttribute("forcepacking")] + public PackingFlag ForcePacking { get; set; } + } +} diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs index 9f86e1cc..5f31d4da 100644 --- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs @@ -73,6 +73,14 @@ namespace SabreTools.Serialization.CrossModel.Test /// private static Data.Models.Logiqx.Datafile Build(bool game) { + var romvault = new Data.Models.Logiqx.RomVault + { + Header = "XXXXXX", + ForceMerging = Data.Models.Metadata.MergingFlag.Merged, + ForceNodump = Data.Models.Metadata.NodumpFlag.Required, + ForcePacking = Data.Models.Metadata.PackingFlag.Zip, + }; + var clrmamepro = new Data.Models.Logiqx.ClrMamePro { Header = "XXXXXX", @@ -107,6 +115,7 @@ namespace SabreTools.Serialization.CrossModel.Test Url = "XXXXXX", Comment = "XXXXXX", Type = "XXXXXX", + RomVault = romvault, ClrMamePro = clrmamepro, RomCenter = romcenter, }; @@ -303,10 +312,23 @@ namespace SabreTools.Serialization.CrossModel.Test Assert.Equal("XXXXXX", header.Url); Assert.Equal("XXXXXX", header.Comment); Assert.Equal("XXXXXX", header.Type); + Validate(header.RomVault); Validate(header.ClrMamePro); Validate(header.RomCenter); } + /// + /// Validate a RomVault + /// + private static void Validate(Data.Models.Logiqx.RomVault? rv) + { + Assert.NotNull(rv); + Assert.Equal("XXXXXX", rv.Header); + Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, rv.ForceMerging); + Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, rv.ForceNodump); + Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, rv.ForcePacking); + } + /// /// Validate a ClrMamePro /// diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index 2465875e..823efbb8 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -61,6 +61,16 @@ namespace SabreTools.Serialization.CrossModel || item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None || item.ForcePacking is not Data.Models.Metadata.PackingFlag.None) { + header.RomVault = new RomVault(); + if (item.HeaderSkipper is not null) + header.RomVault.Header = item.HeaderSkipper; + if (item.ForceMerging is not Data.Models.Metadata.MergingFlag.None) + header.RomVault.ForceMerging = item.ForceMerging; + if (item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None) + header.RomVault.ForceNodump = item.ForceNodump; + if (item.ForcePacking is not Data.Models.Metadata.PackingFlag.None) + header.RomVault.ForcePacking = item.ForcePacking; + header.ClrMamePro = new Data.Models.Logiqx.ClrMamePro(); if (item.HeaderSkipper is not null) header.ClrMamePro.Header = item.HeaderSkipper; diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs index 90eb74a1..1d073ccd 100644 --- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs @@ -138,6 +138,14 @@ namespace SabreTools.Serialization.Readers.Test /// private static Data.Models.Logiqx.Datafile Build(bool game) { + var romvault = new Data.Models.Logiqx.RomVault + { + Header = "XXXXXX", + ForceMerging = Data.Models.Metadata.MergingFlag.Merged, + ForceNodump = Data.Models.Metadata.NodumpFlag.Required, + ForcePacking = Data.Models.Metadata.PackingFlag.Zip, + }; + var clrmamepro = new Data.Models.Logiqx.ClrMamePro { Header = "XXXXXX", @@ -172,6 +180,7 @@ namespace SabreTools.Serialization.Readers.Test Url = "XXXXXX", Comment = "XXXXXX", Type = "XXXXXX", + RomVault = romvault, ClrMamePro = clrmamepro, RomCenter = romcenter, }; @@ -356,10 +365,23 @@ namespace SabreTools.Serialization.Readers.Test Assert.Equal("XXXXXX", header.Url); Assert.Equal("XXXXXX", header.Comment); Assert.Equal("XXXXXX", header.Type); + Validate(header.RomVault); Validate(header.ClrMamePro); Validate(header.RomCenter); } + /// + /// Validate a RomVault + /// + private static void Validate(Data.Models.Logiqx.RomVault? rv) + { + Assert.NotNull(rv); + Assert.Equal("XXXXXX", rv.Header); + Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, rv.ForceMerging); + Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, rv.ForceNodump); + Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, rv.ForcePacking); + } + /// /// Validate a ClrMamePro /// diff --git a/SabreTools.Serialization.Readers/Logiqx.cs b/SabreTools.Serialization.Readers/Logiqx.cs index 25c6e534..df1d2f3f 100644 --- a/SabreTools.Serialization.Readers/Logiqx.cs +++ b/SabreTools.Serialization.Readers/Logiqx.cs @@ -244,6 +244,13 @@ namespace SabreTools.Serialization.Readers obj.Type = reader.ReadElementContentAsString(); break; + case "romvault": + if (obj.RomVault is not null && Debug) + Console.WriteLine($"'{reader.Name}' element already found, overwriting"); + + obj.RomVault = ParseRomVault(reader); + reader.Skip(); + break; case "clrmamepro": if (obj.ClrMamePro is not null && Debug) Console.WriteLine($"'{reader.Name}' element already found, overwriting"); @@ -289,6 +296,23 @@ namespace SabreTools.Serialization.Readers return obj; } + /// + /// Parse from an XmlTextReader into a RomVault + /// + /// XmlTextReader to read from + /// Filled RomVault on success, null on error + public RomVault ParseRomVault(XmlTextReader reader) + { + var obj = new RomVault(); + + obj.Header = reader.GetAttribute("header"); + obj.ForceMerging = reader.GetAttribute("forcemerging").AsMergingFlag(); + obj.ForceNodump = reader.GetAttribute("forcenodump").AsNodumpFlag(); + obj.ForcePacking = reader.GetAttribute("forcepacking").AsPackingFlag(); + + return obj; + } + #endregion #region Items diff --git a/SabreTools.Serialization.Writers/Logiqx.cs b/SabreTools.Serialization.Writers/Logiqx.cs index 7ecfd167..9ce88276 100644 --- a/SabreTools.Serialization.Writers/Logiqx.cs +++ b/SabreTools.Serialization.Writers/Logiqx.cs @@ -159,6 +159,9 @@ namespace SabreTools.Serialization.Writers writer.WriteOptionalElementString("comment", obj.Comment); writer.WriteOptionalElementString("type", obj.Type); + if (obj.RomVault is not null) + WriteRomVault(obj.RomVault, writer); + if (obj.ClrMamePro is not null) WriteClrMamePro(obj.ClrMamePro, writer); @@ -192,6 +195,26 @@ namespace SabreTools.Serialization.Writers writer.WriteEndElement(); } + /// + /// Write a RomVault to an XmlTextWriter + /// + /// RomVault to write + /// XmlTextReader to write to + private static void WriteRomVault(RomVault obj, XmlTextWriter writer) + { + writer.WriteStartElement("romvault"); + + writer.WriteOptionalAttributeString("header", obj.Header); + if (obj.ForceMerging != Data.Models.Metadata.MergingFlag.None) + writer.WriteOptionalAttributeString("forcemerging", obj.ForceMerging.AsStringValue()); + if (obj.ForceNodump != Data.Models.Metadata.NodumpFlag.None) + writer.WriteOptionalAttributeString("forcenodump", obj.ForceNodump.AsStringValue()); + if (obj.ForcePacking != Data.Models.Metadata.PackingFlag.None) + writer.WriteOptionalAttributeString("forcepacking", obj.ForcePacking.AsStringValue()); + + writer.WriteEndElement(); + } + #endregion #region Items