mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Add Logiqx deserialization test, fix issues
This commit is contained in:
@@ -4,7 +4,7 @@ using System.Xml.Serialization;
|
|||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("archive")]
|
[XmlRoot("archive")]
|
||||||
public class Archive
|
public class Archive : ItemBase
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System.Xml.Serialization;
|
|||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("biosset")]
|
[XmlRoot("biosset")]
|
||||||
public class BiosSet
|
public class BiosSet : ItemBase
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|||||||
@@ -20,5 +20,17 @@ namespace SabreTools.Models.Logiqx
|
|||||||
/// <remarks>(zip|unzip) "zip"</remarks>
|
/// <remarks>(zip|unzip) "zip"</remarks>
|
||||||
[XmlAttribute("forcepacking")]
|
[XmlAttribute("forcepacking")]
|
||||||
public string? ForcePacking { get; set; }
|
public string? ForcePacking { get; set; }
|
||||||
|
|
||||||
|
#region DO NOT USE IN PRODUCTION
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,18 +16,35 @@ namespace SabreTools.Models.Logiqx
|
|||||||
[XmlElement("header")]
|
[XmlElement("header")]
|
||||||
public Header? Header { get; set; }
|
public Header? Header { get; set; }
|
||||||
|
|
||||||
[XmlElement("game")]
|
[XmlElement("game", typeof(Game))]
|
||||||
public Game[]? Game { get; set; }
|
[XmlElement("machine", typeof(Machine))]
|
||||||
|
public GameBase[]? Game { get; set; }
|
||||||
|
|
||||||
[XmlElement("machine")]
|
#region No-Intro Extensions
|
||||||
public Machine[]? Machine { get; set; }
|
|
||||||
|
/// <remarks>Appears after Debug</remarks>
|
||||||
|
[XmlAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance", AttributeName = "schemaLocation")]
|
||||||
|
public string? SchemaLocation { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region RomVault Extensions
|
#region RomVault Extensions
|
||||||
|
|
||||||
/// <remarks>Boolean; Appears after Header</remarks>
|
[XmlElement("dir")]
|
||||||
[XmlAttribute("dir")]
|
|
||||||
public Dir[]? Dir { get; set; }
|
public Dir[]? Dir { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region DO NOT USE IN PRODUCTION
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
12
SabreTools.Models/Logiqx/DeviceRef.cs
Normal file
12
SabreTools.Models/Logiqx/DeviceRef.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace SabreTools.Models.Logiqx
|
||||||
|
{
|
||||||
|
[XmlRoot("device_ref")]
|
||||||
|
public class DeviceRef : ItemBase
|
||||||
|
{
|
||||||
|
[XmlAttribute("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,10 +9,20 @@ namespace SabreTools.Models.Logiqx
|
|||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
[XmlAttribute("machine")]
|
[XmlElement("game", typeof(Game))]
|
||||||
public Game[]? Game { get; set; }
|
[XmlElement("machine", typeof(Machine))]
|
||||||
|
public GameBase[]? Game { get; set; }
|
||||||
|
|
||||||
[XmlAttribute("machine")]
|
#region DO NOT USE IN PRODUCTION
|
||||||
public Machine[]? Machine { get; set; }
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ using System.Xml.Serialization;
|
|||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("disk")]
|
[XmlRoot("disk")]
|
||||||
public class Disk
|
public class Disk : ItemBase
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
@@ -21,5 +21,13 @@ namespace SabreTools.Models.Logiqx
|
|||||||
/// <remarks>(baddump|nodump|good|verified) "good"</remarks>
|
/// <remarks>(baddump|nodump|good|verified) "good"</remarks>
|
||||||
[XmlAttribute("status")]
|
[XmlAttribute("status")]
|
||||||
public string? Status { get; set; }
|
public string? Status { get; set; }
|
||||||
|
|
||||||
|
#region MAME Extensions
|
||||||
|
|
||||||
|
/// <remarks>Appears after Status</remarks>
|
||||||
|
[XmlAttribute("region")]
|
||||||
|
public string? Region { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
41
SabreTools.Models/Logiqx/Driver.cs
Normal file
41
SabreTools.Models/Logiqx/Driver.cs
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace SabreTools.Models.Logiqx
|
||||||
|
{
|
||||||
|
[XmlRoot("driver")]
|
||||||
|
public class Driver : ItemBase
|
||||||
|
{
|
||||||
|
/// <remarks>(good|imperfect|preliminary)</remarks>
|
||||||
|
[XmlAttribute("status")]
|
||||||
|
public string Status { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(good|imperfect|preliminary)</remarks>
|
||||||
|
[XmlAttribute("emulation")]
|
||||||
|
public string Emulation { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(good|imperfect|preliminary)</remarks>
|
||||||
|
[XmlAttribute("cocktail")]
|
||||||
|
public string Cocktail { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(supported|unsupported)</remarks>
|
||||||
|
[XmlAttribute("savestate")]
|
||||||
|
public string SaveState { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(yes|no) "no"</remarks>
|
||||||
|
[XmlAttribute("requiresartwork")]
|
||||||
|
public string? RequiresArtwork { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(yes|no) "no"</remarks>
|
||||||
|
[XmlAttribute("unofficial")]
|
||||||
|
public string? Unofficial { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(yes|no) "no"</remarks>
|
||||||
|
[XmlAttribute("nosoundhardware")]
|
||||||
|
public string? NoSoundHardware { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(yes|no) "no"</remarks>
|
||||||
|
[XmlAttribute("incomplete")]
|
||||||
|
public string? Incomplete { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,102 +1,7 @@
|
|||||||
using System.Xml;
|
|
||||||
using System.Xml.Serialization;
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("game")]
|
[XmlRoot("game")]
|
||||||
public class Game
|
public class Game : GameBase { }
|
||||||
{
|
|
||||||
[XmlAttribute("name")]
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("sourcefile")]
|
|
||||||
public string? SourceFile { get; set; }
|
|
||||||
|
|
||||||
/// <remarks>(yes|no) "no"</remarks>
|
|
||||||
[XmlAttribute("isbios")]
|
|
||||||
public string? IsBios { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("cloneof")]
|
|
||||||
public string? CloneOf { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("romof")]
|
|
||||||
public string? RomOf { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("sampleof")]
|
|
||||||
public string? SampleOf { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("board")]
|
|
||||||
public string? Board { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("rebuildto")]
|
|
||||||
public string? RebuildTo { get; set; }
|
|
||||||
|
|
||||||
/// <remarks>(no|partial|yes) "no"</remarks>
|
|
||||||
[XmlAttribute("runnable")]
|
|
||||||
public string? Runnable { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("comment")]
|
|
||||||
public string[]? Comment { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("description")]
|
|
||||||
public string Description { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("year")]
|
|
||||||
public string? Year { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("manufacturer")]
|
|
||||||
public string? Manufacturer { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("publisher")]
|
|
||||||
public string? Publisher { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("category")]
|
|
||||||
public string? Category { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("release")]
|
|
||||||
public Release[]? Release { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("biosset")]
|
|
||||||
public BiosSet[]? BiosSet { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("rom")]
|
|
||||||
public Rom[]? Rom { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("disk")]
|
|
||||||
public Disk[]? Disk { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("sample")]
|
|
||||||
public Sample[]? Sample { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("archive")]
|
|
||||||
public Archive[]? Archive { get; set; }
|
|
||||||
|
|
||||||
#region Aaru Extensions
|
|
||||||
|
|
||||||
/// <remarks>Appears after Disk</remarks>
|
|
||||||
[XmlElement("media")]
|
|
||||||
public Media[]? Media { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region No-Intro Extensions
|
|
||||||
|
|
||||||
/// <remarks>Appears after RebuildTo</remarks>
|
|
||||||
[XmlAttribute("id")]
|
|
||||||
public string? Id { get; set; }
|
|
||||||
|
|
||||||
/// <remarks>Appears after Id</remarks>
|
|
||||||
[XmlAttribute("cloneofid")]
|
|
||||||
public string? CloneOfId { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Trurip Extensions
|
|
||||||
|
|
||||||
/// <remarks>Appears after Category</remarks>
|
|
||||||
[XmlElement("trurip")]
|
|
||||||
public Trurip? Trurip { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
115
SabreTools.Models/Logiqx/GameBase.cs
Normal file
115
SabreTools.Models/Logiqx/GameBase.cs
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace SabreTools.Models.Logiqx
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Base class to unify the various game-like types
|
||||||
|
/// </summary>
|
||||||
|
public abstract class GameBase
|
||||||
|
{
|
||||||
|
[XmlAttribute("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("sourcefile")]
|
||||||
|
public string? SourceFile { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(yes|no) "no"</remarks>
|
||||||
|
[XmlAttribute("isbios")]
|
||||||
|
public string? IsBios { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("cloneof")]
|
||||||
|
public string? CloneOf { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("romof")]
|
||||||
|
public string? RomOf { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("sampleof")]
|
||||||
|
public string? SampleOf { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("board")]
|
||||||
|
public string? Board { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("rebuildto")]
|
||||||
|
public string? RebuildTo { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(no|partial|yes) "no"</remarks>
|
||||||
|
[XmlAttribute("runnable")]
|
||||||
|
public string? Runnable { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("comment")]
|
||||||
|
public string[]? Comment { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("description")]
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("year")]
|
||||||
|
public string? Year { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("manufacturer")]
|
||||||
|
public string? Manufacturer { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("publisher")]
|
||||||
|
public string? Publisher { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>No-Intro extension includes more than 1 instance</remarks>
|
||||||
|
[XmlElement("category")]
|
||||||
|
public string[]? Category { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("release", typeof(Release))]
|
||||||
|
[XmlElement("biosset", typeof(BiosSet))]
|
||||||
|
[XmlElement("rom", typeof(Rom))]
|
||||||
|
[XmlElement("disk", typeof(Disk))]
|
||||||
|
[XmlElement("media", typeof(Media))] // Aaru extension
|
||||||
|
[XmlElement("device_ref", typeof(DeviceRef))] // MAME extension
|
||||||
|
[XmlElement("sample", typeof(Sample))]
|
||||||
|
[XmlElement("archive", typeof(Archive))]
|
||||||
|
[XmlElement("driver", typeof(Driver))] // MAME extension
|
||||||
|
[XmlElement("softwarelist", typeof(SoftwareList))] // MAME extension
|
||||||
|
public ItemBase[]? Item { get; set; }
|
||||||
|
|
||||||
|
#region MAME Extensions
|
||||||
|
|
||||||
|
/// <remarks>(yes|no) "no", Appears after IsBios</remarks>
|
||||||
|
[XmlAttribute("isdevice")]
|
||||||
|
public string? IsDevice { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(yes|no) "no", Appears after IsDevice</remarks>
|
||||||
|
[XmlAttribute("ismechanical")]
|
||||||
|
public string? IsMechanical { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region No-Intro Extensions
|
||||||
|
|
||||||
|
/// <remarks>Appears after RebuildTo</remarks>
|
||||||
|
[XmlAttribute("id")]
|
||||||
|
public string? Id { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Appears after Id</remarks>
|
||||||
|
[XmlAttribute("cloneofid")]
|
||||||
|
public string? CloneOfId { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Trurip Extensions
|
||||||
|
|
||||||
|
/// <remarks>Appears after Category</remarks>
|
||||||
|
[XmlElement("trurip")]
|
||||||
|
public Trurip? Trurip { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region DO NOT USE IN PRODUCTION
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ namespace SabreTools.Models.Logiqx
|
|||||||
[XmlRoot("header")]
|
[XmlRoot("header")]
|
||||||
public class Header
|
public class Header
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlElement("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
[XmlElement("description")]
|
[XmlElement("description")]
|
||||||
@@ -61,5 +61,17 @@ namespace SabreTools.Models.Logiqx
|
|||||||
public string? Type { get; set; }
|
public string? Type { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region DO NOT USE IN PRODUCTION
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
23
SabreTools.Models/Logiqx/ItemBase.cs
Normal file
23
SabreTools.Models/Logiqx/ItemBase.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace SabreTools.Models.Logiqx
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Base class to unify the various item types
|
||||||
|
/// </summary>
|
||||||
|
public abstract class ItemBase
|
||||||
|
{
|
||||||
|
#region DO NOT USE IN PRODUCTION
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,102 +1,7 @@
|
|||||||
using System.Xml;
|
|
||||||
using System.Xml.Serialization;
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("machine")]
|
[XmlRoot("machine")]
|
||||||
public class Machine
|
public class Machine : GameBase { }
|
||||||
{
|
|
||||||
[XmlAttribute("name")]
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("sourcefile")]
|
|
||||||
public string? SourceFile { get; set; }
|
|
||||||
|
|
||||||
/// <remarks>(yes|no) "no"</remarks>
|
|
||||||
[XmlAttribute("isbios")]
|
|
||||||
public string? IsBios { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("cloneof")]
|
|
||||||
public string? CloneOf { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("romof")]
|
|
||||||
public string? RomOf { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("sampleof")]
|
|
||||||
public string? SampleOf { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("board")]
|
|
||||||
public string? Board { get; set; }
|
|
||||||
|
|
||||||
[XmlAttribute("rebuildto")]
|
|
||||||
public string? RebuildTo { get; set; }
|
|
||||||
|
|
||||||
/// <remarks>(no|partial|yes) "no"</remarks>
|
|
||||||
[XmlAttribute("runnable")]
|
|
||||||
public string? Runnable { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("comment")]
|
|
||||||
public string[]? Comment { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("description")]
|
|
||||||
public string Description { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("year")]
|
|
||||||
public string? Year { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("manufacturer")]
|
|
||||||
public string? Manufacturer { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("publisher")]
|
|
||||||
public string? Publisher { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("category")]
|
|
||||||
public string? Category { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("release")]
|
|
||||||
public Release[]? Release { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("biosset")]
|
|
||||||
public BiosSet[]? BiosSet { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("rom")]
|
|
||||||
public Rom[]? Rom { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("disk")]
|
|
||||||
public Disk[]? Disk { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("sample")]
|
|
||||||
public Sample[]? Sample { get; set; }
|
|
||||||
|
|
||||||
[XmlElement("archive")]
|
|
||||||
public Archive[]? Archive { get; set; }
|
|
||||||
|
|
||||||
#region Aaru Extensions
|
|
||||||
|
|
||||||
/// <remarks>Appears after Disk</remarks>
|
|
||||||
[XmlElement("media")]
|
|
||||||
public Media[]? Media { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region No-Intro Extensions
|
|
||||||
|
|
||||||
/// <remarks>Appears after RebuildTo</remarks>
|
|
||||||
[XmlAttribute("id")]
|
|
||||||
public string? Id { get; set; }
|
|
||||||
|
|
||||||
/// <remarks>Appears after Id</remarks>
|
|
||||||
[XmlAttribute("cloneofid")]
|
|
||||||
public string? CloneOfId { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Trurip Extensions
|
|
||||||
|
|
||||||
/// <remarks>Appears after Category</remarks>
|
|
||||||
[XmlElement("trurip")]
|
|
||||||
public Trurip? Trurip { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ using System.Xml.Serialization;
|
|||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("media")]
|
[XmlRoot("media")]
|
||||||
public class Media
|
public class Media : ItemBase
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System.Xml.Serialization;
|
|||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("release")]
|
[XmlRoot("release")]
|
||||||
public class Release
|
public class Release : ItemBase
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System.Xml.Serialization;
|
|||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("rom")]
|
[XmlRoot("rom")]
|
||||||
public class Rom
|
public class Rom : ItemBase
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
@@ -79,11 +79,11 @@ namespace SabreTools.Models.Logiqx
|
|||||||
|
|
||||||
/// <remarks>Boolean; Appears after Date</remarks>
|
/// <remarks>Boolean; Appears after Date</remarks>
|
||||||
[XmlAttribute("inverted")]
|
[XmlAttribute("inverted")]
|
||||||
public bool? Inverted { get; set; }
|
public string? Inverted { get; set; }
|
||||||
|
|
||||||
/// <remarks>Boolean; Appears after Inverted</remarks>
|
/// <remarks>Boolean; Appears after Inverted</remarks>
|
||||||
[XmlAttribute("mia")]
|
[XmlAttribute("mia")]
|
||||||
public bool? MIA { get; set; }
|
public string? MIA { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,5 +32,17 @@ namespace SabreTools.Models.Logiqx
|
|||||||
/// <remarks>(yes|no) "no"</remarks>
|
/// <remarks>(yes|no) "no"</remarks>
|
||||||
[XmlAttribute("locksamplemode")]
|
[XmlAttribute("locksamplemode")]
|
||||||
public string? LockSampleMode { get; set; }
|
public string? LockSampleMode { get; set; }
|
||||||
|
|
||||||
|
#region DO NOT USE IN PRODUCTION
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ using System.Xml.Serialization;
|
|||||||
namespace SabreTools.Models.Logiqx
|
namespace SabreTools.Models.Logiqx
|
||||||
{
|
{
|
||||||
[XmlRoot("sample")]
|
[XmlRoot("sample")]
|
||||||
public class Sample
|
public class Sample : ItemBase
|
||||||
{
|
{
|
||||||
[XmlAttribute("name")]
|
[XmlAttribute("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|||||||
22
SabreTools.Models/Logiqx/SoftwareList.cs
Normal file
22
SabreTools.Models/Logiqx/SoftwareList.cs
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace SabreTools.Models.Logiqx
|
||||||
|
{
|
||||||
|
[XmlRoot("softwarelist")]
|
||||||
|
public class SoftwareList : ItemBase
|
||||||
|
{
|
||||||
|
[XmlAttribute("tag")]
|
||||||
|
public string Tag { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>(original|compatible)</remarks>
|
||||||
|
[XmlAttribute("status")]
|
||||||
|
public string Status { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute("filter")]
|
||||||
|
public string? Filter { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -48,5 +48,17 @@ namespace SabreTools.Models.Logiqx
|
|||||||
|
|
||||||
[XmlElement("relatedto")]
|
[XmlElement("relatedto")]
|
||||||
public string? RelatedTo { get; set; }
|
public string? RelatedTo { get; set; }
|
||||||
|
|
||||||
|
#region DO NOT USE IN PRODUCTION
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyAttribute]
|
||||||
|
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
|
||||||
|
|
||||||
|
/// <remarks>Should be empty</remarks>
|
||||||
|
[XmlAnyElement]
|
||||||
|
public object[]? ADDITIONAL_ELEMENTS { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
7
SabreTools.Serialization/Logiqx.cs
Normal file
7
SabreTools.Serialization/Logiqx.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace SabreTools.Serialization
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// XML deserializer for Logiqx-derived metadata files
|
||||||
|
/// </summary>
|
||||||
|
public class Logiqx : XmlSerializer<Models.Logiqx.Datafile> { }
|
||||||
|
}
|
||||||
@@ -429,6 +429,87 @@ namespace SabreTools.Test.Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData("test-logiqx-files1.xml.gz", 45875)]
|
||||||
|
[InlineData("test-logiqx-files2.xml", 761)]
|
||||||
|
public void LogiqxDeserializeTest(string file, long count)
|
||||||
|
{
|
||||||
|
// Open the file for reading
|
||||||
|
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", file);
|
||||||
|
|
||||||
|
// Deserialize the file
|
||||||
|
var dat = Serialization.Logiqx.Deserialize(filename);
|
||||||
|
|
||||||
|
// Validate the values
|
||||||
|
Assert.NotNull(dat?.Game);
|
||||||
|
Assert.Equal(count, dat.Game.Length);
|
||||||
|
|
||||||
|
// Validate we're not missing any attributes or elements
|
||||||
|
Assert.Null(dat.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(dat.ADDITIONAL_ELEMENTS);
|
||||||
|
if (dat.Header != null)
|
||||||
|
{
|
||||||
|
var header = dat.Header;
|
||||||
|
Assert.Null(header.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(header.ADDITIONAL_ELEMENTS);
|
||||||
|
|
||||||
|
if (header.ClrMamePro != null)
|
||||||
|
{
|
||||||
|
var cmp = header.ClrMamePro;
|
||||||
|
Assert.Null(cmp.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(cmp.ADDITIONAL_ELEMENTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header.RomCenter != null)
|
||||||
|
{
|
||||||
|
var rc = header.RomCenter;
|
||||||
|
Assert.Null(rc.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(rc.ADDITIONAL_ELEMENTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var game in dat.Game)
|
||||||
|
{
|
||||||
|
Assert.Null(game.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(game.ADDITIONAL_ELEMENTS);
|
||||||
|
|
||||||
|
foreach (var item in game.Item ?? Array.Empty<Models.Logiqx.ItemBase>())
|
||||||
|
{
|
||||||
|
Assert.Null(item.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(item.ADDITIONAL_ELEMENTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (game.Trurip != null)
|
||||||
|
{
|
||||||
|
var trurip = game.Trurip;
|
||||||
|
Assert.Null(trurip.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(trurip.ADDITIONAL_ELEMENTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var dir in dat.Dir ?? Array.Empty<Models.Logiqx.Dir>())
|
||||||
|
{
|
||||||
|
foreach (var game in dir.Game)
|
||||||
|
{
|
||||||
|
Assert.Null(game.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(game.ADDITIONAL_ELEMENTS);
|
||||||
|
|
||||||
|
foreach (var item in game.Item ?? Array.Empty<Models.Logiqx.ItemBase>())
|
||||||
|
{
|
||||||
|
Assert.Null(item.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(item.ADDITIONAL_ELEMENTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (game.Trurip != null)
|
||||||
|
{
|
||||||
|
var trurip = game.Trurip;
|
||||||
|
Assert.Null(trurip.ADDITIONAL_ATTRIBUTES);
|
||||||
|
Assert.Null(trurip.ADDITIONAL_ELEMENTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void OfflineListDeserializeTest()
|
public void OfflineListDeserializeTest()
|
||||||
{
|
{
|
||||||
@@ -692,13 +773,13 @@ namespace SabreTools.Test.Parser
|
|||||||
Assert.Empty(dat.ADDITIONAL_ELEMENTS);
|
Assert.Empty(dat.ADDITIONAL_ELEMENTS);
|
||||||
if (dat.Credits != null)
|
if (dat.Credits != null)
|
||||||
Assert.Empty(dat.Credits.ADDITIONAL_ELEMENTS);
|
Assert.Empty(dat.Credits.ADDITIONAL_ELEMENTS);
|
||||||
|
|
||||||
if (dat.Dat != null)
|
if (dat.Dat != null)
|
||||||
Assert.Empty(dat.Dat.ADDITIONAL_ELEMENTS);
|
Assert.Empty(dat.Dat.ADDITIONAL_ELEMENTS);
|
||||||
|
|
||||||
if (dat.Emulator != null)
|
if (dat.Emulator != null)
|
||||||
Assert.Empty(dat.Emulator.ADDITIONAL_ELEMENTS);
|
Assert.Empty(dat.Emulator.ADDITIONAL_ELEMENTS);
|
||||||
|
|
||||||
if (dat.Games != null)
|
if (dat.Games != null)
|
||||||
{
|
{
|
||||||
Assert.Empty(dat.Games.ADDITIONAL_ELEMENTS);
|
Assert.Empty(dat.Games.ADDITIONAL_ELEMENTS);
|
||||||
@@ -709,11 +790,14 @@ namespace SabreTools.Test.Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Theory]
|
||||||
public void SoftwareListDeserializeTest()
|
[InlineData("test-softwarelist-files1.xml", 4531)]
|
||||||
|
[InlineData("test-softwarelist-files2.xml", 2797)]
|
||||||
|
[InlineData("test-softwarelist-files3.xml", 274)]
|
||||||
|
public void SoftwareListDeserializeTest(string file, long count)
|
||||||
{
|
{
|
||||||
// Open the file for reading
|
// Open the file for reading
|
||||||
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", "test-softwarelist-files.xml");
|
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", file);
|
||||||
|
|
||||||
// Deserialize the file
|
// Deserialize the file
|
||||||
var dat = Serialization.SoftawreList.Deserialize(filename);
|
var dat = Serialization.SoftawreList.Deserialize(filename);
|
||||||
@@ -721,7 +805,7 @@ namespace SabreTools.Test.Parser
|
|||||||
// Validate the values
|
// Validate the values
|
||||||
Assert.NotNull(dat);
|
Assert.NotNull(dat);
|
||||||
Assert.NotNull(dat.Software);
|
Assert.NotNull(dat.Software);
|
||||||
Assert.Equal(5447, dat.Software.Length);
|
Assert.Equal(count, dat.Software.Length);
|
||||||
|
|
||||||
// Validate we're not missing any attributes or elements
|
// Validate we're not missing any attributes or elements
|
||||||
Assert.Null(dat.ADDITIONAL_ATTRIBUTES);
|
Assert.Null(dat.ADDITIONAL_ATTRIBUTES);
|
||||||
|
|||||||
BIN
SabreTools.Test/TestData/test-logiqx-files1.xml.gz
Normal file
BIN
SabreTools.Test/TestData/test-logiqx-files1.xml.gz
Normal file
Binary file not shown.
3066
SabreTools.Test/TestData/test-logiqx-files2.xml
Normal file
3066
SabreTools.Test/TestData/test-logiqx-files2.xml
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
69933
SabreTools.Test/TestData/test-softwarelist-files2.xml
Normal file
69933
SabreTools.Test/TestData/test-softwarelist-files2.xml
Normal file
File diff suppressed because it is too large
Load Diff
11445
SabreTools.Test/TestData/test-softwarelist-files3.xml
Normal file
11445
SabreTools.Test/TestData/test-softwarelist-files3.xml
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user