diff --git a/SabreTools.Serialization/ClrMamePro.Deserializer.cs b/SabreTools.Serialization/ClrMamePro.Deserializer.cs index adf70d7f..f19ddb79 100644 --- a/SabreTools.Serialization/ClrMamePro.Deserializer.cs +++ b/SabreTools.Serialization/ClrMamePro.Deserializer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using SabreTools.IO.Readers; using SabreTools.Models.ClrMamePro; @@ -828,5 +829,350 @@ namespace SabreTools.Serialization driver.ADDITIONAL_ELEMENTS = itemAdditional.ToArray(); return driver; } + + // TODO: Add deserialization of entire MetadataFile + #region Internal + + /// + /// Convert from to + /// + public static Models.ClrMamePro.ClrMamePro? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + { + if (item == null) + return null; + + var clrMamePro = new Models.ClrMamePro.ClrMamePro + { + 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), + Homepage = item.ReadString(Models.Internal.Header.HomepageKey), + Url = item.ReadString(Models.Internal.Header.UrlKey), + Comment = item.ReadString(Models.Internal.Header.CommentKey), + Header = item.ReadString(Models.Internal.Header.HeaderKey), + Type = item.ReadString(Models.Internal.Header.TypeKey), + ForceMerging = item.ReadString(Models.Internal.Header.ForceMergingKey), + ForceZipping = item.ReadString(Models.Internal.Header.ForceZippingKey), + ForcePacking = item.ReadString(Models.Internal.Header.ForcePackingKey), + }; + return clrMamePro; + } + + /// + /// Convert from to + /// + public static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) + { + if (item == null) + return null; + + GameBase gameBase = game ? new Models.ClrMamePro.Game() : new Models.ClrMamePro.Machine(); + + gameBase.Name = item.ReadString(Models.Internal.Machine.NameKey); + 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.Category = item.ReadString(Models.Internal.Machine.CategoryKey); + gameBase.CloneOf = item.ReadString(Models.Internal.Machine.CloneOfKey); + gameBase.RomOf = item.ReadString(Models.Internal.Machine.RomOfKey); + gameBase.SampleOf = item.ReadString(Models.Internal.Machine.SampleOfKey); + + 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 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 chips = item.Read(Models.Internal.Machine.ChipKey); + gameBase.Chip = chips?.Select(ConvertFromInternalModel)?.ToArray(); + + var video = item.Read(Models.Internal.Machine.VideoKey); + gameBase.Video = ConvertFromInternalModel(video); + + var sound = item.Read(Models.Internal.Machine.SoundKey); + gameBase.Sound = ConvertFromInternalModel(sound); + + var input = item.Read(Models.Internal.Machine.InputKey); + gameBase.Input = ConvertFromInternalModel(input); + + var dipSwitches = item.Read(Models.Internal.Machine.DipSwitchKey); + gameBase.DipSwitch = dipSwitches?.Select(ConvertFromInternalModel)?.ToArray(); + + var driver = item.Read(Models.Internal.Machine.DriverKey); + gameBase.Driver = ConvertFromInternalModel(driver); + + 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 Chip? ConvertFromInternalModel(Models.Internal.Chip? item) + { + if (item == null) + return null; + + var chip = new Chip + { + Type = item.ReadString(Models.Internal.Chip.ChipTypeKey), + Name = item.ReadString(Models.Internal.Chip.NameKey), + Flags = item.ReadString(Models.Internal.Chip.FlagsKey), + Clock = item.ReadString(Models.Internal.Chip.ClockKey), + }; + return chip; + } + + /// + /// Convert from to + /// + private static DipSwitch? ConvertFromInternalModel(Models.Internal.DipSwitch? item) + { + if (item == null) + return null; + + var dipswitch = new DipSwitch + { + Name = item.ReadString(Models.Internal.DipSwitch.NameKey), + Entry = item[Models.Internal.DipSwitch.EntryKey] as string[], + Default = item.ReadString(Models.Internal.DipSwitch.DefaultKey), + }; + return dipswitch; + } + + /// + /// 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), + Flags = item.ReadString(Models.Internal.Disk.FlagsKey), + }; + 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), + Color = item.ReadString(Models.Internal.Driver.ColorKey), + Sound = item.ReadString(Models.Internal.Driver.SoundKey), + PaletteSize = item.ReadString(Models.Internal.Driver.PaletteSizeKey), + Blit = item.ReadString(Models.Internal.Driver.BlitKey), + }; + return driver; + } + + /// + /// Convert from to + /// + private static Input? ConvertFromInternalModel(Models.Internal.Input? item) + { + if (item == null) + return null; + + var input = new Input + { + Players = item.ReadString(Models.Internal.Input.PlayersKey), + Control = item.ReadString(Models.Internal.Input.ControlKey), + Buttons = item.ReadString(Models.Internal.Input.ButtonsKey), + Coins = item.ReadString(Models.Internal.Input.CoinsKey), + Tilt = item.ReadString(Models.Internal.Input.TiltKey), + Service = item.ReadString(Models.Internal.Input.ServiceKey), + }; + return input; + } + + /// + /// 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), + Region = item.ReadString(Models.Internal.Rom.RegionKey), + Flags = item.ReadString(Models.Internal.Rom.FlagsKey), + Offs = item.ReadString(Models.Internal.Rom.OffsetKey), + 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 Sound? ConvertFromInternalModel(Models.Internal.Sound? item) + { + if (item == null) + return null; + + var sound = new Sound + { + Channels = item.ReadString(Models.Internal.Sound.ChannelsKey), + }; + return sound; + } + + /// + /// Convert from to + /// + private static Video? ConvertFromInternalModel(Models.Internal.Video? item) + { + if (item == null) + return null; + + var video = new Video + { + Screen = item.ReadString(Models.Internal.Video.ScreenKey), + Orientation = item.ReadString(Models.Internal.Video.OrientationKey), + X = item.ReadString(Models.Internal.Video.WidthKey), + Y = item.ReadString(Models.Internal.Video.HeightKey), + AspectX = item.ReadString(Models.Internal.Video.AspectXKey), + AspectY = item.ReadString(Models.Internal.Video.AspectYKey), + Freq = item.ReadString(Models.Internal.Video.RefreshKey), + }; + return video; + } + + #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/ClrMamePro.Serializer.cs b/SabreTools.Serialization/ClrMamePro.Serializer.cs index 527810ec..5c42c9ec 100644 --- a/SabreTools.Serialization/ClrMamePro.Serializer.cs +++ b/SabreTools.Serialization/ClrMamePro.Serializer.cs @@ -455,5 +455,321 @@ namespace SabreTools.Serialization writer.WriteOptionalAttributeString("blit", driver.Blit); writer.WriteEndElement(); // driver } + + #region Internal + + /// + /// Convert from to + /// + public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) + { + var metadataFile = new Models.Internal.MetadataFile(); + + if (item?.ClrMamePro != null) + metadataFile[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item.ClrMamePro); + + 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(Models.ClrMamePro.ClrMamePro item) + { + var header = new Models.Internal.Header + { + [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.HomepageKey] = item.Homepage, + [Models.Internal.Header.UrlKey] = item.Url, + [Models.Internal.Header.CommentKey] = item.Comment, + [Models.Internal.Header.HeaderKey] = item.Header, + [Models.Internal.Header.TypeKey] = item.Type, + [Models.Internal.Header.ForceMergingKey] = item.ForceMerging, + [Models.Internal.Header.ForceZippingKey] = item.ForceZipping, + [Models.Internal.Header.ForcePackingKey] = item.ForcePacking, + }; + 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.DescriptionKey] = item.Description, + [Models.Internal.Machine.YearKey] = item.Year, + [Models.Internal.Machine.ManufacturerKey] = item.Manufacturer, + [Models.Internal.Machine.CategoryKey] = item.Category, + [Models.Internal.Machine.CloneOfKey] = item.CloneOf, + [Models.Internal.Machine.RomOfKey] = item.RomOf, + [Models.Internal.Machine.SampleOfKey] = item.SampleOf, + }; + + 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.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.Chip != null && item.Chip.Any()) + machine[Models.Internal.Machine.ChipKey] = item.Chip?.Select(ConvertToInternalModel)?.ToArray(); + + if (item.Video != null) + machine[Models.Internal.Machine.VideoKey] = ConvertToInternalModel(item.Video); + + if (item.Sound != null) + machine[Models.Internal.Machine.SoundKey] = ConvertToInternalModel(item.Sound); + + if (item.Input != null) + machine[Models.Internal.Machine.InputKey] = ConvertToInternalModel(item.Input); + + if (item.DipSwitch != null && item.DipSwitch.Any()) + machine[Models.Internal.Machine.DipSwitchKey] = item.DipSwitch?.Select(ConvertToInternalModel)?.ToArray(); + + if (item.Driver != null) + machine[Models.Internal.Machine.DriverKey] = ConvertToInternalModel(item.Driver); + + 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.Chip ConvertToInternalModel(Chip item) + { + var chip = new Models.Internal.Chip + { + [Models.Internal.Chip.ChipTypeKey] = item.Type, + [Models.Internal.Chip.NameKey] = item.Name, + [Models.Internal.Chip.FlagsKey] = item.Flags, + [Models.Internal.Chip.ClockKey] = item.Clock, + }; + return chip; + } + + /// + /// Convert from to + /// + private static Models.Internal.DipSwitch ConvertToInternalModel(DipSwitch item) + { + var dipswitch = new Models.Internal.DipSwitch + { + [Models.Internal.DipSwitch.NameKey] = item.Name, + [Models.Internal.DipSwitch.EntryKey] = item.Entry, + [Models.Internal.DipSwitch.DefaultKey] = item.Default, + }; + return dipswitch; + } + + /// + /// 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.FlagsKey] = item.Flags, + }; + 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.ColorKey] = item.Color, + [Models.Internal.Driver.SoundKey] = item.Sound, + [Models.Internal.Driver.PaletteSizeKey] = item.PaletteSize, + [Models.Internal.Driver.BlitKey] = item.Blit, + }; + return driver; + } + + /// + /// Convert from to + /// + private static Models.Internal.Input ConvertToInternalModel(Input item) + { + var input = new Models.Internal.Input + { + [Models.Internal.Input.PlayersKey] = item.Players, + [Models.Internal.Input.ControlKey] = item.Control, + [Models.Internal.Input.ButtonsKey] = item.Buttons, + [Models.Internal.Input.CoinsKey] = item.Coins, + [Models.Internal.Input.TiltKey] = item.Tilt, + [Models.Internal.Input.ServiceKey] = item.Service, + }; + return input; + } + + /// + /// 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.RegionKey] = item.Region, + [Models.Internal.Rom.FlagsKey] = item.Flags, + [Models.Internal.Rom.OffsetKey] = item.Offs, + [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.Sound ConvertToInternalModel(Sound item) + { + var sound = new Models.Internal.Sound + { + [Models.Internal.Sound.ChannelsKey] = item.Channels, + }; + return sound; + } + + /// + /// Convert from to + /// + private static Models.Internal.Video ConvertToInternalModel(Video item) + { + var video = new Models.Internal.Video + { + [Models.Internal.Video.ScreenKey] = item.Screen, + [Models.Internal.Video.OrientationKey] = item.Orientation, + [Models.Internal.Video.WidthKey] = item.X, + [Models.Internal.Video.HeightKey] = item.Y, + [Models.Internal.Video.AspectXKey] = item.AspectX, + [Models.Internal.Video.AspectYKey] = item.AspectY, + [Models.Internal.Video.RefreshKey] = item.Freq, + }; + return video; + } + + #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Internal.ClrMamePro.cs b/SabreTools.Serialization/Internal.ClrMamePro.cs deleted file mode 100644 index d09a7a1f..00000000 --- a/SabreTools.Serialization/Internal.ClrMamePro.cs +++ /dev/null @@ -1,735 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using SabreTools.Models.Internal; - -namespace SabreTools.Serialization -{ - /// - /// Serializer for ClrMamePro models to internal structure - /// - public partial class Internal - { - #region Serialize - - /// - /// Convert from to - /// - public static MetadataFile ConvertToInternalModel(Models.ClrMamePro.MetadataFile item) - { - var metadataFile = new MetadataFile(); - - if (item?.ClrMamePro != null) - metadataFile[MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item.ClrMamePro); - - 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.ClrMamePro.ClrMamePro item) - { - var header = new Header - { - [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.HomepageKey] = item.Homepage, - [Header.UrlKey] = item.Url, - [Header.CommentKey] = item.Comment, - [Header.HeaderKey] = item.Header, - [Header.TypeKey] = item.Type, - [Header.ForceMergingKey] = item.ForceMerging, - [Header.ForceZippingKey] = item.ForceZipping, - [Header.ForcePackingKey] = item.ForcePacking, - }; - return header; - } - - /// - /// Convert from to - /// - private static Machine ConvertMachineToInternalModel(Models.ClrMamePro.GameBase item) - { - var machine = new Machine - { - [Machine.NameKey] = item.Name, - [Machine.DescriptionKey] = item.Description, - [Machine.YearKey] = item.Year, - [Machine.ManufacturerKey] = item.Manufacturer, - [Machine.CategoryKey] = item.Category, - [Machine.CloneOfKey] = item.CloneOf, - [Machine.RomOfKey] = item.RomOf, - [Machine.SampleOfKey] = item.SampleOf, - }; - - 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.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.Chip != null && item.Chip.Any()) - { - var chips = new List(); - foreach (var chip in item.Chip) - { - chips.Add(ConvertToInternalModel(chip)); - } - machine[Machine.ChipKey] = chips.ToArray(); - } - - if (item.Video != null) - machine[Machine.VideoKey] = ConvertToInternalModel(item.Video); - - if (item.Sound != null) - machine[Machine.SoundKey] = ConvertToInternalModel(item.Sound); - - if (item.Input != null) - machine[Machine.InputKey] = ConvertToInternalModel(item.Input); - - if (item.DipSwitch != null && item.DipSwitch.Any()) - { - var dipSwitches = new List(); - foreach (var dipSwitch in item.DipSwitch) - { - dipSwitches.Add(ConvertToInternalModel(dipSwitch)); - } - machine[Machine.DipSwitchKey] = dipSwitches.ToArray(); - } - - if (item.Driver != null) - machine[Machine.DriverKey] = ConvertToInternalModel(item.Driver); - - return machine; - } - - /// - /// Convert from to - /// - private static Archive ConvertToInternalModel(Models.ClrMamePro.Archive item) - { - var archive = new Archive - { - [Archive.NameKey] = item.Name, - }; - return archive; - } - - /// - /// Convert from to - /// - private static BiosSet ConvertToInternalModel(Models.ClrMamePro.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 Chip ConvertToInternalModel(Models.ClrMamePro.Chip item) - { - var chip = new Chip - { - [Chip.ChipTypeKey] = item.Type, - [Chip.NameKey] = item.Name, - [Chip.FlagsKey] = item.Flags, - [Chip.ClockKey] = item.Clock, - }; - return chip; - } - - /// - /// Convert from to - /// - private static DipSwitch ConvertToInternalModel(Models.ClrMamePro.DipSwitch item) - { - var dipswitch = new DipSwitch - { - [DipSwitch.NameKey] = item.Name, - [DipSwitch.EntryKey] = item.Entry, - [DipSwitch.DefaultKey] = item.Default, - }; - return dipswitch; - } - - /// - /// Convert from to - /// - private static Disk ConvertToInternalModel(Models.ClrMamePro.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.FlagsKey] = item.Flags, - }; - return disk; - } - - /// - /// Convert from to - /// - private static Driver ConvertToInternalModel(Models.ClrMamePro.Driver item) - { - var driver = new Driver - { - [Driver.StatusKey] = item.Status, - [Driver.ColorKey] = item.Color, - [Driver.SoundKey] = item.Sound, - [Driver.PaletteSizeKey] = item.PaletteSize, - [Driver.BlitKey] = item.Blit, - }; - return driver; - } - - /// - /// Convert from to - /// - private static Input ConvertToInternalModel(Models.ClrMamePro.Input item) - { - var input = new Input - { - [Input.PlayersKey] = item.Players, - [Input.ControlKey] = item.Control, - [Input.ButtonsKey] = item.Buttons, - [Input.CoinsKey] = item.Coins, - [Input.TiltKey] = item.Tilt, - [Input.ServiceKey] = item.Service, - }; - return input; - } - - /// - /// Convert from to - /// - private static Media ConvertToInternalModel(Models.ClrMamePro.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.ClrMamePro.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.ClrMamePro.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.RegionKey] = item.Region, - [Rom.FlagsKey] = item.Flags, - [Rom.OffsetKey] = item.Offs, - [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.ClrMamePro.Sample item) - { - var sample = new Sample - { - [Sample.NameKey] = item.Name, - }; - return sample; - } - - /// - /// Convert from to - /// - private static Sound ConvertToInternalModel(Models.ClrMamePro.Sound item) - { - var sound = new Sound - { - [Sound.ChannelsKey] = item.Channels, - }; - return sound; - } - - /// - /// Convert from to - /// - private static Video ConvertToInternalModel(Models.ClrMamePro.Video item) - { - var video = new Video - { - [Video.ScreenKey] = item.Screen, - [Video.OrientationKey] = item.Orientation, - [Video.WidthKey] = item.X, - [Video.HeightKey] = item.Y, - [Video.AspectXKey] = item.AspectX, - [Video.AspectYKey] = item.AspectY, - [Video.RefreshKey] = item.Freq, - }; - return video; - } - - #endregion - - #region Deserialize - - /// - /// Convert from to - /// - public static Models.ClrMamePro.ClrMamePro? ConvertHeaderToClrMamePro(Header? item) - { - if (item == null) - return null; - - var clrMamePro = new Models.ClrMamePro.ClrMamePro - { - 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), - Homepage = item.ReadString(Header.HomepageKey), - Url = item.ReadString(Header.UrlKey), - Comment = item.ReadString(Header.CommentKey), - Header = item.ReadString(Header.HeaderKey), - Type = item.ReadString(Header.TypeKey), - ForceMerging = item.ReadString(Header.ForceMergingKey), - ForceZipping = item.ReadString(Header.ForceZippingKey), - ForcePacking = item.ReadString(Header.ForcePackingKey), - }; - return clrMamePro; - } - - /// - /// Convert from to - /// - public static Models.ClrMamePro.GameBase? ConvertMachineToClrMamePro(Machine? item, bool game = false) - { - if (item == null) - return null; - - Models.ClrMamePro.GameBase gameBase = game ? new Models.ClrMamePro.Game() : new Models.ClrMamePro.Machine(); - - gameBase.Name = item.ReadString(Machine.NameKey); - gameBase.Description = item.ReadString(Machine.DescriptionKey); - gameBase.Year = item.ReadString(Machine.YearKey); - gameBase.Manufacturer = item.ReadString(Machine.ManufacturerKey); - gameBase.Category = item.ReadString(Machine.CategoryKey); - gameBase.CloneOf = item.ReadString(Machine.CloneOfKey); - gameBase.RomOf = item.ReadString(Machine.RomOfKey); - gameBase.SampleOf = item.ReadString(Machine.SampleOfKey); - - var releases = item.Read(Machine.ReleaseKey); - gameBase.Release = releases?.Select(ConvertToClrMamePro)?.ToArray(); - - var biosSets = item.Read(Machine.BiosSetKey); - gameBase.BiosSet = biosSets?.Select(ConvertToClrMamePro)?.ToArray(); - - var roms = item.Read(Machine.RomKey); - gameBase.Rom = roms?.Select(ConvertToClrMamePro)?.ToArray(); - - var disks = item.Read(Machine.DiskKey); - gameBase.Disk = disks?.Select(ConvertToClrMamePro)?.ToArray(); - - var medias = item.Read(Machine.MediaKey); - gameBase.Media = medias?.Select(ConvertToClrMamePro)?.ToArray(); - - var samples = item.Read(Machine.SampleKey); - gameBase.Sample = samples?.Select(ConvertToClrMamePro)?.ToArray(); - - var archives = item.Read(Machine.ArchiveKey); - gameBase.Archive = archives?.Select(ConvertToClrMamePro)?.ToArray(); - - var chips = item.Read(Machine.ChipKey); - gameBase.Chip = chips?.Select(ConvertToClrMamePro)?.ToArray(); - - var video = item.Read