diff --git a/SabreTools.DatFiles/DatFile.MetadataConverter.cs b/SabreTools.DatFiles/DatFile.MetadataConverter.cs index 9359944a..237ceaf1 100644 --- a/SabreTools.DatFiles/DatFile.MetadataConverter.cs +++ b/SabreTools.DatFiles/DatFile.MetadataConverter.cs @@ -846,9 +846,55 @@ namespace SabreTools.DatFiles return; // Loop through the items and add - foreach (var item in items) + int index = 0; + foreach (var dump in items) { - // TODO: Handle processing of Dump items (rom, megarom, sccpluscart) + // If we don't have rom data, we can't do anything + Models.Metadata.Rom? rom = null; + OpenMSXSubType subType = OpenMSXSubType.NULL; + if (dump?.Read(Models.Metadata.Dump.RomKey) != null) + { + rom = dump.Read(Models.Metadata.Dump.RomKey); + subType = OpenMSXSubType.Rom; + } + else if (dump?.Read(Models.Metadata.Dump.MegaRomKey) != null) + { + rom = dump.Read(Models.Metadata.Dump.MegaRomKey); + subType = OpenMSXSubType.MegaRom; + } + else if (dump?.Read(Models.Metadata.Dump.SCCPlusCartKey) != null) + { + rom = dump.Read(Models.Metadata.Dump.SCCPlusCartKey); + subType = OpenMSXSubType.SCCPlusCart; + } + else + { + continue; + } + + string name = $"{machine.GetFieldValue(Models.Metadata.Machine.NameKey)}_{index++}{(!string.IsNullOrEmpty(rom!.ReadString(Models.Metadata.Rom.RemarkKey)) ? $" {rom.ReadString(Models.Metadata.Rom.RemarkKey)}" : string.Empty)}"; + + var item = new DatItems.Formats.Rom(); + item.SetName(name); + item.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.ReadString(Models.Metadata.Rom.OffsetKey)); + item.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, subType); + item.SetFieldValue(Models.Metadata.Rom.OpenMSXType, rom.ReadString(Models.Metadata.Rom.OpenMSXType)); + item.SetFieldValue(Models.Metadata.Rom.RemarkKey, rom.ReadString(Models.Metadata.Rom.RemarkKey)); + item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.ReadString(Models.Metadata.Rom.SHA1Key)); + item.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); + + if (dump.Read(Models.Metadata.Dump.OriginalKey) != null) + { + var original = dump.Read(Models.Metadata.Dump.OriginalKey)!; + item.SetFieldValue("ORIGINAL", new DatItems.Formats.Original + { + Value = original.Value.AsYesNo(), + Content = original.Content, + }); + } + + item.CopyMachineInformation(machine); + ParseAddHelper(item, statsOnly); } } diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs b/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs index bf5006c2..ef04ebf9 100644 --- a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs +++ b/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs @@ -1,9 +1,4 @@ using System; -using System.Linq; -using SabreTools.Core; -using SabreTools.Core.Tools; -using SabreTools.DatItems; -using SabreTools.DatItems.Formats; namespace SabreTools.DatFiles.Formats { @@ -19,12 +14,10 @@ namespace SabreTools.DatFiles.Formats { // Deserialize the input file var softwareDb = new Serialization.Files.OpenMSX().Deserialize(filename); + var metadata = new Serialization.CrossModel.OpenMSX().Serialize(softwareDb); - // Convert the header to the internal format - ConvertHeader(softwareDb); - - // Convert the software data to the internal format - ConvertSoftwares(softwareDb?.Software, filename, indexId, statsOnly); + // Convert to the internal format + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { @@ -32,145 +25,5 @@ namespace SabreTools.DatFiles.Formats logger.Error(ex, message); } } - - #region Converters - - /// - /// Convert header information - /// - /// Deserialized model to convert - private void ConvertHeader(Models.OpenMSX.SoftwareDb? softwaredb) - { - // If the datafile is missing, we can't do anything - if (softwaredb == null) - return; - - if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) - Header.SetFieldValue(Models.Metadata.Header.NameKey, "openMSX Software List"); - if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) - Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, Header.GetFieldValue(Models.Metadata.Header.NameKey)); - if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) - Header.SetFieldValue(Models.Metadata.Header.DateKey, softwaredb.Timestamp); - } - - /// - /// Convert softwares 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 ConvertSoftwares(Models.OpenMSX.Software[]? softwares, string filename, int indexId, bool statsOnly) - { - // If the software array is missing, we can't do anything - if (softwares == null || !softwares.Any()) - return; - - // Loop through the software and add - foreach (var software in softwares) - { - ConvertSoftware(software, filename, indexId, statsOnly); - } - } - - /// - /// Convert software 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 ConvertSoftware(Models.OpenMSX.Software software, string filename, int indexId, bool statsOnly) - { - // If the software is missing, we can't do anything - if (software == null) - return; - - // Create the machine for copying information - var machine = new Machine(); - machine.SetFieldValue(Models.Metadata.Machine.CountryKey, software.Country); - machine.SetFieldValue(Models.Metadata.Machine.GenMSXIDKey, software.GenMSXID); - machine.SetFieldValue(Models.Metadata.Machine.ManufacturerKey, software.Company); - machine.SetFieldValue(Models.Metadata.Machine.SystemKey, software.System); - machine.SetFieldValue(Models.Metadata.Machine.NameKey, software.Title); - machine.SetFieldValue(Models.Metadata.Machine.YearKey, software.Year); - - // Check if there are any items - bool containsItems = false; - ConvertDumps(software.Dump, machine, filename, indexId, statsOnly, ref containsItems); - - // If we had no items, create a Blank placeholder - if (!containsItems) - { - var blank = new Blank(); - blank.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - blank.CopyMachineInformation(machine); - ParseAddHelper(blank, statsOnly); - } - } - - /// - /// Convert Dump information - /// - /// Array of deserialized models to convert - /// Prefilled machine to use - /// Name of the file to be parsed - /// Index ID for the DAT - /// True to only add item statistics while parsing, false otherwise - /// True if there were any items in the array, false otherwise - private void ConvertDumps(Models.OpenMSX.Dump[]? dumps, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the dumps array is missing, we can't do anything - if (dumps == null || !dumps.Any()) - return; - - containsItems = true; - int index = 0; - foreach (var dump in dumps) - { - // If we don't have rom data, we can't do anything - if (dump?.Rom == null) - continue; - - var rom = dump.Rom; - - string name = $"{machine.GetFieldValue(Models.Metadata.Machine.NameKey)}_{index++}{(!string.IsNullOrEmpty(rom.Remark) ? $" {rom.Remark}" : string.Empty)}"; - var item = new Rom(); - item.SetName(name); - item.SetFieldValue(Models.Metadata.Rom.OffsetKey, dump.Rom?.Start); - item.SetFieldValue(Models.Metadata.Rom.OpenMSXType, rom.Type); - item.SetFieldValue(Models.Metadata.Rom.RemarkKey, rom.Remark); - item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.Hash); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - if (dump.Original != null) - { - item.SetFieldValue("ORIGINAL", new Original - { - Value = dump.Original.Value.AsYesNo(), - Content = dump.Original.Content, - }); - } - - switch (dump.Rom) - { - case Models.OpenMSX.Rom: - item.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.Rom); - break; - case Models.OpenMSX.MegaRom: - item.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.MegaRom); - break; - case Models.OpenMSX.SCCPlusCart: - item.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.SCCPlusCart); - break; - } - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - #endregion } }