Files

180 lines
5.7 KiB
C#
Raw Permalink Normal View History

2024-04-03 21:27:50 -04:00
using System.IO;
2026-03-31 18:08:40 -04:00
using System.Text;
using System.Xml;
2025-09-26 13:06:18 -04:00
using SabreTools.Data.Models.OpenMSX;
2026-03-31 18:08:40 -04:00
using SabreTools.IO.Extensions;
using SabreTools.Text.Extensions;
2024-04-03 21:27:50 -04:00
2025-09-26 14:59:45 -04:00
namespace SabreTools.Serialization.Writers
2024-04-03 21:27:50 -04:00
{
2026-03-31 18:08:40 -04:00
public class OpenMSX : BaseBinaryWriter<SoftwareDb>
2024-04-03 21:27:50 -04:00
{
#region Constants
/// <summary>
/// name field for DOCTYPE
/// </summary>
public const string DocTypeName = "softwaredb";
/// <summary>
/// pubid field for DOCTYPE
/// </summary>
public const string? DocTypePubId = null;
/// <summary>
/// sysid field for DOCTYPE
/// </summary>
public const string DocTypeSysId = "softwaredb1.dtd";
/// <summary>
/// subset field for DOCTYPE
/// </summary>
public const string? DocTypeSubset = null;
#endregion
2026-03-31 18:08:40 -04:00
/// <inheritdoc/>
public override Stream? SerializeStream(SoftwareDb? obj)
{
// If the metadata file is null
if (obj is null)
return null;
2024-04-04 02:42:25 -04:00
2026-03-31 18:08:40 -04:00
// Setup the writer and output
var stream = new MemoryStream();
2026-03-31 18:30:16 -04:00
var writer = new XmlTextWriter(stream, Encoding.UTF8)
{
Formatting = Formatting.Indented,
IndentChar = '\t',
Indentation = 1
};
writer.Settings?.CheckCharacters = false;
writer.Settings?.NewLineChars = "\n";
2024-04-03 21:27:50 -04:00
// Write document start
writer.WriteStartDocument();
2026-03-31 18:08:40 -04:00
// Write document type
writer.WriteDocType(DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSubset);
2026-03-31 18:08:40 -04:00
// Write the SoftwareDb, if it exists
WriteSoftwareDb(obj, writer);
writer.Flush();
2024-04-04 02:42:25 -04:00
2026-03-31 18:08:40 -04:00
// Return the stream
stream.SeekIfPossible(0, SeekOrigin.Begin);
return stream;
}
2024-04-03 21:27:50 -04:00
2026-03-31 18:08:40 -04:00
/// <summary>
/// Write a SoftwareDb to an XmlTextWriter
/// </summary>
/// <param name="obj">SoftwareDb to write</param>
/// <param name="writer">XmlTextReader to write to</param>
private static void WriteSoftwareDb(SoftwareDb obj, XmlTextWriter writer)
{
writer.WriteStartElement("softwaredb");
2024-04-03 21:27:50 -04:00
2026-03-31 18:08:40 -04:00
writer.WriteOptionalAttributeString("timestamp", obj.Timestamp);
2024-04-03 21:27:50 -04:00
2026-03-31 18:08:40 -04:00
if (obj.Software is not null && obj.Software.Length > 0)
{
foreach (var software in obj.Software)
{
WriteSoftware(software, writer);
}
}
2024-04-03 21:27:50 -04:00
2026-03-31 18:08:40 -04:00
writer.WriteEndElement();
}
/// <summary>
/// Write a Dump to an XmlTextWriter
/// </summary>
/// <param name="obj">Dump to write</param>
/// <param name="writer">XmlTextReader to write to</param>
private static void WriteDump(Dump obj, XmlTextWriter writer)
{
writer.WriteStartElement("dump");
if (obj.Original is not null)
WriteOriginal(obj.Original, writer);
writer.WriteOptionalElementString("boot", obj.Boot);
2026-03-31 18:08:40 -04:00
if (obj.Rom is not null)
WriteRomBase(obj.Rom, writer);
writer.WriteEndElement();
}
/// <summary>
/// Write a Original to an XmlTextWriter
/// </summary>
/// <param name="obj">Original to write</param>
/// <param name="writer">XmlTextReader to write to</param>
private static void WriteOriginal(Original obj, XmlTextWriter writer)
{
writer.WriteStartElement("original");
2026-04-03 13:48:43 -04:00
writer.WriteOptionalAttributeString("value", obj.Value?.ToString().ToLowerInvariant());
2026-03-31 18:08:40 -04:00
if (obj.Content is not null)
writer.WriteRaw(obj.Content);
writer.WriteEndElement();
}
/// <summary>
/// Write a RomBase to an XmlTextWriter
/// </summary>
/// <param name="obj">RomBase to write</param>
/// <param name="writer">XmlTextReader to write to</param>
private static void WriteRomBase(RomBase obj, XmlTextWriter writer)
{
if (obj is MegaRom)
writer.WriteStartElement("megarom");
else if (obj is Rom)
writer.WriteStartElement("rom");
else if (obj is SCCPlusCart)
writer.WriteStartElement("sccpluscart");
else
return;
writer.WriteOptionalElementString("start", obj.Start);
writer.WriteOptionalElementString("type", obj.Type);
writer.WriteOptionalElementString("hash", obj.Hash);
writer.WriteOptionalElementString("remark", obj.Remark);
writer.WriteEndElement();
}
/// <summary>
/// Write a Software to an XmlTextWriter
/// </summary>
/// <param name="obj">Software to write</param>
/// <param name="writer">XmlTextReader to write to</param>
private static void WriteSoftware(Software obj, XmlTextWriter writer)
{
writer.WriteStartElement("software");
writer.WriteRequiredElementString("title", obj.Title);
writer.WriteOptionalElementString("genmsxid", obj.GenMSXID);
writer.WriteRequiredElementString("system", obj.System);
writer.WriteRequiredElementString("company", obj.Company);
writer.WriteRequiredElementString("year", obj.Year);
writer.WriteRequiredElementString("country", obj.Country);
if (obj.Dump is not null && obj.Dump.Length > 0)
{
foreach (var dump in obj.Dump)
{
WriteDump(dump, writer);
}
}
writer.WriteEndElement();
}
2024-04-03 21:27:50 -04:00
}
}