From 457ddf67d987c384943fa593144cb0d58cf29df9 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 11 Jan 2025 22:00:26 -0500 Subject: [PATCH] Handle internal implementations better (nw) --- SabreTools.Core/DictionaryBaseExtensions.cs | 20 + .../DatFileTests.FromMetadata.cs | 312 ++--- .../DatFileTests.ToMetadata.cs | 1097 ++++++++++++++++- SabreTools.DatFiles/DatFile.FromMetadata.cs | 800 ++---------- SabreTools.DatFiles/DatFile.ToMetadata.cs | 57 +- SabreTools.DatFiles/DatFile.cs | 3 +- SabreTools.DatItems/Formats/Adjuster.cs | 13 +- SabreTools.DatItems/Formats/BiosSet.cs | 8 +- SabreTools.DatItems/Formats/Chip.cs | 10 +- SabreTools.DatItems/Formats/Condition.cs | 8 +- SabreTools.DatItems/Formats/ConfLocation.cs | 8 +- SabreTools.DatItems/Formats/ConfSetting.cs | 13 +- SabreTools.DatItems/Formats/Configuration.cs | 26 +- SabreTools.DatItems/Formats/Control.cs | 24 +- SabreTools.DatItems/Formats/DataArea.cs | 12 +- SabreTools.DatItems/Formats/Device.cs | 26 +- SabreTools.DatItems/Formats/DipLocation.cs | 8 +- SabreTools.DatItems/Formats/DipSwitch.cs | 31 +- SabreTools.DatItems/Formats/DipValue.cs | 13 +- SabreTools.DatItems/Formats/Disk.cs | 14 + SabreTools.DatItems/Formats/Display.cs | 45 +- SabreTools.DatItems/Formats/Driver.cs | 28 +- SabreTools.DatItems/Formats/Feature.cs | 12 +- SabreTools.DatItems/Formats/Input.cs | 28 +- SabreTools.DatItems/Formats/Media.cs | 9 + SabreTools.DatItems/Formats/PartFeature.cs | 12 +- SabreTools.DatItems/Formats/Port.cs | 15 +- SabreTools.DatItems/Formats/RamOption.cs | 8 +- SabreTools.DatItems/Formats/Release.cs | 8 +- SabreTools.DatItems/Formats/Rom.cs | 38 + SabreTools.DatItems/Formats/Slot.cs | 15 +- SabreTools.DatItems/Formats/SlotOption.cs | 8 +- SabreTools.DatItems/Formats/SoftwareList.cs | 11 +- SabreTools.DatItems/Formats/Sound.cs | 7 +- SabreTools.DatItems/Machine.cs | 22 + 35 files changed, 1845 insertions(+), 924 deletions(-) diff --git a/SabreTools.Core/DictionaryBaseExtensions.cs b/SabreTools.Core/DictionaryBaseExtensions.cs index ea4775da..319c52bc 100644 --- a/SabreTools.Core/DictionaryBaseExtensions.cs +++ b/SabreTools.Core/DictionaryBaseExtensions.cs @@ -799,6 +799,26 @@ namespace SabreTools.Core #endregion + #region Reading + + /// + /// Read an item array from a given key, if possible + /// + public static T[]? ReadItemArray(this DictionaryBase self, string key) where T : DictionaryBase + { + var items = self.Read(key); + if (items == default) + { + var single = self.Read(key); + if (single != default) + items = [single]; + } + + return items; + } + + #endregion + #region Suffix Generation /// diff --git a/SabreTools.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.DatFiles.Test/DatFileTests.FromMetadata.cs index 32bd3add..1506093e 100644 --- a/SabreTools.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -37,7 +37,7 @@ namespace SabreTools.DatFiles.Test [Fact] public void ConvertFromMetadata_FilledHeader() { - Models.Metadata.Header? header = CreateHeader(); + Models.Metadata.Header? header = CreateMetadataHeader(); Models.Metadata.Machine[]? machines = null; Models.Metadata.MetadataFile? item = new Models.Metadata.MetadataFile { @@ -55,7 +55,7 @@ namespace SabreTools.DatFiles.Test public void ConvertFromMetadata_FilledMachine() { Models.Metadata.Header? header = null; - Models.Metadata.Machine machine = CreateMachine(); + Models.Metadata.Machine machine = CreateMetadataMachine(); Models.Metadata.Machine[]? machines = [machine]; Models.Metadata.MetadataFile? item = new Models.Metadata.MetadataFile { @@ -184,7 +184,7 @@ namespace SabreTools.DatFiles.Test #region Creation Helpers - private static Models.Metadata.Header CreateHeader() + private static Models.Metadata.Header CreateMetadataHeader() { Models.OfflineList.CanOpen canOpen = new Models.OfflineList.CanOpen { @@ -248,101 +248,101 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Machine CreateMachine() + private static Models.Metadata.Machine CreateMetadataMachine() { return new Models.Metadata.Machine { - [Models.Metadata.Machine.AdjusterKey] = new Models.Metadata.Adjuster[] { CreateAdjuster() }, - [Models.Metadata.Machine.ArchiveKey] = new Models.Metadata.Archive[] { CreateArchive() }, - [Models.Metadata.Machine.BiosSetKey] = new Models.Metadata.BiosSet[] { CreateBiosSet() }, + [Models.Metadata.Machine.AdjusterKey] = new Models.Metadata.Adjuster[] { CreateMetadataAdjuster() }, + [Models.Metadata.Machine.ArchiveKey] = new Models.Metadata.Archive[] { CreateMetadataArchive() }, + [Models.Metadata.Machine.BiosSetKey] = new Models.Metadata.BiosSet[] { CreateMetadataBiosSet() }, [Models.Metadata.Machine.BoardKey] = "board", [Models.Metadata.Machine.ButtonsKey] = "buttons", [Models.Metadata.Machine.CategoryKey] = "category", - [Models.Metadata.Machine.ChipKey] = new Models.Metadata.Chip[] { CreateChip() }, + [Models.Metadata.Machine.ChipKey] = new Models.Metadata.Chip[] { CreateMetadataChip() }, [Models.Metadata.Machine.CloneOfKey] = "cloneof", [Models.Metadata.Machine.CloneOfIdKey] = "cloneofid", [Models.Metadata.Machine.CommentKey] = "comment", [Models.Metadata.Machine.CompanyKey] = "company", - [Models.Metadata.Machine.ConfigurationKey] = new Models.Metadata.Configuration[] { CreateConfiguration() }, + [Models.Metadata.Machine.ConfigurationKey] = new Models.Metadata.Configuration[] { CreateMetadataConfiguration() }, [Models.Metadata.Machine.ControlKey] = "control", [Models.Metadata.Machine.CountryKey] = "country", [Models.Metadata.Machine.DescriptionKey] = "description", - [Models.Metadata.Machine.DeviceKey] = new Models.Metadata.Device[] { CreateDevice() }, - [Models.Metadata.Machine.DeviceRefKey] = new Models.Metadata.DeviceRef[] { CreateDeviceRef() }, - [Models.Metadata.Machine.DipSwitchKey] = new Models.Metadata.DipSwitch[] { CreateDipSwitch() }, + [Models.Metadata.Machine.DeviceKey] = new Models.Metadata.Device[] { CreateMetadataDevice() }, + [Models.Metadata.Machine.DeviceRefKey] = new Models.Metadata.DeviceRef[] { CreateMetadataDeviceRef() }, + [Models.Metadata.Machine.DipSwitchKey] = new Models.Metadata.DipSwitch[] { CreateMetadataDipSwitch() }, [Models.Metadata.Machine.DirNameKey] = "dirname", - [Models.Metadata.Machine.DiskKey] = new Models.Metadata.Disk[] { CreateDisk() }, + [Models.Metadata.Machine.DiskKey] = new Models.Metadata.Disk[] { CreateMetadataDisk() }, [Models.Metadata.Machine.DisplayCountKey] = "displaycount", - [Models.Metadata.Machine.DisplayKey] = new Models.Metadata.Display[] { CreateDisplay() }, + [Models.Metadata.Machine.DisplayKey] = new Models.Metadata.Display[] { CreateMetadataDisplay() }, [Models.Metadata.Machine.DisplayTypeKey] = "displaytype", - [Models.Metadata.Machine.DriverKey] = CreateDriver(), - [Models.Metadata.Machine.DumpKey] = new Models.Metadata.Dump[] { CreateDump() }, + [Models.Metadata.Machine.DriverKey] = CreateMetadataDriver(), + [Models.Metadata.Machine.DumpKey] = new Models.Metadata.Dump[] { CreateMetadataDump() }, [Models.Metadata.Machine.DuplicateIDKey] = "duplicateid", [Models.Metadata.Machine.EmulatorKey] = "emulator", [Models.Metadata.Machine.ExtraKey] = "extra", [Models.Metadata.Machine.FavoriteKey] = "favorite", - [Models.Metadata.Machine.FeatureKey] = new Models.Metadata.Feature[] { CreateFeature() }, + [Models.Metadata.Machine.FeatureKey] = new Models.Metadata.Feature[] { CreateMetadataFeature() }, [Models.Metadata.Machine.GenMSXIDKey] = "genmsxid", [Models.Metadata.Machine.HistoryKey] = "history", [Models.Metadata.Machine.IdKey] = "id", [Models.Metadata.Machine.Im1CRCKey] = ZeroHash.CRC32Str, [Models.Metadata.Machine.Im2CRCKey] = ZeroHash.CRC32Str, [Models.Metadata.Machine.ImageNumberKey] = "imagenumber", - [Models.Metadata.Machine.InfoKey] = new Models.Metadata.Info[] { CreateInfo() }, - [Models.Metadata.Machine.InputKey] = CreateInput(), + [Models.Metadata.Machine.InfoKey] = new Models.Metadata.Info[] { CreateMetadataInfo() }, + [Models.Metadata.Machine.InputKey] = CreateMetadataInput(), [Models.Metadata.Machine.IsBiosKey] = "yes", [Models.Metadata.Machine.IsDeviceKey] = "yes", [Models.Metadata.Machine.IsMechanicalKey] = "yes", [Models.Metadata.Machine.LanguageKey] = "language", [Models.Metadata.Machine.LocationKey] = "location", [Models.Metadata.Machine.ManufacturerKey] = "manufacturer", - [Models.Metadata.Machine.MediaKey] = new Models.Metadata.Media[] { CreateMedia() }, + [Models.Metadata.Machine.MediaKey] = new Models.Metadata.Media[] { CreateMetadataMedia() }, [Models.Metadata.Machine.NameKey] = "name", [Models.Metadata.Machine.NotesKey] = "notes", - [Models.Metadata.Machine.PartKey] = new Models.Metadata.Part[] { CreatePart() }, + [Models.Metadata.Machine.PartKey] = new Models.Metadata.Part[] { CreateMetadataPart() }, [Models.Metadata.Machine.PlayedCountKey] = "playedcount", [Models.Metadata.Machine.PlayedTimeKey] = "playedtime", [Models.Metadata.Machine.PlayersKey] = "players", - [Models.Metadata.Machine.PortKey] = new Models.Metadata.Port[] { CreatePort() }, + [Models.Metadata.Machine.PortKey] = new Models.Metadata.Port[] { CreateMetadataPort() }, [Models.Metadata.Machine.PublisherKey] = "publisher", - [Models.Metadata.Machine.RamOptionKey] = new Models.Metadata.RamOption[] { CreateRamOption() }, + [Models.Metadata.Machine.RamOptionKey] = new Models.Metadata.RamOption[] { CreateMetadataRamOption() }, [Models.Metadata.Machine.RebuildToKey] = "rebuildto", - [Models.Metadata.Machine.ReleaseKey] = new Models.Metadata.Release[] { CreateRelease() }, + [Models.Metadata.Machine.ReleaseKey] = new Models.Metadata.Release[] { CreateMetadataRelease() }, [Models.Metadata.Machine.ReleaseNumberKey] = "releasenumber", - [Models.Metadata.Machine.RomKey] = new Models.Metadata.Rom[] { CreateRom() }, + [Models.Metadata.Machine.RomKey] = new Models.Metadata.Rom[] { CreateMetadataRom() }, [Models.Metadata.Machine.RomOfKey] = "romof", [Models.Metadata.Machine.RotationKey] = "rotation", [Models.Metadata.Machine.RunnableKey] = "yes", - [Models.Metadata.Machine.SampleKey] = new Models.Metadata.Sample[] { CreateSample() }, + [Models.Metadata.Machine.SampleKey] = new Models.Metadata.Sample[] { CreateMetadataSample() }, [Models.Metadata.Machine.SampleOfKey] = "sampleof", [Models.Metadata.Machine.SaveTypeKey] = "savetype", - [Models.Metadata.Machine.SharedFeatKey] = new Models.Metadata.SharedFeat[] { CreateSharedFeat() }, - [Models.Metadata.Machine.SlotKey] = new Models.Metadata.Slot[] { CreateSlot() }, - [Models.Metadata.Machine.SoftwareListKey] = new Models.Metadata.SoftwareList[] { CreateSoftwareList() }, - [Models.Metadata.Machine.SoundKey] = CreateSound(), + [Models.Metadata.Machine.SharedFeatKey] = new Models.Metadata.SharedFeat[] { CreateMetadataSharedFeat() }, + [Models.Metadata.Machine.SlotKey] = new Models.Metadata.Slot[] { CreateMetadataSlot() }, + [Models.Metadata.Machine.SoftwareListKey] = new Models.Metadata.SoftwareList[] { CreateMetadataSoftwareList() }, + [Models.Metadata.Machine.SoundKey] = CreateMetadataSound(), [Models.Metadata.Machine.SourceFileKey] = "sourcefile", [Models.Metadata.Machine.SourceRomKey] = "sourcerom", [Models.Metadata.Machine.StatusKey] = "status", [Models.Metadata.Machine.SupportedKey] = "yes", [Models.Metadata.Machine.SystemKey] = "system", [Models.Metadata.Machine.TagsKey] = "tags", - [Models.Metadata.Machine.TruripKey] = CreateTrurip(), - [Models.Metadata.Machine.VideoKey] = new Models.Metadata.Video[] { CreateVideo() }, + [Models.Metadata.Machine.TruripKey] = CreateMetadataTrurip(), + [Models.Metadata.Machine.VideoKey] = new Models.Metadata.Video[] { CreateMetadataVideo() }, [Models.Metadata.Machine.YearKey] = "year", }; } - private static Models.Metadata.Adjuster CreateAdjuster() + private static Models.Metadata.Adjuster CreateMetadataAdjuster() { return new Models.Metadata.Adjuster { - [Models.Metadata.Adjuster.ConditionKey] = CreateCondition(), + [Models.Metadata.Adjuster.ConditionKey] = CreateMetadataCondition(), [Models.Metadata.Adjuster.DefaultKey] = true, [Models.Metadata.Adjuster.NameKey] = "name", }; } - private static Models.Metadata.Analog CreateAnalog() + private static Models.Metadata.Analog CreateMetadataAnalog() { return new Models.Metadata.Analog { @@ -350,7 +350,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Archive CreateArchive() + private static Models.Metadata.Archive CreateMetadataArchive() { return new Models.Metadata.Archive { @@ -358,7 +358,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.BiosSet CreateBiosSet() + private static Models.Metadata.BiosSet CreateMetadataBiosSet() { return new Models.Metadata.BiosSet { @@ -368,11 +368,11 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Chip CreateChip() + private static Models.Metadata.Chip CreateMetadataChip() { return new Models.Metadata.Chip { - [Models.Metadata.Chip.ClockKey] = 12345, + [Models.Metadata.Chip.ClockKey] = 12345L, [Models.Metadata.Chip.FlagsKey] = "flags", [Models.Metadata.Chip.NameKey] = "name", [Models.Metadata.Chip.SoundOnlyKey] = "yes", @@ -381,20 +381,20 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Configuration CreateConfiguration() + private static Models.Metadata.Configuration CreateMetadataConfiguration() { return new Models.Metadata.Configuration { - [Models.Metadata.Configuration.ConditionKey] = CreateCondition(), - [Models.Metadata.Configuration.ConfLocationKey] = new Models.Metadata.ConfLocation[] { CreateConfLocation() }, - [Models.Metadata.Configuration.ConfSettingKey] = new Models.Metadata.ConfSetting[] { CreateConfSetting() }, + [Models.Metadata.Configuration.ConditionKey] = CreateMetadataCondition(), + [Models.Metadata.Configuration.ConfLocationKey] = new Models.Metadata.ConfLocation[] { CreateMetadataConfLocation() }, + [Models.Metadata.Configuration.ConfSettingKey] = new Models.Metadata.ConfSetting[] { CreateMetadataConfSetting() }, [Models.Metadata.Configuration.MaskKey] = "mask", [Models.Metadata.Configuration.NameKey] = "name", [Models.Metadata.Configuration.TagKey] = "tag", }; } - private static Models.Metadata.Condition CreateCondition() + private static Models.Metadata.Condition CreateMetadataCondition() { return new Models.Metadata.Condition { @@ -405,7 +405,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.ConfLocation CreateConfLocation() + private static Models.Metadata.ConfLocation CreateMetadataConfLocation() { return new Models.Metadata.ConfLocation { @@ -415,29 +415,29 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.ConfSetting CreateConfSetting() + private static Models.Metadata.ConfSetting CreateMetadataConfSetting() { return new Models.Metadata.ConfSetting { - [Models.Metadata.ConfSetting.ConditionKey] = CreateCondition(), + [Models.Metadata.ConfSetting.ConditionKey] = CreateMetadataCondition(), [Models.Metadata.ConfSetting.DefaultKey] = "yes", [Models.Metadata.ConfSetting.NameKey] = "name", [Models.Metadata.ConfSetting.ValueKey] = "value", }; } - private static Models.Metadata.Control CreateControl() + private static Models.Metadata.Control CreateMetadataControl() { return new Models.Metadata.Control { - [Models.Metadata.Control.ButtonsKey] = 12345, - [Models.Metadata.Control.KeyDeltaKey] = 12345, - [Models.Metadata.Control.MaximumKey] = 12345, - [Models.Metadata.Control.MinimumKey] = 12345, - [Models.Metadata.Control.PlayerKey] = 12345, - [Models.Metadata.Control.ReqButtonsKey] = 12345, + [Models.Metadata.Control.ButtonsKey] = 12345L, + [Models.Metadata.Control.KeyDeltaKey] = 12345L, + [Models.Metadata.Control.MaximumKey] = 12345L, + [Models.Metadata.Control.MinimumKey] = 12345L, + [Models.Metadata.Control.PlayerKey] = 12345L, + [Models.Metadata.Control.ReqButtonsKey] = 12345L, [Models.Metadata.Control.ReverseKey] = "yes", - [Models.Metadata.Control.SensitivityKey] = 12345, + [Models.Metadata.Control.SensitivityKey] = 12345L, [Models.Metadata.Control.ControlTypeKey] = "lightgun", [Models.Metadata.Control.WaysKey] = "ways", [Models.Metadata.Control.Ways2Key] = "ways2", @@ -445,13 +445,13 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Device CreateDevice() + private static Models.Metadata.Device CreateMetadataDevice() { return new Models.Metadata.Device { - [Models.Metadata.Device.ExtensionKey] = new Models.Metadata.Extension[] { CreateExtension() }, + [Models.Metadata.Device.ExtensionKey] = new Models.Metadata.Extension[] { CreateMetadataExtension() }, [Models.Metadata.Device.FixedImageKey] = "fixedimage", - [Models.Metadata.Device.InstanceKey] = CreateInstance(), + [Models.Metadata.Device.InstanceKey] = CreateMetadataInstance(), [Models.Metadata.Device.InterfaceKey] = "interface", [Models.Metadata.Device.MandatoryKey] = 1, [Models.Metadata.Device.TagKey] = "tag", @@ -459,7 +459,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.DeviceRef CreateDeviceRef() + private static Models.Metadata.DeviceRef CreateMetadataDeviceRef() { return new Models.Metadata.DeviceRef { @@ -467,7 +467,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.DipLocation CreateDipLocation() + private static Models.Metadata.DipLocation CreateMetadataDipLocation() { return new Models.Metadata.DipLocation { @@ -477,14 +477,14 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.DipSwitch CreateDipSwitch() + private static Models.Metadata.DipSwitch CreateMetadataDipSwitch() { return new Models.Metadata.DipSwitch { - [Models.Metadata.DipSwitch.ConditionKey] = CreateCondition(), + [Models.Metadata.DipSwitch.ConditionKey] = CreateMetadataCondition(), [Models.Metadata.DipSwitch.DefaultKey] = "yes", - [Models.Metadata.DipSwitch.DipLocationKey] = new Models.Metadata.DipLocation[] { CreateDipLocation() }, - [Models.Metadata.DipSwitch.DipValueKey] = new Models.Metadata.DipValue[] { CreateDipValue() }, + [Models.Metadata.DipSwitch.DipLocationKey] = new Models.Metadata.DipLocation[] { CreateMetadataDipLocation() }, + [Models.Metadata.DipSwitch.DipValueKey] = new Models.Metadata.DipValue[] { CreateMetadataDipValue() }, [Models.Metadata.DipSwitch.EntryKey] = new string[] { "entry" }, [Models.Metadata.DipSwitch.MaskKey] = "mask", [Models.Metadata.DipSwitch.NameKey] = "name", @@ -492,30 +492,30 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.DipValue CreateDipValue() + private static Models.Metadata.DipValue CreateMetadataDipValue() { return new Models.Metadata.DipValue { - [Models.Metadata.DipValue.ConditionKey] = CreateCondition(), + [Models.Metadata.DipValue.ConditionKey] = CreateMetadataCondition(), [Models.Metadata.DipValue.DefaultKey] = "yes", [Models.Metadata.DipValue.NameKey] = "name", [Models.Metadata.DipValue.ValueKey] = "value", }; } - private static Models.Metadata.DataArea CreateDataArea() + private static Models.Metadata.DataArea CreateMetadataDataArea() { return new Models.Metadata.DataArea { [Models.Metadata.DataArea.EndiannessKey] = "big", [Models.Metadata.DataArea.NameKey] = "name", [Models.Metadata.DataArea.RomKey] = new Models.Metadata.Rom[] { new Models.Metadata.Rom() }, - [Models.Metadata.DataArea.SizeKey] = 12345, + [Models.Metadata.DataArea.SizeKey] = 12345L, [Models.Metadata.DataArea.WidthKey] = 64, }; } - private static Models.Metadata.Disk CreateDisk() + private static Models.Metadata.Disk CreateMetadataDisk() { return new Models.Metadata.Disk { @@ -531,7 +531,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.DiskArea CreateDiskArea() + private static Models.Metadata.DiskArea CreateMetadataDiskArea() { return new Models.Metadata.DiskArea { @@ -540,28 +540,28 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Display CreateDisplay() + private static Models.Metadata.Display CreateMetadataDisplay() { return new Models.Metadata.Display { [Models.Metadata.Display.FlipXKey] = "yes", - [Models.Metadata.Display.HBEndKey] = 12345, - [Models.Metadata.Display.HBStartKey] = 12345, - [Models.Metadata.Display.HeightKey] = 12345, - [Models.Metadata.Display.HTotalKey] = 12345, - [Models.Metadata.Display.PixClockKey] = 12345, - [Models.Metadata.Display.RefreshKey] = 12345, + [Models.Metadata.Display.HBEndKey] = 12345L, + [Models.Metadata.Display.HBStartKey] = 12345L, + [Models.Metadata.Display.HeightKey] = 12345L, + [Models.Metadata.Display.HTotalKey] = 12345L, + [Models.Metadata.Display.PixClockKey] = 12345L, + [Models.Metadata.Display.RefreshKey] = 12345L, [Models.Metadata.Display.RotateKey] = 90, [Models.Metadata.Display.TagKey] = "tag", [Models.Metadata.Display.DisplayTypeKey] = "vector", - [Models.Metadata.Display.VBEndKey] = 12345, - [Models.Metadata.Display.VBStartKey] = 12345, - [Models.Metadata.Display.VTotalKey] = 12345, - [Models.Metadata.Display.WidthKey] = 12345, + [Models.Metadata.Display.VBEndKey] = 12345L, + [Models.Metadata.Display.VBStartKey] = 12345L, + [Models.Metadata.Display.VTotalKey] = 12345L, + [Models.Metadata.Display.WidthKey] = 12345L, }; } - private static Models.Metadata.Driver CreateDriver() + private static Models.Metadata.Driver CreateMetadataDriver() { return new Models.Metadata.Driver { @@ -580,11 +580,11 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Dump CreateDump() + private static Models.Metadata.Dump CreateMetadataDump() { return new Models.Metadata.Dump { - [Models.Metadata.Dump.OriginalKey] = CreateOriginal(), + [Models.Metadata.Dump.OriginalKey] = CreateMetadataOriginal(), // The following are searched for in order // For the purposes of this test, only RomKey will be populated @@ -595,7 +595,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Extension CreateExtension() + private static Models.Metadata.Extension CreateMetadataExtension() { return new Models.Metadata.Extension { @@ -603,7 +603,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Feature CreateFeature() + private static Models.Metadata.Feature CreateMetadataFeature() { return new Models.Metadata.Feature { @@ -615,7 +615,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Info CreateInfo() + private static Models.Metadata.Info CreateMetadataInfo() { return new Models.Metadata.Info { @@ -624,20 +624,20 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Input CreateInput() + private static Models.Metadata.Input CreateMetadataInput() { return new Models.Metadata.Input { - [Models.Metadata.Input.ButtonsKey] = 12345, - [Models.Metadata.Input.CoinsKey] = 12345, - [Models.Metadata.Input.ControlKey] = new Models.Metadata.Control[] { CreateControl() }, - [Models.Metadata.Input.PlayersKey] = 12345, + [Models.Metadata.Input.ButtonsKey] = 12345L, + [Models.Metadata.Input.CoinsKey] = 12345L, + [Models.Metadata.Input.ControlKey] = new Models.Metadata.Control[] { CreateMetadataControl() }, + [Models.Metadata.Input.PlayersKey] = 12345L, [Models.Metadata.Input.ServiceKey] = "yes", [Models.Metadata.Input.TiltKey] = "yes", }; } - private static Models.Metadata.Instance CreateInstance() + private static Models.Metadata.Instance CreateMetadataInstance() { return new Models.Metadata.Instance { @@ -646,7 +646,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Media CreateMedia() + private static Models.Metadata.Media CreateMetadataMedia() { return new Models.Metadata.Media { @@ -658,7 +658,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Original CreateOriginal() + private static Models.Metadata.Original CreateMetadataOriginal() { return new Models.Metadata.Original { @@ -667,29 +667,29 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Part CreatePart() + private static Models.Metadata.Part CreateMetadataPart() { return new Models.Metadata.Part { - [Models.Metadata.Part.DataAreaKey] = new Models.Metadata.DataArea[] { CreateDataArea() }, - [Models.Metadata.Part.DiskAreaKey] = new Models.Metadata.DiskArea[] { CreateDiskArea() }, + [Models.Metadata.Part.DataAreaKey] = new Models.Metadata.DataArea[] { CreateMetadataDataArea() }, + [Models.Metadata.Part.DiskAreaKey] = new Models.Metadata.DiskArea[] { CreateMetadataDiskArea() }, [Models.Metadata.Part.DipSwitchKey] = new Models.Metadata.DipSwitch[] { new Models.Metadata.DipSwitch() }, - [Models.Metadata.Part.FeatureKey] = new Models.Metadata.Feature[] { CreateFeature() }, + [Models.Metadata.Part.FeatureKey] = new Models.Metadata.Feature[] { CreateMetadataFeature() }, [Models.Metadata.Part.InterfaceKey] = "interface", [Models.Metadata.Part.NameKey] = "name", }; } - private static Models.Metadata.Port CreatePort() + private static Models.Metadata.Port CreateMetadataPort() { return new Models.Metadata.Port { - [Models.Metadata.Port.AnalogKey] = new Models.Metadata.Analog[] { CreateAnalog() }, + [Models.Metadata.Port.AnalogKey] = new Models.Metadata.Analog[] { CreateMetadataAnalog() }, [Models.Metadata.Port.TagKey] = "tag", }; } - private static Models.Metadata.RamOption CreateRamOption() + private static Models.Metadata.RamOption CreateMetadataRamOption() { return new Models.Metadata.RamOption { @@ -699,7 +699,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Release CreateRelease() + private static Models.Metadata.Release CreateMetadataRelease() { return new Models.Metadata.Release { @@ -711,7 +711,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Rom CreateRom() + private static Models.Metadata.Rom CreateMetadataRom() { return new Models.Metadata.Rom { @@ -733,7 +733,7 @@ namespace SabreTools.DatFiles.Test [Models.Metadata.Rom.DateKey] = "date", [Models.Metadata.Rom.DisposeKey] = "yes", [Models.Metadata.Rom.ExtensionKey] = "extension", - [Models.Metadata.Rom.FileCountKey] = 12345, + [Models.Metadata.Rom.FileCountKey] = 12345L, [Models.Metadata.Rom.FileIsAvailableKey] = true, [Models.Metadata.Rom.FlagsKey] = "flags", [Models.Metadata.Rom.FormatKey] = "format", @@ -779,7 +779,7 @@ namespace SabreTools.DatFiles.Test [Models.Metadata.Rom.SHA256Key] = ZeroHash.SHA256Str, [Models.Metadata.Rom.SHA384Key] = ZeroHash.SHA384Str, [Models.Metadata.Rom.SHA512Key] = ZeroHash.SHA512Str, - [Models.Metadata.Rom.SizeKey] = 12345, + [Models.Metadata.Rom.SizeKey] = 12345L, [Models.Metadata.Rom.SoundOnlyKey] = "yes", [Models.Metadata.Rom.SourceKey] = "source", [Models.Metadata.Rom.SpamSumKey] = ZeroHash.SpamSumStr, @@ -810,7 +810,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Sample CreateSample() + private static Models.Metadata.Sample CreateMetadataSample() { return new Models.Metadata.Sample { @@ -818,7 +818,7 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.SharedFeat CreateSharedFeat() + private static Models.Metadata.SharedFeat CreateMetadataSharedFeat() { return new Models.Metadata.SharedFeat { @@ -827,16 +827,16 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Slot CreateSlot() + private static Models.Metadata.Slot CreateMetadataSlot() { return new Models.Metadata.Slot { [Models.Metadata.Slot.NameKey] = "name", - [Models.Metadata.Slot.SlotOptionKey] = new Models.Metadata.SlotOption[] { CreateSlotOption() }, + [Models.Metadata.Slot.SlotOptionKey] = new Models.Metadata.SlotOption[] { CreateMetadataSlotOption() }, }; } - private static Models.Metadata.SlotOption CreateSlotOption() + private static Models.Metadata.SlotOption CreateMetadataSlotOption() { return new Models.Metadata.SlotOption { @@ -846,24 +846,24 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Software CreateSoftware() + private static Models.Metadata.Software CreateMetadataSoftware() { return new Models.Metadata.Software { [Models.Metadata.Software.CloneOfKey] = "cloneof", [Models.Metadata.Software.DescriptionKey] = "description", - [Models.Metadata.Software.InfoKey] = new Models.Metadata.Info[] { CreateInfo() }, + [Models.Metadata.Software.InfoKey] = new Models.Metadata.Info[] { CreateMetadataInfo() }, [Models.Metadata.Software.NameKey] = "name", [Models.Metadata.Software.NotesKey] = "notes", - [Models.Metadata.Software.PartKey] = new Models.Metadata.Part[] { CreatePart() }, + [Models.Metadata.Software.PartKey] = new Models.Metadata.Part[] { CreateMetadataPart() }, [Models.Metadata.Software.PublisherKey] = "publisher", - [Models.Metadata.Software.SharedFeatKey] = new Models.Metadata.SharedFeat[] { CreateSharedFeat() }, + [Models.Metadata.Software.SharedFeatKey] = new Models.Metadata.SharedFeat[] { CreateMetadataSharedFeat() }, [Models.Metadata.Software.SupportedKey] = "yes", [Models.Metadata.Software.YearKey] = "year", }; } - private static Models.Metadata.SoftwareList CreateSoftwareList() + private static Models.Metadata.SoftwareList CreateMetadataSoftwareList() { return new Models.Metadata.SoftwareList { @@ -871,21 +871,21 @@ namespace SabreTools.DatFiles.Test [Models.Metadata.SoftwareList.FilterKey] = "filter", [Models.Metadata.SoftwareList.NameKey] = "name", [Models.Metadata.SoftwareList.NotesKey] = "notes", - [Models.Metadata.SoftwareList.SoftwareKey] = new Models.Metadata.Software[] { CreateSoftware() }, + [Models.Metadata.SoftwareList.SoftwareKey] = new Models.Metadata.Software[] { CreateMetadataSoftware() }, [Models.Metadata.SoftwareList.StatusKey] = "original", [Models.Metadata.SoftwareList.TagKey] = "tag", }; } - private static Models.Metadata.Sound CreateSound() + private static Models.Metadata.Sound CreateMetadataSound() { return new Models.Metadata.Sound { - [Models.Metadata.Sound.ChannelsKey] = 12345, + [Models.Metadata.Sound.ChannelsKey] = 12345L, }; } - private static Models.Logiqx.Trurip CreateTrurip() + private static Models.Logiqx.Trurip CreateMetadataTrurip() { return new Models.Logiqx.Trurip { @@ -906,17 +906,17 @@ namespace SabreTools.DatFiles.Test }; } - private static Models.Metadata.Video CreateVideo() + private static Models.Metadata.Video CreateMetadataVideo() { return new Models.Metadata.Video { - [Models.Metadata.Video.AspectXKey] = 12345, - [Models.Metadata.Video.AspectYKey] = 12345, - [Models.Metadata.Video.HeightKey] = 12345, + [Models.Metadata.Video.AspectXKey] = 12345L, + [Models.Metadata.Video.AspectYKey] = 12345L, + [Models.Metadata.Video.HeightKey] = 12345L, [Models.Metadata.Video.OrientationKey] = "vertical", - [Models.Metadata.Video.RefreshKey] = 12345, + [Models.Metadata.Video.RefreshKey] = 12345L, [Models.Metadata.Video.ScreenKey] = "vector", - [Models.Metadata.Video.WidthKey] = 12345, + [Models.Metadata.Video.WidthKey] = 12345L, }; } @@ -1061,7 +1061,7 @@ namespace SabreTools.DatFiles.Test private static void ValidateChip(Chip? chip) { Assert.NotNull(chip); - Assert.Equal(12345, chip.GetInt64FieldValue(Models.Metadata.Chip.ClockKey)); + Assert.Equal(12345L, chip.GetInt64FieldValue(Models.Metadata.Chip.ClockKey)); Assert.Equal("flags", chip.GetStringFieldValue(Models.Metadata.Chip.FlagsKey)); Assert.Equal("name", chip.GetStringFieldValue(Models.Metadata.Chip.NameKey)); Assert.True(chip.GetBoolFieldValue(Models.Metadata.Chip.SoundOnlyKey)); @@ -1121,14 +1121,14 @@ namespace SabreTools.DatFiles.Test private static void ValidateControl(Control? control) { Assert.NotNull(control); - Assert.Equal(12345, control.GetInt64FieldValue(Models.Metadata.Control.ButtonsKey)); - Assert.Equal(12345, control.GetInt64FieldValue(Models.Metadata.Control.KeyDeltaKey)); - Assert.Equal(12345, control.GetInt64FieldValue(Models.Metadata.Control.MaximumKey)); - Assert.Equal(12345, control.GetInt64FieldValue(Models.Metadata.Control.MinimumKey)); - Assert.Equal(12345, control.GetInt64FieldValue(Models.Metadata.Control.PlayerKey)); - Assert.Equal(12345, control.GetInt64FieldValue(Models.Metadata.Control.ReqButtonsKey)); + Assert.Equal(12345L, control.GetInt64FieldValue(Models.Metadata.Control.ButtonsKey)); + Assert.Equal(12345L, control.GetInt64FieldValue(Models.Metadata.Control.KeyDeltaKey)); + Assert.Equal(12345L, control.GetInt64FieldValue(Models.Metadata.Control.MaximumKey)); + Assert.Equal(12345L, control.GetInt64FieldValue(Models.Metadata.Control.MinimumKey)); + Assert.Equal(12345L, control.GetInt64FieldValue(Models.Metadata.Control.PlayerKey)); + Assert.Equal(12345L, control.GetInt64FieldValue(Models.Metadata.Control.ReqButtonsKey)); Assert.True(control.GetBoolFieldValue(Models.Metadata.Control.ReverseKey)); - Assert.Equal(12345, control.GetInt64FieldValue(Models.Metadata.Control.SensitivityKey)); + Assert.Equal(12345L, control.GetInt64FieldValue(Models.Metadata.Control.SensitivityKey)); Assert.Equal("lightgun", control.GetStringFieldValue(Models.Metadata.Control.ControlTypeKey)); Assert.Equal("ways", control.GetStringFieldValue(Models.Metadata.Control.WaysKey)); Assert.Equal("ways2", control.GetStringFieldValue(Models.Metadata.Control.Ways2Key)); @@ -1140,7 +1140,7 @@ namespace SabreTools.DatFiles.Test Assert.NotNull(dataArea); Assert.Equal("big", dataArea.GetStringFieldValue(Models.Metadata.DataArea.EndiannessKey)); Assert.Equal("name", dataArea.GetStringFieldValue(Models.Metadata.DataArea.NameKey)); - Assert.Equal(12345, dataArea.GetInt64FieldValue(Models.Metadata.DataArea.SizeKey)); + Assert.Equal(12345L, dataArea.GetInt64FieldValue(Models.Metadata.DataArea.SizeKey)); Assert.Equal(64, dataArea.GetInt64FieldValue(Models.Metadata.DataArea.WidthKey)); } @@ -1238,19 +1238,19 @@ namespace SabreTools.DatFiles.Test { Assert.NotNull(display); Assert.True(display.GetBoolFieldValue(Models.Metadata.Display.FlipXKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.HBEndKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.HBStartKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.HeightKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.HTotalKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.PixClockKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.RefreshKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.HBEndKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.HBStartKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.HeightKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.HTotalKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.PixClockKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.RefreshKey)); Assert.Equal(90, display.GetInt64FieldValue(Models.Metadata.Display.RotateKey)); Assert.Equal("tag", display.GetStringFieldValue(Models.Metadata.Display.TagKey)); Assert.Equal("vector", display.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.VBEndKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.VBStartKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.VTotalKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.WidthKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.VBEndKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.VBStartKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.VTotalKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.WidthKey)); } private static void ValidateDriver(Driver? driver) @@ -1296,9 +1296,9 @@ namespace SabreTools.DatFiles.Test private static void ValidateInput(Input? input) { Assert.NotNull(input); - Assert.Equal(12345, input.GetInt64FieldValue(Models.Metadata.Input.ButtonsKey)); - Assert.Equal(12345, input.GetInt64FieldValue(Models.Metadata.Input.CoinsKey)); - Assert.Equal(12345, input.GetInt64FieldValue(Models.Metadata.Input.PlayersKey)); + Assert.Equal(12345L, input.GetInt64FieldValue(Models.Metadata.Input.ButtonsKey)); + Assert.Equal(12345L, input.GetInt64FieldValue(Models.Metadata.Input.CoinsKey)); + Assert.Equal(12345L, input.GetInt64FieldValue(Models.Metadata.Input.PlayersKey)); Assert.True(input.GetBoolFieldValue(Models.Metadata.Input.ServiceKey)); Assert.True(input.GetBoolFieldValue(Models.Metadata.Input.TiltKey)); @@ -1395,7 +1395,7 @@ namespace SabreTools.DatFiles.Test Assert.Equal("date", rom.GetStringFieldValue(Models.Metadata.Rom.DateKey)); Assert.True(rom.GetBoolFieldValue(Models.Metadata.Rom.DisposeKey)); Assert.Equal("extension", rom.GetStringFieldValue(Models.Metadata.Rom.ExtensionKey)); - Assert.Equal(12345, rom.GetInt64FieldValue(Models.Metadata.Rom.FileCountKey)); + Assert.Equal(12345L, rom.GetInt64FieldValue(Models.Metadata.Rom.FileCountKey)); Assert.True(rom.GetBoolFieldValue(Models.Metadata.Rom.FileIsAvailableKey)); Assert.Equal("flags", rom.GetStringFieldValue(Models.Metadata.Rom.FlagsKey)); Assert.Equal("format", rom.GetStringFieldValue(Models.Metadata.Rom.FormatKey)); @@ -1441,7 +1441,7 @@ namespace SabreTools.DatFiles.Test Assert.Equal(ZeroHash.SHA256Str, rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)); Assert.Equal(ZeroHash.SHA384Str, rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)); Assert.Equal(ZeroHash.SHA512Str, rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)); - Assert.Equal(12345, rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey)); + Assert.Equal(12345L, rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey)); Assert.True(rom.GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey)); Assert.Equal("source", rom.GetStringFieldValue(Models.Metadata.Rom.SourceKey)); Assert.Equal(ZeroHash.SpamSumStr, rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)); @@ -1518,7 +1518,7 @@ namespace SabreTools.DatFiles.Test private static void ValidateSound(Sound? sound) { Assert.NotNull(sound); - Assert.Equal(12345, sound.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey)); + Assert.Equal(12345L, sound.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey)); } // TODO: Figure out why so many fields are omitted @@ -1544,12 +1544,12 @@ namespace SabreTools.DatFiles.Test private static void ValidateVideo(Display? display) { Assert.NotNull(display); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Video.AspectXKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Video.AspectYKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Video.AspectXKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Video.AspectYKey)); Assert.Equal("vector", display.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.HeightKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.RefreshKey)); - Assert.Equal(12345, display.GetInt64FieldValue(Models.Metadata.Display.WidthKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.HeightKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.RefreshKey)); + Assert.Equal(12345L, display.GetInt64FieldValue(Models.Metadata.Display.WidthKey)); Assert.Equal(90, display.GetInt64FieldValue(Models.Metadata.Display.RotateKey)); } diff --git a/SabreTools.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.DatFiles.Test/DatFileTests.ToMetadata.cs index beb53a27..6330a81e 100644 --- a/SabreTools.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -1,7 +1,1102 @@ +using System.Collections.Generic; +using SabreTools.DatItems; +using SabreTools.DatItems.Formats; +using SabreTools.Hashing; +using Xunit; + namespace SabreTools.DatFiles.Test { public partial class DatFileTests { - + #region ConvertToMetadata + + [Fact] + public void ConvertToMetadata_Empty() + { + DatFile datFile = new Formats.Logiqx(null, deprecated: false); + + Models.Metadata.MetadataFile? actual = datFile.ConvertToMetadata(); + Assert.Null(actual); + } + + [Fact] + public void ConvertToMetadata_FilledHeader() + { + DatHeader header = CreateHeader(); + + DatFile datFile = new Formats.Logiqx(null, deprecated: false); + datFile.SetHeader(header); + datFile.Items.Add("key", new Rom()); + + Models.Metadata.MetadataFile? actual = datFile.ConvertToMetadata(); + Assert.NotNull(actual); + + Models.Metadata.Header? actualHeader = actual.Read(Models.Metadata.MetadataFile.HeaderKey); + ValidateMetadataHeader(actualHeader); + } + + [Fact] + public void ConvertToMetadata_FilledMachine() + { + Machine machine = CreateMachine(); + + List datItems = + [ + CreateAdjuster(machine), + CreateArchive(machine), + CreateBiosSet(machine), + CreateChip(machine), + CreateConfiguration(machine), + CreateDevice(machine), + CreateDeviceRef(machine), + CreateDipSwitch(machine), + CreateDipSwitchWithPart(machine), + CreateDisk(machine), + CreateDiskWithDiskAreaPart(machine), + CreateDisplay(machine), + CreateDriver(machine), + CreateFeature(machine), + CreateInfo(machine), + CreateInput(machine), + CreateMedia(machine), + CreatePartFeature(machine), + CreatePort(machine), + CreateRamOption(machine), + CreateRelease(machine), + CreateRom(machine), + CreateRomWithDiskAreaPart(machine), + CreateSample(machine), + CreateSharedFeat(machine), + CreateSlot(machine), + CreateSoftwareList(machine), + CreateSound(machine), + CreateVideo(machine), + ]; + + DatFile datFile = new Formats.SabreJSON(null); + datFile.Items.Add("key", datItems); + + Models.Metadata.MetadataFile? actual = datFile.ConvertToMetadata(); + Assert.NotNull(actual); + + Models.Metadata.Machine[]? machines = actual.Read(Models.Metadata.MetadataFile.MachineKey); + Assert.NotNull(machines); + Models.Metadata.Machine actualMachine = Assert.Single(machines); + ValidateMetadataMachine(actualMachine); + } + + #endregion + + #region Creation Helpers + + private static DatHeader CreateHeader() + { + DatHeader item = new DatHeader(CreateMetadataHeader()); + + item.SetFieldValue(Models.Metadata.Header.CanOpenKey, ["ext"]); + item.SetFieldValue(Models.Metadata.Header.ImagesKey, + new Models.OfflineList.Images() { Height = "height" }); + item.SetFieldValue(Models.Metadata.Header.InfosKey, + new Models.OfflineList.Infos() { Comment = new Models.OfflineList.Comment() }); + item.SetFieldValue(Models.Metadata.Header.NewDatKey, + new Models.OfflineList.NewDat() { DatUrl = new Models.OfflineList.DatUrl() }); + item.SetFieldValue(Models.Metadata.Header.SearchKey, + new Models.OfflineList.Search() { To = [] }); + + return item; + } + + private static Machine CreateMachine() + { + Machine item = new Machine(CreateMetadataMachine()); + item.SetFieldValue(Models.Metadata.Machine.TruripKey, CreateTrurip()); + return item; + } + + private static Adjuster CreateAdjuster(Machine machine) + { + Adjuster item = new Adjuster(CreateMetadataAdjuster()); + item.CopyMachineInformation(machine); + return item; + } + + private static Archive CreateArchive(Machine machine) + { + Archive item = new Archive(CreateMetadataArchive()); + item.CopyMachineInformation(machine); + return item; + } + + private static BiosSet CreateBiosSet(Machine machine) + { + BiosSet item = new BiosSet(CreateMetadataBiosSet()); + item.CopyMachineInformation(machine); + return item; + } + + private static Chip CreateChip(Machine machine) + { + Chip item = new Chip(CreateMetadataChip()); + item.CopyMachineInformation(machine); + return item; + } + + private static Configuration CreateConfiguration(Machine machine) + { + Configuration item = new Configuration(CreateMetadataConfiguration()); + item.CopyMachineInformation(machine); + return item; + } + + private static Device CreateDevice(Machine machine) + { + Device item = new Device(CreateMetadataDevice()); + item.CopyMachineInformation(machine); + return item; + } + + private static DataArea CreateDataArea(Machine machine) + { + DataArea item = new DataArea(CreateMetadataDataArea()); + item.CopyMachineInformation(machine); + return item; + } + + private static DeviceRef CreateDeviceRef(Machine machine) + { + DeviceRef item = new DeviceRef(CreateMetadataDeviceRef()); + item.CopyMachineInformation(machine); + return item; + } + + private static DipSwitch CreateDipSwitch(Machine machine) + { + DipSwitch item = new DipSwitch(CreateMetadataDipSwitch()); + item.CopyMachineInformation(machine); + return item; + } + + private static DipSwitch CreateDipSwitchWithPart(Machine machine) + { + DipSwitch item = new DipSwitch(CreateMetadataDipSwitch()); + item.CopyMachineInformation(machine); + item.SetFieldValue(DipSwitch.PartKey, CreatePart(machine)); + return item; + } + + private static Disk CreateDisk(Machine machine) + { + Disk item = new Disk(CreateMetadataDisk()); + item.CopyMachineInformation(machine); + return item; + } + + private static Disk CreateDiskWithDiskAreaPart(Machine machine) + { + Disk item = new Disk(CreateMetadataDisk()); + item.CopyMachineInformation(machine); + item.SetFieldValue(Disk.DiskAreaKey, CreateDiskArea(machine)); + item.SetFieldValue(Disk.PartKey, CreatePart(machine)); + return item; + } + + private static DiskArea CreateDiskArea(Machine machine) + { + DiskArea item = new DiskArea(CreateMetadataDiskArea()); + item.CopyMachineInformation(machine); + return item; + } + + private static Display CreateDisplay(Machine machine) + { + Display item = new Display(CreateMetadataDisplay()); + item.CopyMachineInformation(machine); + return item; + } + + private static Driver CreateDriver(Machine machine) + { + Driver item = new Driver(CreateMetadataDriver()); + item.CopyMachineInformation(machine); + return item; + } + + private static Feature CreateFeature(Machine machine) + { + Feature item = new Feature(CreateMetadataFeature()); + item.CopyMachineInformation(machine); + return item; + } + + private static Info CreateInfo(Machine machine) + { + Info item = new Info(CreateMetadataInfo()); + item.CopyMachineInformation(machine); + return item; + } + + private static Input CreateInput(Machine machine) + { + Input item = new Input(CreateMetadataInput()); + item.CopyMachineInformation(machine); + return item; + } + + private static Media CreateMedia(Machine machine) + { + Media item = new Media(CreateMetadataMedia()); + item.CopyMachineInformation(machine); + return item; + } + + private static Part CreatePart(Machine machine) + { + Part item = new Part(CreateMetadataPart()); + item.CopyMachineInformation(machine); + return item; + } + + private static PartFeature CreatePartFeature(Machine machine) + { + PartFeature item = new PartFeature(CreateMetadataFeature()); + item.CopyMachineInformation(machine); + item.SetFieldValue(PartFeature.PartKey, CreatePart(machine)); + return item; + } + + private static Port CreatePort(Machine machine) + { + Port item = new Port(CreateMetadataPort()); + item.CopyMachineInformation(machine); + return item; + } + + private static RamOption CreateRamOption(Machine machine) + { + RamOption item = new RamOption(CreateMetadataRamOption()); + item.CopyMachineInformation(machine); + return item; + } + + private static Release CreateRelease(Machine machine) + { + Release item = new Release(CreateMetadataRelease()); + item.CopyMachineInformation(machine); + return item; + } + + // TODO: Create variant that results in a Dump + private static Rom CreateRom(Machine machine) + { + Rom item = new Rom(CreateMetadataRom()); + item.CopyMachineInformation(machine); + return item; + } + + private static Rom CreateRomWithDiskAreaPart(Machine machine) + { + Rom item = new Rom(CreateMetadataRom()); + item.CopyMachineInformation(machine); + item.SetFieldValue(Rom.DataAreaKey, CreateDataArea(machine)); + item.SetFieldValue(Rom.PartKey, CreatePart(machine)); + return item; + } + + private static Sample CreateSample(Machine machine) + { + Sample item = new Sample(CreateMetadataSample()); + item.CopyMachineInformation(machine); + return item; + } + + private static SharedFeat CreateSharedFeat(Machine machine) + { + SharedFeat item = new SharedFeat(CreateMetadataSharedFeat()); + item.CopyMachineInformation(machine); + return item; + } + + private static Slot CreateSlot(Machine machine) + { + Slot item = new Slot(CreateMetadataSlot()); + item.CopyMachineInformation(machine); + return item; + } + + private static SoftwareList CreateSoftwareList(Machine machine) + { + SoftwareList item = new SoftwareList(CreateMetadataSoftwareList()); + item.CopyMachineInformation(machine); + return item; + } + + private static Sound CreateSound(Machine machine) + { + Sound item = new Sound(CreateMetadataSound()); + item.CopyMachineInformation(machine); + return item; + } + + private static Trurip CreateTrurip() + { + return new Trurip + { + TitleID = "titleid", + // Publisher = "publisher", + Developer = "developer", + // Year = "year", + Genre = "genre", + Subgenre = "subgenre", + Ratings = "ratings", + Score = "score", + // Players = "players", + Enabled = "enabled", + Crc = true, + // Source = "source", + // CloneOf = "cloneof", + RelatedTo = "relatedto", + }; + } + + private static Display CreateVideo(Machine machine) + { + Display item = new Display(CreateMetadataVideo()); + item.CopyMachineInformation(machine); + return item; + } + + #endregion + + #region Validation Helpers + + private static void ValidateMetadataHeader(Models.Metadata.Header? header) + { + Assert.NotNull(header); + Assert.Equal("author", header.ReadString(Models.Metadata.Header.AuthorKey)); + Assert.Equal("merged", header.ReadString(Models.Metadata.Header.BiosModeKey)); + Assert.Equal("build", header.ReadString(Models.Metadata.Header.BuildKey)); + Assert.NotNull(header.Read(Models.Metadata.Header.CanOpenKey)); + Assert.Equal("category", header.ReadString(Models.Metadata.Header.CategoryKey)); + Assert.Equal("comment", header.ReadString(Models.Metadata.Header.CommentKey)); + Assert.Equal("date", header.ReadString(Models.Metadata.Header.DateKey)); + Assert.Equal("datversion", header.ReadString(Models.Metadata.Header.DatVersionKey)); + Assert.True(header.ReadBool(Models.Metadata.Header.DebugKey)); + Assert.Equal("description", header.ReadString(Models.Metadata.Header.DescriptionKey)); + Assert.Equal("email", header.ReadString(Models.Metadata.Header.EmailKey)); + Assert.Equal("emulatorversion", header.ReadString(Models.Metadata.Header.EmulatorVersionKey)); + Assert.Equal("merged", header.ReadString(Models.Metadata.Header.ForceMergingKey)); + Assert.Equal("required", header.ReadString(Models.Metadata.Header.ForceNodumpKey)); + Assert.Equal("zip", header.ReadString(Models.Metadata.Header.ForcePackingKey)); + Assert.True(header.ReadBool(Models.Metadata.Header.ForceZippingKey)); + Assert.Equal("header", header.ReadString(Models.Metadata.Header.HeaderKey)); + Assert.Equal("homepage", header.ReadString(Models.Metadata.Header.HomepageKey)); + Assert.Equal("id", header.ReadString(Models.Metadata.Header.IdKey)); + Assert.NotNull(header.Read(Models.Metadata.Header.ImagesKey)); + Assert.Equal("imfolder", header.ReadString(Models.Metadata.Header.ImFolderKey)); + Assert.NotNull(header.Read(Models.Metadata.Header.InfosKey)); + Assert.True(header.ReadBool(Models.Metadata.Header.LockBiosModeKey)); + Assert.True(header.ReadBool(Models.Metadata.Header.LockRomModeKey)); + Assert.True(header.ReadBool(Models.Metadata.Header.LockSampleModeKey)); + Assert.Equal("mameconfig", header.ReadString(Models.Metadata.Header.MameConfigKey)); + Assert.Equal("name", header.ReadString(Models.Metadata.Header.NameKey)); + Assert.NotNull(header.Read(Models.Metadata.Header.NewDatKey)); + Assert.Equal("notes", header.ReadString(Models.Metadata.Header.NotesKey)); + Assert.Equal("plugin", header.ReadString(Models.Metadata.Header.PluginKey)); + Assert.Equal("refname", header.ReadString(Models.Metadata.Header.RefNameKey)); + Assert.Equal("merged", header.ReadString(Models.Metadata.Header.RomModeKey)); + Assert.Equal("romtitle", header.ReadString(Models.Metadata.Header.RomTitleKey)); + Assert.Equal("rootdir", header.ReadString(Models.Metadata.Header.RootDirKey)); + Assert.Equal("merged", header.ReadString(Models.Metadata.Header.SampleModeKey)); + Assert.Equal("schemalocation", header.ReadString(Models.Metadata.Header.SchemaLocationKey)); + Assert.Equal("screenshotsheight", header.ReadString(Models.Metadata.Header.ScreenshotsHeightKey)); + Assert.Equal("screenshotsWidth", header.ReadString(Models.Metadata.Header.ScreenshotsWidthKey)); + Assert.NotNull(header.Read(Models.Metadata.Header.SearchKey)); + Assert.Equal("system", header.ReadString(Models.Metadata.Header.SystemKey)); + Assert.Equal("timestamp", header.ReadString(Models.Metadata.Header.TimestampKey)); + Assert.Equal("type", header.ReadString(Models.Metadata.Header.TypeKey)); + Assert.Equal("url", header.ReadString(Models.Metadata.Header.UrlKey)); + Assert.Equal("version", header.ReadString(Models.Metadata.Header.VersionKey)); + } + + // TODO: Add reading all item types here + private static void ValidateMetadataMachine(Models.Metadata.Machine machine) + { + Assert.Equal("board", machine.ReadString(Models.Metadata.Machine.BoardKey)); + Assert.Equal("buttons", machine.ReadString(Models.Metadata.Machine.ButtonsKey)); + Assert.Equal("category", machine.ReadString(Models.Metadata.Machine.CategoryKey)); + Assert.Equal("cloneof", machine.ReadString(Models.Metadata.Machine.CloneOfKey)); + Assert.Equal("cloneofid", machine.ReadString(Models.Metadata.Machine.CloneOfIdKey)); + Assert.Equal("comment", machine.ReadString(Models.Metadata.Machine.CommentKey)); + Assert.Equal("company", machine.ReadString(Models.Metadata.Machine.CompanyKey)); + Assert.Equal("control", machine.ReadString(Models.Metadata.Machine.ControlKey)); + Assert.Equal("country", machine.ReadString(Models.Metadata.Machine.CountryKey)); + Assert.Equal("description", machine.ReadString(Models.Metadata.Machine.DescriptionKey)); + Assert.Equal("dirname", machine.ReadString(Models.Metadata.Machine.DirNameKey)); + Assert.Equal("displaycount", machine.ReadString(Models.Metadata.Machine.DisplayCountKey)); + Assert.Equal("displaytype", machine.ReadString(Models.Metadata.Machine.DisplayTypeKey)); + Assert.Equal("duplicateid", machine.ReadString(Models.Metadata.Machine.DuplicateIDKey)); + Assert.Equal("emulator", machine.ReadString(Models.Metadata.Machine.EmulatorKey)); + Assert.Equal("extra", machine.ReadString(Models.Metadata.Machine.ExtraKey)); + Assert.Equal("favorite", machine.ReadString(Models.Metadata.Machine.FavoriteKey)); + Assert.Equal("genmsxid", machine.ReadString(Models.Metadata.Machine.GenMSXIDKey)); + Assert.Equal("history", machine.ReadString(Models.Metadata.Machine.HistoryKey)); + Assert.Equal("id", machine.ReadString(Models.Metadata.Machine.IdKey)); + Assert.Equal(ZeroHash.CRC32Str, machine.ReadString(Models.Metadata.Machine.Im1CRCKey)); + Assert.Equal(ZeroHash.CRC32Str, machine.ReadString(Models.Metadata.Machine.Im2CRCKey)); + Assert.Equal("imagenumber", machine.ReadString(Models.Metadata.Machine.ImageNumberKey)); + Assert.Equal("yes", machine.ReadString(Models.Metadata.Machine.IsBiosKey)); + Assert.Equal("yes", machine.ReadString(Models.Metadata.Machine.IsDeviceKey)); + Assert.Equal("yes", machine.ReadString(Models.Metadata.Machine.IsMechanicalKey)); + Assert.Equal("language", machine.ReadString(Models.Metadata.Machine.LanguageKey)); + Assert.Equal("location", machine.ReadString(Models.Metadata.Machine.LocationKey)); + Assert.Equal("manufacturer", machine.ReadString(Models.Metadata.Machine.ManufacturerKey)); + Assert.Equal("name", machine.ReadString(Models.Metadata.Machine.NameKey)); + Assert.Equal("notes", machine.ReadString(Models.Metadata.Machine.NotesKey)); + Assert.Equal("playedcount", machine.ReadString(Models.Metadata.Machine.PlayedCountKey)); + Assert.Equal("playedtime", machine.ReadString(Models.Metadata.Machine.PlayedTimeKey)); + Assert.Equal("players", machine.ReadString(Models.Metadata.Machine.PlayersKey)); + Assert.Equal("publisher", machine.ReadString(Models.Metadata.Machine.PublisherKey)); + Assert.Equal("rebuildto", machine.ReadString(Models.Metadata.Machine.RebuildToKey)); + Assert.Equal("releasenumber", machine.ReadString(Models.Metadata.Machine.ReleaseNumberKey)); + Assert.Equal("romof", machine.ReadString(Models.Metadata.Machine.RomOfKey)); + Assert.Equal("rotation", machine.ReadString(Models.Metadata.Machine.RotationKey)); + Assert.Equal("yes", machine.ReadString(Models.Metadata.Machine.RunnableKey)); + Assert.Equal("sampleof", machine.ReadString(Models.Metadata.Machine.SampleOfKey)); + Assert.Equal("savetype", machine.ReadString(Models.Metadata.Machine.SaveTypeKey)); + Assert.Equal("sourcefile", machine.ReadString(Models.Metadata.Machine.SourceFileKey)); + Assert.Equal("sourcerom", machine.ReadString(Models.Metadata.Machine.SourceRomKey)); + Assert.Equal("status", machine.ReadString(Models.Metadata.Machine.StatusKey)); + Assert.Equal("yes", machine.ReadString(Models.Metadata.Machine.SupportedKey)); + Assert.Equal("system", machine.ReadString(Models.Metadata.Machine.SystemKey)); + Assert.Equal("tags", machine.ReadString(Models.Metadata.Machine.TagsKey)); + Assert.Equal("year", machine.ReadString(Models.Metadata.Machine.YearKey)); + + Models.Metadata.Adjuster[]? adjusters = machine.Read(Models.Metadata.Machine.AdjusterKey); + Assert.NotNull(adjusters); + Models.Metadata.Adjuster adjuster = Assert.Single(adjusters); + ValidateMetadataAdjuster(adjuster); + + Models.Metadata.Archive[]? archives = machine.Read(Models.Metadata.Machine.ArchiveKey); + Assert.NotNull(archives); + Models.Metadata.Archive archive = Assert.Single(archives); + ValidateMetadataArchive(archive); + + Models.Metadata.BiosSet[]? biosSets = machine.Read(Models.Metadata.Machine.BiosSetKey); + Assert.NotNull(biosSets); + Models.Metadata.BiosSet biosSet = Assert.Single(biosSets); + ValidateMetadataBiosSet(biosSet); + + Models.Metadata.Chip[]? chips = machine.Read(Models.Metadata.Machine.ChipKey); + Assert.NotNull(chips); + Models.Metadata.Chip chip = Assert.Single(chips); + ValidateMetadataChip(chip); + + Models.Metadata.Configuration[]? configurations = machine.Read(Models.Metadata.Machine.ConfigurationKey); + Assert.NotNull(configurations); + Models.Metadata.Configuration configuration = Assert.Single(configurations); + ValidateMetadataConfiguration(configuration); + + Models.Metadata.Device[]? devices = machine.Read(Models.Metadata.Machine.DeviceKey); + Assert.NotNull(devices); + Models.Metadata.Device device = Assert.Single(devices); + ValidateMetadataDevice(device); + + Models.Metadata.DeviceRef[]? deviceRefs = machine.Read(Models.Metadata.Machine.DeviceRefKey); + Assert.NotNull(deviceRefs); + Models.Metadata.DeviceRef deviceRef = Assert.Single(deviceRefs); + ValidateMetadataDeviceRef(deviceRef); + + Models.Metadata.DipSwitch[]? dipSwitches = machine.Read(Models.Metadata.Machine.DipSwitchKey); + Assert.NotNull(dipSwitches); + Models.Metadata.DipSwitch dipSwitch = Assert.Single(dipSwitches); + ValidateMetadataDipSwitch(dipSwitch); + + Models.Metadata.Disk[]? disks = machine.Read(Models.Metadata.Machine.DiskKey); + Assert.NotNull(disks); + Models.Metadata.Disk disk = Assert.Single(disks); + ValidateMetadataDisk(disk); + + Models.Metadata.Display[]? displays = machine.Read(Models.Metadata.Machine.DisplayKey); + Assert.NotNull(displays); + Models.Metadata.Display display = Assert.Single(displays); + ValidateMetadataDisplay(display); + + Models.Metadata.Driver? driver = machine.Read(Models.Metadata.Machine.DriverKey); + ValidateMetadataDriver(driver); + + // TODO: Implement this validation + // Models.Metadata.Dump[]? dumps = machine.Read(Models.Metadata.Machine.DumpKey); + // Assert.NotNull(dumps); + // Models.Metadata.Dump dump = Assert.Single(dumps); + // ValidateMetadataDump(dump); + + Models.Metadata.Feature[]? features = machine.Read(Models.Metadata.Machine.FeatureKey); + Assert.NotNull(features); + Models.Metadata.Feature feature = Assert.Single(features); + ValidateMetadataFeature(feature); + + Models.Metadata.Info[]? infos = machine.Read(Models.Metadata.Machine.InfoKey); + Assert.NotNull(infos); + Models.Metadata.Info info = Assert.Single(infos); + ValidateMetadataInfo(info); + + Models.Metadata.Input? input = machine.Read(Models.Metadata.Machine.InputKey); + ValidateMetadataInput(input); + + Models.Metadata.Media[]? media = machine.Read(Models.Metadata.Machine.MediaKey); + Assert.NotNull(media); + Models.Metadata.Media medium = Assert.Single(media); + ValidateMetadataMedia(medium); + + Models.Metadata.Part[]? parts = machine.Read(Models.Metadata.Machine.PartKey); + Assert.NotNull(parts); + Models.Metadata.Part part = Assert.Single(parts); + ValidateMetadataPart(part); + + Models.Metadata.Port[]? ports = machine.Read(Models.Metadata.Machine.PortKey); + Assert.NotNull(ports); + Models.Metadata.Port port = Assert.Single(ports); + ValidateMetadataPort(port); + + Models.Metadata.RamOption[]? ramOptions = machine.Read(Models.Metadata.Machine.RamOptionKey); + Assert.NotNull(ramOptions); + Models.Metadata.RamOption ramOption = Assert.Single(ramOptions); + ValidateMetadataRamOption(ramOption); + + Models.Metadata.Release[]? releases = machine.Read(Models.Metadata.Machine.ReleaseKey); + Assert.NotNull(releases); + Models.Metadata.Release release = Assert.Single(releases); + ValidateMetadataRelease(release); + + Models.Logiqx.Trurip? trurip = machine.Read(Models.Metadata.Machine.TruripKey); + ValidateMetadataTrurip(trurip); + } + + private static void ValidateMetadataAdjuster(Models.Metadata.Adjuster? adjuster) + { + Assert.NotNull(adjuster); + Assert.True(adjuster.ReadBool(Models.Metadata.Adjuster.DefaultKey)); + Assert.Equal("name", adjuster.ReadString(Models.Metadata.Adjuster.NameKey)); + + Models.Metadata.Condition? condition = adjuster.Read(Models.Metadata.Adjuster.ConditionKey); + ValidateMetadataCondition(condition); + } + + private static void ValidateMetadataAnalog(Models.Metadata.Analog? analog) + { + Assert.NotNull(analog); + Assert.Equal("mask", analog.ReadString(Models.Metadata.Analog.MaskKey)); + } + + private static void ValidateMetadataArchive(Models.Metadata.Archive? archive) + { + Assert.NotNull(archive); + Assert.Equal("name", archive.ReadString(Models.Metadata.Archive.NameKey)); + } + + private static void ValidateMetadataBiosSet(Models.Metadata.BiosSet? biosSet) + { + Assert.NotNull(biosSet); + Assert.True(biosSet.ReadBool(Models.Metadata.BiosSet.DefaultKey)); + Assert.Equal("description", biosSet.ReadString(Models.Metadata.BiosSet.DescriptionKey)); + Assert.Equal("name", biosSet.ReadString(Models.Metadata.BiosSet.NameKey)); + } + + private static void ValidateMetadataChip(Models.Metadata.Chip? chip) + { + Assert.NotNull(chip); + Assert.Equal(12345, chip.ReadLong(Models.Metadata.Chip.ClockKey)); + Assert.Equal("flags", chip.ReadString(Models.Metadata.Chip.FlagsKey)); + Assert.Equal("name", chip.ReadString(Models.Metadata.Chip.NameKey)); + Assert.True(chip.ReadBool(Models.Metadata.Chip.SoundOnlyKey)); + Assert.Equal("tag", chip.ReadString(Models.Metadata.Chip.TagKey)); + Assert.Equal("cpu", chip.ReadString(Models.Metadata.Chip.ChipTypeKey)); + } + + private static void ValidateMetadataCondition(Models.Metadata.Condition? condition) + { + Assert.NotNull(condition); + Assert.Equal("value", condition.ReadString(Models.Metadata.Condition.ValueKey)); + Assert.Equal("mask", condition.ReadString(Models.Metadata.Condition.MaskKey)); + Assert.Equal("eq", condition.ReadString(Models.Metadata.Condition.RelationKey)); + Assert.Equal("tag", condition.ReadString(Models.Metadata.Condition.TagKey)); + } + + private static void ValidateMetadataConfiguration(Models.Metadata.Configuration? configuration) + { + Assert.NotNull(configuration); + Assert.Equal("mask", configuration.ReadString(Models.Metadata.Configuration.MaskKey)); + Assert.Equal("name", configuration.ReadString(Models.Metadata.Configuration.NameKey)); + Assert.Equal("tag", configuration.ReadString(Models.Metadata.Configuration.TagKey)); + + Models.Metadata.Condition? condition = configuration.Read(Models.Metadata.Configuration.ConditionKey); + ValidateMetadataCondition(condition); + + Models.Metadata.ConfLocation[]? confLocations = configuration.Read(Models.Metadata.Configuration.ConfLocationKey); + Assert.NotNull(confLocations); + Models.Metadata.ConfLocation? confLocation = Assert.Single(confLocations); + ValidateMetadataConfLocation(confLocation); + + Models.Metadata.ConfSetting[]? confSettings = configuration.Read(Models.Metadata.Configuration.ConfSettingKey); + Assert.NotNull(confSettings); + Models.Metadata.ConfSetting? confSetting = Assert.Single(confSettings); + ValidateMetadataConfSetting(confSetting); + } + + private static void ValidateMetadataConfLocation(Models.Metadata.ConfLocation? confLocation) + { + Assert.NotNull(confLocation); + Assert.True(confLocation.ReadBool(Models.Metadata.ConfLocation.InvertedKey)); + Assert.Equal("name", confLocation.ReadString(Models.Metadata.ConfLocation.NameKey)); + Assert.Equal("number", confLocation.ReadString(Models.Metadata.ConfLocation.NumberKey)); + } + + private static void ValidateMetadataConfSetting(Models.Metadata.ConfSetting? confSetting) + { + Assert.NotNull(confSetting); + Assert.True(confSetting.ReadBool(Models.Metadata.ConfSetting.DefaultKey)); + Assert.Equal("name", confSetting.ReadString(Models.Metadata.ConfSetting.NameKey)); + Assert.Equal("value", confSetting.ReadString(Models.Metadata.ConfSetting.ValueKey)); + + Models.Metadata.Condition? condition = confSetting.Read(Models.Metadata.ConfSetting.ConditionKey); + ValidateMetadataCondition(condition); + } + + private static void ValidateMetadataControl(Models.Metadata.Control? control) + { + Assert.NotNull(control); + Assert.Equal(12345, control.ReadLong(Models.Metadata.Control.ButtonsKey)); + Assert.Equal(12345, control.ReadLong(Models.Metadata.Control.KeyDeltaKey)); + Assert.Equal(12345, control.ReadLong(Models.Metadata.Control.MaximumKey)); + Assert.Equal(12345, control.ReadLong(Models.Metadata.Control.MinimumKey)); + Assert.Equal(12345, control.ReadLong(Models.Metadata.Control.PlayerKey)); + Assert.Equal(12345, control.ReadLong(Models.Metadata.Control.ReqButtonsKey)); + Assert.True(control.ReadBool(Models.Metadata.Control.ReverseKey)); + Assert.Equal(12345, control.ReadLong(Models.Metadata.Control.SensitivityKey)); + Assert.Equal("lightgun", control.ReadString(Models.Metadata.Control.ControlTypeKey)); + Assert.Equal("ways", control.ReadString(Models.Metadata.Control.WaysKey)); + Assert.Equal("ways2", control.ReadString(Models.Metadata.Control.Ways2Key)); + Assert.Equal("ways3", control.ReadString(Models.Metadata.Control.Ways3Key)); + } + + // private static void ValidateMetadataDataArea(DataArea? dataArea) + // { + // Assert.NotNull(dataArea); + // Assert.Equal("big", dataArea.ReadString(Models.Metadata.DataArea.EndiannessKey)); + // Assert.Equal("name", dataArea.ReadString(Models.Metadata.DataArea.NameKey)); + // Assert.Equal(12345, dataArea.ReadLong(Models.Metadata.DataArea.SizeKey)); + // Assert.Equal(64, dataArea.ReadLong(Models.Metadata.DataArea.WidthKey)); + // } + + private static void ValidateMetadataDevice(Models.Metadata.Device? device) + { + Assert.NotNull(device); + Assert.Equal("fixedimage", device.ReadString(Models.Metadata.Device.FixedImageKey)); + Assert.Equal("interface", device.ReadString(Models.Metadata.Device.InterfaceKey)); + Assert.Equal(1, device.ReadLong(Models.Metadata.Device.MandatoryKey)); + Assert.Equal("tag", device.ReadString(Models.Metadata.Device.TagKey)); + Assert.Equal("punchtape", device.ReadString(Models.Metadata.Device.DeviceTypeKey)); + + Models.Metadata.Extension[]? extensions = device.Read(Models.Metadata.Device.ExtensionKey); + Assert.NotNull(extensions); + Models.Metadata.Extension? extension = Assert.Single(extensions); + ValidateMetadataExtension(extension); + + Models.Metadata.Instance? instance = device.Read(Models.Metadata.Device.InstanceKey); + ValidateMetadataInstance(instance); + } + + private static void ValidateMetadataDeviceRef(Models.Metadata.DeviceRef? deviceRef) + { + Assert.NotNull(deviceRef); + Assert.Equal("name", deviceRef.ReadString(Models.Metadata.DeviceRef.NameKey)); + } + + private static void ValidateMetadataDipLocation(Models.Metadata.DipLocation? dipLocation) + { + Assert.NotNull(dipLocation); + Assert.True(dipLocation.ReadBool(Models.Metadata.DipLocation.InvertedKey)); + Assert.Equal("name", dipLocation.ReadString(Models.Metadata.DipLocation.NameKey)); + Assert.Equal("number", dipLocation.ReadString(Models.Metadata.DipLocation.NumberKey)); + } + + private static void ValidateMetadataDipSwitch(Models.Metadata.DipSwitch? dipSwitch) + { + Assert.NotNull(dipSwitch); + Assert.True(dipSwitch.ReadBool(Models.Metadata.DipSwitch.DefaultKey)); + Assert.Equal("mask", dipSwitch.ReadString(Models.Metadata.DipSwitch.MaskKey)); + Assert.Equal("name", dipSwitch.ReadString(Models.Metadata.DipSwitch.NameKey)); + Assert.Equal("tag", dipSwitch.ReadString(Models.Metadata.DipSwitch.TagKey)); + + Models.Metadata.Condition? condition = dipSwitch.Read(Models.Metadata.DipSwitch.ConditionKey); + ValidateMetadataCondition(condition); + + Models.Metadata.DipLocation[]? dipLocations = dipSwitch.Read(Models.Metadata.DipSwitch.DipLocationKey); + Assert.NotNull(dipLocations); + Models.Metadata.DipLocation? dipLocation = Assert.Single(dipLocations); + ValidateMetadataDipLocation(dipLocation); + + Models.Metadata.DipValue[]? dipValues = dipSwitch.Read(Models.Metadata.DipSwitch.DipValueKey); + Assert.NotNull(dipValues); + Models.Metadata.DipValue? dipValue = Assert.Single(dipValues); + ValidateMetadataDipValue(dipValue); + + string[]? entries = dipSwitch.ReadStringArray(Models.Metadata.DipSwitch.EntryKey); + Assert.NotNull(entries); + string entry = Assert.Single(entries); + Assert.Equal("entry", entry); + } + + private static void ValidateMetadataDipValue(Models.Metadata.DipValue? dipValue) + { + Assert.NotNull(dipValue); + Assert.True(dipValue.ReadBool(Models.Metadata.DipValue.DefaultKey)); + Assert.Equal("name", dipValue.ReadString(Models.Metadata.DipValue.NameKey)); + Assert.Equal("value", dipValue.ReadString(Models.Metadata.DipValue.ValueKey)); + + Models.Metadata.Condition? condition = dipValue.Read(Models.Metadata.DipValue.ConditionKey); + ValidateMetadataCondition(condition); + } + + private static void ValidateMetadataDisk(Models.Metadata.Disk? disk) + { + Assert.NotNull(disk); + Assert.Equal("flags", disk.ReadString(Models.Metadata.Disk.FlagsKey)); + Assert.Equal("index", disk.ReadString(Models.Metadata.Disk.IndexKey)); + Assert.Equal(ZeroHash.MD5Str, disk.ReadString(Models.Metadata.Disk.MD5Key)); + Assert.Equal("merge", disk.ReadString(Models.Metadata.Disk.MergeKey)); + Assert.Equal("name", disk.ReadString(Models.Metadata.Disk.NameKey)); + Assert.True(disk.ReadBool(Models.Metadata.Disk.OptionalKey)); + Assert.Equal("region", disk.ReadString(Models.Metadata.Disk.RegionKey)); + Assert.Equal(ZeroHash.SHA1Str, disk.ReadString(Models.Metadata.Disk.SHA1Key)); + Assert.True(disk.ReadBool(Models.Metadata.Disk.WritableKey)); + } + + // private static void ValidateMetadataDiskArea(Models.Metadata.DiskArea? diskArea) + // { + // Assert.NotNull(diskArea); + // Assert.Equal("name", diskArea.ReadString(Models.Metadata.DiskArea.NameKey)); + // } + + private static void ValidateMetadataDisplay(Models.Metadata.Display? display) + { + Assert.NotNull(display); + Assert.True(display.ReadBool(Models.Metadata.Display.FlipXKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.HBEndKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.HBStartKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.HeightKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.HTotalKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.PixClockKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.RefreshKey)); + Assert.Equal(90, display.ReadLong(Models.Metadata.Display.RotateKey)); + Assert.Equal("tag", display.ReadString(Models.Metadata.Display.TagKey)); + Assert.Equal("vector", display.ReadString(Models.Metadata.Display.DisplayTypeKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.VBEndKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.VBStartKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.VTotalKey)); + Assert.Equal(12345, display.ReadLong(Models.Metadata.Display.WidthKey)); + } + + private static void ValidateMetadataDriver(Models.Metadata.Driver? driver) + { + Assert.NotNull(driver); + Assert.Equal("plain", driver.ReadString(Models.Metadata.Driver.BlitKey)); + Assert.Equal("good", driver.ReadString(Models.Metadata.Driver.CocktailKey)); + Assert.Equal("good", driver.ReadString(Models.Metadata.Driver.ColorKey)); + Assert.Equal("good", driver.ReadString(Models.Metadata.Driver.EmulationKey)); + Assert.True(driver.ReadBool(Models.Metadata.Driver.IncompleteKey)); + Assert.True(driver.ReadBool(Models.Metadata.Driver.NoSoundHardwareKey)); + Assert.Equal("pallettesize", driver.ReadString(Models.Metadata.Driver.PaletteSizeKey)); + Assert.True(driver.ReadBool(Models.Metadata.Driver.RequiresArtworkKey)); + Assert.Equal("supported", driver.ReadString(Models.Metadata.Driver.SaveStateKey)); + Assert.Equal("good", driver.ReadString(Models.Metadata.Driver.SoundKey)); + Assert.Equal("good", driver.ReadString(Models.Metadata.Driver.StatusKey)); + Assert.True(driver.ReadBool(Models.Metadata.Driver.UnofficialKey)); + } + + private static void ValidateMetadataExtension(Models.Metadata.Extension? extension) + { + Assert.NotNull(extension); + Assert.Equal("name", extension.ReadString(Models.Metadata.Extension.NameKey)); + } + + private static void ValidateMetadataFeature(Models.Metadata.Feature? feature) + { + Assert.NotNull(feature); + Assert.Equal("name", feature.ReadString(Models.Metadata.Feature.NameKey)); + Assert.Equal("imperfect", feature.ReadString(Models.Metadata.Feature.OverallKey)); + Assert.Equal("imperfect", feature.ReadString(Models.Metadata.Feature.StatusKey)); + Assert.Equal("protection", feature.ReadString(Models.Metadata.Feature.FeatureTypeKey)); + Assert.Equal("value", feature.ReadString(Models.Metadata.Feature.ValueKey)); + } + + private static void ValidateMetadataInfo(Models.Metadata.Info? info) + { + Assert.NotNull(info); + Assert.Equal("name", info.ReadString(Models.Metadata.Info.NameKey)); + Assert.Equal("value", info.ReadString(Models.Metadata.Info.ValueKey)); + } + + private static void ValidateMetadataInput(Models.Metadata.Input? input) + { + Assert.NotNull(input); + Assert.Equal(12345, input.ReadLong(Models.Metadata.Input.ButtonsKey)); + Assert.Equal(12345, input.ReadLong(Models.Metadata.Input.CoinsKey)); + Assert.Equal(12345, input.ReadLong(Models.Metadata.Input.PlayersKey)); + Assert.True(input.ReadBool(Models.Metadata.Input.ServiceKey)); + Assert.True(input.ReadBool(Models.Metadata.Input.TiltKey)); + + Models.Metadata.Control[]? controls = input.Read(Models.Metadata.Input.ControlKey); + Assert.NotNull(controls); + Models.Metadata.Control? control = Assert.Single(controls); + ValidateMetadataControl(control); + } + + private static void ValidateMetadataInstance(Models.Metadata.Instance? instance) + { + Assert.NotNull(instance); + Assert.Equal("briefname", instance.ReadString(Models.Metadata.Instance.BriefNameKey)); + Assert.Equal("name", instance.ReadString(Models.Metadata.Instance.NameKey)); + } + + private static void ValidateMetadataMedia(Models.Metadata.Media? media) + { + Assert.NotNull(media); + Assert.Equal(ZeroHash.MD5Str, media.ReadString(Models.Metadata.Media.MD5Key)); + Assert.Equal("name", media.ReadString(Models.Metadata.Media.NameKey)); + Assert.Equal(ZeroHash.SHA1Str, media.ReadString(Models.Metadata.Media.SHA1Key)); + Assert.Equal(ZeroHash.SHA256Str, media.ReadString(Models.Metadata.Media.SHA256Key)); + Assert.Equal(ZeroHash.SpamSumStr, media.ReadString(Models.Metadata.Media.SpamSumKey)); + } + + // TODO: Ensure type arrays are validated + private static void ValidateMetadataPart(Models.Metadata.Part? part) + { + Assert.NotNull(part); + Assert.Equal("interface", part.ReadString(Models.Metadata.Part.InterfaceKey)); + Assert.Equal("name", part.ReadString(Models.Metadata.Part.NameKey)); + } + + // private static void ValidateMetadataPartFeature(Models.Metadata.PartFeature? partFeature) + // { + // Assert.NotNull(partFeature); + // Assert.Equal("name", partFeature.ReadString(Models.Metadata.Feature.NameKey)); + // Assert.Equal("imperfect", partFeature.ReadString(Models.Metadata.Feature.OverallKey)); + // Assert.Equal("imperfect", partFeature.ReadString(Models.Metadata.Feature.StatusKey)); + // Assert.Equal("protection", partFeature.ReadString(Models.Metadata.Feature.FeatureTypeKey)); + // Assert.Equal("value", partFeature.ReadString(Models.Metadata.Feature.ValueKey)); + + // Part? part = partFeature.Read(PartFeature.PartKey); + // ValidateMetadataPart(part); + // } + + private static void ValidateMetadataPort(Models.Metadata.Port? port) + { + Assert.NotNull(port); + Assert.Equal("tag", port.ReadString(Models.Metadata.Port.TagKey)); + + Models.Metadata.Analog[]? dipValues = port.Read(Models.Metadata.Port.AnalogKey); + Assert.NotNull(dipValues); + Models.Metadata.Analog? dipValue = Assert.Single(dipValues); + ValidateMetadataAnalog(dipValue); + } + + private static void ValidateMetadataRamOption(Models.Metadata.RamOption? ramOption) + { + Assert.NotNull(ramOption); + Assert.Equal("content", ramOption.ReadString(Models.Metadata.RamOption.ContentKey)); + Assert.True(ramOption.ReadBool(Models.Metadata.RamOption.DefaultKey)); + Assert.Equal("name", ramOption.ReadString(Models.Metadata.RamOption.NameKey)); + } + + private static void ValidateMetadataRelease(Models.Metadata.Release? release) + { + Assert.NotNull(release); + Assert.Equal("date", release.ReadString(Models.Metadata.Release.DateKey)); + Assert.True(release.ReadBool(Models.Metadata.Release.DefaultKey)); + Assert.Equal("language", release.ReadString(Models.Metadata.Release.LanguageKey)); + Assert.Equal("name", release.ReadString(Models.Metadata.Release.NameKey)); + Assert.Equal("region", release.ReadString(Models.Metadata.Release.RegionKey)); + } + + // private static void ValidateMetadataRom(Models.Metadata.Rom? rom) + // { + // Assert.NotNull(rom); + // Assert.Equal("album", rom.ReadString(Models.Metadata.Rom.AlbumKey)); + // Assert.Equal("alt_romname", rom.ReadString(Models.Metadata.Rom.AltRomnameKey)); + // Assert.Equal("alt_title", rom.ReadString(Models.Metadata.Rom.AltTitleKey)); + // Assert.Equal("artist", rom.ReadString(Models.Metadata.Rom.ArtistKey)); + // Assert.Equal("asr_detected_lang", rom.ReadString(Models.Metadata.Rom.ASRDetectedLangKey)); + // Assert.Equal("asr_detected_lang_conf", rom.ReadString(Models.Metadata.Rom.ASRDetectedLangConfKey)); + // Assert.Equal("asr_transcribed_lang", rom.ReadString(Models.Metadata.Rom.ASRTranscribedLangKey)); + // Assert.Equal("bios", rom.ReadString(Models.Metadata.Rom.BiosKey)); + // Assert.Equal("bitrate", rom.ReadString(Models.Metadata.Rom.BitrateKey)); + // Assert.Equal("btih", rom.ReadString(Models.Metadata.Rom.BitTorrentMagnetHashKey)); + // Assert.Equal("cloth_cover_detection_module_version", rom.ReadString(Models.Metadata.Rom.ClothCoverDetectionModuleVersionKey)); + // Assert.Equal("collection-catalog-number", rom.ReadString(Models.Metadata.Rom.CollectionCatalogNumberKey)); + // Assert.Equal("comment", rom.ReadString(Models.Metadata.Rom.CommentKey)); + // Assert.Equal(ZeroHash.CRC32Str, rom.ReadString(Models.Metadata.Rom.CRCKey)); + // Assert.Equal("creator", rom.ReadString(Models.Metadata.Rom.CreatorKey)); + // Assert.Equal("date", rom.ReadString(Models.Metadata.Rom.DateKey)); + // Assert.True(rom.ReadBool(Models.Metadata.Rom.DisposeKey)); + // Assert.Equal("extension", rom.ReadString(Models.Metadata.Rom.ExtensionKey)); + // Assert.Equal(12345, rom.ReadLong(Models.Metadata.Rom.FileCountKey)); + // Assert.True(rom.ReadBool(Models.Metadata.Rom.FileIsAvailableKey)); + // Assert.Equal("flags", rom.ReadString(Models.Metadata.Rom.FlagsKey)); + // Assert.Equal("format", rom.ReadString(Models.Metadata.Rom.FormatKey)); + // Assert.Equal("header", rom.ReadString(Models.Metadata.Rom.HeaderKey)); + // Assert.Equal("height", rom.ReadString(Models.Metadata.Rom.HeightKey)); + // Assert.Equal("hocr_char_to_word_hocr_version", rom.ReadString(Models.Metadata.Rom.hOCRCharToWordhOCRVersionKey)); + // Assert.Equal("hocr_char_to_word_module_version", rom.ReadString(Models.Metadata.Rom.hOCRCharToWordModuleVersionKey)); + // Assert.Equal("hocr_fts_text_hocr_version", rom.ReadString(Models.Metadata.Rom.hOCRFtsTexthOCRVersionKey)); + // Assert.Equal("hocr_fts_text_module_version", rom.ReadString(Models.Metadata.Rom.hOCRFtsTextModuleVersionKey)); + // Assert.Equal("hocr_pageindex_hocr_version", rom.ReadString(Models.Metadata.Rom.hOCRPageIndexhOCRVersionKey)); + // Assert.Equal("hocr_pageindex_module_version", rom.ReadString(Models.Metadata.Rom.hOCRPageIndexModuleVersionKey)); + // Assert.True(rom.ReadBool(Models.Metadata.Rom.InvertedKey)); + // Assert.Equal("mtime", rom.ReadString(Models.Metadata.Rom.LastModifiedTimeKey)); + // Assert.Equal("length", rom.ReadString(Models.Metadata.Rom.LengthKey)); + // Assert.Equal("load16_byte", rom.ReadString(Models.Metadata.Rom.LoadFlagKey)); + // Assert.Equal("matrix_number", rom.ReadString(Models.Metadata.Rom.MatrixNumberKey)); + // Assert.Equal(ZeroHash.GetString(HashType.MD2), rom.ReadString(Models.Metadata.Rom.MD2Key)); + // Assert.Equal(ZeroHash.GetString(HashType.MD4), rom.ReadString(Models.Metadata.Rom.MD4Key)); + // Assert.Equal(ZeroHash.MD5Str, rom.ReadString(Models.Metadata.Rom.MD5Key)); + // Assert.Null(rom.ReadString(Models.Metadata.Rom.OpenMSXMediaType)); // Omit due to other test + // Assert.Equal("merge", rom.ReadString(Models.Metadata.Rom.MergeKey)); + // Assert.True(rom.ReadBool(Models.Metadata.Rom.MIAKey)); + // Assert.Equal("name", rom.ReadString(Models.Metadata.Rom.NameKey)); + // Assert.Equal("ocr", rom.ReadString(Models.Metadata.Rom.TesseractOCRKey)); + // Assert.Equal("ocr_converted", rom.ReadString(Models.Metadata.Rom.TesseractOCRConvertedKey)); + // Assert.Equal("ocr_detected_lang", rom.ReadString(Models.Metadata.Rom.TesseractOCRDetectedLangKey)); + // Assert.Equal("ocr_detected_lang_conf", rom.ReadString(Models.Metadata.Rom.TesseractOCRDetectedLangConfKey)); + // Assert.Equal("ocr_detected_script", rom.ReadString(Models.Metadata.Rom.TesseractOCRDetectedScriptKey)); + // Assert.Equal("ocr_detected_script_conf", rom.ReadString(Models.Metadata.Rom.TesseractOCRDetectedScriptConfKey)); + // Assert.Equal("ocr_module_version", rom.ReadString(Models.Metadata.Rom.TesseractOCRModuleVersionKey)); + // Assert.Equal("ocr_parameters", rom.ReadString(Models.Metadata.Rom.TesseractOCRParametersKey)); + // Assert.Equal("offset", rom.ReadString(Models.Metadata.Rom.OffsetKey)); + // Assert.True(rom.ReadBool(Models.Metadata.Rom.OptionalKey)); + // Assert.Equal("original", rom.ReadString(Models.Metadata.Rom.OriginalKey)); + // Assert.Equal("pdf_module_version", rom.ReadString(Models.Metadata.Rom.PDFModuleVersionKey)); + // Assert.Equal("preview-image", rom.ReadString(Models.Metadata.Rom.PreviewImageKey)); + // Assert.Equal("publisher", rom.ReadString(Models.Metadata.Rom.PublisherKey)); + // Assert.Equal("region", rom.ReadString(Models.Metadata.Rom.RegionKey)); + // Assert.Equal("remark", rom.ReadString(Models.Metadata.Rom.RemarkKey)); + // Assert.Equal("rotation", rom.ReadString(Models.Metadata.Rom.RotationKey)); + // Assert.Equal("serial", rom.ReadString(Models.Metadata.Rom.SerialKey)); + // Assert.Equal(ZeroHash.SHA1Str, rom.ReadString(Models.Metadata.Rom.SHA1Key)); + // Assert.Equal(ZeroHash.SHA256Str, rom.ReadString(Models.Metadata.Rom.SHA256Key)); + // Assert.Equal(ZeroHash.SHA384Str, rom.ReadString(Models.Metadata.Rom.SHA384Key)); + // Assert.Equal(ZeroHash.SHA512Str, rom.ReadString(Models.Metadata.Rom.SHA512Key)); + // Assert.Equal(12345, rom.ReadLong(Models.Metadata.Rom.SizeKey)); + // Assert.True(rom.ReadBool(Models.Metadata.Rom.SoundOnlyKey)); + // Assert.Equal("source", rom.ReadString(Models.Metadata.Rom.SourceKey)); + // Assert.Equal(ZeroHash.SpamSumStr, rom.ReadString(Models.Metadata.Rom.SpamSumKey)); + // Assert.Equal("start", rom.ReadString(Models.Metadata.Rom.StartKey)); + // Assert.Equal("good", rom.ReadString(Models.Metadata.Rom.StatusKey)); + // Assert.Equal("summation", rom.ReadString(Models.Metadata.Rom.SummationKey)); + // Assert.Equal("title", rom.ReadString(Models.Metadata.Rom.TitleKey)); + // Assert.Equal("track", rom.ReadString(Models.Metadata.Rom.TrackKey)); + // Assert.Equal("type", rom.ReadString(Models.Metadata.Rom.OpenMSXType)); + // Assert.Equal("value", rom.ReadString(Models.Metadata.Rom.ValueKey)); + // Assert.Equal("whisper_asr_module_version", rom.ReadString(Models.Metadata.Rom.WhisperASRModuleVersionKey)); + // Assert.Equal("whisper_model_hash", rom.ReadString(Models.Metadata.Rom.WhisperModelHashKey)); + // Assert.Equal("whisper_model_name", rom.ReadString(Models.Metadata.Rom.WhisperModelNameKey)); + // Assert.Equal("whisper_version", rom.ReadString(Models.Metadata.Rom.WhisperVersionKey)); + // Assert.Equal("width", rom.ReadString(Models.Metadata.Rom.WidthKey)); + // Assert.Equal("word_conf_0_10", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval0To10Key)); + // Assert.Equal("word_conf_11_20", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval11To20Key)); + // Assert.Equal("word_conf_21_30", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval21To30Key)); + // Assert.Equal("word_conf_31_40", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval31To40Key)); + // Assert.Equal("word_conf_41_50", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval41To50Key)); + // Assert.Equal("word_conf_51_60", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval51To60Key)); + // Assert.Equal("word_conf_61_70", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval61To70Key)); + // Assert.Equal("word_conf_71_80", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval71To80Key)); + // Assert.Equal("word_conf_81_90", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval81To90Key)); + // Assert.Equal("word_conf_91_100", rom.ReadString(Models.Metadata.Rom.WordConfidenceInterval91To100Key)); + // Assert.Equal(ZeroHash.GetString(HashType.XxHash3), rom.ReadString(Models.Metadata.Rom.xxHash364Key)); + // Assert.Equal(ZeroHash.GetString(HashType.XxHash128), rom.ReadString(Models.Metadata.Rom.xxHash3128Key)); + // } + + // private static void ValidateMetadataSample(Models.Metadata.Sample? sample) + // { + // Assert.NotNull(sample); + // Assert.Equal("name", sample.ReadString(Models.Metadata.Sample.NameKey)); + // } + + // private static void ValidateMetadataSharedFeat(Models.Metadata.SharedFeat? sharedFeat) + // { + // Assert.NotNull(sharedFeat); + // Assert.Equal("name", sharedFeat.ReadString(Models.Metadata.SharedFeat.NameKey)); + // Assert.Equal("value", sharedFeat.ReadString(Models.Metadata.SharedFeat.ValueKey)); + // } + + // private static void ValidateMetadataSlot(Models.Metadata.Slot? slot) + // { + // Assert.NotNull(slot); + // Assert.Equal("name", slot.ReadString(Models.Metadata.Slot.NameKey)); + + // SlotOption[]? slotOptions = slot.Read(Models.Metadata.Slot.SlotOptionKey); + // Assert.NotNull(slotOptions); + // SlotOption? slotOption = Assert.Single(slotOptions); + // ValidateMetadataSlotOption(slotOption); + // } + + // private static void ValidateMetadataSlotOption(Models.Metadata.SlotOption? slotOption) + // { + // Assert.NotNull(slotOption); + // Assert.True(slotOption.ReadBool(Models.Metadata.SlotOption.DefaultKey)); + // Assert.Equal("devname", slotOption.ReadString(Models.Metadata.SlotOption.DevNameKey)); + // Assert.Equal("name", slotOption.ReadString(Models.Metadata.SlotOption.NameKey)); + // } + + // private static void ValidateMetadataSoftwareList(Models.Metadata.SoftwareList? softwareList) + // { + // Assert.NotNull(softwareList); + // Assert.Equal("description", softwareList.ReadString(Models.Metadata.SoftwareList.DescriptionKey)); + // Assert.Equal("filter", softwareList.ReadString(Models.Metadata.SoftwareList.FilterKey)); + // Assert.Equal("name", softwareList.ReadString(Models.Metadata.SoftwareList.NameKey)); + // Assert.Equal("notes", softwareList.ReadString(Models.Metadata.SoftwareList.NotesKey)); + // // TODO: Figure out why Models.Metadata.SoftwareList.SoftwareKey doesn't get processed + // Assert.Equal("original", softwareList.ReadString(Models.Metadata.SoftwareList.StatusKey)); + // Assert.Equal("tag", softwareList.ReadString(Models.Metadata.SoftwareList.TagKey)); + // } + + // private static void ValidateMetadataSound(Models.Metadata.Sound? sound) + // { + // Assert.NotNull(sound); + // Assert.Equal(12345, sound.ReadLong(Models.Metadata.Sound.ChannelsKey)); + // } + + private static void ValidateMetadataTrurip(Models.Logiqx.Trurip? trurip) + { + Assert.NotNull(trurip); + Assert.Equal("titleid", trurip.TitleID); + Assert.Equal("publisher", trurip.Publisher); + Assert.Equal("developer", trurip.Developer); + Assert.Equal("year", trurip.Year); + Assert.Equal("genre", trurip.Genre); + Assert.Equal("subgenre", trurip.Subgenre); + Assert.Equal("ratings", trurip.Ratings); + Assert.Equal("score", trurip.Score); + Assert.Equal("players", trurip.Players); + Assert.Equal("enabled", trurip.Enabled); + Assert.Equal("True", trurip.CRC); + Assert.Equal("source", trurip.Source); + Assert.Equal("cloneof", trurip.CloneOf); + Assert.Equal("relatedto", trurip.RelatedTo); + } + + // private static void ValidateMetadataVideo(Models.Metadata.Video? video) + // { + // Assert.NotNull(video); + // Assert.Equal(12345, video.ReadLong(Models.Metadata.Video.AspectXKey)); + // Assert.Equal(12345, video.ReadLong(Models.Metadata.Video.AspectYKey)); + // Assert.Equal("vector", video.ReadString(Models.Metadata.Video.DisplayTypeKey)); + // Assert.Equal(12345, video.ReadLong(Models.Metadata.Video.HeightKey)); + // Assert.Equal(12345, video.ReadLong(Models.Metadata.Video.RefreshKey)); + // Assert.Equal(12345, video.ReadLong(Models.Metadata.Video.WidthKey)); + // Assert.Equal(90, video.ReadLong(Models.Metadata.Video.RotateKey)); + // } + + #endregion } } \ No newline at end of file diff --git a/SabreTools.DatFiles/DatFile.FromMetadata.cs b/SabreTools.DatFiles/DatFile.FromMetadata.cs index 18bf2b5a..b307ded3 100644 --- a/SabreTools.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.DatFiles/DatFile.FromMetadata.cs @@ -1,6 +1,7 @@ -using System.Collections.Generic; +using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.DatItems; +using SabreTools.DatItems.Formats; namespace SabreTools.DatFiles { @@ -32,7 +33,7 @@ namespace SabreTools.DatFiles ConvertHeader(header, keep); // Get the machines from the metadata - var machines = ReadItemArray(item, Models.Metadata.MetadataFile.MachineKey); + var machines = item.ReadItemArray(Models.Metadata.MetadataFile.MachineKey); if (machines != null) ConvertMachines(machines, source, sourceIndex, statsOnly); } @@ -200,172 +201,145 @@ namespace SabreTools.DatFiles if (item == null || item.Count == 0) return; - // Create an internal machine + // Create an internal machine and add to the dictionary var machine = new Machine(item); - - // Process flag values - if (machine.GetStringFieldValue(Models.Metadata.Machine.Im1CRCKey) != null) - machine.SetFieldValue(Models.Metadata.Machine.Im1CRCKey, TextHelper.NormalizeCRC32(machine.GetStringFieldValue(Models.Metadata.Machine.Im1CRCKey))); - if (machine.GetStringFieldValue(Models.Metadata.Machine.Im2CRCKey) != null) - machine.SetFieldValue(Models.Metadata.Machine.Im2CRCKey, TextHelper.NormalizeCRC32(machine.GetStringFieldValue(Models.Metadata.Machine.Im2CRCKey))); - if (machine.GetBoolFieldValue(Models.Metadata.Machine.IsBiosKey) != null) - machine.SetFieldValue(Models.Metadata.Machine.IsBiosKey, machine.GetBoolFieldValue(Models.Metadata.Machine.IsBiosKey).FromYesNo()); - if (machine.GetBoolFieldValue(Models.Metadata.Machine.IsDeviceKey) != null) - machine.SetFieldValue(Models.Metadata.Machine.IsDeviceKey, machine.GetBoolFieldValue(Models.Metadata.Machine.IsDeviceKey).FromYesNo()); - if (machine.GetBoolFieldValue(Models.Metadata.Machine.IsMechanicalKey) != null) - machine.SetFieldValue(Models.Metadata.Machine.IsMechanicalKey, machine.GetBoolFieldValue(Models.Metadata.Machine.IsMechanicalKey).FromYesNo()); - if (machine.GetStringFieldValue(Models.Metadata.Machine.SupportedKey) != null) - machine.SetFieldValue(Models.Metadata.Machine.SupportedKey, machine.GetStringFieldValue(Models.Metadata.Machine.SupportedKey).AsEnumValue().AsStringValue()); - - // Handle Trurip object, if it exists - if (item.ContainsKey(Models.Metadata.Machine.TruripKey)) - { - var truripItem = item.Read(Models.Metadata.Machine.TruripKey); - if (truripItem != null) - { - var trurip = new DatItems.Trurip(truripItem); - machine.SetFieldValue(Models.Metadata.Machine.TruripKey, trurip); - } - } - - // Add the machine to the dictionary long machineIndex = ItemsDB.AddMachine(machine); // Convert items in the machine if (item.ContainsKey(Models.Metadata.Machine.AdjusterKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.AdjusterKey); + var items = item.ReadItemArray(Models.Metadata.Machine.AdjusterKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.ArchiveKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.ArchiveKey); + var items = item.ReadItemArray(Models.Metadata.Machine.ArchiveKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.BiosSetKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.BiosSetKey); + var items = item.ReadItemArray(Models.Metadata.Machine.BiosSetKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.ChipKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.ChipKey); + var items = item.ReadItemArray(Models.Metadata.Machine.ChipKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.ConfigurationKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.ConfigurationKey); + var items = item.ReadItemArray(Models.Metadata.Machine.ConfigurationKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DeviceKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DeviceKey); + var items = item.ReadItemArray(Models.Metadata.Machine.DeviceKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DeviceRefKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DeviceRefKey); + var items = item.ReadItemArray(Models.Metadata.Machine.DeviceRefKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DipSwitchKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DipSwitchKey); + var items = item.ReadItemArray(Models.Metadata.Machine.DipSwitchKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DiskKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DiskKey); + var items = item.ReadItemArray(Models.Metadata.Machine.DiskKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DisplayKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DisplayKey); + var items = item.ReadItemArray(Models.Metadata.Machine.DisplayKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DriverKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DriverKey); + var items = item.ReadItemArray(Models.Metadata.Machine.DriverKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DumpKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DumpKey); + var items = item.ReadItemArray(Models.Metadata.Machine.DumpKey); string? machineName = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly, machineName); } if (item.ContainsKey(Models.Metadata.Machine.FeatureKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.FeatureKey); + var items = item.ReadItemArray(Models.Metadata.Machine.FeatureKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.InfoKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.InfoKey); + var items = item.ReadItemArray(Models.Metadata.Machine.InfoKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.InputKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.InputKey); + var items = item.ReadItemArray(Models.Metadata.Machine.InputKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.MediaKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.MediaKey); + var items = item.ReadItemArray(Models.Metadata.Machine.MediaKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.PartKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.PartKey); + var items = item.ReadItemArray(Models.Metadata.Machine.PartKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.PortKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.PortKey); + var items = item.ReadItemArray(Models.Metadata.Machine.PortKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.RamOptionKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.RamOptionKey); + var items = item.ReadItemArray(Models.Metadata.Machine.RamOptionKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.ReleaseKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.ReleaseKey); + var items = item.ReadItemArray(Models.Metadata.Machine.ReleaseKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.RomKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.RomKey); + var items = item.ReadItemArray(Models.Metadata.Machine.RomKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.SampleKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.SampleKey); + var items = item.ReadItemArray(Models.Metadata.Machine.SampleKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.SharedFeatKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.SharedFeatKey); + var items = item.ReadItemArray(Models.Metadata.Machine.SharedFeatKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.SlotKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.SlotKey); + var items = item.ReadItemArray(Models.Metadata.Machine.SlotKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.SoftwareListKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.SoftwareListKey); + var items = item.ReadItemArray(Models.Metadata.Machine.SoftwareListKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.SoundKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.SoundKey); + var items = item.ReadItemArray(Models.Metadata.Machine.SoundKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.VideoKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.VideoKey); + var items = item.ReadItemArray(Models.Metadata.Machine.VideoKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } } @@ -388,27 +362,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Adjuster(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Adjuster(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.Adjuster.DefaultKey) != null) - datItem.SetFieldValue(Models.Metadata.Adjuster.DefaultKey, datItem.GetBoolFieldValue(Models.Metadata.Adjuster.DefaultKey).FromYesNo()); - - // Handle subitems - var condition = item.Read(Models.Metadata.Adjuster.ConditionKey); - if (condition != null) - { - var subItem = new DatItems.Formats.Condition(condition); - - // Process flag values - if (subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) - subItem.SetFieldValue(Models.Metadata.Condition.RelationKey, subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); - - datItem.SetFieldValue(Models.Metadata.Adjuster.ConditionKey, subItem); - } - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -432,8 +389,8 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Archive(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Archive(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); Items.AddItem(datItem, statsOnly); @@ -459,14 +416,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.BiosSet(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new BiosSet(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.BiosSet.DefaultKey) != null) - datItem.SetFieldValue(Models.Metadata.BiosSet.DefaultKey, datItem.GetBoolFieldValue(Models.Metadata.BiosSet.DefaultKey).FromYesNo()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -490,16 +443,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Chip(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Chip(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.Chip.SoundOnlyKey) != null) - datItem.SetFieldValue(Models.Metadata.Chip.SoundOnlyKey, datItem.GetBoolFieldValue(Models.Metadata.Chip.SoundOnlyKey).FromYesNo()); - if (datItem.GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey) != null) - datItem.SetFieldValue(Models.Metadata.Chip.ChipTypeKey, datItem.GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey).AsEnumValue().AsStringValue()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -523,71 +470,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Configuration(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Configuration(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Handle subitems - var condition = item.Read(Models.Metadata.Configuration.ConditionKey); - if (condition != null) - { - var subItem = new DatItems.Formats.Condition(condition); - - // Process flag values - if (subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) - subItem.SetFieldValue(Models.Metadata.Condition.RelationKey, subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); - - datItem.SetFieldValue(Models.Metadata.Configuration.ConditionKey, subItem); - } - - var confLocations = ReadItemArray(item, Models.Metadata.Configuration.ConfLocationKey); - if (confLocations != null) - { - List subLocations = []; - foreach (var location in confLocations) - { - var subItem = new DatItems.Formats.ConfLocation(location); - - // Process flag values - if (subItem.GetBoolFieldValue(Models.Metadata.ConfLocation.InvertedKey) != null) - subItem.SetFieldValue(Models.Metadata.ConfLocation.InvertedKey, subItem.GetBoolFieldValue(Models.Metadata.ConfLocation.InvertedKey).FromYesNo()); - - subLocations.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.Configuration.ConfLocationKey, [.. subLocations]); - } - - var confSettings = ReadItemArray(item, Models.Metadata.Configuration.ConfSettingKey); - if (confSettings != null) - { - List subValues = []; - foreach (var setting in confSettings) - { - var subItem = new DatItems.Formats.ConfSetting(setting); - - // Process flag values - if (subItem.GetBoolFieldValue(Models.Metadata.ConfSetting.DefaultKey) != null) - subItem.SetFieldValue(Models.Metadata.ConfSetting.DefaultKey, subItem.GetBoolFieldValue(Models.Metadata.ConfSetting.DefaultKey).FromYesNo()); - - var subCondition = subItem.GetFieldValue(Models.Metadata.ConfSetting.ConditionKey); - if (subCondition != null) - { - var subSubItem = new DatItems.Formats.Condition(subCondition); - - // Process flag values - if (subSubItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) - subSubItem.SetFieldValue(Models.Metadata.Condition.RelationKey, subSubItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); - - subItem.SetFieldValue(Models.Metadata.ConfSetting.ConditionKey, subSubItem); - } - - subValues.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.Configuration.ConfSettingKey, [.. subValues]); - } - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -611,37 +497,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Device(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Device(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.Device.MandatoryKey) != null) - datItem.SetFieldValue(Models.Metadata.Device.MandatoryKey, datItem.GetBoolFieldValue(Models.Metadata.Device.MandatoryKey).FromYesNo()); - if (datItem.GetStringFieldValue(Models.Metadata.Device.DeviceTypeKey) != null) - datItem.SetFieldValue(Models.Metadata.Device.DeviceTypeKey, datItem.GetStringFieldValue(Models.Metadata.Device.DeviceTypeKey).AsEnumValue().AsStringValue()); - - // Handle subitems - var instance = item.Read(Models.Metadata.Device.InstanceKey); - if (instance != null) - { - var subItem = new DatItems.Formats.Instance(instance); - datItem.SetFieldValue(Models.Metadata.Device.InstanceKey, subItem); - } - - var extensions = ReadItemArray(item, Models.Metadata.Device.ExtensionKey); - if (extensions != null) - { - List subExtensions = []; - foreach (var extension in extensions) - { - var subItem = new DatItems.Formats.Extension(extension); - subExtensions.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.Device.ExtensionKey, [.. subExtensions]); - } - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -665,8 +524,8 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.DeviceRef(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new DeviceRef(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); Items.AddItem(datItem, statsOnly); @@ -692,75 +551,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.DipSwitch(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new DipSwitch(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.DipSwitch.DefaultKey) != null) - datItem.SetFieldValue(Models.Metadata.DipSwitch.DefaultKey, datItem.GetBoolFieldValue(Models.Metadata.DipSwitch.DefaultKey).FromYesNo()); - - // Handle subitems - var condition = item.Read(Models.Metadata.DipSwitch.ConditionKey); - if (condition != null) - { - var subItem = new DatItems.Formats.Condition(condition); - - // Process flag values - if (subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) - subItem.SetFieldValue(Models.Metadata.Condition.RelationKey, subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); - - datItem.SetFieldValue(Models.Metadata.DipSwitch.ConditionKey, subItem); - } - - var dipLocations = ReadItemArray(item, Models.Metadata.DipSwitch.DipLocationKey); - if (dipLocations != null) - { - List subLocations = []; - foreach (var location in dipLocations) - { - var subItem = new DatItems.Formats.DipLocation(location); - - // Process flag values - if (subItem.GetBoolFieldValue(Models.Metadata.DipLocation.InvertedKey) != null) - subItem.SetFieldValue(Models.Metadata.DipLocation.InvertedKey, subItem.GetBoolFieldValue(Models.Metadata.DipLocation.InvertedKey).FromYesNo()); - - subLocations.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.DipSwitch.DipLocationKey, [.. subLocations]); - } - - var dipValues = ReadItemArray(item, Models.Metadata.DipSwitch.DipValueKey); - if (dipValues != null) - { - List subValues = []; - foreach (var value in dipValues) - { - var subItem = new DatItems.Formats.DipValue(value); - - // Process flag values - if (subItem.GetBoolFieldValue(Models.Metadata.DipValue.DefaultKey) != null) - subItem.SetFieldValue(Models.Metadata.DipValue.DefaultKey, subItem.GetBoolFieldValue(Models.Metadata.DipValue.DefaultKey).FromYesNo()); - - var subCondition = subItem.GetFieldValue(Models.Metadata.DipValue.ConditionKey); - if (subCondition != null) - { - var subSubItem = new DatItems.Formats.Condition(subCondition); - - // Process flag values - if (subSubItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) - subSubItem.SetFieldValue(Models.Metadata.Condition.RelationKey, subSubItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); - - subItem.SetFieldValue(Models.Metadata.DipValue.ConditionKey, subSubItem); - } - - subValues.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.DipSwitch.DipValueKey, [.. subValues]); - } - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -784,24 +578,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Disk(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Disk(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.Disk.OptionalKey) != null) - datItem.SetFieldValue(Models.Metadata.Disk.OptionalKey, datItem.GetBoolFieldValue(Models.Metadata.Disk.OptionalKey).FromYesNo()); - if (datItem.GetStringFieldValue(Models.Metadata.Disk.StatusKey) != null) - datItem.SetFieldValue(Models.Metadata.Disk.StatusKey, datItem.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue().AsStringValue()); - if (datItem.GetBoolFieldValue(Models.Metadata.Disk.WritableKey) != null) - datItem.SetFieldValue(Models.Metadata.Disk.WritableKey, datItem.GetBoolFieldValue(Models.Metadata.Disk.WritableKey).FromYesNo()); - - // Process hash values - if (datItem.GetStringFieldValue(Models.Metadata.Disk.MD5Key) != null) - datItem.SetFieldValue(Models.Metadata.Disk.MD5Key, TextHelper.NormalizeMD5(datItem.GetStringFieldValue(Models.Metadata.Disk.MD5Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Disk.SHA1Key) != null) - datItem.SetFieldValue(Models.Metadata.Disk.SHA1Key, TextHelper.NormalizeSHA1(datItem.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -825,38 +605,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Display(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Display(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.Display.FlipXKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.FlipXKey, datItem.GetBoolFieldValue(Models.Metadata.Display.FlipXKey).FromYesNo()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.HBEndKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.HBEndKey, datItem.GetInt64FieldValue(Models.Metadata.Display.HBEndKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.HBStartKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.HBStartKey, datItem.GetInt64FieldValue(Models.Metadata.Display.HBStartKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.HeightKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.HeightKey, datItem.GetInt64FieldValue(Models.Metadata.Display.HeightKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.HTotalKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.HTotalKey, datItem.GetInt64FieldValue(Models.Metadata.Display.HTotalKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.PixClockKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.PixClockKey, datItem.GetInt64FieldValue(Models.Metadata.Display.PixClockKey).ToString()); - if (datItem.GetDoubleFieldValue(Models.Metadata.Display.RefreshKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.RefreshKey, datItem.GetDoubleFieldValue(Models.Metadata.Display.RefreshKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.RotateKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.RotateKey, datItem.GetInt64FieldValue(Models.Metadata.Display.RotateKey).ToString()); - if (datItem.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.DisplayTypeKey, datItem.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey).AsEnumValue().AsStringValue()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.VBEndKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.VBEndKey, datItem.GetInt64FieldValue(Models.Metadata.Display.VBEndKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.VBStartKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.VBStartKey, datItem.GetInt64FieldValue(Models.Metadata.Display.VBStartKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.VTotalKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.VTotalKey, datItem.GetInt64FieldValue(Models.Metadata.Display.VTotalKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Display.WidthKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.WidthKey, datItem.GetInt64FieldValue(Models.Metadata.Display.WidthKey).ToString()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -880,34 +632,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Driver(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Driver(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetStringFieldValue(Models.Metadata.Driver.CocktailKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.CocktailKey, datItem.GetStringFieldValue(Models.Metadata.Driver.CocktailKey).AsEnumValue().AsStringValue()); - if (datItem.GetStringFieldValue(Models.Metadata.Driver.ColorKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.ColorKey, datItem.GetStringFieldValue(Models.Metadata.Driver.ColorKey).AsEnumValue().AsStringValue()); - if (datItem.GetStringFieldValue(Models.Metadata.Driver.EmulationKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.EmulationKey, datItem.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue().AsStringValue()); - if (datItem.GetBoolFieldValue(Models.Metadata.Driver.IncompleteKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.IncompleteKey, datItem.GetBoolFieldValue(Models.Metadata.Driver.IncompleteKey).FromYesNo()); - if (datItem.GetBoolFieldValue(Models.Metadata.Driver.NoSoundHardwareKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.NoSoundHardwareKey, datItem.GetBoolFieldValue(Models.Metadata.Driver.NoSoundHardwareKey).FromYesNo()); - if (datItem.GetInt64FieldValue(Models.Metadata.Driver.PaletteSizeKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.PaletteSizeKey, datItem.GetInt64FieldValue(Models.Metadata.Driver.PaletteSizeKey).ToString()); - if (datItem.GetBoolFieldValue(Models.Metadata.Driver.RequiresArtworkKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.RequiresArtworkKey, datItem.GetBoolFieldValue(Models.Metadata.Driver.RequiresArtworkKey).FromYesNo()); - if (datItem.GetStringFieldValue(Models.Metadata.Driver.SaveStateKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.SaveStateKey, datItem.GetStringFieldValue(Models.Metadata.Driver.SaveStateKey).AsEnumValue().AsStringValue(useSecond: true)); - if (datItem.GetStringFieldValue(Models.Metadata.Driver.SoundKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.SoundKey, datItem.GetStringFieldValue(Models.Metadata.Driver.SoundKey).AsEnumValue().AsStringValue()); - if (datItem.GetStringFieldValue(Models.Metadata.Driver.StatusKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.StatusKey, datItem.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue().AsStringValue()); - if (datItem.GetBoolFieldValue(Models.Metadata.Driver.UnofficialKey) != null) - datItem.SetFieldValue(Models.Metadata.Driver.UnofficialKey, datItem.GetBoolFieldValue(Models.Metadata.Driver.UnofficialKey).FromYesNo()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -923,6 +651,7 @@ namespace SabreTools.DatFiles /// Index of the Source to use with the converted items /// True to only add item statistics while parsing, false otherwise /// Machine name to use when constructing item names + /// TODO: Convert this into a constructor in Rom private void ProcessItems(Models.Metadata.Dump[]? items, Machine machine, long machineIndex, Source source, long sourceIndex, bool statsOnly, string? machineName) { // If the array is null or empty, return without processing @@ -958,7 +687,7 @@ namespace SabreTools.DatFiles string name = $"{machineName}_{index++}{(!string.IsNullOrEmpty(rom!.ReadString(Models.Metadata.Rom.RemarkKey)) ? $" {rom.ReadString(Models.Metadata.Rom.RemarkKey)}" : string.Empty)}"; - var datItem = new DatItems.Formats.Rom(); + var datItem = new Rom(); datItem.SetName(name); datItem.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.ReadString(Models.Metadata.Rom.StartKey)); datItem.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, subType.AsStringValue()); @@ -966,12 +695,12 @@ namespace SabreTools.DatFiles datItem.SetFieldValue(Models.Metadata.Rom.RemarkKey, rom.ReadString(Models.Metadata.Rom.RemarkKey)); datItem.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.ReadString(Models.Metadata.Rom.SHA1Key)); datItem.SetFieldValue(Models.Metadata.Rom.StartKey, rom.ReadString(Models.Metadata.Rom.StartKey)); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + datItem.SetFieldValue(DatItem.SourceKey, source); if (dump.Read(Models.Metadata.Dump.OriginalKey) != null) { var original = dump.Read(Models.Metadata.Dump.OriginalKey)!; - datItem.SetFieldValue("ORIGINAL", new DatItems.Formats.Original + datItem.SetFieldValue("ORIGINAL", new Original { Value = original.ReadBool(Models.Metadata.Original.ValueKey), Content = original.ReadString(Models.Metadata.Original.ContentKey), @@ -1023,18 +752,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Feature(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Feature(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetStringFieldValue(Models.Metadata.Feature.OverallKey) != null) - datItem.SetFieldValue(Models.Metadata.Feature.OverallKey, datItem.GetStringFieldValue(Models.Metadata.Feature.OverallKey).AsEnumValue().AsStringValue()); - if (datItem.GetStringFieldValue(Models.Metadata.Feature.StatusKey) != null) - datItem.SetFieldValue(Models.Metadata.Feature.StatusKey, datItem.GetStringFieldValue(Models.Metadata.Feature.StatusKey).AsEnumValue().AsStringValue()); - if (datItem.GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey) != null) - datItem.SetFieldValue(Models.Metadata.Feature.FeatureTypeKey, datItem.GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue().AsStringValue()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1058,8 +779,8 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Info(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Info(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); Items.AddItem(datItem, statsOnly); @@ -1085,57 +806,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Input(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Input(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetInt64FieldValue(Models.Metadata.Input.ButtonsKey) != null) - datItem.SetFieldValue(Models.Metadata.Input.ButtonsKey, datItem.GetInt64FieldValue(Models.Metadata.Input.ButtonsKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Input.CoinsKey) != null) - datItem.SetFieldValue(Models.Metadata.Input.CoinsKey, datItem.GetInt64FieldValue(Models.Metadata.Input.CoinsKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Input.PlayersKey) != null) - datItem.SetFieldValue(Models.Metadata.Input.PlayersKey, datItem.GetInt64FieldValue(Models.Metadata.Input.PlayersKey).ToString()); - if (datItem.GetBoolFieldValue(Models.Metadata.Input.ServiceKey) != null) - datItem.SetFieldValue(Models.Metadata.Input.ServiceKey, datItem.GetBoolFieldValue(Models.Metadata.Input.ServiceKey).FromYesNo()); - if (datItem.GetBoolFieldValue(Models.Metadata.Input.TiltKey) != null) - datItem.SetFieldValue(Models.Metadata.Input.TiltKey, datItem.GetBoolFieldValue(Models.Metadata.Input.TiltKey).FromYesNo()); - - // Handle subitems - var controls = ReadItemArray(item, Models.Metadata.Input.ControlKey); - if (controls != null) - { - List subControls = []; - foreach (var control in controls) - { - var subItem = new DatItems.Formats.Control(control); - - // Process flag values - if (subItem.GetInt64FieldValue(Models.Metadata.Control.ButtonsKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.ButtonsKey, subItem.GetInt64FieldValue(Models.Metadata.Control.ButtonsKey).ToString()); - if (subItem.GetInt64FieldValue(Models.Metadata.Control.KeyDeltaKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.KeyDeltaKey, subItem.GetInt64FieldValue(Models.Metadata.Control.KeyDeltaKey).ToString()); - if (subItem.GetInt64FieldValue(Models.Metadata.Control.MaximumKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.MaximumKey, subItem.GetInt64FieldValue(Models.Metadata.Control.MaximumKey).ToString()); - if (subItem.GetInt64FieldValue(Models.Metadata.Control.MinimumKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.MinimumKey, subItem.GetInt64FieldValue(Models.Metadata.Control.MinimumKey).ToString()); - if (subItem.GetInt64FieldValue(Models.Metadata.Control.PlayerKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.PlayerKey, subItem.GetInt64FieldValue(Models.Metadata.Control.PlayerKey).ToString()); - if (subItem.GetInt64FieldValue(Models.Metadata.Control.ReqButtonsKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.ReqButtonsKey, subItem.GetInt64FieldValue(Models.Metadata.Control.ReqButtonsKey).ToString()); - if (subItem.GetBoolFieldValue(Models.Metadata.Control.ReverseKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.ReverseKey, subItem.GetBoolFieldValue(Models.Metadata.Control.ReverseKey).FromYesNo()); - if (subItem.GetInt64FieldValue(Models.Metadata.Control.SensitivityKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.SensitivityKey, subItem.GetInt64FieldValue(Models.Metadata.Control.SensitivityKey).ToString()); - if (subItem.GetStringFieldValue(Models.Metadata.Control.ControlTypeKey) != null) - subItem.SetFieldValue(Models.Metadata.Control.ControlTypeKey, subItem.GetStringFieldValue(Models.Metadata.Control.ControlTypeKey).AsEnumValue().AsStringValue()); - - subControls.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.Input.ControlKey, [.. subControls]); - } - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1159,18 +833,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Media(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Media(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process hash values - if (datItem.GetStringFieldValue(Models.Metadata.Media.MD5Key) != null) - datItem.SetFieldValue(Models.Metadata.Media.MD5Key, TextHelper.NormalizeMD5(datItem.GetStringFieldValue(Models.Metadata.Media.MD5Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Media.SHA1Key) != null) - datItem.SetFieldValue(Models.Metadata.Media.SHA1Key, TextHelper.NormalizeSHA1(datItem.GetStringFieldValue(Models.Metadata.Media.SHA1Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Media.SHA256Key) != null) - datItem.SetFieldValue(Models.Metadata.Media.SHA256Key, TextHelper.NormalizeSHA256(datItem.GetStringFieldValue(Models.Metadata.Media.SHA256Key))); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1194,215 +860,82 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var partItem = new DatItems.Formats.Part(item); + var partItem = new Part(item); // Handle subitems - var dataAreas = ReadItemArray(item, Models.Metadata.Part.DataAreaKey); + var dataAreas = item.ReadItemArray(Models.Metadata.Part.DataAreaKey); if (dataAreas != null) { foreach (var dataArea in dataAreas) { - var dataAreaItem = new DatItems.Formats.DataArea(dataArea); - var roms = ReadItemArray(dataArea, Models.Metadata.DataArea.RomKey); + var dataAreaItem = new DataArea(dataArea); + var roms = dataArea.ReadItemArray(Models.Metadata.DataArea.RomKey); if (roms == null) continue; - // Process flag values - if (dataAreaItem.GetStringFieldValue(Models.Metadata.DataArea.EndiannessKey) != null) - dataAreaItem.SetFieldValue(Models.Metadata.DataArea.EndiannessKey, dataAreaItem.GetStringFieldValue(Models.Metadata.DataArea.EndiannessKey).AsEnumValue().AsStringValue()); - if (dataAreaItem.GetInt64FieldValue(Models.Metadata.DataArea.SizeKey) != null) - dataAreaItem.SetFieldValue(Models.Metadata.DataArea.SizeKey, dataAreaItem.GetInt64FieldValue(Models.Metadata.DataArea.SizeKey).ToString()); - if (dataAreaItem.GetInt64FieldValue(Models.Metadata.DataArea.WidthKey) != null) - dataAreaItem.SetFieldValue(Models.Metadata.DataArea.WidthKey, dataAreaItem.GetInt64FieldValue(Models.Metadata.DataArea.WidthKey).ToString()); - foreach (var rom in roms) { - var romItem = new DatItems.Formats.Rom(rom); - romItem.SetFieldValue(DatItems.Formats.Rom.DataAreaKey, dataAreaItem); - romItem.SetFieldValue(DatItems.Formats.Rom.PartKey, partItem); - romItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var romItem = new Rom(rom); + romItem.SetFieldValue(Rom.DataAreaKey, dataAreaItem); + romItem.SetFieldValue(Rom.PartKey, partItem); + romItem.SetFieldValue(DatItem.SourceKey, source); romItem.CopyMachineInformation(machine); - // Process flag values - if (romItem.GetBoolFieldValue(Models.Metadata.Rom.DisposeKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.DisposeKey, romItem.GetBoolFieldValue(Models.Metadata.Rom.DisposeKey).FromYesNo()); - if (romItem.GetBoolFieldValue(Models.Metadata.Rom.InvertedKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.InvertedKey, romItem.GetBoolFieldValue(Models.Metadata.Rom.InvertedKey).FromYesNo()); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.LoadFlagKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.LoadFlagKey, romItem.GetStringFieldValue(Models.Metadata.Rom.LoadFlagKey).AsEnumValue().AsStringValue()); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.OpenMSXMediaType) != null) - romItem.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, romItem.GetStringFieldValue(Models.Metadata.Rom.OpenMSXMediaType).AsEnumValue().AsStringValue()); - if (romItem.GetBoolFieldValue(Models.Metadata.Rom.MIAKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.MIAKey, romItem.GetBoolFieldValue(Models.Metadata.Rom.MIAKey).FromYesNo()); - if (romItem.GetBoolFieldValue(Models.Metadata.Rom.OptionalKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.OptionalKey, romItem.GetBoolFieldValue(Models.Metadata.Rom.OptionalKey).FromYesNo()); - if (romItem.GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.SoundOnlyKey, romItem.GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey).FromYesNo()); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.StatusKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.StatusKey, romItem.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue().AsStringValue()); - - // Process hash values - if (romItem.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.SizeKey, romItem.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString()); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey) != null) - romItem.SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.NormalizeCRC32(romItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey))); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key) != null) - romItem.SetFieldValue(Models.Metadata.Rom.MD2Key, TextHelper.NormalizeMD2(romItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key))); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key) != null) - romItem.SetFieldValue(Models.Metadata.Rom.MD4Key, TextHelper.NormalizeMD4(romItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key))); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key) != null) - romItem.SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.NormalizeMD5(romItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key))); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) != null) - romItem.SetFieldValue(Models.Metadata.Rom.SHA1Key, TextHelper.NormalizeSHA1(romItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) != null) - romItem.SetFieldValue(Models.Metadata.Rom.SHA256Key, TextHelper.NormalizeSHA256(romItem.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) != null) - romItem.SetFieldValue(Models.Metadata.Rom.SHA384Key, TextHelper.NormalizeSHA384(romItem.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))); - if (romItem.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) != null) - romItem.SetFieldValue(Models.Metadata.Rom.SHA512Key, TextHelper.NormalizeSHA512(romItem.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))); - Items.AddItem(romItem, statsOnly); ItemsDB.AddItem(romItem, machineIndex, sourceIndex, statsOnly); } } } - var diskAreas = ReadItemArray(item, Models.Metadata.Part.DiskAreaKey); + var diskAreas = item.ReadItemArray(Models.Metadata.Part.DiskAreaKey); if (diskAreas != null) { foreach (var diskArea in diskAreas) { - var diskAreaitem = new DatItems.Formats.DiskArea(diskArea); - var disks = ReadItemArray(diskArea, Models.Metadata.DiskArea.DiskKey); + var diskAreaitem = new DiskArea(diskArea); + var disks = diskArea.ReadItemArray(Models.Metadata.DiskArea.DiskKey); if (disks == null) continue; foreach (var disk in disks) { - var diskItem = new DatItems.Formats.Disk(disk); - diskItem.SetFieldValue(DatItems.Formats.Disk.DiskAreaKey, diskAreaitem); - diskItem.SetFieldValue(DatItems.Formats.Disk.PartKey, partItem); - diskItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var diskItem = new Disk(disk); + diskItem.SetFieldValue(Disk.DiskAreaKey, diskAreaitem); + diskItem.SetFieldValue(Disk.PartKey, partItem); + diskItem.SetFieldValue(DatItem.SourceKey, source); diskItem.CopyMachineInformation(machine); - // Process flag values - if (diskItem.GetBoolFieldValue(Models.Metadata.Disk.OptionalKey) != null) - diskItem.SetFieldValue(Models.Metadata.Disk.OptionalKey, diskItem.GetBoolFieldValue(Models.Metadata.Disk.OptionalKey).FromYesNo()); - if (diskItem.GetStringFieldValue(Models.Metadata.Disk.StatusKey) != null) - diskItem.SetFieldValue(Models.Metadata.Disk.StatusKey, diskItem.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue().AsStringValue()); - if (diskItem.GetBoolFieldValue(Models.Metadata.Disk.WritableKey) != null) - diskItem.SetFieldValue(Models.Metadata.Disk.WritableKey, diskItem.GetBoolFieldValue(Models.Metadata.Disk.WritableKey).FromYesNo()); - - // Process hash values - if (diskItem.GetStringFieldValue(Models.Metadata.Disk.MD5Key) != null) - diskItem.SetFieldValue(Models.Metadata.Disk.MD5Key, TextHelper.NormalizeMD5(diskItem.GetStringFieldValue(Models.Metadata.Disk.MD5Key))); - if (diskItem.GetStringFieldValue(Models.Metadata.Disk.SHA1Key) != null) - diskItem.SetFieldValue(Models.Metadata.Disk.SHA1Key, TextHelper.NormalizeSHA1(diskItem.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))); - Items.AddItem(diskItem, statsOnly); ItemsDB.AddItem(diskItem, machineIndex, sourceIndex, statsOnly); } } } - var dipSwitches = ReadItemArray(item, Models.Metadata.Part.DipSwitchKey); + var dipSwitches = item.ReadItemArray(Models.Metadata.Part.DipSwitchKey); if (dipSwitches != null) { foreach (var dipSwitch in dipSwitches) { - var dipSwitchItem = new DatItems.Formats.DipSwitch(dipSwitch); - dipSwitchItem.SetFieldValue(DatItems.Formats.DipSwitch.PartKey, partItem); - dipSwitchItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var dipSwitchItem = new DipSwitch(dipSwitch); + dipSwitchItem.SetFieldValue(DipSwitch.PartKey, partItem); + dipSwitchItem.SetFieldValue(DatItem.SourceKey, source); dipSwitchItem.CopyMachineInformation(machine); - // Process flag values - if (dipSwitchItem.GetBoolFieldValue(Models.Metadata.DipSwitch.DefaultKey) != null) - dipSwitchItem.SetFieldValue(Models.Metadata.DipSwitch.DefaultKey, dipSwitchItem.GetBoolFieldValue(Models.Metadata.DipSwitch.DefaultKey).FromYesNo()); - - // Handle subitems - var condition = dipSwitch.Read(Models.Metadata.DipSwitch.ConditionKey); - if (condition != null) - { - var subItem = new DatItems.Formats.Condition(condition); - - // Process flag values - if (subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) - subItem.SetFieldValue(Models.Metadata.Condition.RelationKey, subItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); - - dipSwitchItem.SetFieldValue(Models.Metadata.DipSwitch.ConditionKey, subItem); - } - - var dipLocations = ReadItemArray(dipSwitch, Models.Metadata.DipSwitch.DipLocationKey); - if (dipLocations != null) - { - List subLocations = []; - foreach (var location in dipLocations) - { - var subItem = new DatItems.Formats.DipLocation(location); - - // Process flag values - if (subItem.GetBoolFieldValue(Models.Metadata.DipLocation.InvertedKey) != null) - subItem.SetFieldValue(Models.Metadata.DipLocation.InvertedKey, subItem.GetBoolFieldValue(Models.Metadata.DipLocation.InvertedKey).FromYesNo()); - - subLocations.Add(subItem); - } - - dipSwitchItem.SetFieldValue(Models.Metadata.DipSwitch.DipLocationKey, [.. subLocations]); - } - - var dipValues = ReadItemArray(dipSwitch, Models.Metadata.DipSwitch.DipValueKey); - if (dipValues != null) - { - List subValues = []; - foreach (var value in dipValues) - { - var subItem = new DatItems.Formats.DipValue(value); - - // Process flag values - if (subItem.GetBoolFieldValue(Models.Metadata.DipValue.DefaultKey) != null) - subItem.SetFieldValue(Models.Metadata.DipValue.DefaultKey, subItem.GetBoolFieldValue(Models.Metadata.DipValue.DefaultKey).FromYesNo()); - - var subCondition = dipSwitch.Read(Models.Metadata.DipValue.ConditionKey); - if (subCondition != null) - { - var subSubItem = new DatItems.Formats.Condition(subCondition); - - // Process flag values - if (subSubItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) - subSubItem.SetFieldValue(Models.Metadata.Condition.RelationKey, subSubItem.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); - - subItem.SetFieldValue(Models.Metadata.DipValue.ConditionKey, subSubItem); - } - - subValues.Add(subItem); - } - - dipSwitchItem.SetFieldValue(Models.Metadata.DipSwitch.DipValueKey, [.. subValues]); - } - Items.AddItem(dipSwitchItem, statsOnly); ItemsDB.AddItem(dipSwitchItem, machineIndex, sourceIndex, statsOnly); } } - var partFeatures = ReadItemArray(item, Models.Metadata.Part.FeatureKey); + var partFeatures = item.ReadItemArray(Models.Metadata.Part.FeatureKey); if (partFeatures != null) { foreach (var partFeature in partFeatures) { - var partFeatureItem = new DatItems.Formats.PartFeature(partFeature); - partFeatureItem.SetFieldValue(DatItems.Formats.DipSwitch.PartKey, partItem); - partFeatureItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var partFeatureItem = new PartFeature(partFeature); + partFeatureItem.SetFieldValue(DipSwitch.PartKey, partItem); + partFeatureItem.SetFieldValue(DatItem.SourceKey, source); partFeatureItem.CopyMachineInformation(machine); - // Process flag values - if (partFeatureItem.GetStringFieldValue(Models.Metadata.Feature.OverallKey) != null) - partFeatureItem.SetFieldValue(Models.Metadata.Feature.OverallKey, partFeatureItem.GetStringFieldValue(Models.Metadata.Feature.OverallKey).AsEnumValue().AsStringValue()); - if (partFeatureItem.GetStringFieldValue(Models.Metadata.Feature.StatusKey) != null) - partFeatureItem.SetFieldValue(Models.Metadata.Feature.StatusKey, partFeatureItem.GetStringFieldValue(Models.Metadata.Feature.StatusKey).AsEnumValue().AsStringValue()); - if (partFeatureItem.GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey) != null) - partFeatureItem.SetFieldValue(Models.Metadata.Feature.FeatureTypeKey, partFeatureItem.GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue().AsStringValue()); - Items.AddItem(partFeatureItem, statsOnly); ItemsDB.AddItem(partFeatureItem, machineIndex, sourceIndex, statsOnly); } @@ -1428,24 +961,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Port(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Port(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Handle subitems - var analogs = ReadItemArray(item, Models.Metadata.Port.AnalogKey); - if (analogs != null) - { - List subAnalogs = []; - foreach (var analog in analogs) - { - var subItem = new DatItems.Formats.Analog(analog); - subAnalogs.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.Port.AnalogKey, [.. subAnalogs]); - } - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1469,14 +988,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.RamOption(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new RamOption(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.RamOption.DefaultKey) != null) - datItem.SetFieldValue(Models.Metadata.RamOption.DefaultKey, datItem.GetBoolFieldValue(Models.Metadata.RamOption.DefaultKey).FromYesNo()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1500,14 +1015,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Release(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Release(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.Release.DefaultKey) != null) - datItem.SetFieldValue(Models.Metadata.Release.DefaultKey, datItem.GetBoolFieldValue(Models.Metadata.Release.DefaultKey).FromYesNo()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1531,48 +1042,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Rom(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Rom(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetBoolFieldValue(Models.Metadata.Rom.DisposeKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.DisposeKey, datItem.GetBoolFieldValue(Models.Metadata.Rom.DisposeKey).FromYesNo()); - if (datItem.GetBoolFieldValue(Models.Metadata.Rom.InvertedKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.InvertedKey, datItem.GetBoolFieldValue(Models.Metadata.Rom.InvertedKey).FromYesNo()); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.LoadFlagKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.LoadFlagKey, datItem.GetStringFieldValue(Models.Metadata.Rom.LoadFlagKey).AsEnumValue().AsStringValue()); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.OpenMSXMediaType) != null) - datItem.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, datItem.GetStringFieldValue(Models.Metadata.Rom.OpenMSXMediaType).AsEnumValue().AsStringValue()); - if (datItem.GetBoolFieldValue(Models.Metadata.Rom.MIAKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.MIAKey, datItem.GetBoolFieldValue(Models.Metadata.Rom.MIAKey).FromYesNo()); - if (datItem.GetBoolFieldValue(Models.Metadata.Rom.OptionalKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.OptionalKey, datItem.GetBoolFieldValue(Models.Metadata.Rom.OptionalKey).FromYesNo()); - if (datItem.GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.SoundOnlyKey, datItem.GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey).FromYesNo()); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.StatusKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.StatusKey, datItem.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue().AsStringValue()); - - // Process hash values - if (datItem.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.SizeKey, datItem.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString()); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey) != null) - datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.NormalizeCRC32(datItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey))); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key) != null) - datItem.SetFieldValue(Models.Metadata.Rom.MD2Key, TextHelper.NormalizeMD2(datItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key) != null) - datItem.SetFieldValue(Models.Metadata.Rom.MD4Key, TextHelper.NormalizeMD4(datItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key) != null) - datItem.SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.NormalizeMD5(datItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) != null) - datItem.SetFieldValue(Models.Metadata.Rom.SHA1Key, TextHelper.NormalizeSHA1(datItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) != null) - datItem.SetFieldValue(Models.Metadata.Rom.SHA256Key, TextHelper.NormalizeSHA256(datItem.GetStringFieldValue(Models.Metadata.Rom.SHA256Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) != null) - datItem.SetFieldValue(Models.Metadata.Rom.SHA384Key, TextHelper.NormalizeSHA384(datItem.GetStringFieldValue(Models.Metadata.Rom.SHA384Key))); - if (datItem.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) != null) - datItem.SetFieldValue(Models.Metadata.Rom.SHA512Key, TextHelper.NormalizeSHA512(datItem.GetStringFieldValue(Models.Metadata.Rom.SHA512Key))); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1596,8 +1069,8 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Sample(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Sample(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); Items.AddItem(datItem, statsOnly); @@ -1623,8 +1096,8 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.SharedFeat(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new SharedFeat(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); Items.AddItem(datItem, statsOnly); @@ -1650,29 +1123,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Slot(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Slot(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Handle subitems - var slotOptions = ReadItemArray(item, Models.Metadata.Slot.SlotOptionKey); - if (slotOptions != null) - { - List subOptions = []; - foreach (var slotOption in slotOptions) - { - var subItem = new DatItems.Formats.SlotOption(slotOption); - - // Process flag values - if (subItem.GetBoolFieldValue(Models.Metadata.SlotOption.DefaultKey) != null) - subItem.SetFieldValue(Models.Metadata.SlotOption.DefaultKey, subItem.GetBoolFieldValue(Models.Metadata.SlotOption.DefaultKey).FromYesNo()); - - subOptions.Add(subItem); - } - - datItem.SetFieldValue(Models.Metadata.Slot.SlotOptionKey, [.. subOptions]); - } - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1696,14 +1150,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.SoftwareList(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new SoftwareList(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey) != null) - datItem.SetFieldValue(Models.Metadata.SoftwareList.StatusKey, datItem.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue().AsStringValue()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1727,14 +1177,10 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Sound(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Sound(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey) != null) - datItem.SetFieldValue(Models.Metadata.Sound.ChannelsKey, datItem.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey).ToString()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } @@ -1758,45 +1204,15 @@ namespace SabreTools.DatFiles // Loop through the items and add foreach (var item in items) { - var datItem = new DatItems.Formats.Display(item); - datItem.SetFieldValue(DatItems.DatItem.SourceKey, source); + var datItem = new Display(item); + datItem.SetFieldValue(DatItem.SourceKey, source); datItem.CopyMachineInformation(machine); - // Process flag values - if (datItem.GetInt64FieldValue(Models.Metadata.Video.AspectXKey) != null) - datItem.SetFieldValue(Models.Metadata.Video.AspectXKey, datItem.GetInt64FieldValue(Models.Metadata.Video.AspectXKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Video.AspectYKey) != null) - datItem.SetFieldValue(Models.Metadata.Video.AspectYKey, datItem.GetInt64FieldValue(Models.Metadata.Video.AspectYKey).ToString()); - if (datItem.GetInt64FieldValue(Models.Metadata.Video.HeightKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.HeightKey, datItem.GetInt64FieldValue(Models.Metadata.Video.HeightKey).ToString()); - if (datItem.GetDoubleFieldValue(Models.Metadata.Video.RefreshKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.RefreshKey, datItem.GetDoubleFieldValue(Models.Metadata.Video.RefreshKey).ToString()); - if (datItem.GetStringFieldValue(Models.Metadata.Video.ScreenKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.DisplayTypeKey, datItem.GetStringFieldValue(Models.Metadata.Video.ScreenKey).AsEnumValue().AsStringValue()); - if (datItem.GetInt64FieldValue(Models.Metadata.Video.WidthKey) != null) - datItem.SetFieldValue(Models.Metadata.Display.WidthKey, datItem.GetInt64FieldValue(Models.Metadata.Video.WidthKey).ToString()); - Items.AddItem(datItem, statsOnly); ItemsDB.AddItem(datItem, machineIndex, sourceIndex, statsOnly); } } - /// - /// Read an item array from a given key, if possible - /// - private static T[]? ReadItemArray(Models.Metadata.DictionaryBase item, string key) where T : Models.Metadata.DictionaryBase - { - var items = item.Read(key); - if (items == default) - { - var single = item.Read(key); - if (single != default) - items = [single]; - } - - return items; - } - #endregion } } \ No newline at end of file diff --git a/SabreTools.DatFiles/DatFile.ToMetadata.cs b/SabreTools.DatFiles/DatFile.ToMetadata.cs index fb9e66dd..6fc75977 100644 --- a/SabreTools.DatFiles/DatFile.ToMetadata.cs +++ b/SabreTools.DatFiles/DatFile.ToMetadata.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using SabreTools.Core.Tools; @@ -68,11 +69,11 @@ namespace SabreTools.DatFiles var header = Header.GetInternalClone(); // Remove fields with default values - if (header.Read(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None) + if (header.ReadString(Models.Metadata.Header.ForceMergingKey).AsEnumValue() == MergingFlag.None) header.Remove(Models.Metadata.Header.ForceMergingKey); - if (header.Read(Models.Metadata.Header.ForceNodumpKey) == NodumpFlag.None) + if (header.ReadString(Models.Metadata.Header.ForceNodumpKey).AsEnumValue() == NodumpFlag.None) header.Remove(Models.Metadata.Header.ForceNodumpKey); - if (header.Read(Models.Metadata.Header.ForcePackingKey) == PackingFlag.None) + if (header.ReadString(Models.Metadata.Header.ForcePackingKey).AsEnumValue() == PackingFlag.None) header.Remove(Models.Metadata.Header.ForcePackingKey); // Convert subheader values @@ -963,27 +964,15 @@ namespace SabreTools.DatFiles var confLocations = item.GetFieldValue(Models.Metadata.Configuration.ConfLocationKey); if (confLocations != null) { - List confLocationItems = []; - foreach (var confLocation in confLocations) - { - var confLocationItem = confLocation.GetInternalClone(); - confLocationItems.Add(confLocationItem); - } - - configurationItem[Models.Metadata.Configuration.ConfLocationKey] = confLocationItems.ToArray(); + Models.Metadata.ConfLocation[] confLocationItems = Array.ConvertAll(confLocations, confLocation => confLocation.GetInternalClone()); + configurationItem[Models.Metadata.Configuration.ConfLocationKey] = confLocationItems; } var confSettings = item.GetFieldValue(Models.Metadata.Configuration.ConfSettingKey); if (confSettings != null) { - List confSettingItems = []; - foreach (var confSetting in confSettings) - { - var confSettingItem = confSetting.GetInternalClone(); - confSettingItems.Add(confSettingItem); - } - - configurationItem[Models.Metadata.Configuration.ConfSettingKey] = confSettingItems.ToArray(); + Models.Metadata.ConfSetting[] confSettingItems = Array.ConvertAll(confSettings, confSetting => confSetting.GetInternalClone()); + configurationItem[Models.Metadata.Configuration.ConfSettingKey] = confSettingItems; } return configurationItem; @@ -1004,14 +993,8 @@ namespace SabreTools.DatFiles var extensions = item.GetFieldValue(Models.Metadata.Device.ExtensionKey); if (extensions != null) { - List extensionItems = []; - foreach (var extension in extensions) - { - var extensionItem = extension.GetInternalClone(); - extensionItems.Add(extensionItem); - } - - deviceItem[Models.Metadata.Device.ExtensionKey] = extensionItems.ToArray(); + Models.Metadata.Extension[] extensionItems = Array.ConvertAll(extensions, extension => extension.GetInternalClone()); + deviceItem[Models.Metadata.Device.ExtensionKey] = extensionItems; } return deviceItem; @@ -1033,27 +1016,15 @@ namespace SabreTools.DatFiles var dipLocations = item.GetFieldValue(Models.Metadata.DipSwitch.DipLocationKey); if (dipLocations != null) { - List dipLocationItems = []; - foreach (var dipLocation in dipLocations) - { - var extensionItem = dipLocation.GetInternalClone(); - dipLocationItems.Add(extensionItem); - } - - dipSwitchItem[Models.Metadata.DipSwitch.DipLocationKey] = dipLocationItems.ToArray(); + Models.Metadata.DipLocation[] dipLocationItems = Array.ConvertAll(dipLocations, dipLocation => dipLocation.GetInternalClone()); + dipSwitchItem[Models.Metadata.DipSwitch.DipLocationKey] = dipLocationItems; } var dipValues = item.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey); if (dipValues != null) { - List dipValueItems = []; - foreach (var dipValue in dipValues) - { - var extensionItem = dipValue.GetInternalClone(); - dipValueItems.Add(extensionItem); - } - - dipSwitchItem[Models.Metadata.DipSwitch.DipValueKey] = dipValueItems.ToArray(); + Models.Metadata.DipValue[] dipValueItems = Array.ConvertAll(dipValues, dipValue => dipValue.GetInternalClone()); + dipSwitchItem[Models.Metadata.DipSwitch.DipValueKey] = dipValueItems; } return dipSwitchItem; diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs index 9b452d24..fbe771a0 100644 --- a/SabreTools.DatFiles/DatFile.cs +++ b/SabreTools.DatFiles/DatFile.cs @@ -137,7 +137,8 @@ namespace SabreTools.DatFiles /// Replacement header to be used public void SetHeader(DatHeader datHeader) { - Header = (DatHeader)datHeader.Clone(); + // TODO: Figure out why clone loses data here + Header = datHeader; } #endregion diff --git a/SabreTools.DatItems/Formats/Adjuster.cs b/SabreTools.DatItems/Formats/Adjuster.cs index 80d062e8..ac578535 100644 --- a/SabreTools.DatItems/Formats/Adjuster.cs +++ b/SabreTools.DatItems/Formats/Adjuster.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -32,7 +33,17 @@ namespace SabreTools.DatItems.Formats #region Constructors public Adjuster() : base() { } - public Adjuster(Models.Metadata.Adjuster item) : base(item) { } + public Adjuster(Models.Metadata.Adjuster item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.Adjuster.DefaultKey) != null) + SetFieldValue(Models.Metadata.Adjuster.DefaultKey, GetBoolFieldValue(Models.Metadata.Adjuster.DefaultKey).FromYesNo()); + + // Handle subitems + var condition = item.Read(Models.Metadata.Adjuster.ConditionKey); + if (condition != null) + SetFieldValue(Models.Metadata.Adjuster.ConditionKey, new Condition(condition)); + } #endregion } diff --git a/SabreTools.DatItems/Formats/BiosSet.cs b/SabreTools.DatItems/Formats/BiosSet.cs index c998aa17..84656fb4 100644 --- a/SabreTools.DatItems/Formats/BiosSet.cs +++ b/SabreTools.DatItems/Formats/BiosSet.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public BiosSet() : base() { } - public BiosSet(Models.Metadata.BiosSet item) : base(item) { } + public BiosSet(Models.Metadata.BiosSet item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.BiosSet.DefaultKey) != null) + SetFieldValue(Models.Metadata.BiosSet.DefaultKey, GetBoolFieldValue(Models.Metadata.BiosSet.DefaultKey).FromYesNo()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Chip.cs b/SabreTools.DatItems/Formats/Chip.cs index 3477bcb4..348123b6 100644 --- a/SabreTools.DatItems/Formats/Chip.cs +++ b/SabreTools.DatItems/Formats/Chip.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,14 @@ namespace SabreTools.DatItems.Formats #region Constructors public Chip() : base() { } - public Chip(Models.Metadata.Chip item) : base(item) { } + public Chip(Models.Metadata.Chip item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.Chip.SoundOnlyKey) != null) + SetFieldValue(Models.Metadata.Chip.SoundOnlyKey, GetBoolFieldValue(Models.Metadata.Chip.SoundOnlyKey).FromYesNo()); + if (GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey) != null) + SetFieldValue(Models.Metadata.Chip.ChipTypeKey, GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey).AsEnumValue().AsStringValue()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Condition.cs b/SabreTools.DatItems/Formats/Condition.cs index 12f4c059..6e98e315 100644 --- a/SabreTools.DatItems/Formats/Condition.cs +++ b/SabreTools.DatItems/Formats/Condition.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public Condition() : base() { } - public Condition(Models.Metadata.Condition item) : base(item) { } + public Condition(Models.Metadata.Condition item) : base(item) + { + // Process flag values + if (GetStringFieldValue(Models.Metadata.Condition.RelationKey) != null) + SetFieldValue(Models.Metadata.Condition.RelationKey, GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/ConfLocation.cs b/SabreTools.DatItems/Formats/ConfLocation.cs index 554d1886..da31e10a 100644 --- a/SabreTools.DatItems/Formats/ConfLocation.cs +++ b/SabreTools.DatItems/Formats/ConfLocation.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public ConfLocation() : base() { } - public ConfLocation(Models.Metadata.ConfLocation item) : base(item) { } + public ConfLocation(Models.Metadata.ConfLocation item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.ConfLocation.InvertedKey) != null) + SetFieldValue(Models.Metadata.ConfLocation.InvertedKey, GetBoolFieldValue(Models.Metadata.ConfLocation.InvertedKey).FromYesNo()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/ConfSetting.cs b/SabreTools.DatItems/Formats/ConfSetting.cs index 43916aa6..de706906 100644 --- a/SabreTools.DatItems/Formats/ConfSetting.cs +++ b/SabreTools.DatItems/Formats/ConfSetting.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -32,7 +33,17 @@ namespace SabreTools.DatItems.Formats #region Constructors public ConfSetting() : base() { } - public ConfSetting(Models.Metadata.ConfSetting item) : base(item) { } + public ConfSetting(Models.Metadata.ConfSetting item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.ConfSetting.DefaultKey) != null) + SetFieldValue(Models.Metadata.ConfSetting.DefaultKey, GetBoolFieldValue(Models.Metadata.ConfSetting.DefaultKey).FromYesNo()); + + // Handle subitems + var condition = GetFieldValue(Models.Metadata.ConfSetting.ConditionKey); + if (condition != null) + SetFieldValue(Models.Metadata.ConfSetting.ConditionKey, new Condition(condition)); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Configuration.cs b/SabreTools.DatItems/Formats/Configuration.cs index cd500fb5..e54cb1d3 100644 --- a/SabreTools.DatItems/Formats/Configuration.cs +++ b/SabreTools.DatItems/Formats/Configuration.cs @@ -1,5 +1,7 @@ -using System.Xml.Serialization; +using System; +using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core; namespace SabreTools.DatItems.Formats { @@ -52,7 +54,27 @@ namespace SabreTools.DatItems.Formats #region Constructors public Configuration() : base() { } - public Configuration(Models.Metadata.Configuration item) : base(item) { } + public Configuration(Models.Metadata.Configuration item) : base(item) + { + // Handle subitems + var condition = item.Read(Models.Metadata.Configuration.ConditionKey); + if (condition != null) + SetFieldValue(Models.Metadata.Configuration.ConditionKey, new Condition(condition)); + + var confLocations = item.ReadItemArray(Models.Metadata.Configuration.ConfLocationKey); + if (confLocations != null) + { + ConfLocation[] confLocationItems = Array.ConvertAll(confLocations, confLocation => new ConfLocation(confLocation)); + SetFieldValue(Models.Metadata.Configuration.ConfLocationKey, confLocationItems); + } + + var confSettings = item.ReadItemArray(Models.Metadata.Configuration.ConfSettingKey); + if (confSettings != null) + { + ConfSetting[] confSettingItems = Array.ConvertAll(confSettings, confSetting => new ConfSetting(confSetting)); + SetFieldValue(Models.Metadata.Configuration.ConfSettingKey, confSettingItems); + } + } #endregion } diff --git a/SabreTools.DatItems/Formats/Control.cs b/SabreTools.DatItems/Formats/Control.cs index 31b44385..ea31437b 100644 --- a/SabreTools.DatItems/Formats/Control.cs +++ b/SabreTools.DatItems/Formats/Control.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,28 @@ namespace SabreTools.DatItems.Formats #region Constructors public Control() : base() { } - public Control(Models.Metadata.Control item) : base(item) { } + public Control(Models.Metadata.Control item) : base(item) + { + // Process flag values + if (GetInt64FieldValue(Models.Metadata.Control.ButtonsKey) != null) + SetFieldValue(Models.Metadata.Control.ButtonsKey, GetInt64FieldValue(Models.Metadata.Control.ButtonsKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Control.KeyDeltaKey) != null) + SetFieldValue(Models.Metadata.Control.KeyDeltaKey, GetInt64FieldValue(Models.Metadata.Control.KeyDeltaKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Control.MaximumKey) != null) + SetFieldValue(Models.Metadata.Control.MaximumKey, GetInt64FieldValue(Models.Metadata.Control.MaximumKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Control.MinimumKey) != null) + SetFieldValue(Models.Metadata.Control.MinimumKey, GetInt64FieldValue(Models.Metadata.Control.MinimumKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Control.PlayerKey) != null) + SetFieldValue(Models.Metadata.Control.PlayerKey, GetInt64FieldValue(Models.Metadata.Control.PlayerKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Control.ReqButtonsKey) != null) + SetFieldValue(Models.Metadata.Control.ReqButtonsKey, GetInt64FieldValue(Models.Metadata.Control.ReqButtonsKey).ToString()); + if (GetBoolFieldValue(Models.Metadata.Control.ReverseKey) != null) + SetFieldValue(Models.Metadata.Control.ReverseKey, GetBoolFieldValue(Models.Metadata.Control.ReverseKey).FromYesNo()); + if (GetInt64FieldValue(Models.Metadata.Control.SensitivityKey) != null) + SetFieldValue(Models.Metadata.Control.SensitivityKey, GetInt64FieldValue(Models.Metadata.Control.SensitivityKey).ToString()); + if (GetStringFieldValue(Models.Metadata.Control.ControlTypeKey) != null) + SetFieldValue(Models.Metadata.Control.ControlTypeKey, GetStringFieldValue(Models.Metadata.Control.ControlTypeKey).AsEnumValue().AsStringValue()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/DataArea.cs b/SabreTools.DatItems/Formats/DataArea.cs index efb32942..88c93080 100644 --- a/SabreTools.DatItems/Formats/DataArea.cs +++ b/SabreTools.DatItems/Formats/DataArea.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -23,7 +24,16 @@ namespace SabreTools.DatItems.Formats #region Constructors public DataArea() : base() { } - public DataArea(Models.Metadata.DataArea item) : base(item) { } + public DataArea(Models.Metadata.DataArea item) : base(item) + { + // Process flag values + if (GetStringFieldValue(Models.Metadata.DataArea.EndiannessKey) != null) + SetFieldValue(Models.Metadata.DataArea.EndiannessKey, GetStringFieldValue(Models.Metadata.DataArea.EndiannessKey).AsEnumValue().AsStringValue()); + if (GetInt64FieldValue(Models.Metadata.DataArea.SizeKey) != null) + SetFieldValue(Models.Metadata.DataArea.SizeKey, GetInt64FieldValue(Models.Metadata.DataArea.SizeKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.DataArea.WidthKey) != null) + SetFieldValue(Models.Metadata.DataArea.WidthKey, GetInt64FieldValue(Models.Metadata.DataArea.WidthKey).ToString()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Device.cs b/SabreTools.DatItems/Formats/Device.cs index ce709c4a..da9fbbbf 100644 --- a/SabreTools.DatItems/Formats/Device.cs +++ b/SabreTools.DatItems/Formats/Device.cs @@ -1,5 +1,8 @@ -using System.Xml.Serialization; +using System; +using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -42,7 +45,26 @@ namespace SabreTools.DatItems.Formats #region Constructors public Device() : base() { } - public Device(Models.Metadata.Device item) : base(item) { } + public Device(Models.Metadata.Device item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.Device.MandatoryKey) != null) + SetFieldValue(Models.Metadata.Device.MandatoryKey, GetBoolFieldValue(Models.Metadata.Device.MandatoryKey).FromYesNo()); + if (GetStringFieldValue(Models.Metadata.Device.DeviceTypeKey) != null) + SetFieldValue(Models.Metadata.Device.DeviceTypeKey, GetStringFieldValue(Models.Metadata.Device.DeviceTypeKey).AsEnumValue().AsStringValue()); + + // Handle subitems + var instance = item.Read(Models.Metadata.Device.InstanceKey); + if (instance != null) + SetFieldValue(Models.Metadata.Device.InstanceKey, new Instance(instance)); + + var extensions = item.ReadItemArray(Models.Metadata.Device.ExtensionKey); + if (extensions != null) + { + Extension[] extensionItems = Array.ConvertAll(extensions, extension => new Extension(extension)); + SetFieldValue(Models.Metadata.Device.ExtensionKey, extensionItems); + } + } #endregion } diff --git a/SabreTools.DatItems/Formats/DipLocation.cs b/SabreTools.DatItems/Formats/DipLocation.cs index 8bc69e5c..fb11fc81 100644 --- a/SabreTools.DatItems/Formats/DipLocation.cs +++ b/SabreTools.DatItems/Formats/DipLocation.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public DipLocation() : base() { } - public DipLocation(Models.Metadata.DipLocation item) : base(item) { } + public DipLocation(Models.Metadata.DipLocation item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.DipLocation.InvertedKey) != null) + SetFieldValue(Models.Metadata.DipLocation.InvertedKey, GetBoolFieldValue(Models.Metadata.DipLocation.InvertedKey).FromYesNo()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/DipSwitch.cs b/SabreTools.DatItems/Formats/DipSwitch.cs index 25343e59..5c5cf8f8 100644 --- a/SabreTools.DatItems/Formats/DipSwitch.cs +++ b/SabreTools.DatItems/Formats/DipSwitch.cs @@ -1,5 +1,8 @@ -using System.Xml.Serialization; +using System; +using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -73,7 +76,31 @@ namespace SabreTools.DatItems.Formats #region Constructors public DipSwitch() : base() { } - public DipSwitch(Models.Metadata.DipSwitch item) : base(item) { } + public DipSwitch(Models.Metadata.DipSwitch item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.DipSwitch.DefaultKey) != null) + SetFieldValue(Models.Metadata.DipSwitch.DefaultKey, GetBoolFieldValue(Models.Metadata.DipSwitch.DefaultKey).FromYesNo()); + + // Handle subitems + var condition = item.Read(Models.Metadata.DipSwitch.ConditionKey); + if (condition != null) + SetFieldValue(Models.Metadata.DipSwitch.ConditionKey, new Condition(condition)); + + var dipLocations = item.ReadItemArray(Models.Metadata.DipSwitch.DipLocationKey); + if (dipLocations != null) + { + DipLocation[] dipLocationItems = Array.ConvertAll(dipLocations, dipLocation => new DipLocation(dipLocation)); + SetFieldValue(Models.Metadata.DipSwitch.DipLocationKey, dipLocationItems); + } + + var dipValues = item.ReadItemArray(Models.Metadata.DipSwitch.DipValueKey); + if (dipValues != null) + { + DipValue[] dipValueItems = Array.ConvertAll(dipValues, dipValue => new DipValue(dipValue)); + SetFieldValue(Models.Metadata.DipSwitch.DipValueKey, dipValueItems); + } + } #endregion } diff --git a/SabreTools.DatItems/Formats/DipValue.cs b/SabreTools.DatItems/Formats/DipValue.cs index 06c7420b..3082307c 100644 --- a/SabreTools.DatItems/Formats/DipValue.cs +++ b/SabreTools.DatItems/Formats/DipValue.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -32,7 +33,17 @@ namespace SabreTools.DatItems.Formats #region Constructors public DipValue() : base() { } - public DipValue(Models.Metadata.DipValue item) : base(item) { } + public DipValue(Models.Metadata.DipValue item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.DipValue.DefaultKey) != null) + SetFieldValue(Models.Metadata.DipValue.DefaultKey, GetBoolFieldValue(Models.Metadata.DipValue.DefaultKey).FromYesNo()); + + // Handle subitems + var condition = GetFieldValue(Models.Metadata.DipValue.ConditionKey); + if (condition != null) + SetFieldValue(Models.Metadata.DipValue.ConditionKey, new Condition(condition)); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Disk.cs b/SabreTools.DatItems/Formats/Disk.cs index e5eba765..a932613e 100644 --- a/SabreTools.DatItems/Formats/Disk.cs +++ b/SabreTools.DatItems/Formats/Disk.cs @@ -68,6 +68,20 @@ namespace SabreTools.DatItems.Formats public Disk(Models.Metadata.Disk item) : base(item) { SetFieldValue(DatItem.DupeTypeKey, 0x00); + + // Process flag values + if (GetBoolFieldValue(Models.Metadata.Disk.OptionalKey) != null) + SetFieldValue(Models.Metadata.Disk.OptionalKey, GetBoolFieldValue(Models.Metadata.Disk.OptionalKey).FromYesNo()); + if (GetStringFieldValue(Models.Metadata.Disk.StatusKey) != null) + SetFieldValue(Models.Metadata.Disk.StatusKey, GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue().AsStringValue()); + if (GetBoolFieldValue(Models.Metadata.Disk.WritableKey) != null) + SetFieldValue(Models.Metadata.Disk.WritableKey, GetBoolFieldValue(Models.Metadata.Disk.WritableKey).FromYesNo()); + + // Process hash values + if (GetStringFieldValue(Models.Metadata.Disk.MD5Key) != null) + SetFieldValue(Models.Metadata.Disk.MD5Key, TextHelper.NormalizeMD5(GetStringFieldValue(Models.Metadata.Disk.MD5Key))); + if (GetStringFieldValue(Models.Metadata.Disk.SHA1Key) != null) + SetFieldValue(Models.Metadata.Disk.SHA1Key, TextHelper.NormalizeSHA1(GetStringFieldValue(Models.Metadata.Disk.SHA1Key))); } #endregion diff --git a/SabreTools.DatItems/Formats/Display.cs b/SabreTools.DatItems/Formats/Display.cs index eb31b4ff..9405fb31 100644 --- a/SabreTools.DatItems/Formats/Display.cs +++ b/SabreTools.DatItems/Formats/Display.cs @@ -23,7 +23,36 @@ namespace SabreTools.DatItems.Formats #region Constructors public Display() : base() { } - public Display(Models.Metadata.Display item) : base(item) { } + public Display(Models.Metadata.Display item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.Display.FlipXKey) != null) + SetFieldValue(Models.Metadata.Display.FlipXKey, GetBoolFieldValue(Models.Metadata.Display.FlipXKey).FromYesNo()); + if (GetInt64FieldValue(Models.Metadata.Display.HBEndKey) != null) + SetFieldValue(Models.Metadata.Display.HBEndKey, GetInt64FieldValue(Models.Metadata.Display.HBEndKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.HBStartKey) != null) + SetFieldValue(Models.Metadata.Display.HBStartKey, GetInt64FieldValue(Models.Metadata.Display.HBStartKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.HeightKey) != null) + SetFieldValue(Models.Metadata.Display.HeightKey, GetInt64FieldValue(Models.Metadata.Display.HeightKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.HTotalKey) != null) + SetFieldValue(Models.Metadata.Display.HTotalKey, GetInt64FieldValue(Models.Metadata.Display.HTotalKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.PixClockKey) != null) + SetFieldValue(Models.Metadata.Display.PixClockKey, GetInt64FieldValue(Models.Metadata.Display.PixClockKey).ToString()); + if (GetDoubleFieldValue(Models.Metadata.Display.RefreshKey) != null) + SetFieldValue(Models.Metadata.Display.RefreshKey, GetDoubleFieldValue(Models.Metadata.Display.RefreshKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.RotateKey) != null) + SetFieldValue(Models.Metadata.Display.RotateKey, GetInt64FieldValue(Models.Metadata.Display.RotateKey).ToString()); + if (GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey) != null) + SetFieldValue(Models.Metadata.Display.DisplayTypeKey, GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey).AsEnumValue().AsStringValue()); + if (GetInt64FieldValue(Models.Metadata.Display.VBEndKey) != null) + SetFieldValue(Models.Metadata.Display.VBEndKey, GetInt64FieldValue(Models.Metadata.Display.VBEndKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.VBStartKey) != null) + SetFieldValue(Models.Metadata.Display.VBStartKey, GetInt64FieldValue(Models.Metadata.Display.VBStartKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.VTotalKey) != null) + SetFieldValue(Models.Metadata.Display.VTotalKey, GetInt64FieldValue(Models.Metadata.Display.VTotalKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Display.WidthKey) != null) + SetFieldValue(Models.Metadata.Display.WidthKey, GetInt64FieldValue(Models.Metadata.Display.WidthKey).ToString()); + } public Display(Models.Metadata.Video item) : base() { @@ -43,6 +72,20 @@ namespace SabreTools.DatItems.Formats SetFieldValue(Models.Metadata.Display.RotateKey, 90); break; } + + // Process flag values + if (GetInt64FieldValue(Models.Metadata.Video.AspectXKey) != null) + SetFieldValue(Models.Metadata.Video.AspectXKey, GetInt64FieldValue(Models.Metadata.Video.AspectXKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Video.AspectYKey) != null) + SetFieldValue(Models.Metadata.Video.AspectYKey, GetInt64FieldValue(Models.Metadata.Video.AspectYKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Video.HeightKey) != null) + SetFieldValue(Models.Metadata.Display.HeightKey, GetInt64FieldValue(Models.Metadata.Video.HeightKey).ToString()); + if (GetDoubleFieldValue(Models.Metadata.Video.RefreshKey) != null) + SetFieldValue(Models.Metadata.Display.RefreshKey, GetDoubleFieldValue(Models.Metadata.Video.RefreshKey).ToString()); + if (GetStringFieldValue(Models.Metadata.Video.ScreenKey) != null) + SetFieldValue(Models.Metadata.Display.DisplayTypeKey, GetStringFieldValue(Models.Metadata.Video.ScreenKey).AsEnumValue().AsStringValue()); + if (GetInt64FieldValue(Models.Metadata.Video.WidthKey) != null) + SetFieldValue(Models.Metadata.Display.WidthKey, GetInt64FieldValue(Models.Metadata.Video.WidthKey).ToString()); } #endregion diff --git a/SabreTools.DatItems/Formats/Driver.cs b/SabreTools.DatItems/Formats/Driver.cs index 605e7a0b..f70c4f6e 100644 --- a/SabreTools.DatItems/Formats/Driver.cs +++ b/SabreTools.DatItems/Formats/Driver.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,32 @@ namespace SabreTools.DatItems.Formats #region Constructors public Driver() : base() { } - public Driver(Models.Metadata.Driver item) : base(item) { } + public Driver(Models.Metadata.Driver item) : base(item) + { + // Process flag values + if (GetStringFieldValue(Models.Metadata.Driver.CocktailKey) != null) + SetFieldValue(Models.Metadata.Driver.CocktailKey, GetStringFieldValue(Models.Metadata.Driver.CocktailKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Driver.ColorKey) != null) + SetFieldValue(Models.Metadata.Driver.ColorKey, GetStringFieldValue(Models.Metadata.Driver.ColorKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Driver.EmulationKey) != null) + SetFieldValue(Models.Metadata.Driver.EmulationKey, GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue().AsStringValue()); + if (GetBoolFieldValue(Models.Metadata.Driver.IncompleteKey) != null) + SetFieldValue(Models.Metadata.Driver.IncompleteKey, GetBoolFieldValue(Models.Metadata.Driver.IncompleteKey).FromYesNo()); + if (GetBoolFieldValue(Models.Metadata.Driver.NoSoundHardwareKey) != null) + SetFieldValue(Models.Metadata.Driver.NoSoundHardwareKey, GetBoolFieldValue(Models.Metadata.Driver.NoSoundHardwareKey).FromYesNo()); + if (GetInt64FieldValue(Models.Metadata.Driver.PaletteSizeKey) != null) + SetFieldValue(Models.Metadata.Driver.PaletteSizeKey, GetInt64FieldValue(Models.Metadata.Driver.PaletteSizeKey).ToString()); + if (GetBoolFieldValue(Models.Metadata.Driver.RequiresArtworkKey) != null) + SetFieldValue(Models.Metadata.Driver.RequiresArtworkKey, GetBoolFieldValue(Models.Metadata.Driver.RequiresArtworkKey).FromYesNo()); + if (GetStringFieldValue(Models.Metadata.Driver.SaveStateKey) != null) + SetFieldValue(Models.Metadata.Driver.SaveStateKey, GetStringFieldValue(Models.Metadata.Driver.SaveStateKey).AsEnumValue().AsStringValue(useSecond: true)); + if (GetStringFieldValue(Models.Metadata.Driver.SoundKey) != null) + SetFieldValue(Models.Metadata.Driver.SoundKey, GetStringFieldValue(Models.Metadata.Driver.SoundKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Driver.StatusKey) != null) + SetFieldValue(Models.Metadata.Driver.StatusKey, GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue().AsStringValue()); + if (GetBoolFieldValue(Models.Metadata.Driver.UnofficialKey) != null) + SetFieldValue(Models.Metadata.Driver.UnofficialKey, GetBoolFieldValue(Models.Metadata.Driver.UnofficialKey).FromYesNo()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Feature.cs b/SabreTools.DatItems/Formats/Feature.cs index ed3f8301..73c2f2a3 100644 --- a/SabreTools.DatItems/Formats/Feature.cs +++ b/SabreTools.DatItems/Formats/Feature.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,16 @@ namespace SabreTools.DatItems.Formats #region Constructors public Feature() : base() { } - public Feature(Models.Metadata.Feature item) : base(item) { } + public Feature(Models.Metadata.Feature item) : base(item) + { + // Process flag values + if (GetStringFieldValue(Models.Metadata.Feature.OverallKey) != null) + SetFieldValue(Models.Metadata.Feature.OverallKey, GetStringFieldValue(Models.Metadata.Feature.OverallKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Feature.StatusKey) != null) + SetFieldValue(Models.Metadata.Feature.StatusKey, GetStringFieldValue(Models.Metadata.Feature.StatusKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey) != null) + SetFieldValue(Models.Metadata.Feature.FeatureTypeKey, GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue().AsStringValue()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Input.cs b/SabreTools.DatItems/Formats/Input.cs index 7bb78cc0..14f21b3d 100644 --- a/SabreTools.DatItems/Formats/Input.cs +++ b/SabreTools.DatItems/Formats/Input.cs @@ -1,5 +1,8 @@ -using System.Xml.Serialization; +using System; +using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -32,7 +35,28 @@ namespace SabreTools.DatItems.Formats #region Constructors public Input() : base() { } - public Input(Models.Metadata.Input item) : base(item) { } + public Input(Models.Metadata.Input item) : base(item) + { + // Process flag values + if (GetInt64FieldValue(Models.Metadata.Input.ButtonsKey) != null) + SetFieldValue(Models.Metadata.Input.ButtonsKey, GetInt64FieldValue(Models.Metadata.Input.ButtonsKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Input.CoinsKey) != null) + SetFieldValue(Models.Metadata.Input.CoinsKey, GetInt64FieldValue(Models.Metadata.Input.CoinsKey).ToString()); + if (GetInt64FieldValue(Models.Metadata.Input.PlayersKey) != null) + SetFieldValue(Models.Metadata.Input.PlayersKey, GetInt64FieldValue(Models.Metadata.Input.PlayersKey).ToString()); + if (GetBoolFieldValue(Models.Metadata.Input.ServiceKey) != null) + SetFieldValue(Models.Metadata.Input.ServiceKey, GetBoolFieldValue(Models.Metadata.Input.ServiceKey).FromYesNo()); + if (GetBoolFieldValue(Models.Metadata.Input.TiltKey) != null) + SetFieldValue(Models.Metadata.Input.TiltKey, GetBoolFieldValue(Models.Metadata.Input.TiltKey).FromYesNo()); + + // Handle subitems + var controls = item.ReadItemArray(Models.Metadata.Input.ControlKey); + if (controls != null) + { + Control[] controlItems = Array.ConvertAll(controls, control => new Control(control)); + SetFieldValue(Models.Metadata.Input.ControlKey, controlItems); + } + } #endregion } diff --git a/SabreTools.DatItems/Formats/Media.cs b/SabreTools.DatItems/Formats/Media.cs index 39052b73..539927ee 100644 --- a/SabreTools.DatItems/Formats/Media.cs +++ b/SabreTools.DatItems/Formats/Media.cs @@ -1,6 +1,7 @@ using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -30,6 +31,14 @@ namespace SabreTools.DatItems.Formats public Media(Models.Metadata.Media item) : base(item) { SetFieldValue(DatItem.DupeTypeKey, 0x00); + + // Process hash values + if (GetStringFieldValue(Models.Metadata.Media.MD5Key) != null) + SetFieldValue(Models.Metadata.Media.MD5Key, TextHelper.NormalizeMD5(GetStringFieldValue(Models.Metadata.Media.MD5Key))); + if (GetStringFieldValue(Models.Metadata.Media.SHA1Key) != null) + SetFieldValue(Models.Metadata.Media.SHA1Key, TextHelper.NormalizeSHA1(GetStringFieldValue(Models.Metadata.Media.SHA1Key))); + if (GetStringFieldValue(Models.Metadata.Media.SHA256Key) != null) + SetFieldValue(Models.Metadata.Media.SHA256Key, TextHelper.NormalizeSHA256(GetStringFieldValue(Models.Metadata.Media.SHA256Key))); } #endregion diff --git a/SabreTools.DatItems/Formats/PartFeature.cs b/SabreTools.DatItems/Formats/PartFeature.cs index 2c824c09..6e7b7d4c 100644 --- a/SabreTools.DatItems/Formats/PartFeature.cs +++ b/SabreTools.DatItems/Formats/PartFeature.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -31,7 +32,16 @@ namespace SabreTools.DatItems.Formats #region Constructors public PartFeature() : base() { } - public PartFeature(Models.Metadata.Feature item) : base(item) { } + public PartFeature(Models.Metadata.Feature item) : base(item) + { + // Process flag values + if (GetStringFieldValue(Models.Metadata.Feature.OverallKey) != null) + SetFieldValue(Models.Metadata.Feature.OverallKey, GetStringFieldValue(Models.Metadata.Feature.OverallKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Feature.StatusKey) != null) + SetFieldValue(Models.Metadata.Feature.StatusKey, GetStringFieldValue(Models.Metadata.Feature.StatusKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey) != null) + SetFieldValue(Models.Metadata.Feature.FeatureTypeKey, GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue().AsStringValue()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Port.cs b/SabreTools.DatItems/Formats/Port.cs index 019083df..0ec814ab 100644 --- a/SabreTools.DatItems/Formats/Port.cs +++ b/SabreTools.DatItems/Formats/Port.cs @@ -1,5 +1,7 @@ -using System.Xml.Serialization; +using System; +using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core; namespace SabreTools.DatItems.Formats { @@ -32,7 +34,16 @@ namespace SabreTools.DatItems.Formats #region Constructors public Port() : base() { } - public Port(Models.Metadata.Port item) : base(item) { } + public Port(Models.Metadata.Port item) : base(item) + { + // Handle subitems + var analogs = item.ReadItemArray(Models.Metadata.Port.AnalogKey); + if (analogs != null) + { + Analog[] analogItems = Array.ConvertAll(analogs, analog => new Analog(analog)); + SetFieldValue(Models.Metadata.Port.AnalogKey, analogItems); + } + } #endregion } diff --git a/SabreTools.DatItems/Formats/RamOption.cs b/SabreTools.DatItems/Formats/RamOption.cs index 28d8fc00..f74d0726 100644 --- a/SabreTools.DatItems/Formats/RamOption.cs +++ b/SabreTools.DatItems/Formats/RamOption.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public RamOption() : base() { } - public RamOption(Models.Metadata.RamOption item) : base(item) { } + public RamOption(Models.Metadata.RamOption item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.RamOption.DefaultKey) != null) + SetFieldValue(Models.Metadata.RamOption.DefaultKey, GetBoolFieldValue(Models.Metadata.RamOption.DefaultKey).FromYesNo()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Release.cs b/SabreTools.DatItems/Formats/Release.cs index e78cf800..6d13926f 100644 --- a/SabreTools.DatItems/Formats/Release.cs +++ b/SabreTools.DatItems/Formats/Release.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public Release() : base() { } - public Release(Models.Metadata.Release item) : base(item) { } + public Release(Models.Metadata.Release item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.Release.DefaultKey) != null) + SetFieldValue(Models.Metadata.Release.DefaultKey, GetBoolFieldValue(Models.Metadata.Release.DefaultKey).FromYesNo()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/Rom.cs b/SabreTools.DatItems/Formats/Rom.cs index 2de1a990..83acc4f4 100644 --- a/SabreTools.DatItems/Formats/Rom.cs +++ b/SabreTools.DatItems/Formats/Rom.cs @@ -92,6 +92,44 @@ namespace SabreTools.DatItems.Formats public Rom(Models.Metadata.Rom item) : base(item) { SetFieldValue(DatItem.DupeTypeKey, 0x00); + + // Process flag values + if (GetBoolFieldValue(Models.Metadata.Rom.DisposeKey) != null) + SetFieldValue(Models.Metadata.Rom.DisposeKey, GetBoolFieldValue(Models.Metadata.Rom.DisposeKey).FromYesNo()); + if (GetBoolFieldValue(Models.Metadata.Rom.InvertedKey) != null) + SetFieldValue(Models.Metadata.Rom.InvertedKey, GetBoolFieldValue(Models.Metadata.Rom.InvertedKey).FromYesNo()); + if (GetStringFieldValue(Models.Metadata.Rom.LoadFlagKey) != null) + SetFieldValue(Models.Metadata.Rom.LoadFlagKey, GetStringFieldValue(Models.Metadata.Rom.LoadFlagKey).AsEnumValue().AsStringValue()); + if (GetStringFieldValue(Models.Metadata.Rom.OpenMSXMediaType) != null) + SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, GetStringFieldValue(Models.Metadata.Rom.OpenMSXMediaType).AsEnumValue().AsStringValue()); + if (GetBoolFieldValue(Models.Metadata.Rom.MIAKey) != null) + SetFieldValue(Models.Metadata.Rom.MIAKey, GetBoolFieldValue(Models.Metadata.Rom.MIAKey).FromYesNo()); + if (GetBoolFieldValue(Models.Metadata.Rom.OptionalKey) != null) + SetFieldValue(Models.Metadata.Rom.OptionalKey, GetBoolFieldValue(Models.Metadata.Rom.OptionalKey).FromYesNo()); + if (GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey) != null) + SetFieldValue(Models.Metadata.Rom.SoundOnlyKey, GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey).FromYesNo()); + if (GetStringFieldValue(Models.Metadata.Rom.StatusKey) != null) + SetFieldValue(Models.Metadata.Rom.StatusKey, GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue().AsStringValue()); + + // Process hash values + if (GetInt64FieldValue(Models.Metadata.Rom.SizeKey) != null) + SetFieldValue(Models.Metadata.Rom.SizeKey, GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString()); + if (GetStringFieldValue(Models.Metadata.Rom.CRCKey) != null) + SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.NormalizeCRC32(GetStringFieldValue(Models.Metadata.Rom.CRCKey))); + if (GetStringFieldValue(Models.Metadata.Rom.MD2Key) != null) + SetFieldValue(Models.Metadata.Rom.MD2Key, TextHelper.NormalizeMD2(GetStringFieldValue(Models.Metadata.Rom.MD2Key))); + if (GetStringFieldValue(Models.Metadata.Rom.MD4Key) != null) + SetFieldValue(Models.Metadata.Rom.MD4Key, TextHelper.NormalizeMD4(GetStringFieldValue(Models.Metadata.Rom.MD4Key))); + if (GetStringFieldValue(Models.Metadata.Rom.MD5Key) != null) + SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.NormalizeMD5(GetStringFieldValue(Models.Metadata.Rom.MD5Key))); + if (GetStringFieldValue(Models.Metadata.Rom.SHA1Key) != null) + SetFieldValue(Models.Metadata.Rom.SHA1Key, TextHelper.NormalizeSHA1(GetStringFieldValue(Models.Metadata.Rom.SHA1Key))); + if (GetStringFieldValue(Models.Metadata.Rom.SHA256Key) != null) + SetFieldValue(Models.Metadata.Rom.SHA256Key, TextHelper.NormalizeSHA256(GetStringFieldValue(Models.Metadata.Rom.SHA256Key))); + if (GetStringFieldValue(Models.Metadata.Rom.SHA384Key) != null) + SetFieldValue(Models.Metadata.Rom.SHA384Key, TextHelper.NormalizeSHA384(GetStringFieldValue(Models.Metadata.Rom.SHA384Key))); + if (GetStringFieldValue(Models.Metadata.Rom.SHA512Key) != null) + SetFieldValue(Models.Metadata.Rom.SHA512Key, TextHelper.NormalizeSHA512(GetStringFieldValue(Models.Metadata.Rom.SHA512Key))); } #endregion diff --git a/SabreTools.DatItems/Formats/Slot.cs b/SabreTools.DatItems/Formats/Slot.cs index 6c8b1ead..f32d1561 100644 --- a/SabreTools.DatItems/Formats/Slot.cs +++ b/SabreTools.DatItems/Formats/Slot.cs @@ -1,5 +1,7 @@ -using System.Xml.Serialization; +using System; +using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core; namespace SabreTools.DatItems.Formats { @@ -32,7 +34,16 @@ namespace SabreTools.DatItems.Formats #region Constructors public Slot() : base() { } - public Slot(Models.Metadata.Slot item) : base(item) { } + public Slot(Models.Metadata.Slot item) : base(item) + { + // Handle subitems + var slotOptions = item.ReadItemArray(Models.Metadata.Slot.SlotOptionKey); + if (slotOptions != null) + { + SlotOption[] slotOptionItems = Array.ConvertAll(slotOptions, slotOption => new SlotOption(slotOption)); + SetFieldValue(Models.Metadata.Slot.SlotOptionKey, slotOptionItems); + } + } #endregion } diff --git a/SabreTools.DatItems/Formats/SlotOption.cs b/SabreTools.DatItems/Formats/SlotOption.cs index 4164040e..0ccf804c 100644 --- a/SabreTools.DatItems/Formats/SlotOption.cs +++ b/SabreTools.DatItems/Formats/SlotOption.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public SlotOption() : base() { } - public SlotOption(Models.Metadata.SlotOption item) : base(item) { } + public SlotOption(Models.Metadata.SlotOption item) : base(item) + { + // Process flag values + if (GetBoolFieldValue(Models.Metadata.SlotOption.DefaultKey) != null) + SetFieldValue(Models.Metadata.SlotOption.DefaultKey, GetBoolFieldValue(Models.Metadata.SlotOption.DefaultKey).FromYesNo()); + } #endregion } diff --git a/SabreTools.DatItems/Formats/SoftwareList.cs b/SabreTools.DatItems/Formats/SoftwareList.cs index d92a097a..42d2387d 100644 --- a/SabreTools.DatItems/Formats/SoftwareList.cs +++ b/SabreTools.DatItems/Formats/SoftwareList.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -22,7 +23,15 @@ namespace SabreTools.DatItems.Formats #region Constructors public SoftwareList() : base() { } - public SoftwareList(Models.Metadata.SoftwareList item) : base(item) { } + public SoftwareList(Models.Metadata.SoftwareList item) : base(item) + { + // Process flag values + if (GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey) != null) + SetFieldValue(Models.Metadata.SoftwareList.StatusKey, GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue().AsStringValue()); + + // Handle subitems + // TODO: Handle the Software subitem + } #endregion } diff --git a/SabreTools.DatItems/Formats/Sound.cs b/SabreTools.DatItems/Formats/Sound.cs index c96f542d..8f9eac17 100644 --- a/SabreTools.DatItems/Formats/Sound.cs +++ b/SabreTools.DatItems/Formats/Sound.cs @@ -22,7 +22,12 @@ namespace SabreTools.DatItems.Formats #region Constructors public Sound() : base() { } - public Sound(Models.Metadata.Sound item) : base(item) { } + public Sound(Models.Metadata.Sound item) : base(item) + { + // Process flag values + if (GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey) != null) + SetFieldValue(Models.Metadata.Sound.ChannelsKey, GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey).ToString()); + } #endregion } diff --git a/SabreTools.DatItems/Machine.cs b/SabreTools.DatItems/Machine.cs index 0fbe9e25..6239a215 100644 --- a/SabreTools.DatItems/Machine.cs +++ b/SabreTools.DatItems/Machine.cs @@ -53,6 +53,28 @@ namespace SabreTools.DatItems if (machine.ContainsKey(fieldName)) _internal[fieldName] = machine[fieldName]; } + + // Process flag values + if (GetStringFieldValue(Models.Metadata.Machine.Im1CRCKey) != null) + SetFieldValue(Models.Metadata.Machine.Im1CRCKey, TextHelper.NormalizeCRC32(GetStringFieldValue(Models.Metadata.Machine.Im1CRCKey))); + if (GetStringFieldValue(Models.Metadata.Machine.Im2CRCKey) != null) + SetFieldValue(Models.Metadata.Machine.Im2CRCKey, TextHelper.NormalizeCRC32(GetStringFieldValue(Models.Metadata.Machine.Im2CRCKey))); + if (GetBoolFieldValue(Models.Metadata.Machine.IsBiosKey) != null) + SetFieldValue(Models.Metadata.Machine.IsBiosKey, GetBoolFieldValue(Models.Metadata.Machine.IsBiosKey).FromYesNo()); + if (GetBoolFieldValue(Models.Metadata.Machine.IsDeviceKey) != null) + SetFieldValue(Models.Metadata.Machine.IsDeviceKey, GetBoolFieldValue(Models.Metadata.Machine.IsDeviceKey).FromYesNo()); + if (GetBoolFieldValue(Models.Metadata.Machine.IsMechanicalKey) != null) + SetFieldValue(Models.Metadata.Machine.IsMechanicalKey, GetBoolFieldValue(Models.Metadata.Machine.IsMechanicalKey).FromYesNo()); + if (GetStringFieldValue(Models.Metadata.Machine.SupportedKey) != null) + SetFieldValue(Models.Metadata.Machine.SupportedKey, GetStringFieldValue(Models.Metadata.Machine.SupportedKey).AsEnumValue().AsStringValue()); + + // Handle Trurip object, if it exists + if (machine.ContainsKey(Models.Metadata.Machine.TruripKey)) + { + var truripItem = machine.Read(Models.Metadata.Machine.TruripKey); + if (truripItem != null) + SetFieldValue(Models.Metadata.Machine.TruripKey, new Trurip(truripItem)); + } } #endregion