2017-10-06 13:29:58 -07:00
using System ;
2020-07-15 09:41:59 -07:00
using System.Collections.Generic ;
using System.IO ;
2020-09-07 14:47:27 -07:00
using System.Xml.Serialization ;
2024-02-28 19:19:50 -05:00
using Newtonsoft.Json ;
2020-12-08 13:23:59 -08:00
using SabreTools.Core ;
2020-12-08 16:37:08 -08:00
using SabreTools.Core.Tools ;
2020-12-09 22:11:35 -08:00
using SabreTools.DatFiles.Formats ;
2017-06-16 16:24:26 -07:00
2020-12-08 16:37:08 -08:00
namespace SabreTools.DatFiles
2017-06-16 16:24:26 -07:00
{
2019-01-08 11:06:26 -08:00
/// <summary>
/// Represents all possible DAT header information
/// </summary>
2020-09-08 10:12:41 -07:00
[JsonObject("header"), XmlRoot("header")]
2019-01-08 11:06:26 -08:00
public class DatHeader : ICloneable
{
2024-03-10 16:49:07 -04:00
#region Constants
2017-06-16 16:24:26 -07:00
2019-01-08 11:49:31 -08:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// Add a new extension to all items
2019-01-08 11:49:31 -08:00
/// </summary>
2024-03-10 16:49:07 -04:00
public const string AddExtensionKey = "ADDEXTENSION" ;
2019-01-08 11:49:31 -08:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// Output the machine name
2019-01-08 11:49:31 -08:00
/// </summary>
2024-03-10 16:49:07 -04:00
public const string GameNameKey = "GAMENAME" ;
2020-08-20 15:13:57 -07:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// Text to append to all outputted lines
2020-08-20 15:13:57 -07:00
/// </summary>
2024-03-10 16:49:07 -04:00
public const string PostfixKey = "POSTFIX" ;
2019-01-08 11:49:31 -08:00
/// <summary>
/// Text to prepend to all outputted lines
/// </summary>
2024-03-10 16:49:07 -04:00
public const string PrefixKey = "PREFIX" ;
2019-01-08 11:49:31 -08:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// Wrap quotes around the entire line, sans prefix and postfix
2019-01-08 11:49:31 -08:00
/// </summary>
2024-03-10 16:49:07 -04:00
public const string QuotesKey = "QUOTES" ;
2019-01-08 11:49:31 -08:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// Remove all item extensions
2019-01-08 11:49:31 -08:00
/// </summary>
2024-03-10 16:49:07 -04:00
public const string RemoveExtensionKey = "REMOVEEXTENSION" ;
2019-01-08 11:49:31 -08:00
/// <summary>
/// Replace all item extensions
/// </summary>
2024-03-10 16:49:07 -04:00
public const string ReplaceExtensionKey = "REPLACEEXTENSION" ;
2019-01-08 11:49:31 -08:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// Output the item name
2019-01-08 11:49:31 -08:00
/// </summary>
2024-03-10 16:49:07 -04:00
public const string UseRomNameKey = "USEROMNAME" ;
#endregion
#region Fields
2019-01-08 11:49:31 -08:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// External name of the DAT
2019-01-08 11:49:31 -08:00
/// </summary>
2024-03-10 16:49:07 -04:00
[JsonProperty("filename", DefaultValueHandling = DefaultValueHandling.Include)]
[XmlElement("filename")]
public string? FileName { get ; set ; }
2019-01-08 11:49:31 -08:00
/// <summary>
2024-03-10 16:49:07 -04:00
/// Read or write format
2019-01-08 11:49:31 -08:00
/// </summary>
2020-09-08 10:12:41 -07:00
[JsonIgnore, XmlIgnore]
2024-03-10 16:49:07 -04:00
public DatFormat DatFormat { get ; set ; }
2019-01-08 11:49:31 -08:00
2024-03-10 16:49:07 -04:00
[JsonIgnore]
public bool InfosSpecified
{
get
{
var infos = GetFieldValue < OfflineListInfo [ ] ? > ( Models . Metadata . Header . InfosKey ) ;
return infos ! = null & & infos . Length > 0 ;
}
}
[JsonIgnore]
public bool CanOpenSpecified
{
get
{
var canOpen = GetFieldValue < string [ ] ? > ( Models . Metadata . Header . CanOpenKey ) ;
return canOpen ! = null & & canOpen . Length > 0 ;
}
}
2019-01-08 11:49:31 -08:00
2020-08-20 11:26:06 -07:00
#region Depot Information
/// <summary>
/// Input depot information
/// </summary>
2020-09-08 10:12:41 -07:00
[JsonIgnore, XmlIgnore]
2023-08-10 23:22:14 -04:00
public DepotInformation ? InputDepot { get ; set ; }
2020-08-20 11:26:06 -07:00
/// <summary>
/// Output depot information
/// </summary>
2020-09-08 10:12:41 -07:00
[JsonIgnore, XmlIgnore]
2023-08-10 23:22:14 -04:00
public DepotInformation ? OutputDepot { get ; set ; }
2020-08-20 11:26:06 -07:00
#endregion
2024-03-10 04:10:37 -04:00
/// <summary>
/// Internal Header model
/// </summary>
[JsonIgnore]
private Models . Metadata . Header _header = [ ] ;
2019-01-08 11:06:26 -08:00
#endregion
2017-10-06 13:29:58 -07:00
2019-01-08 11:06:26 -08:00
#region Instance Methods
2017-10-06 13:29:58 -07:00
2024-03-10 04:10:37 -04:00
#region Accessors
/// <summary>
/// Get the value from a field based on the type provided
/// </summary>
/// <typeparam name="T">Type of the value to get from the internal model</typeparam>
/// <param name="fieldName">Field to retrieve</param>
/// <returns>Value from the field, if possible</returns>
public T ? GetFieldValue < T > ( string? fieldName )
{
// Invalid field cannot be processed
if ( string . IsNullOrEmpty ( fieldName ) )
return default ;
// Get the value based on the type
return _header . Read < T > ( fieldName ! ) ;
}
/// <summary>
/// Set the value from a field based on the type provided
/// </summary>
/// <typeparam name="T">Type of the value to set in the internal model</typeparam>
/// <param name="fieldName">Field to set</param>
/// <param name="value">Value to set</param>
/// <returns>True if the value was set, false otherwise</returns>
public bool SetFieldValue < T > ( 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
2019-01-08 11:06:26 -08:00
#region Cloning Methods
2017-10-06 13:29:58 -07:00
2019-01-08 11:06:26 -08:00
/// <summary>
/// Clone the current header
/// </summary>
public object Clone ( )
{
2024-03-10 04:10:37 -04:00
var header = new DatHeader ( )
2019-01-08 11:06:26 -08:00
{
FileName = this . FileName ,
DatFormat = this . DatFormat ,
2017-10-06 13:29:58 -07:00
2021-02-17 16:43:01 -08:00
InputDepot = this . InputDepot ? . Clone ( ) as DepotInformation ,
OutputDepot = this . OutputDepot ? . Clone ( ) as DepotInformation ,
2019-01-08 11:06:26 -08:00
} ;
2024-03-10 04:10:37 -04:00
header . SetFieldValue < string? > ( Models . Metadata . Header . AuthorKey , GetFieldValue < string? > ( Models . Metadata . Header . AuthorKey ) ) ;
header . SetFieldValue < MergingFlag > ( Models . Metadata . Header . BiosModeKey , GetFieldValue < MergingFlag > ( Models . Metadata . Header . BiosModeKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . BuildKey , GetFieldValue < string? > ( Models . Metadata . Header . BuildKey ) ) ;
header . SetFieldValue < string [ ] ? > ( Models . Metadata . Header . CanOpenKey , GetFieldValue < string [ ] ? > ( Models . Metadata . Header . CanOpenKey ) ) ; // TODO: Perform a deep clone
header . SetFieldValue < string? > ( Models . Metadata . Header . CategoryKey , GetFieldValue < string? > ( Models . Metadata . Header . CategoryKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . CommentKey , GetFieldValue < string? > ( Models . Metadata . Header . CommentKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . DateKey , GetFieldValue < string? > ( Models . Metadata . Header . DateKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . DatVersionKey , GetFieldValue < string? > ( Models . Metadata . Header . DatVersionKey ) ) ;
header . SetFieldValue < bool? > ( Models . Metadata . Header . DebugKey , GetFieldValue < bool? > ( Models . Metadata . Header . DebugKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey , GetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . EmailKey , GetFieldValue < string? > ( Models . Metadata . Header . EmailKey ) ) ;
header . SetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey , GetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey ) ) ;
header . SetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey , GetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey ) ) ;
header . SetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey , GetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . HeaderKey , GetFieldValue < string? > ( Models . Metadata . Header . HeaderKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . HomepageKey , GetFieldValue < string? > ( Models . Metadata . Header . HomepageKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . IdKey , GetFieldValue < string? > ( Models . Metadata . Header . IdKey ) ) ;
header . SetFieldValue < OfflineListInfo [ ] ? > ( Models . Metadata . Header . InfosKey , GetFieldValue < OfflineListInfo [ ] ? > ( Models . Metadata . Header . InfosKey ) ) ; // TODO: Perform a deep clone
header . SetFieldValue < bool? > ( Models . Metadata . Header . LockBiosModeKey , GetFieldValue < bool? > ( Models . Metadata . Header . LockBiosModeKey ) ) ;
header . SetFieldValue < bool? > ( Models . Metadata . Header . LockRomModeKey , GetFieldValue < bool? > ( Models . Metadata . Header . LockRomModeKey ) ) ;
header . SetFieldValue < bool? > ( Models . Metadata . Header . LockSampleModeKey , GetFieldValue < bool? > ( Models . Metadata . Header . LockSampleModeKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . MameConfigKey , GetFieldValue < string? > ( Models . Metadata . Header . MameConfigKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . NameKey , GetFieldValue < string? > ( Models . Metadata . Header . NameKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . RomTitleKey , GetFieldValue < string? > ( Models . Metadata . Header . RomTitleKey ) ) ;
header . SetFieldValue < MergingFlag > ( Models . Metadata . Header . RomModeKey , GetFieldValue < MergingFlag > ( Models . Metadata . Header . RomModeKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . RootDirKey , GetFieldValue < string? > ( Models . Metadata . Header . RootDirKey ) ) ;
header . SetFieldValue < MergingFlag > ( Models . Metadata . Header . SampleModeKey , GetFieldValue < MergingFlag > ( Models . Metadata . Header . SampleModeKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsHeightKey , GetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsHeightKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsWidthKey , GetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsWidthKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . SystemKey , GetFieldValue < string? > ( Models . Metadata . Header . SystemKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . TypeKey , GetFieldValue < string? > ( Models . Metadata . Header . TypeKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . UrlKey , GetFieldValue < string? > ( Models . Metadata . Header . UrlKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . VersionKey , GetFieldValue < string? > ( Models . Metadata . Header . VersionKey ) ) ;
2024-03-10 16:49:07 -04:00
header . SetFieldValue < string? > ( DatHeader . AddExtensionKey , GetFieldValue < string? > ( DatHeader . AddExtensionKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . GameNameKey , GetFieldValue < bool > ( DatHeader . GameNameKey ) ) ;
header . SetFieldValue < string? > ( DatHeader . PostfixKey , GetFieldValue < string? > ( DatHeader . PostfixKey ) ) ;
header . SetFieldValue < string? > ( DatHeader . PrefixKey , GetFieldValue < string? > ( DatHeader . PrefixKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . RemoveExtensionKey , GetFieldValue < bool > ( DatHeader . RemoveExtensionKey ) ) ;
header . SetFieldValue < string? > ( DatHeader . ReplaceExtensionKey , GetFieldValue < string? > ( DatHeader . ReplaceExtensionKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . QuotesKey , GetFieldValue < bool > ( DatHeader . QuotesKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . UseRomNameKey , GetFieldValue < bool > ( DatHeader . UseRomNameKey ) ) ;
2024-03-10 04:10:37 -04:00
return header ;
2019-01-08 11:06:26 -08:00
}
2017-10-06 13:29:58 -07:00
2020-07-15 09:41:59 -07:00
/// <summary>
/// Clone the standard parts of the current header
/// </summary>
public DatHeader CloneStandard ( )
{
2024-03-10 04:10:37 -04:00
var header = new DatHeader ( )
2020-07-15 09:41:59 -07:00
{
FileName = this . FileName ,
DatFormat = this . DatFormat ,
} ;
2024-03-10 04:10:37 -04:00
header . SetFieldValue < string? > ( Models . Metadata . Header . AuthorKey , GetFieldValue < string? > ( Models . Metadata . Header . AuthorKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . CategoryKey , GetFieldValue < string? > ( Models . Metadata . Header . CategoryKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . CommentKey , GetFieldValue < string? > ( Models . Metadata . Header . CommentKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . DateKey , GetFieldValue < string? > ( Models . Metadata . Header . DateKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey , GetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . EmailKey , GetFieldValue < string? > ( Models . Metadata . Header . EmailKey ) ) ;
header . SetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey , GetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey ) ) ;
header . SetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey , GetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey ) ) ;
header . SetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey , GetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . HeaderKey , GetFieldValue < string? > ( Models . Metadata . Header . HeaderKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . HomepageKey , GetFieldValue < string? > ( Models . Metadata . Header . HomepageKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . NameKey , GetFieldValue < string? > ( Models . Metadata . Header . NameKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . RootDirKey , GetFieldValue < string? > ( Models . Metadata . Header . RootDirKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . TypeKey , GetFieldValue < string? > ( Models . Metadata . Header . TypeKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . UrlKey , GetFieldValue < string? > ( Models . Metadata . Header . UrlKey ) ) ;
header . SetFieldValue < string? > ( Models . Metadata . Header . VersionKey , GetFieldValue < string? > ( Models . Metadata . Header . VersionKey ) ) ;
return header ;
2020-07-15 09:41:59 -07:00
}
/// <summary>
/// Clone the filtering parts of the current header
/// </summary>
public DatHeader CloneFiltering ( )
{
2024-03-10 16:49:07 -04:00
var header = new DatHeader ( )
2020-07-15 09:41:59 -07:00
{
DatFormat = this . DatFormat ,
2021-02-17 16:43:01 -08:00
InputDepot = this . InputDepot ? . Clone ( ) as DepotInformation ,
OutputDepot = this . OutputDepot ? . Clone ( ) as DepotInformation ,
2020-07-15 09:41:59 -07:00
} ;
2024-03-10 16:49:07 -04:00
header . SetFieldValue < string? > ( DatHeader . AddExtensionKey , GetFieldValue < string? > ( DatHeader . AddExtensionKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . GameNameKey , GetFieldValue < bool > ( DatHeader . GameNameKey ) ) ;
header . SetFieldValue < string? > ( DatHeader . PostfixKey , GetFieldValue < string? > ( DatHeader . PostfixKey ) ) ;
header . SetFieldValue < string? > ( DatHeader . PrefixKey , GetFieldValue < string? > ( DatHeader . PrefixKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . RemoveExtensionKey , GetFieldValue < bool > ( DatHeader . RemoveExtensionKey ) ) ;
header . SetFieldValue < string? > ( DatHeader . ReplaceExtensionKey , GetFieldValue < string? > ( DatHeader . ReplaceExtensionKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . QuotesKey , GetFieldValue < bool > ( DatHeader . QuotesKey ) ) ;
header . SetFieldValue < bool > ( DatHeader . UseRomNameKey , GetFieldValue < bool > ( DatHeader . UseRomNameKey ) ) ;
return header ;
2020-07-15 09:41:59 -07:00
}
/// <summary>
/// Overwrite local values from another DatHeader if not default
/// </summary>
/// <param name="datHeader">DatHeader to get the values from</param>
2023-08-10 23:22:14 -04:00
public void ConditionalCopy ( DatHeader ? datHeader )
2020-07-15 09:41:59 -07:00
{
2023-08-10 23:22:14 -04:00
if ( datHeader = = null )
return ;
2024-02-28 22:54:56 -05:00
if ( ! string . IsNullOrEmpty ( datHeader . FileName ) )
2020-08-20 11:23:48 -07:00
FileName = datHeader . FileName ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . NameKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . NameKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . NameKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . RootDirKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . RootDirKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . RootDirKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . CategoryKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . CategoryKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . CategoryKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . VersionKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . VersionKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . VersionKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . DateKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . DateKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . DateKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . AuthorKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . AuthorKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . AuthorKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . EmailKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . EmailKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . EmailKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . HomepageKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . HomepageKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . HomepageKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . UrlKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . UrlKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . UrlKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . CommentKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . CommentKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . CommentKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . HeaderKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . HeaderKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . HeaderKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( Models . Metadata . Header . TypeKey ) ) )
SetFieldValue < string? > ( Models . Metadata . Header . TypeKey , datHeader . GetFieldValue < string? > ( Models . Metadata . Header . TypeKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( datHeader . GetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey ) ! = MergingFlag . None )
SetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey , datHeader . GetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( datHeader . GetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey ) ! = NodumpFlag . None )
SetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey , datHeader . GetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 04:10:37 -04:00
if ( datHeader . GetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey ) ! = PackingFlag . None )
SetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey , datHeader . GetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey ) ) ;
2020-07-15 09:41:59 -07:00
if ( datHeader . DatFormat ! = 0x00 )
2020-08-20 11:23:48 -07:00
DatFormat = datHeader . DatFormat ;
2020-07-15 09:41:59 -07:00
2024-03-10 16:49:07 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( DatHeader . PrefixKey ) ) )
SetFieldValue < string? > ( DatHeader . PrefixKey , datHeader . GetFieldValue < string? > ( DatHeader . PrefixKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 16:49:07 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( DatHeader . PostfixKey ) ) )
SetFieldValue < string? > ( DatHeader . PostfixKey , datHeader . GetFieldValue < string? > ( DatHeader . PostfixKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 16:49:07 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( DatHeader . AddExtensionKey ) ) )
SetFieldValue < string? > ( DatHeader . AddExtensionKey , datHeader . GetFieldValue < string? > ( DatHeader . AddExtensionKey ) ) ;
2020-07-15 09:41:59 -07:00
2024-03-10 16:49:07 -04:00
if ( ! string . IsNullOrEmpty ( datHeader . GetFieldValue < string? > ( DatHeader . ReplaceExtensionKey ) ) )
SetFieldValue < string? > ( DatHeader . ReplaceExtensionKey , datHeader . GetFieldValue < string? > ( DatHeader . ReplaceExtensionKey ) ) ;
2020-08-20 11:23:48 -07:00
2020-08-24 11:56:49 -07:00
InputDepot = datHeader . InputDepot ? . Clone ( ) as DepotInformation ;
OutputDepot = datHeader . OutputDepot ? . Clone ( ) as DepotInformation ;
2024-03-10 16:49:07 -04:00
SetFieldValue < bool > ( DatHeader . GameNameKey , datHeader . GetFieldValue < bool > ( DatHeader . GameNameKey ) ) ;
SetFieldValue < bool > ( DatHeader . QuotesKey , datHeader . GetFieldValue < bool > ( DatHeader . QuotesKey ) ) ;
SetFieldValue < bool > ( DatHeader . RemoveExtensionKey , datHeader . GetFieldValue < bool > ( DatHeader . RemoveExtensionKey ) ) ;
SetFieldValue < bool > ( DatHeader . UseRomNameKey , datHeader . GetFieldValue < bool > ( DatHeader . UseRomNameKey ) ) ;
2020-07-15 09:41:59 -07:00
}
#endregion
2024-03-06 00:33:45 -05:00
#region Manipulation
2024-03-10 04:10:37 -04:00
/// <summary>
2024-03-06 00:33:45 -05:00
/// Remove a field from the header
/// </summary>
/// <param name="fieldName">Field to remove</param>
/// <returns>True if the removal was successful, false otherwise</returns>
public bool RemoveField ( string fieldName )
{
DatHeaderField datHeaderField = fieldName . AsDatHeaderField ( ) ;
switch ( datHeaderField )
{
2024-03-10 04:10:37 -04:00
case DatHeaderField . Author : SetFieldValue < string? > ( Models . Metadata . Header . AuthorKey , null ) ; break ;
case DatHeaderField . BiosMode : SetFieldValue < MergingFlag > ( Models . Metadata . Header . BiosModeKey , MergingFlag . None ) ; break ;
case DatHeaderField . Build : SetFieldValue < string? > ( Models . Metadata . Header . BuildKey , null ) ; break ;
case DatHeaderField . CanOpen : SetFieldValue < string [ ] ? > ( Models . Metadata . Header . CanOpenKey , null ) ; break ;
case DatHeaderField . Category : SetFieldValue < string? > ( Models . Metadata . Header . CategoryKey , null ) ; break ;
case DatHeaderField . Comment : SetFieldValue < string? > ( Models . Metadata . Header . CommentKey , null ) ; break ;
case DatHeaderField . Date : SetFieldValue < string? > ( Models . Metadata . Header . DateKey , null ) ; break ;
case DatHeaderField . Debug : SetFieldValue < bool? > ( Models . Metadata . Header . DebugKey , null ) ; break ;
case DatHeaderField . Description : SetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey , null ) ; break ;
case DatHeaderField . Email : SetFieldValue < string? > ( Models . Metadata . Header . EmailKey , null ) ; break ;
2024-03-06 00:33:45 -05:00
case DatHeaderField . FileName : FileName = null ; break ;
2024-03-10 04:10:37 -04:00
case DatHeaderField . ForceMerging : SetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey , MergingFlag . None ) ; break ;
case DatHeaderField . ForceNodump : SetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey , NodumpFlag . None ) ; break ;
case DatHeaderField . ForcePacking : SetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey , PackingFlag . None ) ; break ;
case DatHeaderField . HeaderSkipper : SetFieldValue < string? > ( Models . Metadata . Header . HeaderKey , null ) ; break ;
case DatHeaderField . Homepage : SetFieldValue < string? > ( Models . Metadata . Header . HomepageKey , null ) ; break ;
case DatHeaderField . ID : SetFieldValue < string? > ( Models . Metadata . Header . IdKey , null ) ; break ;
2024-03-06 00:33:45 -05:00
// 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;
2024-03-10 04:10:37 -04:00
case DatHeaderField . LockBiosMode : SetFieldValue < bool? > ( Models . Metadata . Header . LockBiosModeKey , null ) ; break ;
case DatHeaderField . LockRomMode : SetFieldValue < bool? > ( Models . Metadata . Header . LockRomModeKey , null ) ; break ;
case DatHeaderField . LockSampleMode : SetFieldValue < bool? > ( Models . Metadata . Header . LockSampleModeKey , null ) ; break ;
case DatHeaderField . MameConfig : SetFieldValue < string? > ( Models . Metadata . Header . MameConfigKey , null ) ; break ;
case DatHeaderField . Name : SetFieldValue < string? > ( Models . Metadata . Header . NameKey , null ) ; break ;
case DatHeaderField . RomCenterVersion : SetFieldValue < string? > ( Models . Metadata . Header . DatVersionKey , null ) ; break ;
case DatHeaderField . RomMode : SetFieldValue < MergingFlag > ( Models . Metadata . Header . RomModeKey , MergingFlag . None ) ; break ;
case DatHeaderField . RomTitle : SetFieldValue < string? > ( Models . Metadata . Header . RomTitleKey , null ) ; break ;
case DatHeaderField . RootDir : SetFieldValue < string? > ( Models . Metadata . Header . RootDirKey , null ) ; break ;
case DatHeaderField . SampleMode : SetFieldValue < MergingFlag > ( Models . Metadata . Header . SampleModeKey , MergingFlag . None ) ; break ;
case DatHeaderField . ScreenshotsHeight : SetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsHeightKey , null ) ; break ;
case DatHeaderField . ScreenshotsWidth : SetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsWidthKey , null ) ; break ;
case DatHeaderField . System : SetFieldValue < string? > ( Models . Metadata . Header . SystemKey , null ) ; break ;
case DatHeaderField . Type : SetFieldValue < string? > ( Models . Metadata . Header . TypeKey , null ) ; break ;
case DatHeaderField . Url : SetFieldValue < string? > ( Models . Metadata . Header . UrlKey , null ) ; break ;
case DatHeaderField . Version : SetFieldValue < string? > ( Models . Metadata . Header . VersionKey , null ) ; break ;
2024-03-06 00:33:45 -05:00
default : return false ;
}
return true ;
}
/// <summary>
/// Set a field in the header from a mapping string
/// </summary>
/// <param name="fieldName">Field to set</param>
/// <param name="value">String representing the value to set</param>
/// <returns>True if the setting was successful, false otherwise</returns>
/// <remarks>This only performs minimal validation before setting</remarks>
public bool SetField ( string? fieldName , string value )
{
DatHeaderField datHeaderField = fieldName . AsDatHeaderField ( ) ;
switch ( datHeaderField )
{
2024-03-10 04:10:37 -04:00
case DatHeaderField . Author : SetFieldValue < string? > ( Models . Metadata . Header . AuthorKey , value ) ; break ;
case DatHeaderField . BiosMode : SetFieldValue < MergingFlag > ( Models . Metadata . Header . BiosModeKey , value . AsEnumValue < MergingFlag > ( ) ) ; break ;
case DatHeaderField . Build : SetFieldValue < string? > ( Models . Metadata . Header . BuildKey , value ) ; break ;
case DatHeaderField . CanOpen : SetFieldValue < string [ ] ? > ( Models . Metadata . Header . CanOpenKey , [ . . value . Split ( ',' ) ] ) ; break ;
case DatHeaderField . Category : SetFieldValue < string? > ( Models . Metadata . Header . CategoryKey , value ) ; break ;
case DatHeaderField . Comment : SetFieldValue < string? > ( Models . Metadata . Header . CommentKey , value ) ; break ;
case DatHeaderField . Date : SetFieldValue < string? > ( Models . Metadata . Header . DateKey , value ) ; break ;
case DatHeaderField . Debug : SetFieldValue < bool? > ( Models . Metadata . Header . DebugKey , value . AsYesNo ( ) ) ; break ;
case DatHeaderField . Description : SetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey , value ) ; break ;
case DatHeaderField . Email : SetFieldValue < string? > ( Models . Metadata . Header . EmailKey , value ) ; break ;
2024-03-06 00:33:45 -05:00
case DatHeaderField . FileName : FileName = value ; break ;
2024-03-10 04:10:37 -04:00
case DatHeaderField . ForceMerging : SetFieldValue < MergingFlag > ( Models . Metadata . Header . ForceMergingKey , value . AsEnumValue < MergingFlag > ( ) ) ; break ;
case DatHeaderField . ForceNodump : SetFieldValue < NodumpFlag > ( Models . Metadata . Header . ForceNodumpKey , value . AsEnumValue < NodumpFlag > ( ) ) ; break ;
case DatHeaderField . ForcePacking : SetFieldValue < PackingFlag > ( Models . Metadata . Header . ForcePackingKey , value . AsEnumValue < PackingFlag > ( ) ) ; break ;
case DatHeaderField . HeaderSkipper : SetFieldValue < string? > ( Models . Metadata . Header . HeaderKey , value ) ; break ;
case DatHeaderField . Homepage : SetFieldValue < string? > ( Models . Metadata . Header . HomepageKey , value ) ; break ;
case DatHeaderField . ID : SetFieldValue < string? > ( Models . Metadata . Header . IdKey , value ) ; break ;
2024-03-06 00:33:45 -05:00
// 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;
2024-03-10 04:10:37 -04:00
case DatHeaderField . LockBiosMode : SetFieldValue < bool? > ( Models . Metadata . Header . LockBiosModeKey , value . AsYesNo ( ) ) ; break ;
case DatHeaderField . LockRomMode : SetFieldValue < bool? > ( Models . Metadata . Header . LockRomModeKey , value . AsYesNo ( ) ) ; break ;
case DatHeaderField . LockSampleMode : SetFieldValue < bool? > ( Models . Metadata . Header . LockSampleModeKey , value . AsYesNo ( ) ) ; break ;
case DatHeaderField . MameConfig : SetFieldValue < string? > ( Models . Metadata . Header . MameConfigKey , value ) ; break ;
case DatHeaderField . Name : SetFieldValue < string? > ( Models . Metadata . Header . NameKey , value ) ; break ;
case DatHeaderField . RomCenterVersion : SetFieldValue < string? > ( Models . Metadata . Header . DatVersionKey , value ) ; break ;
case DatHeaderField . RomMode : SetFieldValue < MergingFlag > ( Models . Metadata . Header . RomModeKey , value . AsEnumValue < MergingFlag > ( ) ) ; break ;
case DatHeaderField . RomTitle : SetFieldValue < string? > ( Models . Metadata . Header . RomTitleKey , value ) ; break ;
case DatHeaderField . RootDir : SetFieldValue < string? > ( Models . Metadata . Header . RootDirKey , value ) ; break ;
case DatHeaderField . SampleMode : SetFieldValue < MergingFlag > ( Models . Metadata . Header . SampleModeKey , value . AsEnumValue < MergingFlag > ( ) ) ; break ;
case DatHeaderField . ScreenshotsHeight : SetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsHeightKey , value ) ; break ;
case DatHeaderField . ScreenshotsWidth : SetFieldValue < string? > ( Models . Metadata . Header . ScreenshotsWidthKey , value ) ; break ;
case DatHeaderField . System : SetFieldValue < string? > ( Models . Metadata . Header . SystemKey , value ) ; break ;
case DatHeaderField . Type : SetFieldValue < string? > ( Models . Metadata . Header . TypeKey , value ) ; break ;
case DatHeaderField . Url : SetFieldValue < string? > ( Models . Metadata . Header . UrlKey , value ) ; break ;
case DatHeaderField . Version : SetFieldValue < string? > ( Models . Metadata . Header . VersionKey , value ) ; break ;
2024-03-06 00:33:45 -05:00
default : return false ;
}
return true ;
}
#endregion
2020-07-15 09:41:59 -07:00
#region Writing
/// <summary>
/// Generate a proper outfile name based on a DAT and output directory
/// </summary>
/// <param name="outDir">Output directory</param>
/// <param name="overwrite">True if we ignore existing files (default), false otherwise</param>
/// <returns>Dictionary of output formats mapped to file names</returns>
public Dictionary < DatFormat , string > CreateOutFileNames ( string outDir , bool overwrite = true )
{
// Create the output dictionary
2024-02-28 19:19:50 -05:00
Dictionary < DatFormat , string > outfileNames = [ ] ;
2020-07-15 09:41:59 -07:00
// Double check the outDir for the end delim
if ( ! outDir . EndsWith ( Path . DirectorySeparatorChar . ToString ( ) ) )
outDir + = Path . DirectorySeparatorChar ;
// Get all used extensions
2024-02-28 19:19:50 -05:00
List < string > usedExtensions = [ ] ;
2020-07-15 09:41:59 -07:00
// Get the extensions from the output type
#region . csv
// CSV
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . CSV ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . CSV ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . CSV , CreateOutFileNamesHelper ( outDir , ".csv" , overwrite ) ) ;
usedExtensions . Add ( ".csv" ) ;
} ;
#endregion
#region . dat
// ClrMamePro
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . ClrMamePro ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . ClrMamePro ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . ClrMamePro , CreateOutFileNamesHelper ( outDir , ".dat" , overwrite ) ) ;
usedExtensions . Add ( ".dat" ) ;
} ;
// RomCenter
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RomCenter ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . RomCenter ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . DOSCenter ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . DOSCenter ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . SabreJSON ) ! = 0 )
#else
2020-09-07 22:40:27 -07:00
if ( DatFormat . HasFlag ( DatFormat . SabreJSON ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
2020-09-07 22:40:27 -07:00
outfileNames . Add ( DatFormat . SabreJSON , CreateOutFileNamesHelper ( outDir , ".json" , overwrite ) ) ;
2020-07-15 09:41:59 -07:00
usedExtensions . Add ( ".json" ) ;
}
#endregion
#region . md5
// Redump MD5
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RedumpMD5 ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . RedumpMD5 ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . RedumpMD5 , CreateOutFileNamesHelper ( outDir , ".md5" , overwrite ) ) ;
usedExtensions . Add ( ".md5" ) ;
} ;
#endregion
#region . sfv
// Redump SFV
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RedumpSFV ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . RedumpSFV ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . RedumpSFV , CreateOutFileNamesHelper ( outDir , ".sfv" , overwrite ) ) ;
usedExtensions . Add ( ".sfv" ) ;
} ;
#endregion
#region . sha1
// Redump SHA-1
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RedumpSHA1 ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . RedumpSHA1 ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . RedumpSHA1 , CreateOutFileNamesHelper ( outDir , ".sha1" , overwrite ) ) ;
usedExtensions . Add ( ".sha1" ) ;
} ;
#endregion
#region . sha256
// Redump SHA-256
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RedumpSHA256 ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . RedumpSHA256 ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . RedumpSHA256 , CreateOutFileNamesHelper ( outDir , ".sha256" , overwrite ) ) ;
usedExtensions . Add ( ".sha256" ) ;
} ;
#endregion
#region . sha384
// Redump SHA-384
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RedumpSHA384 ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . RedumpSHA384 ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . RedumpSHA384 , CreateOutFileNamesHelper ( outDir , ".sha384" , overwrite ) ) ;
usedExtensions . Add ( ".sha384" ) ;
} ;
#endregion
#region . sha512
// Redump SHA-512
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RedumpSHA512 ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . RedumpSHA512 ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . RedumpSHA512 , CreateOutFileNamesHelper ( outDir , ".sha512" , overwrite ) ) ;
usedExtensions . Add ( ".sha512" ) ;
} ;
#endregion
2020-09-04 15:02:15 -07:00
#region . spamsum
// Redump SpamSum
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . RedumpSpamSum ) ! = 0 )
#else
2020-09-04 15:02:15 -07:00
if ( DatFormat . HasFlag ( DatFormat . RedumpSpamSum ) )
2024-02-28 22:54:56 -05:00
#endif
2020-09-04 15:02:15 -07:00
{
outfileNames . Add ( DatFormat . RedumpSpamSum , CreateOutFileNamesHelper ( outDir , ".spamsum" , overwrite ) ) ;
usedExtensions . Add ( ".spamsum" ) ;
} ;
#endregion
2020-07-15 09:41:59 -07:00
#region . ssv
// SSV
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . SSV ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . SSV ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . SSV , CreateOutFileNamesHelper ( outDir , ".ssv" , overwrite ) ) ;
usedExtensions . Add ( ".ssv" ) ;
} ;
#endregion
#region . tsv
// TSV
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . TSV ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . TSV ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . TSV , CreateOutFileNamesHelper ( outDir , ".tsv" , overwrite ) ) ;
usedExtensions . Add ( ".tsv" ) ;
} ;
#endregion
#region . txt
// AttractMode
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . AttractMode ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . AttractMode ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . AttractMode , CreateOutFileNamesHelper ( outDir , ".txt" , overwrite ) ) ;
usedExtensions . Add ( ".txt" ) ;
}
// MAME Listroms
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . Listrom ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . Listrom ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . MissFile ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . MissFile ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . EverdriveSMDB ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . EverdriveSMDB ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . Logiqx ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . Logiqx ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . Logiqx , CreateOutFileNamesHelper ( outDir , ".xml" , overwrite ) ) ;
2020-08-31 21:02:26 -07:00
usedExtensions . Add ( ".xml" ) ;
2020-07-15 09:41:59 -07:00
}
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . LogiqxDeprecated ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . LogiqxDeprecated ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
outfileNames . Add ( DatFormat . LogiqxDeprecated , CreateOutFileNamesHelper ( outDir , ".xml" , overwrite ) ) ;
2020-08-31 21:02:26 -07:00
usedExtensions . Add ( ".xml" ) ;
2020-07-15 09:41:59 -07:00
}
// SabreDAT
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . SabreXML ) ! = 0 )
#else
2020-09-07 22:57:44 -07:00
if ( DatFormat . HasFlag ( DatFormat . SabreXML ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
if ( usedExtensions . Contains ( ".xml" ) )
{
2020-09-07 22:57:44 -07:00
outfileNames . Add ( DatFormat . SabreXML , CreateOutFileNamesHelper ( outDir , ".sd.xml" , overwrite ) ) ;
2020-07-15 09:41:59 -07:00
usedExtensions . Add ( ".sd.xml" ) ;
}
else
{
2020-09-07 22:57:44 -07:00
outfileNames . Add ( DatFormat . SabreXML , CreateOutFileNamesHelper ( outDir , ".xml" , overwrite ) ) ;
2020-07-15 09:41:59 -07:00
usedExtensions . Add ( ".xml" ) ;
}
}
// Software List
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . SoftwareList ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . SoftwareList ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . Listxml ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . Listxml ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . OfflineList ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . OfflineList ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . OpenMSX ) ! = 0 )
#else
2020-07-15 09:41:59 -07:00
if ( DatFormat . HasFlag ( DatFormat . OpenMSX ) )
2024-02-28 22:54:56 -05:00
#endif
2020-07-15 09:41:59 -07:00
{
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" ) ;
}
}
2021-07-19 10:39:21 -07:00
// Archive.org
2024-02-28 22:54:56 -05:00
#if NETFRAMEWORK
if ( ( DatFormat & DatFormat . ArchiveDotOrg ) ! = 0 )
#else
2021-07-19 10:39:21 -07:00
if ( DatFormat . HasFlag ( DatFormat . ArchiveDotOrg ) )
2024-02-28 22:54:56 -05:00
#endif
2021-07-19 10:39:21 -07:00
{
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" ) ;
}
}
2020-07-15 09:41:59 -07:00
#endregion
return outfileNames ;
}
/// <summary>
/// Help generating the outfile name
/// </summary>
/// <param name="outDir">Output directory</param>
/// <param name="extension">Extension to use for the file</param>
/// <param name="overwrite">True if we ignore existing files, false otherwise</param>
/// <returns>String containing the new filename</returns>
private string CreateOutFileNamesHelper ( string outDir , string extension , bool overwrite )
{
2024-03-10 04:10:37 -04:00
string? filename = string . IsNullOrEmpty ( FileName ) ? GetFieldValue < string? > ( Models . Metadata . Header . DescriptionKey ) : FileName ;
2020-07-19 21:59:34 -07:00
// Strip off the extension if it's a holdover from the DAT
2020-12-10 23:24:09 -08:00
if ( Utilities . HasValidDatExtension ( filename ) )
2020-07-19 21:59:34 -07:00
filename = Path . GetFileNameWithoutExtension ( filename ) ;
2020-07-15 09:41:59 -07:00
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 ;
}
2019-01-08 11:06:26 -08:00
#endregion
2017-10-06 13:29:58 -07:00
2019-01-08 11:06:26 -08:00
#endregion // Instance Methods
}
2017-06-16 16:24:26 -07:00
}