From d84d707b08325a3bd5996f50b59520504969a2c7 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 9 Aug 2023 23:18:44 -0400 Subject: [PATCH] Move Logiqx internal serialization --- SabreTools.Serialization/Internal.Logiqx.cs | 709 ------------------ .../Logiqx.Deserializer.cs | 336 +++++++++ SabreTools.Serialization/Logiqx.Serializer.cs | 323 ++++++++ SabreTools.Serialization/Logiqx.cs | 12 +- 4 files changed, 660 insertions(+), 720 deletions(-) delete mode 100644 SabreTools.Serialization/Internal.Logiqx.cs create mode 100644 SabreTools.Serialization/Logiqx.Deserializer.cs create mode 100644 SabreTools.Serialization/Logiqx.Serializer.cs diff --git a/SabreTools.Serialization/Internal.Logiqx.cs b/SabreTools.Serialization/Internal.Logiqx.cs deleted file mode 100644 index eea26122..00000000 --- a/SabreTools.Serialization/Internal.Logiqx.cs +++ /dev/null @@ -1,709 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using SabreTools.Models.Internal; - -namespace SabreTools.Serialization -{ - /// - /// Serializer for Logiqx models to internal structure - /// - public partial class Internal - { - #region Serialize - - /// - /// Convert from to - /// - public static MetadataFile ConvertToInternalModel(Models.Logiqx.Datafile item) - { - var metadataFile = new MetadataFile - { - [MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), - }; - - // TODO: Handle Dir items - if (item?.Game != null && item.Game.Any()) - metadataFile[MetadataFile.MachineKey] = item.Game.Select(ConvertMachineToInternalModel).ToArray(); - - return metadataFile; - } - - /// - /// Convert from to - /// - private static Header ConvertHeaderToInternalModel(Models.Logiqx.Datafile item) - { - var header = ConvertHeaderToInternalModel(item.Header); - - header[Header.BuildKey] = item.Build; - header[Header.DebugKey] = item.Debug; - header[Header.SchemaLocationKey] = item.SchemaLocation; - - return header; - } - - /// - /// Convert from to - /// - private static Header ConvertHeaderToInternalModel(Models.Logiqx.Header item) - { - var header = new Header - { - [Header.IdKey] = item.Id, - [Header.NameKey] = item.Name, - [Header.DescriptionKey] = item.Description, - [Header.RootDirKey] = item.RootDir, - [Header.CategoryKey] = item.Category, - [Header.VersionKey] = item.Version, - [Header.DateKey] = item.Date, - [Header.AuthorKey] = item.Author, - [Header.EmailKey] = item.Email, - [Header.HomepageKey] = item.Homepage, - [Header.UrlKey] = item.Url, - [Header.CommentKey] = item.Comment, - [Header.TypeKey] = item.Type, - }; - - if (item.ClrMamePro != null) - { - header[Header.HeaderKey] = item.ClrMamePro.Header; - header[Header.ForceMergingKey] = item.ClrMamePro.ForceMerging; - header[Header.ForceNodumpKey] = item.ClrMamePro.ForceNodump; - header[Header.ForcePackingKey] = item.ClrMamePro.ForcePacking; - } - - if (item.RomCenter != null) - { - header[Header.PluginKey] = item.RomCenter.Plugin; - header[Header.RomModeKey] = item.RomCenter.RomMode; - header[Header.BiosModeKey] = item.RomCenter.BiosMode; - header[Header.SampleModeKey] = item.RomCenter.SampleMode; - header[Header.LockRomModeKey] = item.RomCenter.LockRomMode; - header[Header.LockBiosModeKey] = item.RomCenter.LockBiosMode; - header[Header.LockSampleModeKey] = item.RomCenter.LockSampleMode; - } - - return header; - } - - /// - /// Convert from to - /// - private static Machine ConvertMachineToInternalModel(Models.Logiqx.GameBase item) - { - var machine = new Machine - { - [Machine.NameKey] = item.Name, - [Machine.SourceFileKey] = item.SourceFile, - [Machine.IsBiosKey] = item.IsBios, - [Machine.IsDeviceKey] = item.IsDevice, - [Machine.IsMechanicalKey] = item.IsMechanical, - [Machine.CloneOfKey] = item.CloneOf, - [Machine.RomOfKey] = item.RomOf, - [Machine.SampleOfKey] = item.SampleOf, - [Machine.BoardKey] = item.Board, - [Machine.RebuildToKey] = item.RebuildTo, - [Machine.IdKey] = item.Id, - [Machine.CloneOfIdKey] = item.CloneOfId, - [Machine.RunnableKey] = item.Runnable, - [Machine.CommentKey] = item.Comment, - [Machine.DescriptionKey] = item.Description, - [Machine.YearKey] = item.Year, - [Machine.ManufacturerKey] = item.Manufacturer, - [Machine.PublisherKey] = item.Publisher, - [Machine.CategoryKey] = item.Category, - [Machine.TruripKey] = item.Trurip, - }; - - if (item.Release != null && item.Release.Any()) - { - var releases = new List(); - foreach (var release in item.Release) - { - releases.Add(ConvertToInternalModel(release)); - } - machine[Machine.ReleaseKey] = releases.ToArray(); - } - - if (item.BiosSet != null && item.BiosSet.Any()) - { - var biosSets = new List(); - foreach (var biosSet in item.BiosSet) - { - biosSets.Add(ConvertToInternalModel(biosSet)); - } - machine[Machine.BiosSetKey] = biosSets.ToArray(); - } - - if (item.Rom != null && item.Rom.Any()) - { - var roms = new List(); - foreach (var rom in item.Rom) - { - roms.Add(ConvertToInternalModel(rom)); - } - machine[Machine.RomKey] = roms.ToArray(); - } - - if (item.Disk != null && item.Disk.Any()) - { - var disks = new List(); - foreach (var disk in item.Disk) - { - disks.Add(ConvertToInternalModel(disk)); - } - machine[Machine.DiskKey] = disks.ToArray(); - } - - if (item.Media != null && item.Media.Any()) - { - var medias = new List(); - foreach (var media in item.Media) - { - medias.Add(ConvertToInternalModel(media)); - } - machine[Machine.MediaKey] = medias.ToArray(); - } - - if (item.DeviceRef != null && item.DeviceRef.Any()) - { - var deviceRefs = new List(); - foreach (var deviceRef in item.DeviceRef) - { - deviceRefs.Add(ConvertToInternalModel(deviceRef)); - } - machine[Machine.DeviceRefKey] = deviceRefs.ToArray(); - } - - if (item.Sample != null && item.Sample.Any()) - { - var samples = new List(); - foreach (var sample in item.Sample) - { - samples.Add(ConvertToInternalModel(sample)); - } - machine[Machine.SampleKey] = samples.ToArray(); - } - - if (item.Archive != null && item.Archive.Any()) - { - var archives = new List(); - foreach (var archive in item.Archive) - { - archives.Add(ConvertToInternalModel(archive)); - } - machine[Machine.ArchiveKey] = archives.ToArray(); - } - - if (item.Driver != null && item.Driver.Any()) - { - var drivers = new List(); - foreach (var driver in item.Driver) - { - drivers.Add(ConvertToInternalModel(driver)); - } - machine[Machine.DriverKey] = drivers.ToArray(); - } - - if (item.SoftwareList != null && item.SoftwareList.Any()) - { - var softwareLists = new List(); - foreach (var softwareList in item.SoftwareList) - { - softwareLists.Add(ConvertToInternalModel(softwareList)); - } - machine[Machine.SoftwareListKey] = softwareLists.ToArray(); - } - - return machine; - } - - /// - /// Convert from to - /// - private static Archive ConvertToInternalModel(Models.Logiqx.Archive item) - { - var archive = new Archive - { - [Archive.NameKey] = item.Name, - }; - return archive; - } - - /// - /// Convert from to - /// - private static BiosSet ConvertToInternalModel(Models.Logiqx.BiosSet item) - { - var biosset = new BiosSet - { - [BiosSet.NameKey] = item.Name, - [BiosSet.DescriptionKey] = item.Description, - [BiosSet.DefaultKey] = item.Default, - }; - return biosset; - } - - /// - /// Convert from to - /// - private static DeviceRef ConvertToInternalModel(Models.Logiqx.DeviceRef item) - { - var deviceRef = new DeviceRef - { - [DeviceRef.NameKey] = item.Name, - }; - return deviceRef; - } - - /// - /// Convert from to - /// - private static Disk ConvertToInternalModel(Models.Logiqx.Disk item) - { - var disk = new Disk - { - [Disk.NameKey] = item.Name, - [Disk.MD5Key] = item.MD5, - [Disk.SHA1Key] = item.SHA1, - [Disk.MergeKey] = item.Merge, - [Disk.StatusKey] = item.Status, - [Disk.RegionKey] = item.Region, - }; - return disk; - } - - /// - /// Convert from to - /// - private static Driver ConvertToInternalModel(Models.Logiqx.Driver item) - { - var driver = new Driver - { - [Driver.StatusKey] = item.Status, - [Driver.EmulationKey] = item.Emulation, - [Driver.CocktailKey] = item.Cocktail, - [Driver.SaveStateKey] = item.SaveState, - [Driver.RequiresArtworkKey] = item.RequiresArtwork, - [Driver.UnofficialKey] = item.Unofficial, - [Driver.NoSoundHardwareKey] = item.NoSoundHardware, - [Driver.IncompleteKey] = item.Incomplete, - }; - return driver; - } - - /// - /// Convert from to - /// - private static Media ConvertToInternalModel(Models.Logiqx.Media item) - { - var media = new Media - { - [Media.NameKey] = item.Name, - [Media.MD5Key] = item.MD5, - [Media.SHA1Key] = item.SHA1, - [Media.SHA256Key] = item.SHA256, - [Media.SpamSumKey] = item.SpamSum, - }; - return media; - } - - /// - /// Convert from to - /// - private static Release ConvertToInternalModel(Models.Logiqx.Release item) - { - var release = new Release - { - [Release.NameKey] = item.Name, - [Release.RegionKey] = item.Region, - [Release.LanguageKey] = item.Language, - [Release.DateKey] = item.Date, - [Release.DefaultKey] = item.Default, - }; - return release; - } - - /// - /// Convert from to - /// - private static Rom ConvertToInternalModel(Models.Logiqx.Rom item) - { - var rom = new Rom - { - [Rom.NameKey] = item.Name, - [Rom.SizeKey] = item.Size, - [Rom.CRCKey] = item.CRC, - [Rom.MD5Key] = item.MD5, - [Rom.SHA1Key] = item.SHA1, - [Rom.SHA256Key] = item.SHA256, - [Rom.SHA384Key] = item.SHA384, - [Rom.SHA512Key] = item.SHA512, - [Rom.SpamSumKey] = item.SpamSum, - [Rom.xxHash364Key] = item.xxHash364, - [Rom.xxHash3128Key] = item.xxHash3128, - [Rom.MergeKey] = item.Merge, - [Rom.StatusKey] = item.Status, - [Rom.SerialKey] = item.Serial, - [Rom.HeaderKey] = item.Header, - [Rom.DateKey] = item.Date, - [Rom.InvertedKey] = item.Inverted, - [Rom.MIAKey] = item.MIA, - }; - return rom; - } - - /// - /// Convert from to - /// - private static Sample ConvertToInternalModel(Models.Logiqx.Sample item) - { - var sample = new Sample - { - [Sample.NameKey] = item.Name, - }; - return sample; - } - - /// - /// Convert from to - /// - private static SoftwareList ConvertToInternalModel(Models.Logiqx.SoftwareList item) - { - var softwareList = new SoftwareList - { - [SoftwareList.TagKey] = item.Tag, - [SoftwareList.NameKey] = item.Name, - [SoftwareList.StatusKey] = item.Status, - [SoftwareList.FilterKey] = item.Filter, - }; - return softwareList; - } - - #endregion - - #region Deserialize - - /// - /// Convert from to - /// - public static Models.Logiqx.Header? ConvertHeaderToLogiqx(Header? item) - { - if (item == null) - return null; - - var header = new Models.Logiqx.Header - { - Id = item.ReadString(Header.IdKey), - Name = item.ReadString(Header.NameKey), - Description = item.ReadString(Header.DescriptionKey), - RootDir = item.ReadString(Header.RootDirKey), - Category = item.ReadString(Header.CategoryKey), - Version = item.ReadString(Header.VersionKey), - Date = item.ReadString(Header.DateKey), - Author = item.ReadString(Header.AuthorKey), - Email = item.ReadString(Header.EmailKey), - Homepage = item.ReadString(Header.HomepageKey), - Url = item.ReadString(Header.UrlKey), - Comment = item.ReadString(Header.CommentKey), - Type = item.ReadString(Header.TypeKey), - }; - - if (item.ContainsKey(Header.HeaderKey) - || item.ContainsKey(Header.ForceMergingKey) - || item.ContainsKey(Header.ForceNodumpKey) - || item.ContainsKey(Header.ForcePackingKey)) - { - header.ClrMamePro = new Models.Logiqx.ClrMamePro - { - Header = item.ReadString(Header.HeaderKey), - ForceMerging = item.ReadString(Header.ForceMergingKey), - ForceNodump = item.ReadString(Header.ForceNodumpKey), - ForcePacking = item.ReadString(Header.ForcePackingKey), - }; - } - - if (item.ContainsKey(Header.PluginKey) - || item.ContainsKey(Header.RomModeKey) - || item.ContainsKey(Header.BiosModeKey) - || item.ContainsKey(Header.SampleModeKey) - || item.ContainsKey(Header.LockRomModeKey) - || item.ContainsKey(Header.LockBiosModeKey) - || item.ContainsKey(Header.LockSampleModeKey)) - { - header.RomCenter = new Models.Logiqx.RomCenter - { - Plugin = item.ReadString(Header.PluginKey), - RomMode = item.ReadString(Header.RomModeKey), - BiosMode = item.ReadString(Header.BiosModeKey), - SampleMode = item.ReadString(Header.SampleModeKey), - LockRomMode = item.ReadString(Header.LockRomModeKey), - LockBiosMode = item.ReadString(Header.LockBiosModeKey), - LockSampleMode = item.ReadString(Header.LockSampleModeKey), - }; - } - - return header; - } - - /// - /// Convert from to - /// - public static Models.Logiqx.GameBase? ConvertMachineToLogiqx(Machine? item, bool game = false) - { - if (item == null) - return null; - - Models.Logiqx.GameBase gameBase = game ? new Models.Logiqx.Game() : new Models.Logiqx.Machine(); - - gameBase.Name = item.ReadString(Machine.NameKey); - gameBase.SourceFile = item.ReadString(Machine.SourceFileKey); - gameBase.IsBios = item.ReadString(Machine.IsBiosKey); - gameBase.IsDevice = item.ReadString(Machine.IsDeviceKey); - gameBase.IsMechanical = item.ReadString(Machine.IsMechanicalKey); - gameBase.CloneOf = item.ReadString(Machine.CloneOfKey); - gameBase.RomOf = item.ReadString(Machine.RomOfKey); - gameBase.SampleOf = item.ReadString(Machine.SampleOfKey); - gameBase.Board = item.ReadString(Machine.BoardKey); - gameBase.RebuildTo = item.ReadString(Machine.RebuildToKey); - gameBase.Id = item.ReadString(Machine.IdKey); - gameBase.CloneOfId = item.ReadString(Machine.CloneOfIdKey); - gameBase.Runnable = item.ReadString(Machine.RunnableKey); - gameBase.Comment = item.ReadStringArray(Machine.CommentKey); - gameBase.Description = item.ReadString(Machine.DescriptionKey); - gameBase.Year = item.ReadString(Machine.YearKey); - gameBase.Manufacturer = item.ReadString(Machine.ManufacturerKey); - gameBase.Publisher = item.ReadString(Machine.PublisherKey); - gameBase.Category = item.ReadStringArray(Machine.CategoryKey); - - var trurip = item.Read(Machine.TruripKey); - gameBase.Trurip = trurip; - - var releases = item.Read(Machine.ReleaseKey); - gameBase.Release = releases?.Select(ConvertToLogiqx)?.ToArray(); - - var biosSets = item.Read(Machine.BiosSetKey); - gameBase.BiosSet = biosSets?.Select(ConvertToLogiqx)?.ToArray(); - - var roms = item.Read(Machine.RomKey); - gameBase.Rom = roms?.Select(ConvertToLogiqx)?.ToArray(); - - var disks = item.Read(Machine.DiskKey); - gameBase.Disk = disks?.Select(ConvertToLogiqx)?.ToArray(); - - var medias = item.Read(Machine.MediaKey); - gameBase.Media = medias?.Select(ConvertToLogiqx)?.ToArray(); - - var deviceRefs = item.Read(Machine.DeviceRefKey); - gameBase.DeviceRef = deviceRefs?.Select(ConvertToLogiqx)?.ToArray(); - - var samples = item.Read(Machine.SampleKey); - gameBase.Sample = samples?.Select(ConvertToLogiqx)?.ToArray(); - - var archives = item.Read(Machine.ArchiveKey); - gameBase.Archive = archives?.Select(ConvertToLogiqx)?.ToArray(); - - var drivers = item.Read(Machine.DriverKey); - gameBase.Driver = drivers?.Select(ConvertToLogiqx)?.ToArray(); - - var softwareLists = item.Read(Machine.SoftwareListKey); - gameBase.SoftwareList = softwareLists?.Select(ConvertToLogiqx)?.ToArray(); - - return gameBase; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.Archive? ConvertToLogiqx(Archive? item) - { - if (item == null) - return null; - - var archive = new Models.Logiqx.Archive - { - Name = item.ReadString(Archive.NameKey), - }; - return archive; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.BiosSet? ConvertToLogiqx(BiosSet? item) - { - if (item == null) - return null; - - var biosset = new Models.Logiqx.BiosSet - { - Name = item.ReadString(BiosSet.NameKey), - Description = item.ReadString(BiosSet.DescriptionKey), - Default = item.ReadString(BiosSet.DefaultKey), - }; - return biosset; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.DeviceRef? ConvertToLogiqx(DeviceRef? item) - { - if (item == null) - return null; - - var deviceRef = new Models.Logiqx.DeviceRef - { - Name = item.ReadString(DipSwitch.NameKey), - }; - return deviceRef; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.Disk? ConvertToLogiqx(Disk? item) - { - if (item == null) - return null; - - var disk = new Models.Logiqx.Disk - { - Name = item.ReadString(Disk.NameKey), - MD5 = item.ReadString(Disk.MD5Key), - SHA1 = item.ReadString(Disk.SHA1Key), - Merge = item.ReadString(Disk.MergeKey), - Status = item.ReadString(Disk.StatusKey), - Region = item.ReadString(Disk.RegionKey), - }; - return disk; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.Driver? ConvertToLogiqx(Driver? item) - { - if (item == null) - return null; - - var driver = new Models.Logiqx.Driver - { - Status = item.ReadString(Driver.StatusKey), - Emulation = item.ReadString(Driver.EmulationKey), - Cocktail = item.ReadString(Driver.CocktailKey), - SaveState = item.ReadString(Driver.SaveStateKey), - RequiresArtwork = item.ReadString(Driver.RequiresArtworkKey), - Unofficial = item.ReadString(Driver.UnofficialKey), - NoSoundHardware = item.ReadString(Driver.NoSoundHardwareKey), - Incomplete = item.ReadString(Driver.IncompleteKey), - }; - return driver; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.Media? ConvertToLogiqx(Media? item) - { - if (item == null) - return null; - - var media = new Models.Logiqx.Media - { - Name = item.ReadString(Media.NameKey), - MD5 = item.ReadString(Media.MD5Key), - SHA1 = item.ReadString(Media.SHA1Key), - SHA256 = item.ReadString(Media.SHA256Key), - SpamSum = item.ReadString(Media.SpamSumKey), - }; - return media; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.Release? ConvertToLogiqx(Release? item) - { - if (item == null) - return null; - - var release = new Models.Logiqx.Release - { - Name = item.ReadString(Release.NameKey), - Region = item.ReadString(Release.RegionKey), - Language = item.ReadString(Release.LanguageKey), - Date = item.ReadString(Release.DateKey), - Default = item.ReadString(Release.DefaultKey), - }; - return release; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.Rom? ConvertToLogiqx(Rom? item) - { - if (item == null) - return null; - - var rom = new Models.Logiqx.Rom - { - Name = item.ReadString(Rom.NameKey), - Size = item.ReadString(Rom.SizeKey), - CRC = item.ReadString(Rom.CRCKey), - MD5 = item.ReadString(Rom.MD5Key), - SHA1 = item.ReadString(Rom.SHA1Key), - SHA256 = item.ReadString(Rom.SHA256Key), - SHA384 = item.ReadString(Rom.SHA384Key), - SHA512 = item.ReadString(Rom.SHA512Key), - SpamSum = item.ReadString(Rom.SpamSumKey), - xxHash364 = item.ReadString(Rom.xxHash364Key), - xxHash3128 = item.ReadString(Rom.xxHash3128Key), - Merge = item.ReadString(Rom.MergeKey), - Status = item.ReadString(Rom.StatusKey), - Serial = item.ReadString(Rom.SerialKey), - Header = item.ReadString(Rom.HeaderKey), - Date = item.ReadString(Rom.DateKey), - Inverted = item.ReadString(Rom.InvertedKey), - MIA = item.ReadString(Rom.MIAKey), - }; - return rom; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.Sample? ConvertToLogiqx(Sample? item) - { - if (item == null) - return null; - - var sample = new Models.Logiqx.Sample - { - Name = item.ReadString(Sample.NameKey), - }; - return sample; - } - - /// - /// Convert from to - /// - private static Models.Logiqx.SoftwareList? ConvertToLogiqx(SoftwareList? item) - { - if (item == null) - return null; - - var softwareList = new Models.Logiqx.SoftwareList - { - Tag = item.ReadString(SoftwareList.TagKey), - Name = item.ReadString(SoftwareList.NameKey), - Status = item.ReadString(SoftwareList.StatusKey), - Filter = item.ReadString(SoftwareList.FilterKey), - }; - return softwareList; - } - - #endregion - } -} \ No newline at end of file diff --git a/SabreTools.Serialization/Logiqx.Deserializer.cs b/SabreTools.Serialization/Logiqx.Deserializer.cs new file mode 100644 index 00000000..67f4822f --- /dev/null +++ b/SabreTools.Serialization/Logiqx.Deserializer.cs @@ -0,0 +1,336 @@ +using System.Linq; +using SabreTools.Models.Logiqx; + +namespace SabreTools.Serialization +{ + /// + /// XML deserializer for Logiqx-derived metadata files + /// + public partial class Logiqx : XmlSerializer + { + // TODO: Add deserialization of entire Datafile + #region Internal + + /// + /// Convert from to + /// + public static Header? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + { + if (item == null) + return null; + + var header = new Header + { + Id = item.ReadString(Models.Internal.Header.IdKey), + Name = item.ReadString(Models.Internal.Header.NameKey), + Description = item.ReadString(Models.Internal.Header.DescriptionKey), + RootDir = item.ReadString(Models.Internal.Header.RootDirKey), + Category = item.ReadString(Models.Internal.Header.CategoryKey), + Version = item.ReadString(Models.Internal.Header.VersionKey), + Date = item.ReadString(Models.Internal.Header.DateKey), + Author = item.ReadString(Models.Internal.Header.AuthorKey), + Email = item.ReadString(Models.Internal.Header.EmailKey), + Homepage = item.ReadString(Models.Internal.Header.HomepageKey), + Url = item.ReadString(Models.Internal.Header.UrlKey), + Comment = item.ReadString(Models.Internal.Header.CommentKey), + Type = item.ReadString(Models.Internal.Header.TypeKey), + }; + + if (item.ContainsKey(Models.Internal.Header.HeaderKey) + || item.ContainsKey(Models.Internal.Header.ForceMergingKey) + || item.ContainsKey(Models.Internal.Header.ForceNodumpKey) + || item.ContainsKey(Models.Internal.Header.ForcePackingKey)) + { + header.ClrMamePro = new Models.Logiqx.ClrMamePro + { + Header = item.ReadString(Models.Internal.Header.HeaderKey), + ForceMerging = item.ReadString(Models.Internal.Header.ForceMergingKey), + ForceNodump = item.ReadString(Models.Internal.Header.ForceNodumpKey), + ForcePacking = item.ReadString(Models.Internal.Header.ForcePackingKey), + }; + } + + if (item.ContainsKey(Models.Internal.Header.PluginKey) + || item.ContainsKey(Models.Internal.Header.RomModeKey) + || item.ContainsKey(Models.Internal.Header.BiosModeKey) + || item.ContainsKey(Models.Internal.Header.SampleModeKey) + || item.ContainsKey(Models.Internal.Header.LockRomModeKey) + || item.ContainsKey(Models.Internal.Header.LockBiosModeKey) + || item.ContainsKey(Models.Internal.Header.LockSampleModeKey)) + { + header.RomCenter = new Models.Logiqx.RomCenter + { + Plugin = item.ReadString(Models.Internal.Header.PluginKey), + RomMode = item.ReadString(Models.Internal.Header.RomModeKey), + BiosMode = item.ReadString(Models.Internal.Header.BiosModeKey), + SampleMode = item.ReadString(Models.Internal.Header.SampleModeKey), + LockRomMode = item.ReadString(Models.Internal.Header.LockRomModeKey), + LockBiosMode = item.ReadString(Models.Internal.Header.LockBiosModeKey), + LockSampleMode = item.ReadString(Models.Internal.Header.LockSampleModeKey), + }; + } + + return header; + } + + /// + /// Convert from to + /// + public static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) + { + if (item == null) + return null; + + GameBase gameBase = game ? new Game() : new Machine(); + + gameBase.Name = item.ReadString(Models.Internal.Machine.NameKey); + gameBase.SourceFile = item.ReadString(Models.Internal.Machine.SourceFileKey); + gameBase.IsBios = item.ReadString(Models.Internal.Machine.IsBiosKey); + gameBase.IsDevice = item.ReadString(Models.Internal.Machine.IsDeviceKey); + gameBase.IsMechanical = item.ReadString(Models.Internal.Machine.IsMechanicalKey); + gameBase.CloneOf = item.ReadString(Models.Internal.Machine.CloneOfKey); + gameBase.RomOf = item.ReadString(Models.Internal.Machine.RomOfKey); + gameBase.SampleOf = item.ReadString(Models.Internal.Machine.SampleOfKey); + gameBase.Board = item.ReadString(Models.Internal.Machine.BoardKey); + gameBase.RebuildTo = item.ReadString(Models.Internal.Machine.RebuildToKey); + gameBase.Id = item.ReadString(Models.Internal.Machine.IdKey); + gameBase.CloneOfId = item.ReadString(Models.Internal.Machine.CloneOfIdKey); + gameBase.Runnable = item.ReadString(Models.Internal.Machine.RunnableKey); + gameBase.Comment = item.ReadStringArray(Models.Internal.Machine.CommentKey); + gameBase.Description = item.ReadString(Models.Internal.Machine.DescriptionKey); + gameBase.Year = item.ReadString(Models.Internal.Machine.YearKey); + gameBase.Manufacturer = item.ReadString(Models.Internal.Machine.ManufacturerKey); + gameBase.Publisher = item.ReadString(Models.Internal.Machine.PublisherKey); + gameBase.Category = item.ReadStringArray(Models.Internal.Machine.CategoryKey); + + var trurip = item.Read(Models.Internal.Machine.TruripKey); + gameBase.Trurip = trurip; + + var releases = item.Read(Models.Internal.Machine.ReleaseKey); + gameBase.Release = releases?.Select(ConvertFromInternalModel)?.ToArray(); + + var biosSets = item.Read(Models.Internal.Machine.BiosSetKey); + gameBase.BiosSet = biosSets?.Select(ConvertFromInternalModel)?.ToArray(); + + var roms = item.Read(Models.Internal.Machine.RomKey); + gameBase.Rom = roms?.Select(ConvertFromInternalModel)?.ToArray(); + + var disks = item.Read(Models.Internal.Machine.DiskKey); + gameBase.Disk = disks?.Select(ConvertFromInternalModel)?.ToArray(); + + var medias = item.Read(Models.Internal.Machine.MediaKey); + gameBase.Media = medias?.Select(ConvertFromInternalModel)?.ToArray(); + + var deviceRefs = item.Read(Models.Internal.Machine.DeviceRefKey); + gameBase.DeviceRef = deviceRefs?.Select(ConvertFromInternalModel)?.ToArray(); + + var samples = item.Read(Models.Internal.Machine.SampleKey); + gameBase.Sample = samples?.Select(ConvertFromInternalModel)?.ToArray(); + + var archives = item.Read(Models.Internal.Machine.ArchiveKey); + gameBase.Archive = archives?.Select(ConvertFromInternalModel)?.ToArray(); + + var drivers = item.Read(Models.Internal.Machine.DriverKey); + gameBase.Driver = drivers?.Select(ConvertFromInternalModel)?.ToArray(); + + var softwareLists = item.Read(Models.Internal.Machine.SoftwareListKey); + gameBase.SoftwareList = softwareLists?.Select(ConvertFromInternalModel)?.ToArray(); + + return gameBase; + } + + /// + /// Convert from to + /// + private static Archive? ConvertFromInternalModel(Models.Internal.Archive? item) + { + if (item == null) + return null; + + var archive = new Archive + { + Name = item.ReadString(Models.Internal.Archive.NameKey), + }; + return archive; + } + + /// + /// Convert from to + /// + private static BiosSet? ConvertFromInternalModel(Models.Internal.BiosSet? item) + { + if (item == null) + return null; + + var biosset = new BiosSet + { + Name = item.ReadString(Models.Internal.BiosSet.NameKey), + Description = item.ReadString(Models.Internal.BiosSet.DescriptionKey), + Default = item.ReadString(Models.Internal.BiosSet.DefaultKey), + }; + return biosset; + } + + /// + /// Convert from to + /// + private static DeviceRef? ConvertFromInternalModel(Models.Internal.DeviceRef? item) + { + if (item == null) + return null; + + var deviceRef = new DeviceRef + { + Name = item.ReadString(Models.Internal.DipSwitch.NameKey), + }; + return deviceRef; + } + + /// + /// Convert from to + /// + private static Disk? ConvertFromInternalModel(Models.Internal.Disk? item) + { + if (item == null) + return null; + + var disk = new Disk + { + Name = item.ReadString(Models.Internal.Disk.NameKey), + MD5 = item.ReadString(Models.Internal.Disk.MD5Key), + SHA1 = item.ReadString(Models.Internal.Disk.SHA1Key), + Merge = item.ReadString(Models.Internal.Disk.MergeKey), + Status = item.ReadString(Models.Internal.Disk.StatusKey), + Region = item.ReadString(Models.Internal.Disk.RegionKey), + }; + return disk; + } + + /// + /// Convert from to + /// + private static Driver? ConvertFromInternalModel(Models.Internal.Driver? item) + { + if (item == null) + return null; + + var driver = new Driver + { + Status = item.ReadString(Models.Internal.Driver.StatusKey), + Emulation = item.ReadString(Models.Internal.Driver.EmulationKey), + Cocktail = item.ReadString(Models.Internal.Driver.CocktailKey), + SaveState = item.ReadString(Models.Internal.Driver.SaveStateKey), + RequiresArtwork = item.ReadString(Models.Internal.Driver.RequiresArtworkKey), + Unofficial = item.ReadString(Models.Internal.Driver.UnofficialKey), + NoSoundHardware = item.ReadString(Models.Internal.Driver.NoSoundHardwareKey), + Incomplete = item.ReadString(Models.Internal.Driver.IncompleteKey), + }; + return driver; + } + + /// + /// Convert from to + /// + private static Media? ConvertFromInternalModel(Models.Internal.Media? item) + { + if (item == null) + return null; + + var media = new Media + { + Name = item.ReadString(Models.Internal.Media.NameKey), + MD5 = item.ReadString(Models.Internal.Media.MD5Key), + SHA1 = item.ReadString(Models.Internal.Media.SHA1Key), + SHA256 = item.ReadString(Models.Internal.Media.SHA256Key), + SpamSum = item.ReadString(Models.Internal.Media.SpamSumKey), + }; + return media; + } + + /// + /// Convert from to + /// + private static Release? ConvertFromInternalModel(Models.Internal.Release? item) + { + if (item == null) + return null; + + var release = new Release + { + Name = item.ReadString(Models.Internal.Release.NameKey), + Region = item.ReadString(Models.Internal.Release.RegionKey), + Language = item.ReadString(Models.Internal.Release.LanguageKey), + Date = item.ReadString(Models.Internal.Release.DateKey), + Default = item.ReadString(Models.Internal.Release.DefaultKey), + }; + return release; + } + + /// + /// Convert from to + /// + private static Rom? ConvertFromInternalModel(Models.Internal.Rom? item) + { + if (item == null) + return null; + + var rom = new Rom + { + Name = item.ReadString(Models.Internal.Rom.NameKey), + Size = item.ReadString(Models.Internal.Rom.SizeKey), + CRC = item.ReadString(Models.Internal.Rom.CRCKey), + MD5 = item.ReadString(Models.Internal.Rom.MD5Key), + SHA1 = item.ReadString(Models.Internal.Rom.SHA1Key), + SHA256 = item.ReadString(Models.Internal.Rom.SHA256Key), + SHA384 = item.ReadString(Models.Internal.Rom.SHA384Key), + SHA512 = item.ReadString(Models.Internal.Rom.SHA512Key), + SpamSum = item.ReadString(Models.Internal.Rom.SpamSumKey), + xxHash364 = item.ReadString(Models.Internal.Rom.xxHash364Key), + xxHash3128 = item.ReadString(Models.Internal.Rom.xxHash3128Key), + Merge = item.ReadString(Models.Internal.Rom.MergeKey), + Status = item.ReadString(Models.Internal.Rom.StatusKey), + Serial = item.ReadString(Models.Internal.Rom.SerialKey), + Header = item.ReadString(Models.Internal.Rom.HeaderKey), + Date = item.ReadString(Models.Internal.Rom.DateKey), + Inverted = item.ReadString(Models.Internal.Rom.InvertedKey), + MIA = item.ReadString(Models.Internal.Rom.MIAKey), + }; + return rom; + } + + /// + /// Convert from to + /// + private static Sample? ConvertFromInternalModel(Models.Internal.Sample? item) + { + if (item == null) + return null; + + var sample = new Sample + { + Name = item.ReadString(Models.Internal.Sample.NameKey), + }; + return sample; + } + + /// + /// Convert from to + /// + private static SoftwareList? ConvertFromInternalModel(Models.Internal.SoftwareList? item) + { + if (item == null) + return null; + + var softwareList = new SoftwareList + { + Tag = item.ReadString(Models.Internal.SoftwareList.TagKey), + Name = item.ReadString(Models.Internal.SoftwareList.NameKey), + Status = item.ReadString(Models.Internal.SoftwareList.StatusKey), + Filter = item.ReadString(Models.Internal.SoftwareList.FilterKey), + }; + return softwareList; + } + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.Serialization/Logiqx.Serializer.cs b/SabreTools.Serialization/Logiqx.Serializer.cs new file mode 100644 index 00000000..9ec1d10c --- /dev/null +++ b/SabreTools.Serialization/Logiqx.Serializer.cs @@ -0,0 +1,323 @@ +using System.IO; +using System.Linq; +using SabreTools.Models.Logiqx; + +namespace SabreTools.Serialization +{ + /// + /// XML serializer for Logiqx-derived metadata files + /// + public partial class Logiqx : XmlSerializer + { + /// + public static bool SerializeToFileWithDocType(Datafile obj, string path) + => SerializeToFile(obj, path, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); + + /// + public static Stream? SerializeToStreamWithDocType(Datafile obj, string path) + => SerializeToStream(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); + + #region Internal + + /// + /// Convert from to + /// + public static Models.Internal.MetadataFile ConvertToInternalModel(Datafile item) + { + var metadataFile = new Models.Internal.MetadataFile + { + [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + // TODO: Handle Dir items + if (item?.Game != null && item.Game.Any()) + metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game.Select(ConvertMachineToInternalModel).ToArray(); + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Internal.Header ConvertHeaderToInternalModel(Datafile item) + { + var header = ConvertHeaderToInternalModel(item.Header); + + header[Models.Internal.Header.BuildKey] = item.Build; + header[Models.Internal.Header.DebugKey] = item.Debug; + header[Models.Internal.Header.SchemaLocationKey] = item.SchemaLocation; + + return header; + } + + /// + /// Convert from to + /// + private static Models.Internal.Header ConvertHeaderToInternalModel(Header item) + { + var header = new Models.Internal.Header + { + [Models.Internal.Header.IdKey] = item.Id, + [Models.Internal.Header.NameKey] = item.Name, + [Models.Internal.Header.DescriptionKey] = item.Description, + [Models.Internal.Header.RootDirKey] = item.RootDir, + [Models.Internal.Header.CategoryKey] = item.Category, + [Models.Internal.Header.VersionKey] = item.Version, + [Models.Internal.Header.DateKey] = item.Date, + [Models.Internal.Header.AuthorKey] = item.Author, + [Models.Internal.Header.EmailKey] = item.Email, + [Models.Internal.Header.HomepageKey] = item.Homepage, + [Models.Internal.Header.UrlKey] = item.Url, + [Models.Internal.Header.CommentKey] = item.Comment, + [Models.Internal.Header.TypeKey] = item.Type, + }; + + if (item.ClrMamePro != null) + { + header[Models.Internal.Header.HeaderKey] = item.ClrMamePro.Header; + header[Models.Internal.Header.ForceMergingKey] = item.ClrMamePro.ForceMerging; + header[Models.Internal.Header.ForceNodumpKey] = item.ClrMamePro.ForceNodump; + header[Models.Internal.Header.ForcePackingKey] = item.ClrMamePro.ForcePacking; + } + + if (item.RomCenter != null) + { + header[Models.Internal.Header.PluginKey] = item.RomCenter.Plugin; + header[Models.Internal.Header.RomModeKey] = item.RomCenter.RomMode; + header[Models.Internal.Header.BiosModeKey] = item.RomCenter.BiosMode; + header[Models.Internal.Header.SampleModeKey] = item.RomCenter.SampleMode; + header[Models.Internal.Header.LockRomModeKey] = item.RomCenter.LockRomMode; + header[Models.Internal.Header.LockBiosModeKey] = item.RomCenter.LockBiosMode; + header[Models.Internal.Header.LockSampleModeKey] = item.RomCenter.LockSampleMode; + } + + return header; + } + + /// + /// Convert from to + /// + private static Models.Internal.Machine ConvertMachineToInternalModel(GameBase item) + { + var machine = new Models.Internal.Machine + { + [Models.Internal.Machine.NameKey] = item.Name, + [Models.Internal.Machine.SourceFileKey] = item.SourceFile, + [Models.Internal.Machine.IsBiosKey] = item.IsBios, + [Models.Internal.Machine.IsDeviceKey] = item.IsDevice, + [Models.Internal.Machine.IsMechanicalKey] = item.IsMechanical, + [Models.Internal.Machine.CloneOfKey] = item.CloneOf, + [Models.Internal.Machine.RomOfKey] = item.RomOf, + [Models.Internal.Machine.SampleOfKey] = item.SampleOf, + [Models.Internal.Machine.BoardKey] = item.Board, + [Models.Internal.Machine.RebuildToKey] = item.RebuildTo, + [Models.Internal.Machine.IdKey] = item.Id, + [Models.Internal.Machine.CloneOfIdKey] = item.CloneOfId, + [Models.Internal.Machine.RunnableKey] = item.Runnable, + [Models.Internal.Machine.CommentKey] = item.Comment, + [Models.Internal.Machine.DescriptionKey] = item.Description, + [Models.Internal.Machine.YearKey] = item.Year, + [Models.Internal.Machine.ManufacturerKey] = item.Manufacturer, + [Models.Internal.Machine.PublisherKey] = item.Publisher, + [Models.Internal.Machine.CategoryKey] = item.Category, + [Models.Internal.Machine.TruripKey] = item.Trurip, + }; + + if (item.Release != null && item.Release.Any()) + machine[Models.Internal.Machine.ReleaseKey] = item.Release.Select(ConvertToInternalModel).ToArray(); + + if (item.BiosSet != null && item.BiosSet.Any()) + machine[Models.Internal.Machine.BiosSetKey] = item.BiosSet.Select(ConvertToInternalModel).ToArray(); + + if (item.Rom != null && item.Rom.Any()) + machine[Models.Internal.Machine.RomKey] = item.Rom.Select(ConvertToInternalModel).ToArray(); + + if (item.Disk != null && item.Disk.Any()) + machine[Models.Internal.Machine.DiskKey] = item.Disk.Select(ConvertToInternalModel).ToArray(); + + if (item.Media != null && item.Media.Any()) + machine[Models.Internal.Machine.MediaKey] = item.Media.Select(ConvertToInternalModel).ToArray(); + + if (item.DeviceRef != null && item.DeviceRef.Any()) + machine[Models.Internal.Machine.DeviceRefKey] = item.DeviceRef.Select(ConvertToInternalModel).ToArray(); + + if (item.Sample != null && item.Sample.Any()) + machine[Models.Internal.Machine.SampleKey] = item.Sample.Select(ConvertToInternalModel).ToArray(); + + if (item.Archive != null && item.Archive.Any()) + machine[Models.Internal.Machine.ArchiveKey] = item.Archive.Select(ConvertToInternalModel).ToArray(); + + if (item.Driver != null && item.Driver.Any()) + machine[Models.Internal.Machine.DriverKey] = item.Driver.Select(ConvertToInternalModel).ToArray(); + + if (item.SoftwareList != null && item.SoftwareList.Any()) + machine[Models.Internal.Machine.SoftwareListKey] = item.SoftwareList.Select(ConvertToInternalModel).ToArray(); + + return machine; + } + + /// + /// Convert from to + /// + private static Models.Internal.Archive ConvertToInternalModel(Archive item) + { + var archive = new Models.Internal.Archive + { + [Models.Internal.Archive.NameKey] = item.Name, + }; + return archive; + } + + /// + /// Convert from to + /// + private static Models.Internal.BiosSet ConvertToInternalModel(BiosSet item) + { + var biosset = new Models.Internal.BiosSet + { + [Models.Internal.BiosSet.NameKey] = item.Name, + [Models.Internal.BiosSet.DescriptionKey] = item.Description, + [Models.Internal.BiosSet.DefaultKey] = item.Default, + }; + return biosset; + } + + /// + /// Convert from to + /// + private static Models.Internal.DeviceRef ConvertToInternalModel(DeviceRef item) + { + var deviceRef = new Models.Internal.DeviceRef + { + [Models.Internal.DeviceRef.NameKey] = item.Name, + }; + return deviceRef; + } + + /// + /// Convert from to + /// + private static Models.Internal.Disk ConvertToInternalModel(Disk item) + { + var disk = new Models.Internal.Disk + { + [Models.Internal.Disk.NameKey] = item.Name, + [Models.Internal.Disk.MD5Key] = item.MD5, + [Models.Internal.Disk.SHA1Key] = item.SHA1, + [Models.Internal.Disk.MergeKey] = item.Merge, + [Models.Internal.Disk.StatusKey] = item.Status, + [Models.Internal.Disk.RegionKey] = item.Region, + }; + return disk; + } + + /// + /// Convert from to + /// + private static Models.Internal.Driver ConvertToInternalModel(Driver item) + { + var driver = new Models.Internal.Driver + { + [Models.Internal.Driver.StatusKey] = item.Status, + [Models.Internal.Driver.EmulationKey] = item.Emulation, + [Models.Internal.Driver.CocktailKey] = item.Cocktail, + [Models.Internal.Driver.SaveStateKey] = item.SaveState, + [Models.Internal.Driver.RequiresArtworkKey] = item.RequiresArtwork, + [Models.Internal.Driver.UnofficialKey] = item.Unofficial, + [Models.Internal.Driver.NoSoundHardwareKey] = item.NoSoundHardware, + [Models.Internal.Driver.IncompleteKey] = item.Incomplete, + }; + return driver; + } + + /// + /// Convert from to + /// + private static Models.Internal.Media ConvertToInternalModel(Media item) + { + var media = new Models.Internal.Media + { + [Models.Internal.Media.NameKey] = item.Name, + [Models.Internal.Media.MD5Key] = item.MD5, + [Models.Internal.Media.SHA1Key] = item.SHA1, + [Models.Internal.Media.SHA256Key] = item.SHA256, + [Models.Internal.Media.SpamSumKey] = item.SpamSum, + }; + return media; + } + + /// + /// Convert from to + /// + private static Models.Internal.Release ConvertToInternalModel(Release item) + { + var release = new Models.Internal.Release + { + [Models.Internal.Release.NameKey] = item.Name, + [Models.Internal.Release.RegionKey] = item.Region, + [Models.Internal.Release.LanguageKey] = item.Language, + [Models.Internal.Release.DateKey] = item.Date, + [Models.Internal.Release.DefaultKey] = item.Default, + }; + return release; + } + + /// + /// Convert from to + /// + private static Models.Internal.Rom ConvertToInternalModel(Rom item) + { + 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.MD5Key] = item.MD5, + [Models.Internal.Rom.SHA1Key] = item.SHA1, + [Models.Internal.Rom.SHA256Key] = item.SHA256, + [Models.Internal.Rom.SHA384Key] = item.SHA384, + [Models.Internal.Rom.SHA512Key] = item.SHA512, + [Models.Internal.Rom.SpamSumKey] = item.SpamSum, + [Models.Internal.Rom.xxHash364Key] = item.xxHash364, + [Models.Internal.Rom.xxHash3128Key] = item.xxHash3128, + [Models.Internal.Rom.MergeKey] = item.Merge, + [Models.Internal.Rom.StatusKey] = item.Status, + [Models.Internal.Rom.SerialKey] = item.Serial, + [Models.Internal.Rom.HeaderKey] = item.Header, + [Models.Internal.Rom.DateKey] = item.Date, + [Models.Internal.Rom.InvertedKey] = item.Inverted, + [Models.Internal.Rom.MIAKey] = item.MIA, + }; + return rom; + } + + /// + /// Convert from to + /// + private static Models.Internal.Sample ConvertToInternalModel(Sample item) + { + var sample = new Models.Internal.Sample + { + [Models.Internal.Sample.NameKey] = item.Name, + }; + return sample; + } + + /// + /// Convert from to + /// + private static Models.Internal.SoftwareList ConvertToInternalModel(SoftwareList item) + { + var softwareList = new Models.Internal.SoftwareList + { + [Models.Internal.SoftwareList.TagKey] = item.Tag, + [Models.Internal.SoftwareList.NameKey] = item.Name, + [Models.Internal.SoftwareList.StatusKey] = item.Status, + [Models.Internal.SoftwareList.FilterKey] = item.Filter, + }; + return softwareList; + } + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.Serialization/Logiqx.cs b/SabreTools.Serialization/Logiqx.cs index 84923351..0c75729f 100644 --- a/SabreTools.Serialization/Logiqx.cs +++ b/SabreTools.Serialization/Logiqx.cs @@ -1,11 +1,9 @@ -using System.IO; - namespace SabreTools.Serialization { /// /// XML deserializer for Logiqx-derived metadata files /// - public class Logiqx : XmlSerializer + public partial class Logiqx : XmlSerializer { /// /// name field for DOCTYPE @@ -26,13 +24,5 @@ namespace SabreTools.Serialization /// subset field for DOCTYPE /// public const string? DocTypeSubset = null; - - /// - public static bool SerializeToFileWithDocType(Models.Logiqx.Datafile obj, string path) - => SerializeToFile(obj, path, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); - - /// - public static Stream? SerializeToStreamWithDocType(Models.Logiqx.Datafile obj, string path) - => SerializeToStream(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); } } \ No newline at end of file