Start implementing internal header processing

This commit is contained in:
Matt Nadareski
2024-03-10 22:49:15 -04:00
parent 962fd8baee
commit 51ce358e6f
12 changed files with 114 additions and 37 deletions

View File

@@ -3,7 +3,6 @@ using System.Linq;
namespace SabreTools.DatFiles
{
// TODO: Convert nested items (e.g. Configuration, DipLocation)
// TODO: Determine which items need to have their values flipped (e.g. Part, DiskArea, DataArea)
public partial class DatFile
{
#region Converters
@@ -14,25 +13,23 @@ namespace SabreTools.DatFiles
/// <param name="item">Metadata file to convert</param>
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param>
/// <param name="keep">True if full pathnames are to be kept, false otherwise (default)</param>
/// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param>
public void ConvertMetadata(Models.Metadata.MetadataFile? item, string filename, int indexId, bool statsOnly)
public void ConvertMetadata(Models.Metadata.MetadataFile? item, string filename, int indexId, bool keep, bool statsOnly)
{
// If the metadata file is invalid, we can't do anything
if (item == null || !item.Any())
return;
// TODO: Add header parsing
// Get the header from the metadata
var header = item.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
if (header != null)
ConvertHeader(header);
// Get the machines from the metadata
var machines = ReadItemArray<Models.Metadata.Machine>(item, Models.Metadata.MetadataFile.MachineKey);
if (machines == null)
return;
// Loop through the machines and add
foreach (var machine in machines)
{
ConvertMachine(machine, filename, indexId, statsOnly);
}
if (machines != null)
ConvertMachines(machines, filename, indexId, statsOnly);
}
/// <summary>
@@ -41,7 +38,65 @@ namespace SabreTools.DatFiles
/// <param name="item">Header to convert</param>
private void ConvertHeader(Models.Metadata.Header? item)
{
// If the header is invalid, we can't do anything
if (item == null || !item.Any())
return;
// Create an internal header
var header = new DatFiles.DatHeader(item);
// Convert subheader values
if (item.ContainsKey(Models.Metadata.Header.CanOpenKey))
{
// TODO: Implement
}
if (item.ContainsKey(Models.Metadata.Header.ImagesKey))
{
// TODO: Implement
}
if (item.ContainsKey(Models.Metadata.Header.InfosKey))
{
// TODO: Implement
}
if (item.ContainsKey(Models.Metadata.Header.NewDatKey))
{
// TODO: Implement
}
if (item.ContainsKey(Models.Metadata.Header.SearchKey))
{
// TODO: Implement
}
// Get all fields that can be set
var nonItemFields = Filter.TypeHelper.GetConstants(typeof(Models.Metadata.Header));
if (nonItemFields == null)
return;
// Loop through and selectively set all fields
foreach (string field in nonItemFields)
{
// TODO: Implement selective setting of all fields in Header
}
}
/// <summary>
/// Convert machines information
/// </summary>
/// <param name="items">Machine array to convert</param>
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param>
/// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param>
private void ConvertMachines(Models.Metadata.Machine[]? items, string filename, int indexId, bool statsOnly)
{
// If the array is invalid, we can't do anything
if (items == null || !items.Any())
return;
// Loop through the machines and add
foreach (var machine in items)
{
ConvertMachine(machine, filename, indexId, statsOnly);
}
}
/// <summary>
@@ -197,22 +252,6 @@ namespace SabreTools.DatFiles
}
}
/// <summary>
/// Read an item array from a given key, if possible
/// </summary>
private static T[]? ReadItemArray<T>(Models.Metadata.DictionaryBase item, string key) where T : Models.Metadata.DictionaryBase
{
var items = item.Read<T[]>(key);
if (items == default)
{
var single = item.Read<T>(key);
if (single != default)
items = [single];
}
return items;
}
/// <summary>
/// Convert Adjuster information
/// </summary>
@@ -938,6 +977,22 @@ namespace SabreTools.DatFiles
}
}
/// <summary>
/// Read an item array from a given key, if possible
/// </summary>
private static T[]? ReadItemArray<T>(Models.Metadata.DictionaryBase item, string key) where T : Models.Metadata.DictionaryBase
{
var items = item.Read<T[]>(key);
if (items == default)
{
var single = item.Read<T>(key);
if (single != default)
items = [single];
}
return items;
}
#endregion
}
}

View File

@@ -112,6 +112,28 @@ namespace SabreTools.DatFiles
#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
/// <summary>

View File

@@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats
var metadata = new Serialization.CrossModel.ArchiveDotOrg().Serialize(files);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats
var metadata = new Serialization.CrossModel.AttractMode().Serialize(metadataFile);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -22,7 +22,7 @@ namespace SabreTools.DatFiles.Formats
ConvertHeader(metadataFile?.ClrMamePro, keep);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -20,7 +20,7 @@ namespace SabreTools.DatFiles.Formats
ConvertHeader(metadataFile?.DosCenter, keep);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats
var metadata = new Serialization.CrossModel.EverdriveSMDB().Serialize(metadataFile);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats
var metadata = new Serialization.CrossModel.Hashfile().Serialize(hashfile);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -22,7 +22,7 @@ namespace SabreTools.DatFiles.Formats
ConvertHeader(metadataFile, keep);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -27,7 +27,7 @@ namespace SabreTools.DatFiles.Formats
ConvertConfiguration(dat?.Configuration, keep);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
// Convert the GUI to the internal format
ConvertGUI(dat?.GUI);

View File

@@ -28,7 +28,7 @@ namespace SabreTools.DatFiles.Formats
ConvertEmulator(metadataFile?.Emulator);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{

View File

@@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats
var metadata = new Serialization.CrossModel.SeparatedValue().Serialize(metadataFile);
// Convert to the internal format
ConvertMetadata(metadata, filename, indexId, statsOnly);
ConvertMetadata(metadata, filename, indexId, keep, statsOnly);
}
catch (Exception ex) when (!throwOnError)
{