From d88e5331cc16320f3b617186d30c31f4de243a5b Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 9 Aug 2023 22:40:24 -0400 Subject: [PATCH] Move Listrom internal serialization --- SabreTools.Serialization/Internal.Listrom.cs | 194 ------------------ .../Listrom.Deserializer.cs | 81 ++++++++ .../Listrom.Serializer.cs | 104 ++++++++++ 3 files changed, 185 insertions(+), 194 deletions(-) delete mode 100644 SabreTools.Serialization/Internal.Listrom.cs diff --git a/SabreTools.Serialization/Internal.Listrom.cs b/SabreTools.Serialization/Internal.Listrom.cs deleted file mode 100644 index 67ae33a5..00000000 --- a/SabreTools.Serialization/Internal.Listrom.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using SabreTools.Models.Internal; - -namespace SabreTools.Serialization -{ - /// - /// Serializer for Listrom models to internal structure - /// - public partial class Internal - { - #region Serialize - - /// - /// Convert from to - /// - public static MetadataFile ConvertToInternalModel(Models.Listrom.MetadataFile item) - { - var metadataFile = new MetadataFile - { - [MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), - }; - - if (item?.Set != null && item.Set.Any()) - metadataFile[MetadataFile.MachineKey] = item.Set.Select(ConvertMachineToInternalModel).ToArray(); - - return metadataFile; - } - - /// - /// Convert from to - /// - private static Header ConvertHeaderToInternalModel(Models.Listrom.MetadataFile item) - { - var header = new Header - { - [Header.NameKey] = "MAME Listrom", - }; - return header; - } - - /// - /// Convert from to - /// - private static Machine ConvertMachineToInternalModel(Models.Listrom.Set item) - { - var machine = new Machine(); - if (!string.IsNullOrWhiteSpace(item.Device)) - { - machine[Machine.NameKey] = item.Device; - machine[Machine.IsDeviceKey] = "yes"; - } - else - { - machine[Machine.NameKey] = item.Driver; - } - - if (item.Row != null && item.Row.Any()) - { - var datItems = new List(); - foreach (var file in item.Row) - { - datItems.Add(ConvertToInternalModel(file)); - } - - machine[Machine.DiskKey] = datItems.Where(i => i.ReadString(DatItem.TypeKey) == "disk")?.ToArray(); - machine[Machine.RomKey] = datItems.Where(i => i.ReadString(DatItem.TypeKey) == "rom")?.ToArray(); - } - - return machine; - } - - /// - /// Convert from to - /// - private static DatItem ConvertToInternalModel(Models.Listrom.Row item) - { - if (item.Size == null) - { - var disk = new Disk - { - [Disk.NameKey] = item.Name, - [Disk.MD5Key] = item.MD5, - [Disk.SHA1Key] = item.SHA1, - }; - - if (item.NoGoodDumpKnown) - disk[Disk.StatusKey] = "nodump"; - else if (item.Bad) - disk[Disk.StatusKey] = "baddump"; - - return disk; - } - else - { - var rom = new Rom - { - [Rom.NameKey] = item.Name, - [Rom.SizeKey] = item.Size, - [Rom.CRCKey] = item.CRC, - [Rom.SHA1Key] = item.SHA1, - }; - - if (item.NoGoodDumpKnown) - rom[Rom.StatusKey] = "nodump"; - else if (item.Bad) - rom[Rom.StatusKey] = "baddump"; - - return rom; - } - } - - #endregion - - #region Deserialize - - /// - /// Convert from to - /// - public static Models.Listrom.Set? ConvertMachineToListrom(Machine? item) - { - if (item == null) - return null; - - var set = new Models.Listrom.Set(); - if (item.ReadString(Machine.IsDeviceKey) == "yes") - set.Device = item.ReadString(Machine.NameKey); - else - set.Driver = item.ReadString(Machine.NameKey); - - var rowItems = new List(); - - var roms = item.Read(Machine.RomKey); - if (roms != null) - rowItems.AddRange(roms.Select(ConvertToListrom)); - - var disks = item.Read(Machine.DiskKey); - if (disks != null) - rowItems.AddRange(disks.Select(ConvertToListrom)); - - set.Row = rowItems.ToArray(); - return set; - } - - /// - /// Convert from to - /// - private static Models.Listrom.Row? ConvertToListrom(Disk? item) - { - if (item == null) - return null; - - var row = new Models.Listrom.Row - { - Name = item.ReadString(Disk.NameKey), - MD5 = item.ReadString(Disk.MD5Key), - SHA1 = item.ReadString(Disk.SHA1Key), - }; - - if (item[Disk.StatusKey] as string == "nodump") - row.NoGoodDumpKnown = true; - else if (item[Disk.StatusKey] as string == "baddump") - row.Bad = true; - - return row; - } - - /// - /// Convert from to - /// - private static Models.Listrom.Row? ConvertToListrom(Rom? item) - { - if (item == null) - return null; - - var row = new Models.Listrom.Row - { - Name = item.ReadString(Rom.NameKey), - Size = item.ReadString(Rom.SizeKey), - CRC = item.ReadString(Rom.CRCKey), - SHA1 = item.ReadString(Rom.SHA1Key), - }; - - if (item[Rom.StatusKey] as string == "nodump") - row.NoGoodDumpKnown = true; - else if (item[Rom.StatusKey] as string == "baddump") - row.Bad = true; - - return row; - } - - #endregion - } -} \ No newline at end of file diff --git a/SabreTools.Serialization/Listrom.Deserializer.cs b/SabreTools.Serialization/Listrom.Deserializer.cs index d4c8ccee..571559fc 100644 --- a/SabreTools.Serialization/Listrom.Deserializer.cs +++ b/SabreTools.Serialization/Listrom.Deserializer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using SabreTools.Models.Listrom; @@ -186,5 +187,85 @@ namespace SabreTools.Serialization dat.ADDITIONAL_ELEMENTS = additional.ToArray(); return dat; } + + // TODO: Add deserialization of entire MetadataFile + #region Internal + + /// + /// Convert from to + /// + public static Set? ConvertMachineToListrom(Models.Internal.Machine? item) + { + if (item == null) + return null; + + var set = new Set(); + if (item.ReadString(Models.Internal.Machine.IsDeviceKey) == "yes") + set.Device = item.ReadString(Models.Internal.Machine.NameKey); + else + set.Driver = item.ReadString(Models.Internal.Machine.NameKey); + + var rowItems = new List(); + + var roms = item.Read(Models.Internal.Machine.RomKey); + if (roms != null) + rowItems.AddRange(roms.Select(ConvertToListrom)); + + var disks = item.Read(Models.Internal.Machine.DiskKey); + if (disks != null) + rowItems.AddRange(disks.Select(ConvertToListrom)); + + set.Row = rowItems.ToArray(); + return set; + } + + /// + /// Convert from to + /// + private static Row? ConvertToListrom(Models.Internal.Disk? item) + { + if (item == null) + return null; + + var row = new Row + { + Name = item.ReadString(Models.Internal.Disk.NameKey), + MD5 = item.ReadString(Models.Internal.Disk.MD5Key), + SHA1 = item.ReadString(Models.Internal.Disk.SHA1Key), + }; + + if (item[Models.Internal.Disk.StatusKey] as string == "nodump") + row.NoGoodDumpKnown = true; + else if (item[Models.Internal.Disk.StatusKey] as string == "baddump") + row.Bad = true; + + return row; + } + + /// + /// Convert from to + /// + private static Row? ConvertToListrom(Models.Internal.Rom? item) + { + if (item == null) + return null; + + var row = new Row + { + Name = item.ReadString(Models.Internal.Rom.NameKey), + Size = item.ReadString(Models.Internal.Rom.SizeKey), + CRC = item.ReadString(Models.Internal.Rom.CRCKey), + SHA1 = item.ReadString(Models.Internal.Rom.SHA1Key), + }; + + if (item[Models.Internal.Rom.StatusKey] as string == "nodump") + row.NoGoodDumpKnown = true; + else if (item[Models.Internal.Rom.StatusKey] as string == "baddump") + row.Bad = true; + + return row; + } + + #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Listrom.Serializer.cs b/SabreTools.Serialization/Listrom.Serializer.cs index f0ded159..249e90b8 100644 --- a/SabreTools.Serialization/Listrom.Serializer.cs +++ b/SabreTools.Serialization/Listrom.Serializer.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -175,5 +176,108 @@ namespace SabreTools.Serialization writer.Flush(); } } + + #region Internal + + /// + /// Convert from to + /// + public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) + { + var metadataFile = new Models.Internal.MetadataFile + { + [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + if (item?.Set != null && item.Set.Any()) + metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Set.Select(ConvertMachineToInternalModel).ToArray(); + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Internal.Header ConvertHeaderToInternalModel(MetadataFile item) + { + var header = new Models.Internal.Header + { + [Models.Internal.Header.NameKey] = "MAME Listrom", + }; + return header; + } + + /// + /// Convert from to + /// + private static Models.Internal.Machine ConvertMachineToInternalModel(Set item) + { + var machine = new Models.Internal.Machine(); + if (!string.IsNullOrWhiteSpace(item.Device)) + { + machine[Models.Internal.Machine.NameKey] = item.Device; + machine[Models.Internal.Machine.IsDeviceKey] = "yes"; + } + else + { + machine[Models.Internal.Machine.NameKey] = item.Driver; + } + + if (item.Row != null && item.Row.Any()) + { + var datItems = new List(); + foreach (var file in item.Row) + { + datItems.Add(ConvertToInternalModel(file)); + } + + machine[Models.Internal.Machine.DiskKey] = datItems.Where(i => i.ReadString(Models.Internal.DatItem.TypeKey) == "disk")?.ToArray(); + machine[Models.Internal.Machine.RomKey] = datItems.Where(i => i.ReadString(Models.Internal.DatItem.TypeKey) == "rom")?.ToArray(); + } + + return machine; + } + + /// + /// Convert from to + /// + private static Models.Internal.DatItem ConvertToInternalModel(Row item) + { + if (item.Size == null) + { + var disk = new Models.Internal.Disk + { + [Models.Internal.Disk.NameKey] = item.Name, + [Models.Internal.Disk.MD5Key] = item.MD5, + [Models.Internal.Disk.SHA1Key] = item.SHA1, + }; + + if (item.NoGoodDumpKnown) + disk[Models.Internal.Disk.StatusKey] = "nodump"; + else if (item.Bad) + disk[Models.Internal.Disk.StatusKey] = "baddump"; + + return disk; + } + else + { + var rom = new Models.Internal.Rom + { + [Models.Internal.Rom.NameKey] = item.Name, + [Models.Internal.Rom.SizeKey] = item.Size, + [Models.Internal.Rom.CRCKey] = item.CRC, + [Models.Internal.Rom.SHA1Key] = item.SHA1, + }; + + if (item.NoGoodDumpKnown) + rom[Models.Internal.Rom.StatusKey] = "nodump"; + else if (item.Bad) + rom[Models.Internal.Rom.StatusKey] = "baddump"; + + return rom; + } + } + + #endregion } } \ No newline at end of file