diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs
index 4fad40c1..88965783 100644
--- a/SabreTools.DatFiles/DatFile.cs
+++ b/SabreTools.DatFiles/DatFile.cs
@@ -15,6 +15,7 @@ using SabreTools.DatItems.Formats;
using SabreTools.Filter;
using SabreTools.Hashing;
using SabreTools.Logging;
+using SabreTools.Serialization.Interfaces;
namespace SabreTools.DatFiles
{
@@ -661,4 +662,63 @@ namespace SabreTools.DatFiles
#endregion
}
+
+ ///
+ /// Represents a DAT that can be serialized
+ ///
+ /// Base internal model for the DAT type
+ /// IFileSerializer type to use for conversion
+ /// IModelSerializer for cross-model serialization
+ public abstract class SerializableDatFile : DatFile
+ where U : IFileSerializer
+ where V : IModelSerializer
+ {
+ ///
+ protected SerializableDatFile(DatFile? datFile) : base(datFile) { }
+
+ ///
+ public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
+ {
+ try
+ {
+ // Deserialize the input file in two steps
+ var specificFormat = Activator.CreateInstance().Deserialize(filename);
+ var internalFormat = Activator.CreateInstance().Serialize(specificFormat);
+
+ // Convert to the internal format
+ ConvertMetadata(internalFormat, filename, indexId, keep, statsOnly);
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ string message = $"'{filename}' - An error occurred during parsing";
+ logger.Error(ex, message);
+ }
+ }
+
+ ///
+ public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
+ {
+ try
+ {
+ logger.User($"Writing to '{outfile}'...");
+
+ // Serialize the input file in two steps
+ var internalFormat = ConvertMetadata(ignoreblanks);
+ var specificFormat = Activator.CreateInstance().Deserialize(internalFormat);
+ if (!Activator.CreateInstance().Serialize(specificFormat, outfile))
+ {
+ logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
+ return false;
+ }
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ logger.Error(ex);
+ return false;
+ }
+
+ logger.User($"'{outfile}' written!{Environment.NewLine}");
+ return true;
+ }
+ }
}
diff --git a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs
deleted file mode 100644
index 12a51f2f..00000000
--- a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a Archive.org file list
- ///
- internal partial class ArchiveDotOrg : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var files = new Serialization.Files.ArchiveDotOrg().Deserialize(filename);
- var metadata = new Serialization.CrossModel.ArchiveDotOrg().Serialize(files);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs
deleted file mode 100644
index a210f122..00000000
--- a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing and writing of a Archive.org file list
- ///
- internal partial class ArchiveDotOrg : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Rom,
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem) => null;
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var files = new Serialization.CrossModel.ArchiveDotOrg().Deserialize(metadata);
- if (!new Serialization.Files.ArchiveDotOrg().Serialize(files, outfile))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs b/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs
index 36e0b4ec..7e9bc5de 100644
--- a/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs
+++ b/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs
@@ -1,9 +1,13 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents a Archive.org file list
///
- internal partial class ArchiveDotOrg : DatFile
+ internal sealed class ArchiveDotOrg : SerializableDatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +17,17 @@
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Rom,
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem) => null;
}
}
diff --git a/SabreTools.DatFiles/Formats/AttractMode.Reader.cs b/SabreTools.DatFiles/Formats/AttractMode.Reader.cs
deleted file mode 100644
index 0bc46540..00000000
--- a/SabreTools.DatFiles/Formats/AttractMode.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing of an AttractMode DAT
- ///
- internal partial class AttractMode : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.AttractMode().Deserialize(filename);
- var metadata = new Serialization.CrossModel.AttractMode().Serialize(metadataFile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/AttractMode.Writer.cs b/SabreTools.DatFiles/Formats/AttractMode.Writer.cs
deleted file mode 100644
index f858b7bb..00000000
--- a/SabreTools.DatFiles/Formats/AttractMode.Writer.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing and writing of an AttractMode DAT
- ///
- internal partial class AttractMode : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var metadataFile = new Serialization.CrossModel.AttractMode().Deserialize(metadata);
- if (!(new Serialization.Files.AttractMode().Serialize(metadataFile, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/AttractMode.cs b/SabreTools.DatFiles/Formats/AttractMode.cs
index 2d6cec34..f208583d 100644
--- a/SabreTools.DatFiles/Formats/AttractMode.cs
+++ b/SabreTools.DatFiles/Formats/AttractMode.cs
@@ -1,9 +1,13 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents an AttractMode DAT
///
- internal partial class AttractMode : DatFile
+ internal sealed class AttractMode : SerializableDatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +17,26 @@
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ return missingFields;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs b/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs
deleted file mode 100644
index 40c772df..00000000
--- a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing of a ClrMamePro DAT
- ///
- internal partial class ClrMamePro : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.ClrMamePro().Deserialize(filename, this.Quotes);
- var metadata = new Serialization.CrossModel.ClrMamePro().Serialize(metadataFile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs b/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs
deleted file mode 100644
index e9559ef1..00000000
--- a/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.Core.Tools;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing of a ClrMamePro DAT
- ///
- internal partial class ClrMamePro : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Archive,
- ItemType.BiosSet,
- ItemType.Chip,
- ItemType.DipSwitch,
- ItemType.Disk,
- ItemType.Display,
- ItemType.Driver,
- ItemType.Input,
- ItemType.Media,
- ItemType.Release,
- ItemType.Rom,
- ItemType.Sample,
- ItemType.Sound,
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
- switch (datItem)
- {
- case Release release:
- if (string.IsNullOrEmpty(release.GetName()))
- missingFields.Add(Models.Metadata.Release.NameKey);
- if (string.IsNullOrEmpty(release.GetStringFieldValue(Models.Metadata.Release.RegionKey)))
- missingFields.Add(Models.Metadata.Release.RegionKey);
- break;
-
- case BiosSet biosset:
- if (string.IsNullOrEmpty(biosset.GetName()))
- missingFields.Add(Models.Metadata.BiosSet.NameKey);
- if (string.IsNullOrEmpty(biosset.GetStringFieldValue(Models.Metadata.BiosSet.DescriptionKey)))
- missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
- break;
-
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
- {
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- }
- break;
-
- case Disk disk:
- if (string.IsNullOrEmpty(disk.GetName()))
- missingFields.Add(Models.Metadata.Disk.NameKey);
- if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
- && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
- {
- missingFields.Add(Models.Metadata.Disk.SHA1Key);
- }
- break;
-
- case Sample sample:
- if (string.IsNullOrEmpty(sample.GetName()))
- missingFields.Add(Models.Metadata.Sample.NameKey);
- break;
-
- case Archive archive:
- if (string.IsNullOrEmpty(archive.GetName()))
- missingFields.Add(Models.Metadata.Archive.NameKey);
- break;
-
- case Chip chip:
- if (chip.GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey).AsEnumValue() == ChipType.NULL)
- missingFields.Add(Models.Metadata.Chip.ChipTypeKey);
- if (string.IsNullOrEmpty(chip.GetName()))
- missingFields.Add(Models.Metadata.Chip.NameKey);
- break;
-
- case Display display:
- if (display.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey).AsEnumValue() == DisplayType.NULL)
- missingFields.Add(Models.Metadata.Display.DisplayTypeKey);
- if (display.GetInt64FieldValue(Models.Metadata.Display.RotateKey) == null)
- missingFields.Add(Models.Metadata.Display.RotateKey);
- break;
-
- case Sound sound:
- if (sound.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey) == null)
- missingFields.Add(Models.Metadata.Sound.ChannelsKey);
- break;
-
- case Input input:
- if (input.GetInt64FieldValue(Models.Metadata.Input.PlayersKey) == null)
- missingFields.Add(Models.Metadata.Input.PlayersKey);
- if (!input.ControlsSpecified)
- missingFields.Add(Models.Metadata.Input.ControlKey);
- break;
-
- case DipSwitch dipswitch:
- if (string.IsNullOrEmpty(dipswitch.GetName()))
- missingFields.Add(Models.Metadata.DipSwitch.NameKey);
- break;
-
- case Driver driver:
- if (driver.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.StatusKey);
- if (driver.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.EmulationKey);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var metadataFile = new Serialization.CrossModel.ClrMamePro().Deserialize(metadata);
- if (!(new Serialization.Files.ClrMamePro().Serialize(metadataFile, outfile, Quotes)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.cs b/SabreTools.DatFiles/Formats/ClrMamePro.cs
index 945a5776..8b22f588 100644
--- a/SabreTools.DatFiles/Formats/ClrMamePro.cs
+++ b/SabreTools.DatFiles/Formats/ClrMamePro.cs
@@ -1,9 +1,16 @@
-namespace SabreTools.DatFiles.Formats
+using System;
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.Core.Tools;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents a ClrMamePro DAT
///
- internal partial class ClrMamePro : DatFile
+ internal sealed class ClrMamePro : SerializableDatFile
{
#region Fields
@@ -24,5 +31,170 @@
{
Quotes = quotes;
}
+
+ ///
+ public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
+ {
+ try
+ {
+ // Deserialize the input file
+ var metadataFile = new Serialization.Files.ClrMamePro().Deserialize(filename, this.Quotes);
+ var metadata = new Serialization.CrossModel.ClrMamePro().Serialize(metadataFile);
+
+ // Convert to the internal format
+ ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ string message = $"'{filename}' - An error occurred during parsing";
+ logger.Error(ex, message);
+ }
+ }
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Archive,
+ ItemType.BiosSet,
+ ItemType.Chip,
+ ItemType.DipSwitch,
+ ItemType.Disk,
+ ItemType.Display,
+ ItemType.Driver,
+ ItemType.Input,
+ ItemType.Media,
+ ItemType.Release,
+ ItemType.Rom,
+ ItemType.Sample,
+ ItemType.Sound,
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+ switch (datItem)
+ {
+ case Release release:
+ if (string.IsNullOrEmpty(release.GetName()))
+ missingFields.Add(Models.Metadata.Release.NameKey);
+ if (string.IsNullOrEmpty(release.GetStringFieldValue(Models.Metadata.Release.RegionKey)))
+ missingFields.Add(Models.Metadata.Release.RegionKey);
+ break;
+
+ case BiosSet biosset:
+ if (string.IsNullOrEmpty(biosset.GetName()))
+ missingFields.Add(Models.Metadata.BiosSet.NameKey);
+ if (string.IsNullOrEmpty(biosset.GetStringFieldValue(Models.Metadata.BiosSet.DescriptionKey)))
+ missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
+ break;
+
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
+ {
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ }
+ break;
+
+ case Disk disk:
+ if (string.IsNullOrEmpty(disk.GetName()))
+ missingFields.Add(Models.Metadata.Disk.NameKey);
+ if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
+ && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
+ {
+ missingFields.Add(Models.Metadata.Disk.SHA1Key);
+ }
+ break;
+
+ case Sample sample:
+ if (string.IsNullOrEmpty(sample.GetName()))
+ missingFields.Add(Models.Metadata.Sample.NameKey);
+ break;
+
+ case Archive archive:
+ if (string.IsNullOrEmpty(archive.GetName()))
+ missingFields.Add(Models.Metadata.Archive.NameKey);
+ break;
+
+ case Chip chip:
+ if (chip.GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey).AsEnumValue() == ChipType.NULL)
+ missingFields.Add(Models.Metadata.Chip.ChipTypeKey);
+ if (string.IsNullOrEmpty(chip.GetName()))
+ missingFields.Add(Models.Metadata.Chip.NameKey);
+ break;
+
+ case Display display:
+ if (display.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey).AsEnumValue() == DisplayType.NULL)
+ missingFields.Add(Models.Metadata.Display.DisplayTypeKey);
+ if (display.GetInt64FieldValue(Models.Metadata.Display.RotateKey) == null)
+ missingFields.Add(Models.Metadata.Display.RotateKey);
+ break;
+
+ case Sound sound:
+ if (sound.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey) == null)
+ missingFields.Add(Models.Metadata.Sound.ChannelsKey);
+ break;
+
+ case Input input:
+ if (input.GetInt64FieldValue(Models.Metadata.Input.PlayersKey) == null)
+ missingFields.Add(Models.Metadata.Input.PlayersKey);
+ if (!input.ControlsSpecified)
+ missingFields.Add(Models.Metadata.Input.ControlKey);
+ break;
+
+ case DipSwitch dipswitch:
+ if (string.IsNullOrEmpty(dipswitch.GetName()))
+ missingFields.Add(Models.Metadata.DipSwitch.NameKey);
+ break;
+
+ case Driver driver:
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.StatusKey);
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.EmulationKey);
+ break;
+ }
+
+ return missingFields;
+ }
+
+ ///
+ public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
+ {
+ try
+ {
+ logger.User($"Writing to '{outfile}'...");
+
+ // Serialize the input file
+ var metadata = ConvertMetadata(ignoreblanks);
+ var metadataFile = new Serialization.CrossModel.ClrMamePro().Deserialize(metadata);
+ if (!(new Serialization.Files.ClrMamePro().Serialize(metadataFile, outfile, Quotes)))
+ {
+ logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
+ return false;
+ }
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ logger.Error(ex);
+ return false;
+ }
+
+ logger.User($"'{outfile}' written!{Environment.NewLine}");
+ return true;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs b/SabreTools.DatFiles/Formats/DosCenter.Reader.cs
deleted file mode 100644
index 27a4b3ed..00000000
--- a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing and writing of a DosCenter DAT
- ///
- internal partial class DosCenter : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.DosCenter().Deserialize(filename);
- var metadata = new Serialization.CrossModel.DosCenter().Serialize(metadataFile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/DosCenter.Writer.cs b/SabreTools.DatFiles/Formats/DosCenter.Writer.cs
deleted file mode 100644
index f91a3812..00000000
--- a/SabreTools.DatFiles/Formats/DosCenter.Writer.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing and writing of a DosCenter DAT
- ///
- internal partial class DosCenter : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- switch (datItem)
- {
- case Rom rom:
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- // if (string.IsNullOrEmpty(rom.Date))
- // missingFields.Add(Models.Metadata.Rom.DateKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
- missingFields.Add(Models.Metadata.Rom.CRCKey);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var metadataFile = new Serialization.CrossModel.DosCenter().Deserialize(metadata);
- if (!(new Serialization.Files.DosCenter().Serialize(metadataFile, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/DosCenter.cs b/SabreTools.DatFiles/Formats/DosCenter.cs
index 30a01f51..2a39ca5e 100644
--- a/SabreTools.DatFiles/Formats/DosCenter.cs
+++ b/SabreTools.DatFiles/Formats/DosCenter.cs
@@ -1,9 +1,14 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
- /// Represents a DosCenter DAT
+ /// Represents parsing and writing of a DosCenter DAT
///
- internal partial class DosCenter : DatFile
+ internal sealed class DosCenter : SerializableDatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +18,38 @@
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ switch (datItem)
+ {
+ case Rom rom:
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ // if (string.IsNullOrEmpty(rom.Date))
+ // missingFields.Add(Models.Metadata.Rom.DateKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
+ missingFields.Add(Models.Metadata.Rom.CRCKey);
+ break;
+ }
+
+ return missingFields;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs b/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs
deleted file mode 100644
index b784f92b..00000000
--- a/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing and writing of an Everdrive SMDB file
- ///
- internal partial class EverdriveSMDB : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.EverdriveSMDB().Deserialize(filename);
- var metadata = new Serialization.CrossModel.EverdriveSMDB().Serialize(metadataFile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs b/SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs
deleted file mode 100644
index a46df856..00000000
--- a/SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing and writing of an Everdrive SMDB file
- ///
- internal partial class EverdriveSMDB : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- switch (datItem)
- {
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)))
- missingFields.Add(Models.Metadata.Rom.SHA256Key);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)))
- missingFields.Add(Models.Metadata.Rom.MD5Key);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
- missingFields.Add(Models.Metadata.Rom.CRCKey);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- //var metadataFile = CreateMetadataFile(ignoreblanks);
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var metadataFile = new Serialization.CrossModel.EverdriveSMDB().Deserialize(metadata);
- if (!(new Serialization.Files.EverdriveSMDB().Serialize(metadataFile, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/EverdriveSmdb.cs b/SabreTools.DatFiles/Formats/EverdriveSmdb.cs
index f52d8065..d4800f8a 100644
--- a/SabreTools.DatFiles/Formats/EverdriveSmdb.cs
+++ b/SabreTools.DatFiles/Formats/EverdriveSmdb.cs
@@ -1,9 +1,14 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents parsing and writing of an Everdrive SMDB file
///
- internal partial class EverdriveSMDB : DatFile
+ internal sealed class EverdriveSMDB : SerializableDatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +18,40 @@
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ switch (datItem)
+ {
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA256Key);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)))
+ missingFields.Add(Models.Metadata.Rom.MD5Key);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
+ missingFields.Add(Models.Metadata.Rom.CRCKey);
+ break;
+ }
+
+ return missingFields;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/Hashfile.Reader.cs b/SabreTools.DatFiles/Formats/Hashfile.Reader.cs
deleted file mode 100644
index cf1c7d72..00000000
--- a/SabreTools.DatFiles/Formats/Hashfile.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing of a hashfile such as an SFV, MD5, or SHA-1 file
- ///
- internal partial class Hashfile : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var hashfile = new Serialization.Files.Hashfile().Deserialize(filename, _hash);
- var metadata = new Serialization.CrossModel.Hashfile().Serialize(hashfile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Hashfile.Writer.cs b/SabreTools.DatFiles/Formats/Hashfile.Writer.cs
deleted file mode 100644
index 537fbf86..00000000
--- a/SabreTools.DatFiles/Formats/Hashfile.Writer.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing a hashfile such as an SFV, MD5, or SHA-1 file
- ///
- internal partial class Hashfile : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Disk,
- ItemType.Media,
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- // Check hash linked to specific Hashfile type
- switch (_hash)
- {
- case Serialization.Hash.CRC:
- switch (datItem)
- {
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
- missingFields.Add(Models.Metadata.Rom.CRCKey);
- break;
- default:
- missingFields.Add(Models.Metadata.Rom.CRCKey);
- break;
- }
- break;
- case Serialization.Hash.MD5:
- switch (datItem)
- {
- case Disk disk:
- if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)))
- missingFields.Add(Models.Metadata.Disk.MD5Key);
- break;
- case Media medium:
- if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.MD5Key)))
- missingFields.Add(Models.Metadata.Media.MD5Key);
- break;
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)))
- missingFields.Add(Models.Metadata.Rom.MD5Key);
- break;
- default:
- missingFields.Add(Models.Metadata.Rom.MD5Key);
- break;
- }
- break;
- case Serialization.Hash.SHA1:
- switch (datItem)
- {
- case Disk disk:
- if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
- missingFields.Add(Models.Metadata.Disk.SHA1Key);
- break;
- case Media medium:
- if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SHA1Key)))
- missingFields.Add(Models.Metadata.Media.SHA1Key);
- break;
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- break;
- default:
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- break;
- }
- break;
- case Serialization.Hash.SHA256:
- switch (datItem)
- {
- case Media medium:
- if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SHA256Key)))
- missingFields.Add(Models.Metadata.Media.SHA256Key);
- break;
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)))
- missingFields.Add(Models.Metadata.Rom.SHA256Key);
- break;
- default:
- missingFields.Add(Models.Metadata.Rom.SHA256Key);
- break;
- }
- break;
- case Serialization.Hash.SHA384:
- switch (datItem)
- {
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)))
- missingFields.Add(Models.Metadata.Rom.SHA384Key);
- break;
- default:
- missingFields.Add(Models.Metadata.Rom.SHA384Key);
- break;
- }
- break;
- case Serialization.Hash.SHA512:
- switch (datItem)
- {
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)))
- missingFields.Add(Models.Metadata.Rom.SHA512Key);
- break;
- default:
- missingFields.Add(Models.Metadata.Rom.SHA512Key);
- break;
- }
- break;
- case Serialization.Hash.SpamSum:
- switch (datItem)
- {
- case Media medium:
- if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)))
- missingFields.Add(Models.Metadata.Media.SpamSumKey);
- break;
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
- missingFields.Add(Models.Metadata.Rom.SpamSumKey);
- break;
- default:
- missingFields.Add(Models.Metadata.Rom.SpamSumKey);
- break;
- }
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var hashfile = new Serialization.CrossModel.Hashfile().Deserialize(metadata, _hash);
- if (!(new Serialization.Files.Hashfile().Serialize(hashfile, outfile, _hash)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Hashfile.cs b/SabreTools.DatFiles/Formats/Hashfile.cs
index f15eddab..6505ea1d 100644
--- a/SabreTools.DatFiles/Formats/Hashfile.cs
+++ b/SabreTools.DatFiles/Formats/Hashfile.cs
@@ -1,11 +1,16 @@
-using SabreTools.Hashing;
+using System;
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+using SabreTools.Hashing;
namespace SabreTools.DatFiles.Formats
{
///
/// Represents a hashfile such as an SFV, MD5, or SHA-1 file
///
- internal partial class Hashfile : DatFile
+ internal sealed class Hashfile : SerializableDatFile
{
// Private instance variables specific to Hashfile DATs
private readonly Serialization.Hash _hash;
@@ -38,5 +43,186 @@ namespace SabreTools.DatFiles.Formats
_ => throw new System.ArgumentOutOfRangeException(nameof(hash)),
};
}
+
+ ///
+ public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
+ {
+ try
+ {
+ // Deserialize the input file
+ var hashfile = new Serialization.Files.Hashfile().Deserialize(filename, _hash);
+ var metadata = new Serialization.CrossModel.Hashfile().Serialize(hashfile);
+
+ // Convert to the internal format
+ ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ string message = $"'{filename}' - An error occurred during parsing";
+ logger.Error(ex, message);
+ }
+ }
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Disk,
+ ItemType.Media,
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ // Check hash linked to specific Hashfile type
+ switch (_hash)
+ {
+ case Serialization.Hash.CRC:
+ switch (datItem)
+ {
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
+ missingFields.Add(Models.Metadata.Rom.CRCKey);
+ break;
+ default:
+ missingFields.Add(Models.Metadata.Rom.CRCKey);
+ break;
+ }
+ break;
+ case Serialization.Hash.MD5:
+ switch (datItem)
+ {
+ case Disk disk:
+ if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)))
+ missingFields.Add(Models.Metadata.Disk.MD5Key);
+ break;
+ case Media medium:
+ if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.MD5Key)))
+ missingFields.Add(Models.Metadata.Media.MD5Key);
+ break;
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)))
+ missingFields.Add(Models.Metadata.Rom.MD5Key);
+ break;
+ default:
+ missingFields.Add(Models.Metadata.Rom.MD5Key);
+ break;
+ }
+ break;
+ case Serialization.Hash.SHA1:
+ switch (datItem)
+ {
+ case Disk disk:
+ if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
+ missingFields.Add(Models.Metadata.Disk.SHA1Key);
+ break;
+ case Media medium:
+ if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SHA1Key)))
+ missingFields.Add(Models.Metadata.Media.SHA1Key);
+ break;
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ break;
+ default:
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ break;
+ }
+ break;
+ case Serialization.Hash.SHA256:
+ switch (datItem)
+ {
+ case Media medium:
+ if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SHA256Key)))
+ missingFields.Add(Models.Metadata.Media.SHA256Key);
+ break;
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA256Key);
+ break;
+ default:
+ missingFields.Add(Models.Metadata.Rom.SHA256Key);
+ break;
+ }
+ break;
+ case Serialization.Hash.SHA384:
+ switch (datItem)
+ {
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA384Key);
+ break;
+ default:
+ missingFields.Add(Models.Metadata.Rom.SHA384Key);
+ break;
+ }
+ break;
+ case Serialization.Hash.SHA512:
+ switch (datItem)
+ {
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA512Key);
+ break;
+ default:
+ missingFields.Add(Models.Metadata.Rom.SHA512Key);
+ break;
+ }
+ break;
+ case Serialization.Hash.SpamSum:
+ switch (datItem)
+ {
+ case Media medium:
+ if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)))
+ missingFields.Add(Models.Metadata.Media.SpamSumKey);
+ break;
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
+ missingFields.Add(Models.Metadata.Rom.SpamSumKey);
+ break;
+ default:
+ missingFields.Add(Models.Metadata.Rom.SpamSumKey);
+ break;
+ }
+ break;
+ }
+
+ return missingFields;
+ }
+
+ ///
+ public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
+ {
+ try
+ {
+ logger.User($"Writing to '{outfile}'...");
+
+ // Serialize the input file
+ var metadata = ConvertMetadata(ignoreblanks);
+ var hashfile = new Serialization.CrossModel.Hashfile().Deserialize(metadata, _hash);
+ if (!(new Serialization.Files.Hashfile().Serialize(hashfile, outfile, _hash)))
+ {
+ logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
+ return false;
+ }
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ logger.Error(ex);
+ return false;
+ }
+
+ logger.User($"'{outfile}' written!{Environment.NewLine}");
+ return true;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/Listrom.Reader.cs b/SabreTools.DatFiles/Formats/Listrom.Reader.cs
deleted file mode 100644
index f5e6f6b7..00000000
--- a/SabreTools.DatFiles/Formats/Listrom.Reader.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-using System;
-using System.Linq;
-using SabreTools.Core;
-using SabreTools.Core.Tools;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-// TODO: When Serialization is updated, this should work as there was a bug in the library
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a MAME Listrom file
- ///
- internal partial class Listrom : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.Listrom().Deserialize(filename);
-
- // Convert the set data to the internal format
- ConvertSets(metadataFile?.Set, filename, indexId, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
-
- #region Converters
-
- ///
- /// Convert sets information
- ///
- /// Array of deserialized models to convert
- /// Name of the file to be parsed
- /// Index ID for the DAT
- /// True to only add item statistics while parsing, false otherwise
- private void ConvertSets(Models.Listrom.Set[]? sets, string filename, int indexId, bool statsOnly)
- {
- // If the rows array is missing, we can't do anything
- if (sets == null || !sets.Any())
- return;
-
- // Loop through the sets and add
- foreach (var set in sets)
- {
- ConvertSet(set, filename, indexId, statsOnly);
- }
- }
-
- ///
- /// Convert set information
- ///
- /// Deserialized model to convert
- /// Name of the file to be parsed
- /// Index ID for the DAT
- /// True to only add item statistics while parsing, false otherwise
- private void ConvertSet(Models.Listrom.Set? set, string filename, int indexId, bool statsOnly)
- {
- // If the set is missing, we can't do anything
- if (set == null)
- return;
-
- // Create the machine
- Machine machine;
- if (!string.IsNullOrEmpty(set.Device))
- {
- machine = new Machine();
- machine.SetFieldValue(Models.Metadata.Machine.NameKey, set.Device);
- machine.SetFieldValue(Models.Metadata.Machine.IsDeviceKey, (true as bool?).FromYesNo());
- }
- else if (!string.IsNullOrEmpty(set.Driver))
- {
- machine = new Machine();
- machine.SetFieldValue(Models.Metadata.Machine.NameKey, set.Driver);
- }
- else
- {
- return;
- }
-
- foreach (var row in set.Row ?? [])
- {
- ConvertRow(row, machine, filename, indexId, statsOnly);
- }
- }
-
- ///
- /// Convert row information
- ///
- /// Deserialized model to convert
- /// Name of the file to be parsed
- /// Index ID for the DAT
- /// True to only add item statistics while parsing, false otherwise
- private void ConvertRow(Models.Listrom.Row? row, Machine machine, string filename, int indexId, bool statsOnly)
- {
- // If the row is missing, we can't do anything
- if (row == null)
- return;
-
- // Normal CHD
- if (row.Size == null
- && !row.NoGoodDumpKnown
- && !row.Bad
- && (!string.IsNullOrEmpty(row.MD5)
- || !string.IsNullOrEmpty(row.SHA1)))
- {
- var disk = new Disk();
- disk.SetName(row.Name);
- disk.SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.None.AsStringValue());
- disk.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename });
-
- if (!string.IsNullOrEmpty(row.MD5))
- disk.SetFieldValue(Models.Metadata.Disk.MD5Key, row.MD5);
- else
- disk.SetFieldValue(Models.Metadata.Disk.SHA1Key, row.SHA1);
-
- // Now process and add the item
- disk.CopyMachineInformation(machine);
- ParseAddHelper(disk, statsOnly);
- }
-
- // Normal ROM
- else if (row.Size != null
- && !row.NoGoodDumpKnown
- && !row.Bad)
- {
- var rom = new Rom();
- rom.SetName(row.Name);
- rom.SetFieldValue(Models.Metadata.Rom.CRCKey, row.CRC);
- rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, row.SHA1);
- rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size).ToString());
- rom.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename });
- rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None.AsStringValue());
-
- // Now process and add the item
- rom.CopyMachineInformation(machine);
- ParseAddHelper(rom, statsOnly);
- }
-
- // Bad CHD
- else if (row.Size == null
- && !row.NoGoodDumpKnown
- && row.Bad
- && (!string.IsNullOrEmpty(row.MD5)
- || !string.IsNullOrEmpty(row.SHA1)))
- {
- var disk = new Disk();
- disk.SetName(row.Name);
- disk.SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.BadDump.AsStringValue());
- disk.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename });
-
- if (!string.IsNullOrEmpty(row.MD5))
- disk.SetFieldValue(Models.Metadata.Disk.MD5Key, row.MD5);
- else
- disk.SetFieldValue(Models.Metadata.Disk.SHA1Key, row.SHA1);
-
- // Now process and add the item
- disk.CopyMachineInformation(machine);
- ParseAddHelper(disk, statsOnly);
- }
-
- // Nodump CHD
- else if (row.Size == null
- && row.NoGoodDumpKnown)
- {
- var disk = new Disk();
- disk.SetName(row.Name);
- disk.SetFieldValue(Models.Metadata.Disk.MD5Key, null);
- disk.SetFieldValue(Models.Metadata.Disk.SHA1Key, null);
- disk.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename });
- disk.SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.Nodump.AsStringValue());
-
- // Now process and add the item
- disk.CopyMachineInformation(machine);
- ParseAddHelper(disk, statsOnly);
- }
-
- // Bad ROM
- else if (row.Size != null
- && !row.NoGoodDumpKnown
- && row.Bad)
- {
- var rom = new Rom();
- rom.SetName(row.Name);
- rom.SetFieldValue(Models.Metadata.Rom.CRCKey, row.CRC);
- rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, row.SHA1);
- rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size).ToString());
- rom.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename });
- rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.BadDump.AsStringValue());
-
- // Now process and add the item
- rom.CopyMachineInformation(machine);
- ParseAddHelper(rom, statsOnly);
- }
-
- // Nodump ROM
- else if (row.Size != null
- && row.NoGoodDumpKnown)
- {
- var rom = new Rom();
- rom.SetName(row.Name);
- rom.SetFieldValue(Models.Metadata.Rom.CRCKey, null);
- rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, null);
- rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size).ToString());
- rom.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename });
- rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump.AsStringValue());
-
- // Now process and add the item
- rom.CopyMachineInformation(machine);
- ParseAddHelper(rom, statsOnly);
- }
- }
-
- #endregion
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Listrom.Writer.cs b/SabreTools.DatFiles/Formats/Listrom.Writer.cs
deleted file mode 100644
index 34e82479..00000000
--- a/SabreTools.DatFiles/Formats/Listrom.Writer.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing a MAME Listrom file
- ///
- internal partial class Listrom : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Disk,
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- switch (datItem)
- {
- case Disk disk:
- if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
- && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
- {
- missingFields.Add(Models.Metadata.Disk.SHA1Key);
- }
- break;
-
- case Rom rom:
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
- missingFields.Add(Models.Metadata.Rom.CRCKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- break;
- }
-
- return null;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var metadataFile = new Serialization.CrossModel.Listrom().Deserialize(metadata);
- if (!(new Serialization.Files.Listrom().Serialize(metadataFile, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Listrom.cs b/SabreTools.DatFiles/Formats/Listrom.cs
index e5a1458a..c63db357 100644
--- a/SabreTools.DatFiles/Formats/Listrom.cs
+++ b/SabreTools.DatFiles/Formats/Listrom.cs
@@ -1,9 +1,14 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents a MAME Listrom file
///
- internal partial class Listrom : DatFile
+ internal sealed class Listrom : SerializableDatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +18,47 @@
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Disk,
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ switch (datItem)
+ {
+ case Disk disk:
+ if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
+ && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
+ {
+ missingFields.Add(Models.Metadata.Disk.SHA1Key);
+ }
+ break;
+
+ case Rom rom:
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
+ missingFields.Add(Models.Metadata.Rom.CRCKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ break;
+ }
+
+ return null;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/Listxml.Reader.cs b/SabreTools.DatFiles/Formats/Listxml.Reader.cs
deleted file mode 100644
index 43eb3a6d..00000000
--- a/SabreTools.DatFiles/Formats/Listxml.Reader.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a MAME XML DAT
- ///
- internal partial class Listxml : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var mame = new Serialization.Files.Listxml().Deserialize(filename);
- Models.Metadata.MetadataFile? metadata;
- if (mame == null)
- {
- var m1 = new Serialization.Files.M1().Deserialize(filename);
- metadata = new Serialization.CrossModel.M1().Serialize(m1);
- }
- else
- {
- metadata = new Serialization.CrossModel.Listxml().Serialize(mame);
- }
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Listxml.Writer.cs b/SabreTools.DatFiles/Formats/Listxml.Writer.cs
deleted file mode 100644
index 32becf8b..00000000
--- a/SabreTools.DatFiles/Formats/Listxml.Writer.cs
+++ /dev/null
@@ -1,206 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.Core.Tools;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing a MAME XML DAT
- ///
- internal partial class Listxml : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Adjuster,
- ItemType.BiosSet,
- ItemType.Chip,
- ItemType.Condition,
- ItemType.Configuration,
- ItemType.Device,
- ItemType.DeviceRef,
- ItemType.DipSwitch,
- ItemType.Disk,
- ItemType.Display,
- ItemType.Driver,
- ItemType.Feature,
- ItemType.Input,
- ItemType.Port,
- ItemType.RamOption,
- ItemType.Rom,
- ItemType.Sample,
- ItemType.Slot,
- ItemType.SoftwareList,
- ItemType.Sound,
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
- switch (datItem)
- {
- case BiosSet biosset:
- if (string.IsNullOrEmpty(biosset.GetName()))
- missingFields.Add(Models.Metadata.BiosSet.NameKey);
- if (string.IsNullOrEmpty(biosset.GetStringFieldValue(Models.Metadata.BiosSet.DescriptionKey)))
- missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
- break;
-
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
- {
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- }
- break;
-
- case Disk disk:
- if (string.IsNullOrEmpty(disk.GetName()))
- missingFields.Add(Models.Metadata.Disk.NameKey);
- if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
- && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
- {
- missingFields.Add(Models.Metadata.Disk.SHA1Key);
- }
- break;
-
- case DeviceRef deviceref:
- if (string.IsNullOrEmpty(deviceref.GetName()))
- missingFields.Add(Models.Metadata.DeviceRef.NameKey);
- break;
-
- case Sample sample:
- if (string.IsNullOrEmpty(sample.GetName()))
- missingFields.Add(Models.Metadata.Sample.NameKey);
- break;
-
- case Chip chip:
- if (string.IsNullOrEmpty(chip.GetName()))
- missingFields.Add(Models.Metadata.Chip.NameKey);
- if (chip.GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey).AsEnumValue() == ChipType.NULL)
- missingFields.Add(Models.Metadata.Chip.ChipTypeKey);
- break;
-
- case Display display:
- if (display.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey).AsEnumValue() == DisplayType.NULL)
- missingFields.Add(Models.Metadata.Display.DisplayTypeKey);
- if (display.GetDoubleFieldValue(Models.Metadata.Display.RefreshKey) == null)
- missingFields.Add(Models.Metadata.Display.RefreshKey);
- break;
-
- case Sound sound:
- if (sound.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey) == null)
- missingFields.Add(Models.Metadata.Sound.ChannelsKey);
- break;
-
- case Input input:
- if (input.GetInt64FieldValue(Models.Metadata.Input.PlayersKey) == null)
- missingFields.Add(Models.Metadata.Input.PlayersKey);
- break;
-
- case DipSwitch dipswitch:
- if (string.IsNullOrEmpty(dipswitch.GetName()))
- missingFields.Add(Models.Metadata.DipSwitch.NameKey);
- if (string.IsNullOrEmpty(dipswitch.GetStringFieldValue(Models.Metadata.DipSwitch.TagKey)))
- missingFields.Add(Models.Metadata.DipSwitch.TagKey);
- break;
-
- case Configuration configuration:
- if (string.IsNullOrEmpty(configuration.GetName()))
- missingFields.Add(Models.Metadata.Configuration.NameKey);
- if (string.IsNullOrEmpty(configuration.GetStringFieldValue(Models.Metadata.Configuration.TagKey)))
- missingFields.Add(Models.Metadata.Configuration.TagKey);
- break;
-
- case Port port:
- if (string.IsNullOrEmpty(port.GetStringFieldValue(Models.Metadata.Port.TagKey)))
- missingFields.Add(Models.Metadata.Port.TagKey);
- break;
-
- case Adjuster adjuster:
- if (string.IsNullOrEmpty(adjuster.GetName()))
- missingFields.Add(Models.Metadata.Adjuster.NameKey);
- break;
-
- case Driver driver:
- if (driver.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.StatusKey);
- if (driver.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.EmulationKey);
- if (driver.GetStringFieldValue(Models.Metadata.Driver.CocktailKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.CocktailKey);
- if (driver.GetStringFieldValue(Models.Metadata.Driver.SaveStateKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.SaveStateKey);
- break;
-
- case Feature feature:
- if (feature.GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue() == FeatureType.NULL)
- missingFields.Add(Models.Metadata.Feature.FeatureTypeKey);
- break;
-
- case Device device:
- if (device.GetStringFieldValue(Models.Metadata.Device.DeviceTypeKey).AsEnumValue() != DeviceType.NULL)
- missingFields.Add(Models.Metadata.Device.DeviceTypeKey);
- break;
-
- case Slot slot:
- if (string.IsNullOrEmpty(slot.GetName()))
- missingFields.Add(Models.Metadata.Slot.NameKey);
- break;
-
- case DatItems.Formats.SoftwareList softwarelist:
- if (string.IsNullOrEmpty(softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.TagKey)))
- missingFields.Add(Models.Metadata.SoftwareList.TagKey);
- if (string.IsNullOrEmpty(softwarelist.GetName()))
- missingFields.Add(Models.Metadata.SoftwareList.NameKey);
- if (softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue() == SoftwareListStatus.None)
- missingFields.Add(Models.Metadata.SoftwareList.StatusKey);
- break;
-
- case RamOption ramoption:
- if (string.IsNullOrEmpty(ramoption.GetName()))
- missingFields.Add(Models.Metadata.RamOption.NameKey);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var mame = new Serialization.CrossModel.Listxml().Deserialize(metadata);
- if (!(new Serialization.Files.Listxml().Serialize(mame, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Listxml.cs b/SabreTools.DatFiles/Formats/Listxml.cs
index a1affc3c..f4450625 100644
--- a/SabreTools.DatFiles/Formats/Listxml.cs
+++ b/SabreTools.DatFiles/Formats/Listxml.cs
@@ -1,9 +1,16 @@
-namespace SabreTools.DatFiles.Formats
+using System;
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.Core.Tools;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
- /// Represents a MAME XML DAT
+ /// Represents a MAME/M1 XML DAT
///
- internal partial class Listxml : DatFile
+ internal sealed class Listxml : SerializableDatFile
{
///
/// DTD for original MAME XML DATs
@@ -179,5 +186,198 @@
: base(datFile)
{
}
+
+ ///
+ public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
+ {
+ try
+ {
+ // Deserialize the input file
+ var mame = new Serialization.Files.Listxml().Deserialize(filename);
+ Models.Metadata.MetadataFile? metadata;
+ if (mame == null)
+ {
+ var m1 = new Serialization.Files.M1().Deserialize(filename);
+ metadata = new Serialization.CrossModel.M1().Serialize(m1);
+ }
+ else
+ {
+ metadata = new Serialization.CrossModel.Listxml().Serialize(mame);
+ }
+
+ // Convert to the internal format
+ ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ string message = $"'{filename}' - An error occurred during parsing";
+ logger.Error(ex, message);
+ }
+ }
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Adjuster,
+ ItemType.BiosSet,
+ ItemType.Chip,
+ ItemType.Condition,
+ ItemType.Configuration,
+ ItemType.Device,
+ ItemType.DeviceRef,
+ ItemType.DipSwitch,
+ ItemType.Disk,
+ ItemType.Display,
+ ItemType.Driver,
+ ItemType.Feature,
+ ItemType.Input,
+ ItemType.Port,
+ ItemType.RamOption,
+ ItemType.Rom,
+ ItemType.Sample,
+ ItemType.Slot,
+ ItemType.SoftwareList,
+ ItemType.Sound,
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+ switch (datItem)
+ {
+ case BiosSet biosset:
+ if (string.IsNullOrEmpty(biosset.GetName()))
+ missingFields.Add(Models.Metadata.BiosSet.NameKey);
+ if (string.IsNullOrEmpty(biosset.GetStringFieldValue(Models.Metadata.BiosSet.DescriptionKey)))
+ missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
+ break;
+
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
+ {
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ }
+ break;
+
+ case Disk disk:
+ if (string.IsNullOrEmpty(disk.GetName()))
+ missingFields.Add(Models.Metadata.Disk.NameKey);
+ if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
+ && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
+ {
+ missingFields.Add(Models.Metadata.Disk.SHA1Key);
+ }
+ break;
+
+ case DeviceRef deviceref:
+ if (string.IsNullOrEmpty(deviceref.GetName()))
+ missingFields.Add(Models.Metadata.DeviceRef.NameKey);
+ break;
+
+ case Sample sample:
+ if (string.IsNullOrEmpty(sample.GetName()))
+ missingFields.Add(Models.Metadata.Sample.NameKey);
+ break;
+
+ case Chip chip:
+ if (string.IsNullOrEmpty(chip.GetName()))
+ missingFields.Add(Models.Metadata.Chip.NameKey);
+ if (chip.GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey).AsEnumValue() == ChipType.NULL)
+ missingFields.Add(Models.Metadata.Chip.ChipTypeKey);
+ break;
+
+ case Display display:
+ if (display.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey).AsEnumValue() == DisplayType.NULL)
+ missingFields.Add(Models.Metadata.Display.DisplayTypeKey);
+ if (display.GetDoubleFieldValue(Models.Metadata.Display.RefreshKey) == null)
+ missingFields.Add(Models.Metadata.Display.RefreshKey);
+ break;
+
+ case Sound sound:
+ if (sound.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey) == null)
+ missingFields.Add(Models.Metadata.Sound.ChannelsKey);
+ break;
+
+ case Input input:
+ if (input.GetInt64FieldValue(Models.Metadata.Input.PlayersKey) == null)
+ missingFields.Add(Models.Metadata.Input.PlayersKey);
+ break;
+
+ case DipSwitch dipswitch:
+ if (string.IsNullOrEmpty(dipswitch.GetName()))
+ missingFields.Add(Models.Metadata.DipSwitch.NameKey);
+ if (string.IsNullOrEmpty(dipswitch.GetStringFieldValue(Models.Metadata.DipSwitch.TagKey)))
+ missingFields.Add(Models.Metadata.DipSwitch.TagKey);
+ break;
+
+ case Configuration configuration:
+ if (string.IsNullOrEmpty(configuration.GetName()))
+ missingFields.Add(Models.Metadata.Configuration.NameKey);
+ if (string.IsNullOrEmpty(configuration.GetStringFieldValue(Models.Metadata.Configuration.TagKey)))
+ missingFields.Add(Models.Metadata.Configuration.TagKey);
+ break;
+
+ case Port port:
+ if (string.IsNullOrEmpty(port.GetStringFieldValue(Models.Metadata.Port.TagKey)))
+ missingFields.Add(Models.Metadata.Port.TagKey);
+ break;
+
+ case Adjuster adjuster:
+ if (string.IsNullOrEmpty(adjuster.GetName()))
+ missingFields.Add(Models.Metadata.Adjuster.NameKey);
+ break;
+
+ case Driver driver:
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.StatusKey);
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.EmulationKey);
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.CocktailKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.CocktailKey);
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.SaveStateKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.SaveStateKey);
+ break;
+
+ case Feature feature:
+ if (feature.GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue() == FeatureType.NULL)
+ missingFields.Add(Models.Metadata.Feature.FeatureTypeKey);
+ break;
+
+ case Device device:
+ if (device.GetStringFieldValue(Models.Metadata.Device.DeviceTypeKey).AsEnumValue() != DeviceType.NULL)
+ missingFields.Add(Models.Metadata.Device.DeviceTypeKey);
+ break;
+
+ case Slot slot:
+ if (string.IsNullOrEmpty(slot.GetName()))
+ missingFields.Add(Models.Metadata.Slot.NameKey);
+ break;
+
+ case DatItems.Formats.SoftwareList softwarelist:
+ if (string.IsNullOrEmpty(softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.TagKey)))
+ missingFields.Add(Models.Metadata.SoftwareList.TagKey);
+ if (string.IsNullOrEmpty(softwarelist.GetName()))
+ missingFields.Add(Models.Metadata.SoftwareList.NameKey);
+ if (softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue() == SoftwareListStatus.None)
+ missingFields.Add(Models.Metadata.SoftwareList.StatusKey);
+ break;
+
+ case RamOption ramoption:
+ if (string.IsNullOrEmpty(ramoption.GetName()))
+ missingFields.Add(Models.Metadata.RamOption.NameKey);
+ break;
+ }
+
+ return missingFields;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs
deleted file mode 100644
index 74723804..00000000
--- a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a Logiqx-derived DAT
- ///
- internal partial class Logiqx : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.Logiqx().Deserialize(filename);
- var metadata = new Serialization.CrossModel.Logiqx().Serialize(metadataFile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs
deleted file mode 100644
index bb472a47..00000000
--- a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.Core.Tools;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing and writing of a Logiqx-derived DAT
- ///
- internal partial class Logiqx : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Archive,
- ItemType.BiosSet,
- ItemType.Disk,
- ItemType.Media,
- ItemType.Release,
- ItemType.Rom,
- ItemType.Sample,
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
- switch (datItem)
- {
- case Release release:
- if (string.IsNullOrEmpty(release.GetName()))
- missingFields.Add(Models.Metadata.Release.NameKey);
- if (string.IsNullOrEmpty(release.GetStringFieldValue(Models.Metadata.Release.RegionKey)))
- missingFields.Add(Models.Metadata.Release.RegionKey);
- break;
-
- case BiosSet biosset:
- if (string.IsNullOrEmpty(biosset.GetName()))
- missingFields.Add(Models.Metadata.BiosSet.NameKey);
- if (string.IsNullOrEmpty(biosset.GetStringFieldValue(Models.Metadata.BiosSet.DescriptionKey)))
- missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
- break;
-
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
- {
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- }
- break;
-
- case Disk disk:
- if (string.IsNullOrEmpty(disk.GetName()))
- missingFields.Add(Models.Metadata.Disk.NameKey);
- if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
- && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
- {
- missingFields.Add(Models.Metadata.Disk.SHA1Key);
- }
- break;
-
- case Media media:
- if (string.IsNullOrEmpty(media.GetName()))
- missingFields.Add(Models.Metadata.Media.NameKey);
- if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.MD5Key))
- && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key))
- && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA256Key))
- && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)))
- {
- missingFields.Add(Models.Metadata.Media.SHA1Key);
- }
- break;
-
- case DeviceRef deviceref:
- if (string.IsNullOrEmpty(deviceref.GetName()))
- missingFields.Add(Models.Metadata.DeviceRef.NameKey);
- break;
-
- case Sample sample:
- if (string.IsNullOrEmpty(sample.GetName()))
- missingFields.Add(Models.Metadata.Sample.NameKey);
- break;
-
- case Archive archive:
- if (string.IsNullOrEmpty(archive.GetName()))
- missingFields.Add(Models.Metadata.Archive.NameKey);
- break;
-
- case Driver driver:
- if (driver.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.StatusKey);
- if (driver.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.EmulationKey);
- if (driver.GetStringFieldValue(Models.Metadata.Driver.CocktailKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.CocktailKey);
- if (driver.GetStringFieldValue(Models.Metadata.Driver.SaveStateKey).AsEnumValue() == SupportStatus.NULL)
- missingFields.Add(Models.Metadata.Driver.SaveStateKey);
- break;
-
- case DatItems.Formats.SoftwareList softwarelist:
- if (string.IsNullOrEmpty(softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.TagKey)))
- missingFields.Add(Models.Metadata.SoftwareList.TagKey);
- if (string.IsNullOrEmpty(softwarelist.GetName()))
- missingFields.Add(Models.Metadata.SoftwareList.NameKey);
- if (softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue() == SoftwareListStatus.None)
- missingFields.Add(Models.Metadata.SoftwareList.StatusKey);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var datafile = new Serialization.CrossModel.Logiqx().Deserialize(metadata);
-
- // Only write the doctype if we don't have No-Intro data
- bool success;
- if (string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.IdKey)))
- success = new Serialization.Files.Logiqx().SerializeToFileWithDocType(datafile!, outfile);
- else
- success = new Serialization.Files.Logiqx().Serialize(datafile, outfile);
-
- if (!success)
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Logiqx.cs b/SabreTools.DatFiles/Formats/Logiqx.cs
index cafaab94..8dcdb187 100644
--- a/SabreTools.DatFiles/Formats/Logiqx.cs
+++ b/SabreTools.DatFiles/Formats/Logiqx.cs
@@ -1,9 +1,16 @@
-namespace SabreTools.DatFiles.Formats
+using System;
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.Core.Tools;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents a Logiqx-derived DAT
///
- internal partial class Logiqx : DatFile
+ internal sealed class Logiqx : SerializableDatFile
{
// Private instance variables specific to Logiqx DATs
private readonly bool _deprecated;
@@ -224,5 +231,152 @@
{
_deprecated = deprecated;
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Archive,
+ ItemType.BiosSet,
+ ItemType.Disk,
+ ItemType.Media,
+ ItemType.Release,
+ ItemType.Rom,
+ ItemType.Sample,
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+ switch (datItem)
+ {
+ case Release release:
+ if (string.IsNullOrEmpty(release.GetName()))
+ missingFields.Add(Models.Metadata.Release.NameKey);
+ if (string.IsNullOrEmpty(release.GetStringFieldValue(Models.Metadata.Release.RegionKey)))
+ missingFields.Add(Models.Metadata.Release.RegionKey);
+ break;
+
+ case BiosSet biosset:
+ if (string.IsNullOrEmpty(biosset.GetName()))
+ missingFields.Add(Models.Metadata.BiosSet.NameKey);
+ if (string.IsNullOrEmpty(biosset.GetStringFieldValue(Models.Metadata.BiosSet.DescriptionKey)))
+ missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
+ break;
+
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
+ {
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ }
+ break;
+
+ case Disk disk:
+ if (string.IsNullOrEmpty(disk.GetName()))
+ missingFields.Add(Models.Metadata.Disk.NameKey);
+ if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
+ && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
+ {
+ missingFields.Add(Models.Metadata.Disk.SHA1Key);
+ }
+ break;
+
+ case Media media:
+ if (string.IsNullOrEmpty(media.GetName()))
+ missingFields.Add(Models.Metadata.Media.NameKey);
+ if (string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.MD5Key))
+ && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key))
+ && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA256Key))
+ && string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)))
+ {
+ missingFields.Add(Models.Metadata.Media.SHA1Key);
+ }
+ break;
+
+ case DeviceRef deviceref:
+ if (string.IsNullOrEmpty(deviceref.GetName()))
+ missingFields.Add(Models.Metadata.DeviceRef.NameKey);
+ break;
+
+ case Sample sample:
+ if (string.IsNullOrEmpty(sample.GetName()))
+ missingFields.Add(Models.Metadata.Sample.NameKey);
+ break;
+
+ case Archive archive:
+ if (string.IsNullOrEmpty(archive.GetName()))
+ missingFields.Add(Models.Metadata.Archive.NameKey);
+ break;
+
+ case Driver driver:
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.StatusKey);
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.EmulationKey);
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.CocktailKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.CocktailKey);
+ if (driver.GetStringFieldValue(Models.Metadata.Driver.SaveStateKey).AsEnumValue() == SupportStatus.NULL)
+ missingFields.Add(Models.Metadata.Driver.SaveStateKey);
+ break;
+
+ case DatItems.Formats.SoftwareList softwarelist:
+ if (string.IsNullOrEmpty(softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.TagKey)))
+ missingFields.Add(Models.Metadata.SoftwareList.TagKey);
+ if (string.IsNullOrEmpty(softwarelist.GetName()))
+ missingFields.Add(Models.Metadata.SoftwareList.NameKey);
+ if (softwarelist.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue() == SoftwareListStatus.None)
+ missingFields.Add(Models.Metadata.SoftwareList.StatusKey);
+ break;
+ }
+
+ return missingFields;
+ }
+
+ ///
+ public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
+ {
+ try
+ {
+ logger.User($"Writing to '{outfile}'...");
+
+ // Serialize the input file
+ var metadata = ConvertMetadata(ignoreblanks);
+ var datafile = new Serialization.CrossModel.Logiqx().Deserialize(metadata);
+
+ // Only write the doctype if we don't have No-Intro data
+ bool success;
+ if (string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.IdKey)))
+ success = new Serialization.Files.Logiqx().SerializeToFileWithDocType(datafile!, outfile);
+ else
+ success = new Serialization.Files.Logiqx().Serialize(datafile, outfile);
+
+ if (!success)
+ {
+ logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
+ return false;
+ }
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ logger.Error(ex);
+ return false;
+ }
+
+ logger.User($"'{outfile}' written!{Environment.NewLine}");
+ return true;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/Missfile.Reader.cs b/SabreTools.DatFiles/Formats/Missfile.Reader.cs
deleted file mode 100644
index fa12a0bf..00000000
--- a/SabreTools.DatFiles/Formats/Missfile.Reader.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a Missfile
- ///
- internal partial class Missfile : DatFile
- {
- ///
- /// There is no consistent way to parse a missfile
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- throw new NotImplementedException();
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Missfile.Writer.cs b/SabreTools.DatFiles/Formats/Missfile.Writer.cs
deleted file mode 100644
index bddf0fac..00000000
--- a/SabreTools.DatFiles/Formats/Missfile.Writer.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using SabreTools.Core;
-using SabreTools.DatItems;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing a Missfile
- ///
- internal partial class Missfile : DatFile
- {
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- // TODO: Check required fields
- return null;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
- FileStream fs = File.Create(outfile);
-
- // If we get back null for some reason, just log and return
- if (fs == null)
- {
- logger.Warning($"File '{outfile}' could not be created for writing! Please check to see if the file is writable");
- return false;
- }
-
- StreamWriter sw = new(fs, new UTF8Encoding(false));
-
- // Write out each of the machines and roms
- string? lastgame = null;
-
- // Use a sorted list of games to output
- foreach (string key in Items.SortedKeys)
- {
- ConcurrentList datItems = Items.FilteredItems(key);
-
- // If this machine doesn't contain any writable items, skip
- if (!ContainsWritable(datItems))
- continue;
-
- // Resolve the names in the block
- datItems = DatItem.ResolveNames(datItems);
-
- for (int index = 0; index < datItems.Count; index++)
- {
- DatItem datItem = datItems[index];
-
- // Check for a "null" item
- datItem = ProcessNullifiedItem(datItem);
-
- // Write out the item if we're using machine names or we're not ignoring
- if (!Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true || !ShouldIgnore(datItem, ignoreblanks))
- WriteDatItem(sw, datItem, lastgame);
-
- // Set the new data to compare against
- lastgame = datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey);
- }
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- sw.Dispose();
- fs.Dispose();
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- return true;
- }
-
- ///
- /// Write out DatItem using the supplied StreamWriter
- ///
- /// StreamWriter to output to
- /// DatItem object to be output
- /// The name of the last game to be output
- private void WriteDatItem(StreamWriter sw, DatItem datItem, string? lastgame)
- {
- // Process the item name
- ProcessItemName(datItem, false, forceRomName: false);
-
- // Romba mode automatically uses item name
- if (Header.GetFieldValue(DatHeader.OutputDepotKey)?.IsActive == true || Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true)
- sw.Write($"{datItem.GetName() ?? string.Empty}\n");
- else if (!Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) != lastgame)
- sw.Write($"{datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty}\n");
-
- sw.Flush();
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/Missfile.cs b/SabreTools.DatFiles/Formats/Missfile.cs
index 4c97bad9..40b4e950 100644
--- a/SabreTools.DatFiles/Formats/Missfile.cs
+++ b/SabreTools.DatFiles/Formats/Missfile.cs
@@ -1,9 +1,16 @@
-namespace SabreTools.DatFiles.Formats
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using SabreTools.Core;
+using SabreTools.DatItems;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents a Missfile
///
- internal partial class Missfile : DatFile
+ internal sealed class Missfile : DatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +20,100 @@
: base(datFile)
{
}
+
+ ///
+ /// There is no consistent way to parse a missfile
+ public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ // TODO: Check required fields
+ return null;
+ }
+
+ ///
+ public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
+ {
+ try
+ {
+ logger.User($"Writing to '{outfile}'...");
+ FileStream fs = File.Create(outfile);
+
+ // If we get back null for some reason, just log and return
+ if (fs == null)
+ {
+ logger.Warning($"File '{outfile}' could not be created for writing! Please check to see if the file is writable");
+ return false;
+ }
+
+ StreamWriter sw = new(fs, new UTF8Encoding(false));
+
+ // Write out each of the machines and roms
+ string? lastgame = null;
+
+ // Use a sorted list of games to output
+ foreach (string key in Items.SortedKeys)
+ {
+ ConcurrentList datItems = Items.FilteredItems(key);
+
+ // If this machine doesn't contain any writable items, skip
+ if (!ContainsWritable(datItems))
+ continue;
+
+ // Resolve the names in the block
+ datItems = DatItem.ResolveNames(datItems);
+
+ for (int index = 0; index < datItems.Count; index++)
+ {
+ DatItem datItem = datItems[index];
+
+ // Check for a "null" item
+ datItem = ProcessNullifiedItem(datItem);
+
+ // Write out the item if we're using machine names or we're not ignoring
+ if (!Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true || !ShouldIgnore(datItem, ignoreblanks))
+ WriteDatItem(sw, datItem, lastgame);
+
+ // Set the new data to compare against
+ lastgame = datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey);
+ }
+ }
+
+ logger.User($"'{outfile}' written!{Environment.NewLine}");
+ sw.Dispose();
+ fs.Dispose();
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ logger.Error(ex);
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Write out DatItem using the supplied StreamWriter
+ ///
+ /// StreamWriter to output to
+ /// DatItem object to be output
+ /// The name of the last game to be output
+ private void WriteDatItem(StreamWriter sw, DatItem datItem, string? lastgame)
+ {
+ // Process the item name
+ ProcessItemName(datItem, false, forceRomName: false);
+
+ // Romba mode automatically uses item name
+ if (Header.GetFieldValue(DatHeader.OutputDepotKey)?.IsActive == true || Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true)
+ sw.Write($"{datItem.GetName() ?? string.Empty}\n");
+ else if (!Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) != lastgame)
+ sw.Write($"{datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty}\n");
+
+ sw.Flush();
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs b/SabreTools.DatFiles/Formats/OfflineList.Reader.cs
deleted file mode 100644
index 4f8e8b7f..00000000
--- a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing an OfflineList XML DAT
- ///
- internal partial class OfflineList : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var dat = new Serialization.Files.OfflineList().Deserialize(filename);
- var metadata = new Serialization.CrossModel.OfflineList().Serialize(dat);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/OfflineList.Writer.cs b/SabreTools.DatFiles/Formats/OfflineList.Writer.cs
deleted file mode 100644
index 9a6623b9..00000000
--- a/SabreTools.DatFiles/Formats/OfflineList.Writer.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing an OfflineList XML DAT
- ///
- internal partial class OfflineList : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- switch (datItem)
- {
- case Rom rom:
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
- missingFields.Add(Models.Metadata.Rom.CRCKey);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var datafile = new Serialization.CrossModel.OfflineList().Deserialize(metadata);
- if (!(new Serialization.Files.OfflineList().Serialize(datafile, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/OfflineList.cs b/SabreTools.DatFiles/Formats/OfflineList.cs
index 0d96677a..29ad90e8 100644
--- a/SabreTools.DatFiles/Formats/OfflineList.cs
+++ b/SabreTools.DatFiles/Formats/OfflineList.cs
@@ -1,9 +1,14 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents an OfflineList XML DAT
///
- internal partial class OfflineList : DatFile
+ internal sealed class OfflineList : SerializableDatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +18,32 @@
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ switch (datItem)
+ {
+ case Rom rom:
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
+ missingFields.Add(Models.Metadata.Rom.CRCKey);
+ break;
+ }
+
+ return missingFields;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs b/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs
deleted file mode 100644
index ef04ebf9..00000000
--- a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing an openMSX softawre list XML DAT
- ///
- internal partial class OpenMSX : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var softwareDb = new Serialization.Files.OpenMSX().Deserialize(filename);
- var metadata = new Serialization.CrossModel.OpenMSX().Serialize(softwareDb);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs b/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs
deleted file mode 100644
index f555e4b1..00000000
--- a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs
+++ /dev/null
@@ -1,189 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using SabreTools.Core;
-using SabreTools.Core.Tools;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing an openMSX softawre list XML DAT
- ///
- internal partial class OpenMSX : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- switch (datItem)
- {
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // TODO: Write out comment prefix somehow
- //var softwaredb = CreateSoftwareDb(ignoreblanks);
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var softwaredb = new Serialization.CrossModel.OpenMSX().Deserialize(metadata);
- if (!(new Serialization.Files.OpenMSX().SerializeToFileWithDocType(softwaredb!, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
-
- #region Converters
-
- ///
- /// Create a SoftwareDb from the current internal information
- ///
- /// True if blank roms should be skipped on output, false otherwise
- private Models.OpenMSX.SoftwareDb CreateSoftwareDb(bool ignoreblanks)
- {
- var softwaredb = new Models.OpenMSX.SoftwareDb
- {
- Timestamp = Header.GetStringFieldValue(Models.Metadata.Header.DateKey),
- Software = CreateSoftwares(ignoreblanks)
- };
- return softwaredb;
- }
-
- ///
- /// Create an array of Software from the current internal information
- ///
- /// True if blank roms should be skipped on output, false otherwise
- private Models.OpenMSX.Software[]? CreateSoftwares(bool ignoreblanks)
- {
- // If we don't have items, we can't do anything
- if (this.Items == null || !this.Items.Any())
- return null;
-
- // Create a list of hold the games
- var softwares = new List();
-
- // Loop through the sorted items and create games for them
- foreach (string key in Items.SortedKeys)
- {
- var items = Items.FilteredItems(key);
- if (items == null || !items.Any())
- continue;
-
- // Get the first item for game information
- var machine = items[0].GetFieldValue(DatItem.MachineKey);
- var software = new Models.OpenMSX.Software
- {
- Title = machine?.GetStringFieldValue(Models.Metadata.Machine.NameKey),
- GenMSXID = machine?.GetStringFieldValue(Models.Metadata.Machine.GenMSXIDKey),
- System = machine?.GetStringFieldValue(Models.Metadata.Machine.SystemKey),
- Company = machine?.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey),
- Year = machine?.GetStringFieldValue(Models.Metadata.Machine.YearKey),
- Country = machine?.GetStringFieldValue(Models.Metadata.Machine.CountryKey),
- };
-
- // Create holder for dumps
- var dumps = new List();
-
- // Loop through and convert the items to respective lists
- for (int index = 0; index < items.Count; index++)
- {
- // Get the item
- var item = items[index];
-
- // Check for a "null" item
- item = ProcessNullifiedItem(item);
-
- // Skip if we're ignoring the item
- if (ShouldIgnore(item, ignoreblanks))
- continue;
-
- switch (item)
- {
- case Rom rom:
- dumps.Add(CreateDump(rom));
- break;
- }
- }
-
- software.Dump = [.. dumps];
- softwares.Add(software);
- }
-
- return [.. softwares];
- }
-
- ///
- /// Create a Dump from the current Rom DatItem
- ///
- private static Models.OpenMSX.Dump CreateDump(Rom item)
- {
- Models.OpenMSX.Original? original = null;
- if (item.OriginalSpecified && item.GetFieldValue("ORIGINAL") != null)
- {
- original = new Models.OpenMSX.Original { Content = item.GetFieldValue("ORIGINAL")!.Content };
- if (item.GetFieldValue("ORIGINAL")!.Value != null)
- original.Value = item.GetFieldValue("ORIGINAL")!.Value.ToString();
- }
-
- Models.OpenMSX.RomBase rom = item.GetStringFieldValue(Models.Metadata.Rom.OpenMSXMediaType).AsEnumValue() switch
- {
- OpenMSXSubType.MegaRom => new Models.OpenMSX.MegaRom(),
- OpenMSXSubType.SCCPlusCart => new Models.OpenMSX.SCCPlusCart(),
- _ => new Models.OpenMSX.Rom(),
- };
-
- rom.Start = item.GetStringFieldValue(Models.Metadata.Rom.StartKey);
- rom.Type = item.GetStringFieldValue(Models.Metadata.Rom.OpenMSXType);
- rom.Hash = item.GetStringFieldValue(Models.Metadata.Rom.SHA1Key);
- rom.Remark = item.GetStringFieldValue(Models.Metadata.Rom.RemarkKey);
-
- var dump = new Models.OpenMSX.Dump
- {
- Original = original,
- Rom = rom,
- };
-
- return dump;
- }
-
- #endregion
- }
-}
diff --git a/SabreTools.DatFiles/Formats/OpenMSX.cs b/SabreTools.DatFiles/Formats/OpenMSX.cs
index 4955823d..80161780 100644
--- a/SabreTools.DatFiles/Formats/OpenMSX.cs
+++ b/SabreTools.DatFiles/Formats/OpenMSX.cs
@@ -1,9 +1,14 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents an openMSX softawre list XML DAT
///
- internal partial class OpenMSX : DatFile
+ internal sealed class OpenMSX : SerializableDatFile
{
///
/// DTD for original openMSX DATs
@@ -44,5 +49,34 @@ The softwaredb.xml file contains information about rom mapper types
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ switch (datItem)
+ {
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ break;
+ }
+
+ return missingFields;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs b/SabreTools.DatFiles/Formats/RomCenter.Reader.cs
deleted file mode 100644
index c30e086e..00000000
--- a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a RomCenter INI file
- ///
- internal partial class RomCenter : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.RomCenter().Deserialize(filename);
- var metadata = new Serialization.CrossModel.RomCenter().Serialize(metadataFile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/RomCenter.Writer.cs b/SabreTools.DatFiles/Formats/RomCenter.Writer.cs
deleted file mode 100644
index c0b7e2d1..00000000
--- a/SabreTools.DatFiles/Formats/RomCenter.Writer.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing a RomCenter INI file
- ///
- internal partial class RomCenter : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- switch (datItem)
- {
- case Rom rom:
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
- missingFields.Add(Models.Metadata.Rom.CRCKey);
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var metadataFile = new Serialization.CrossModel.RomCenter().Deserialize(metadata);
- if (!(new Serialization.Files.RomCenter().Serialize(metadataFile, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/RomCenter.cs b/SabreTools.DatFiles/Formats/RomCenter.cs
index 813ad260..4c29a51b 100644
--- a/SabreTools.DatFiles/Formats/RomCenter.cs
+++ b/SabreTools.DatFiles/Formats/RomCenter.cs
@@ -1,9 +1,14 @@
-namespace SabreTools.DatFiles.Formats
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents a RomCenter INI file
///
- internal partial class RomCenter : DatFile
+ internal sealed class RomCenter : SerializableDatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -13,5 +18,36 @@
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ switch (datItem)
+ {
+ case Rom rom:
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
+ missingFields.Add(Models.Metadata.Rom.CRCKey);
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ break;
+ }
+
+ return missingFields;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs b/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs
deleted file mode 100644
index d6c519f5..00000000
--- a/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a value-separated DAT
- ///
- internal partial class SeparatedValue : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var metadataFile = new Serialization.Files.SeparatedValue().Deserialize(filename, _delim);
- var metadata = new Serialization.CrossModel.SeparatedValue().Serialize(metadataFile);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs b/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs
deleted file mode 100644
index 07041dfb..00000000
--- a/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing a value-separated DAT
- ///
- internal partial class SeparatedValue : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.Disk,
- ItemType.Media,
- ItemType.Rom
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- // Check item name
- if (string.IsNullOrEmpty(datItem.GetName()))
- missingFields.Add(Models.Metadata.Rom.NameKey);
-
- switch (datItem)
- {
- case Disk disk:
- if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
- && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
- {
- missingFields.Add(Models.Metadata.Disk.SHA1Key);
- }
- break;
-
- case Rom rom:
- if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
- missingFields.Add(Models.Metadata.Rom.SizeKey);
- if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))
- && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
- {
- missingFields.Add(Models.Metadata.Rom.SHA1Key);
- }
- break;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var metadataFile = new Serialization.CrossModel.SeparatedValue().Deserialize(metadata);
- if (!(new Serialization.Files.SeparatedValue().Serialize(metadataFile, outfile, _delim)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.cs b/SabreTools.DatFiles/Formats/SeparatedValue.cs
index 33bc42e7..9719d603 100644
--- a/SabreTools.DatFiles/Formats/SeparatedValue.cs
+++ b/SabreTools.DatFiles/Formats/SeparatedValue.cs
@@ -1,9 +1,15 @@
-namespace SabreTools.DatFiles.Formats
+using System;
+using System.Collections.Generic;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
+namespace SabreTools.DatFiles.Formats
{
///
/// Represents a value-separated DAT
///
- internal partial class SeparatedValue : DatFile
+ internal sealed class SeparatedValue : SerializableDatFile
{
// Private instance variables specific to Separated Value DATs
private readonly char _delim;
@@ -18,5 +24,99 @@
{
_delim = delim;
}
+
+ ///
+ public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
+ {
+ try
+ {
+ // Deserialize the input file
+ var metadataFile = new Serialization.Files.SeparatedValue().Deserialize(filename, _delim);
+ var metadata = new Serialization.CrossModel.SeparatedValue().Serialize(metadataFile);
+
+ // Convert to the internal format
+ ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ string message = $"'{filename}' - An error occurred during parsing";
+ logger.Error(ex, message);
+ }
+ }
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.Disk,
+ ItemType.Media,
+ ItemType.Rom
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ // Check item name
+ if (string.IsNullOrEmpty(datItem.GetName()))
+ missingFields.Add(Models.Metadata.Rom.NameKey);
+
+ switch (datItem)
+ {
+ case Disk disk:
+ if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))
+ && string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
+ {
+ missingFields.Add(Models.Metadata.Disk.SHA1Key);
+ }
+ break;
+
+ case Rom rom:
+ if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) < 0)
+ missingFields.Add(Models.Metadata.Rom.SizeKey);
+ if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))
+ && string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
+ {
+ missingFields.Add(Models.Metadata.Rom.SHA1Key);
+ }
+ break;
+ }
+
+ return missingFields;
+ }
+
+ ///
+ public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
+ {
+ try
+ {
+ logger.User($"Writing to '{outfile}'...");
+
+ // Serialize the input file
+ var metadata = ConvertMetadata(ignoreblanks);
+ var metadataFile = new Serialization.CrossModel.SeparatedValue().Deserialize(metadata);
+ if (!(new Serialization.Files.SeparatedValue().Serialize(metadataFile, outfile, _delim)))
+ {
+ logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
+ return false;
+ }
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ logger.Error(ex);
+ return false;
+ }
+
+ logger.User($"'{outfile}' written!{Environment.NewLine}");
+ return true;
+ }
}
}
diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs b/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs
deleted file mode 100644
index fa8fa8b5..00000000
--- a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents parsing a SoftwareList
- ///
- internal partial class SoftwareList : DatFile
- {
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- try
- {
- // Deserialize the input file
- var softwarelist = new Serialization.Files.SoftwareList().Deserialize(filename);
- var metadata = new Serialization.CrossModel.SoftwareList().Serialize(softwarelist);
-
- // Convert to the internal format
- ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
- }
- catch (Exception ex) when (!throwOnError)
- {
- string message = $"'{filename}' - An error occurred during parsing";
- logger.Error(ex, message);
- }
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs
deleted file mode 100644
index b7e824dd..00000000
--- a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using SabreTools.Core;
-using SabreTools.DatItems;
-using SabreTools.DatItems.Formats;
-
-namespace SabreTools.DatFiles.Formats
-{
- ///
- /// Represents writing a SoftwareList
- ///
- internal partial class SoftwareList : DatFile
- {
- ///
- protected override ItemType[] GetSupportedTypes()
- {
- return
- [
- ItemType.DipSwitch,
- ItemType.Disk,
- ItemType.Info,
- ItemType.PartFeature,
- ItemType.Rom,
- ItemType.SharedFeat,
- ];
- }
-
- ///
- protected override List? GetMissingRequiredFields(DatItem datItem)
- {
- var missingFields = new List();
-
- switch (datItem)
- {
- case DipSwitch dipSwitch:
- if (!dipSwitch.PartSpecified)
- {
- missingFields.Add(Models.Metadata.Part.NameKey);
- missingFields.Add(Models.Metadata.Part.InterfaceKey);
- }
- else
- {
- if (string.IsNullOrEmpty(dipSwitch.GetFieldValue(DipSwitch.PartKey)!.GetName()))
- missingFields.Add(Models.Metadata.Part.NameKey);
- if (string.IsNullOrEmpty(dipSwitch.GetFieldValue(DipSwitch.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey)))
- missingFields.Add(Models.Metadata.Part.InterfaceKey);
- }
- if (string.IsNullOrEmpty(dipSwitch.GetName()))
- missingFields.Add(Models.Metadata.DipSwitch.NameKey);
- if (string.IsNullOrEmpty(dipSwitch.GetStringFieldValue(Models.Metadata.DipSwitch.TagKey)))
- missingFields.Add(Models.Metadata.DipSwitch.TagKey);
- if (string.IsNullOrEmpty(dipSwitch.GetStringFieldValue(Models.Metadata.DipSwitch.MaskKey)))
- missingFields.Add(Models.Metadata.DipSwitch.MaskKey);
- if (dipSwitch.ValuesSpecified)
- {
- if (dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey)!.Any(dv => string.IsNullOrEmpty(dv.GetName())))
- missingFields.Add(Models.Metadata.DipValue.NameKey);
- if (dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey)!.Any(dv => string.IsNullOrEmpty(dv.GetStringFieldValue(Models.Metadata.DipValue.ValueKey))))
- missingFields.Add(Models.Metadata.DipValue.ValueKey);
- }
-
- break;
-
- case Disk disk:
- if (!disk.PartSpecified)
- {
- missingFields.Add(Models.Metadata.Part.NameKey);
- missingFields.Add(Models.Metadata.Part.InterfaceKey);
- }
- else
- {
- if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.PartKey)!.GetName()))
- missingFields.Add(Models.Metadata.Part.NameKey);
- if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey)))
- missingFields.Add(Models.Metadata.Part.InterfaceKey);
- }
- if (!disk.DiskAreaSpecified)
- {
- missingFields.Add(Models.Metadata.DiskArea.NameKey);
- }
- else
- {
- if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.DiskAreaKey)!.GetName()))
- missingFields.Add(Models.Metadata.DiskArea.NameKey);
- }
- if (string.IsNullOrEmpty(disk.GetName()))
- missingFields.Add(Models.Metadata.Disk.NameKey);
- break;
-
- case Info info:
- if (string.IsNullOrEmpty(info.GetName()))
- missingFields.Add(Models.Metadata.Info.NameKey);
- break;
-
- case Rom rom:
- if (!rom.PartSpecified)
- {
- missingFields.Add(Models.Metadata.Part.NameKey);
- missingFields.Add(Models.Metadata.Part.InterfaceKey);
- }
- else
- {
- if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.PartKey)!.GetName()))
- missingFields.Add(Models.Metadata.Part.NameKey);
- if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey)))
- missingFields.Add(Models.Metadata.Part.InterfaceKey);
- }
- if (!rom.DataAreaSpecified)
- {
- missingFields.Add(Models.Metadata.DataArea.NameKey);
- missingFields.Add(Models.Metadata.DataArea.SizeKey);
- }
- else
- {
- if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.DataAreaKey)!.GetName()))
- missingFields.Add(Models.Metadata.DataArea.NameKey);
- if (rom.GetFieldValue(Rom.DataAreaKey)!.GetInt64FieldValue(Models.Metadata.DataArea.SizeKey) == null)
- missingFields.Add(Models.Metadata.DataArea.SizeKey);
- }
- break;
-
- case SharedFeat sharedFeat:
- if (string.IsNullOrEmpty(sharedFeat.GetName()))
- missingFields.Add(Models.Metadata.SharedFeat.NameKey);
- break;
- default:
- // Unsupported ItemTypes should be caught already
- return null;
- }
-
- return missingFields;
- }
-
- ///
- public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
- {
- try
- {
- logger.User($"Writing to '{outfile}'...");
-
- // Serialize the input file
- var metadata = ConvertMetadata(ignoreblanks);
- var softwarelist = new Serialization.CrossModel.SoftwareList().Deserialize(metadata);
- if (!(new Serialization.Files.SoftwareList().SerializeToFileWithDocType(softwarelist!, outfile)))
- {
- logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
- return false;
- }
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- return true;
- }
- }
-}
diff --git a/SabreTools.DatFiles/Formats/SoftwareList.cs b/SabreTools.DatFiles/Formats/SoftwareList.cs
index a1dd9f2d..19045e07 100644
--- a/SabreTools.DatFiles/Formats/SoftwareList.cs
+++ b/SabreTools.DatFiles/Formats/SoftwareList.cs
@@ -1,13 +1,15 @@
-// TODO: Use softwarelist.dtd and *try* to make this write more correctly
+using System.Collections.Generic;
+using System.Linq;
+using SabreTools.Core;
+using SabreTools.DatItems;
+using SabreTools.DatItems.Formats;
+
namespace SabreTools.DatFiles.Formats
{
///
/// Represents parsing and writing of a SoftwareList
///
- ///
- /// TODO: Check and enforce required fields in output
- ///
- internal partial class SoftwareList : DatFile
+ internal sealed class SoftwareList : SerializableDatFile
{
///
/// DTD for original MAME Software List DATs
@@ -78,5 +80,125 @@ namespace SabreTools.DatFiles.Formats
: base(datFile)
{
}
+
+ ///
+ protected override ItemType[] GetSupportedTypes()
+ {
+ return
+ [
+ ItemType.DipSwitch,
+ ItemType.Disk,
+ ItemType.Info,
+ ItemType.PartFeature,
+ ItemType.Rom,
+ ItemType.SharedFeat,
+ ];
+ }
+
+ ///
+ protected override List? GetMissingRequiredFields(DatItem datItem)
+ {
+ var missingFields = new List();
+
+ switch (datItem)
+ {
+ case DipSwitch dipSwitch:
+ if (!dipSwitch.PartSpecified)
+ {
+ missingFields.Add(Models.Metadata.Part.NameKey);
+ missingFields.Add(Models.Metadata.Part.InterfaceKey);
+ }
+ else
+ {
+ if (string.IsNullOrEmpty(dipSwitch.GetFieldValue(DipSwitch.PartKey)!.GetName()))
+ missingFields.Add(Models.Metadata.Part.NameKey);
+ if (string.IsNullOrEmpty(dipSwitch.GetFieldValue(DipSwitch.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey)))
+ missingFields.Add(Models.Metadata.Part.InterfaceKey);
+ }
+ if (string.IsNullOrEmpty(dipSwitch.GetName()))
+ missingFields.Add(Models.Metadata.DipSwitch.NameKey);
+ if (string.IsNullOrEmpty(dipSwitch.GetStringFieldValue(Models.Metadata.DipSwitch.TagKey)))
+ missingFields.Add(Models.Metadata.DipSwitch.TagKey);
+ if (string.IsNullOrEmpty(dipSwitch.GetStringFieldValue(Models.Metadata.DipSwitch.MaskKey)))
+ missingFields.Add(Models.Metadata.DipSwitch.MaskKey);
+ if (dipSwitch.ValuesSpecified)
+ {
+ if (dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey)!.Any(dv => string.IsNullOrEmpty(dv.GetName())))
+ missingFields.Add(Models.Metadata.DipValue.NameKey);
+ if (dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey)!.Any(dv => string.IsNullOrEmpty(dv.GetStringFieldValue(Models.Metadata.DipValue.ValueKey))))
+ missingFields.Add(Models.Metadata.DipValue.ValueKey);
+ }
+
+ break;
+
+ case Disk disk:
+ if (!disk.PartSpecified)
+ {
+ missingFields.Add(Models.Metadata.Part.NameKey);
+ missingFields.Add(Models.Metadata.Part.InterfaceKey);
+ }
+ else
+ {
+ if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.PartKey)!.GetName()))
+ missingFields.Add(Models.Metadata.Part.NameKey);
+ if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey)))
+ missingFields.Add(Models.Metadata.Part.InterfaceKey);
+ }
+ if (!disk.DiskAreaSpecified)
+ {
+ missingFields.Add(Models.Metadata.DiskArea.NameKey);
+ }
+ else
+ {
+ if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.DiskAreaKey)!.GetName()))
+ missingFields.Add(Models.Metadata.DiskArea.NameKey);
+ }
+ if (string.IsNullOrEmpty(disk.GetName()))
+ missingFields.Add(Models.Metadata.Disk.NameKey);
+ break;
+
+ case Info info:
+ if (string.IsNullOrEmpty(info.GetName()))
+ missingFields.Add(Models.Metadata.Info.NameKey);
+ break;
+
+ case Rom rom:
+ if (!rom.PartSpecified)
+ {
+ missingFields.Add(Models.Metadata.Part.NameKey);
+ missingFields.Add(Models.Metadata.Part.InterfaceKey);
+ }
+ else
+ {
+ if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.PartKey)!.GetName()))
+ missingFields.Add(Models.Metadata.Part.NameKey);
+ if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey)))
+ missingFields.Add(Models.Metadata.Part.InterfaceKey);
+ }
+ if (!rom.DataAreaSpecified)
+ {
+ missingFields.Add(Models.Metadata.DataArea.NameKey);
+ missingFields.Add(Models.Metadata.DataArea.SizeKey);
+ }
+ else
+ {
+ if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.DataAreaKey)!.GetName()))
+ missingFields.Add(Models.Metadata.DataArea.NameKey);
+ if (rom.GetFieldValue(Rom.DataAreaKey)!.GetInt64FieldValue(Models.Metadata.DataArea.SizeKey) == null)
+ missingFields.Add(Models.Metadata.DataArea.SizeKey);
+ }
+ break;
+
+ case SharedFeat sharedFeat:
+ if (string.IsNullOrEmpty(sharedFeat.GetName()))
+ missingFields.Add(Models.Metadata.SharedFeat.NameKey);
+ break;
+ default:
+ // Unsupported ItemTypes should be caught already
+ return null;
+ }
+
+ return missingFields;
+ }
}
}