diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 59643ac3..c46fece7 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -52,13 +52,17 @@ namespace SabreTools.Data.Extensions Port => null, RamOption => self.ReadString(RamOption.NameKey), Release => self.ReadString(Release.NameKey), + ReleaseDetails => null, Rom => self.ReadString(Rom.NameKey), Sample => self.ReadString(Sample.NameKey), + Serials => null, SharedFeat => self.ReadString(SharedFeat.NameKey), Slot => self.ReadString(Slot.NameKey), SlotOption => self.ReadString(SlotOption.NameKey), SoftwareList => self.ReadString(SoftwareList.NameKey), Sound => null, + SourceDetails => null, + Video => null, _ => null, }; @@ -106,13 +110,17 @@ namespace SabreTools.Data.Extensions case Port: break; case RamOption: self[RamOption.NameKey] = name; break; case Release: self[Release.NameKey] = name; break; + case ReleaseDetails: break; case Rom: self[Rom.NameKey] = name; break; case Sample: self[Sample.NameKey] = name; break; + case Serials: break; case SharedFeat: self[SharedFeat.NameKey] = name; break; case Slot: self[Slot.NameKey] = name; break; case SlotOption: self[SlotOption.NameKey] = name; break; case SoftwareList: self[SoftwareList.NameKey] = name; break; case Sound: break; + case SourceDetails: break; + case Video: break; default: break; } diff --git a/SabreTools.Data.Models/Metadata/Archive.cs b/SabreTools.Data.Models/Metadata/Archive.cs index ab7d3929..d80c9ecd 100644 --- a/SabreTools.Data.Models/Metadata/Archive.cs +++ b/SabreTools.Data.Models/Metadata/Archive.cs @@ -8,9 +8,105 @@ namespace SabreTools.Data.Models.Metadata { #region Keys + /// string, No-Intro DB extension + public const string NumberKey = "number"; + + /// string, No-Intro DB extension + public const string CloneKey = "clone"; + + /// string, No-Intro DB extension + public const string RegParentKey = "regparent"; + + /// string, No-Intro DB extension + public const string MergeOfKey = "mergeof"; + + /// string, No-Intro DB extension + public const string MergeNameKey = "mergename"; + /// string public const string NameKey = "name"; + /// string, No-Intro DB extension + public const string NameAltKey = "name_alt"; + + /// string, No-Intro DB extension + public const string RegionKey = "region"; + + /// string, No-Intro DB extension + public const string LanguagesKey = "languages"; + + /// byte, No-Intro DB extension + public const string ShowLangKey = "showlang"; + + /// string, No-Intro DB extension + public const string LangCheckedKey = "langchecked"; + + /// string, No-Intro DB extension + public const string Version1Key = "version1"; + + /// string, No-Intro DB extension + public const string Version2Key = "version2"; + + /// string, No-Intro DB extension + public const string DevStatusKey = "devstatus"; + + /// string, No-Intro DB extension + public const string AdditionalKey = "additional"; + + /// string, No-Intro DB extension + public const string Special1Key = "special1"; + + /// string, No-Intro DB extension + public const string Special2Key = "special2"; + + /// byte, No-Intro DB extension + public const string AltKey = "alt"; + + /// string, No-Intro DB extension + public const string GameId1Key = "gameid1"; + + /// string, No-Intro DB extension + public const string GameId2Key = "gameid2"; + + /// string, No-Intro DB extension + public const string DescriptionKey = "description"; + + /// byte, No-Intro DB extension + public const string BiosKey = "bios"; + + /// byte, No-Intro DB extension + public const string LicensedKey = "licensed"; + + /// byte, No-Intro DB extension + public const string PirateKey = "pirate"; + + /// byte, No-Intro DB extension + public const string PhysicalKey = "physical"; + + /// byte, No-Intro DB extension + public const string CompleteKey = "complete"; + + /// byte, No-Intro DB extension + public const string AdultKey = "adult"; + + /// byte, No-Intro DB extension + public const string DatKey = "dat"; + + /// byte, No-Intro DB extension + public const string ListedKey = "listed"; + + /// byte, No-Intro DB extension + public const string PrivateKey = "private"; + + /// string, No-Intro DB extension + public const string StickyNoteKey = "stickynote"; + + /// string, No-Intro DB extension + public const string DatterNoteKey = "datternote"; + + /// string, No-Intro DB extension + public const string CategoriesKey = "categories"; + #endregion public Archive() => Type = ItemType.Archive; diff --git a/SabreTools.Data.Models/Metadata/Enums.cs b/SabreTools.Data.Models/Metadata/Enums.cs index ae8a0447..59913ea0 100644 --- a/SabreTools.Data.Models/Metadata/Enums.cs +++ b/SabreTools.Data.Models/Metadata/Enums.cs @@ -288,14 +288,17 @@ namespace SabreTools.Data.Models.Metadata Port, RamOption, Release, + ReleaseDetails, Rom, Sample, + Serials, SharedFeat, Slot, SlotOption, Software, SoftwareList, Sound, + SourceDetails, Video, /// diff --git a/SabreTools.Data.Models/Metadata/ReleaseDetails.cs b/SabreTools.Data.Models/Metadata/ReleaseDetails.cs new file mode 100644 index 00000000..6a1a9fa9 --- /dev/null +++ b/SabreTools.Data.Models/Metadata/ReleaseDetails.cs @@ -0,0 +1,63 @@ +using System.Xml.Serialization; +using Newtonsoft.Json; + +namespace SabreTools.Data.Models.Metadata +{ + [JsonObject("release_details"), XmlRoot("release_details")] + public class ReleaseDetails : DatItem + { + #region Keys + + /// string + public const string IdKey = "id"; + + /// string + public const string AppendToNumberKey = "appendtonumber"; + + /// string + public const string DateKey = "date"; + + /// string + public const string OriginalFormatKey = "originalformat"; + + /// string + public const string GroupKey = "group"; + + /// string + public const string DirNameKey = "dirname"; + + /// string + public const string NfoNameKey = "nfoname"; + + /// string + public const string NfoSizeKey = "nfosize"; + + /// string + public const string NfoCRCKey = "nfocrc"; + + /// string + public const string ArchiveNameKey = "archivename"; + + /// string + public const string RomInfoKey = "rominfo"; + + /// string + public const string CategoryKey = "category"; + + /// string + public const string CommentKey = "comment"; + + /// string + public const string ToolKey = "tool"; + + /// string + public const string RegionKey = "region"; + + /// string + public const string OriginKey = "origin"; + + #endregion + + public ReleaseDetails() => Type = ItemType.ReleaseDetails; + } +} diff --git a/SabreTools.Data.Models/Metadata/Serials.cs b/SabreTools.Data.Models/Metadata/Serials.cs new file mode 100644 index 00000000..9f451b3e --- /dev/null +++ b/SabreTools.Data.Models/Metadata/Serials.cs @@ -0,0 +1,57 @@ +using System.Xml.Serialization; +using Newtonsoft.Json; + +namespace SabreTools.Data.Models.Metadata +{ + [JsonObject("serials"), XmlRoot("serials")] + public class Serials : DatItem + { + #region Keys + + /// string + public const string MediaSerial1Key = "mediaserial1"; + + /// string + public const string MediaSerial2Key = "mediaserial2"; + + /// string + public const string MediaSerial3Key = "mediaserial3"; + + /// string + public const string PCBSerialKey = "pcbserial"; + + /// string + public const string RomChipSerial1Key = "romchipserial1"; + + /// string + public const string RomChipSerial2Key = "romchipserial2"; + + /// string + public const string LockoutSerialKey = "lockoutserial"; + + /// string + public const string SaveChipSerialKey = "savechipserial"; + + /// string + public const string ChipSerialKey = "chipserial"; + + /// string + public const string BoxSerialKey = "boxserial"; + + /// string + public const string MediaStampKey = "mediastamp"; + + /// string + public const string BoxBarcodeKey = "boxbarcode"; + + /// string + public const string DigitalSerial1Key = "digitalserial1"; + + /// string + public const string DigitalSerial2Key = "digitalserial2"; + + #endregion + + public Serials() => Type = ItemType.Serials; + } +} diff --git a/SabreTools.Data.Models/Metadata/SourceDetails.cs b/SabreTools.Data.Models/Metadata/SourceDetails.cs new file mode 100644 index 00000000..b151d954 --- /dev/null +++ b/SabreTools.Data.Models/Metadata/SourceDetails.cs @@ -0,0 +1,87 @@ +using System.Xml.Serialization; +using Newtonsoft.Json; + +namespace SabreTools.Data.Models.Metadata +{ + [JsonObject("source_details"), XmlRoot("source_details")] + public class SourceDetails : DatItem + { + #region Keys + + /// string + public const string IdKey = "id"; + + /// string + public const string AppendToNumberKey = "appendtonumber"; + + /// string + public const string SectionKey = "section"; + + /// string + public const string RomInfoKey = "rominfo"; + + /// string + public const string DumpDateKey = "dumpdate"; + + /// byte + public const string DumpDateInfoKey = "dumpdateinfo"; + + /// string + public const string ReleaseDateKey = "releasedate"; + + /// byte + public const string ReleaseDateInfoKey = "releasedateinfo"; + + /// string + public const string DumperKey = "dumper"; + + /// string + public const string ProjectKey = "project"; + + /// string + public const string OriginalFormatKey = "originalformat"; + + /// byte + public const string NodumpKey = "nodump"; + + /// string + public const string ToolKey = "tool"; + + /// string + public const string OriginKey = "origin"; + + /// string + public const string Comment1Key = "comment1"; + + /// string + public const string Comment2Key = "comment2"; + + /// string + public const string Link1Key = "link1"; + + /// byte + public const string Link1PublicKey = "link1public"; + + /// string + public const string Link2Key = "link2"; + + /// byte + public const string Link2PublicKey = "link2public"; + + /// string + public const string Link3Key = "link3"; + + /// byte + public const string Link3PublicKey = "link3public"; + + /// string + public const string RegionKey = "region"; + + /// string + public const string MediaTitleKey = "mediatitle"; + + #endregion + + public SourceDetails() => Type = ItemType.SourceDetails; + } +} diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index e624e82f..51bfb603 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -354,7 +354,39 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.Archive { + [Data.Models.Metadata.Archive.NumberKey] = "number", + [Data.Models.Metadata.Archive.CloneKey] = "clone", + [Data.Models.Metadata.Archive.RegParentKey] = "regparent", + [Data.Models.Metadata.Archive.MergeOfKey] = "mergeof", + [Data.Models.Metadata.Archive.MergeNameKey] = "mergename", [Data.Models.Metadata.Archive.NameKey] = "name", + [Data.Models.Metadata.Archive.NameAltKey] = "name_alt", + [Data.Models.Metadata.Archive.RegionKey] = "region", + [Data.Models.Metadata.Archive.LanguagesKey] = "languages", + [Data.Models.Metadata.Archive.ShowLangKey] = "showlang", + [Data.Models.Metadata.Archive.LangCheckedKey] = "langchecked", + [Data.Models.Metadata.Archive.Version1Key] = "version1", + [Data.Models.Metadata.Archive.Version2Key] = "version2", + [Data.Models.Metadata.Archive.DevStatusKey] = "devstatus", + [Data.Models.Metadata.Archive.AdditionalKey] = "additional", + [Data.Models.Metadata.Archive.Special1Key] = "special1", + [Data.Models.Metadata.Archive.Special2Key] = "special2", + [Data.Models.Metadata.Archive.AltKey] = "alt", + [Data.Models.Metadata.Archive.GameId1Key] = "gameid1", + [Data.Models.Metadata.Archive.GameId2Key] = "gameid2", + [Data.Models.Metadata.Archive.DescriptionKey] = "description", + [Data.Models.Metadata.Archive.BiosKey] = "bios", + [Data.Models.Metadata.Archive.LicensedKey] = "licensed", + [Data.Models.Metadata.Archive.PirateKey] = "pirate", + [Data.Models.Metadata.Archive.PhysicalKey] = "physical", + [Data.Models.Metadata.Archive.CompleteKey] = "complete", + [Data.Models.Metadata.Archive.AdultKey] = "adult", + [Data.Models.Metadata.Archive.DatKey] = "dat", + [Data.Models.Metadata.Archive.ListedKey] = "listed", + [Data.Models.Metadata.Archive.PrivateKey] = "private", + [Data.Models.Metadata.Archive.StickyNoteKey] = "stickynote", + [Data.Models.Metadata.Archive.DatterNoteKey] = "datternote", + [Data.Models.Metadata.Archive.CategoriesKey] = "categories", }; } @@ -711,6 +743,29 @@ namespace SabreTools.Metadata.DatFiles.Test }; } + private static Data.Models.Metadata.ReleaseDetails CreateMetadataReleaseDetails() + { + return new Data.Models.Metadata.ReleaseDetails + { + [Data.Models.Metadata.ReleaseDetails.IdKey] = "id", + [Data.Models.Metadata.ReleaseDetails.AppendToNumberKey] = "appendtonumber", + [Data.Models.Metadata.ReleaseDetails.DateKey] = "date", + [Data.Models.Metadata.ReleaseDetails.OriginalFormatKey] = "originalformat", + [Data.Models.Metadata.ReleaseDetails.GroupKey] = "group", + [Data.Models.Metadata.ReleaseDetails.DirNameKey] = "dirname", + [Data.Models.Metadata.ReleaseDetails.NfoNameKey] = "nfoname", + [Data.Models.Metadata.ReleaseDetails.NfoSizeKey] = "nfosize", + [Data.Models.Metadata.ReleaseDetails.NfoCRCKey] = "nfocrc", + [Data.Models.Metadata.ReleaseDetails.ArchiveNameKey] = "archivename", + [Data.Models.Metadata.ReleaseDetails.RomInfoKey] = "rominfo", + [Data.Models.Metadata.ReleaseDetails.CategoryKey] = "category", + [Data.Models.Metadata.ReleaseDetails.CommentKey] = "comment", + [Data.Models.Metadata.ReleaseDetails.ToolKey] = "tool", + [Data.Models.Metadata.ReleaseDetails.RegionKey] = "region", + [Data.Models.Metadata.ReleaseDetails.OriginKey] = "origin", + }; + } + private static Data.Models.Metadata.Rom CreateMetadataRom() { return new Data.Models.Metadata.Rom @@ -822,6 +877,27 @@ namespace SabreTools.Metadata.DatFiles.Test }; } + private static Data.Models.Metadata.Serials CreateMetadataSerials() + { + return new Data.Models.Metadata.Serials + { + [Data.Models.Metadata.Serials.MediaSerial1Key] = "mediaserial1", + [Data.Models.Metadata.Serials.MediaSerial2Key] = "mediaserial2", + [Data.Models.Metadata.Serials.MediaSerial3Key] = "mediaserial3", + [Data.Models.Metadata.Serials.PCBSerialKey] = "pcbserial", + [Data.Models.Metadata.Serials.RomChipSerial1Key] = "romchipserial1", + [Data.Models.Metadata.Serials.RomChipSerial2Key] = "romchipserial2", + [Data.Models.Metadata.Serials.LockoutSerialKey] = "lockoutserial", + [Data.Models.Metadata.Serials.SaveChipSerialKey] = "savechipserial", + [Data.Models.Metadata.Serials.ChipSerialKey] = "chipserial", + [Data.Models.Metadata.Serials.BoxSerialKey] = "boxserial", + [Data.Models.Metadata.Serials.MediaStampKey] = "mediastamp", + [Data.Models.Metadata.Serials.BoxBarcodeKey] = "boxbarcode", + [Data.Models.Metadata.Serials.DigitalSerial1Key] = "digitalserial1", + [Data.Models.Metadata.Serials.DigitalSerial2Key] = "digitalserial2", + }; + } + private static Data.Models.Metadata.SharedFeat CreateMetadataSharedFeat() { return new Data.Models.Metadata.SharedFeat @@ -889,6 +965,37 @@ namespace SabreTools.Metadata.DatFiles.Test }; } + private static Data.Models.Metadata.SourceDetails CreateMetadataSourceDetails() + { + return new Data.Models.Metadata.SourceDetails + { + [Data.Models.Metadata.SourceDetails.IdKey] = "id", + [Data.Models.Metadata.SourceDetails.AppendToNumberKey] = "appendtonumber", + [Data.Models.Metadata.SourceDetails.SectionKey] = "section", + [Data.Models.Metadata.SourceDetails.RomInfoKey] = "rominfo", + [Data.Models.Metadata.SourceDetails.DumpDateKey] = "dumpdate", + [Data.Models.Metadata.SourceDetails.DumpDateInfoKey] = "dumpdateinfo", + [Data.Models.Metadata.SourceDetails.ReleaseDateKey] = "releasedate", + [Data.Models.Metadata.SourceDetails.ReleaseDateInfoKey] = "releasedateinfo", + [Data.Models.Metadata.SourceDetails.DumperKey] = "dumper", + [Data.Models.Metadata.SourceDetails.ProjectKey] = "project", + [Data.Models.Metadata.SourceDetails.OriginalFormatKey] = "originalformat", + [Data.Models.Metadata.SourceDetails.NodumpKey] = "nodump", + [Data.Models.Metadata.SourceDetails.ToolKey] = "tool", + [Data.Models.Metadata.SourceDetails.OriginKey] = "origin", + [Data.Models.Metadata.SourceDetails.Comment1Key] = "comment1", + [Data.Models.Metadata.SourceDetails.Comment2Key] = "comment2", + [Data.Models.Metadata.SourceDetails.Link1Key] = "link1", + [Data.Models.Metadata.SourceDetails.Link1PublicKey] = "link1public", + [Data.Models.Metadata.SourceDetails.Link2Key] = "link2", + [Data.Models.Metadata.SourceDetails.Link2PublicKey] = "link2public", + [Data.Models.Metadata.SourceDetails.Link3Key] = "link3", + [Data.Models.Metadata.SourceDetails.Link3PublicKey] = "link3public", + [Data.Models.Metadata.SourceDetails.RegionKey] = "region", + [Data.Models.Metadata.SourceDetails.MediaTitleKey] = "mediatitle", + }; + } + private static Data.Models.Logiqx.Trurip CreateMetadataTrurip() { return new Data.Models.Logiqx.Trurip diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 03bf581d..e6fb6f2d 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -635,7 +635,39 @@ namespace SabreTools.Metadata.DatFiles.Test private static void ValidateMetadataArchive(Data.Models.Metadata.Archive? archive) { Assert.NotNull(archive); + Assert.Equal("number", archive.ReadString(Data.Models.Metadata.Archive.NumberKey)); + Assert.Equal("clone", archive.ReadString(Data.Models.Metadata.Archive.CloneKey)); + Assert.Equal("regparent", archive.ReadString(Data.Models.Metadata.Archive.RegParentKey)); + Assert.Equal("mergeof", archive.ReadString(Data.Models.Metadata.Archive.MergeOfKey)); + Assert.Equal("mergename", archive.ReadString(Data.Models.Metadata.Archive.MergeNameKey)); Assert.Equal("name", archive.ReadString(Data.Models.Metadata.Archive.NameKey)); + Assert.Equal("name_alt", archive.ReadString(Data.Models.Metadata.Archive.NameAltKey)); + Assert.Equal("region", archive.ReadString(Data.Models.Metadata.Archive.RegionKey)); + Assert.Equal("languages", archive.ReadString(Data.Models.Metadata.Archive.LanguagesKey)); + Assert.Equal("showlang", archive.ReadString(Data.Models.Metadata.Archive.ShowLangKey)); + Assert.Equal("langchecked", archive.ReadString(Data.Models.Metadata.Archive.LangCheckedKey)); + Assert.Equal("version1", archive.ReadString(Data.Models.Metadata.Archive.Version1Key)); + Assert.Equal("version2", archive.ReadString(Data.Models.Metadata.Archive.Version2Key)); + Assert.Equal("devstatus", archive.ReadString(Data.Models.Metadata.Archive.DevStatusKey)); + Assert.Equal("additional", archive.ReadString(Data.Models.Metadata.Archive.AdditionalKey)); + Assert.Equal("special1", archive.ReadString(Data.Models.Metadata.Archive.Special1Key)); + Assert.Equal("special2", archive.ReadString(Data.Models.Metadata.Archive.Special2Key)); + Assert.Equal("alt", archive.ReadString(Data.Models.Metadata.Archive.AltKey)); + Assert.Equal("gameid1", archive.ReadString(Data.Models.Metadata.Archive.GameId1Key)); + Assert.Equal("gameid2", archive.ReadString(Data.Models.Metadata.Archive.GameId2Key)); + Assert.Equal("description", archive.ReadString(Data.Models.Metadata.Archive.DescriptionKey)); + Assert.Equal("bios", archive.ReadString(Data.Models.Metadata.Archive.BiosKey)); + Assert.Equal("licensed", archive.ReadString(Data.Models.Metadata.Archive.LicensedKey)); + Assert.Equal("pirate", archive.ReadString(Data.Models.Metadata.Archive.PirateKey)); + Assert.Equal("physical", archive.ReadString(Data.Models.Metadata.Archive.PhysicalKey)); + Assert.Equal("complete", archive.ReadString(Data.Models.Metadata.Archive.CompleteKey)); + Assert.Equal("adult", archive.ReadString(Data.Models.Metadata.Archive.AdultKey)); + Assert.Equal("dat", archive.ReadString(Data.Models.Metadata.Archive.DatKey)); + Assert.Equal("listed", archive.ReadString(Data.Models.Metadata.Archive.ListedKey)); + Assert.Equal("private", archive.ReadString(Data.Models.Metadata.Archive.PrivateKey)); + Assert.Equal("stickynote", archive.ReadString(Data.Models.Metadata.Archive.StickyNoteKey)); + Assert.Equal("datternote", archive.ReadString(Data.Models.Metadata.Archive.DatterNoteKey)); + Assert.Equal("categories", archive.ReadString(Data.Models.Metadata.Archive.CategoriesKey)); } private static void ValidateMetadataBiosSet(Data.Models.Metadata.BiosSet? biosSet) @@ -979,6 +1011,27 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("region", release.ReadString(Data.Models.Metadata.Release.RegionKey)); } + private static void ValidateMetadataReleaseDetails(Data.Models.Metadata.ReleaseDetails? releaseDetails) + { + Assert.NotNull(releaseDetails); + Assert.Equal("id", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.IdKey)); + Assert.Equal("appendtonumber", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.AppendToNumberKey)); + Assert.Equal("date", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.DateKey)); + Assert.Equal("originalformat", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.OriginalFormatKey)); + Assert.Equal("group", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.GroupKey)); + Assert.Equal("dirname", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.DirNameKey)); + Assert.Equal("nfoname", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.NfoNameKey)); + Assert.Equal("nfosize", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.NfoSizeKey)); + Assert.Equal("nfocrc", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.NfoCRCKey)); + Assert.Equal("archivename", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.ArchiveNameKey)); + Assert.Equal("rominfo", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.RomInfoKey)); + Assert.Equal("category", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.CategoryKey)); + Assert.Equal("comment", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.CommentKey)); + Assert.Equal("tool", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.ToolKey)); + Assert.Equal("region", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.RegionKey)); + Assert.Equal("origin", releaseDetails.ReadString(Data.Models.Metadata.ReleaseDetails.OriginKey)); + } + private static void ValidateMetadataRom(Data.Models.Metadata.Rom? rom) { Assert.NotNull(rom); @@ -1086,6 +1139,25 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", sample.ReadString(Data.Models.Metadata.Sample.NameKey)); } + private static void ValidateMetadataSerials(Data.Models.Metadata.Serials? serials) + { + Assert.NotNull(serials); + Assert.Equal("mediaserial1", serials.ReadString(Data.Models.Metadata.Serials.MediaSerial1Key)); + Assert.Equal("mediaserial2", serials.ReadString(Data.Models.Metadata.Serials.MediaSerial2Key)); + Assert.Equal("mediaserial3", serials.ReadString(Data.Models.Metadata.Serials.MediaSerial3Key)); + Assert.Equal("pcbserial", serials.ReadString(Data.Models.Metadata.Serials.PCBSerialKey)); + Assert.Equal("romchipserial1", serials.ReadString(Data.Models.Metadata.Serials.RomChipSerial1Key)); + Assert.Equal("romchipserial2", serials.ReadString(Data.Models.Metadata.Serials.RomChipSerial2Key)); + Assert.Equal("lockoutserial", serials.ReadString(Data.Models.Metadata.Serials.LockoutSerialKey)); + Assert.Equal("savechipserial", serials.ReadString(Data.Models.Metadata.Serials.SaveChipSerialKey)); + Assert.Equal("chipserial", serials.ReadString(Data.Models.Metadata.Serials.ChipSerialKey)); + Assert.Equal("boxserial", serials.ReadString(Data.Models.Metadata.Serials.BoxSerialKey)); + Assert.Equal("mediastamp", serials.ReadString(Data.Models.Metadata.Serials.MediaStampKey)); + Assert.Equal("boxbarcode", serials.ReadString(Data.Models.Metadata.Serials.BoxBarcodeKey)); + Assert.Equal("digitalserial1", serials.ReadString(Data.Models.Metadata.Serials.DigitalSerial1Key)); + Assert.Equal("digitalserial2", serials.ReadString(Data.Models.Metadata.Serials.DigitalSerial2Key)); + } + private static void ValidateMetadataSharedFeat(Data.Models.Metadata.SharedFeat? sharedFeat) { Assert.NotNull(sharedFeat); @@ -1131,6 +1203,35 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal(12345, sound.ReadLong(Data.Models.Metadata.Sound.ChannelsKey)); } + private static void ValidateMetadataSourceDetails(Data.Models.Metadata.SourceDetails? sourceDetails) + { + Assert.NotNull(sourceDetails); + Assert.Equal("id", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.IdKey)); + Assert.Equal("appendtonumber", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.AppendToNumberKey)); + Assert.Equal("section", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.SectionKey)); + Assert.Equal("rominfo", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.RomInfoKey)); + Assert.Equal("dumpdate", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.DumpDateKey)); + Assert.Equal("dumpdateinfo", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.DumpDateInfoKey)); + Assert.Equal("releasedate", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.ReleaseDateKey)); + Assert.Equal("releasedateinfo", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.ReleaseDateInfoKey)); + Assert.Equal("dumper", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.DumperKey)); + Assert.Equal("project", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.ProjectKey)); + Assert.Equal("originalformat", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.OriginalFormatKey)); + Assert.Equal("nodump", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.NodumpKey)); + Assert.Equal("tool", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.ToolKey)); + Assert.Equal("origin", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.OriginKey)); + Assert.Equal("comment1", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Comment1Key)); + Assert.Equal("comment2", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Comment2Key)); + Assert.Equal("link1", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Link1Key)); + Assert.Equal("link1public", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Link1PublicKey)); + Assert.Equal("link2", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Link2Key)); + Assert.Equal("link2public", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Link2PublicKey)); + Assert.Equal("link3", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Link3Key)); + Assert.Equal("link3public", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.Link3PublicKey)); + Assert.Equal("region", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.RegionKey)); + Assert.Equal("mediatitle", sourceDetails.ReadString(Data.Models.Metadata.SourceDetails.MediaTitleKey)); + } + private static void ValidateMetadataTrurip(Data.Models.Logiqx.Trurip? trurip) { Assert.NotNull(trurip); diff --git a/SabreTools.Metadata.DatItems/DatItem.cs b/SabreTools.Metadata.DatItems/DatItem.cs index 60d6c6b4..e542490d 100644 --- a/SabreTools.Metadata.DatItems/DatItem.cs +++ b/SabreTools.Metadata.DatItems/DatItem.cs @@ -45,6 +45,7 @@ namespace SabreTools.Metadata.DatItems [XmlInclude(typeof(Port))] [XmlInclude(typeof(RamOption))] [XmlInclude(typeof(Release))] + [XmlInclude(typeof(ReleaseDetails))] [XmlInclude(typeof(Rom))] [XmlInclude(typeof(Sample))] [XmlInclude(typeof(SharedFeat))] @@ -52,6 +53,7 @@ namespace SabreTools.Metadata.DatItems [XmlInclude(typeof(SlotOption))] [XmlInclude(typeof(SoftwareList))] [XmlInclude(typeof(Sound))] + [XmlInclude(typeof(SourceDetails))] public abstract class DatItem : ModelBackedItem, IEquatable, IComparable, ICloneable { #region Constants diff --git a/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs b/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs index bbb48229..cd39f5ef 100644 --- a/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs +++ b/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs @@ -1,188 +1,39 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Data.Extensions; -// TODO: Add item mappings for all fields namespace SabreTools.Metadata.DatItems.Formats { /// /// Represents a single release details item /// [JsonObject("release_details"), XmlRoot("release_details")] - public sealed class ReleaseDetails : DatItem + public sealed class ReleaseDetails : DatItem { #region Fields /// /> protected override ItemType ItemType => ItemType.ReleaseDetails; - /// - /// Id value - /// - /// TODO: Is this required? - [JsonProperty("id", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("id")] - public string? Id { get; set; } - - /// - /// Directory name value - /// - [JsonProperty("dirname", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("dirname")] - public string? DirName { get; set; } - - /// - /// Rom info value - /// - [JsonProperty("rominfo", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("rominfo")] - public string? RomInfo { get; set; } - - /// - /// Category value - /// - [JsonProperty("category", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("category")] - public string? Category { get; set; } - - /// - /// NFO name value - /// - [JsonProperty("nfoname", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("nfoname")] - public string? NfoName { get; set; } - - /// - /// NFO size value - /// - [JsonProperty("nfosize", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("nfosize")] - public long? NfoSize { get; set; } - - /// - /// NFO CRC value - /// - [JsonProperty("nfocrc", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("nfocrc")] - public string? NfoCrc { get; set; } - - /// - /// Archive name value - /// - [JsonProperty("archivename", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("archivename")] - public string? ArchiveName { get; set; } - - /// - /// Original format value - /// - [JsonProperty("originalformat", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("originalformat")] - public string? OriginalFormat { get; set; } - - /// - /// Date value - /// - [JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("date")] - public string? Date { get; set; } - - /// - /// Grpup value - /// - [JsonProperty("group", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("group")] - public string? Group { get; set; } - - /// - /// Comment value - /// - [JsonProperty("comment", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("comment")] - public string? Comment { get; set; } - - /// - /// Tool value - /// - [JsonProperty("tool", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tool")] - public string? Tool { get; set; } - - /// - /// Region value - /// - [JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("region")] - public string? Region { get; set; } - - /// - /// Origin value - /// - [JsonProperty("origin", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("origin")] - public string? Origin { get; set; } - #endregion #region Constructors - /// - /// Create a default, empty ReleaseDetails object - /// - public ReleaseDetails() - { - Write(Data.Models.Metadata.DatItem.TypeKey, ItemType); - } + public ReleaseDetails() : base() { } + public ReleaseDetails(Data.Models.Metadata.ReleaseDetails item) : base(item) { } + + public ReleaseDetails(Data.Models.Metadata.ReleaseDetails item, Machine machine, Source source) : this(item) + { + Write(SourceKey, source); + CopyMachineInformation(machine); + } #endregion #region Cloning Methods /// - public override object Clone() - { - var releaseDetails = new ReleaseDetails() - { - Id = this.Id, - DirName = this.DirName, - RomInfo = this.RomInfo, - Category = this.Category, - NfoName = this.NfoName, - NfoSize = this.NfoSize, - NfoCrc = this.NfoCrc, - ArchiveName = this.ArchiveName, - OriginalFormat = this.OriginalFormat, - Date = this.Date, - Group = this.Group, - Comment = this.Comment, - Tool = this.Tool, - Region = this.Region, - Origin = this.Origin, - }; - releaseDetails.Write(DupeTypeKey, Read(DupeTypeKey)); - releaseDetails.Write(MachineKey, GetMachine()); - releaseDetails.Write(RemoveKey, ReadBool(RemoveKey)); - releaseDetails.Write(SourceKey, Read(SourceKey)); - releaseDetails.Write(Data.Models.Metadata.DatItem.TypeKey, ReadString(Data.Models.Metadata.DatItem.TypeKey).AsItemType().AsStringValue()); - - return releaseDetails; - } - - #endregion - - #region Comparision Methods - - /// - public override bool Equals(DatItem? other) - { - // If we don't have a Details, return false - if (ReadString(Data.Models.Metadata.DatItem.TypeKey) != other?.ReadString(Data.Models.Metadata.DatItem.TypeKey)) - return false; - - // Otherwise, treat it as a Details - ReleaseDetails? newOther = other as ReleaseDetails; - - // If the Details information matches - return Id == newOther!.Id - && DirName == newOther.DirName - && RomInfo == newOther.RomInfo - && Category == newOther.Category - && NfoName == newOther.NfoName - && NfoSize == newOther.NfoSize - && NfoCrc == newOther.NfoCrc - && ArchiveName == newOther.ArchiveName - && OriginalFormat == newOther.OriginalFormat - && Date == newOther.Date - && Group == newOther.Group - && Comment == newOther.Comment - && Tool == newOther.Tool - && Region == newOther.Region - && Origin == newOther.Origin; - } + public override object Clone() => new ReleaseDetails(_internal.Clone() as Data.Models.Metadata.ReleaseDetails ?? []); #endregion } diff --git a/SabreTools.Metadata.DatItems/Formats/Serials.cs b/SabreTools.Metadata.DatItems/Formats/Serials.cs index 1b1d0cdb..344ced23 100644 --- a/SabreTools.Metadata.DatItems/Formats/Serials.cs +++ b/SabreTools.Metadata.DatItems/Formats/Serials.cs @@ -1,114 +1,32 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Data.Extensions; -// TODO: Add item mappings for all fields namespace SabreTools.Metadata.DatItems.Formats { /// /// Represents a single serials item /// [JsonObject("serials"), XmlRoot("serials")] - public sealed class Serials : DatItem + public sealed class Serials : DatItem { #region Fields /// /> protected override ItemType ItemType => ItemType.Serials; - /// - /// Digital serial 1 value - /// - [JsonProperty("digital_serial1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("digital_serial1")] - public string? DigitalSerial1 { get; set; } - - /// - /// Digital serial 2 value - /// - [JsonProperty("digital_serial2", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("digital_serial2")] - public string? DigitalSerial2 { get; set; } - - /// - /// Media serial 1 value - /// - [JsonProperty("media_serial1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("media_serial1")] - public string? MediaSerial1 { get; set; } - - /// - /// Media serial 2 value - /// - [JsonProperty("media_serial2", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("media_serial2")] - public string? MediaSerial2 { get; set; } - - /// - /// Media serial 3 value - /// - [JsonProperty("media_serial3", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("media_serial3")] - public string? MediaSerial3 { get; set; } - - /// - /// PCB serial value - /// - [JsonProperty("pcb_serial", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("pcb_serial")] - public string? PcbSerial { get; set; } - - /// - /// Rom chip serial 1 value - /// - [JsonProperty("romchip_serial1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("romchip_serial1")] - public string? RomChipSerial1 { get; set; } - - /// - /// Rom chip serial 2 value - /// - [JsonProperty("romchip_serial2", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("romchip_serial2")] - public string? RomChipSerial2 { get; set; } - - /// - /// Lockout serial value - /// - [JsonProperty("lockout_serial", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("lockout_serial")] - public string? LockoutSerial { get; set; } - - /// - /// Save chip serial value - /// - [JsonProperty("savechip_serial", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("savechip_serial")] - public string? SaveChipSerial { get; set; } - - /// - /// Chip serial value - /// - [JsonProperty("chip_serial", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("chip_serial")] - public string? ChipSerial { get; set; } - - /// - /// Box serial value - /// - [JsonProperty("box_serial", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("box_serial")] - public string? BoxSerial { get; set; } - - /// - /// Media stamp value - /// - [JsonProperty("mediastamp", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mediastamp")] - public string? MediaStamp { get; set; } - - /// - /// Box barcode value - /// - [JsonProperty("box_barcode", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("box_barcode")] - public string? BoxBarcode { get; set; } - #endregion #region Constructors - /// - /// Create a default, empty Serials object - /// - public Serials() + public Serials() : base() { } + + public Serials(Data.Models.Metadata.Serials item) : base(item) { } + + public Serials(Data.Models.Metadata.Serials item, Machine machine, Source source) : this(item) { - Write(Data.Models.Metadata.DatItem.TypeKey, ItemType); + Write(SourceKey, source); + CopyMachineInformation(machine); } #endregion @@ -116,64 +34,7 @@ namespace SabreTools.Metadata.DatItems.Formats #region Cloning Methods /// - public override object Clone() - { - var serials = new Serials() - { - DigitalSerial1 = this.DigitalSerial1, - DigitalSerial2 = this.DigitalSerial2, - MediaSerial1 = this.MediaSerial1, - MediaSerial2 = this.MediaSerial2, - MediaSerial3 = this.MediaSerial3, - PcbSerial = this.PcbSerial, - RomChipSerial1 = this.RomChipSerial1, - RomChipSerial2 = this.RomChipSerial2, - LockoutSerial = this.LockoutSerial, - SaveChipSerial = this.SaveChipSerial, - ChipSerial = this.ChipSerial, - BoxSerial = this.BoxSerial, - MediaStamp = this.MediaStamp, - BoxBarcode = this.BoxBarcode, - }; - serials.Write(DupeTypeKey, Read(DupeTypeKey)); - serials.Write(MachineKey, GetMachine()); - serials.Write(RemoveKey, ReadBool(RemoveKey)); - serials.Write(SourceKey, Read(SourceKey)); - serials.Write(Data.Models.Metadata.DatItem.TypeKey, ReadString(Data.Models.Metadata.DatItem.TypeKey).AsItemType().AsStringValue()); - - return serials; - } - - #endregion - - #region Comparision Methods - - /// - public override bool Equals(DatItem? other) - { - // If we don't have a Serials, return false - if (ReadString(Data.Models.Metadata.DatItem.TypeKey) != other?.ReadString(Data.Models.Metadata.DatItem.TypeKey)) - return false; - - // Otherwise, treat it as a Serials - Serials? newOther = other as Serials; - - // If the Serials information matches - return DigitalSerial1 == newOther!.DigitalSerial1 - && DigitalSerial2 == newOther.DigitalSerial2 - && MediaSerial1 == newOther.MediaSerial1 - && MediaSerial2 == newOther.MediaSerial2 - && MediaSerial3 == newOther.MediaSerial3 - && PcbSerial == newOther.PcbSerial - && RomChipSerial1 == newOther.RomChipSerial1 - && RomChipSerial2 == newOther.RomChipSerial2 - && LockoutSerial == newOther.LockoutSerial - && SaveChipSerial == newOther.SaveChipSerial - && ChipSerial == newOther.ChipSerial - && BoxSerial == newOther.BoxSerial - && MediaStamp == newOther.MediaStamp - && BoxBarcode == newOther.BoxBarcode; - } + public override object Clone() => new Serials(_internal.Clone() as Data.Models.Metadata.Serials ?? []); #endregion } diff --git a/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs b/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs index 7c0813f8..dcf47068 100644 --- a/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs +++ b/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs @@ -1,151 +1,32 @@ using System.Xml.Serialization; using Newtonsoft.Json; +using SabreTools.Data.Extensions; -// TODO: Add item mappings for all fields namespace SabreTools.Metadata.DatItems.Formats { /// /// Represents a single source details item /// [JsonObject("source_details"), XmlRoot("source_details")] - public sealed class SourceDetails : DatItem + public sealed class SourceDetails : DatItem { #region Fields /// /> protected override ItemType ItemType => ItemType.SourceDetails; - /// - /// Id value - /// - /// TODO: Is this required? - [JsonProperty("id", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("id")] - public string? Id { get; set; } - - /// - /// Section value - /// - [JsonProperty("section", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("section")] - public string? Section { get; set; } - - /// - /// Rom info value - /// - [JsonProperty("rominfo", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("rominfo")] - public string? RomInfo { get; set; } - - /// - /// Dumping date value - /// - [JsonProperty("d_date", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("d_date")] - public string? DDate { get; set; } - - /// - /// Dumping date info value - /// - [JsonProperty("d_date_info", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("d_date_info")] - public string? DDateInfo { get; set; } - - /// - /// Release date value - /// - [JsonProperty("r_date", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("r_date")] - public string? RDate { get; set; } - - /// - /// Release date info value - /// - [JsonProperty("r_date_info", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("r_date_info")] - public string? RDateInfo { get; set; } - - /// - /// Origin value - /// - [JsonProperty("origin", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("origin")] - public string? Origin { get; set; } - - /// - /// Region value - /// - [JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("region")] - public string? Region { get; set; } - - /// - /// Media title value - /// - [JsonProperty("media_title", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("media_title")] - public string? MediaTitle { get; set; } - - /// - /// Dumper value - /// - [JsonProperty("dumper", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("dumper")] - public string? Dumper { get; set; } - - /// - /// Project value - /// - [JsonProperty("project", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("project")] - public string? Project { get; set; } - - /// - /// Original format value - /// - [JsonProperty("originalformat", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("originalformat")] - public string? OriginalFormat { get; set; } - - /// - /// Nodump value - /// - [JsonProperty("nodump", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("nodump")] - public string? Nodump { get; set; } - - /// - /// Tool value - /// - [JsonProperty("tool", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tool")] - public string? Tool { get; set; } - - /// - /// Comment 1 value - /// - [JsonProperty("comment1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("comment1")] - public string? Comment1 { get; set; } - - /// - /// Link 2 value - /// - [JsonProperty("comment2", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("comment2")] - public string? Comment2 { get; set; } - - /// - /// Link 1 value - /// - [JsonProperty("link1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("link1")] - public string? Link1 { get; set; } - - /// - /// Link 2 value - /// - [JsonProperty("link2", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("link2")] - public string? Link2 { get; set; } - - /// - /// Link 3 value - /// - [JsonProperty("link3", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("link3")] - public string? Link3 { get; set; } - #endregion #region Constructors - /// - /// Create a default, empty SourceDetails object - /// - public SourceDetails() + public SourceDetails() : base() { } + + public SourceDetails(Data.Models.Metadata.SourceDetails item) : base(item) { } + + public SourceDetails(Data.Models.Metadata.SourceDetails item, Machine machine, Source source) : this(item) { - Write(Data.Models.Metadata.DatItem.TypeKey, ItemType.SourceDetails); + Write(SourceKey, source); + CopyMachineInformation(machine); } #endregion @@ -153,77 +34,7 @@ namespace SabreTools.Metadata.DatItems.Formats #region Cloning Methods /// - public override object Clone() - { - var sourceDetails = new SourceDetails() - { - Id = this.Id, - Section = this.Section, - RomInfo = this.RomInfo, - DDate = this.DDate, - DDateInfo = this.DDateInfo, - RDate = this.RDate, - RDateInfo = this.RDateInfo, - Origin = this.Origin, - Region = this.Region, - MediaTitle = this.MediaTitle, - Dumper = this.Dumper, - Project = this.Project, - OriginalFormat = this.OriginalFormat, - Nodump = this.Nodump, - Tool = this.Tool, - Comment1 = this.Comment1, - Comment2 = this.Comment2, - Link1 = this.Link1, - Link2 = this.Link2, - Link3 = this.Link3, - }; - sourceDetails.Write(DupeTypeKey, Read(DupeTypeKey)); - sourceDetails.Write(MachineKey, GetMachine()); - sourceDetails.Write(RemoveKey, ReadBool(RemoveKey)); - sourceDetails.Write(SourceKey, Read(SourceKey)); - sourceDetails.Write(Data.Models.Metadata.DatItem.TypeKey, ReadString(Data.Models.Metadata.DatItem.TypeKey).AsItemType().AsStringValue()); - - return sourceDetails; - } - - #endregion - - #region Comparision Methods - - /// - public override bool Equals(DatItem? other) - { - // If we don't have a SourceDetails, return false - if (ReadString(Data.Models.Metadata.DatItem.TypeKey) != other?.ReadString(Data.Models.Metadata.DatItem.TypeKey)) - return false; - - // Otherwise, treat it as a SourceDetails - SourceDetails? newOther = other as SourceDetails; - - // If the Details information matches - return Id == newOther!.Id - && Section == newOther.Section - && RomInfo == newOther.RomInfo - && DDate == newOther.DDate - && DDateInfo == newOther.DDateInfo - && RomInfo == newOther.RomInfo - && RDate == newOther.RDate - && RDateInfo == newOther.RDateInfo - && Origin == newOther.Origin - && Region == newOther.Region - && MediaTitle == newOther.MediaTitle - && Dumper == newOther.Dumper - && Project == newOther.Project - && OriginalFormat == newOther.OriginalFormat - && Nodump == newOther.Nodump - && Tool == newOther.Tool - && Comment1 == newOther.Comment1 - && Comment2 == newOther.Comment2 - && Link1 == newOther.Link1 - && Link2 == newOther.Link2 - && Link3 == newOther.Link3; - } + public override object Clone() => new SourceDetails(_internal.Clone() as Data.Models.Metadata.SourceDetails ?? []); #endregion }