using System; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Metadata.Filter; using MergingFlag = SabreTools.Data.Models.Metadata.MergingFlag; using NodumpFlag = SabreTools.Data.Models.Metadata.NodumpFlag; using PackingFlag = SabreTools.Data.Models.Metadata.PackingFlag; namespace SabreTools.Metadata.DatFiles { /// /// Represents all possible DAT header information /// [JsonObject("header"), XmlRoot("header")] public sealed class DatHeader : ICloneable, IEquatable { #region Properties public string? Author { get => _internal.Author; set => _internal.Author = value; } public MergingFlag BiosMode { get => _internal.BiosMode; set => _internal.BiosMode = value; } public string? Build { get => _internal.Build; set => _internal.Build = value; } public Data.Models.OfflineList.CanOpen? CanOpen { get => _internal.CanOpen; set => _internal.CanOpen = value; } [JsonIgnore] public bool CanOpenSpecified => CanOpen is not null; public string? Category { get => _internal.Category; set => _internal.Category = value; } public string? Comment { get => _internal.Comment; set => _internal.Comment = value; } public string? Date { get => _internal.Date; set => _internal.Date = value; } /// /// Read or write format /// public DatFormat? DatFormat { get; set; } public string? DatVersion { get => _internal.DatVersion; set => _internal.DatVersion = value; } public bool? Debug { get => _internal.Debug; set => _internal.Debug = value; } public string? Description { get => _internal.Description; set => _internal.Description = value; } public string? Email { get => _internal.Email; set => _internal.Email = value; } public string? EmulatorVersion { get => _internal.EmulatorVersion; set => _internal.EmulatorVersion = value; } public string? FileName { get => _internal.FileName; set => _internal.FileName = value; } public MergingFlag ForceMerging { get => _internal.ForceMerging; set => _internal.ForceMerging = value; } public NodumpFlag ForceNodump { get => _internal.ForceNodump; set => _internal.ForceNodump = value; } public PackingFlag ForcePacking { get => _internal.ForcePacking; set => _internal.ForcePacking = value; } public bool? ForceZipping { get => _internal.ForceZipping; set => _internal.ForceZipping = value; } public string[]? HeaderRow { get => _internal.HeaderRow; set => _internal.HeaderRow = value; } public string? HeaderSkipper { get => _internal.HeaderSkipper; set => _internal.HeaderSkipper = value; } public string? Homepage { get => _internal.Homepage; set => _internal.Homepage = value; } public string? Id { get => _internal.Id; set => _internal.Id = value; } public Data.Models.OfflineList.Images? Images { get => _internal.Images; set => _internal.Images = value; } [JsonIgnore] public bool ImagesSpecified => Images is not null; public string? ImFolder { get => _internal.ImFolder; set => _internal.ImFolder = value; } public Data.Models.OfflineList.Infos? Infos { get => _internal.Infos; set => _internal.Infos = value; } [JsonIgnore] public bool InfosSpecified => Infos is not null; public bool? LockBiosMode { get => _internal.LockBiosMode; set => _internal.LockBiosMode = value; } public bool? LockRomMode { get => _internal.LockRomMode; set => _internal.LockRomMode = value; } public bool? LockSampleMode { get => _internal.LockSampleMode; set => _internal.LockSampleMode = value; } public string? MameConfig { get => _internal.MameConfig; set => _internal.MameConfig = value; } public string? Name { get => _internal.Name; set => _internal.Name = value; } public Data.Models.OfflineList.NewDat? NewDat { get => _internal.NewDat; set => _internal.NewDat = value; } [JsonIgnore] public bool NewDatSpecified => NewDat is not null; public string? Notes { get => _internal.Notes; set => _internal.Notes = value; } public string? Plugin { get => _internal.Plugin; set => _internal.Plugin = value; } public string? RefName { get => _internal.RefName; set => _internal.RefName = value; } public MergingFlag RomMode { get => _internal.RomMode; set => _internal.RomMode = value; } public string? RomTitle { get => _internal.RomTitle; set => _internal.RomTitle = value; } public string? RootDir { get => _internal.RootDir; set => _internal.RootDir = value; } public MergingFlag SampleMode { get => _internal.SampleMode; set => _internal.SampleMode = value; } public string? SchemaLocation { get => _internal.SchemaLocation; set => _internal.SchemaLocation = value; } public string? ScreenshotsHeight { get => _internal.ScreenshotsHeight; set => _internal.ScreenshotsHeight = value; } public string? ScreenshotsWidth { get => _internal.ScreenshotsWidth; set => _internal.ScreenshotsWidth = value; } public Data.Models.OfflineList.Search? Search { get => _internal.Search; set => _internal.Search = value; } [JsonIgnore] public bool SearchSpecified => Search is not null; public string? System { get => _internal.System; set => _internal.System = value; } public string? Timestamp { get => _internal.Timestamp; set => _internal.Timestamp = value; } public string? Type { get => _internal.Type; set => _internal.Type = value; } public string? Url { get => _internal.Url; set => _internal.Url = value; } public string? Version { get => _internal.Version; set => _internal.Version = value; } #endregion #region Private Fields /// /// Internal model /// private readonly Data.Models.Metadata.Header _internal; #endregion #region Constructors public DatHeader() { _internal = new(); } public DatHeader(Data.Models.Metadata.Header header) { _internal = header; } #endregion #region Cloning Methods /// /// Clone the current header /// public object Clone() => new DatHeader(GetInternalClone()) { DatFormat = DatFormat, }; /// /// Clone just the format from the current header /// public DatHeader CloneFormat() { var header = new DatHeader(); header.DatFormat = DatFormat; return header; } /// /// Get a clone of the current internal model /// public Data.Models.Metadata.Header GetInternalClone() { var header = (_internal.Clone() as Data.Models.Metadata.Header)!; // Convert subheader values if (CanOpenSpecified) header.CanOpen = CanOpen; if (ImagesSpecified) header.Images = Images; if (InfosSpecified) header.Infos = Infos; if (NewDatSpecified) header.NewDat = NewDat; if (SearchSpecified) header.Search = Search; return header; } #endregion #region Comparision Methods /// public bool Equals(DatHeader? other) { // If other is null if (other is null) return false; // Compare internal models return _internal.Equals(other._internal); } #endregion #region Manipulation /// /// Runs a filter and determines if it passes or not /// /// Filter runner to use for checking /// True if the Machine passes the filter, false otherwise public bool PassesFilter(FilterRunner filterRunner) => filterRunner.Run(_internal); #endregion } }