From 7d974d4464ca3a42b4051236a4407172228bfe90 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sun, 10 Mar 2024 04:10:37 -0400 Subject: [PATCH] Convert DatHeader to internal models --- RombaSharp/Features/Diffdat.cs | 4 +- RombaSharp/Features/Dir2Dat.cs | 4 +- RombaSharp/Features/RefreshDats.cs | 2 +- .../DatFile.MetadataConverter.cs | 11 +- SabreTools.DatFiles/DatFile.cs | 14 +- SabreTools.DatFiles/DatHeader.cs | 668 ++++++------------ .../Formats/ClrMamePro.Reader.cs | 53 +- .../Formats/ClrMamePro.Writer.cs | 32 +- .../Formats/DosCenter.Reader.cs | 26 +- .../Formats/DosCenter.Writer.cs | 14 +- SabreTools.DatFiles/Formats/Listxml.Reader.cs | 22 +- SabreTools.DatFiles/Formats/Listxml.Writer.cs | 8 +- SabreTools.DatFiles/Formats/Logiqx.Reader.cs | 91 ++- SabreTools.DatFiles/Formats/Logiqx.Writer.cs | 96 +-- .../Formats/OfflineList.Reader.cs | 32 +- .../Formats/OfflineList.Writer.cs | 28 +- SabreTools.DatFiles/Formats/OpenMSX.Reader.cs | 9 +- SabreTools.DatFiles/Formats/OpenMSX.Writer.cs | 2 +- .../Formats/RomCenter.Reader.cs | 42 +- .../Formats/RomCenter.Writer.cs | 26 +- .../Formats/SeparatedValue.Writer.cs | 12 +- .../Formats/SoftwareList.Reader.cs | 16 +- .../Formats/SoftwareList.Writer.cs | 6 +- SabreTools.DatTools/DatFileTool.cs | 36 +- SabreTools.DatTools/DatFromDir.cs | 8 +- SabreTools.DatTools/Rebuilder.cs | 14 +- SabreTools.DatTools/Splitter.cs | 76 +- SabreTools.DatTools/Verification.cs | 8 +- SabreTools.DatTools/Writer.cs | 47 +- SabreTools.Filtering/Cleaner.cs | 2 +- SabreTools.Filtering/Splitter.cs | 2 +- SabreTools/Features/BaseFeature.cs | 45 +- SabreTools/Features/DatFromDir.cs | 2 +- SabreTools/Features/Sort.cs | 17 +- SabreTools/Features/Update.cs | 40 +- SabreTools/Features/Verify.cs | 8 +- 36 files changed, 697 insertions(+), 826 deletions(-) diff --git a/RombaSharp/Features/Diffdat.cs b/RombaSharp/Features/Diffdat.cs index b1b01581..1071fddb 100644 --- a/RombaSharp/Features/Diffdat.cs +++ b/RombaSharp/Features/Diffdat.cs @@ -62,8 +62,8 @@ in -old DAT file. Ignores those entries in -old that are not in -new."; // Create the encapsulating datfile DatFile datfile = DatFile.Create(); - datfile.Header.Name = name; - datfile.Header.Description = description; + datfile.Header.SetFieldValue(SabreTools.Models.Metadata.Header.NameKey, name); + datfile.Header.SetFieldValue(SabreTools.Models.Metadata.Header.DescriptionKey, description); Parser.ParseInto(datfile, olddat); // Diff against the new datfile diff --git a/RombaSharp/Features/Dir2Dat.cs b/RombaSharp/Features/Dir2Dat.cs index 89d43365..f7ee6adf 100644 --- a/RombaSharp/Features/Dir2Dat.cs +++ b/RombaSharp/Features/Dir2Dat.cs @@ -55,8 +55,8 @@ namespace RombaSharp.Features // Create and write the encapsulating datfile DatFile datfile = DatFile.Create(); - datfile.Header.Name = string.IsNullOrWhiteSpace(name) ? "untitled" : name; - datfile.Header.Description = description; + datfile.Header.SetFieldValue(SabreTools.Models.Metadata.Header.NameKey, string.IsNullOrWhiteSpace(name) ? "untitled" : name); + datfile.Header.SetFieldValue(SabreTools.Models.Metadata.Header.DescriptionKey, description); DatFromDir.PopulateFromDir(datfile, source, asFiles: TreatAsFile.NonArchive, hashes: [HashType.CRC32, HashType.MD5, HashType.SHA1]); Writer.Write(datfile, outdat!); return true; diff --git a/RombaSharp/Features/RefreshDats.cs b/RombaSharp/Features/RefreshDats.cs index e4d36ff0..8d7a8602 100644 --- a/RombaSharp/Features/RefreshDats.cs +++ b/RombaSharp/Features/RefreshDats.cs @@ -69,7 +69,7 @@ contents of any changed dats."; // First get a list of SHA-1's from the input DATs DatFile datroot = DatFile.Create(); - datroot.Header.Type = "SuperDAT"; + datroot.Header.SetFieldValue(SabreTools.Models.Metadata.Header.TypeKey, "SuperDAT"); DatFromDir.PopulateFromDir(datroot, _dats, asFiles: TreatAsFile.NonArchive, hashes: [HashType.CRC32, HashType.MD5, HashType.SHA1]); datroot.Items.BucketBy(ItemKey.SHA1, DedupeType.None); diff --git a/SabreTools.DatFiles/DatFile.MetadataConverter.cs b/SabreTools.DatFiles/DatFile.MetadataConverter.cs index c3ad7ce8..75fac762 100644 --- a/SabreTools.DatFiles/DatFile.MetadataConverter.cs +++ b/SabreTools.DatFiles/DatFile.MetadataConverter.cs @@ -35,10 +35,19 @@ namespace SabreTools.DatFiles } } + /// + /// Convert header information + /// + /// Header to convert + private void ConvertHeader(Models.Metadata.Header? item) + { + + } + /// /// Convert machine information /// - /// Metadata file to convert + /// Machine to convert /// Name of the file to be parsed /// Index ID for the DAT /// True to only add item statistics while parsing, false otherwise diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs index d25f44c2..2587f86c 100644 --- a/SabreTools.DatFiles/DatFile.cs +++ b/SabreTools.DatFiles/DatFile.cs @@ -128,23 +128,23 @@ namespace SabreTools.DatFiles public void FillHeaderFromPath(string path, bool bare) { // If the description is defined but not the name, set the name from the description - if (string.IsNullOrEmpty(Header.Name) && !string.IsNullOrEmpty(Header.Description)) + if (string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.NameKey)) && !string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) { - Header.Name = Header.Description; + Header.SetFieldValue(Models.Metadata.Header.NameKey, Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)); } // If the name is defined but not the description, set the description from the name - else if (!string.IsNullOrEmpty(Header.Name) && string.IsNullOrEmpty(Header.Description)) + else if (!string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) { - Header.Description = Header.Name + (bare ? string.Empty : $" ({Header.Date})"); + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, Header.GetFieldValue(Models.Metadata.Header.NameKey) + (bare ? string.Empty : $" ({Header.GetFieldValue(Models.Metadata.Header.DateKey)})")); } // If neither the name or description are defined, set them from the automatic values - else if (string.IsNullOrEmpty(Header.Name) && string.IsNullOrEmpty(Header.Description)) + else if (string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) { string[] splitpath = path.TrimEnd(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); - Header.Name = splitpath.Last(); - Header.Description = Header.Name + (bare ? string.Empty : $" ({Header.Date})"); + Header.SetFieldValue(Models.Metadata.Header.NameKey, splitpath.Last()); + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, Header.GetFieldValue(Models.Metadata.Header.NameKey) + (bare ? string.Empty : $" ({Header.GetFieldValue(Models.Metadata.Header.DateKey)})")); } } diff --git a/SabreTools.DatFiles/DatHeader.cs b/SabreTools.DatFiles/DatHeader.cs index 0bbfc65c..bb2b00d5 100644 --- a/SabreTools.DatFiles/DatHeader.cs +++ b/SabreTools.DatFiles/DatHeader.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; @@ -18,8 +17,6 @@ namespace SabreTools.DatFiles { #region Fields - #region Common - /// /// External name of the DAT /// @@ -27,246 +24,31 @@ namespace SabreTools.DatFiles [XmlElement("filename")] public string? FileName { get; set; } - /// - /// Internal name of the DAT - /// - [JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Include)] - [XmlElement("name")] - public string? Name { get; set; } - - /// - /// DAT description - /// - [JsonProperty("description", DefaultValueHandling = DefaultValueHandling.Include)] - [XmlElement("description")] - public string? Description { get; set; } - - /// - /// Root directory for the files; currently TruRip/EmuARC-exclusive - /// - [JsonProperty("rootdir", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("rootdir")] - public string? RootDir { get; set; } - - /// - /// General category of items found in the DAT - /// - [JsonProperty("category", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("category")] - public string? Category { get; set; } - - /// - /// Version of the DAT - /// - [JsonProperty("version", DefaultValueHandling = DefaultValueHandling.Include)] - [XmlElement("version")] - public string? Version { get; set; } - - /// - /// Creation or modification date - /// - [JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("date")] - public string? Date { get; set; } - - /// - /// List of authors who contributed to the DAT - /// - [JsonProperty("author", DefaultValueHandling = DefaultValueHandling.Include)] - [XmlElement("author")] - public string? Author { get; set; } - - /// - /// Email address for DAT author(s) - /// - [JsonProperty("email", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("email")] - public string? Email { get; set; } - - /// - /// Author or distribution homepage name - /// - [JsonProperty("homepage", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("homepage")] - public string? Homepage { get; set; } - - /// - /// Author or distribution URL - /// - [JsonProperty("url", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("url")] - public string? Url { get; set; } - - /// - /// Any comment that does not already fit an existing field - /// - [JsonProperty("comment", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("comment")] - public string? Comment { get; set; } - - /// - /// Header skipper to be used when loading the DAT - /// - [JsonProperty("header", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("header")] - public string? HeaderSkipper { get; set; } - - /// - /// Classification of the DAT. Generally only used for SuperDAT - /// - [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("type")] - public string? Type { get; set; } - - /// - /// Force a merging style when loaded - /// - [JsonProperty("forcemerging", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("forcemerging")] - public MergingFlag ForceMerging { get; set; } - - [JsonIgnore] - public bool ForceMergingSpecified { get { return ForceMerging != MergingFlag.None; } } - - /// - /// Force nodump handling when loaded - /// - [JsonProperty("forcenodump", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("forcenodump")] - public NodumpFlag ForceNodump { get; set; } - - [JsonIgnore] - public bool ForceNodumpSpecified { get { return ForceNodump != NodumpFlag.None; } } - - /// - /// Force output packing when loaded - /// - [JsonProperty("forcepacking", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("forcepacking")] - public PackingFlag ForcePacking { get; set; } - - [JsonIgnore] - public bool ForcePackingSpecified { get { return ForcePacking != PackingFlag.None; } } - /// /// Read or write format /// [JsonIgnore, XmlIgnore] public DatFormat DatFormat { get; set; } - #endregion - - #region ListXML - - /// - /// Debug build flag - /// - /// Also in Logiqx - [JsonProperty("debug", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("debug")] - public bool? Debug { get; set; } = null; + [JsonIgnore] + public bool InfosSpecified + { + get + { + var infos = GetFieldValue(Models.Metadata.Header.InfosKey); + return infos != null && infos.Length > 0; + } + } [JsonIgnore] - public bool DebugSpecified { get { return Debug != null; } } - - /// - /// MAME configuration name - /// - [JsonProperty("mameconfig", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("mameconfig")] - public string? MameConfig { get; set; } - - #endregion - - #region Logiqx - - /// - /// No-Intro system ID - /// - [JsonProperty("nointroid", DefaultValueHandling = DefaultValueHandling.Include)] - [XmlElement("nointroid")] - public string? NoIntroID { get; set; } - - /// - /// Build version - /// - [JsonProperty("build", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("build")] - public string? Build { get; set; } - - /// - /// Logiqx/RomCenter plugin, OfflineList System - /// - [JsonProperty("system", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("system")] - public string? System { get; set; } - - /// - /// RomCenter rom mode - /// - /// (merged|split|unmerged) "split" - [JsonProperty("rommode", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("rommode")] - public MergingFlag RomMode { get; set; } - - [JsonIgnore] - public bool RomModeSpecified { get { return RomMode != MergingFlag.None; } } - - /// - /// RomCenter bios mode - /// - /// (merged|split|unmerged) "split" - [JsonProperty("biosmode", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("biosmode")] - public MergingFlag BiosMode { get; set; } - - [JsonIgnore] - public bool BiosModeSpecified { get { return BiosMode != MergingFlag.None; } } - - /// - /// RomCenter sample mode - /// - /// (merged|unmerged) "merged" - [JsonProperty("samplemode", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("samplemode")] - public MergingFlag SampleMode { get; set; } - - [JsonIgnore] - public bool SampleModeSpecified { get { return SampleMode != MergingFlag.None; } } - - /// - /// RomCenter lock rom mode - /// - [JsonProperty("lockrommode", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("lockrommode")] - public bool? LockRomMode { get; set; } - - [JsonIgnore] - public bool LockRomModeSpecified { get { return LockRomMode != null; } } - - /// - /// RomCenter lock bios mode - /// - [JsonProperty("lockbiosmode", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("lockbiosmode")] - public bool? LockBiosMode { get; set; } - - [JsonIgnore] - public bool LockBiosModeSpecified { get { return LockBiosMode != null; } } - - /// - /// RomCenter lock sample mode - /// - [JsonProperty("locksamplemode", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("locksamplemode")] - public bool? LockSampleMode { get; set; } - - [JsonIgnore] - public bool LockSampleModeSpecified { get { return LockSampleMode != null; } } - - #endregion - - #region Missfile + public bool CanOpenSpecified + { + get + { + var canOpen = GetFieldValue(Models.Metadata.Header.CanOpenKey); + return canOpen != null && canOpen.Length > 0; + } + } /// /// Output the item name @@ -274,72 +56,6 @@ namespace SabreTools.DatFiles [JsonIgnore, XmlIgnore] public bool UseRomName { get; set; } - #endregion - - #region OfflineList - - /// - /// Screenshots width - /// - [JsonProperty("screenshotswidth", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("screenshotswidth")] - public string? ScreenshotsWidth { get; set; } - - /// - /// Screenshots height - /// - [JsonProperty("screenshotsheight", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("screenshotsheight")] - public string? ScreenshotsHeight { get; set; } - - /// - /// OfflineList info list - /// - [JsonProperty("infos", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("infos")] - public List? Infos { get; set; } - - [JsonIgnore] - public bool InfosSpecified { get { return Infos != null && Infos.Count > 0; } } - - /// - /// OfflineList can-open extensions - /// - [JsonProperty("canopen", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("canopen")] - public List? CanOpen { get; set; } - - [JsonIgnore] - public bool CanOpenSpecified { get { return CanOpen != null && CanOpen.Count > 0; } } - - // TODO: Implement the following header values: - // - newdat.datversionurl (currently reads and writes to Header.Url, not strictly correct) - // - newdat.daturl (currently writes to Header.Url, not strictly correct) - // - newdat.daturl[fileName] (currently writes to Header.FileName + ".zip", not strictly correct) - // - newdat.imurl (currently writes to Header.Url, not strictly correct) - // - search[...].to.find[operation, value (Int32?)] - // - search[...].to[value, default (true|false), auto (true, false)] - - /// - /// Rom title - /// - [JsonProperty("romtitle", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("romtitle")] - public string? RomTitle { get; set; } - - #endregion - - #region RomCenter - - /// - /// RomCenter DAT format version - /// - [JsonProperty("rcversion", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("rcversion")] - public string? RomCenterVersion { get; set; } - - #endregion - #region Write pre-processing /// @@ -402,10 +118,54 @@ namespace SabreTools.DatFiles #endregion + /// + /// Internal Header model + /// + [JsonIgnore] + private Models.Metadata.Header _header = []; + #endregion #region Instance Methods + #region Accessors + + /// + /// Get the value from a field based on the type provided + /// + /// Type of the value to get from the internal model + /// Field to retrieve + /// Value from the field, if possible + public T? GetFieldValue(string? fieldName) + { + // Invalid field cannot be processed + if (string.IsNullOrEmpty(fieldName)) + return default; + + // Get the value based on the type + return _header.Read(fieldName!); + } + + /// + /// Set the value from a field based on the type provided + /// + /// Type of the value to set in the internal model + /// Field to set + /// Value to set + /// True if the value was set, false otherwise + public bool SetFieldValue(string? fieldName, T? value) + { + // Invalid field cannot be processed + if (string.IsNullOrEmpty(fieldName)) + return false; + + // Set the value based on the type + _header[fieldName!] = value; + return true; + } + + #endregion + #region Cloning Methods /// @@ -413,48 +173,11 @@ namespace SabreTools.DatFiles /// public object Clone() { - return new DatHeader() + var header = new DatHeader() { FileName = this.FileName, - Name = this.Name, - Description = this.Description, - RootDir = this.RootDir, - Category = this.Category, - Version = this.Version, - Date = this.Date, - Author = this.Author, - Email = this.Email, - Homepage = this.Homepage, - Url = this.Url, - Comment = this.Comment, - HeaderSkipper = this.HeaderSkipper, - Type = this.Type, - ForceMerging = this.ForceMerging, - ForceNodump = this.ForceNodump, - ForcePacking = this.ForcePacking, DatFormat = this.DatFormat, - Debug = this.Debug, - MameConfig = this.MameConfig, - - NoIntroID = this.NoIntroID, - Build = this.Build, - System = this.System, - RomMode = this.RomMode, - BiosMode = this.BiosMode, - SampleMode = this.SampleMode, - LockRomMode = this.LockRomMode, - LockBiosMode = this.LockBiosMode, - LockSampleMode = this.LockSampleMode, - - ScreenshotsWidth = this.ScreenshotsWidth, - ScreenshotsHeight = this.ScreenshotsHeight, - Infos = this.Infos, // TODO: Perform a deep clone - CanOpen = this.CanOpen, // TODO: Perform a deep clone - RomTitle = this.RomTitle, - - RomCenterVersion = this.RomCenterVersion, - UseRomName = this.UseRomName, Prefix = this.Prefix, Postfix = this.Postfix, @@ -466,6 +189,41 @@ namespace SabreTools.DatFiles InputDepot = this.InputDepot?.Clone() as DepotInformation, OutputDepot = this.OutputDepot?.Clone() as DepotInformation, }; + header.SetFieldValue(Models.Metadata.Header.AuthorKey, GetFieldValue(Models.Metadata.Header.AuthorKey)); + header.SetFieldValue(Models.Metadata.Header.BiosModeKey, GetFieldValue(Models.Metadata.Header.BiosModeKey)); + header.SetFieldValue(Models.Metadata.Header.BuildKey, GetFieldValue(Models.Metadata.Header.BuildKey)); + header.SetFieldValue(Models.Metadata.Header.CanOpenKey, GetFieldValue(Models.Metadata.Header.CanOpenKey)); // TODO: Perform a deep clone + header.SetFieldValue(Models.Metadata.Header.CategoryKey, GetFieldValue(Models.Metadata.Header.CategoryKey)); + header.SetFieldValue(Models.Metadata.Header.CommentKey, GetFieldValue(Models.Metadata.Header.CommentKey)); + header.SetFieldValue(Models.Metadata.Header.DateKey, GetFieldValue(Models.Metadata.Header.DateKey)); + header.SetFieldValue(Models.Metadata.Header.DatVersionKey, GetFieldValue(Models.Metadata.Header.DatVersionKey)); + header.SetFieldValue(Models.Metadata.Header.DebugKey, GetFieldValue(Models.Metadata.Header.DebugKey)); + header.SetFieldValue(Models.Metadata.Header.DescriptionKey, GetFieldValue(Models.Metadata.Header.DescriptionKey)); + header.SetFieldValue(Models.Metadata.Header.EmailKey, GetFieldValue(Models.Metadata.Header.EmailKey)); + header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, GetFieldValue(Models.Metadata.Header.ForceMergingKey)); + header.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, GetFieldValue(Models.Metadata.Header.ForceNodumpKey)); + header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, GetFieldValue(Models.Metadata.Header.ForcePackingKey)); + header.SetFieldValue(Models.Metadata.Header.HeaderKey, GetFieldValue(Models.Metadata.Header.HeaderKey)); + header.SetFieldValue(Models.Metadata.Header.HomepageKey, GetFieldValue(Models.Metadata.Header.HomepageKey)); + header.SetFieldValue(Models.Metadata.Header.IdKey, GetFieldValue(Models.Metadata.Header.IdKey)); + header.SetFieldValue(Models.Metadata.Header.InfosKey, GetFieldValue(Models.Metadata.Header.InfosKey)); // TODO: Perform a deep clone + header.SetFieldValue(Models.Metadata.Header.LockBiosModeKey, GetFieldValue(Models.Metadata.Header.LockBiosModeKey)); + header.SetFieldValue(Models.Metadata.Header.LockRomModeKey, GetFieldValue(Models.Metadata.Header.LockRomModeKey)); + header.SetFieldValue(Models.Metadata.Header.LockSampleModeKey, GetFieldValue(Models.Metadata.Header.LockSampleModeKey)); + header.SetFieldValue(Models.Metadata.Header.MameConfigKey, GetFieldValue(Models.Metadata.Header.MameConfigKey)); + header.SetFieldValue(Models.Metadata.Header.NameKey, GetFieldValue(Models.Metadata.Header.NameKey)); + header.SetFieldValue(Models.Metadata.Header.RomTitleKey, GetFieldValue(Models.Metadata.Header.RomTitleKey)); + header.SetFieldValue(Models.Metadata.Header.RomModeKey, GetFieldValue(Models.Metadata.Header.RomModeKey)); + header.SetFieldValue(Models.Metadata.Header.RootDirKey, GetFieldValue(Models.Metadata.Header.RootDirKey)); + header.SetFieldValue(Models.Metadata.Header.SampleModeKey, GetFieldValue(Models.Metadata.Header.SampleModeKey)); + header.SetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey, GetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey)); + header.SetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey, GetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey)); + header.SetFieldValue(Models.Metadata.Header.SystemKey, GetFieldValue(Models.Metadata.Header.SystemKey)); + header.SetFieldValue(Models.Metadata.Header.TypeKey, GetFieldValue(Models.Metadata.Header.TypeKey)); + header.SetFieldValue(Models.Metadata.Header.UrlKey, GetFieldValue(Models.Metadata.Header.UrlKey)); + header.SetFieldValue(Models.Metadata.Header.VersionKey, GetFieldValue(Models.Metadata.Header.VersionKey)); + + return header; } /// @@ -473,27 +231,29 @@ namespace SabreTools.DatFiles /// public DatHeader CloneStandard() { - return new DatHeader() + var header = new DatHeader() { FileName = this.FileName, - Name = this.Name, - Description = this.Description, - RootDir = this.RootDir, - Category = this.Category, - Version = this.Version, - Date = this.Date, - Author = this.Author, - Email = this.Email, - Homepage = this.Homepage, - Url = this.Url, - Comment = this.Comment, - HeaderSkipper = this.HeaderSkipper, - Type = this.Type, - ForceMerging = this.ForceMerging, - ForceNodump = this.ForceNodump, - ForcePacking = this.ForcePacking, DatFormat = this.DatFormat, }; + header.SetFieldValue(Models.Metadata.Header.AuthorKey, GetFieldValue(Models.Metadata.Header.AuthorKey)); + header.SetFieldValue(Models.Metadata.Header.CategoryKey, GetFieldValue(Models.Metadata.Header.CategoryKey)); + header.SetFieldValue(Models.Metadata.Header.CommentKey, GetFieldValue(Models.Metadata.Header.CommentKey)); + header.SetFieldValue(Models.Metadata.Header.DateKey, GetFieldValue(Models.Metadata.Header.DateKey)); + header.SetFieldValue(Models.Metadata.Header.DescriptionKey, GetFieldValue(Models.Metadata.Header.DescriptionKey)); + header.SetFieldValue(Models.Metadata.Header.EmailKey, GetFieldValue(Models.Metadata.Header.EmailKey)); + header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, GetFieldValue(Models.Metadata.Header.ForceMergingKey)); + header.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, GetFieldValue(Models.Metadata.Header.ForceNodumpKey)); + header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, GetFieldValue(Models.Metadata.Header.ForcePackingKey)); + header.SetFieldValue(Models.Metadata.Header.HeaderKey, GetFieldValue(Models.Metadata.Header.HeaderKey)); + header.SetFieldValue(Models.Metadata.Header.HomepageKey, GetFieldValue(Models.Metadata.Header.HomepageKey)); + header.SetFieldValue(Models.Metadata.Header.NameKey, GetFieldValue(Models.Metadata.Header.NameKey)); + header.SetFieldValue(Models.Metadata.Header.RootDirKey, GetFieldValue(Models.Metadata.Header.RootDirKey)); + header.SetFieldValue(Models.Metadata.Header.TypeKey, GetFieldValue(Models.Metadata.Header.TypeKey)); + header.SetFieldValue(Models.Metadata.Header.UrlKey, GetFieldValue(Models.Metadata.Header.UrlKey)); + header.SetFieldValue(Models.Metadata.Header.VersionKey, GetFieldValue(Models.Metadata.Header.VersionKey)); + + return header; } /// @@ -530,53 +290,53 @@ namespace SabreTools.DatFiles if (!string.IsNullOrEmpty(datHeader.FileName)) FileName = datHeader.FileName; - if (!string.IsNullOrEmpty(datHeader.Name)) - Name = datHeader.Name; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.NameKey))) + SetFieldValue(Models.Metadata.Header.NameKey, datHeader.GetFieldValue(Models.Metadata.Header.NameKey)); - if (!string.IsNullOrEmpty(datHeader.Description)) - Description = datHeader.Description; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + SetFieldValue(Models.Metadata.Header.DescriptionKey, datHeader.GetFieldValue(Models.Metadata.Header.DescriptionKey)); - if (!string.IsNullOrEmpty(datHeader.RootDir)) - RootDir = datHeader.RootDir; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.RootDirKey))) + SetFieldValue(Models.Metadata.Header.RootDirKey, datHeader.GetFieldValue(Models.Metadata.Header.RootDirKey)); - if (!string.IsNullOrEmpty(datHeader.Category)) - Category = datHeader.Category; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.CategoryKey))) + SetFieldValue(Models.Metadata.Header.CategoryKey, datHeader.GetFieldValue(Models.Metadata.Header.CategoryKey)); - if (!string.IsNullOrEmpty(datHeader.Version)) - Version = datHeader.Version; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.VersionKey))) + SetFieldValue(Models.Metadata.Header.VersionKey, datHeader.GetFieldValue(Models.Metadata.Header.VersionKey)); - if (!string.IsNullOrEmpty(datHeader.Date)) - Date = datHeader.Date; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.DateKey))) + SetFieldValue(Models.Metadata.Header.DateKey, datHeader.GetFieldValue(Models.Metadata.Header.DateKey)); - if (!string.IsNullOrEmpty(datHeader.Author)) - Author = datHeader.Author; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.AuthorKey))) + SetFieldValue(Models.Metadata.Header.AuthorKey, datHeader.GetFieldValue(Models.Metadata.Header.AuthorKey)); - if (!string.IsNullOrEmpty(datHeader.Email)) - Email = datHeader.Email; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.EmailKey))) + SetFieldValue(Models.Metadata.Header.EmailKey, datHeader.GetFieldValue(Models.Metadata.Header.EmailKey)); - if (!string.IsNullOrEmpty(datHeader.Homepage)) - Homepage = datHeader.Homepage; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.HomepageKey))) + SetFieldValue(Models.Metadata.Header.HomepageKey, datHeader.GetFieldValue(Models.Metadata.Header.HomepageKey)); - if (!string.IsNullOrEmpty(datHeader.Url)) - Url = datHeader.Url; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.UrlKey))) + SetFieldValue(Models.Metadata.Header.UrlKey, datHeader.GetFieldValue(Models.Metadata.Header.UrlKey)); - if (!string.IsNullOrEmpty(datHeader.Comment)) - Comment = datHeader.Comment; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.CommentKey))) + SetFieldValue(Models.Metadata.Header.CommentKey, datHeader.GetFieldValue(Models.Metadata.Header.CommentKey)); - if (!string.IsNullOrEmpty(datHeader.HeaderSkipper)) - HeaderSkipper = datHeader.HeaderSkipper; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.HeaderKey))) + SetFieldValue(Models.Metadata.Header.HeaderKey, datHeader.GetFieldValue(Models.Metadata.Header.HeaderKey)); - if (!string.IsNullOrEmpty(datHeader.Type)) - Type = datHeader.Type; + if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.TypeKey))) + SetFieldValue(Models.Metadata.Header.TypeKey, datHeader.GetFieldValue(Models.Metadata.Header.TypeKey)); - if (datHeader.ForceMerging != MergingFlag.None) - ForceMerging = datHeader.ForceMerging; + if (datHeader.GetFieldValue(Models.Metadata.Header.ForceMergingKey) != MergingFlag.None) + SetFieldValue(Models.Metadata.Header.ForceMergingKey, datHeader.GetFieldValue(Models.Metadata.Header.ForceMergingKey)); - if (datHeader.ForceNodump != NodumpFlag.None) - ForceNodump = datHeader.ForceNodump; + if (datHeader.GetFieldValue(Models.Metadata.Header.ForceNodumpKey) != NodumpFlag.None) + SetFieldValue(Models.Metadata.Header.ForceNodumpKey, datHeader.GetFieldValue(Models.Metadata.Header.ForceNodumpKey)); - if (datHeader.ForcePacking != PackingFlag.None) - ForcePacking = datHeader.ForcePacking; + if (datHeader.GetFieldValue(Models.Metadata.Header.ForcePackingKey) != PackingFlag.None) + SetFieldValue(Models.Metadata.Header.ForcePackingKey, datHeader.GetFieldValue(Models.Metadata.Header.ForcePackingKey)); if (datHeader.DatFormat != 0x00) DatFormat = datHeader.DatFormat; @@ -605,7 +365,7 @@ namespace SabreTools.DatFiles #region Manipulation - //// + /// /// Remove a field from the header /// /// Field to remove @@ -615,43 +375,43 @@ namespace SabreTools.DatFiles DatHeaderField datHeaderField = fieldName.AsDatHeaderField(); switch (datHeaderField) { - case DatHeaderField.Author: Author = null; break; - case DatHeaderField.BiosMode: BiosMode = MergingFlag.None; break; - case DatHeaderField.Build: Build = null; break; - case DatHeaderField.CanOpen: CanOpen = null; break; - case DatHeaderField.Category: Category = null; break; - case DatHeaderField.Comment: Comment = null; break; - case DatHeaderField.Date: Date = null; break; - case DatHeaderField.Debug: Debug = null; break; - case DatHeaderField.Description: Description = null; break; - case DatHeaderField.Email: Email = null; break; + case DatHeaderField.Author: SetFieldValue(Models.Metadata.Header.AuthorKey, null); break; + case DatHeaderField.BiosMode: SetFieldValue(Models.Metadata.Header.BiosModeKey, MergingFlag.None); break; + case DatHeaderField.Build: SetFieldValue(Models.Metadata.Header.BuildKey, null); break; + case DatHeaderField.CanOpen: SetFieldValue(Models.Metadata.Header.CanOpenKey, null); break; + case DatHeaderField.Category: SetFieldValue(Models.Metadata.Header.CategoryKey, null); break; + case DatHeaderField.Comment: SetFieldValue(Models.Metadata.Header.CommentKey, null); break; + case DatHeaderField.Date: SetFieldValue(Models.Metadata.Header.DateKey, null); break; + case DatHeaderField.Debug: SetFieldValue(Models.Metadata.Header.DebugKey, null); break; + case DatHeaderField.Description: SetFieldValue(Models.Metadata.Header.DescriptionKey, null); break; + case DatHeaderField.Email: SetFieldValue(Models.Metadata.Header.EmailKey, null); break; case DatHeaderField.FileName: FileName = null; break; - case DatHeaderField.ForceMerging: ForceMerging = MergingFlag.None; break; - case DatHeaderField.ForceNodump: ForceNodump = NodumpFlag.None; break; - case DatHeaderField.ForcePacking: ForcePacking = PackingFlag.None; break; - case DatHeaderField.HeaderSkipper: HeaderSkipper = null; break; - case DatHeaderField.Homepage: Homepage = null; break; - case DatHeaderField.ID: NoIntroID = null; break; + case DatHeaderField.ForceMerging: SetFieldValue(Models.Metadata.Header.ForceMergingKey, MergingFlag.None); break; + case DatHeaderField.ForceNodump: SetFieldValue(Models.Metadata.Header.ForceNodumpKey, NodumpFlag.None); break; + case DatHeaderField.ForcePacking: SetFieldValue(Models.Metadata.Header.ForcePackingKey, PackingFlag.None); break; + case DatHeaderField.HeaderSkipper: SetFieldValue(Models.Metadata.Header.HeaderKey, null); break; + case DatHeaderField.Homepage: SetFieldValue(Models.Metadata.Header.HomepageKey, null); break; + case DatHeaderField.ID: SetFieldValue(Models.Metadata.Header.IdKey, null); break; // case DatHeaderField.Info_Default: Info_Default = null; break; // case DatHeaderField.Info_IsNamingOption: Info_IsNamingOption = null; break; // case DatHeaderField.Info_Name: Info_Name = null; break; // case DatHeaderField.Info_Visible: Info_Visible = null; break; - case DatHeaderField.LockBiosMode: LockBiosMode = null; break; - case DatHeaderField.LockRomMode: LockRomMode = null; break; - case DatHeaderField.LockSampleMode: LockSampleMode = null; break; - case DatHeaderField.MameConfig: MameConfig = null; break; - case DatHeaderField.Name: Name = null; break; - case DatHeaderField.RomCenterVersion: RomCenterVersion = null; break; - case DatHeaderField.RomMode: RomMode = MergingFlag.None; break; - case DatHeaderField.RomTitle: RomTitle = null; break; - case DatHeaderField.RootDir: RootDir = null; break; - case DatHeaderField.SampleMode: SampleMode = MergingFlag.None; break; - case DatHeaderField.ScreenshotsHeight: ScreenshotsHeight = null; break; - case DatHeaderField.ScreenshotsWidth: ScreenshotsWidth = null; break; - case DatHeaderField.System: System = null; break; - case DatHeaderField.Type: Type = null; break; - case DatHeaderField.Url: Url = null; break; - case DatHeaderField.Version: Version = null; break; + case DatHeaderField.LockBiosMode: SetFieldValue(Models.Metadata.Header.LockBiosModeKey, null); break; + case DatHeaderField.LockRomMode: SetFieldValue(Models.Metadata.Header.LockRomModeKey, null); break; + case DatHeaderField.LockSampleMode: SetFieldValue(Models.Metadata.Header.LockSampleModeKey, null); break; + case DatHeaderField.MameConfig: SetFieldValue(Models.Metadata.Header.MameConfigKey, null); break; + case DatHeaderField.Name: SetFieldValue(Models.Metadata.Header.NameKey, null); break; + case DatHeaderField.RomCenterVersion: SetFieldValue(Models.Metadata.Header.DatVersionKey, null); break; + case DatHeaderField.RomMode: SetFieldValue(Models.Metadata.Header.RomModeKey, MergingFlag.None); break; + case DatHeaderField.RomTitle: SetFieldValue(Models.Metadata.Header.RomTitleKey, null); break; + case DatHeaderField.RootDir: SetFieldValue(Models.Metadata.Header.RootDirKey, null); break; + case DatHeaderField.SampleMode: SetFieldValue(Models.Metadata.Header.SampleModeKey, MergingFlag.None); break; + case DatHeaderField.ScreenshotsHeight: SetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey, null); break; + case DatHeaderField.ScreenshotsWidth: SetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey, null); break; + case DatHeaderField.System: SetFieldValue(Models.Metadata.Header.SystemKey, null); break; + case DatHeaderField.Type: SetFieldValue(Models.Metadata.Header.TypeKey, null); break; + case DatHeaderField.Url: SetFieldValue(Models.Metadata.Header.UrlKey, null); break; + case DatHeaderField.Version: SetFieldValue(Models.Metadata.Header.VersionKey, null); break; default: return false; } @@ -670,43 +430,43 @@ namespace SabreTools.DatFiles DatHeaderField datHeaderField = fieldName.AsDatHeaderField(); switch (datHeaderField) { - case DatHeaderField.Author: Author = value; break; - case DatHeaderField.BiosMode: BiosMode = value.AsEnumValue(); break; - case DatHeaderField.Build: Build = value; break; - case DatHeaderField.CanOpen: CanOpen = [.. value.Split(',')]; break; - case DatHeaderField.Category: Category = value; break; - case DatHeaderField.Comment: Comment = value; break; - case DatHeaderField.Date: Date = value; break; - case DatHeaderField.Debug: Debug = value.AsYesNo(); break; - case DatHeaderField.Description: Description = value; break; - case DatHeaderField.Email: Email = value; break; + case DatHeaderField.Author: SetFieldValue(Models.Metadata.Header.AuthorKey, value); break; + case DatHeaderField.BiosMode: SetFieldValue(Models.Metadata.Header.BiosModeKey, value.AsEnumValue()); break; + case DatHeaderField.Build: SetFieldValue(Models.Metadata.Header.BuildKey, value); break; + case DatHeaderField.CanOpen: SetFieldValue(Models.Metadata.Header.CanOpenKey,[.. value.Split(',')]); break; + case DatHeaderField.Category: SetFieldValue(Models.Metadata.Header.CategoryKey, value); break; + case DatHeaderField.Comment: SetFieldValue(Models.Metadata.Header.CommentKey, value); break; + case DatHeaderField.Date: SetFieldValue(Models.Metadata.Header.DateKey, value); break; + case DatHeaderField.Debug: SetFieldValue(Models.Metadata.Header.DebugKey, value.AsYesNo()); break; + case DatHeaderField.Description: SetFieldValue(Models.Metadata.Header.DescriptionKey, value); break; + case DatHeaderField.Email: SetFieldValue(Models.Metadata.Header.EmailKey, value); break; case DatHeaderField.FileName: FileName = value; break; - case DatHeaderField.ForceMerging: ForceMerging = value.AsEnumValue(); break; - case DatHeaderField.ForceNodump: ForceNodump = value.AsEnumValue(); break; - case DatHeaderField.ForcePacking: ForcePacking = value.AsEnumValue(); break; - case DatHeaderField.HeaderSkipper: HeaderSkipper = value; break; - case DatHeaderField.Homepage: Homepage = value; break; - case DatHeaderField.ID: NoIntroID = value; break; + case DatHeaderField.ForceMerging: SetFieldValue(Models.Metadata.Header.ForceMergingKey, value.AsEnumValue()); break; + case DatHeaderField.ForceNodump: SetFieldValue(Models.Metadata.Header.ForceNodumpKey, value.AsEnumValue()); break; + case DatHeaderField.ForcePacking: SetFieldValue(Models.Metadata.Header.ForcePackingKey, value.AsEnumValue()); break; + case DatHeaderField.HeaderSkipper: SetFieldValue(Models.Metadata.Header.HeaderKey, value); break; + case DatHeaderField.Homepage: SetFieldValue(Models.Metadata.Header.HomepageKey, value); break; + case DatHeaderField.ID: SetFieldValue(Models.Metadata.Header.IdKey, value); break; // case DatHeaderField.Info_Default: Info_Default = value; break; // case DatHeaderField.Info_IsNamingOption: Info_IsNamingOption = value; break; // case DatHeaderField.Info_Name: Info_Name = value; break; // case DatHeaderField.Info_Visible: Info_Visible = value; break; - case DatHeaderField.LockBiosMode: LockBiosMode = value.AsYesNo(); break; - case DatHeaderField.LockRomMode: LockRomMode = value.AsYesNo(); break; - case DatHeaderField.LockSampleMode: LockSampleMode = value.AsYesNo(); break; - case DatHeaderField.MameConfig: MameConfig = value; break; - case DatHeaderField.Name: Name = value; break; - case DatHeaderField.RomCenterVersion: RomCenterVersion = value; break; - case DatHeaderField.RomMode: RomMode = value.AsEnumValue(); break; - case DatHeaderField.RomTitle: RomTitle = value; break; - case DatHeaderField.RootDir: RootDir = value; break; - case DatHeaderField.SampleMode: SampleMode = value.AsEnumValue(); break; - case DatHeaderField.ScreenshotsHeight: ScreenshotsHeight = value; break; - case DatHeaderField.ScreenshotsWidth: ScreenshotsWidth = value; break; - case DatHeaderField.System: System = value; break; - case DatHeaderField.Type: Type = value; break; - case DatHeaderField.Url: Url = value; break; - case DatHeaderField.Version: Version = value; break; + case DatHeaderField.LockBiosMode: SetFieldValue(Models.Metadata.Header.LockBiosModeKey, value.AsYesNo()); break; + case DatHeaderField.LockRomMode: SetFieldValue(Models.Metadata.Header.LockRomModeKey, value.AsYesNo()); break; + case DatHeaderField.LockSampleMode: SetFieldValue(Models.Metadata.Header.LockSampleModeKey, value.AsYesNo()); break; + case DatHeaderField.MameConfig: SetFieldValue(Models.Metadata.Header.MameConfigKey, value); break; + case DatHeaderField.Name: SetFieldValue(Models.Metadata.Header.NameKey, value); break; + case DatHeaderField.RomCenterVersion: SetFieldValue(Models.Metadata.Header.DatVersionKey, value); break; + case DatHeaderField.RomMode: SetFieldValue(Models.Metadata.Header.RomModeKey, value.AsEnumValue()); break; + case DatHeaderField.RomTitle: SetFieldValue(Models.Metadata.Header.RomTitleKey, value); break; + case DatHeaderField.RootDir: SetFieldValue(Models.Metadata.Header.RootDirKey, value); break; + case DatHeaderField.SampleMode: SetFieldValue(Models.Metadata.Header.SampleModeKey, value.AsEnumValue()); break; + case DatHeaderField.ScreenshotsHeight: SetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey, value); break; + case DatHeaderField.ScreenshotsWidth: SetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey, value); break; + case DatHeaderField.System: SetFieldValue(Models.Metadata.Header.SystemKey, value); break; + case DatHeaderField.Type: SetFieldValue(Models.Metadata.Header.TypeKey, value); break; + case DatHeaderField.Url: SetFieldValue(Models.Metadata.Header.UrlKey, value); break; + case DatHeaderField.Version: SetFieldValue(Models.Metadata.Header.VersionKey, value); break; default: return false; } @@ -1177,7 +937,7 @@ namespace SabreTools.DatFiles /// String containing the new filename private string CreateOutFileNamesHelper(string outDir, string extension, bool overwrite) { - string? filename = string.IsNullOrEmpty(FileName) ? Description : FileName; + string? filename = string.IsNullOrEmpty(FileName) ? GetFieldValue(Models.Metadata.Header.DescriptionKey) : FileName; // Strip off the extension if it's a holdover from the DAT if (Utilities.HasValidDatExtension(filename)) diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs b/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs index fcf364ec..9d7ece06 100644 --- a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs +++ b/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs @@ -44,28 +44,43 @@ namespace SabreTools.DatFiles.Formats if (cmp == null) return; - Header.Name ??= cmp.Name; - Header.Description ??= cmp.Description; - Header.RootDir ??= cmp.RootDir; - Header.Category ??= cmp.Category; - Header.Version ??= cmp.Version; - Header.Date ??= cmp.Date; - Header.Author ??= cmp.Author; - Header.Homepage ??= cmp.Homepage; - Header.Url ??= cmp.Url; - Header.Comment ??= cmp.Comment; - Header.HeaderSkipper ??= cmp.Header; - Header.Type ??= cmp.Type; - if (Header.ForceMerging == MergingFlag.None) - Header.ForceMerging = cmp.ForceMerging?.AsEnumValue() ?? MergingFlag.None; - if (Header.ForcePacking == PackingFlag.None) - Header.ForcePacking = cmp.ForceZipping?.AsEnumValue() ?? PackingFlag.None; - if (Header.ForcePacking == PackingFlag.None) - Header.ForcePacking = cmp.ForcePacking?.AsEnumValue() ?? PackingFlag.None; + if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) + Header.SetFieldValue(Models.Metadata.Header.NameKey, cmp.Name); + if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, cmp.Description); + if (Header.GetFieldValue(Models.Metadata.Header.RootDirKey) == null) + Header.SetFieldValue(Models.Metadata.Header.RootDirKey, cmp.RootDir); + if (Header.GetFieldValue(Models.Metadata.Header.CategoryKey) == null) + Header.SetFieldValue(Models.Metadata.Header.CategoryKey, cmp.Category); + if (Header.GetFieldValue(Models.Metadata.Header.VersionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.VersionKey, cmp.Version); + if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DateKey, cmp.Date); + if (Header.GetFieldValue(Models.Metadata.Header.AuthorKey) == null) + Header.SetFieldValue(Models.Metadata.Header.AuthorKey, cmp.Author); + if (Header.GetFieldValue(Models.Metadata.Header.HomepageKey) == null) + Header.SetFieldValue(Models.Metadata.Header.HomepageKey, cmp.Homepage); + if (Header.GetFieldValue(Models.Metadata.Header.UrlKey) == null) + Header.SetFieldValue(Models.Metadata.Header.UrlKey, cmp.Url); + if (Header.GetFieldValue(Models.Metadata.Header.CommentKey) == null) + Header.SetFieldValue(Models.Metadata.Header.CommentKey, cmp.Comment); + if (Header.GetFieldValue(Models.Metadata.Header.HeaderKey) == null) + Header.SetFieldValue(Models.Metadata.Header.HeaderKey, cmp.Header); + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, cmp.Type); + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, cmp.ForceMerging?.AsEnumValue() ?? MergingFlag.None); + if (Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) == PackingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, cmp.ForceZipping?.AsEnumValue() ?? PackingFlag.None); + if (Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) == PackingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, cmp.ForcePacking?.AsEnumValue() ?? PackingFlag.None); // Handle implied SuperDAT if (cmp.Name?.Contains(" - SuperDAT") == true && keep) - Header.Type ??= "SuperDAT"; + { + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); + } } #endregion diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs b/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs index b0d80c7d..c2dfcf0f 100644 --- a/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs +++ b/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs @@ -184,24 +184,24 @@ namespace SabreTools.DatFiles.Formats var clrMamePro = new Models.ClrMamePro.ClrMamePro { - Name = Header.Name, - Description = Header.Description, - RootDir = Header.RootDir, - Category = Header.Category, - Version = Header.Version, - Date = Header.Date, - Author = Header.Author, - Homepage = Header.Homepage, - Url = Header.Url, - Comment = Header.Comment, - Header = Header.HeaderSkipper, - Type = Header.Type, + Name = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Description = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), + RootDir = Header.GetFieldValue(Models.Metadata.Header.RootDirKey), + Category = Header.GetFieldValue(Models.Metadata.Header.CategoryKey), + Version = Header.GetFieldValue(Models.Metadata.Header.VersionKey), + Date = Header.GetFieldValue(Models.Metadata.Header.DateKey), + Author = Header.GetFieldValue(Models.Metadata.Header.AuthorKey), + Homepage = Header.GetFieldValue(Models.Metadata.Header.HomepageKey), + Url = Header.GetFieldValue(Models.Metadata.Header.UrlKey), + Comment = Header.GetFieldValue(Models.Metadata.Header.CommentKey), + Header = Header.GetFieldValue(Models.Metadata.Header.HeaderKey), + Type = Header.GetFieldValue(Models.Metadata.Header.TypeKey), }; - if (Header.ForceMergingSpecified) - clrMamePro.ForceMerging = Header.ForceMerging.AsStringValue(useSecond: false); - if (Header.ForcePackingSpecified) - clrMamePro.ForcePacking = Header.ForcePacking.AsStringValue(useSecond: false); + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) != MergingFlag.None) + clrMamePro.ForceMerging = Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey).AsStringValue(useSecond: false); + if (Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) != PackingFlag.None) + clrMamePro.ForcePacking = Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey).AsStringValue(useSecond: false); return clrMamePro; } diff --git a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs b/SabreTools.DatFiles/Formats/DosCenter.Reader.cs index 56ad3166..8d93e144 100644 --- a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs +++ b/SabreTools.DatFiles/Formats/DosCenter.Reader.cs @@ -42,17 +42,27 @@ namespace SabreTools.DatFiles.Formats if (doscenter == null) return; - Header.Name ??= doscenter.Name; - Header.Description ??= doscenter.Description; - Header.Version ??= doscenter.Version; - Header.Date ??= doscenter.Date; - Header.Author ??= doscenter.Author; - Header.Homepage ??= doscenter.Homepage; - Header.Comment ??= doscenter.Comment; + if (Header.GetFieldValue(Models.Metadata.Header.AuthorKey) == null) + Header.SetFieldValue(Models.Metadata.Header.AuthorKey, doscenter.Author); + if (Header.GetFieldValue(Models.Metadata.Header.CommentKey) == null) + Header.SetFieldValue(Models.Metadata.Header.CommentKey, doscenter.Comment); + if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DateKey, doscenter.Date); + if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, doscenter.Description); + if (Header.GetFieldValue(Models.Metadata.Header.HomepageKey) == null) + Header.SetFieldValue(Models.Metadata.Header.HomepageKey, doscenter.Homepage); + if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) + Header.SetFieldValue(Models.Metadata.Header.NameKey, doscenter.Name); + if (Header.GetFieldValue(Models.Metadata.Header.VersionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.VersionKey, doscenter.Version); // Handle implied SuperDAT if (doscenter.Name?.Contains(" - SuperDAT") == true && keep) - Header.Type ??= "SuperDAT"; + { + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); + } } #endregion diff --git a/SabreTools.DatFiles/Formats/DosCenter.Writer.cs b/SabreTools.DatFiles/Formats/DosCenter.Writer.cs index 46f80c85..ba79349a 100644 --- a/SabreTools.DatFiles/Formats/DosCenter.Writer.cs +++ b/SabreTools.DatFiles/Formats/DosCenter.Writer.cs @@ -96,13 +96,13 @@ namespace SabreTools.DatFiles.Formats var clrMamePro = new Models.DosCenter.DosCenter { - Name = Header.Name, - Description = Header.Description, - Version = Header.Version, - Date = Header.Date, - Author = Header.Author, - Homepage = Header.Homepage, - Comment = Header.Comment, + Name = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Description = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), + Version = Header.GetFieldValue(Models.Metadata.Header.VersionKey), + Date = Header.GetFieldValue(Models.Metadata.Header.DateKey), + Author = Header.GetFieldValue(Models.Metadata.Header.AuthorKey), + Homepage = Header.GetFieldValue(Models.Metadata.Header.HomepageKey), + Comment = Header.GetFieldValue(Models.Metadata.Header.CommentKey), }; return clrMamePro; diff --git a/SabreTools.DatFiles/Formats/Listxml.Reader.cs b/SabreTools.DatFiles/Formats/Listxml.Reader.cs index 81c3ce47..4dd87e86 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Reader.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Reader.cs @@ -48,15 +48,23 @@ namespace SabreTools.DatFiles.Formats if (mame == null) return; - Header.Name ??= mame.Build; - Header.Description ??= mame.Build; - Header.Build ??= mame.Build; - Header.Debug ??= mame.Debug.AsYesNo(); - Header.MameConfig ??= mame.MameConfig; + if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) + Header.SetFieldValue(Models.Metadata.Header.NameKey, mame.Build); + if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, mame.Build); + if (Header.GetFieldValue(Models.Metadata.Header.BuildKey) == null) + Header.SetFieldValue(Models.Metadata.Header.BuildKey, mame.Build); + if (Header.GetFieldValue(Models.Metadata.Header.DebugKey) == null) + Header.SetFieldValue (Models.Metadata.Header.DebugKey, mame.Debug.AsYesNo()); + if (Header.GetFieldValue(Models.Metadata.Header.MameConfigKey) == null) + Header.SetFieldValue(Models.Metadata.Header.MameConfigKey, mame.MameConfig); // Handle implied SuperDAT - if (Header.Name?.Contains(" - SuperDAT") == true && keep) - Header.Type ??= "SuperDAT"; + if (Header.GetFieldValue(Models.Metadata.Header.NameKey)?.Contains(" - SuperDAT") == true && keep) + { + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); + } } /// diff --git a/SabreTools.DatFiles/Formats/Listxml.Writer.cs b/SabreTools.DatFiles/Formats/Listxml.Writer.cs index 3abcba7c..0dee638a 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Writer.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Writer.cs @@ -212,9 +212,11 @@ namespace SabreTools.DatFiles.Formats { var datafile = new Models.Listxml.Mame { - Build = Header.Name ?? Header.Description ?? Header.Build, - Debug = Header.Debug.FromYesNo(), - MameConfig = Header.MameConfig, + Build = Header.GetFieldValue(Models.Metadata.Header.NameKey) + ?? Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + ?? Header.GetFieldValue(Models.Metadata.Header.BuildKey), + Debug = Header.GetFieldValue(Models.Metadata.Header.DebugKey).FromYesNo(), + MameConfig = Header.GetFieldValue(Models.Metadata.Header.MameConfigKey), Game = CreateGames(ignoreblanks) }; diff --git a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs index 126468f7..651a1813 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs @@ -44,8 +44,10 @@ namespace SabreTools.DatFiles.Formats if (datafile == null) return; - Header.Build ??= datafile.Build; - Header.Debug ??= datafile.Debug.AsYesNo(); + if (Header.GetFieldValue(Models.Metadata.Header.BuildKey) == null) + Header.SetFieldValue(Models.Metadata.Header.BuildKey, datafile.Build); + if (Header.GetFieldValue(Models.Metadata.Header.DebugKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DebugKey, datafile.Debug.AsYesNo()); // SchemaLocation is specifically skipped ConvertHeader(datafile.Header, keep); @@ -62,26 +64,42 @@ namespace SabreTools.DatFiles.Formats if (header == null) return; - Header.NoIntroID ??= header.Id; - Header.Name ??= header.Name; - Header.Description ??= header.Description; - Header.RootDir ??= header.RootDir; - Header.Category ??= header.Category; - Header.Version ??= header.Version; - Header.Date ??= header.Date; - Header.Author ??= header.Author; - Header.Email ??= header.Email; - Header.Homepage ??= header.Homepage; - Header.Url ??= header.Url; - Header.Comment ??= header.Comment; - Header.Type ??= header.Type; + if (Header.GetFieldValue(Models.Metadata.Header.IdKey) == null) + Header.SetFieldValue(Models.Metadata.Header.IdKey, header.Id); + if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) + Header.SetFieldValue(Models.Metadata.Header.NameKey, header.Name); + if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, header.Description); + if (Header.GetFieldValue(Models.Metadata.Header.RootDirKey) == null) + Header.SetFieldValue(Models.Metadata.Header.RootDirKey, header.RootDir); + if (Header.GetFieldValue(Models.Metadata.Header.CategoryKey) == null) + Header.SetFieldValue(Models.Metadata.Header.CategoryKey, header.Category); + if (Header.GetFieldValue(Models.Metadata.Header.VersionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.VersionKey, header.Version); + if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DateKey, header.Date); + if (Header.GetFieldValue(Models.Metadata.Header.AuthorKey) == null) + Header.SetFieldValue(Models.Metadata.Header.AuthorKey, header.Author); + if (Header.GetFieldValue(Models.Metadata.Header.EmailKey) == null) + Header.SetFieldValue(Models.Metadata.Header.EmailKey, header.Email); + if (Header.GetFieldValue(Models.Metadata.Header.HomepageKey) == null) + Header.SetFieldValue(Models.Metadata.Header.HomepageKey, header.Homepage); + if (Header.GetFieldValue(Models.Metadata.Header.UrlKey) == null) + Header.SetFieldValue(Models.Metadata.Header.UrlKey, header.Url); + if (Header.GetFieldValue(Models.Metadata.Header.CommentKey) == null) + Header.SetFieldValue(Models.Metadata.Header.CommentKey, header.Comment); + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, header.Type); ConvertSubheader(header.ClrMamePro); ConvertSubheader(header.RomCenter); // Handle implied SuperDAT if (header.Name?.Contains(" - SuperDAT") == true && keep) - Header.Type ??= "SuperDAT"; + { + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); + } } /// @@ -94,14 +112,14 @@ namespace SabreTools.DatFiles.Formats if (clrMamePro == null) return; - Header.HeaderSkipper ??= clrMamePro.Header; - - if (Header.ForceMerging == MergingFlag.None) - Header.ForceMerging = clrMamePro.ForceMerging.AsEnumValue(); - if (Header.ForceNodump == NodumpFlag.None) - Header.ForceNodump = clrMamePro.ForceNodump.AsEnumValue(); - if (Header.ForcePacking == PackingFlag.None) - Header.ForcePacking = clrMamePro.ForcePacking.AsEnumValue(); + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, clrMamePro.ForceMerging.AsEnumValue()); + if (Header.GetFieldValue(Models.Metadata.Header.ForceNodumpKey) == NodumpFlag.None) + Header.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, clrMamePro.ForceNodump.AsEnumValue()); + if (Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) == PackingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, clrMamePro.ForcePacking.AsEnumValue()); + if (Header.GetFieldValue(Models.Metadata.Header.HeaderKey) == null) + Header.SetFieldValue(Models.Metadata.Header.HeaderKey, clrMamePro.Header); } /// @@ -114,18 +132,21 @@ namespace SabreTools.DatFiles.Formats if (romCenter == null) return; - Header.System ??= romCenter.Plugin; + if (Header.GetFieldValue(Models.Metadata.Header.BiosModeKey) == MergingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.BiosModeKey, romCenter.BiosMode.AsEnumValue()); + if (Header.GetFieldValue(Models.Metadata.Header.LockBiosModeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.LockBiosModeKey, romCenter.LockBiosMode.AsYesNo()); + if (Header.GetFieldValue(Models.Metadata.Header.LockRomModeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.LockRomModeKey, romCenter.LockRomMode.AsYesNo()); + if (Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.LockSampleModeKey, romCenter.LockSampleMode.AsYesNo()); + if (Header.GetFieldValue(Models.Metadata.Header.PluginKey) == null) + Header.SetFieldValue(Models.Metadata.Header.PluginKey, romCenter.Plugin); + if (Header.GetFieldValue(Models.Metadata.Header.RomModeKey) == MergingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.RomModeKey, romCenter.RomMode.AsEnumValue()); + if (Header.GetFieldValue(Models.Metadata.Header.SampleModeKey) == MergingFlag.None) + Header.SetFieldValue(Models.Metadata.Header.SampleModeKey, romCenter.SampleMode.AsEnumValue()); - if (Header.RomMode == MergingFlag.None) - Header.RomMode = romCenter.RomMode.AsEnumValue(); - if (Header.BiosMode == MergingFlag.None) - Header.BiosMode = romCenter.BiosMode.AsEnumValue(); - if (Header.SampleMode == MergingFlag.None) - Header.SampleMode = romCenter.SampleMode.AsEnumValue(); - - Header.LockRomMode ??= romCenter.LockRomMode.AsYesNo(); - Header.LockBiosMode ??= romCenter.LockBiosMode.AsYesNo(); - Header.LockSampleMode ??= romCenter.LockSampleMode.AsYesNo(); } #endregion diff --git a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs index 4af91db8..a9548419 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs @@ -137,7 +137,7 @@ namespace SabreTools.DatFiles.Formats // Only write the doctype if we don't have No-Intro data bool success; - if (string.IsNullOrEmpty(Header.NoIntroID)) + if (string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.IdKey))) success = new Serialization.Files.Logiqx().SerializeToFileWithDocType(datafile, outfile); else success = new Serialization.Files.Logiqx().Serialize(datafile, outfile); @@ -168,14 +168,14 @@ namespace SabreTools.DatFiles.Formats { var datafile = new Models.Logiqx.Datafile { - Build = Header.Build, - Debug = Header.Debug.FromYesNo(), + Build = Header.GetFieldValue(Models.Metadata.Header.BuildKey), + Debug = Header.GetFieldValue(Models.Metadata.Header.DebugKey).FromYesNo(), Header = CreateHeader(), Game = CreateGames(ignoreblanks) }; - if (!string.IsNullOrEmpty(Header.NoIntroID)) + if (!string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.IdKey))) datafile.SchemaLocation = "https://datomatic.no-intro.org/stuff https://datomatic.no-intro.org/stuff/schema_nointro_datfile_v3.xsd"; return datafile; @@ -192,19 +192,19 @@ namespace SabreTools.DatFiles.Formats var header = new Models.Logiqx.Header { - Id = Header.NoIntroID, - Name = Header.Name, - Description = Header.Description, - RootDir = Header.RootDir, - Category = Header.Category, - Version = Header.Version, - Date = Header.Date, - Author = Header.Author, - Email = Header.Email, - Homepage = Header.Homepage, - Url = Header.Url, - Comment = Header.Comment, - Type = Header.Type, + Id = Header.GetFieldValue(Models.Metadata.Header.IdKey), + Name = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Description = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), + RootDir = Header.GetFieldValue(Models.Metadata.Header.RootDirKey), + Category = Header.GetFieldValue(Models.Metadata.Header.CategoryKey), + Version = Header.GetFieldValue(Models.Metadata.Header.VersionKey), + Date = Header.GetFieldValue(Models.Metadata.Header.DateKey), + Author = Header.GetFieldValue(Models.Metadata.Header.AuthorKey), + Email = Header.GetFieldValue(Models.Metadata.Header.EmailKey), + Homepage = Header.GetFieldValue(Models.Metadata.Header.HomepageKey), + Url = Header.GetFieldValue(Models.Metadata.Header.UrlKey), + Comment = Header.GetFieldValue(Models.Metadata.Header.CommentKey), + Type = Header.GetFieldValue(Models.Metadata.Header.TypeKey), ClrMamePro = CreateClrMamePro(), RomCenter = CreateRomCenter(), @@ -219,25 +219,25 @@ namespace SabreTools.DatFiles.Formats private Models.Logiqx.ClrMamePro? CreateClrMamePro() { // If we don't have subheader values, we can't do anything - if (!Header.ForceMergingSpecified - && !Header.ForceNodumpSpecified - && !Header.ForcePackingSpecified - && string.IsNullOrEmpty(Header.HeaderSkipper)) + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None + && Header.GetFieldValue(Models.Metadata.Header.ForceNodumpKey) == NodumpFlag.None + && Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) == PackingFlag.None + && string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.HeaderKey))) { return null; } var subheader = new Models.Logiqx.ClrMamePro { - Header = Header.HeaderSkipper, + Header = Header.GetFieldValue(Models.Metadata.Header.HeaderKey), }; - if (Header.ForceMergingSpecified) - subheader.ForceMerging = Header.ForceMerging.AsStringValue(useSecond: false); - if (Header.ForceNodumpSpecified) - subheader.ForceNodump = Header.ForceNodump.AsStringValue(); - if (Header.ForcePackingSpecified) - subheader.ForcePacking = Header.ForcePacking.AsStringValue(useSecond: false); + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) != MergingFlag.None) + subheader.ForceMerging = Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey).AsStringValue(useSecond: false); + if (Header.GetFieldValue(Models.Metadata.Header.ForceNodumpKey) != NodumpFlag.None) + subheader.ForceNodump = Header.GetFieldValue(Models.Metadata.Header.ForceNodumpKey).AsStringValue(); + if (Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) != PackingFlag.None) + subheader.ForcePacking = Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey).AsStringValue(useSecond: false); return subheader; } @@ -248,35 +248,35 @@ namespace SabreTools.DatFiles.Formats private Models.Logiqx.RomCenter? CreateRomCenter() { // If we don't have subheader values, we can't do anything - if (string.IsNullOrEmpty(Header.System) - && !Header.RomModeSpecified - && !Header.BiosModeSpecified - && !Header.SampleModeSpecified - && !Header.LockRomModeSpecified - && !Header.LockBiosModeSpecified - && !Header.LockSampleModeSpecified) + if (string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.SystemKey)) + && Header.GetFieldValue(Models.Metadata.Header.BiosModeKey) == MergingFlag.None + && Header.GetFieldValue(Models.Metadata.Header.LockBiosModeKey) == null + && Header.GetFieldValue(Models.Metadata.Header.LockRomModeKey) == null + && Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey) == null + && Header.GetFieldValue(Models.Metadata.Header.RomModeKey) == MergingFlag.None + && Header.GetFieldValue(Models.Metadata.Header.SampleModeKey) == MergingFlag.None) { return null; } var subheader = new Models.Logiqx.RomCenter { - Plugin = Header.System, + Plugin = Header.GetFieldValue(Models.Metadata.Header.PluginKey), }; - if (Header.RomModeSpecified) - subheader.RomMode = Header.RomMode.AsStringValue(useSecond: true); - if (Header.BiosModeSpecified) - subheader.BiosMode = Header.BiosMode.AsStringValue(useSecond: true); - if (Header.SampleModeSpecified) - subheader.SampleMode = Header.SampleMode.AsStringValue(useSecond: true); + if (Header.GetFieldValue(Models.Metadata.Header.RomModeKey) != MergingFlag.None) + subheader.RomMode = Header.GetFieldValue(Models.Metadata.Header.RomModeKey).AsStringValue(useSecond: true); + if (Header.GetFieldValue(Models.Metadata.Header.BiosModeKey) != MergingFlag.None) + subheader.BiosMode = Header.GetFieldValue(Models.Metadata.Header.BiosModeKey).AsStringValue(useSecond: true); + if (Header.GetFieldValue(Models.Metadata.Header.SampleModeKey) != MergingFlag.None) + subheader.SampleMode = Header.GetFieldValue(Models.Metadata.Header.SampleModeKey).AsStringValue(useSecond: true); - if (Header.LockRomModeSpecified) - subheader.LockRomMode = Header.LockRomMode.FromYesNo(); - if (Header.LockBiosModeSpecified) - subheader.LockBiosMode = Header.LockBiosMode.FromYesNo(); - if (Header.LockSampleModeSpecified) - subheader.LockSampleMode = Header.LockSampleMode.FromYesNo(); + if (Header.GetFieldValue(Models.Metadata.Header.LockRomModeKey) != null) + subheader.LockRomMode = Header.GetFieldValue(Models.Metadata.Header.LockRomModeKey).FromYesNo(); + if (Header.GetFieldValue(Models.Metadata.Header.LockBiosModeKey) != null) + subheader.LockBiosMode = Header.GetFieldValue(Models.Metadata.Header.LockBiosModeKey).FromYesNo(); + if (Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey) != null) + subheader.LockSampleMode = Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey).FromYesNo(); return subheader; } diff --git a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs b/SabreTools.DatFiles/Formats/OfflineList.Reader.cs index f1ba887c..f49e945a 100644 --- a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs +++ b/SabreTools.DatFiles/Formats/OfflineList.Reader.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Newtonsoft.Json.Linq; using SabreTools.Core.Tools; namespace SabreTools.DatFiles.Formats @@ -63,21 +64,24 @@ namespace SabreTools.DatFiles.Formats if (config == null) return; - Header.Name ??= config.DatName; - //Header.ImFolder ??= config.ImFolder; // TODO: Add to internal model - Header.Version = config.DatVersion; - Header.System = config.System; - Header.ScreenshotsWidth = config.ScreenshotsWidth; - Header.ScreenshotsHeight = config.ScreenshotsHeight; - ConvertInfos(config.Infos); + Header.SetFieldValue(Models.Metadata.Header.NameKey, config.DatName); + Header.SetFieldValue(Models.Metadata.Header.DatVersionKey, config.DatVersion); + Header.SetFieldValue(Models.Metadata.Header.ImFolderKey, config.ImFolder); + Header.SetFieldValue(Models.Metadata.Header.RomTitleKey, config.RomTitle); + Header.SetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey, config.ScreenshotsHeight); + Header.SetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey, config.ScreenshotsWidth); + Header.SetFieldValue(Models.Metadata.Header.SystemKey, config.System); ConvertCanOpen(config.CanOpen); + ConvertInfos(config.Infos); ConvertNewDat(config.NewDat); ConvertSearch(config.Search); - Header.RomTitle = config.RomTitle; // Handle implied SuperDAT if (config.DatName?.Contains(" - SuperDAT") == true && keep) - Header.Type ??= "SuperDAT"; + { + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); + } } /// @@ -223,7 +227,7 @@ namespace SabreTools.DatFiles.Formats }); } - Header.Infos = offlineListInfos; + Header.SetFieldValue(Models.Metadata.Header.InfosKey, [.. offlineListInfos]); } /// @@ -236,7 +240,7 @@ namespace SabreTools.DatFiles.Formats if (canOpen?.Extension == null) return; - Header.CanOpen = new List(canOpen.Extension); + Header.SetFieldValue(Models.Metadata.Header.CanOpenKey, canOpen.Extension); } /// @@ -249,9 +253,9 @@ namespace SabreTools.DatFiles.Formats if (newDat == null) return; - Header.Url = newDat.DatVersionUrl; - //Header.DatUrl = newDat.DatUrl; // TODO: Add to internal model - //Header.ImUrl = newDat.ImUrl; // TODO: Add to internal model + Header.SetFieldValue("DATVERSIONURL", newDat.DatVersionUrl); + //Header.SetFieldValue("DATURL", newDat.DatUrl); // TODO: Add to internal model + Header.SetFieldValue("IMURL", newDat.DatVersionUrl); } /// diff --git a/SabreTools.DatFiles/Formats/OfflineList.Writer.cs b/SabreTools.DatFiles/Formats/OfflineList.Writer.cs index 3a967af5..6de36778 100644 --- a/SabreTools.DatFiles/Formats/OfflineList.Writer.cs +++ b/SabreTools.DatFiles/Formats/OfflineList.Writer.cs @@ -97,17 +97,17 @@ namespace SabreTools.DatFiles.Formats var configuration = new Models.OfflineList.Configuration { - DatName = Header.Name, - //ImFolder = Header.ImFolder; // TODO: Add to internal model - DatVersion = Header.Version, - System = Header.System, - ScreenshotsWidth = Header.ScreenshotsWidth, - ScreenshotsHeight = Header.ScreenshotsHeight, + DatName = Header.GetFieldValue(Models.Metadata.Header.NameKey), + ImFolder = Header.GetFieldValue(Models.Metadata.Header.ImFolderKey), + DatVersion = Header.GetFieldValue(Models.Metadata.Header.DatVersionKey), + System = Header.GetFieldValue(Models.Metadata.Header.SystemKey), + ScreenshotsWidth = Header.GetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey), + ScreenshotsHeight = Header.GetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey), Infos = CreateInfos(), CanOpen = CreateCanOpen(), NewDat = CreateNewDat(), Search = CreateSearch(), - RomTitle = Header.RomTitle, + RomTitle = Header.GetFieldValue(Models.Metadata.Header.RomTitleKey), }; return configuration; @@ -119,11 +119,11 @@ namespace SabreTools.DatFiles.Formats private Models.OfflineList.Infos? CreateInfos() { // If we don't have infos, we can't do anything - if (!Header.InfosSpecified || Header.Infos == null) + if (!Header.InfosSpecified) return null; var infos = new Models.OfflineList.Infos(); - foreach (var info in Header.Infos) + foreach (var info in Header.GetFieldValue(Models.Metadata.Header.InfosKey)!) { switch (info.Name) { @@ -255,12 +255,12 @@ namespace SabreTools.DatFiles.Formats private Models.OfflineList.CanOpen? CreateCanOpen() { // If we don't have a canopen, we can't do anything - if (!Header.CanOpenSpecified || Header.CanOpen == null) + if (!Header.CanOpenSpecified || Header.GetFieldValue(Models.Metadata.Header.CanOpenKey) == null) return null; var canOpen = new Models.OfflineList.CanOpen { - Extension = [.. Header.CanOpen], + Extension = [.. Header.GetFieldValue(Models.Metadata.Header.CanOpenKey)], }; return canOpen; @@ -277,9 +277,9 @@ namespace SabreTools.DatFiles.Formats var newDat = new Models.OfflineList.NewDat { - DatVersionUrl = Header.Url, - //DatUrl = Header.DatUrl; // TODO: Add to internal model - //ImUrl = Header.ImUrl; // TODO: Add to internal model + DatVersionUrl = Header.GetFieldValue("DATVERSIONURL"), + //DatUrl = Header.GetFieldValue("DATURL"); // TODO: Add to internal model + ImUrl = Header.GetFieldValue("IMURL"), }; return newDat; diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs b/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs index 582e08d0..fdf518c8 100644 --- a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs +++ b/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs @@ -45,9 +45,12 @@ namespace SabreTools.DatFiles.Formats if (softwaredb == null) return; - Header.Name ??= "openMSX Software List"; - Header.Description ??= Header.Name; - Header.Date ??= softwaredb.Timestamp; + if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) + Header.SetFieldValue(Models.Metadata.Header.NameKey, "openMSX Software List"); + if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, Header.GetFieldValue(Models.Metadata.Header.NameKey)); + if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DateKey, softwaredb.Timestamp); } /// diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs b/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs index 901759a3..a6b34258 100644 --- a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs +++ b/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs @@ -76,7 +76,7 @@ namespace SabreTools.DatFiles.Formats { var softwaredb = new Models.OpenMSX.SoftwareDb { - Timestamp = Header.Date, + Timestamp = Header.GetFieldValue(Models.Metadata.Header.DateKey), Software = CreateSoftwares(ignoreblanks) }; return softwaredb; diff --git a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs b/SabreTools.DatFiles/Formats/RomCenter.Reader.cs index 9c39d278..ecff7abc 100644 --- a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs +++ b/SabreTools.DatFiles/Formats/RomCenter.Reader.cs @@ -1,5 +1,6 @@ using System; using SabreTools.Core; +using SabreTools.Models.RomCenter; namespace SabreTools.DatFiles.Formats { @@ -48,13 +49,20 @@ namespace SabreTools.DatFiles.Formats if (credits == null) return; - Header.Author ??= credits.Author; - Header.Version ??= credits.Version; - Header.Email ??= credits.Email; - Header.Homepage ??= credits.Homepage; - Header.Url ??= credits.Url; - Header.Date ??= credits.Date; - Header.Comment ??= credits.Comment; + if (Header.GetFieldValue(Models.Metadata.Header.AuthorKey) == null) + Header.SetFieldValue(Models.Metadata.Header.AuthorKey, credits.Author); + if (Header.GetFieldValue(Models.Metadata.Header.CommentKey) == null) + Header.SetFieldValue(Models.Metadata.Header.CommentKey, credits.Comment); + if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DateKey, credits.Date); + if (Header.GetFieldValue(Models.Metadata.Header.EmailKey) == null) + Header.SetFieldValue(Models.Metadata.Header.EmailKey, credits.Email); + if (Header.GetFieldValue(Models.Metadata.Header.HomepageKey) == null) + Header.SetFieldValue(Models.Metadata.Header.HomepageKey, credits.Homepage); + if (Header.GetFieldValue(Models.Metadata.Header.UrlKey) == null) + Header.SetFieldValue(Models.Metadata.Header.UrlKey, credits.Url); + if (Header.GetFieldValue(Models.Metadata.Header.VersionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.VersionKey, credits.Version); } /// @@ -67,12 +75,14 @@ namespace SabreTools.DatFiles.Formats if (dat == null) return; - Header.RomCenterVersion ??= dat.Version; - Header.System ??= dat.Plugin; - if (Header.ForceMerging == MergingFlag.None && dat.Split == "1") - Header.ForceMerging = MergingFlag.Split; - if (Header.ForceMerging == MergingFlag.None && dat.Merge == "1") - Header.ForceMerging = MergingFlag.Merged; + if (Header.GetFieldValue(Models.Metadata.Header.DatVersionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DatVersionKey, dat.Version); + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None && dat.Split == "1") + Header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, MergingFlag.Split); + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None && dat.Merge == "1") + Header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, MergingFlag.Merged); + if (Header.GetFieldValue(Models.Metadata.Header.SystemKey) == null) + Header.SetFieldValue(Models.Metadata.Header.SystemKey, dat.Plugin); } /// @@ -85,8 +95,10 @@ namespace SabreTools.DatFiles.Formats if (emulator == null) return; - Header.Name ??= emulator.RefName; - Header.Description ??= emulator.Version; + if (Header.GetFieldValue(Models.Metadata.Header.EmulatorVersionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.EmulatorVersionKey, emulator.Version); + if (Header.GetFieldValue(Models.Metadata.Header.RefNameKey) == null) + Header.SetFieldValue(Models.Metadata.Header.RefNameKey, emulator.RefName); } #endregion diff --git a/SabreTools.DatFiles/Formats/RomCenter.Writer.cs b/SabreTools.DatFiles/Formats/RomCenter.Writer.cs index 02c3e1e2..73ac583a 100644 --- a/SabreTools.DatFiles/Formats/RomCenter.Writer.cs +++ b/SabreTools.DatFiles/Formats/RomCenter.Writer.cs @@ -92,13 +92,13 @@ namespace SabreTools.DatFiles.Formats { var credits = new Models.RomCenter.Credits { - Author = Header.Author, - Version = Header.Version, - Email = Header.Email, - Homepage = Header.Homepage, - Url = Header.Url, - Date = Header.Date, - Comment = Header.Comment, + Author = Header.GetFieldValue(Models.Metadata.Header.AuthorKey), + Version = Header.GetFieldValue(Models.Metadata.Header.VersionKey), + Email = Header.GetFieldValue(Models.Metadata.Header.EmailKey), + Homepage = Header.GetFieldValue(Models.Metadata.Header.HomepageKey), + Url = Header.GetFieldValue(Models.Metadata.Header.UrlKey), + Date = Header.GetFieldValue(Models.Metadata.Header.DateKey), + Comment = Header.GetFieldValue(Models.Metadata.Header.CommentKey), }; return credits; } @@ -110,10 +110,10 @@ namespace SabreTools.DatFiles.Formats { var dat = new Models.RomCenter.Dat { - Version = Header.RomCenterVersion, - Plugin = Header.System, - Split = (Header.ForceMerging == MergingFlag.Split ? "1" : "0"), - Merge = (Header.ForceMerging == MergingFlag.Merged || Header.ForceMerging == MergingFlag.FullMerged ? "1" : "0"), + Version = Header.GetFieldValue(Models.Metadata.Header.DatVersionKey), + Plugin = Header.GetFieldValue(Models.Metadata.Header.SystemKey), + Split = (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.Split ? "1" : "0"), + Merge = (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.Merged || Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.FullMerged ? "1" : "0"), }; return dat; } @@ -125,8 +125,8 @@ namespace SabreTools.DatFiles.Formats { var emulator = new Models.RomCenter.Emulator { - RefName = Header.Name, - Version = Header.Description, + RefName = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Version = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), }; return emulator; } diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs b/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs index 931fea5b..ffeefb35 100644 --- a/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs +++ b/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs @@ -160,8 +160,8 @@ namespace SabreTools.DatFiles.Formats var row = new Models.SeparatedValue.Row { FileName = Header.FileName, - InternalName = Header.Name, - Description = Header.Description, + InternalName = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Description = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), GameName = disk.Machine.GetFieldValue(Models.Metadata.Machine.NameKey), GameDescription = disk.Machine.GetFieldValue(Models.Metadata.Machine.DescriptionKey), Type = disk.GetFieldValue(Models.Metadata.Disk.TypeKey).AsStringValue(), @@ -188,8 +188,8 @@ namespace SabreTools.DatFiles.Formats var row = new Models.SeparatedValue.Row { FileName = Header.FileName, - InternalName = Header.Name, - Description = Header.Description, + InternalName = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Description = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), GameName = media.Machine.GetFieldValue(Models.Metadata.Machine.NameKey), GameDescription = media.Machine.GetFieldValue(Models.Metadata.Machine.DescriptionKey), Type = media.ItemType.AsStringValue(), @@ -216,8 +216,8 @@ namespace SabreTools.DatFiles.Formats var row = new Models.SeparatedValue.Row { FileName = Header.FileName, - InternalName = Header.Name, - Description = Header.Description, + InternalName = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Description = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), GameName = rom.Machine.GetFieldValue(Models.Metadata.Machine.NameKey), GameDescription = rom.Machine.GetFieldValue(Models.Metadata.Machine.DescriptionKey), Type = rom.ItemType.AsStringValue(), diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs b/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs index e644bb42..febd1a06 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs @@ -47,13 +47,19 @@ namespace SabreTools.DatFiles.Formats if (softwarelist == null) return; - Header.Name ??= softwarelist.Name; - Header.Description ??= softwarelist.Description; - Header.Comment ??= softwarelist.Notes; + if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) + Header.SetFieldValue(Models.Metadata.Header.NameKey, softwarelist.Name); + if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, softwarelist.Description); + if (Header.GetFieldValue(Models.Metadata.Header.CommentKey) == null) + Header.SetFieldValue(Models.Metadata.Header.CommentKey, softwarelist.Notes); // Handle implied SuperDAT - if (Header.Name?.Contains(" - SuperDAT") == true && keep) - Header.Type ??= "SuperDAT"; + if (Header.GetFieldValue(Models.Metadata.Header.NameKey)?.Contains(" - SuperDAT") == true && keep) + { + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); + } } /// diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs index 1fb1c739..2dd90388 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs @@ -166,9 +166,9 @@ namespace SabreTools.DatFiles.Formats { var softwarelist = new Models.SoftwareList.SoftwareList { - Name = Header.Name, - Description = Header.Description, - Notes = Header.Comment, + Name = Header.GetFieldValue(Models.Metadata.Header.NameKey), + Description = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey), + Notes = Header.GetFieldValue(Models.Metadata.Header.CommentKey), Software = CreateSoftware(ignoreblanks), }; diff --git a/SabreTools.DatTools/DatFileTool.cs b/SabreTools.DatTools/DatFileTool.cs index 96a7c480..91e2e475 100644 --- a/SabreTools.DatTools/DatFileTool.cs +++ b/SabreTools.DatTools/DatFileTool.cs @@ -381,17 +381,17 @@ namespace SabreTools.DatTools if (string.IsNullOrEmpty(datFile.Header.FileName)) datFile.Header.FileName = "All DATs"; - if (string.IsNullOrEmpty(datFile.Header.Name)) - datFile.Header.Name = "datFile.All DATs"; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey))) + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, "datFile.All DATs"); - if (string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.Description = "datFile.All DATs"; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, "datFile.All DATs"); string post = " (Duplicates)"; DatFile dupeData = DatFile.Create(datFile.Header); dupeData.Header.FileName += post; - dupeData.Header.Name += post; - dupeData.Header.Description += post; + dupeData.Header.SetFieldValue(Models.Metadata.Header.NameKey, dupeData.Header.GetFieldValue(Models.Metadata.Header.NameKey) + post); + dupeData.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, dupeData.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + post); dupeData.Items = []; watch.Stop(); @@ -470,11 +470,11 @@ namespace SabreTools.DatTools if (string.IsNullOrEmpty(datFile.Header.FileName)) datFile.Header.FileName = "All DATs"; - if (string.IsNullOrEmpty(datFile.Header.Name)) - datFile.Header.Name = "All DATs"; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey))) + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, "All DATs"); - if (string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.Description = "All DATs"; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, "All DATs"); // Loop through each of the inputs and get or create a new DatData object DatFile[] outDatsArray = new DatFile[inputs.Count]; @@ -490,8 +490,8 @@ namespace SabreTools.DatTools string innerpost = $" ({j} - {inputs[j].GetNormalizedFileName(true)} Only)"; DatFile diffData = DatFile.Create(datFile.Header); diffData.Header.FileName += innerpost; - diffData.Header.Name += innerpost; - diffData.Header.Description += innerpost; + diffData.Header.SetFieldValue(Models.Metadata.Header.NameKey, diffData.Header.GetFieldValue(Models.Metadata.Header.NameKey) + innerpost); + diffData.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, diffData.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + innerpost); diffData.Items = []; outDatsArray[j] = diffData; #if NET40_OR_GREATER || NETCOREAPP @@ -574,17 +574,17 @@ namespace SabreTools.DatTools if (string.IsNullOrEmpty(datFile.Header.FileName)) datFile.Header.FileName = "All DATs"; - if (string.IsNullOrEmpty(datFile.Header.Name)) - datFile.Header.Name = "All DATs"; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey))) + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, "All DATs"); - if (string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.Description = "All DATs"; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, "All DATs"); string post = " (No Duplicates)"; DatFile outerDiffData = DatFile.Create(datFile.Header); outerDiffData.Header.FileName += post; - outerDiffData.Header.Name += post; - outerDiffData.Header.Description += post; + outerDiffData.Header.SetFieldValue(Models.Metadata.Header.NameKey, outerDiffData.Header.GetFieldValue(Models.Metadata.Header.NameKey) + post); + outerDiffData.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, outerDiffData.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + post); outerDiffData.Items = []; watch.Stop(); diff --git a/SabreTools.DatTools/DatFromDir.cs b/SabreTools.DatTools/DatFromDir.cs index 26889c02..b8d0a516 100644 --- a/SabreTools.DatTools/DatFromDir.cs +++ b/SabreTools.DatTools/DatFromDir.cs @@ -335,7 +335,7 @@ namespace SabreTools.DatTools string romname = string.Empty; // If we have a SuperDAT, we want anything that's not the base path as the game, and the file as the rom - if (datFile.Header.Type == "SuperDAT") + if (datFile.Header.GetFieldValue(Models.Metadata.Header.TypeKey) == "SuperDAT") { if (basePath != null) gamename = fulldir.Remove(0, basePath.Length + 1); @@ -384,7 +384,7 @@ namespace SabreTools.DatTools private static void ProcessFile(DatFile datFile, string item, string? basePath, HashType[] hashes, TreatAsFile asFiles) { logger.Verbose($"'{Path.GetFileName(item)}' treated like a file"); - BaseFile? baseFile = BaseFile.GetInfo(item, header: datFile.Header.HeaderSkipper, hashes: hashes, asFiles: asFiles); + BaseFile? baseFile = BaseFile.GetInfo(item, header: datFile.Header.GetFieldValue(Models.Metadata.Header.HeaderKey), hashes: hashes, asFiles: asFiles); DatItem? datItem = DatItem.Create(baseFile); if (datItem != null) ProcessFileHelper(datFile, item, datItem, basePath, string.Empty); @@ -447,7 +447,7 @@ namespace SabreTools.DatTools if (string.IsNullOrEmpty(parent)) { // If we have a SuperDAT, we want anything that's not the base path as the game, and the file as the rom - if (datFile.Header.Type == "SuperDAT") + if (datFile.Header.GetFieldValue(Models.Metadata.Header.TypeKey) == "SuperDAT") { machineName = Path.GetDirectoryName(item.Remove(0, basepath?.Length ?? 0)); itemName = Path.GetFileName(item); @@ -468,7 +468,7 @@ namespace SabreTools.DatTools else { // If we have a SuperDAT, we want the archive name as the game, and the file as everything else (?) - if (datFile.Header.Type == "SuperDAT") + if (datFile.Header.GetFieldValue(Models.Metadata.Header.TypeKey) == "SuperDAT") { machineName = parent; itemName = datItem.GetName(); diff --git a/SabreTools.DatTools/Rebuilder.cs b/SabreTools.DatTools/Rebuilder.cs index cbd845bb..1535d1e7 100644 --- a/SabreTools.DatTools/Rebuilder.cs +++ b/SabreTools.DatTools/Rebuilder.cs @@ -65,8 +65,8 @@ namespace SabreTools.DatTools outDir = outDir.Ensure(create: true); // Now we want to get forcepack flag if it's not overridden - if (outputFormat == OutputFormat.Folder && datFile.Header.ForcePacking != PackingFlag.None) - outputFormat = GetOutputFormat(datFile.Header.ForcePacking); + if (outputFormat == OutputFormat.Folder && datFile.Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) != PackingFlag.None) + outputFormat = GetOutputFormat(datFile.Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey)); #endregion @@ -219,8 +219,8 @@ namespace SabreTools.DatTools } // Now we want to get forcepack flag if it's not overridden - if (outputFormat == OutputFormat.Folder && datFile.Header.ForcePacking != PackingFlag.None) - outputFormat = GetOutputFormat(datFile.Header.ForcePacking); + if (outputFormat == OutputFormat.Folder && datFile.Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) != PackingFlag.None) + outputFormat = GetOutputFormat(datFile.Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey)); #endregion @@ -427,7 +427,7 @@ namespace SabreTools.DatTools // Special case for partial packing mode bool shouldCheck = false; - if (outputFormat == OutputFormat.Folder && datFile.Header.ForcePacking == PackingFlag.Partial) + if (outputFormat == OutputFormat.Folder && datFile.Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) == PackingFlag.Partial) { shouldCheck = true; datFile.Items.BucketBy(ItemKey.Machine, DedupeType.None, lower: false); @@ -459,11 +459,11 @@ namespace SabreTools.DatTools } // Now we want to take care of headers, if applicable - if (datFile.Header.HeaderSkipper != null) + if (datFile.Header.GetFieldValue(Models.Metadata.Header.HeaderKey) != null) { // Check to see if we have a matching header first SkipperMatch.Init(); - Rule rule = SkipperMatch.GetMatchingRule(fileStream, Path.GetFileNameWithoutExtension(datFile.Header.HeaderSkipper)); + Rule rule = SkipperMatch.GetMatchingRule(fileStream, Path.GetFileNameWithoutExtension(datFile.Header.GetFieldValue(Models.Metadata.Header.HeaderKey)!)); // If there's a match, create the new file to write if (rule.Tests != null && rule.Tests.Length != 0) diff --git a/SabreTools.DatTools/Splitter.cs b/SabreTools.DatTools/Splitter.cs index 6b7161c4..0bc1775d 100644 --- a/SabreTools.DatTools/Splitter.cs +++ b/SabreTools.DatTools/Splitter.cs @@ -56,13 +56,13 @@ namespace SabreTools.DatTools // Set all of the appropriate outputs for each of the subsets DatFile extADat = DatFile.Create(datFile.Header.CloneStandard()); extADat.Header.FileName += $" ({newExtAString})"; - extADat.Header.Name += $" ({newExtAString})"; - extADat.Header.Description += $" ({newExtAString})"; + extADat.Header.SetFieldValue(Models.Metadata.Header.NameKey, extADat.Header.GetFieldValue(Models.Metadata.Header.NameKey) + $" ({newExtAString})"); + extADat.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, extADat.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + $" ({newExtAString})"); DatFile extBDat = DatFile.Create(datFile.Header.CloneStandard()); extBDat.Header.FileName += $" ({newExtBString})"; - extBDat.Header.Name += $" ({newExtBString})"; - extBDat.Header.Description += $" ({newExtBString})"; + extBDat.Header.SetFieldValue(Models.Metadata.Header.NameKey, extBDat.Header.GetFieldValue(Models.Metadata.Header.NameKey) + $" ({newExtBString})"); + extBDat.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, extBDat.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + $" ({newExtBString})"); // Now separate the roms accordingly #if NET452_OR_GREATER || NETCOREAPP @@ -124,43 +124,43 @@ namespace SabreTools.DatTools // TODO: Can this be made into a loop? fieldDats[Models.Metadata.Rom.StatusKey] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats[Models.Metadata.Rom.StatusKey].Header.FileName += " (Nodump)"; - fieldDats[Models.Metadata.Rom.StatusKey].Header.Name += " (Nodump)"; - fieldDats[Models.Metadata.Rom.StatusKey].Header.Description += " (Nodump)"; + fieldDats[Models.Metadata.Rom.StatusKey].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats[Models.Metadata.Rom.StatusKey].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (Nodump)"); + fieldDats[Models.Metadata.Rom.StatusKey].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats[Models.Metadata.Rom.StatusKey].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (Nodump)"); fieldDats[Models.Metadata.Rom.SHA512Key] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats[Models.Metadata.Rom.SHA512Key].Header.FileName += " (SHA-512)"; - fieldDats[Models.Metadata.Rom.SHA512Key].Header.Name += " (SHA-512)"; - fieldDats[Models.Metadata.Rom.SHA512Key].Header.Description += " (SHA-512)"; + fieldDats[Models.Metadata.Rom.SHA512Key].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats[Models.Metadata.Rom.SHA512Key].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (SHA-512)"); + fieldDats[Models.Metadata.Rom.SHA512Key].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats[Models.Metadata.Rom.SHA512Key].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (SHA-512)"); fieldDats[Models.Metadata.Rom.SHA384Key] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats[Models.Metadata.Rom.SHA384Key].Header.FileName += " (SHA-384)"; - fieldDats[Models.Metadata.Rom.SHA384Key].Header.Name += " (SHA-384)"; - fieldDats[Models.Metadata.Rom.SHA384Key].Header.Description += " (SHA-384)"; + fieldDats[Models.Metadata.Rom.SHA384Key].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats[Models.Metadata.Rom.SHA384Key].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (SHA-384)"); + fieldDats[Models.Metadata.Rom.SHA384Key].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats[Models.Metadata.Rom.SHA384Key].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (SHA-384)"); fieldDats[Models.Metadata.Rom.SHA256Key] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats[Models.Metadata.Rom.SHA256Key].Header.FileName += " (SHA-256)"; - fieldDats[Models.Metadata.Rom.SHA256Key].Header.Name += " (SHA-256)"; - fieldDats[Models.Metadata.Rom.SHA256Key].Header.Description += " (SHA-256)"; + fieldDats[Models.Metadata.Rom.SHA256Key].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats[Models.Metadata.Rom.SHA256Key].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (SHA-256)"); + fieldDats[Models.Metadata.Rom.SHA256Key].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats[Models.Metadata.Rom.SHA256Key].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (SHA-256)"); fieldDats[Models.Metadata.Rom.SHA1Key] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats[Models.Metadata.Rom.SHA1Key].Header.FileName += " (SHA-1)"; - fieldDats[Models.Metadata.Rom.SHA1Key].Header.Name += " (SHA-1)"; - fieldDats[Models.Metadata.Rom.SHA1Key].Header.Description += " (SHA-1)"; + fieldDats[Models.Metadata.Rom.SHA1Key].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats[Models.Metadata.Rom.SHA1Key].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (SHA-1)"); + fieldDats[Models.Metadata.Rom.SHA1Key].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats[Models.Metadata.Rom.SHA1Key].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (SHA-1)"); fieldDats[Models.Metadata.Rom.MD5Key] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats[Models.Metadata.Rom.MD5Key].Header.FileName += " (MD5)"; - fieldDats[Models.Metadata.Rom.MD5Key].Header.Name += " (MD5)"; - fieldDats[Models.Metadata.Rom.MD5Key].Header.Description += " (MD5)"; + fieldDats[Models.Metadata.Rom.MD5Key].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats[Models.Metadata.Rom.MD5Key].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (MD5)"); + fieldDats[Models.Metadata.Rom.MD5Key].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats[Models.Metadata.Rom.MD5Key].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (MD5)"); fieldDats[Models.Metadata.Rom.CRCKey] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats[Models.Metadata.Rom.CRCKey].Header.FileName += " (CRC)"; - fieldDats[Models.Metadata.Rom.CRCKey].Header.Name += " (CRC)"; - fieldDats[Models.Metadata.Rom.CRCKey].Header.Description += " (CRC)"; + fieldDats[Models.Metadata.Rom.CRCKey].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats[Models.Metadata.Rom.CRCKey].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (CRC)"); + fieldDats[Models.Metadata.Rom.CRCKey].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats[Models.Metadata.Rom.CRCKey].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (CRC)"); fieldDats["null"] = DatFile.Create(datFile.Header.CloneStandard()); fieldDats["null"].Header.FileName += " (Other)"; - fieldDats["null"].Header.Name += " (Other)"; - fieldDats["null"].Header.Description += " (Other)"; + fieldDats["null"].Header.SetFieldValue(Models.Metadata.Header.NameKey, fieldDats["null"].Header.GetFieldValue(Models.Metadata.Header.NameKey) + " (Other)"); + fieldDats["null"].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, fieldDats["null"].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + " (Other)"); // Now populate each of the DAT objects in turn #if NET452_OR_GREATER || NETCOREAPP @@ -264,7 +264,7 @@ namespace SabreTools.DatTools // Create a temporary DAT to add things to DatFile tempDat = DatFile.Create(datFile.Header); - tempDat.Header.Name = null; + tempDat.Header.SetFieldValue(Models.Metadata.Header.NameKey, null); // Sort the input keys List keys = [.. datFile.Items.Keys]; @@ -280,11 +280,11 @@ namespace SabreTools.DatTools #endif { // Here, the key is the name of the game to be used for comparison - if (tempDat.Header.Name != null && tempDat.Header.Name != Path.GetDirectoryName(key)) + if (tempDat.Header.GetFieldValue(Models.Metadata.Header.NameKey) != null && tempDat.Header.GetFieldValue(Models.Metadata.Header.NameKey) != Path.GetDirectoryName(key)) { // Reset the DAT for the next items tempDat = DatFile.Create(datFile.Header); - tempDat.Header.Name = null; + tempDat.Header.SetFieldValue(Models.Metadata.Header.NameKey, null); } // Clean the input list and set all games to be pathless @@ -302,7 +302,7 @@ namespace SabreTools.DatTools tempDat.Items.AddRange(key, items); // Then set the DAT name to be the parent directory name - tempDat.Header.Name = Path.GetDirectoryName(key); + tempDat.Header.SetFieldValue(Models.Metadata.Header.NameKey, Path.GetDirectoryName(key)); #if NET40_OR_GREATER || NETCOREAPP }); #else @@ -342,7 +342,7 @@ namespace SabreTools.DatTools private static void SplitByLevelHelper(DatFile datFile, DatFile newDatFile, string outDir, bool shortname, bool restore) { // Get the name from the DAT to use separately - string? name = newDatFile.Header.Name; + string? name = newDatFile.Header.GetFieldValue(Models.Metadata.Header.NameKey); string? expName = name?.Replace("/", " - ")?.Replace("\\", " - "); // Now set the new output values @@ -363,9 +363,9 @@ namespace SabreTools.DatTools ); #endif newDatFile.Header.FileName = restore ? $"{datFile.Header.FileName} ({newDatFile.Header.FileName})" : newDatFile.Header.FileName; - newDatFile.Header.Name = $"{datFile.Header.Name} ({expName})"; - newDatFile.Header.Description = string.IsNullOrEmpty(datFile.Header.Description) ? newDatFile.Header.Name : $"{datFile.Header.Description} ({expName})"; - newDatFile.Header.Type = null; + newDatFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, $"{datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)} ({expName})"); + newDatFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)) ? newDatFile.Header.GetFieldValue(Models.Metadata.Header.NameKey) : $"{datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)} ({expName})"); + newDatFile.Header.SetFieldValue(Models.Metadata.Header.TypeKey, null); // Write out the temporary DAT to the proper directory Writer.Write(newDatFile, outDir); @@ -384,13 +384,13 @@ namespace SabreTools.DatTools DatFile lessThan = DatFile.Create(datFile.Header.CloneStandard()); lessThan.Header.FileName += $" (less than {radix})"; - lessThan.Header.Name += $" (less than {radix})"; - lessThan.Header.Description += $" (less than {radix})"; + lessThan.Header.SetFieldValue(Models.Metadata.Header.NameKey, lessThan.Header.GetFieldValue(Models.Metadata.Header.NameKey) + $" (less than {radix})"); + lessThan.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, lessThan.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + $" (less than {radix})"); DatFile greaterThan = DatFile.Create(datFile.Header.CloneStandard()); greaterThan.Header.FileName += $" (equal-greater than {radix})"; - greaterThan.Header.Name += $" (equal-greater than {radix})"; - greaterThan.Header.Description += $" (equal-greater than {radix})"; + greaterThan.Header.SetFieldValue(Models.Metadata.Header.NameKey, greaterThan.Header.GetFieldValue(Models.Metadata.Header.NameKey) + $" (equal-greater than {radix})"); + greaterThan.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, greaterThan.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + $" (equal-greater than {radix})"); // Now populate each of the DAT objects in turn #if NET452_OR_GREATER || NETCOREAPP @@ -466,8 +466,8 @@ namespace SabreTools.DatTools long currentIndex = 0; DatFile currentDat = DatFile.Create(datFile.Header.CloneStandard()); currentDat.Header.FileName += $"_{currentIndex}"; - currentDat.Header.Name += $"_{currentIndex}"; - currentDat.Header.Description += $"_{currentIndex}"; + currentDat.Header.SetFieldValue(Models.Metadata.Header.NameKey, currentDat.Header.GetFieldValue(Models.Metadata.Header.NameKey) + $"_{currentIndex}"); + currentDat.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, currentDat.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + $"_{currentIndex}"); // Loop through each machine foreach (string machine in keys) @@ -509,8 +509,8 @@ namespace SabreTools.DatTools currentIndex++; currentDat = DatFile.Create(datFile.Header.CloneStandard()); currentDat.Header.FileName += $"_{currentIndex}"; - currentDat.Header.Name += $"_{currentIndex}"; - currentDat.Header.Description += $"_{currentIndex}"; + currentDat.Header.SetFieldValue(Models.Metadata.Header.NameKey, currentDat.Header.GetFieldValue(Models.Metadata.Header.NameKey) + $"_{currentIndex}"); + currentDat.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, currentDat.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + $"_{currentIndex}"); } // Add the current machine to the current DatFile @@ -553,8 +553,8 @@ namespace SabreTools.DatTools { typeDats[itemType] = DatFile.Create(datFile.Header.CloneStandard()); typeDats[itemType].Header.FileName += $" ({itemType})"; - typeDats[itemType].Header.Name += $" ({itemType})"; - typeDats[itemType].Header.Description += $" ({itemType})"; + typeDats[itemType].Header.SetFieldValue(Models.Metadata.Header.NameKey, typeDats[itemType].Header.GetFieldValue(Models.Metadata.Header.NameKey) + $" ({itemType})"); + typeDats[itemType].Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, typeDats[itemType].Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) + $" ({itemType})"); } // Now populate each of the DAT objects in turn diff --git a/SabreTools.DatTools/Verification.cs b/SabreTools.DatTools/Verification.cs index 98bca1c0..7ac7fd71 100644 --- a/SabreTools.DatTools/Verification.cs +++ b/SabreTools.DatTools/Verification.cs @@ -105,8 +105,8 @@ namespace SabreTools.DatTools // Set fixdat headers in case of writing out datFile.Header.FileName = $"fixDAT_{datFile.Header.FileName}"; - datFile.Header.Name = $"fixDAT_{datFile.Header.Name}"; - datFile.Header.Description = $"fixDAT_{datFile.Header.Description}"; + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, $"fixDAT_{datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)}"); + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, $"fixDAT_{datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)}"); datFile.Items.ClearMarked(); return success; @@ -154,8 +154,8 @@ namespace SabreTools.DatTools // Set fixdat headers in case of writing out datFile.Header.FileName = $"fixDAT_{datFile.Header.FileName}"; - datFile.Header.Name = $"fixDAT_{datFile.Header.Name}"; - datFile.Header.Description = $"fixDAT_{datFile.Header.Description}"; + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, $"fixDAT_{datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)}"); + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, $"fixDAT_{datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)}"); datFile.Items.ClearMarked(); return success; diff --git a/SabreTools.DatTools/Writer.cs b/SabreTools.DatTools/Writer.cs index 0a7d63a3..d75b13da 100644 --- a/SabreTools.DatTools/Writer.cs +++ b/SabreTools.DatTools/Writer.cs @@ -153,30 +153,49 @@ namespace SabreTools.DatTools // Empty FileName if (string.IsNullOrEmpty(datFile.Header.FileName)) { - if (string.IsNullOrEmpty(datFile.Header.Name) && string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.FileName = datFile.Header.Name = datFile.Header.Description = "Default"; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + { + datFile.Header.FileName = "Default"; + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, "Default"); + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, "Default"); + } - else if (string.IsNullOrEmpty(datFile.Header.Name) && !string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.FileName = datFile.Header.Name = datFile.Header.Description; + else if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)) && !string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + { + datFile.Header.FileName = datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey); + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)); + } - else if (!string.IsNullOrEmpty(datFile.Header.Name) && string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.FileName = datFile.Header.Description = datFile.Header.Name; + else if (!string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + { + datFile.Header.FileName = datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey); + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)); + } - else if (!string.IsNullOrEmpty(datFile.Header.Name) && !string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.FileName = datFile.Header.Description; + else if (!string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)) && !string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + { + datFile.Header.FileName = datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey); + } } // Filled FileName else { - if (string.IsNullOrEmpty(datFile.Header.Name) && string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.Name = datFile.Header.Description = datFile.Header.FileName; + if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + { + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, datFile.Header.FileName); + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, datFile.Header.FileName); + } - else if (string.IsNullOrEmpty(datFile.Header.Name) && !string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.Name = datFile.Header.Description; + else if (string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)) && !string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + { + datFile.Header.SetFieldValue(Models.Metadata.Header.NameKey, datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)); + } - else if (!string.IsNullOrEmpty(datFile.Header.Name) && string.IsNullOrEmpty(datFile.Header.Description)) - datFile.Header.Description = datFile.Header.Name; + else if (!string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(datFile.Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) + { + datFile.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, datFile.Header.GetFieldValue(Models.Metadata.Header.NameKey)); + } } } diff --git a/SabreTools.Filtering/Cleaner.cs b/SabreTools.Filtering/Cleaner.cs index 625768d1..937ee2cf 100644 --- a/SabreTools.Filtering/Cleaner.cs +++ b/SabreTools.Filtering/Cleaner.cs @@ -417,7 +417,7 @@ namespace SabreTools.Filtering internal static void SetOneRomPerGame(DatFile datFile) { // Because this introduces subfolders, we need to set the SuperDAT type - datFile.Header.Type = "SuperDAT"; + datFile.Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); // For each rom, we want to update the game to be "/" #if NET452_OR_GREATER || NETCOREAPP diff --git a/SabreTools.Filtering/Splitter.cs b/SabreTools.Filtering/Splitter.cs index 9498ca3c..df128e14 100644 --- a/SabreTools.Filtering/Splitter.cs +++ b/SabreTools.Filtering/Splitter.cs @@ -53,7 +53,7 @@ namespace SabreTools.Filtering { // If we are using tags from the DAT, set the proper input for split type unless overridden if (useTags && SplitType == MergingFlag.None) - SplitType = datFile.Header.ForceMerging; + SplitType = datFile.Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey); // Run internal splitting switch (SplitType) diff --git a/SabreTools/Features/BaseFeature.cs b/SabreTools/Features/BaseFeature.cs index cd80a11b..35d44a98 100644 --- a/SabreTools/Features/BaseFeature.cs +++ b/SabreTools/Features/BaseFeature.cs @@ -1806,7 +1806,7 @@ Some special strings that can be used: /// Pre-configured Remover /// protected Remover? Remover { get; set; } - + /// /// Determines if scripting mode is enabled /// @@ -1904,11 +1904,11 @@ Some special strings that can be used: // Set threading flag, if necessary if (features.ContainsKey(ThreadsInt32Value)) Globals.MaxThreads = GetInt32(features, ThreadsInt32Value); - + // Failure conditions if (Header == null) return false; - + return true; } @@ -2153,30 +2153,15 @@ Some special strings that can be used: var datHeader = new DatHeader() { AddExtension = GetString(features, AddExtensionStringValue), - Author = GetString(features, AuthorStringValue), - Category = GetString(features, CategoryStringValue), - Comment = GetString(features, CommentStringValue), - Date = GetString(features, DateStringValue), - Description = GetString(features, DescriptionStringValue), - Email = GetString(features, EmailStringValue), FileName = GetString(features, FilenameStringValue), - ForceMerging = GetString(features, ForceMergingStringValue).AsEnumValue(), - ForceNodump = GetString(features, ForceNodumpStringValue).AsEnumValue(), - ForcePacking = GetString(features, ForcePackingStringValue).AsEnumValue(), GameName = GetBoolean(features, GamePrefixValue), - HeaderSkipper = GetString(features, HeaderStringValue), - Homepage = GetString(features, HomepageStringValue), - Name = GetString(features, NameStringValue), Postfix = GetString(features, PostfixStringValue), Prefix = GetString(features, PrefixStringValue), Quotes = GetBoolean(features, QuotesValue), RemoveExtension = GetBoolean(features, RemoveExtensionsValue), ReplaceExtension = GetString(features, ReplaceExtensionStringValue), - RootDir = GetString(features, RootStringValue), - Type = GetBoolean(features, SuperdatValue) ? "SuperDAT" : null, - Url = GetString(features, UrlStringValue), UseRomName = GetBoolean(features, RomsValue), - Version = GetString(features, VersionStringValue), + // Get the depot information InputDepot = new DepotInformation( GetBoolean(features, DepotValue), @@ -2185,6 +2170,22 @@ Some special strings that can be used: GetBoolean(features, RombaValue), GetInt32(features, RombaDepthInt32Value)) }; + datHeader.SetFieldValue(Models.Metadata.Header.AuthorKey, GetString(features, AuthorStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.CategoryKey, GetString(features, CategoryStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.CommentKey, GetString(features, CommentStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.DateKey, GetString(features, DateStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.DescriptionKey, GetString(features, DescriptionStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.EmailKey, GetString(features, EmailStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.ForceMergingKey, GetString(features, ForceMergingStringValue).AsEnumValue()); + datHeader.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, GetString(features, ForceNodumpStringValue).AsEnumValue()); + datHeader.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, GetString(features, ForcePackingStringValue).AsEnumValue()); + datHeader.SetFieldValue(Models.Metadata.Header.HeaderKey, GetString(features, HeaderStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.HomepageKey, GetString(features, HomepageStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.NameKey, GetString(features, NameStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.RootDirKey, GetString(features, RootStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.TypeKey, GetBoolean(features, SuperdatValue) ? "SuperDAT" : null); + datHeader.SetFieldValue(Models.Metadata.Header.UrlKey, GetString(features, UrlStringValue)); + datHeader.SetFieldValue(Models.Metadata.Header.VersionKey, GetString(features, VersionStringValue)); bool deprecated = GetBoolean(features, DeprecatedValue); foreach (string ot in GetList(features, OutputTypeListValue)) @@ -2253,7 +2254,7 @@ Some special strings that can be used: private static Remover GetRemover(Dictionary features) { Remover remover = new(); - + // Populate field exclusions List exclusionFields = GetList(features, ExcludeFieldListValue); remover.PopulateExclusionsFromList(exclusionFields); @@ -2296,7 +2297,7 @@ Some special strings that can be used: } #endregion - + #region Protected Helpers /// @@ -2387,7 +2388,7 @@ CREATE TABLE IF NOT EXISTS data ( _ => 0x0, }; } - + #endregion } } diff --git a/SabreTools/Features/DatFromDir.cs b/SabreTools/Features/DatFromDir.cs index 0f4033ee..f733bb60 100644 --- a/SabreTools/Features/DatFromDir.cs +++ b/SabreTools/Features/DatFromDir.cs @@ -72,7 +72,7 @@ namespace SabreTools.Features // Create a new DATFromDir object and process the inputs DatFile basedat = DatFile.Create(Header!); - basedat.Header.Date = DateTime.Now.ToString("yyyy-MM-dd"); + basedat.Header.SetFieldValue(Models.Metadata.Header.DateKey, DateTime.Now.ToString("yyyy-MM-dd")); // For each input directory, create a DAT foreach (string path in Inputs) diff --git a/SabreTools/Features/Sort.cs b/SabreTools/Features/Sort.cs index 1827f33b..09dcaccb 100644 --- a/SabreTools/Features/Sort.cs +++ b/SabreTools/Features/Sort.cs @@ -6,6 +6,7 @@ using SabreTools.FileTypes; using SabreTools.Help; using SabreTools.IO; using SabreTools.Logging; +using SabreTools.Models.InstallShieldCabinet; namespace SabreTools.Features { @@ -101,8 +102,8 @@ namespace SabreTools.Features datdata.Header.OutputDepot = Header.OutputDepot?.Clone() as DepotInformation; // If we have overridden the header skipper, set it now - if (!string.IsNullOrEmpty(Header.HeaderSkipper)) - datdata.Header.HeaderSkipper = Header.HeaderSkipper; + if (!string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.HeaderKey))) + datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, Header.GetFieldValue(Models.Metadata.Header.HeaderKey)); // If we have the depot flag, respect it bool success; @@ -115,8 +116,8 @@ namespace SabreTools.Features if (success && updateDat) { datdata.Header.FileName = $"fixDAT_{Header.FileName}"; - datdata.Header.Name = $"fixDAT_{Header.Name}"; - datdata.Header.Description = $"fixDAT_{Header.Description}"; + datdata.Header.SetFieldValue(Models.Metadata.Header.NameKey, $"fixDAT_{Header.GetFieldValue(Models.Metadata.Header.NameKey)}"); + datdata.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, $"fixDAT_{Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)}"); datdata.Items.ClearMarked(); Writer.Write(datdata, OutputDir); } @@ -140,8 +141,8 @@ namespace SabreTools.Features datdata.Header.OutputDepot = Header.OutputDepot?.Clone() as DepotInformation; // If we have overridden the header skipper, set it now - if (!string.IsNullOrEmpty(Header.HeaderSkipper)) - datdata.Header.HeaderSkipper = Header.HeaderSkipper; + if (!string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.HeaderKey))) + datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, Header.GetFieldValue(Models.Metadata.Header.HeaderKey)); watch.Stop(); @@ -156,8 +157,8 @@ namespace SabreTools.Features if (success && updateDat) { datdata.Header.FileName = $"fixDAT_{Header.FileName}"; - datdata.Header.Name = $"fixDAT_{Header.Name}"; - datdata.Header.Description = $"fixDAT_{Header.Description}"; + datdata.Header.SetFieldValue(Models.Metadata.Header.NameKey, $"fixDAT_{Header.GetFieldValue(Models.Metadata.Header.NameKey)}"); + datdata.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, $"fixDAT_{Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)}"); datdata.Items.ClearMarked(); Writer.Write(datdata, OutputDir); } diff --git a/SabreTools/Features/Update.cs b/SabreTools/Features/Update.cs index ecb916d2..c153692d 100644 --- a/SabreTools/Features/Update.cs +++ b/SabreTools/Features/Update.cs @@ -107,34 +107,34 @@ namespace SabreTools.Features && !(updateMode.HasFlag(UpdateMode.DiffAgainst) || updateMode.HasFlag(UpdateMode.BaseReplace))) { // Get the values that will be used - if (string.IsNullOrWhiteSpace(Header.Date)) - Header.Date = DateTime.Now.ToString("yyyy-MM-dd"); + if (string.IsNullOrWhiteSpace(Header.GetFieldValue(Models.Metadata.Header.DateKey))) + Header.SetFieldValue(Models.Metadata.Header.DateKey, DateTime.Now.ToString("yyyy-MM-dd")); - if (string.IsNullOrWhiteSpace(Header.Name)) + if (string.IsNullOrWhiteSpace(Header.GetFieldValue(Models.Metadata.Header.NameKey))) { - Header.Name = (updateMode != 0 ? "DiffDAT" : "MergeDAT") - + (Header.Type == "SuperDAT" ? "-SuperDAT" : string.Empty) - + (Cleaner!.DedupeRoms != DedupeType.None ? "-deduped" : string.Empty); + Header.SetFieldValue(Models.Metadata.Header.NameKey, (updateMode != 0 ? "DiffDAT" : "MergeDAT") + + (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == "SuperDAT" ? "-SuperDAT" : string.Empty) + + (Cleaner!.DedupeRoms != DedupeType.None ? "-deduped" : string.Empty)); } - if (string.IsNullOrWhiteSpace(Header.Description)) + if (string.IsNullOrWhiteSpace(Header.GetFieldValue(Models.Metadata.Header.DescriptionKey))) { - Header.Description = (updateMode != 0 ? "DiffDAT" : "MergeDAT") - + (Header.Type == "SuperDAT" ? "-SuperDAT" : string.Empty) - + (Cleaner!.DedupeRoms != DedupeType.None ? " - deduped" : string.Empty); + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, (updateMode != 0 ? "DiffDAT" : "MergeDAT") + + (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == "SuperDAT" ? "-SuperDAT" : string.Empty) + + (Cleaner!.DedupeRoms != DedupeType.None ? " - deduped" : string.Empty)); if (!GetBoolean(features, NoAutomaticDateValue)) - Header.Description += $" ({Header.Date})"; + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, $"{Header.GetFieldValue(Models.Metadata.Header.DescriptionKey)} ({Header.GetFieldValue(Models.Metadata.Header.DateKey)})"); } - if (string.IsNullOrWhiteSpace(Header.Category) && updateMode != 0) - Header.Category = "DiffDAT"; + if (string.IsNullOrWhiteSpace(Header.GetFieldValue(Models.Metadata.Header.CategoryKey)) && updateMode != 0) + Header.SetFieldValue(Models.Metadata.Header.CategoryKey, "DiffDAT"); - if (string.IsNullOrWhiteSpace(Header.Author)) - Header.Author = $"SabreTools {Prepare.Version}"; + if (string.IsNullOrWhiteSpace(Header.GetFieldValue(Models.Metadata.Header.AuthorKey))) + Header.SetFieldValue(Models.Metadata.Header.AuthorKey, $"SabreTools {Prepare.Version}"); - if (string.IsNullOrWhiteSpace(Header.Comment)) - Header.Comment = $"Generated by SabreTools {Prepare.Version}"; + if (string.IsNullOrWhiteSpace(Header.GetFieldValue(Models.Metadata.Header.CommentKey))) + Header.SetFieldValue(Models.Metadata.Header.CommentKey, $"Generated by SabreTools {Prepare.Version}"); } // If no update fields are set, default to Names @@ -290,8 +290,8 @@ namespace SabreTools.Features datHeaders[j] = userInputDat.Header; datHeaders[j].FileName += innerpost; - datHeaders[j].Name += innerpost; - datHeaders[j].Description += innerpost; + datHeaders[j].SetFieldValue(Models.Metadata.Header.NameKey, datHeaders[j].GetFieldValue(Models.Metadata.Header.NameKey) + innerpost); + datHeaders[j].SetFieldValue(Models.Metadata.Header.DescriptionKey, datHeaders[j].GetFieldValue(Models.Metadata.Header.DescriptionKey) + innerpost); } #if NET40_OR_GREATER || NETCOREAPP }); @@ -409,7 +409,7 @@ namespace SabreTools.Features if (updateMode.HasFlag(UpdateMode.Merge)) { // If we're in SuperDAT mode, prefix all games with their respective DATs - if (string.Equals(userInputDat.Header.Type, "SuperDAT", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(userInputDat.Header.GetFieldValue(Models.Metadata.Header.TypeKey), "SuperDAT", StringComparison.OrdinalIgnoreCase)) DatFileTool.ApplySuperDAT(userInputDat, inputPaths); Writer.Write(userInputDat, OutputDir); diff --git a/SabreTools/Features/Verify.cs b/SabreTools/Features/Verify.cs index 53ca7e5c..78f6bf6b 100644 --- a/SabreTools/Features/Verify.cs +++ b/SabreTools/Features/Verify.cs @@ -75,8 +75,8 @@ namespace SabreTools.Features datdata.Header.InputDepot = Header!.InputDepot?.Clone() as DepotInformation; // If we have overridden the header skipper, set it now - if (!string.IsNullOrEmpty(Header.HeaderSkipper)) - datdata.Header.HeaderSkipper = Header.HeaderSkipper; + if (!string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.HeaderKey))) + datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, Header.GetFieldValue(Models.Metadata.Header.HeaderKey)); // If we have the depot flag, respect it if (Header.InputDepot?.IsActive ?? false) @@ -123,8 +123,8 @@ namespace SabreTools.Features datdata.Header.InputDepot = Header!.InputDepot?.Clone() as DepotInformation; // If we have overridden the header skipper, set it now - if (!string.IsNullOrEmpty(Header.HeaderSkipper)) - datdata.Header.HeaderSkipper = Header.HeaderSkipper; + if (!string.IsNullOrEmpty(Header.GetFieldValue(Models.Metadata.Header.HeaderKey))) + datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, Header.GetFieldValue(Models.Metadata.Header.HeaderKey)); watch.Stop();