diff --git a/CrossModel/Listxml.Deserializer.cs b/CrossModel/Listxml.Deserializer.cs new file mode 100644 index 00000000..1f5328a5 --- /dev/null +++ b/CrossModel/Listxml.Deserializer.cs @@ -0,0 +1,830 @@ +using System.Linq; +using SabreTools.Models.Listxml; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class Listxml : IModelSerializer + { + /// +#if NET48 + public Mame Deserialize(Models.Metadata.MetadataFile obj) +#else + public Mame? Deserialize(Models.Metadata.MetadataFile? obj) +#endif + { + if (obj == null) + return null; + + var header = obj.Read(Models.Metadata.MetadataFile.HeaderKey); + var mame = header != null ? ConvertMameFromInternalModel(header) : new Mame(); + + var machines = obj.Read(Models.Metadata.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + { + mame.Game = machines + .Where(m => m != null) + .Select(ConvertMachineFromInternalModel) + .ToArray(); + } + + return mame; + } + + /// + /// Convert from to + /// +#if NET48 + private static Mame ConvertMameFromInternalModel(Models.Metadata.MetadataFile item) +#else + public static Mame? ConvertMameFromInternalModel(Models.Metadata.MetadataFile? item) +#endif + { + if (item == null) + return null; + + var header = item.Read(Models.Metadata.MetadataFile.HeaderKey); + var mame = header != null ? ConvertMameFromInternalModel(header) : new Mame(); + + var machines = item.Read(Models.Metadata.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + { + mame.Game = machines + .Where(m => m != null) + .Select(ConvertMachineFromInternalModel) + .ToArray(); + } + + return mame; + } + + /// + /// Convert from to + /// + private static Mame ConvertMameFromInternalModel(Models.Metadata.Header item) + { + var mame = new Mame + { + Build = item.ReadString(Models.Metadata.Header.BuildKey), + Debug = item.ReadString(Models.Metadata.Header.DebugKey), + MameConfig = item.ReadString(Models.Metadata.Header.MameConfigKey), + }; + + return mame; + } + + /// + /// Convert from to + /// + internal static GameBase ConvertMachineFromInternalModel(Models.Metadata.Machine item) + { + var machine = new Machine + { + Name = item.ReadString(Models.Metadata.Machine.NameKey), + SourceFile = item.ReadString(Models.Metadata.Machine.SourceFileKey), + IsBios = item.ReadString(Models.Metadata.Machine.IsBiosKey), + IsDevice = item.ReadString(Models.Metadata.Machine.IsDeviceKey), + IsMechanical = item.ReadString(Models.Metadata.Machine.IsMechanicalKey), + Runnable = item.ReadString(Models.Metadata.Machine.RunnableKey), + CloneOf = item.ReadString(Models.Metadata.Machine.CloneOfKey), + RomOf = item.ReadString(Models.Metadata.Machine.RomOfKey), + SampleOf = item.ReadString(Models.Metadata.Machine.SampleOfKey), + Description = item.ReadString(Models.Metadata.Machine.DescriptionKey), + Year = item.ReadString(Models.Metadata.Machine.YearKey), + Manufacturer = item.ReadString(Models.Metadata.Machine.ManufacturerKey), + History = item.ReadString(Models.Metadata.Machine.HistoryKey), + }; + + var biosSets = item.Read(Models.Metadata.Machine.BiosSetKey); + if (biosSets != null && biosSets.Any()) + { + machine.BiosSet = biosSets + .Where(b => b != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var roms = item.Read(Models.Metadata.Machine.RomKey); + if (roms != null && roms.Any()) + { + machine.Rom = roms + .Where(r => r != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var disks = item.Read(Models.Metadata.Machine.DiskKey); + if (disks != null && disks.Any()) + { + machine.Disk = disks + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var deviceRefs = item.Read(Models.Metadata.Machine.DeviceRefKey); + if (deviceRefs != null && deviceRefs.Any()) + { + machine.DeviceRef = deviceRefs + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var samples = item.Read(Models.Metadata.Machine.SampleKey); + if (samples != null && samples.Any()) + { + machine.Sample = samples + .Where(s => s != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var chips = item.Read(Models.Metadata.Machine.ChipKey); + if (chips != null && chips.Any()) + { + machine.Chip = chips + .Where(c => c != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var displays = item.Read(Models.Metadata.Machine.DisplayKey); + if (displays != null && displays.Any()) + { + machine.Display = displays + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var videos = item.Read(Models.Metadata.Machine.VideoKey); + if (videos != null && videos.Any()) + { + machine.Video = videos + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var sound = item.Read(Models.Metadata.Machine.SoundKey); + if (sound != null) + machine.Sound = ConvertFromInternalModel(sound); + + var input = item.Read(Models.Metadata.Machine.InputKey); + if (input != null) + machine.Input = ConvertFromInternalModel(input); + + var dipSwitches = item.Read(Models.Metadata.Machine.DipSwitchKey); + if (dipSwitches != null && dipSwitches.Any()) + { + machine.DipSwitch = dipSwitches + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var configurations = item.Read(Models.Metadata.Machine.ConfigurationKey); + if (configurations != null && configurations.Any()) + { + machine.Configuration = configurations + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var ports = item.Read(Models.Metadata.Machine.PortKey); + if (ports != null && ports.Any()) + { + machine.Port = ports + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var adjusters = item.Read(Models.Metadata.Machine.AdjusterKey); + if (adjusters != null && adjusters.Any()) + { + machine.Adjuster = adjusters + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var driver = item.Read(Models.Metadata.Machine.DriverKey); + if (driver != null) + machine.Driver = ConvertFromInternalModel(driver); + + var features = item.Read(Models.Metadata.Machine.FeatureKey); + if (features != null && features.Any()) + { + machine.Feature = features + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var devices = item.Read(Models.Metadata.Machine.DeviceKey); + if (devices != null && devices.Any()) + { + machine.Device = devices + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var slots = item.Read(Models.Metadata.Machine.SlotKey); + if (slots != null && slots.Any()) + { + machine.Slot = slots + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var softwareLists = item.Read(Models.Metadata.Machine.SoftwareListKey); + if (softwareLists != null && softwareLists.Any()) + { + machine.SoftwareList = softwareLists + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var ramOptions = item.Read(Models.Metadata.Machine.RamOptionKey); + if (ramOptions != null && ramOptions.Any()) + { + machine.RamOption = ramOptions + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + return machine; + } + + /// + /// Convert from to + /// + private static Adjuster ConvertFromInternalModel(Models.Metadata.Adjuster item) + { + var adjuster = new Adjuster + { + Name = item.ReadString(Models.Metadata.Adjuster.NameKey), + Default = item.ReadString(Models.Metadata.Adjuster.DefaultKey), + }; + + var condition = item.Read(Models.Metadata.Adjuster.ConditionKey); + if (condition != null) + adjuster.Condition = ConvertFromInternalModel(condition); + + return adjuster; + } + + /// + /// Convert from to + /// + private static Analog ConvertFromInternalModel(Models.Metadata.Analog item) + { + var analog = new Analog + { + Mask = item.ReadString(Models.Metadata.Analog.MaskKey), + }; + return analog; + } + + /// + /// Convert from to + /// + private static BiosSet ConvertFromInternalModel(Models.Metadata.BiosSet item) + { + var biosset = new BiosSet + { + Name = item.ReadString(Models.Metadata.BiosSet.NameKey), + Description = item.ReadString(Models.Metadata.BiosSet.DescriptionKey), + Default = item.ReadString(Models.Metadata.BiosSet.DefaultKey), + }; + return biosset; + } + + /// + /// Convert from to + /// + private static Chip ConvertFromInternalModel(Models.Metadata.Chip item) + { + var chip = new Chip + { + Name = item.ReadString(Models.Metadata.Chip.NameKey), + Tag = item.ReadString(Models.Metadata.Chip.TagKey), + Type = item.ReadString(Models.Metadata.Chip.TypeKey), + SoundOnly = item.ReadString(Models.Metadata.Chip.SoundOnlyKey), + Clock = item.ReadString(Models.Metadata.Chip.ClockKey), + }; + return chip; + } + + /// + /// Convert from to + /// + private static Condition ConvertFromInternalModel(Models.Metadata.Condition item) + { + var condition = new Condition + { + Tag = item.ReadString(Models.Metadata.Condition.TagKey), + Mask = item.ReadString(Models.Metadata.Condition.MaskKey), + Relation = item.ReadString(Models.Metadata.Condition.RelationKey), + Value = item.ReadString(Models.Metadata.Condition.ValueKey), + }; + return condition; + } + + /// + /// Convert from to + /// + private static Configuration ConvertFromInternalModel(Models.Metadata.Configuration item) + { + var configuration = new Configuration + { + Name = item.ReadString(Models.Metadata.Configuration.NameKey), + Tag = item.ReadString(Models.Metadata.Configuration.TagKey), + Mask = item.ReadString(Models.Metadata.Configuration.MaskKey), + }; + + var condition = item.Read(Models.Metadata.Configuration.ConditionKey); + if (condition != null) + configuration.Condition = ConvertFromInternalModel(condition); + + var confLocations = item.Read(Models.Metadata.Configuration.ConfLocationKey); + if (confLocations != null && confLocations.Any()) + { + configuration.ConfLocation = confLocations + .Where(c => c != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var confSettings = item.Read(Models.Metadata.Configuration.ConfSettingKey); + if (confSettings != null && confSettings.Any()) + { + configuration.ConfSetting = confSettings + .Where(c => c != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + return configuration; + } + + /// + /// Convert from to + /// + private static ConfLocation ConvertFromInternalModel(Models.Metadata.ConfLocation item) + { + var confLocation = new ConfLocation + { + Name = item.ReadString(Models.Metadata.ConfLocation.NameKey), + Number = item.ReadString(Models.Metadata.ConfLocation.NumberKey), + Inverted = item.ReadString(Models.Metadata.ConfLocation.InvertedKey), + }; + return confLocation; + } + + /// + /// Convert from to + /// + private static ConfSetting ConvertFromInternalModel(Models.Metadata.ConfSetting item) + { + var confSetting = new ConfSetting + { + Name = item.ReadString(Models.Metadata.ConfSetting.NameKey), + Value = item.ReadString(Models.Metadata.ConfSetting.ValueKey), + Default = item.ReadString(Models.Metadata.ConfSetting.DefaultKey), + }; + + var condition = item.Read(Models.Metadata.ConfSetting.ConditionKey); + if (condition != null) + confSetting.Condition = ConvertFromInternalModel(condition); + + return confSetting; + } + + /// + /// Convert from to + /// + private static Control ConvertFromInternalModel(Models.Metadata.Control item) + { + var control = new Control + { + Type = item.ReadString(Models.Metadata.Control.TypeKey), + Player = item.ReadString(Models.Metadata.Control.PlayerKey), + Buttons = item.ReadString(Models.Metadata.Control.ButtonsKey), + ReqButtons = item.ReadString(Models.Metadata.Control.ReqButtonsKey), + Minimum = item.ReadString(Models.Metadata.Control.MinimumKey), + Maximum = item.ReadString(Models.Metadata.Control.MaximumKey), + Sensitivity = item.ReadString(Models.Metadata.Control.SensitivityKey), + KeyDelta = item.ReadString(Models.Metadata.Control.KeyDeltaKey), + Reverse = item.ReadString(Models.Metadata.Control.ReverseKey), + Ways = item.ReadString(Models.Metadata.Control.WaysKey), + Ways2 = item.ReadString(Models.Metadata.Control.Ways2Key), + Ways3 = item.ReadString(Models.Metadata.Control.Ways3Key), + }; + return control; + } + + /// + /// Convert from to + /// + private static Device ConvertFromInternalModel(Models.Metadata.Device item) + { + var device = new Device + { + Type = item.ReadString(Models.Metadata.Device.TypeKey), + Tag = item.ReadString(Models.Metadata.Device.TagKey), + FixedImage = item.ReadString(Models.Metadata.Device.FixedImageKey), + Mandatory = item.ReadString(Models.Metadata.Device.MandatoryKey), + Interface = item.ReadString(Models.Metadata.Device.InterfaceKey), + }; + + var instance = item.Read(Models.Metadata.Device.InstanceKey); + if (instance != null) + device.Instance = ConvertFromInternalModel(instance); + + var extensions = item.Read(Models.Metadata.Device.ExtensionKey); + if (extensions != null && extensions.Any()) + { + device.Extension = extensions + .Where(e => e != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + return device; + } + + /// + /// Convert from to + /// + private static DeviceRef ConvertFromInternalModel(Models.Metadata.DeviceRef item) + { + var deviceRef = new DeviceRef + { + Name = item.ReadString(Models.Metadata.DeviceRef.NameKey), + }; + return deviceRef; + } + + /// + /// Convert from to + /// + private static DipLocation ConvertFromInternalModel(Models.Metadata.DipLocation item) + { + var dipLocation = new DipLocation + { + Name = item.ReadString(Models.Metadata.DipLocation.NameKey), + Number = item.ReadString(Models.Metadata.DipLocation.NumberKey), + Inverted = item.ReadString(Models.Metadata.DipLocation.InvertedKey), + }; + return dipLocation; + } + + /// + /// Convert from to + /// + private static DipSwitch ConvertFromInternalModel(Models.Metadata.DipSwitch item) + { + var dipSwitch = new DipSwitch + { + Name = item.ReadString(Models.Metadata.DipSwitch.NameKey), + Tag = item.ReadString(Models.Metadata.DipSwitch.TagKey), + Mask = item.ReadString(Models.Metadata.DipSwitch.MaskKey), + }; + + var condition = item.Read(Models.Metadata.DipSwitch.ConditionKey); + if (condition != null) + dipSwitch.Condition = ConvertFromInternalModel(condition); + + var dipLocations = item.Read(Models.Metadata.DipSwitch.DipLocationKey); + if (dipLocations != null && dipLocations.Any()) + { + dipSwitch.DipLocation = dipLocations + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + var dipValues = item.Read(Models.Metadata.DipSwitch.DipValueKey); + if (dipValues != null && dipValues.Any()) + { + dipSwitch.DipValue = dipValues + .Where(d => d != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + return dipSwitch; + } + + /// + /// Convert from to + /// + private static DipValue ConvertFromInternalModel(Models.Metadata.DipValue item) + { + var dipValue = new DipValue + { + Name = item.ReadString(Models.Metadata.DipValue.NameKey), + Value = item.ReadString(Models.Metadata.DipValue.ValueKey), + Default = item.ReadString(Models.Metadata.DipValue.DefaultKey), + }; + + var condition = item.Read(Models.Metadata.DipValue.ConditionKey); + if (condition != null) + dipValue.Condition = ConvertFromInternalModel(condition); + + return dipValue; + } + + /// + /// Convert from to + /// + private static Disk ConvertFromInternalModel(Models.Metadata.Disk item) + { + var disk = new Disk + { + Name = item.ReadString(Models.Metadata.Disk.NameKey), + MD5 = item.ReadString(Models.Metadata.Disk.MD5Key), + SHA1 = item.ReadString(Models.Metadata.Disk.SHA1Key), + Merge = item.ReadString(Models.Metadata.Disk.MergeKey), + Region = item.ReadString(Models.Metadata.Disk.RegionKey), + Index = item.ReadString(Models.Metadata.Disk.IndexKey), + Writable = item.ReadString(Models.Metadata.Disk.WritableKey), + Status = item.ReadString(Models.Metadata.Disk.StatusKey), + Optional = item.ReadString(Models.Metadata.Disk.OptionalKey), + }; + return disk; + } + + /// + /// Convert from to + /// + private static Display ConvertFromInternalModel(Models.Metadata.Display item) + { + var display = new Display + { + Tag = item.ReadString(Models.Metadata.Display.TagKey), + Type = item.ReadString(Models.Metadata.Display.TypeKey), + Rotate = item.ReadString(Models.Metadata.Display.RotateKey), + FlipX = item.ReadString(Models.Metadata.Display.FlipXKey), + Width = item.ReadString(Models.Metadata.Display.WidthKey), + Height = item.ReadString(Models.Metadata.Display.HeightKey), + Refresh = item.ReadString(Models.Metadata.Display.RefreshKey), + PixClock = item.ReadString(Models.Metadata.Display.PixClockKey), + HTotal = item.ReadString(Models.Metadata.Display.HTotalKey), + HBEnd = item.ReadString(Models.Metadata.Display.HBEndKey), + HBStart = item.ReadString(Models.Metadata.Display.HBStartKey), + VTotal = item.ReadString(Models.Metadata.Display.VTotalKey), + VBEnd = item.ReadString(Models.Metadata.Display.VBEndKey), + VBStart = item.ReadString(Models.Metadata.Display.VBStartKey), + }; + return display; + } + + /// + /// Convert from to + /// + private static Driver ConvertFromInternalModel(Models.Metadata.Driver item) + { + var driver = new Driver + { + Status = item.ReadString(Models.Metadata.Driver.StatusKey), + Color = item.ReadString(Models.Metadata.Driver.ColorKey), + Sound = item.ReadString(Models.Metadata.Driver.SoundKey), + PaletteSize = item.ReadString(Models.Metadata.Driver.PaletteSizeKey), + Emulation = item.ReadString(Models.Metadata.Driver.EmulationKey), + Cocktail = item.ReadString(Models.Metadata.Driver.CocktailKey), + SaveState = item.ReadString(Models.Metadata.Driver.SaveStateKey), + RequiresArtwork = item.ReadString(Models.Metadata.Driver.RequiresArtworkKey), + Unofficial = item.ReadString(Models.Metadata.Driver.UnofficialKey), + NoSoundHardware = item.ReadString(Models.Metadata.Driver.NoSoundHardwareKey), + Incomplete = item.ReadString(Models.Metadata.Driver.IncompleteKey), + }; + return driver; + } + + /// + /// Convert from to + /// + private static Extension ConvertFromInternalModel(Models.Metadata.Extension item) + { + var extension = new Extension + { + Name = item.ReadString(Models.Metadata.Extension.NameKey), + }; + return extension; + } + + /// + /// Convert from to + /// + private static Feature ConvertFromInternalModel(Models.Metadata.Feature item) + { + var feature = new Feature + { + Type = item.ReadString(Models.Metadata.Feature.TypeKey), + Status = item.ReadString(Models.Metadata.Feature.StatusKey), + Overall = item.ReadString(Models.Metadata.Feature.OverallKey), + }; + return feature; + } + + /// + /// Convert from to + /// + private static Input ConvertFromInternalModel(Models.Metadata.Input item) + { + var input = new Input + { + Service = item.ReadString(Models.Metadata.Input.ServiceKey), + Tilt = item.ReadString(Models.Metadata.Input.TiltKey), + Players = item.ReadString(Models.Metadata.Input.PlayersKey), + ControlAttr = item.ReadString(Models.Metadata.Input.ControlKey), + Buttons = item.ReadString(Models.Metadata.Input.ButtonsKey), + Coins = item.ReadString(Models.Metadata.Input.CoinsKey), + }; + + var controls = item.Read(Models.Metadata.Input.ControlKey); + if (controls != null && controls.Any()) + { + input.Control = controls + .Where(c => c != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + return input; + } + + /// + /// Convert from to + /// + private static Instance ConvertFromInternalModel(Models.Metadata.Instance item) + { + var instance = new Instance + { + Name = item.ReadString(Models.Metadata.Instance.NameKey), + BriefName = item.ReadString(Models.Metadata.Instance.BriefNameKey), + }; + return instance; + } + + /// + /// Convert from to + /// + private static Port ConvertFromInternalModel(Models.Metadata.Port item) + { + var port = new Port + { + Tag = item.ReadString(Models.Metadata.Port.TagKey), + }; + + var analogs = item.Read(Models.Metadata.Port.AnalogKey); + if (analogs != null && analogs.Any()) + { + port.Analog = analogs + .Where(a => a != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + return port; + } + + /// + /// Convert from to + /// + private static RamOption ConvertFromInternalModel(Models.Metadata.RamOption item) + { + var ramOption = new RamOption + { + Name = item.ReadString(Models.Metadata.RamOption.NameKey), + Default = item.ReadString(Models.Metadata.RamOption.DefaultKey), + Content = item.ReadString(Models.Metadata.RamOption.ContentKey), + }; + return ramOption; + } + + /// + /// Convert from to + /// + private static Rom ConvertFromInternalModel(Models.Metadata.Rom item) + { + var rom = new Rom + { + Name = item.ReadString(Models.Metadata.Rom.NameKey), + Bios = item.ReadString(Models.Metadata.Rom.BiosKey), + Size = item.ReadString(Models.Metadata.Rom.SizeKey), + CRC = item.ReadString(Models.Metadata.Rom.CRCKey), + SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key), + Merge = item.ReadString(Models.Metadata.Rom.MergeKey), + Region = item.ReadString(Models.Metadata.Rom.RegionKey), + Offset = item.ReadString(Models.Metadata.Rom.OffsetKey), + Status = item.ReadString(Models.Metadata.Rom.StatusKey), + Optional = item.ReadString(Models.Metadata.Rom.OptionalKey), + Dispose = item.ReadString(Models.Metadata.Rom.DisposeKey), + SoundOnly = item.ReadString(Models.Metadata.Rom.SoundOnlyKey), + }; + return rom; + } + + /// + /// Convert from to + /// + private static Sample ConvertFromInternalModel(Models.Metadata.Sample item) + { + var sample = new Sample + { + Name = item.ReadString(Models.Metadata.Sample.NameKey), + }; + return sample; + } + + /// + /// Convert from to + /// + private static Slot ConvertFromInternalModel(Models.Metadata.Slot item) + { + var slot = new Slot + { + Name = item.ReadString(Models.Metadata.Slot.NameKey), + }; + + var slotOptions = item.Read(Models.Metadata.Slot.SlotOptionKey); + if (slotOptions != null && slotOptions.Any()) + { + slot.SlotOption = slotOptions + .Where(s => s != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + return slot; + } + + /// + /// Convert from to + /// + private static SlotOption ConvertFromInternalModel(Models.Metadata.SlotOption item) + { + var slotOption = new SlotOption + { + Name = item.ReadString(Models.Metadata.SlotOption.NameKey), + DevName = item.ReadString(Models.Metadata.SlotOption.DevNameKey), + Default = item.ReadString(Models.Metadata.SlotOption.DefaultKey), + }; + return slotOption; + } + + /// + /// Convert from to + /// + private static SoftwareList ConvertFromInternalModel(Models.Metadata.SoftwareList item) + { + var softwareList = new SoftwareList + { + Tag = item.ReadString(Models.Metadata.SoftwareList.TagKey), + Name = item.ReadString(Models.Metadata.SoftwareList.NameKey), + Status = item.ReadString(Models.Metadata.SoftwareList.StatusKey), + Filter = item.ReadString(Models.Metadata.SoftwareList.FilterKey), + }; + return softwareList; + } + + /// + /// Convert from to + /// + private static Sound ConvertFromInternalModel(Models.Metadata.Sound item) + { + var sound = new Sound + { + Channels = item.ReadString(Models.Metadata.Sound.ChannelsKey), + }; + return sound; + } + + /// + /// Convert from to + /// + private static Video ConvertFromInternalModel(Models.Metadata.Video item) + { + var video = new Video + { + Screen = item.ReadString(Models.Metadata.Video.ScreenKey), + Orientation = item.ReadString(Models.Metadata.Video.OrientationKey), + Width = item.ReadString(Models.Metadata.Video.WidthKey), + Height = item.ReadString(Models.Metadata.Video.HeightKey), + AspectX = item.ReadString(Models.Metadata.Video.AspectXKey), + AspectY = item.ReadString(Models.Metadata.Video.AspectYKey), + Refresh = item.ReadString(Models.Metadata.Video.RefreshKey), + }; + return video; + } + } +} \ No newline at end of file diff --git a/CrossModel/Listxml.Serializer.cs b/CrossModel/Listxml.Serializer.cs new file mode 100644 index 00000000..e0085119 --- /dev/null +++ b/CrossModel/Listxml.Serializer.cs @@ -0,0 +1,769 @@ +using System.Linq; +using SabreTools.Models.Listxml; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class Listxml : IModelSerializer + { + /// +#if NET48 + public Models.Metadata.MetadataFile Serialize(Mame item) +#else + public Models.Metadata.MetadataFile? Serialize(Mame? item) +#endif + { + if (item == null) + return null; + + var metadataFile = new Models.Metadata.MetadataFile + { + [Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + if (item?.Game != null && item.Game.Any()) + { + metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Game + .Where(g => g != null) + .Select(ConvertMachineToInternalModel) + .ToArray(); + } + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Header ConvertHeaderToInternalModel(Mame item) + { + var header = new Models.Metadata.Header + { + [Models.Metadata.Header.BuildKey] = item.Build, + [Models.Metadata.Header.DebugKey] = item.Debug, + [Models.Metadata.Header.MameConfigKey] = item.MameConfig, + }; + return header; + } + + /// + /// Convert from to + /// + internal static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item) + { + var machine = new Models.Metadata.Machine + { + [Models.Metadata.Machine.NameKey] = item.Name, + [Models.Metadata.Machine.SourceFileKey] = item.SourceFile, + [Models.Metadata.Machine.IsBiosKey] = item.IsBios, + [Models.Metadata.Machine.IsDeviceKey] = item.IsDevice, + [Models.Metadata.Machine.IsMechanicalKey] = item.IsMechanical, + [Models.Metadata.Machine.RunnableKey] = item.Runnable, + [Models.Metadata.Machine.CloneOfKey] = item.CloneOf, + [Models.Metadata.Machine.RomOfKey] = item.RomOf, + [Models.Metadata.Machine.SampleOfKey] = item.SampleOf, + [Models.Metadata.Machine.DescriptionKey] = item.Description, + [Models.Metadata.Machine.YearKey] = item.Year, + [Models.Metadata.Machine.ManufacturerKey] = item.Manufacturer, + [Models.Metadata.Machine.HistoryKey] = item.History, + }; + + if (item.BiosSet != null && item.BiosSet.Any()) + { + machine[Models.Metadata.Machine.BiosSetKey] = item.BiosSet + .Where(b => b != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Rom != null && item.Rom.Any()) + { + machine[Models.Metadata.Machine.RomKey] = item.Rom + .Where(r => r != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Disk != null && item.Disk.Any()) + { + machine[Models.Metadata.Machine.DiskKey] = item.Disk + .Where(d => d != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.DeviceRef != null && item.DeviceRef.Any()) + { + machine[Models.Metadata.Machine.DeviceRefKey] = item.DeviceRef + .Where(d => d != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Sample != null && item.Sample.Any()) + { + machine[Models.Metadata.Machine.SampleKey] = item.Sample + .Where(s => s != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Chip != null && item.Chip.Any()) + { + machine[Models.Metadata.Machine.ChipKey] = item.Chip + .Where(c => c != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Display != null && item.Display.Any()) + { + machine[Models.Metadata.Machine.DisplayKey] = item.Display + .Where(d => d != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Video != null && item.Video.Any()) + { + machine[Models.Metadata.Machine.VideoKey] = item.Video + .Where(v => v != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Sound != null) + machine[Models.Metadata.Machine.SoundKey] = ConvertToInternalModel(item.Sound); + + if (item.Input != null) + machine[Models.Metadata.Machine.InputKey] = ConvertToInternalModel(item.Input); + + if (item.DipSwitch != null && item.DipSwitch.Any()) + { + machine[Models.Metadata.Machine.DipSwitchKey] = item.DipSwitch + .Where(d => d != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Configuration != null && item.Configuration.Any()) + { + machine[Models.Metadata.Machine.ConfigurationKey] = item.Configuration + .Where(c => c != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Port != null && item.Port.Any()) + { + machine[Models.Metadata.Machine.PortKey] = item.Port + .Where(p => p != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Adjuster != null && item.Adjuster.Any()) + { + machine[Models.Metadata.Machine.AdjusterKey] = item.Adjuster + .Where(a => a != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Driver != null) + machine[Models.Metadata.Machine.DriverKey] = ConvertToInternalModel(item.Driver); + + if (item.Feature != null && item.Feature.Any()) + { + machine[Models.Metadata.Machine.FeatureKey] = item.Feature + .Where(f => f != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Device != null && item.Device.Any()) + { + machine[Models.Metadata.Machine.DeviceKey] = item.Device + .Where(d => d != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.Slot != null && item.Slot.Any()) + { + machine[Models.Metadata.Machine.SlotKey] = item.Slot + .Where(s => s != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.SoftwareList != null && item.SoftwareList.Any()) + { + machine[Models.Metadata.Machine.SoftwareListKey] = item.SoftwareList + .Where(s => s != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.RamOption != null && item.RamOption.Any()) + { + machine[Models.Metadata.Machine.RamOptionKey] = item.RamOption + .Where(r => r != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + return machine; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Adjuster ConvertToInternalModel(Adjuster item) + { + var adjuster = new Models.Metadata.Adjuster + { + [Models.Metadata.Adjuster.NameKey] = item.Name, + [Models.Metadata.Adjuster.DefaultKey] = item.Default, + }; + + if (item.Condition != null) + adjuster[Models.Metadata.Adjuster.ConditionKey] = ConvertToInternalModel(item.Condition); + + return adjuster; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Analog ConvertToInternalModel(Analog item) + { + var analog = new Models.Metadata.Analog + { + [Models.Metadata.Analog.MaskKey] = item.Mask, + }; + return analog; + } + + /// + /// Convert from to + /// + private static Models.Metadata.BiosSet ConvertToInternalModel(BiosSet item) + { + var biosset = new Models.Metadata.BiosSet + { + [Models.Metadata.BiosSet.NameKey] = item.Name, + [Models.Metadata.BiosSet.DescriptionKey] = item.Description, + [Models.Metadata.BiosSet.DefaultKey] = item.Default, + }; + return biosset; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Chip ConvertToInternalModel(Chip item) + { + var chip = new Models.Metadata.Chip + { + [Models.Metadata.Chip.NameKey] = item.Name, + [Models.Metadata.Chip.TagKey] = item.Tag, + [Models.Metadata.Chip.TypeKey] = item.Type, + [Models.Metadata.Chip.SoundOnlyKey] = item.SoundOnly, + [Models.Metadata.Chip.ClockKey] = item.Clock, + }; + return chip; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Condition ConvertToInternalModel(Condition item) + { + var condition = new Models.Metadata.Condition + { + [Models.Metadata.Condition.TagKey] = item.Tag, + [Models.Metadata.Condition.MaskKey] = item.Mask, + [Models.Metadata.Condition.RelationKey] = item.Relation, + [Models.Metadata.Condition.ValueKey] = item.Value, + }; + return condition; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Configuration ConvertToInternalModel(Configuration item) + { + var configuration = new Models.Metadata.Configuration + { + [Models.Metadata.Configuration.NameKey] = item.Name, + [Models.Metadata.Configuration.TagKey] = item.Tag, + [Models.Metadata.Configuration.MaskKey] = item.Mask, + }; + + if (item.Condition != null) + configuration[Models.Metadata.Configuration.ConditionKey] = ConvertToInternalModel(item.Condition); + + if (item.ConfLocation != null && item.ConfLocation.Any()) + { + configuration[Models.Metadata.Configuration.ConfLocationKey] = item.ConfLocation + .Where(c => c != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.ConfSetting != null && item.ConfSetting.Any()) + { + configuration[Models.Metadata.Configuration.ConfSettingKey] = item.ConfSetting + .Where(c => c != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + return configuration; + } + + /// + /// Convert from to + /// + private static Models.Metadata.ConfLocation ConvertToInternalModel(ConfLocation item) + { + var confLocation = new Models.Metadata.ConfLocation + { + [Models.Metadata.ConfLocation.NameKey] = item.Name, + [Models.Metadata.ConfLocation.NumberKey] = item.Number, + [Models.Metadata.ConfLocation.InvertedKey] = item.Inverted, + }; + return confLocation; + } + + /// + /// Convert from to + /// + private static Models.Metadata.ConfSetting ConvertToInternalModel(ConfSetting item) + { + var confSetting = new Models.Metadata.ConfSetting + { + [Models.Metadata.ConfSetting.NameKey] = item.Name, + [Models.Metadata.ConfSetting.ValueKey] = item.Value, + [Models.Metadata.ConfSetting.DefaultKey] = item.Default, + }; + + if (item.Condition != null) + confSetting[Models.Metadata.ConfSetting.ConditionKey] = ConvertToInternalModel(item.Condition); + + return confSetting; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Control ConvertToInternalModel(Control item) + { + var control = new Models.Metadata.Control + { + [Models.Metadata.Control.TypeKey] = item.Type, + [Models.Metadata.Control.PlayerKey] = item.Player, + [Models.Metadata.Control.ButtonsKey] = item.Buttons, + [Models.Metadata.Control.ReqButtonsKey] = item.ReqButtons, + [Models.Metadata.Control.MinimumKey] = item.Minimum, + [Models.Metadata.Control.MaximumKey] = item.Maximum, + [Models.Metadata.Control.SensitivityKey] = item.Sensitivity, + [Models.Metadata.Control.KeyDeltaKey] = item.KeyDelta, + [Models.Metadata.Control.ReverseKey] = item.Reverse, + [Models.Metadata.Control.WaysKey] = item.Ways, + [Models.Metadata.Control.Ways2Key] = item.Ways2, + [Models.Metadata.Control.Ways3Key] = item.Ways3, + }; + return control; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Device ConvertToInternalModel(Device item) + { + var device = new Models.Metadata.Device + { + [Models.Metadata.Device.TypeKey] = item.Type, + [Models.Metadata.Device.TagKey] = item.Tag, + [Models.Metadata.Device.FixedImageKey] = item.FixedImage, + [Models.Metadata.Device.MandatoryKey] = item.Mandatory, + [Models.Metadata.Device.InterfaceKey] = item.Interface, + }; + + if (item.Instance != null) + device[Models.Metadata.Device.InstanceKey] = ConvertToInternalModel(item.Instance); + + if (item.Extension != null && item.Extension.Any()) + { + device[Models.Metadata.Device.ExtensionKey] = item.Extension + .Where(e => e != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + return device; + } + + /// + /// Convert from to + /// + private static Models.Metadata.DeviceRef ConvertToInternalModel(DeviceRef item) + { + var deviceRef = new Models.Metadata.DeviceRef + { + [Models.Metadata.DeviceRef.NameKey] = item.Name, + }; + return deviceRef; + } + + /// + /// Convert from to + /// + private static Models.Metadata.DipLocation ConvertToInternalModel(DipLocation item) + { + var dipLocation = new Models.Metadata.DipLocation + { + [Models.Metadata.DipLocation.NameKey] = item.Name, + [Models.Metadata.DipLocation.NumberKey] = item.Number, + [Models.Metadata.DipLocation.InvertedKey] = item.Inverted, + }; + return dipLocation; + } + + /// + /// Convert from to + /// + private static Models.Metadata.DipSwitch ConvertToInternalModel(DipSwitch item) + { + var dipSwitch = new Models.Metadata.DipSwitch + { + [Models.Metadata.DipSwitch.NameKey] = item.Name, + [Models.Metadata.DipSwitch.TagKey] = item.Tag, + [Models.Metadata.DipSwitch.MaskKey] = item.Mask, + }; + + if (item.Condition != null) + dipSwitch[Models.Metadata.DipSwitch.ConditionKey] = ConvertToInternalModel(item.Condition); + + if (item.DipLocation != null && item.DipLocation.Any()) + { + dipSwitch[Models.Metadata.DipSwitch.DipLocationKey] = item.DipLocation + .Where(d => d != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + if (item.DipValue != null && item.DipValue.Any()) + { + dipSwitch[Models.Metadata.DipSwitch.DipValueKey] = item.DipValue + .Where(d => d != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + return dipSwitch; + } + + /// + /// Convert from to + /// + private static Models.Metadata.DipValue ConvertToInternalModel(DipValue item) + { + var dipValue = new Models.Metadata.DipValue + { + [Models.Metadata.DipValue.NameKey] = item.Name, + [Models.Metadata.DipValue.ValueKey] = item.Value, + [Models.Metadata.DipValue.DefaultKey] = item.Default, + }; + + if (item.Condition != null) + dipValue[Models.Metadata.DipValue.ConditionKey] = ConvertToInternalModel(item.Condition); + + return dipValue; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Disk ConvertToInternalModel(Disk item) + { + var disk = new Models.Metadata.Disk + { + [Models.Metadata.Disk.NameKey] = item.Name, + [Models.Metadata.Disk.MD5Key] = item.MD5, + [Models.Metadata.Disk.SHA1Key] = item.SHA1, + [Models.Metadata.Disk.MergeKey] = item.Merge, + [Models.Metadata.Disk.RegionKey] = item.Region, + [Models.Metadata.Disk.IndexKey] = item.Index, + [Models.Metadata.Disk.WritableKey] = item.Writable, + [Models.Metadata.Disk.StatusKey] = item.Status, + [Models.Metadata.Disk.OptionalKey] = item.Optional, + }; + return disk; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Display ConvertToInternalModel(Display item) + { + var display = new Models.Metadata.Display + { + [Models.Metadata.Display.TagKey] = item.Tag, + [Models.Metadata.Display.TypeKey] = item.Type, + [Models.Metadata.Display.RotateKey] = item.Rotate, + [Models.Metadata.Display.FlipXKey] = item.FlipX, + [Models.Metadata.Display.WidthKey] = item.Width, + [Models.Metadata.Display.HeightKey] = item.Height, + [Models.Metadata.Display.RefreshKey] = item.Refresh, + [Models.Metadata.Display.PixClockKey] = item.PixClock, + [Models.Metadata.Display.HTotalKey] = item.HTotal, + [Models.Metadata.Display.HBEndKey] = item.HBEnd, + [Models.Metadata.Display.HBStartKey] = item.HBStart, + [Models.Metadata.Display.VTotalKey] = item.VTotal, + [Models.Metadata.Display.VBEndKey] = item.VBEnd, + [Models.Metadata.Display.VBStartKey] = item.VBStart, + }; + return display; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Driver ConvertToInternalModel(Driver item) + { + var driver = new Models.Metadata.Driver + { + [Models.Metadata.Driver.StatusKey] = item.Status, + [Models.Metadata.Driver.ColorKey] = item.Color, + [Models.Metadata.Driver.SoundKey] = item.Sound, + [Models.Metadata.Driver.PaletteSizeKey] = item.PaletteSize, + [Models.Metadata.Driver.EmulationKey] = item.Emulation, + [Models.Metadata.Driver.CocktailKey] = item.Cocktail, + [Models.Metadata.Driver.SaveStateKey] = item.SaveState, + [Models.Metadata.Driver.RequiresArtworkKey] = item.RequiresArtwork, + [Models.Metadata.Driver.UnofficialKey] = item.Unofficial, + [Models.Metadata.Driver.NoSoundHardwareKey] = item.NoSoundHardware, + [Models.Metadata.Driver.IncompleteKey] = item.Incomplete, + }; + return driver; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Extension ConvertToInternalModel(Extension item) + { + var extension = new Models.Metadata.Extension + { + [Models.Metadata.Extension.NameKey] = item.Name, + }; + return extension; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Feature ConvertToInternalModel(Feature item) + { + var feature = new Models.Metadata.Feature + { + [Models.Metadata.Feature.TypeKey] = item.Type, + [Models.Metadata.Feature.StatusKey] = item.Status, + [Models.Metadata.Feature.OverallKey] = item.Overall, + }; + return feature; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Input ConvertToInternalModel(Input item) + { + var input = new Models.Metadata.Input + { + [Models.Metadata.Input.ServiceKey] = item.Service, + [Models.Metadata.Input.TiltKey] = item.Tilt, + [Models.Metadata.Input.PlayersKey] = item.Players, + [Models.Metadata.Input.ControlKey] = item.ControlAttr, + [Models.Metadata.Input.ButtonsKey] = item.Buttons, + [Models.Metadata.Input.CoinsKey] = item.Coins, + }; + + if (item.Control != null && item.Control.Any()) + { + input[Models.Metadata.Input.ControlKey] = item.Control + .Where(c => c != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + return input; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Instance ConvertToInternalModel(Instance item) + { + var instance = new Models.Metadata.Instance + { + [Models.Metadata.Instance.NameKey] = item.Name, + [Models.Metadata.Instance.BriefNameKey] = item.BriefName, + }; + return instance; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Port ConvertToInternalModel(Port item) + { + var port = new Models.Metadata.Port + { + [Models.Metadata.Port.TagKey] = item.Tag, + }; + + if (item.Analog != null && item.Analog.Any()) + { + port[Models.Metadata.Port.AnalogKey] = item.Analog + .Where(a => a != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + return port; + } + + /// + /// Convert from to + /// + private static Models.Metadata.RamOption ConvertToInternalModel(RamOption item) + { + var ramOption = new Models.Metadata.RamOption + { + [Models.Metadata.RamOption.NameKey] = item.Name, + [Models.Metadata.RamOption.DefaultKey] = item.Default, + [Models.Metadata.RamOption.ContentKey] = item.Content, + }; + return ramOption; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Rom ConvertToInternalModel(Rom item) + { + var rom = new Models.Metadata.Rom + { + [Models.Metadata.Rom.NameKey] = item.Name, + [Models.Metadata.Rom.BiosKey] = item.Bios, + [Models.Metadata.Rom.SizeKey] = item.Size, + [Models.Metadata.Rom.CRCKey] = item.CRC, + [Models.Metadata.Rom.SHA1Key] = item.SHA1, + [Models.Metadata.Rom.MergeKey] = item.Merge, + [Models.Metadata.Rom.RegionKey] = item.Region, + [Models.Metadata.Rom.OffsetKey] = item.Offset, + [Models.Metadata.Rom.StatusKey] = item.Status, + [Models.Metadata.Rom.OptionalKey] = item.Optional, + [Models.Metadata.Rom.DisposeKey] = item.Dispose, + [Models.Metadata.Rom.SoundOnlyKey] = item.SoundOnly, + }; + return rom; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Sample ConvertToInternalModel(Sample item) + { + var sample = new Models.Metadata.Sample + { + [Models.Metadata.Sample.NameKey] = item.Name, + }; + return sample; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Slot ConvertToInternalModel(Slot item) + { + var slot = new Models.Metadata.Slot + { + [Models.Metadata.Slot.NameKey] = item.Name, + }; + + if (item.SlotOption != null && item.SlotOption.Any()) + { + slot[Models.Metadata.Slot.SlotOptionKey] = item.SlotOption + .Where(s => s != null) + .Select(ConvertToInternalModel) + .ToArray(); + } + + return slot; + } + + /// + /// Convert from to + /// + private static Models.Metadata.SlotOption ConvertToInternalModel(SlotOption item) + { + var slotOption = new Models.Metadata.SlotOption + { + [Models.Metadata.SlotOption.NameKey] = item.Name, + [Models.Metadata.SlotOption.DevNameKey] = item.DevName, + [Models.Metadata.SlotOption.DefaultKey] = item.Default, + }; + return slotOption; + } + + /// + /// Convert from to + /// + private static Models.Metadata.SoftwareList ConvertToInternalModel(SoftwareList item) + { + var softwareList = new Models.Metadata.SoftwareList + { + [Models.Metadata.SoftwareList.TagKey] = item.Tag, + [Models.Metadata.SoftwareList.NameKey] = item.Name, + [Models.Metadata.SoftwareList.StatusKey] = item.Status, + [Models.Metadata.SoftwareList.FilterKey] = item.Filter, + }; + return softwareList; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Sound ConvertToInternalModel(Sound item) + { + var sound = new Models.Metadata.Sound + { + [Models.Metadata.Sound.ChannelsKey] = item.Channels, + }; + return sound; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Video ConvertToInternalModel(Video item) + { + var video = new Models.Metadata.Video + { + [Models.Metadata.Video.ScreenKey] = item.Screen, + [Models.Metadata.Video.OrientationKey] = item.Orientation, + [Models.Metadata.Video.WidthKey] = item.Width, + [Models.Metadata.Video.HeightKey] = item.Height, + [Models.Metadata.Video.AspectXKey] = item.AspectX, + [Models.Metadata.Video.AspectYKey] = item.AspectY, + [Models.Metadata.Video.RefreshKey] = item.Refresh, + }; + return video; + } + } +} \ No newline at end of file diff --git a/CrossModel/M1.Deserializer.cs b/CrossModel/M1.Deserializer.cs new file mode 100644 index 00000000..2e55d82f --- /dev/null +++ b/CrossModel/M1.Deserializer.cs @@ -0,0 +1,44 @@ +using System.Linq; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class M1 : IModelSerializer + { + /// +#if NET48 + public Models.Listxml.M1 Deserialize(Models.Metadata.MetadataFile obj) +#else + public Models.Listxml.M1? Deserialize(Models.Metadata.MetadataFile? obj) +#endif + { + if (obj == null) + return null; + + var header = obj.Read(Models.Metadata.MetadataFile.HeaderKey); + var m1 = header != null ? ConvertM1FromInternalModel(header) : new Models.Listxml.M1(); + + var machines = obj.Read(Models.Metadata.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + { + m1.Game = machines + .Where(m => m != null) + .Select(Listxml.ConvertMachineFromInternalModel) + .ToArray(); + } + + return m1; + } + + /// + /// Convert from to + /// + private static Models.Listxml.M1 ConvertM1FromInternalModel(Models.Metadata.Header item) + { + var m1 = new Models.Listxml.M1 + { + Version = item.ReadString(Models.Metadata.Header.VersionKey), + }; + return m1; + } + } +} \ No newline at end of file diff --git a/CrossModel/M1.Serializer.cs b/CrossModel/M1.Serializer.cs new file mode 100644 index 00000000..b568fe61 --- /dev/null +++ b/CrossModel/M1.Serializer.cs @@ -0,0 +1,45 @@ +using System.Linq; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class M1 : IModelSerializer + { + /// +#if NET48 + public Models.Metadata.MetadataFile Serialize(Models.Listxml.M1 item) +#else + public Models.Metadata.MetadataFile? Serialize(Models.Listxml.M1? item) +#endif + { + if (item == null) + return null; + + var metadataFile = new Models.Metadata.MetadataFile + { + [Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + if (item?.Game != null && item.Game.Any()) + { + metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Game + .Where(g => g != null) + .Select(Listxml.ConvertMachineToInternalModel) + .ToArray(); + } + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Header ConvertHeaderToInternalModel(Models.Listxml.M1 item) + { + var header = new Models.Metadata.Header + { + [Models.Metadata.Header.VersionKey] = item.Version, + }; + return header; + } + } +} \ No newline at end of file diff --git a/Files/Listxml.Deserializer.cs b/Files/Listxml.Deserializer.cs new file mode 100644 index 00000000..df9ae2cd --- /dev/null +++ b/Files/Listxml.Deserializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Files +{ + public partial class Listxml : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Files/Listxml.Serializer.cs b/Files/Listxml.Serializer.cs new file mode 100644 index 00000000..df9ae2cd --- /dev/null +++ b/Files/Listxml.Serializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Files +{ + public partial class Listxml : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Files/M1.Deserializer.cs b/Files/M1.Deserializer.cs new file mode 100644 index 00000000..1296da8f --- /dev/null +++ b/Files/M1.Deserializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Files +{ + public partial class M1 : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Files/M1.Serializer.cs b/Files/M1.Serializer.cs new file mode 100644 index 00000000..1296da8f --- /dev/null +++ b/Files/M1.Serializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Files +{ + public partial class M1 : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Streams/Listxml.Deserializer.cs b/Streams/Listxml.Deserializer.cs new file mode 100644 index 00000000..720276af --- /dev/null +++ b/Streams/Listxml.Deserializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Streams +{ + public partial class Listxml : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Streams/Listxml.Serializer.cs b/Streams/Listxml.Serializer.cs new file mode 100644 index 00000000..720276af --- /dev/null +++ b/Streams/Listxml.Serializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Streams +{ + public partial class Listxml : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Streams/M1.Deserializer.cs b/Streams/M1.Deserializer.cs new file mode 100644 index 00000000..75f0f35e --- /dev/null +++ b/Streams/M1.Deserializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Streams +{ + public partial class M1 : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Streams/M1.Serializer.cs b/Streams/M1.Serializer.cs new file mode 100644 index 00000000..75f0f35e --- /dev/null +++ b/Streams/M1.Serializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Streams +{ + public partial class M1 : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file