From 910b87fa73e1b3a4008c7076a619d391311f4ad3 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Tue, 12 Mar 2024 19:54:43 -0400 Subject: [PATCH] Create and use base class for readers/writers --- SabreTools.DatFiles/DatFile.cs | 60 +++++ .../Formats/ArchiveDotOrg.Reader.cs | 29 --- .../Formats/ArchiveDotOrg.Writer.cs | 51 ---- SabreTools.DatFiles/Formats/ArchiveDotOrg.cs | 20 +- .../Formats/AttractMode.Reader.cs | 29 --- .../Formats/AttractMode.Writer.cs | 60 ----- SabreTools.DatFiles/Formats/AttractMode.cs | 29 ++- .../Formats/ClrMamePro.Reader.cs | 29 --- .../Formats/ClrMamePro.Writer.cs | 161 ------------- SabreTools.DatFiles/Formats/ClrMamePro.cs | 176 +++++++++++++- .../Formats/DosCenter.Reader.cs | 29 --- .../Formats/DosCenter.Writer.cs | 73 ------ SabreTools.DatFiles/Formats/DosCenter.cs | 44 +++- .../Formats/EverdriveSMDB.Reader.cs | 29 --- .../Formats/EverdriveSMDB.Writer.cs | 77 ------ SabreTools.DatFiles/Formats/EverdriveSmdb.cs | 44 +++- .../Formats/Hashfile.Reader.cs | 29 --- .../Formats/Hashfile.Writer.cs | 176 -------------- SabreTools.DatFiles/Formats/Hashfile.cs | 190 ++++++++++++++- SabreTools.DatFiles/Formats/Listrom.Reader.cs | 222 ------------------ SabreTools.DatFiles/Formats/Listrom.Writer.cs | 82 ------- SabreTools.DatFiles/Formats/Listrom.cs | 51 +++- SabreTools.DatFiles/Formats/Listxml.Reader.cs | 38 --- SabreTools.DatFiles/Formats/Listxml.Writer.cs | 206 ---------------- SabreTools.DatFiles/Formats/Listxml.cs | 206 +++++++++++++++- SabreTools.DatFiles/Formats/Logiqx.Reader.cs | 29 --- SabreTools.DatFiles/Formats/Logiqx.Writer.cs | 162 ------------- SabreTools.DatFiles/Formats/Logiqx.cs | 158 ++++++++++++- .../Formats/Missfile.Reader.cs | 17 -- .../Formats/Missfile.Writer.cs | 103 -------- SabreTools.DatFiles/Formats/Missfile.cs | 106 ++++++++- .../Formats/OfflineList.Reader.cs | 29 --- .../Formats/OfflineList.Writer.cs | 67 ------ SabreTools.DatFiles/Formats/OfflineList.cs | 36 ++- SabreTools.DatFiles/Formats/OpenMSX.Reader.cs | 29 --- SabreTools.DatFiles/Formats/OpenMSX.Writer.cs | 189 --------------- SabreTools.DatFiles/Formats/OpenMSX.cs | 38 ++- .../Formats/RomCenter.Reader.cs | 29 --- .../Formats/RomCenter.Writer.cs | 71 ------ SabreTools.DatFiles/Formats/RomCenter.cs | 40 +++- .../Formats/SeparatedValue.Reader.cs | 29 --- .../Formats/SeparatedValue.Writer.cs | 89 ------- SabreTools.DatFiles/Formats/SeparatedValue.cs | 104 +++++++- .../Formats/SoftwareList.Reader.cs | 29 --- .../Formats/SoftwareList.Writer.cs | 161 ------------- SabreTools.DatFiles/Formats/SoftwareList.cs | 132 ++++++++++- 46 files changed, 1399 insertions(+), 2388 deletions(-) delete mode 100644 SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/AttractMode.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/AttractMode.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/DosCenter.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/DosCenter.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/Hashfile.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/Hashfile.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/Listrom.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/Listrom.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/Listxml.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/Listxml.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/Logiqx.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/Logiqx.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/Missfile.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/Missfile.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/OfflineList.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/OfflineList.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/OpenMSX.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/OpenMSX.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/RomCenter.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/RomCenter.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs delete mode 100644 SabreTools.DatFiles/Formats/SoftwareList.Reader.cs delete mode 100644 SabreTools.DatFiles/Formats/SoftwareList.Writer.cs 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; + } } }