using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Serialization; using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.DatFiles.Formats; using Newtonsoft.Json; namespace SabreTools.DatFiles { /// /// Represents all possible DAT header information /// [JsonObject("header"), XmlRoot("header")] public class DatHeader : ICloneable { #region Fields #region Common /// /// External name of the DAT /// [JsonProperty("filename", DefaultValueHandling = DefaultValueHandling.Include)] [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 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 /// /// Output the item name /// [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 /// /// Text to prepend to all outputted lines /// [JsonIgnore, XmlIgnore] public string Prefix { get; set; } /// /// Text to append to all outputted lines /// [JsonIgnore, XmlIgnore] public string Postfix { get; set; } /// /// Add a new extension to all items /// [JsonIgnore, XmlIgnore] public string AddExtension { get; set; } /// /// Replace all item extensions /// [JsonIgnore, XmlIgnore] public string ReplaceExtension { get; set; } /// /// Remove all item extensions /// [JsonIgnore, XmlIgnore] public bool RemoveExtension { get; set; } /// /// Output the machine name /// [JsonIgnore, XmlIgnore] public bool GameName { get; set; } /// /// Wrap quotes around the entire line, sans prefix and postfix /// [JsonIgnore, XmlIgnore] public bool Quotes { get; set; } #endregion #region Depot Information /// /// Input depot information /// [JsonIgnore, XmlIgnore] public DepotInformation InputDepot { get; set; } /// /// Output depot information /// [JsonIgnore, XmlIgnore] public DepotInformation OutputDepot { get; set; } #endregion #endregion #region Instance Methods #region Accessors /// /// Set fields with given values /// /// Mappings dictionary public void SetFields(Dictionary mappings) { #region Common if (mappings.Keys.Contains(DatHeaderField.FileName)) FileName = mappings[DatHeaderField.FileName]; if (mappings.Keys.Contains(DatHeaderField.Name)) Name = mappings[DatHeaderField.Name]; if (mappings.Keys.Contains(DatHeaderField.Description)) Description = mappings[DatHeaderField.Description]; if (mappings.Keys.Contains(DatHeaderField.RootDir)) RootDir = mappings[DatHeaderField.RootDir]; if (mappings.Keys.Contains(DatHeaderField.Category)) Category = mappings[DatHeaderField.Category]; if (mappings.Keys.Contains(DatHeaderField.Version)) Version = mappings[DatHeaderField.Version]; if (mappings.Keys.Contains(DatHeaderField.Date)) Date = mappings[DatHeaderField.Date]; if (mappings.Keys.Contains(DatHeaderField.Author)) Author = mappings[DatHeaderField.Author]; if (mappings.Keys.Contains(DatHeaderField.Email)) Email = mappings[DatHeaderField.Email]; if (mappings.Keys.Contains(DatHeaderField.Homepage)) Homepage = mappings[DatHeaderField.Homepage]; if (mappings.Keys.Contains(DatHeaderField.Url)) Url = mappings[DatHeaderField.Url]; if (mappings.Keys.Contains(DatHeaderField.Comment)) Comment = mappings[DatHeaderField.Comment]; if (mappings.Keys.Contains(DatHeaderField.HeaderSkipper)) HeaderSkipper = mappings[DatHeaderField.HeaderSkipper]; if (mappings.Keys.Contains(DatHeaderField.Type)) Type = mappings[DatHeaderField.Type]; if (mappings.Keys.Contains(DatHeaderField.ForceMerging)) ForceMerging = mappings[DatHeaderField.ForceMerging].AsMergingFlag(); if (mappings.Keys.Contains(DatHeaderField.ForceNodump)) ForceNodump = mappings[DatHeaderField.ForceNodump].AsNodumpFlag(); if (mappings.Keys.Contains(DatHeaderField.ForcePacking)) ForcePacking = mappings[DatHeaderField.ForcePacking].AsPackingFlag(); #endregion #region ListXML if (mappings.Keys.Contains(DatHeaderField.Debug)) Debug = mappings[DatHeaderField.Debug].AsYesNo(); if (mappings.Keys.Contains(DatHeaderField.MameConfig)) MameConfig = mappings[DatHeaderField.MameConfig]; #endregion #region Logiqx if (mappings.Keys.Contains(DatHeaderField.NoIntroID)) NoIntroID = mappings[DatHeaderField.NoIntroID]; if (mappings.Keys.Contains(DatHeaderField.Build)) Build = mappings[DatHeaderField.Build]; if (mappings.Keys.Contains(DatHeaderField.RomMode)) RomMode = mappings[DatHeaderField.RomMode].AsMergingFlag(); if (mappings.Keys.Contains(DatHeaderField.BiosMode)) BiosMode = mappings[DatHeaderField.BiosMode].AsMergingFlag(); if (mappings.Keys.Contains(DatHeaderField.SampleMode)) SampleMode = mappings[DatHeaderField.SampleMode].AsMergingFlag(); if (mappings.Keys.Contains(DatHeaderField.LockRomMode)) LockRomMode = mappings[DatHeaderField.LockRomMode].AsYesNo(); if (mappings.Keys.Contains(DatHeaderField.LockBiosMode)) LockBiosMode = mappings[DatHeaderField.LockBiosMode].AsYesNo(); if (mappings.Keys.Contains(DatHeaderField.LockSampleMode)) LockSampleMode = mappings[DatHeaderField.LockSampleMode].AsYesNo(); #endregion #region OfflineList if (mappings.Keys.Contains(DatHeaderField.System)) System = mappings[DatHeaderField.System]; if (mappings.Keys.Contains(DatHeaderField.ScreenshotsWidth)) ScreenshotsWidth = mappings[DatHeaderField.ScreenshotsWidth]; if (mappings.Keys.Contains(DatHeaderField.ScreenshotsHeight)) ScreenshotsHeight = mappings[DatHeaderField.ScreenshotsHeight]; // TODO: Add DatHeader_Info* // TDOO: Add DatHeader_CanOpen* if (mappings.Keys.Contains(DatHeaderField.RomTitle)) RomTitle = mappings[DatHeaderField.RomTitle]; #endregion #region RomCenter if (mappings.Keys.Contains(DatHeaderField.RomCenterVersion)) RomCenterVersion = mappings[DatHeaderField.RomCenterVersion]; #endregion } #endregion #region Cloning Methods /// /// Clone the current header /// public object Clone() { return 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, Quotes = this.Quotes, ReplaceExtension = this.ReplaceExtension, AddExtension = this.AddExtension, RemoveExtension = this.RemoveExtension, GameName = this.GameName, InputDepot = this.InputDepot?.Clone() as DepotInformation, OutputDepot = this.OutputDepot?.Clone() as DepotInformation, }; } /// /// Clone the standard parts of the current header /// public DatHeader CloneStandard() { return 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, }; } /// /// Clone the filtering parts of the current header /// public DatHeader CloneFiltering() { return new DatHeader() { DatFormat = this.DatFormat, UseRomName = this.UseRomName, Prefix = this.Prefix, Postfix = this.Postfix, Quotes = this.Quotes, ReplaceExtension = this.ReplaceExtension, AddExtension = this.AddExtension, RemoveExtension = this.RemoveExtension, GameName = this.GameName, InputDepot = this.InputDepot?.Clone() as DepotInformation, OutputDepot = this.OutputDepot?.Clone() as DepotInformation, }; } /// /// Overwrite local values from another DatHeader if not default /// /// DatHeader to get the values from public void ConditionalCopy(DatHeader datHeader) { if (!string.IsNullOrWhiteSpace(datHeader.FileName)) FileName = datHeader.FileName; if (!string.IsNullOrWhiteSpace(datHeader.Name)) Name = datHeader.Name; if (!string.IsNullOrWhiteSpace(datHeader.Description)) Description = datHeader.Description; if (!string.IsNullOrWhiteSpace(datHeader.RootDir)) RootDir = datHeader.RootDir; if (!string.IsNullOrWhiteSpace(datHeader.Category)) Category = datHeader.Category; if (!string.IsNullOrWhiteSpace(datHeader.Version)) Version = datHeader.Version; if (!string.IsNullOrWhiteSpace(datHeader.Date)) Date = datHeader.Date; if (!string.IsNullOrWhiteSpace(datHeader.Author)) Author = datHeader.Author; if (!string.IsNullOrWhiteSpace(datHeader.Email)) Email = datHeader.Email; if (!string.IsNullOrWhiteSpace(datHeader.Homepage)) Homepage = datHeader.Homepage; if (!string.IsNullOrWhiteSpace(datHeader.Url)) Url = datHeader.Url; if (!string.IsNullOrWhiteSpace(datHeader.Comment)) Comment = datHeader.Comment; if (!string.IsNullOrWhiteSpace(datHeader.HeaderSkipper)) HeaderSkipper = datHeader.HeaderSkipper; if (!string.IsNullOrWhiteSpace(datHeader.Type)) Type = datHeader.Type; if (datHeader.ForceMerging != MergingFlag.None) ForceMerging = datHeader.ForceMerging; if (datHeader.ForceNodump != NodumpFlag.None) ForceNodump = datHeader.ForceNodump; if (datHeader.ForcePacking != PackingFlag.None) ForcePacking = datHeader.ForcePacking; if (datHeader.DatFormat != 0x00) DatFormat = datHeader.DatFormat; if (!string.IsNullOrWhiteSpace(datHeader.Prefix)) Prefix = datHeader.Prefix; if (!string.IsNullOrWhiteSpace(datHeader.Postfix)) Postfix = datHeader.Postfix; if (!string.IsNullOrWhiteSpace(datHeader.AddExtension)) AddExtension = datHeader.AddExtension; if (!string.IsNullOrWhiteSpace(datHeader.ReplaceExtension)) ReplaceExtension = datHeader.ReplaceExtension; RemoveExtension = datHeader.RemoveExtension; InputDepot = datHeader.InputDepot?.Clone() as DepotInformation; OutputDepot = datHeader.OutputDepot?.Clone() as DepotInformation; GameName = datHeader.GameName; Quotes = datHeader.Quotes; UseRomName = datHeader.UseRomName; } #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 = new Dictionary(); // Double check the outDir for the end delim if (!outDir.EndsWith(Path.DirectorySeparatorChar.ToString())) outDir += Path.DirectorySeparatorChar; // Get all used extensions List usedExtensions = new List(); // Get the extensions from the output type #region .csv // CSV if (DatFormat.HasFlag(DatFormat.CSV)) { outfileNames.Add(DatFormat.CSV, CreateOutFileNamesHelper(outDir, ".csv", overwrite)); usedExtensions.Add(".csv"); }; #endregion #region .dat // ClrMamePro if (DatFormat.HasFlag(DatFormat.ClrMamePro)) { outfileNames.Add(DatFormat.ClrMamePro, CreateOutFileNamesHelper(outDir, ".dat", overwrite)); usedExtensions.Add(".dat"); }; // RomCenter if (DatFormat.HasFlag(DatFormat.RomCenter)) { 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 (DatFormat.HasFlag(DatFormat.DOSCenter)) { 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 (DatFormat.HasFlag(DatFormat.SabreJSON)) { outfileNames.Add(DatFormat.SabreJSON, CreateOutFileNamesHelper(outDir, ".json", overwrite)); usedExtensions.Add(".json"); } #endregion #region .md5 // Redump MD5 if (DatFormat.HasFlag(DatFormat.RedumpMD5)) { outfileNames.Add(DatFormat.RedumpMD5, CreateOutFileNamesHelper(outDir, ".md5", overwrite)); usedExtensions.Add(".md5"); }; #endregion #region .sfv // Redump SFV if (DatFormat.HasFlag(DatFormat.RedumpSFV)) { outfileNames.Add(DatFormat.RedumpSFV, CreateOutFileNamesHelper(outDir, ".sfv", overwrite)); usedExtensions.Add(".sfv"); }; #endregion #region .sha1 // Redump SHA-1 if (DatFormat.HasFlag(DatFormat.RedumpSHA1)) { outfileNames.Add(DatFormat.RedumpSHA1, CreateOutFileNamesHelper(outDir, ".sha1", overwrite)); usedExtensions.Add(".sha1"); }; #endregion #region .sha256 // Redump SHA-256 if (DatFormat.HasFlag(DatFormat.RedumpSHA256)) { outfileNames.Add(DatFormat.RedumpSHA256, CreateOutFileNamesHelper(outDir, ".sha256", overwrite)); usedExtensions.Add(".sha256"); }; #endregion #region .sha384 // Redump SHA-384 if (DatFormat.HasFlag(DatFormat.RedumpSHA384)) { outfileNames.Add(DatFormat.RedumpSHA384, CreateOutFileNamesHelper(outDir, ".sha384", overwrite)); usedExtensions.Add(".sha384"); }; #endregion #region .sha512 // Redump SHA-512 if (DatFormat.HasFlag(DatFormat.RedumpSHA512)) { outfileNames.Add(DatFormat.RedumpSHA512, CreateOutFileNamesHelper(outDir, ".sha512", overwrite)); usedExtensions.Add(".sha512"); }; #endregion #region .spamsum // Redump SpamSum if (DatFormat.HasFlag(DatFormat.RedumpSpamSum)) { outfileNames.Add(DatFormat.RedumpSpamSum, CreateOutFileNamesHelper(outDir, ".spamsum", overwrite)); usedExtensions.Add(".spamsum"); }; #endregion #region .ssv // SSV if (DatFormat.HasFlag(DatFormat.SSV)) { outfileNames.Add(DatFormat.SSV, CreateOutFileNamesHelper(outDir, ".ssv", overwrite)); usedExtensions.Add(".ssv"); }; #endregion #region .tsv // TSV if (DatFormat.HasFlag(DatFormat.TSV)) { outfileNames.Add(DatFormat.TSV, CreateOutFileNamesHelper(outDir, ".tsv", overwrite)); usedExtensions.Add(".tsv"); }; #endregion #region .txt // AttractMode if (DatFormat.HasFlag(DatFormat.AttractMode)) { outfileNames.Add(DatFormat.AttractMode, CreateOutFileNamesHelper(outDir, ".txt", overwrite)); usedExtensions.Add(".txt"); } // MAME Listroms if (DatFormat.HasFlag(DatFormat.Listrom)) { 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 (DatFormat.HasFlag(DatFormat.MissFile)) { 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 (DatFormat.HasFlag(DatFormat.EverdriveSMDB)) { 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 (DatFormat.HasFlag(DatFormat.Logiqx)) { outfileNames.Add(DatFormat.Logiqx, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } if (DatFormat.HasFlag(DatFormat.LogiqxDeprecated)) { outfileNames.Add(DatFormat.LogiqxDeprecated, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } // SabreDAT if (DatFormat.HasFlag(DatFormat.SabreXML)) { 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 (DatFormat.HasFlag(DatFormat.SoftwareList)) { 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 (DatFormat.HasFlag(DatFormat.Listxml)) { 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 (DatFormat.HasFlag(DatFormat.OfflineList)) { 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 (DatFormat.HasFlag(DatFormat.OpenMSX)) { 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 (DatFormat.HasFlag(DatFormat.ArchiveDotOrg)) { 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.IsNullOrWhiteSpace(FileName) ? Description : FileName; // 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 } }