using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.DatFiles.Formats; using SabreTools.Filter; namespace SabreTools.DatFiles { /// /// Represents all possible DAT header information /// [JsonObject("header"), XmlRoot("header")] public class DatHeader : ICloneable { #region Constants /// /// Add a new extension to all items /// public const string AddExtensionKey = "ADDEXTENSION"; /// /// Read or write format /// public const string DatFormatKey = "DATFORMAT"; /// /// External name of the DAT /// public const string FileNameKey = "FILENAME"; /// /// Output the machine name /// public const string GameNameKey = "GAMENAME"; /// /// Input depot information /// public const string InputDepotKey = "INPUTDEPOT"; /// /// Output depot information /// public const string OutputDepotKey = "OUTPUTDEPOT"; /// /// Text to append to all outputted lines /// public const string PostfixKey = "POSTFIX"; /// /// Text to prepend to all outputted lines /// public const string PrefixKey = "PREFIX"; /// /// Wrap quotes around the entire line, sans prefix and postfix /// public const string QuotesKey = "QUOTES"; /// /// Remove all item extensions /// public const string RemoveExtensionKey = "REMOVEEXTENSION"; /// /// Replace all item extensions /// public const string ReplaceExtensionKey = "REPLACEEXTENSION"; /// /// Output the item name /// public const string UseRomNameKey = "USEROMNAME"; #endregion #region Fields [JsonIgnore] public bool InfosSpecified { get { var infos = GetFieldValue(Models.Metadata.Header.InfosKey); return infos != null && infos.Length > 0; } } [JsonIgnore] public bool CanOpenSpecified { get { var canOpen = GetFieldValue(Models.Metadata.Header.CanOpenKey); return canOpen != null && canOpen.Length > 0; } } [JsonIgnore] public bool NewDatSpecified { get { return GetFieldValue("DATVERSIONURL") != null //&& GetFieldValue("DATURL") != null // TODO: Add to internal model && GetFieldValue("IMURL") != null; } } /// /// Internal Header model /// [JsonIgnore] private readonly Models.Metadata.Header _header = []; #endregion #region Instance Methods #region Constructors public DatHeader() { } public DatHeader(Models.Metadata.Header header) { // Get all fields to automatically copy without processing var nonItemFields = TypeHelper.GetConstants(typeof(Models.Metadata.Header)); if (nonItemFields == null) return; // Populate the internal machine from non-filter fields _header = []; foreach (string fieldName in nonItemFields) { if (header.ContainsKey(fieldName)) _header[fieldName] = header[fieldName]; } } #endregion #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 /// /// Clone the current header /// public object Clone() { var header = new DatHeader(); header.SetFieldValue(DatHeader.AddExtensionKey, GetFieldValue(DatHeader.AddExtensionKey)); 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(DatHeader.DatFormatKey, GetFieldValue(DatHeader.DatFormatKey)); 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(DatHeader.FileNameKey, GetFieldValue(DatHeader.FileNameKey)); 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(DatHeader.GameNameKey, GetFieldValue(DatHeader.GameNameKey)); 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(DatHeader.InputDepotKey, GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); header.SetFieldValue(DatHeader.OutputDepotKey, GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); 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(DatHeader.PostfixKey, GetFieldValue(DatHeader.PostfixKey)); header.SetFieldValue(DatHeader.PrefixKey, GetFieldValue(DatHeader.PrefixKey)); header.SetFieldValue(DatHeader.QuotesKey, GetFieldValue(DatHeader.QuotesKey)); header.SetFieldValue(DatHeader.RemoveExtensionKey, GetFieldValue(DatHeader.RemoveExtensionKey)); header.SetFieldValue(DatHeader.ReplaceExtensionKey, GetFieldValue(DatHeader.ReplaceExtensionKey)); 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(DatHeader.UseRomNameKey, GetFieldValue(DatHeader.UseRomNameKey)); header.SetFieldValue(Models.Metadata.Header.VersionKey, GetFieldValue(Models.Metadata.Header.VersionKey)); return header; } /// /// Clone the standard parts of the current header /// public DatHeader CloneStandard() { var header = new DatHeader(); 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(DatHeader.DatFormatKey, GetFieldValue(DatHeader.DatFormatKey)); header.SetFieldValue(Models.Metadata.Header.DescriptionKey, GetFieldValue(Models.Metadata.Header.DescriptionKey)); header.SetFieldValue(Models.Metadata.Header.EmailKey, GetFieldValue(Models.Metadata.Header.EmailKey)); header.SetFieldValue(DatHeader.FileNameKey, GetFieldValue(DatHeader.FileNameKey)); 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; } /// /// Clone the filtering parts of the current header /// public DatHeader CloneFiltering() { var header = new DatHeader(); header.SetFieldValue(DatHeader.AddExtensionKey, GetFieldValue(DatHeader.AddExtensionKey)); header.SetFieldValue(DatHeader.DatFormatKey, GetFieldValue(DatHeader.DatFormatKey)); header.SetFieldValue(DatHeader.GameNameKey, GetFieldValue(DatHeader.GameNameKey)); header.SetFieldValue(DatHeader.InputDepotKey, GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); header.SetFieldValue(DatHeader.OutputDepotKey, GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); header.SetFieldValue(DatHeader.PostfixKey, GetFieldValue(DatHeader.PostfixKey)); header.SetFieldValue(DatHeader.PrefixKey, GetFieldValue(DatHeader.PrefixKey)); header.SetFieldValue(DatHeader.RemoveExtensionKey, GetFieldValue(DatHeader.RemoveExtensionKey)); header.SetFieldValue(DatHeader.ReplaceExtensionKey, GetFieldValue(DatHeader.ReplaceExtensionKey)); header.SetFieldValue(DatHeader.QuotesKey, GetFieldValue(DatHeader.QuotesKey)); header.SetFieldValue(DatHeader.UseRomNameKey, GetFieldValue(DatHeader.UseRomNameKey)); return header; } /// /// Overwrite local values from another DatHeader if not default /// /// DatHeader to get the values from public void ConditionalCopy(DatHeader? datHeader) { if (datHeader == null) return; if (!string.IsNullOrEmpty(datHeader.GetFieldValue(DatHeader.FileNameKey))) SetFieldValue(DatHeader.FileNameKey, datHeader.GetFieldValue(DatHeader.FileNameKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.NameKey))) SetFieldValue(Models.Metadata.Header.NameKey, datHeader.GetFieldValue(Models.Metadata.Header.NameKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.DescriptionKey))) SetFieldValue(Models.Metadata.Header.DescriptionKey, datHeader.GetFieldValue(Models.Metadata.Header.DescriptionKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.RootDirKey))) SetFieldValue(Models.Metadata.Header.RootDirKey, datHeader.GetFieldValue(Models.Metadata.Header.RootDirKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.CategoryKey))) SetFieldValue(Models.Metadata.Header.CategoryKey, datHeader.GetFieldValue(Models.Metadata.Header.CategoryKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.VersionKey))) SetFieldValue(Models.Metadata.Header.VersionKey, datHeader.GetFieldValue(Models.Metadata.Header.VersionKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.DateKey))) SetFieldValue(Models.Metadata.Header.DateKey, datHeader.GetFieldValue(Models.Metadata.Header.DateKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.AuthorKey))) SetFieldValue(Models.Metadata.Header.AuthorKey, datHeader.GetFieldValue(Models.Metadata.Header.AuthorKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.EmailKey))) SetFieldValue(Models.Metadata.Header.EmailKey, datHeader.GetFieldValue(Models.Metadata.Header.EmailKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.HomepageKey))) SetFieldValue(Models.Metadata.Header.HomepageKey, datHeader.GetFieldValue(Models.Metadata.Header.HomepageKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.UrlKey))) SetFieldValue(Models.Metadata.Header.UrlKey, datHeader.GetFieldValue(Models.Metadata.Header.UrlKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.CommentKey))) SetFieldValue(Models.Metadata.Header.CommentKey, datHeader.GetFieldValue(Models.Metadata.Header.CommentKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.HeaderKey))) SetFieldValue(Models.Metadata.Header.HeaderKey, datHeader.GetFieldValue(Models.Metadata.Header.HeaderKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(Models.Metadata.Header.TypeKey))) SetFieldValue(Models.Metadata.Header.TypeKey, datHeader.GetFieldValue(Models.Metadata.Header.TypeKey)); if (datHeader.GetFieldValue(Models.Metadata.Header.ForceMergingKey) != MergingFlag.None) SetFieldValue(Models.Metadata.Header.ForceMergingKey, datHeader.GetFieldValue(Models.Metadata.Header.ForceMergingKey)); if (datHeader.GetFieldValue(Models.Metadata.Header.ForceNodumpKey) != NodumpFlag.None) SetFieldValue(Models.Metadata.Header.ForceNodumpKey, datHeader.GetFieldValue(Models.Metadata.Header.ForceNodumpKey)); if (datHeader.GetFieldValue(Models.Metadata.Header.ForcePackingKey) != PackingFlag.None) SetFieldValue(Models.Metadata.Header.ForcePackingKey, datHeader.GetFieldValue(Models.Metadata.Header.ForcePackingKey)); if (datHeader.GetFieldValue(DatHeader.DatFormatKey) != 0x00) SetFieldValue(DatHeader.DatFormatKey, datHeader.GetFieldValue(DatHeader.DatFormatKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(DatHeader.PrefixKey))) SetFieldValue(DatHeader.PrefixKey, datHeader.GetFieldValue(DatHeader.PrefixKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(DatHeader.PostfixKey))) SetFieldValue(DatHeader.PostfixKey, datHeader.GetFieldValue(DatHeader.PostfixKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(DatHeader.AddExtensionKey))) SetFieldValue(DatHeader.AddExtensionKey, datHeader.GetFieldValue(DatHeader.AddExtensionKey)); if (!string.IsNullOrEmpty(datHeader.GetFieldValue(DatHeader.ReplaceExtensionKey))) SetFieldValue(DatHeader.ReplaceExtensionKey, datHeader.GetFieldValue(DatHeader.ReplaceExtensionKey)); SetFieldValue(DatHeader.InputDepotKey, datHeader.GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); SetFieldValue(DatHeader.OutputDepotKey, datHeader.GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); SetFieldValue(DatHeader.GameNameKey, datHeader.GetFieldValue(DatHeader.GameNameKey)); SetFieldValue(DatHeader.QuotesKey, datHeader.GetFieldValue(DatHeader.QuotesKey)); SetFieldValue(DatHeader.RemoveExtensionKey, datHeader.GetFieldValue(DatHeader.RemoveExtensionKey)); SetFieldValue(DatHeader.UseRomNameKey, datHeader.GetFieldValue(DatHeader.UseRomNameKey)); } #endregion #region Manipulation /// /// Runs a filter and determines if it passes or not /// /// Filter runner to use for checking /// True if the Machine passes the filter, false otherwise public bool PassesFilter(FilterRunner filterRunner) => filterRunner.Run(_header); /// /// Remove a field from the header /// /// Field to remove /// True if the removal was successful, false otherwise public bool RemoveField(string fieldName) => FieldManipulator.RemoveField(_header, fieldName); /// /// Replace a field from another DatHeader /// /// DatHeader to replace field from /// Field to replace /// True if the replacement was successful, false otherwise public bool ReplaceField(DatHeader? other, string? fieldName) => FieldManipulator.ReplaceField(other?._header, _header, fieldName); /// /// Set a field in the header from a mapping string /// /// Field to set /// String representing the value to set /// True if the setting was successful, false otherwise /// This only performs minimal validation before setting public bool SetField(string? fieldName, string value) => FieldManipulator.SetField(_header, fieldName, value); #endregion #region Writing /// /// Generate a proper outfile name based on a DAT and output directory /// /// Output directory /// True if we ignore existing files (default), false otherwise /// Dictionary of output formats mapped to file names public Dictionary CreateOutFileNames(string outDir, bool overwrite = true) { // Create the output dictionary Dictionary outfileNames = []; // Double check the outDir for the end delim if (!outDir.EndsWith(Path.DirectorySeparatorChar.ToString())) outDir += Path.DirectorySeparatorChar; // Get all used extensions List usedExtensions = []; // Get the extensions from the output type #region .csv // CSV #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.CSV) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.CSV)) #endif { outfileNames.Add(DatFormat.CSV, CreateOutFileNamesHelper(outDir, ".csv", overwrite)); usedExtensions.Add(".csv"); }; #endregion #region .dat // ClrMamePro #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.ClrMamePro) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.ClrMamePro)) #endif { outfileNames.Add(DatFormat.ClrMamePro, CreateOutFileNamesHelper(outDir, ".dat", overwrite)); usedExtensions.Add(".dat"); }; // RomCenter #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RomCenter) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RomCenter)) #endif { if (usedExtensions.Contains(".dat")) { outfileNames.Add(DatFormat.RomCenter, CreateOutFileNamesHelper(outDir, ".rc.dat", overwrite)); usedExtensions.Add(".rc.dat"); } else { outfileNames.Add(DatFormat.RomCenter, CreateOutFileNamesHelper(outDir, ".dat", overwrite)); usedExtensions.Add(".dat"); } } // DOSCenter #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.DOSCenter) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.DOSCenter)) #endif { if (usedExtensions.Contains(".dat")) { outfileNames.Add(DatFormat.DOSCenter, CreateOutFileNamesHelper(outDir, ".dc.dat", overwrite)); usedExtensions.Add(".dc.dat"); } else { outfileNames.Add(DatFormat.DOSCenter, CreateOutFileNamesHelper(outDir, ".dat", overwrite)); usedExtensions.Add(".dat"); } } #endregion #region .json // JSON #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SabreJSON) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SabreJSON)) #endif { outfileNames.Add(DatFormat.SabreJSON, CreateOutFileNamesHelper(outDir, ".json", overwrite)); usedExtensions.Add(".json"); } #endregion #region .md5 // Redump MD5 #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpMD5) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpMD5)) #endif { outfileNames.Add(DatFormat.RedumpMD5, CreateOutFileNamesHelper(outDir, ".md5", overwrite)); usedExtensions.Add(".md5"); }; #endregion #region .sfv // Redump SFV #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSFV) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSFV)) #endif { outfileNames.Add(DatFormat.RedumpSFV, CreateOutFileNamesHelper(outDir, ".sfv", overwrite)); usedExtensions.Add(".sfv"); }; #endregion #region .sha1 // Redump SHA-1 #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA1) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA1)) #endif { outfileNames.Add(DatFormat.RedumpSHA1, CreateOutFileNamesHelper(outDir, ".sha1", overwrite)); usedExtensions.Add(".sha1"); }; #endregion #region .sha256 // Redump SHA-256 #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA256) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA256)) #endif { outfileNames.Add(DatFormat.RedumpSHA256, CreateOutFileNamesHelper(outDir, ".sha256", overwrite)); usedExtensions.Add(".sha256"); }; #endregion #region .sha384 // Redump SHA-384 #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA384) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA384)) #endif { outfileNames.Add(DatFormat.RedumpSHA384, CreateOutFileNamesHelper(outDir, ".sha384", overwrite)); usedExtensions.Add(".sha384"); }; #endregion #region .sha512 // Redump SHA-512 #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA512) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA512)) #endif { outfileNames.Add(DatFormat.RedumpSHA512, CreateOutFileNamesHelper(outDir, ".sha512", overwrite)); usedExtensions.Add(".sha512"); }; #endregion #region .spamsum // Redump SpamSum #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSpamSum) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSpamSum)) #endif { outfileNames.Add(DatFormat.RedumpSpamSum, CreateOutFileNamesHelper(outDir, ".spamsum", overwrite)); usedExtensions.Add(".spamsum"); }; #endregion #region .ssv // SSV #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SSV) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SSV)) #endif { outfileNames.Add(DatFormat.SSV, CreateOutFileNamesHelper(outDir, ".ssv", overwrite)); usedExtensions.Add(".ssv"); }; #endregion #region .tsv // TSV #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.TSV) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.TSV)) #endif { outfileNames.Add(DatFormat.TSV, CreateOutFileNamesHelper(outDir, ".tsv", overwrite)); usedExtensions.Add(".tsv"); }; #endregion #region .txt // AttractMode #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.AttractMode) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.AttractMode)) #endif { outfileNames.Add(DatFormat.AttractMode, CreateOutFileNamesHelper(outDir, ".txt", overwrite)); usedExtensions.Add(".txt"); } // MAME Listroms #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.Listrom) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.Listrom)) #endif { if (usedExtensions.Contains(".txt")) { outfileNames.Add(DatFormat.Listrom, CreateOutFileNamesHelper(outDir, ".lr.txt", overwrite)); usedExtensions.Add(".lr.txt"); } else { outfileNames.Add(DatFormat.Listrom, CreateOutFileNamesHelper(outDir, ".txt", overwrite)); usedExtensions.Add(".txt"); } } // Missfile #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.MissFile) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.MissFile)) #endif { if (usedExtensions.Contains(".txt")) { outfileNames.Add(DatFormat.MissFile, CreateOutFileNamesHelper(outDir, ".miss.txt", overwrite)); usedExtensions.Add(".miss.txt"); } else { outfileNames.Add(DatFormat.MissFile, CreateOutFileNamesHelper(outDir, ".txt", overwrite)); usedExtensions.Add(".txt"); } } // Everdrive SMDB #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.EverdriveSMDB) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.EverdriveSMDB)) #endif { if (usedExtensions.Contains(".txt")) { outfileNames.Add(DatFormat.EverdriveSMDB, CreateOutFileNamesHelper(outDir, ".smdb.txt", overwrite)); usedExtensions.Add(".smdb.txt"); } else { outfileNames.Add(DatFormat.EverdriveSMDB, CreateOutFileNamesHelper(outDir, ".txt", overwrite)); usedExtensions.Add(".txt"); } } #endregion #region .xml // Logiqx XML #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.Logiqx) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.Logiqx)) #endif { outfileNames.Add(DatFormat.Logiqx, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.LogiqxDeprecated) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.LogiqxDeprecated)) #endif { outfileNames.Add(DatFormat.LogiqxDeprecated, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } // SabreDAT #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SabreXML) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SabreXML)) #endif { if (usedExtensions.Contains(".xml")) { outfileNames.Add(DatFormat.SabreXML, CreateOutFileNamesHelper(outDir, ".sd.xml", overwrite)); usedExtensions.Add(".sd.xml"); } else { outfileNames.Add(DatFormat.SabreXML, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } } // Software List #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SoftwareList) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SoftwareList)) #endif { if (usedExtensions.Contains(".xml")) { outfileNames.Add(DatFormat.SoftwareList, CreateOutFileNamesHelper(outDir, ".sl.xml", overwrite)); usedExtensions.Add(".sl.xml"); } else { outfileNames.Add(DatFormat.SoftwareList, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } } // MAME Listxml #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.Listxml) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.Listxml)) #endif { if (usedExtensions.Contains(".xml")) { outfileNames.Add(DatFormat.Listxml, CreateOutFileNamesHelper(outDir, ".mame.xml", overwrite)); usedExtensions.Add(".mame.xml"); } else { outfileNames.Add(DatFormat.Listxml, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } } // OfflineList #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.OfflineList) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.OfflineList)) #endif { if (usedExtensions.Contains(".xml")) { outfileNames.Add(DatFormat.OfflineList, CreateOutFileNamesHelper(outDir, ".ol.xml", overwrite)); usedExtensions.Add(".ol.xml"); } else { outfileNames.Add(DatFormat.OfflineList, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } } // openMSX #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.OpenMSX) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.OpenMSX)) #endif { if (usedExtensions.Contains(".xml")) { outfileNames.Add(DatFormat.OpenMSX, CreateOutFileNamesHelper(outDir, ".msx.xml", overwrite)); usedExtensions.Add(".msx.xml"); } else { outfileNames.Add(DatFormat.OpenMSX, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } } // Archive.org #if NETFRAMEWORK if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.ArchiveDotOrg) != 0) #else if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.ArchiveDotOrg)) #endif { if (usedExtensions.Contains(".xml")) { outfileNames.Add(DatFormat.ArchiveDotOrg, CreateOutFileNamesHelper(outDir, ".ado.xml", overwrite)); usedExtensions.Add(".ado.xml"); } else { outfileNames.Add(DatFormat.ArchiveDotOrg, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } } #endregion return outfileNames; } /// /// Help generating the outfile name /// /// Output directory /// Extension to use for the file /// True if we ignore existing files, false otherwise /// String containing the new filename private string CreateOutFileNamesHelper(string outDir, string extension, bool overwrite) { string? filename = string.IsNullOrEmpty(GetFieldValue(DatHeader.FileNameKey)) ? GetFieldValue(Models.Metadata.Header.DescriptionKey) : GetFieldValue(DatHeader.FileNameKey); // Strip off the extension if it's a holdover from the DAT if (Utilities.HasValidDatExtension(filename)) filename = Path.GetFileNameWithoutExtension(filename); string outfile = $"{outDir}{filename}{extension}"; outfile = outfile.Replace($"{Path.DirectorySeparatorChar}{Path.DirectorySeparatorChar}", Path.DirectorySeparatorChar.ToString()); if (!overwrite) { int i = 1; while (File.Exists(outfile)) { outfile = $"{outDir}{filename}_{i}{extension}"; outfile = outfile.Replace($"{Path.DirectorySeparatorChar}{Path.DirectorySeparatorChar}", Path.DirectorySeparatorChar.ToString()); i++; } } return outfile; } #endregion #endregion // Instance Methods } }