diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 353db922..10623ed1 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -188,6 +188,8 @@ namespace SabreTools.Data.Extensions return softwareList.Clone() as SoftwareList; else if (self is Sound sound) return sound.Clone() as Sound; + else if (self is SourceDetails sourceDetails) + return sourceDetails.Clone() as SourceDetails; else if (self is Video video) return video.Clone() as Video; @@ -1867,10 +1869,10 @@ namespace SabreTools.Data.Extensions { return value switch { - Width.Byte =>"8", - Width.Short =>"16", - Width.Int =>"32", - Width.Long =>"64", + Width.Byte => "8", + Width.Short => "16", + Width.Int => "32", + Width.Long => "64", _ => null, }; } diff --git a/SabreTools.Data.Models/Metadata/SourceDetails.cs b/SabreTools.Data.Models/Metadata/SourceDetails.cs index b443b163..cb4ebe18 100644 --- a/SabreTools.Data.Models/Metadata/SourceDetails.cs +++ b/SabreTools.Data.Models/Metadata/SourceDetails.cs @@ -1,87 +1,222 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("source_details"), XmlRoot("source_details")] - public class SourceDetails : DatItem + public class SourceDetails : DatItem, ICloneable, IEquatable { - #region Keys + #region Properties - /// string - public const string IdKey = "id"; + public string? AppendToNumber { get; set; } - /// string - public const string AppendToNumberKey = "appendtonumber"; + public string? Comment1 { get; set; } - /// string - public const string SectionKey = "section"; + public string? Comment2 { get; set; } - /// string - public const string RomInfoKey = "rominfo"; + public string? DumpDate { get; set; } - /// string - public const string DumpDateKey = "dumpdate"; + /// (0|1) "0" + public bool? DumpDateInfo { get; set; } - /// byte - public const string DumpDateInfoKey = "dumpdateinfo"; + public string? Dumper { get; set; } - /// string - public const string ReleaseDateKey = "releasedate"; + public string? Id { get; set; } - /// byte - public const string ReleaseDateInfoKey = "releasedateinfo"; + public string? Link1 { get; set; } - /// string - public const string DumperKey = "dumper"; + /// (0|1) "0" + public bool? Link1Public { get; set; } - /// string - public const string ProjectKey = "project"; + public string? Link2 { get; set; } - /// string - public const string OriginalFormatKey = "originalformat"; + /// (0|1) "0" + public bool? Link2Public { get; set; } - /// byte - public const string NodumpKey = "nodump"; + public string? Link3 { get; set; } - /// string - public const string ToolKey = "tool"; + /// (0|1) "0" + public bool? Link3Public { get; set; } - /// string - public const string OriginKey = "origin"; + public string? MediaTitle { get; set; } - /// string - public const string Comment1Key = "comment1"; + /// (0|1) "0" + public bool? Nodump { get; set; } - /// string - public const string Comment2Key = "comment2"; + public string? Origin { get; set; } - /// string - public const string Link1Key = "link1"; + public string? OriginalFormat { get; set; } - /// byte - public const string Link1PublicKey = "link1public"; + public string? Project { get; set; } - /// string - public const string Link2Key = "link2"; + public string? Region { get; set; } - /// byte - public const string Link2PublicKey = "link2public"; + public string? ReleaseDate { get; set; } - /// string - public const string Link3Key = "link3"; + /// (0|1) "0" + public bool? ReleaseDateInfo { get; set; } - /// byte - public const string Link3PublicKey = "link3public"; + public string? RomInfo { get; set; } - /// string - public const string RegionKey = "region"; + public string? Section { get; set; } - /// string - public const string MediaTitleKey = "mediatitle"; + public string? Tool { get; set; } #endregion public SourceDetails() => ItemType = ItemType.SourceDetails; + + /// + public object Clone() + { + var obj = new SourceDetails(); + + obj.AppendToNumber = AppendToNumber; + obj.Comment1 = Comment1; + obj.Comment2 = Comment2; + obj.DumpDate = DumpDate; + obj.DumpDateInfo = DumpDateInfo; + obj.Dumper = Dumper; + obj.Id = Id; + obj.Link1 = Link1; + obj.Link1Public = Link1Public; + obj.Link2 = Link2; + obj.Link2Public = Link2Public; + obj.Link3 = Link3; + obj.Link3Public = Link3Public; + obj.MediaTitle = MediaTitle; + obj.Nodump = Nodump; + obj.Origin = Origin; + obj.OriginalFormat = OriginalFormat; + obj.Project = Project; + obj.Region = Region; + obj.ReleaseDate = ReleaseDate; + obj.ReleaseDateInfo = ReleaseDateInfo; + obj.RomInfo = RomInfo; + obj.Section = Section; + obj.Tool = Tool; + + return obj; + } + + /// + public bool Equals(SourceDetails? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if ((AppendToNumber is null) ^ (other.AppendToNumber is null)) + return false; + else if (AppendToNumber is not null && !AppendToNumber.Equals(other.AppendToNumber, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Comment1 is null) ^ (other.Comment1 is null)) + return false; + else if (Comment1 is not null && !Comment1.Equals(other.Comment1, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Comment2 is null) ^ (other.Comment2 is null)) + return false; + else if (Comment2 is not null && !Comment2.Equals(other.Comment2, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((DumpDate is null) ^ (other.DumpDate is null)) + return false; + else if (DumpDate is not null && !DumpDate.Equals(other.DumpDate, StringComparison.OrdinalIgnoreCase)) + return false; + + if (DumpDateInfo != other.DumpDateInfo) + return false; + + if ((Dumper is null) ^ (other.Dumper is null)) + return false; + else if (Dumper is not null && !Dumper.Equals(other.Dumper, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Id is null) ^ (other.Id is null)) + return false; + else if (Id is not null && !Id.Equals(other.Id, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Link1 is null) ^ (other.Link1 is null)) + return false; + else if (Link1 is not null && !Link1.Equals(other.Link1, StringComparison.OrdinalIgnoreCase)) + return false; + + if (Link1Public != other.Link1Public) + return false; + + if ((Link2 is null) ^ (other.Link2 is null)) + return false; + else if (Link2 is not null && !Link2.Equals(other.Link2, StringComparison.OrdinalIgnoreCase)) + return false; + + if (Link2Public != other.Link2Public) + return false; + + if ((Link3 is null) ^ (other.Link3 is null)) + return false; + else if (Link3 is not null && !Link3.Equals(other.Link3, StringComparison.OrdinalIgnoreCase)) + return false; + + if (Link3Public != other.Link3Public) + return false; + + if ((MediaTitle is null) ^ (other.MediaTitle is null)) + return false; + else if (MediaTitle is not null && !MediaTitle.Equals(other.MediaTitle, StringComparison.OrdinalIgnoreCase)) + return false; + + if (Nodump != other.Nodump) + return false; + + if ((Origin is null) ^ (other.Origin is null)) + return false; + else if (Origin is not null && !Origin.Equals(other.Origin, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((OriginalFormat is null) ^ (other.OriginalFormat is null)) + return false; + else if (OriginalFormat is not null && !OriginalFormat.Equals(other.OriginalFormat, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Project is null) ^ (other.Project is null)) + return false; + else if (Project is not null && !Project.Equals(other.Project, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Region is null) ^ (other.Region is null)) + return false; + else if (Region is not null && !Region.Equals(other.Region, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((ReleaseDate is null) ^ (other.ReleaseDate is null)) + return false; + else if (ReleaseDate is not null && !ReleaseDate.Equals(other.ReleaseDate, StringComparison.OrdinalIgnoreCase)) + return false; + + if (ReleaseDateInfo != other.ReleaseDateInfo) + return false; + + if ((RomInfo is null) ^ (other.RomInfo is null)) + return false; + else if (RomInfo is not null && !RomInfo.Equals(other.RomInfo, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Section is null) ^ (other.Section is null)) + return false; + else if (Section is not null && !Section.Equals(other.Section, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Tool is null) ^ (other.Tool is null)) + return false; + else if (Tool is not null && !Tool.Equals(other.Tool, StringComparison.OrdinalIgnoreCase)) + return false; + + return true; + } } } diff --git a/SabreTools.Data.Models/NoIntroDatabase/SourceDetails.cs b/SabreTools.Data.Models/NoIntroDatabase/SourceDetails.cs index 21d86321..7b728079 100644 --- a/SabreTools.Data.Models/NoIntroDatabase/SourceDetails.cs +++ b/SabreTools.Data.Models/NoIntroDatabase/SourceDetails.cs @@ -21,16 +21,16 @@ namespace SabreTools.Data.Models.NoIntroDatabase [XmlAttribute("d_date")] public string? DumpDate { get; set; } - /// byte + /// (0|1) "0" [XmlAttribute("d_date_info")] - public string? DumpDateInfo { get; set; } + public bool? DumpDateInfo { get; set; } [XmlAttribute("r_date")] public string? ReleaseDate { get; set; } - /// byte + /// (0|1) "0" [XmlAttribute("r_date_info")] - public string? ReleaseDateInfo { get; set; } + public bool? ReleaseDateInfo { get; set; } [XmlAttribute("dumper")] public string? Dumper { get; set; } @@ -41,9 +41,9 @@ namespace SabreTools.Data.Models.NoIntroDatabase [XmlAttribute("originalformat")] public string? OriginalFormat { get; set; } - /// byte + /// (0|1) "0" [XmlAttribute("nodump")] - public string? Nodump { get; set; } + public bool? Nodump { get; set; } [XmlAttribute("tool")] public string? Tool { get; set; } @@ -60,23 +60,23 @@ namespace SabreTools.Data.Models.NoIntroDatabase [XmlAttribute("link1")] public string? Link1 { get; set; } - /// byte + /// (0|1) "0" [XmlAttribute("link1_public")] - public string? Link1Public { get; set; } + public bool? Link1Public { get; set; } [XmlAttribute("link2")] public string? Link2 { get; set; } - /// byte + /// (0|1) "0" [XmlAttribute("link2_public")] - public string? Link2Public { get; set; } + public bool? Link2Public { get; set; } [XmlAttribute("link3")] public string? Link3 { get; set; } - /// byte + /// (0|1) "0" [XmlAttribute("link3_public")] - public string? Link3Public { get; set; } + public bool? Link3Public { get; set; } [XmlAttribute("region")] public string? Region { get; set; } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index b44e838a..d92149f8 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -951,30 +951,30 @@ namespace SabreTools.Metadata.DatFiles.Test { 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", + AppendToNumber = "appendtonumber", + Comment1 = "comment1", + Comment2 = "comment2", + DumpDate = "dumpdate", + DumpDateInfo = true, + Dumper = "dumper", + Id = "id", + Link1 = "link1", + Link1Public = true, + Link2 = "link2", + Link2Public = true, + Link3 = "link3", + Link3Public = true, + MediaTitle = "mediatitle", + Nodump = true, + Origin = "origin", + OriginalFormat = "originalformat", + Project = "project", + Region = "region", + ReleaseDate = "releasedate", + ReleaseDateInfo = true, + RomInfo = "rominfo", + Section = "section", + Tool = "tool", }; } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index c6a7932f..f8569b77 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -1204,30 +1204,30 @@ namespace SabreTools.Metadata.DatFiles.Test 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)); + Assert.Equal("appendtonumber", sourceDetails.AppendToNumber); + Assert.Equal("comment1", sourceDetails.Comment1); + Assert.Equal("comment2", sourceDetails.Comment2); + Assert.Equal("dumpdate", sourceDetails.DumpDate); + Assert.Equal(true, sourceDetails.DumpDateInfo); + Assert.Equal("dumper", sourceDetails.Dumper); + Assert.Equal("id", sourceDetails.Id); + Assert.Equal("link1", sourceDetails.Link1); + Assert.Equal(true, sourceDetails.Link1Public); + Assert.Equal("link2", sourceDetails.Link2); + Assert.Equal(true, sourceDetails.Link2Public); + Assert.Equal("link3", sourceDetails.Link3); + Assert.Equal(true, sourceDetails.Link3Public); + Assert.Equal("mediatitle", sourceDetails.MediaTitle); + Assert.Equal(true, sourceDetails.Nodump); + Assert.Equal("origin", sourceDetails.Origin); + Assert.Equal("originalformat", sourceDetails.OriginalFormat); + Assert.Equal("project", sourceDetails.Project); + Assert.Equal("region", sourceDetails.Region); + Assert.Equal("releasedate", sourceDetails.ReleaseDate); + Assert.Equal(true, sourceDetails.ReleaseDateInfo); + Assert.Equal("rominfo", sourceDetails.RomInfo); + Assert.Equal("section", sourceDetails.Section); + Assert.Equal("tool", sourceDetails.Tool); } private static void ValidateMetadataTrurip(Data.Models.Logiqx.Trurip? trurip) diff --git a/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs b/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs index 0d3f9e61..76914379 100644 --- a/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs +++ b/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs @@ -12,10 +12,154 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Fields + public string? AppendToNumber + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.AppendToNumber; + set => (_internal as Data.Models.Metadata.SourceDetails)?.AppendToNumber = value; + } + + public string? Comment1 + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Comment1; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Comment1 = value; + } + + public string? Comment2 + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Comment2; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Comment2 = value; + } + + public string? DumpDate + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.DumpDate; + set => (_internal as Data.Models.Metadata.SourceDetails)?.DumpDate = value; + } + + public bool? DumpDateInfo + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.DumpDateInfo; + set => (_internal as Data.Models.Metadata.SourceDetails)?.DumpDateInfo = value; + } + + public string? Dumper + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Dumper; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Dumper = value; + } + + public string? Id + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Id; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Id = value; + } + /// /> public override Data.Models.Metadata.ItemType ItemType => Data.Models.Metadata.ItemType.SourceDetails; + public string? Link1 + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Link1; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Link1 = value; + } + + public bool? Link1Public + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Link1Public; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Link1Public = value; + } + + public string? Link2 + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Link2; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Link2 = value; + } + + public bool? Link2Public + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Link2Public; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Link2Public = value; + } + + public string? Link3 + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Link3; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Link3 = value; + } + + public bool? Link3Public + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Link3Public; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Link3Public = value; + } + + public string? MediaTitle + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.MediaTitle; + set => (_internal as Data.Models.Metadata.SourceDetails)?.MediaTitle = value; + } + + public bool? Nodump + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Nodump; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Nodump = value; + } + + public string? Origin + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Origin; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Origin = value; + } + + public string? OriginalFormat + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.OriginalFormat; + set => (_internal as Data.Models.Metadata.SourceDetails)?.OriginalFormat = value; + } + + public string? Project + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Project; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Project = value; + } + + public string? Region + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Region; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Region = value; + } + + public string? ReleaseDate + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.ReleaseDate; + set => (_internal as Data.Models.Metadata.SourceDetails)?.ReleaseDate = value; + } + + public bool? ReleaseDateInfo + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.ReleaseDateInfo; + set => (_internal as Data.Models.Metadata.SourceDetails)?.ReleaseDateInfo = value; + } + + public string? RomInfo + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.RomInfo; + set => (_internal as Data.Models.Metadata.SourceDetails)?.RomInfo = value; + } + + public string? Section + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Section; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Section = value; + } + + public string? Tool + { + get => (_internal as Data.Models.Metadata.SourceDetails)?.Tool; + set => (_internal as Data.Models.Metadata.SourceDetails)?.Tool = value; + } + #endregion #region Constructors diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 1b3c7f9d..098aaeeb 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -849,6 +849,79 @@ namespace SabreTools.Metadata.Filter checkValue = item.Channels?.ToString(); return true; + case SourceDetails item when fieldName == "appendtonumber": + checkValue = item.AppendToNumber; + return true; + case SourceDetails item when fieldName == "comment1": + checkValue = item.Comment1; + return true; + case SourceDetails item when fieldName == "comment2": + checkValue = item.Comment2; + return true; + case SourceDetails item when fieldName == "dumpdate": + checkValue = item.DumpDate; + return true; + case SourceDetails item when fieldName == "dumpdateinfo": + checkValue = item.DumpDateInfo is null ? null : (item.DumpDateInfo == true ? "1" : "0"); + return true; + case SourceDetails item when fieldName == "dumper": + checkValue = item.Dumper; + return true; + case SourceDetails item when fieldName == "id": + checkValue = item.Id; + return true; + case SourceDetails item when fieldName == "link1": + checkValue = item.Link1; + return true; + case SourceDetails item when fieldName == "link1public": + checkValue = item.Link1Public is null ? null : (item.Link1Public == true ? "1" : "0"); + return true; + case SourceDetails item when fieldName == "link2": + checkValue = item.Link2; + return true; + case SourceDetails item when fieldName == "link2public": + checkValue = item.Link2Public is null ? null : (item.Link2Public == true ? "1" : "0"); + return true; + case SourceDetails item when fieldName == "link3": + checkValue = item.Link3; + return true; + case SourceDetails item when fieldName == "link3public": + checkValue = item.Link3Public is null ? null : (item.Link3Public == true ? "1" : "0"); + return true; + case SourceDetails item when fieldName == "mediatitle": + checkValue = item.MediaTitle; + return true; + case SourceDetails item when fieldName == "nodump": + checkValue = item.Nodump is null ? null : (item.Nodump == true ? "1" : "0"); + return true; + case SourceDetails item when fieldName == "origin": + checkValue = item.Origin; + return true; + case SourceDetails item when fieldName == "originalformat": + checkValue = item.OriginalFormat; + return true; + case SourceDetails item when fieldName == "project": + checkValue = item.Project; + return true; + case SourceDetails item when fieldName == "region": + checkValue = item.Region; + return true; + case SourceDetails item when fieldName == "releasedate": + checkValue = item.ReleaseDate; + return true; + case SourceDetails item when fieldName == "releasedateinfo": + checkValue = item.ReleaseDateInfo is null ? null : (item.ReleaseDateInfo == true ? "1" : "0"); + return true; + case SourceDetails item when fieldName == "rominfo": + checkValue = item.RomInfo; + return true; + case SourceDetails item when fieldName == "section": + checkValue = item.Section; + return true; + case SourceDetails item when fieldName == "tool": + checkValue = item.Tool; + return true; + case Video item when fieldName == "aspectx": checkValue = item.AspectX?.ToString(); return true; diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index 6c78aa89..0b82da0d 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -340,6 +340,11 @@ namespace SabreTools.Metadata if (!selfSound.Equals(otherSound)) return false; } + else if (self is SourceDetails selfSourceDetails && other is SourceDetails otherSourceDetails) + { + if (!selfSourceDetails.Equals(otherSourceDetails)) + return false; + } else if (self is Video selfVideo && other is Video otherVideo) { if (!selfVideo.Equals(otherVideo)) diff --git a/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs b/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs index f0241627..0f3cc338 100644 --- a/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs +++ b/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs @@ -145,23 +145,23 @@ namespace SabreTools.Serialization.Readers.Test Section = "XXXXXX", RomInfo = "XXXXXX", DumpDate = "XXXXXX", - DumpDateInfo = "XXXXXX", + DumpDateInfo = true, ReleaseDate = "XXXXXX", - ReleaseDateInfo = "XXXXXX", + ReleaseDateInfo = true, Dumper = "XXXXXX", Project = "XXXXXX", OriginalFormat = "XXXXXX", - Nodump = "XXXXXX", + Nodump = true, Tool = "XXXXXX", Origin = "XXXXXX", Comment1 = "XXXXXX", Comment2 = "XXXXXX", Link1 = "XXXXXX", - Link1Public = "XXXXXX", + Link1Public = true, Link2 = "XXXXXX", - Link2Public = "XXXXXX", + Link2Public = true, Link3 = "XXXXXX", - Link3Public = "XXXXXX", + Link3Public = true, Region = "XXXXXX", MediaTitle = "XXXXXX", }; @@ -361,23 +361,23 @@ namespace SabreTools.Serialization.Readers.Test Assert.Equal("XXXXXX", sourceDetails.Section); Assert.Equal("XXXXXX", sourceDetails.RomInfo); Assert.Equal("XXXXXX", sourceDetails.DumpDate); - Assert.Equal("XXXXXX", sourceDetails.DumpDateInfo); + Assert.Equal(true, sourceDetails.DumpDateInfo); Assert.Equal("XXXXXX", sourceDetails.ReleaseDate); - Assert.Equal("XXXXXX", sourceDetails.ReleaseDateInfo); + Assert.Equal(true, sourceDetails.ReleaseDateInfo); Assert.Equal("XXXXXX", sourceDetails.Dumper); Assert.Equal("XXXXXX", sourceDetails.Project); Assert.Equal("XXXXXX", sourceDetails.OriginalFormat); - Assert.Equal("XXXXXX", sourceDetails.Nodump); + Assert.Equal(true, sourceDetails.Nodump); Assert.Equal("XXXXXX", sourceDetails.Tool); Assert.Equal("XXXXXX", sourceDetails.Origin); Assert.Equal("XXXXXX", sourceDetails.Comment1); Assert.Equal("XXXXXX", sourceDetails.Comment2); Assert.Equal("XXXXXX", sourceDetails.Link1); - Assert.Equal("XXXXXX", sourceDetails.Link1Public); + Assert.Equal(true, sourceDetails.Link1Public); Assert.Equal("XXXXXX", sourceDetails.Link2); - Assert.Equal("XXXXXX", sourceDetails.Link2Public); + Assert.Equal(true, sourceDetails.Link2Public); Assert.Equal("XXXXXX", sourceDetails.Link3); - Assert.Equal("XXXXXX", sourceDetails.Link3Public); + Assert.Equal(true, sourceDetails.Link3Public); Assert.Equal("XXXXXX", sourceDetails.Region); Assert.Equal("XXXXXX", sourceDetails.MediaTitle); } diff --git a/SabreTools.Serialization.Readers/NoIntroDatabase.cs b/SabreTools.Serialization.Readers/NoIntroDatabase.cs index 1109170c..b8a5f502 100644 --- a/SabreTools.Serialization.Readers/NoIntroDatabase.cs +++ b/SabreTools.Serialization.Readers/NoIntroDatabase.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Xml; +using SabreTools.Data.Extensions; using SabreTools.Data.Models.NoIntroDatabase; namespace SabreTools.Serialization.Readers @@ -463,23 +464,23 @@ namespace SabreTools.Serialization.Readers obj.Section = reader.GetAttribute("section"); obj.RomInfo = reader.GetAttribute("rominfo"); obj.DumpDate = reader.GetAttribute("d_date"); - obj.DumpDateInfo = reader.GetAttribute("d_date_info"); + obj.DumpDateInfo = reader.GetAttribute("d_date_info").AsYesNo(); obj.ReleaseDate = reader.GetAttribute("r_date"); - obj.ReleaseDateInfo = reader.GetAttribute("r_date_info"); + obj.ReleaseDateInfo = reader.GetAttribute("r_date_info").AsYesNo(); obj.Dumper = reader.GetAttribute("dumper"); obj.Project = reader.GetAttribute("project"); obj.OriginalFormat = reader.GetAttribute("originalformat"); - obj.Nodump = reader.GetAttribute("nodump"); + obj.Nodump = reader.GetAttribute("nodump").AsYesNo(); obj.Tool = reader.GetAttribute("tool"); obj.Origin = reader.GetAttribute("origin"); obj.Comment1 = reader.GetAttribute("comment1"); obj.Comment2 = reader.GetAttribute("comment2"); obj.Link1 = reader.GetAttribute("link1"); - obj.Link1Public = reader.GetAttribute("link1_public"); + obj.Link1Public = reader.GetAttribute("link1_public").AsYesNo(); obj.Link2 = reader.GetAttribute("link2"); - obj.Link2Public = reader.GetAttribute("link2_public"); + obj.Link2Public = reader.GetAttribute("link2_public").AsYesNo(); obj.Link3 = reader.GetAttribute("link3"); - obj.Link3Public = reader.GetAttribute("link3_public"); + obj.Link3Public = reader.GetAttribute("link3_public").AsYesNo(); obj.Region = reader.GetAttribute("region"); obj.MediaTitle = reader.GetAttribute("media_title"); diff --git a/SabreTools.Serialization.Writers/NoIntroDatabase.cs b/SabreTools.Serialization.Writers/NoIntroDatabase.cs index 1c391fd8..729150f2 100644 --- a/SabreTools.Serialization.Writers/NoIntroDatabase.cs +++ b/SabreTools.Serialization.Writers/NoIntroDatabase.cs @@ -305,7 +305,7 @@ namespace SabreTools.Serialization.Writers } } - writer.WriteEndElement(); + writer.WriteEndElement(); } /// @@ -322,23 +322,29 @@ namespace SabreTools.Serialization.Writers writer.WriteOptionalAttributeString("section", obj.Section); writer.WriteOptionalAttributeString("rominfo", obj.RomInfo); writer.WriteOptionalAttributeString("d_date", obj.DumpDate); - writer.WriteOptionalAttributeString("d_date_info", obj.DumpDateInfo); + if (obj.DumpDateInfo is not null) + writer.WriteOptionalAttributeString("d_date_info", obj.DumpDateInfo.Value ? "1" : "0"); writer.WriteOptionalAttributeString("r_date", obj.ReleaseDate); - writer.WriteOptionalAttributeString("r_date_info", obj.ReleaseDateInfo); + if (obj.ReleaseDateInfo is not null) + writer.WriteOptionalAttributeString("r_date_info", obj.ReleaseDateInfo.Value ? "1" : "0"); writer.WriteOptionalAttributeString("dumper", obj.Dumper); writer.WriteOptionalAttributeString("project", obj.Project); writer.WriteOptionalAttributeString("originalformat", obj.OriginalFormat); - writer.WriteOptionalAttributeString("nodump", obj.Nodump); + if (obj.Nodump is not null) + writer.WriteOptionalAttributeString("nodump", obj.Nodump.Value ? "1" : "0"); writer.WriteOptionalAttributeString("tool", obj.Tool); writer.WriteOptionalAttributeString("origin", obj.Origin); writer.WriteOptionalAttributeString("comment1", obj.Comment1); writer.WriteOptionalAttributeString("comment2", obj.Comment2); writer.WriteOptionalAttributeString("link1", obj.Link1); - writer.WriteOptionalAttributeString("link1_public", obj.Link1Public); + if (obj.Link1Public is not null) + writer.WriteOptionalAttributeString("link1_public", obj.Link1Public.Value ? "1" : "0"); writer.WriteOptionalAttributeString("link2", obj.Link2); - writer.WriteOptionalAttributeString("link2_public", obj.Link2Public); + if (obj.Link2Public is not null) + writer.WriteOptionalAttributeString("link2_public", obj.Link2Public.Value ? "1" : "0"); writer.WriteOptionalAttributeString("link3", obj.Link3); - writer.WriteOptionalAttributeString("link3_public", obj.Link3Public); + if (obj.Link3Public is not null) + writer.WriteOptionalAttributeString("link3_public", obj.Link3Public.Value ? "1" : "0"); writer.WriteOptionalAttributeString("region", obj.Region); writer.WriteOptionalAttributeString("media_title", obj.MediaTitle);