Standardize some model access

This commit is contained in:
Matt Nadareski
2024-07-15 12:48:26 -04:00
parent 81c32ef08f
commit 651f771ffd
12 changed files with 479 additions and 333 deletions

View File

@@ -784,13 +784,14 @@ CREATE TABLE IF NOT EXISTS dat (
/// <param name="dbc">Database connection to use</param> /// <param name="dbc">Database connection to use</param>
internal void AddDatToDatabase(Rom dat, SqliteConnection dbc) internal void AddDatToDatabase(Rom dat, SqliteConnection dbc)
{ {
// Get the dat full path // Get the machine
var machine = dat.GetFieldValue<Machine>(DatItem.MachineKey); var machine = dat.GetFieldValue<Machine>(DatItem.MachineKey);
string fullpath = Path.Combine(_dats!, string? machineName = machine?.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey);
(machine!.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey) == "dats" if (machine == null || machineName == null)
? string.Empty return;
: machine!.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey))!
, dat.GetName()!); // Get the dat full path
string fullpath = Path.Combine(_dats!, machineName == "dats" ? string.Empty : machineName, dat.GetName()!);
// Parse the Dat if possible // Parse the Dat if possible
logger.User($"Adding from '{dat.GetName()}'"); logger.User($"Adding from '{dat.GetName()}'");

View File

@@ -135,8 +135,9 @@ namespace SabreTools.DatFiles
#region Common #region Common
// Handle Machine fields // Handle Machine fields
if (machineFieldNames.Any() && datItem.GetFieldValue<Machine>(DatItem.MachineKey) != null) var machine = datItem.GetFieldValue<Machine>(DatItem.MachineKey);
RemoveFields(datItem.GetFieldValue<Machine>(DatItem.MachineKey), machineFieldNames); if (machineFieldNames.Any() && machine != null)
RemoveFields(machine, machineFieldNames);
// If there are no field names, return // If there are no field names, return
if (itemFieldNames == null || !itemFieldNames.Any()) if (itemFieldNames == null || !itemFieldNames.Any())
@@ -195,10 +196,8 @@ namespace SabreTools.DatFiles
/// <param name="adjuster">Adjuster to remove fields from</param> /// <param name="adjuster">Adjuster to remove fields from</param>
private static void RemoveFields(Adjuster adjuster, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Adjuster adjuster, Dictionary<string, List<string>> itemFieldNames)
{ {
if (!adjuster.ConditionsSpecified) var conditions = adjuster.GetFieldValue<Condition[]?>(Models.Metadata.Adjuster.ConditionKey) ?? [];
return; foreach (Condition subCondition in conditions)
foreach (Condition subCondition in adjuster.GetFieldValue<Condition[]?>(Models.Metadata.Adjuster.ConditionKey)!)
{ {
RemoveFields(subCondition, [], itemFieldNames); RemoveFields(subCondition, [], itemFieldNames);
} }
@@ -210,28 +209,22 @@ namespace SabreTools.DatFiles
/// <param name="configuration">Configuration to remove fields from</param> /// <param name="configuration">Configuration to remove fields from</param>
private static void RemoveFields(Configuration configuration, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Configuration configuration, Dictionary<string, List<string>> itemFieldNames)
{ {
if (configuration.ConditionsSpecified) var conditions = configuration.GetFieldValue<Condition[]?>(Models.Metadata.Configuration.ConditionKey) ?? [];
foreach (Condition subCondition in conditions)
{ {
foreach (Condition subCondition in configuration.GetFieldValue<Condition[]?>(Models.Metadata.Configuration.ConditionKey)!) RemoveFields(subCondition, [], itemFieldNames);
{
RemoveFields(subCondition, [], itemFieldNames);
}
} }
if (configuration.LocationsSpecified) var locations = configuration.GetFieldValue<ConfLocation[]?>(Models.Metadata.Configuration.ConfLocationKey) ?? [];
foreach (ConfLocation subLocation in locations)
{ {
foreach (ConfLocation subLocation in configuration.GetFieldValue<ConfLocation[]?>(Models.Metadata.Configuration.ConfLocationKey)!) RemoveFields(subLocation, [], itemFieldNames);
{
RemoveFields(subLocation, [], itemFieldNames);
}
} }
if (configuration.SettingsSpecified) var settings = configuration.GetFieldValue<ConfSetting[]?>(Models.Metadata.Configuration.ConfSettingKey) ?? [];
foreach (ConfSetting subSetting in settings)
{ {
foreach (ConfSetting subSetting in configuration.GetFieldValue<ConfSetting[]?>(Models.Metadata.Configuration.ConfSettingKey)!) RemoveFields(subSetting as DatItem, [], itemFieldNames);
{
RemoveFields(subSetting as DatItem, [], itemFieldNames);
}
} }
} }
@@ -241,12 +234,10 @@ namespace SabreTools.DatFiles
/// <param name="confsetting">ConfSetting to remove fields from</param> /// <param name="confsetting">ConfSetting to remove fields from</param>
private static void RemoveFields(ConfSetting confsetting, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(ConfSetting confsetting, Dictionary<string, List<string>> itemFieldNames)
{ {
if (confsetting.ConditionsSpecified) var conditions = confsetting.GetFieldValue<Condition[]?>(Models.Metadata.ConfSetting.ConditionKey) ?? [];
foreach (Condition subCondition in conditions)
{ {
foreach (Condition subCondition in confsetting.GetFieldValue<Condition[]?>(Models.Metadata.ConfSetting.ConditionKey)!) RemoveFields(subCondition, [], itemFieldNames);
{
RemoveFields(subCondition, [], itemFieldNames);
}
} }
} }
@@ -256,20 +247,16 @@ namespace SabreTools.DatFiles
/// <param name="device">Device to remove fields from</param> /// <param name="device">Device to remove fields from</param>
private static void RemoveFields(Device device, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Device device, Dictionary<string, List<string>> itemFieldNames)
{ {
if (device.ExtensionsSpecified) var extensions = device.GetFieldValue<Extension[]?>(Models.Metadata.Device.ExtensionKey) ?? [];
foreach (Extension subExtension in extensions)
{ {
foreach (Extension subExtension in device.GetFieldValue<Extension[]?>(Models.Metadata.Device.ExtensionKey)!) RemoveFields(subExtension, [], itemFieldNames);
{
RemoveFields(subExtension, [], itemFieldNames);
}
} }
if (device.InstancesSpecified) var instances = device.GetFieldValue<Instance[]?>(Models.Metadata.Device.InstanceKey) ?? [];
foreach (Instance subInstance in instances)
{ {
foreach (Instance subInstance in device.GetFieldValue<Instance[]?>(Models.Metadata.Device.InstanceKey)!) RemoveFields(subInstance, [], itemFieldNames);
{
RemoveFields(subInstance, [], itemFieldNames);
}
} }
} }
@@ -279,32 +266,27 @@ namespace SabreTools.DatFiles
/// <param name="dipSwitch">DipSwitch to remove fields from</param> /// <param name="dipSwitch">DipSwitch to remove fields from</param>
private static void RemoveFields(DipSwitch dipSwitch, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(DipSwitch dipSwitch, Dictionary<string, List<string>> itemFieldNames)
{ {
if (dipSwitch.ConditionsSpecified) var conditions = dipSwitch.GetFieldValue<Condition[]?>(Models.Metadata.DipSwitch.ConditionKey) ?? [];
foreach (Condition subCondition in conditions)
{ {
foreach (Condition subCondition in dipSwitch.GetFieldValue<Condition[]?>(Models.Metadata.DipSwitch.ConditionKey)!) RemoveFields(subCondition, [], itemFieldNames);
{
RemoveFields(subCondition, [], itemFieldNames);
}
} }
if (dipSwitch.LocationsSpecified) var locations = dipSwitch.GetFieldValue<DipLocation[]?>(Models.Metadata.DipSwitch.DipLocationKey) ?? [];
foreach (DipLocation subLocation in locations)
{ {
foreach (DipLocation subLocation in dipSwitch.GetFieldValue<DipLocation[]?>(Models.Metadata.DipSwitch.DipLocationKey)!) RemoveFields(subLocation, [], itemFieldNames);
{
RemoveFields(subLocation, [], itemFieldNames);
}
} }
if (dipSwitch.ValuesSpecified) var dipValues = dipSwitch.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey) ?? [];
foreach (DipValue subValue in dipValues)
{ {
foreach (DipValue subValue in dipSwitch.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey)!) RemoveFields(subValue as DatItem, [], itemFieldNames);
{
RemoveFields(subValue as DatItem, [], itemFieldNames);
}
} }
if (dipSwitch.PartSpecified) var part = dipSwitch.GetFieldValue<Part?>(DipSwitch.PartKey);
RemoveFields(dipSwitch.GetFieldValue<Part?>(DipSwitch.PartKey)! as DatItem, [], itemFieldNames); if (part != null)
RemoveFields(part as DatItem, [], itemFieldNames);
} }
/// <summary> /// <summary>
@@ -313,12 +295,10 @@ namespace SabreTools.DatFiles
/// <param name="dipValue">DipValue to remove fields from</param> /// <param name="dipValue">DipValue to remove fields from</param>
private static void RemoveFields(DipValue dipValue, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(DipValue dipValue, Dictionary<string, List<string>> itemFieldNames)
{ {
if (dipValue.ConditionsSpecified) var conditions = dipValue.GetFieldValue<Condition[]?>(Models.Metadata.DipValue.ConditionKey) ?? [];
foreach (Condition subCondition in conditions)
{ {
foreach (Condition subCondition in dipValue.GetFieldValue<Condition[]?>(Models.Metadata.DipValue.ConditionKey)!) RemoveFields(subCondition, [], itemFieldNames);
{
RemoveFields(subCondition, [], itemFieldNames);
}
} }
} }
@@ -328,11 +308,13 @@ namespace SabreTools.DatFiles
/// <param name="disk">Disk to remove fields from</param> /// <param name="disk">Disk to remove fields from</param>
private static void RemoveFields(Disk disk, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Disk disk, Dictionary<string, List<string>> itemFieldNames)
{ {
if (disk.DiskAreaSpecified) var diskArea = disk.GetFieldValue<DiskArea?>(Disk.DiskAreaKey);
RemoveFields(disk.GetFieldValue<DiskArea?>(Disk.DiskAreaKey)! as DatItem, [], itemFieldNames); if (diskArea != null)
RemoveFields(diskArea as DatItem, [], itemFieldNames);
if (disk.PartSpecified) var part = disk.GetFieldValue<Part?>(Disk.PartKey);
RemoveFields(disk.GetFieldValue<Part?>(Disk.PartKey)! as DatItem, [], itemFieldNames); if (part != null)
RemoveFields(part as DatItem, [], itemFieldNames);
} }
/// <summary> /// <summary>
@@ -341,12 +323,10 @@ namespace SabreTools.DatFiles
/// <param name="input">Input to remove fields from</param> /// <param name="input">Input to remove fields from</param>
private static void RemoveFields(Input input, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Input input, Dictionary<string, List<string>> itemFieldNames)
{ {
if (input.ControlsSpecified) var controls = input.GetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey) ?? [];
foreach (Control subControl in controls)
{ {
foreach (Control subControl in input.GetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey)!) RemoveFields(subControl, [], itemFieldNames);
{
RemoveFields(subControl, [], itemFieldNames);
}
} }
} }
@@ -356,12 +336,10 @@ namespace SabreTools.DatFiles
/// <param name="part">Part to remove fields from</param> /// <param name="part">Part to remove fields from</param>
private static void RemoveFields(Part part, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Part part, Dictionary<string, List<string>> itemFieldNames)
{ {
if (part.FeaturesSpecified) var features = part.GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey) ?? [];
foreach (PartFeature subPartFeature in features)
{ {
foreach (PartFeature subPartFeature in part.GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey)!) RemoveFields(subPartFeature, [], itemFieldNames);
{
RemoveFields(subPartFeature, [], itemFieldNames);
}
} }
} }
@@ -371,12 +349,10 @@ namespace SabreTools.DatFiles
/// <param name="port">Port to remove fields from</param> /// <param name="port">Port to remove fields from</param>
private static void RemoveFields(Port port, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Port port, Dictionary<string, List<string>> itemFieldNames)
{ {
if (port.AnalogsSpecified) var analogs = port.GetFieldValue<Analog[]?>(Models.Metadata.Port.AnalogKey) ?? [];
foreach (Analog subAnalog in analogs)
{ {
foreach (Analog subAnalog in port.GetFieldValue<Analog[]?>(Models.Metadata.Port.AnalogKey)!) RemoveFields(subAnalog, [], itemFieldNames);
{
RemoveFields(subAnalog, [], itemFieldNames);
}
} }
} }
@@ -386,11 +362,13 @@ namespace SabreTools.DatFiles
/// <param name="rom">Rom to remove fields from</param> /// <param name="rom">Rom to remove fields from</param>
private static void RemoveFields(Rom rom, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Rom rom, Dictionary<string, List<string>> itemFieldNames)
{ {
if (rom.DataAreaSpecified) var dataArea = rom.GetFieldValue<DataArea?>(Rom.DataAreaKey);
RemoveFields(rom.GetFieldValue<DataArea?>(Rom.DataAreaKey)!, [], itemFieldNames); if (dataArea != null)
RemoveFields(dataArea as DatItem, [], itemFieldNames);
if (rom.PartSpecified) var part = rom.GetFieldValue<Part?>(Rom.PartKey);
RemoveFields(rom.GetFieldValue<Part?>(Rom.PartKey)! as DatItem, [], itemFieldNames); if (part != null)
RemoveFields(part as DatItem, [], itemFieldNames);
} }
/// <summary> /// <summary>
@@ -399,12 +377,10 @@ namespace SabreTools.DatFiles
/// <param name="slot">Slot to remove fields from</param> /// <param name="slot">Slot to remove fields from</param>
private static void RemoveFields(Slot slot, Dictionary<string, List<string>> itemFieldNames) private static void RemoveFields(Slot slot, Dictionary<string, List<string>> itemFieldNames)
{ {
if (slot.SlotOptionsSpecified) var slotOptions = slot.GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey) ?? [];
foreach (SlotOption subSlotOption in slotOptions)
{ {
foreach (SlotOption subSlotOption in slot.GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey)!) RemoveFields(subSlotOption, [], itemFieldNames);
{
RemoveFields(subSlotOption, [], itemFieldNames);
}
} }
} }

View File

@@ -119,7 +119,8 @@ namespace SabreTools.DatFiles
/// <param name="datHeader">DatHeader to get the values from</param> /// <param name="datHeader">DatHeader to get the values from</param>
public static DatFile Create(DatHeader datHeader) public static DatFile Create(DatHeader datHeader)
{ {
DatFile datFile = Create(datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)); DatFormat format = datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey);
DatFile datFile = Create(format);
datFile.Header = (DatHeader)datHeader.Clone(); datFile.Header = (DatHeader)datHeader.Clone();
return datFile; return datFile;
} }
@@ -131,24 +132,29 @@ namespace SabreTools.DatFiles
/// <param name="bare">True if the date should be omitted from name and description, false otherwise</param> /// <param name="bare">True if the date should be omitted from name and description, false otherwise</param>
public void FillHeaderFromPath(string path, bool bare) public void FillHeaderFromPath(string path, bool bare)
{ {
// Get the header strings
string? name = Header.GetStringFieldValue(Models.Metadata.Header.NameKey);
string? description = Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey);
string? date = Header.GetStringFieldValue(Models.Metadata.Header.DateKey);
// If the description is defined but not the name, set the name from the description // If the description is defined but not the name, set the name from the description
if (string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.NameKey)) && !string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey))) if (string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(description))
{ {
Header.SetFieldValue<string?>(Models.Metadata.Header.NameKey, Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); Header.SetFieldValue<string?>(Models.Metadata.Header.NameKey, description);
} }
// If the name is defined but not the description, set the description from the name // If the name is defined but not the description, set the description from the name
else if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey))) else if (!string.IsNullOrEmpty(name) && string.IsNullOrEmpty(description))
{ {
Header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey, Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + (bare ? string.Empty : $" ({Header.GetStringFieldValue(Models.Metadata.Header.DateKey)})")); Header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey, name + (bare ? string.Empty : $" ({date})"));
} }
// If neither the name or description are defined, set them from the automatic values // If neither the name or description are defined, set them from the automatic values
else if (string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.NameKey)) && string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey))) else if (string.IsNullOrEmpty(name) && string.IsNullOrEmpty(description))
{ {
string[] splitpath = path.TrimEnd(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); string[] splitpath = path.TrimEnd(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar);
Header.SetFieldValue<string?>(Models.Metadata.Header.NameKey, splitpath.Last()); Header.SetFieldValue<string?>(Models.Metadata.Header.NameKey, splitpath.Last());
Header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey, Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + (bare ? string.Empty : $" ({Header.GetStringFieldValue(Models.Metadata.Header.DateKey)})")); Header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey, splitpath.Last() + (bare ? string.Empty : $" ({date})"));
} }
} }
@@ -245,14 +251,17 @@ namespace SabreTools.DatFiles
{ {
// Get machine for the item // Get machine for the item
var machine = item.GetFieldValue<Machine>(DatItem.MachineKey); var machine = item.GetFieldValue<Machine>(DatItem.MachineKey);
if (machine == null)
return string.Empty;
// Initialize strings // Initialize strings
string? type = item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey);
string fix, string fix,
game = item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, game = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty,
manufacturer = machine!.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty, manufacturer = machine.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty,
publisher = machine!.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty, publisher = machine.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty,
category = machine!.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, category = machine.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty,
name = item.GetName() ?? item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>().AsStringValue() ?? string.Empty, name = item.GetName() ?? type.AsEnumValue<ItemType>().AsStringValue() ?? string.Empty,
crc = string.Empty, crc = string.Empty,
md5 = string.Empty, md5 = string.Empty,
sha1 = string.Empty, sha1 = string.Empty,
@@ -262,13 +271,22 @@ namespace SabreTools.DatFiles
size = string.Empty, size = string.Empty,
spamsum = string.Empty; spamsum = string.Empty;
// Check for quotes
bool? quotes = Header.GetBoolFieldValue(DatHeader.QuotesKey);
// If we have a prefix // If we have a prefix
if (prefix) if (prefix)
fix = Header.GetStringFieldValue(DatHeader.PrefixKey) + (Header.GetBoolFieldValue(DatHeader.QuotesKey) == true ? "\"" : string.Empty); {
string? prefixString = Header.GetStringFieldValue(DatHeader.PrefixKey);
fix = prefixString + (quotes == true ? "\"" : string.Empty);
}
// If we have a postfix // If we have a postfix
else else
fix = (Header.GetBoolFieldValue(DatHeader.QuotesKey) == true ? "\"" : string.Empty) + Header.GetStringFieldValue(DatHeader.PostfixKey); {
string? postfixString = Header.GetStringFieldValue(DatHeader.PostfixKey);
fix = (quotes == true ? "\"" : string.Empty) + postfixString;
}
// Ensure we have the proper values for replacement // Ensure we have the proper values for replacement
if (item is Disk disk) if (item is Disk disk)
@@ -325,14 +343,17 @@ namespace SabreTools.DatFiles
{ {
// Get machine for the item // Get machine for the item
var machine = ItemsDB.GetMachineForItem(item.Item1); var machine = ItemsDB.GetMachineForItem(item.Item1);
if (machine.Item2 == null)
return string.Empty;
// Initialize strings // Initialize strings
string? type = item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey);
string fix, string fix,
game = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, game = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty,
manufacturer = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty, manufacturer = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty,
publisher = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty, publisher = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty,
category = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, category = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty,
name = item.Item2.GetName() ?? item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>().AsStringValue() ?? string.Empty, name = item.Item2.GetName() ?? type.AsEnumValue<ItemType>().AsStringValue() ?? string.Empty,
crc = string.Empty, crc = string.Empty,
md5 = string.Empty, md5 = string.Empty,
sha1 = string.Empty, sha1 = string.Empty,
@@ -342,13 +363,22 @@ namespace SabreTools.DatFiles
size = string.Empty, size = string.Empty,
spamsum = string.Empty; spamsum = string.Empty;
// Check for quotes
bool? quotes = Header.GetBoolFieldValue(DatHeader.QuotesKey);
// If we have a prefix // If we have a prefix
if (prefix) if (prefix)
fix = Header.GetStringFieldValue(DatHeader.PrefixKey) + (Header.GetBoolFieldValue(DatHeader.QuotesKey) == true ? "\"" : string.Empty); {
string? prefixString = Header.GetStringFieldValue(DatHeader.PrefixKey);
fix = prefixString + (quotes == true ? "\"" : string.Empty);
}
// If we have a postfix // If we have a postfix
else else
fix = (Header.GetBoolFieldValue(DatHeader.QuotesKey) == true ? "\"" : string.Empty) + Header.GetStringFieldValue(DatHeader.PostfixKey); {
string? postfixString = Header.GetStringFieldValue(DatHeader.PostfixKey);
fix = (quotes == true ? "\"" : string.Empty) + postfixString;
}
// Ensure we have the proper values for replacement // Ensure we have the proper values for replacement
if (item.Item2 is Disk disk) if (item.Item2 is Disk disk)
@@ -411,24 +441,30 @@ namespace SabreTools.DatFiles
if (forceRomName) if (forceRomName)
Header.SetFieldValue<bool>(DatHeader.UseRomNameKey, true); Header.SetFieldValue<bool>(DatHeader.UseRomNameKey, true);
// Get the machine
var machine = item.GetFieldValue<Machine>(DatItem.MachineKey);
if (machine == null)
return;
// Get the name to update // Get the name to update
string? name = (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true string? name = (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true
? item.GetName() ? item.GetName()
: item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)) ?? string.Empty; : machine.GetStringFieldValue(Models.Metadata.Machine.NameKey)) ?? string.Empty;
// Create the proper Prefix and Postfix // Create the proper Prefix and Postfix
string pre = CreatePrefixPostfix(item, true); string pre = CreatePrefixPostfix(item, true);
string post = CreatePrefixPostfix(item, false); string post = CreatePrefixPostfix(item, false);
// If we're in Depot mode, take care of that instead // If we're in Depot mode, take care of that instead
if (Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.IsActive == true) var outputDepot = Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey);
if (outputDepot?.IsActive == true)
{ {
if (item is Disk disk) if (item is Disk disk)
{ {
// We can only write out if there's a SHA-1 // We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))) if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
{ {
name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), outputDepot.Depth)?.Replace('\\', '/');
item.SetName($"{pre}{name}{post}"); item.SetName($"{pre}{name}{post}");
} }
} }
@@ -437,7 +473,7 @@ namespace SabreTools.DatFiles
// We can only write out if there's a SHA-1 // We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key))) if (!string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key)))
{ {
name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), outputDepot.Depth)?.Replace('\\', '/');
item.SetName($"{pre}{name}{post}"); item.SetName($"{pre}{name}{post}");
} }
} }
@@ -446,7 +482,7 @@ namespace SabreTools.DatFiles
// We can only write out if there's a SHA-1 // We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))) if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
{ {
name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), outputDepot.Depth)?.Replace('\\', '/');
item.SetName($"{pre}{name}{post}"); item.SetName($"{pre}{name}{post}");
} }
} }
@@ -454,31 +490,34 @@ namespace SabreTools.DatFiles
return; return;
} }
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(DatHeader.ReplaceExtensionKey)) || Header.GetBoolFieldValue(DatHeader.RemoveExtensionKey) == true) string? replaceExtension = Header.GetStringFieldValue(DatHeader.ReplaceExtensionKey);
bool? removeExtension = Header.GetBoolFieldValue(DatHeader.RemoveExtensionKey);
if (!string.IsNullOrEmpty(replaceExtension) || removeExtension == true)
{ {
if (Header.GetBoolFieldValue(DatHeader.RemoveExtensionKey) == true) if (removeExtension == true)
Header.SetFieldValue<string?>(DatHeader.ReplaceExtensionKey, string.Empty); Header.SetFieldValue<string?>(DatHeader.ReplaceExtensionKey, string.Empty);
string? dir = Path.GetDirectoryName(name); string? dir = Path.GetDirectoryName(name);
if (dir != null) if (dir != null)
{ {
dir = dir.TrimStart(Path.DirectorySeparatorChar); dir = dir.TrimStart(Path.DirectorySeparatorChar);
name = Path.Combine(dir, Path.GetFileNameWithoutExtension(name) + Header.GetStringFieldValue(DatHeader.ReplaceExtensionKey)); name = Path.Combine(dir, Path.GetFileNameWithoutExtension(name) + replaceExtension);
} }
} }
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(DatHeader.AddExtensionKey))) string? addExtension = Header.GetStringFieldValue(DatHeader.AddExtensionKey);
name += Header.GetStringFieldValue(DatHeader.AddExtensionKey); if (!string.IsNullOrEmpty(addExtension))
name += addExtension;
if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && Header.GetBoolFieldValue(DatHeader.GameNameKey) == true) if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && Header.GetBoolFieldValue(DatHeader.GameNameKey) == true)
name = Path.Combine(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, name); name = Path.Combine(machine.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, name);
// Now assign back the formatted name // Now assign back the formatted name
name = $"{pre}{name}{post}"; name = $"{pre}{name}{post}";
if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true) if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true)
item.SetName(name); item.SetName(name);
else if (item.GetFieldValue<Machine>(DatItem.MachineKey) != null) else
item.GetFieldValue<Machine>(DatItem.MachineKey)!.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, name); machine.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, name);
// Restore all relevant values // Restore all relevant values
if (forceRemoveQuotes) if (forceRemoveQuotes)
@@ -517,14 +556,15 @@ namespace SabreTools.DatFiles
string post = CreatePrefixPostfixDB(item, false); string post = CreatePrefixPostfixDB(item, false);
// If we're in Depot mode, take care of that instead // If we're in Depot mode, take care of that instead
if (Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.IsActive == true) var outputDepot = Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey);
if (outputDepot?.IsActive == true)
{ {
if (item.Item2 is Disk disk) if (item.Item2 is Disk disk)
{ {
// We can only write out if there's a SHA-1 // We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))) if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
{ {
name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), outputDepot.Depth)?.Replace('\\', '/');
item.Item2.SetName($"{pre}{name}{post}"); item.Item2.SetName($"{pre}{name}{post}");
} }
} }
@@ -533,7 +573,7 @@ namespace SabreTools.DatFiles
// We can only write out if there's a SHA-1 // We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key))) if (!string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key)))
{ {
name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), outputDepot.Depth)?.Replace('\\', '/');
item.Item2.SetName($"{pre}{name}{post}"); item.Item2.SetName($"{pre}{name}{post}");
} }
} }
@@ -542,7 +582,7 @@ namespace SabreTools.DatFiles
// We can only write out if there's a SHA-1 // We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))) if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
{ {
name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), outputDepot.Depth)?.Replace('\\', '/');
item.Item2.SetName($"{pre}{name}{post}"); item.Item2.SetName($"{pre}{name}{post}");
} }
} }
@@ -550,21 +590,24 @@ namespace SabreTools.DatFiles
return; return;
} }
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(DatHeader.ReplaceExtensionKey)) || Header.GetBoolFieldValue(DatHeader.RemoveExtensionKey) == true) string? replaceExtension = Header.GetStringFieldValue(DatHeader.ReplaceExtensionKey);
bool? removeExtension = Header.GetBoolFieldValue(DatHeader.RemoveExtensionKey);
if (!string.IsNullOrEmpty(replaceExtension) || removeExtension == true)
{ {
if (Header.GetBoolFieldValue(DatHeader.RemoveExtensionKey) == true) if (removeExtension == true)
Header.SetFieldValue<string?>(DatHeader.ReplaceExtensionKey, string.Empty); Header.SetFieldValue<string?>(DatHeader.ReplaceExtensionKey, string.Empty);
string? dir = Path.GetDirectoryName(name); string? dir = Path.GetDirectoryName(name);
if (dir != null) if (dir != null)
{ {
dir = dir.TrimStart(Path.DirectorySeparatorChar); dir = dir.TrimStart(Path.DirectorySeparatorChar);
name = Path.Combine(dir, Path.GetFileNameWithoutExtension(name) + Header.GetStringFieldValue(DatHeader.ReplaceExtensionKey)); name = Path.Combine(dir, Path.GetFileNameWithoutExtension(name) + replaceExtension);
} }
} }
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(DatHeader.AddExtensionKey))) string? addExtension = Header.GetStringFieldValue(DatHeader.AddExtensionKey);
name += Header.GetStringFieldValue(DatHeader.AddExtensionKey); if (!string.IsNullOrEmpty(addExtension))
name += addExtension;
if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && Header.GetBoolFieldValue(DatHeader.GameNameKey) == true) if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && Header.GetBoolFieldValue(DatHeader.GameNameKey) == true)
name = Path.Combine(machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, name); name = Path.Combine(machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, name);
@@ -595,20 +638,33 @@ namespace SabreTools.DatFiles
if (item is not Rom rom) if (item is not Rom rom)
return item; return item;
// Get machine for the item
var machine = item.GetFieldValue<Machine>(DatItem.MachineKey);
if (machine == null)
return item;
// If the Rom has "null" characteristics, ensure all fields // If the Rom has "null" characteristics, ensure all fields
if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null && rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null") if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null
&& rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null")
{ {
logger.Verbose($"Empty folder found: {item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)}"); logger.Verbose($"Empty folder found: {machine.GetStringFieldValue(Models.Metadata.Machine.NameKey)}");
rom.SetName(rom.GetName() == "null" ? "-" : rom.GetName()); rom.SetName(rom.GetName() == "null" ? "-" : rom.GetName());
rom.SetFieldValue<string?>(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); rom.SetFieldValue<string?>(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString());
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey,
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null); rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key,
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null); rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key,
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null); rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key,
rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key,
rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key,
rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey,
rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null);
} }
return rom; return rom;
@@ -627,21 +683,32 @@ namespace SabreTools.DatFiles
// Get machine for the item // Get machine for the item
var machine = ItemsDB.GetMachineForItem(item.Item1); var machine = ItemsDB.GetMachineForItem(item.Item1);
var machineObj = machine.Item2;
if (machineObj == null)
return item;
// If the Rom has "null" characteristics, ensure all fields // If the Rom has "null" characteristics, ensure all fields
if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null && rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null") if (rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) == null
&& rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null")
{ {
logger.Verbose($"Empty folder found: {machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey)}"); logger.Verbose($"Empty folder found: {machineObj.GetStringFieldValue(Models.Metadata.Machine.NameKey)}");
rom.SetName(rom.GetName() == "null" ? "-" : rom.GetName()); rom.SetName(rom.GetName() == "null" ? "-" : rom.GetName());
rom.SetFieldValue<string?>(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); rom.SetFieldValue<string?>(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString());
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey,
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null); rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key,
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null); rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key,
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null); rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null); rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key,
rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key,
rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key,
rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey,
rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null);
} }
return (item.Item1, rom); return (item.Item1, rom);
@@ -676,7 +743,8 @@ namespace SabreTools.DatFiles
foreach (DatItem datItem in datItems) foreach (DatItem datItem in datItems)
{ {
if (GetSupportedTypes().Contains(datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>())) ItemType itemType = datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>();
if (GetSupportedTypes().Contains(itemType))
return true; return true;
} }
@@ -697,7 +765,8 @@ namespace SabreTools.DatFiles
foreach ((long, DatItem) datItem in datItems) foreach ((long, DatItem) datItem in datItems)
{ {
if (GetSupportedTypes().Contains(datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>())) ItemType itemType = datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>();
if (GetSupportedTypes().Contains(itemType))
return true; return true;
} }
@@ -749,10 +818,11 @@ namespace SabreTools.DatFiles
} }
// If we have an item type not in the list of supported values // If we have an item type not in the list of supported values
string datFormat = Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey).ToString() ?? "Unknown Format";
if (!GetSupportedTypes().Contains(datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>())) if (!GetSupportedTypes().Contains(datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>()))
{ {
string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); string itemString = JsonConvert.SerializeObject(datItem, Formatting.None);
logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)}"); logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {datFormat}");
return true; return true;
} }
@@ -762,9 +832,9 @@ namespace SabreTools.DatFiles
{ {
string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); string itemString = JsonConvert.SerializeObject(datItem, Formatting.None);
#if NET20 || NET35 #if NET20 || NET35
logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)}: {string.Join(", ", [.. missingFields])}"); logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", [.. missingFields])}");
#else #else
logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)}: {string.Join(", ", missingFields)}"); logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", missingFields)}");
#endif #endif
return true; return true;
} }
@@ -817,10 +887,11 @@ namespace SabreTools.DatFiles
} }
// If we have an item type not in the list of supported values // If we have an item type not in the list of supported values
string datFormat = Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey).ToString() ?? "Unknown Format";
if (!GetSupportedTypes().Contains(datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>())) if (!GetSupportedTypes().Contains(datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>()))
{ {
string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); string itemString = JsonConvert.SerializeObject(datItem, Formatting.None);
logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)}"); logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {datFormat}");
return true; return true;
} }
@@ -830,9 +901,9 @@ namespace SabreTools.DatFiles
{ {
string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); string itemString = JsonConvert.SerializeObject(datItem, Formatting.None);
#if NET20 || NET35 #if NET20 || NET35
logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)}: {string.Join(", ", [.. missingFields])}"); logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", [.. missingFields])}");
#else #else
logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)}: {string.Join(", ", missingFields)}"); logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", missingFields)}");
#endif #endif
return true; return true;
} }

View File

@@ -177,24 +177,42 @@ namespace SabreTools.DatFiles
public DatHeader CloneStandard() public DatHeader CloneStandard()
{ {
var header = new DatHeader(); var header = new DatHeader();
header.SetFieldValue<string?>(Models.Metadata.Header.AuthorKey, GetStringFieldValue(Models.Metadata.Header.AuthorKey)); header.SetFieldValue<string?>(Models.Metadata.Header.AuthorKey,
header.SetFieldValue<string?>(Models.Metadata.Header.CategoryKey, GetStringFieldValue(Models.Metadata.Header.CategoryKey)); GetStringFieldValue(Models.Metadata.Header.AuthorKey));
header.SetFieldValue<string?>(Models.Metadata.Header.CommentKey, GetStringFieldValue(Models.Metadata.Header.CommentKey)); header.SetFieldValue<string?>(Models.Metadata.Header.CategoryKey,
header.SetFieldValue<string?>(Models.Metadata.Header.DateKey, GetStringFieldValue(Models.Metadata.Header.DateKey)); GetStringFieldValue(Models.Metadata.Header.CategoryKey));
header.SetFieldValue<DatFormat>(DatHeader.DatFormatKey, GetFieldValue<DatFormat>(DatHeader.DatFormatKey)); header.SetFieldValue<string?>(Models.Metadata.Header.CommentKey,
header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey, GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); GetStringFieldValue(Models.Metadata.Header.CommentKey));
header.SetFieldValue<string?>(Models.Metadata.Header.EmailKey, GetStringFieldValue(Models.Metadata.Header.EmailKey)); header.SetFieldValue<string?>(Models.Metadata.Header.DateKey,
header.SetFieldValue<string?>(DatHeader.FileNameKey, GetStringFieldValue(DatHeader.FileNameKey)); GetStringFieldValue(Models.Metadata.Header.DateKey));
header.SetFieldValue<string?>(Models.Metadata.Header.ForceMergingKey, GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue<MergingFlag>().AsStringValue()); header.SetFieldValue<DatFormat>(DatHeader.DatFormatKey,
header.SetFieldValue<string?>(Models.Metadata.Header.ForceNodumpKey, GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>().AsStringValue()); GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
header.SetFieldValue<string?>(Models.Metadata.Header.ForcePackingKey, GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>().AsStringValue()); header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey,
header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, GetStringFieldValue(Models.Metadata.Header.HeaderKey)); GetStringFieldValue(Models.Metadata.Header.DescriptionKey));
header.SetFieldValue<string?>(Models.Metadata.Header.HomepageKey, GetStringFieldValue(Models.Metadata.Header.HomepageKey)); header.SetFieldValue<string?>(Models.Metadata.Header.EmailKey,
header.SetFieldValue<string?>(Models.Metadata.Header.NameKey, GetStringFieldValue(Models.Metadata.Header.NameKey)); GetStringFieldValue(Models.Metadata.Header.EmailKey));
header.SetFieldValue<string?>(Models.Metadata.Header.RootDirKey, GetStringFieldValue(Models.Metadata.Header.RootDirKey)); header.SetFieldValue<string?>(DatHeader.FileNameKey,
header.SetFieldValue<string?>(Models.Metadata.Header.TypeKey, GetStringFieldValue(Models.Metadata.Header.TypeKey)); GetStringFieldValue(DatHeader.FileNameKey));
header.SetFieldValue<string?>(Models.Metadata.Header.UrlKey, GetStringFieldValue(Models.Metadata.Header.UrlKey)); header.SetFieldValue<string?>(Models.Metadata.Header.ForceMergingKey,
header.SetFieldValue<string?>(Models.Metadata.Header.VersionKey, GetStringFieldValue(Models.Metadata.Header.VersionKey)); GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue<MergingFlag>().AsStringValue());
header.SetFieldValue<string?>(Models.Metadata.Header.ForceNodumpKey,
GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>().AsStringValue());
header.SetFieldValue<string?>(Models.Metadata.Header.ForcePackingKey,
GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>().AsStringValue());
header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey,
GetStringFieldValue(Models.Metadata.Header.HeaderKey));
header.SetFieldValue<string?>(Models.Metadata.Header.HomepageKey,
GetStringFieldValue(Models.Metadata.Header.HomepageKey));
header.SetFieldValue<string?>(Models.Metadata.Header.NameKey,
GetStringFieldValue(Models.Metadata.Header.NameKey));
header.SetFieldValue<string?>(Models.Metadata.Header.RootDirKey,
GetStringFieldValue(Models.Metadata.Header.RootDirKey));
header.SetFieldValue<string?>(Models.Metadata.Header.TypeKey,
GetStringFieldValue(Models.Metadata.Header.TypeKey));
header.SetFieldValue<string?>(Models.Metadata.Header.UrlKey,
GetStringFieldValue(Models.Metadata.Header.UrlKey));
header.SetFieldValue<string?>(Models.Metadata.Header.VersionKey,
GetStringFieldValue(Models.Metadata.Header.VersionKey));
return header; return header;
} }
@@ -205,17 +223,28 @@ namespace SabreTools.DatFiles
public DatHeader CloneFiltering() public DatHeader CloneFiltering()
{ {
var header = new DatHeader(); var header = new DatHeader();
header.SetFieldValue<string?>(DatHeader.AddExtensionKey, GetStringFieldValue(DatHeader.AddExtensionKey)); header.SetFieldValue<string?>(DatHeader.AddExtensionKey,
header.SetFieldValue<DatFormat>(DatHeader.DatFormatKey, GetFieldValue<DatFormat>(DatHeader.DatFormatKey)); GetStringFieldValue(DatHeader.AddExtensionKey));
header.SetFieldValue<bool?>(DatHeader.GameNameKey, GetBoolFieldValue(DatHeader.GameNameKey)); header.SetFieldValue<DatFormat>(DatHeader.DatFormatKey,
header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation); GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
header.SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey, GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); header.SetFieldValue<bool?>(DatHeader.GameNameKey,
header.SetFieldValue<string?>(DatHeader.PostfixKey, GetStringFieldValue(DatHeader.PostfixKey)); GetBoolFieldValue(DatHeader.GameNameKey));
header.SetFieldValue<string?>(DatHeader.PrefixKey, GetStringFieldValue(DatHeader.PrefixKey)); header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey,
header.SetFieldValue<bool?>(DatHeader.RemoveExtensionKey, GetBoolFieldValue(DatHeader.RemoveExtensionKey)); GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation);
header.SetFieldValue<string?>(DatHeader.ReplaceExtensionKey, GetStringFieldValue(DatHeader.ReplaceExtensionKey)); header.SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey,
header.SetFieldValue<bool?>(DatHeader.QuotesKey, GetBoolFieldValue(DatHeader.QuotesKey)); GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.Clone() as DepotInformation);
header.SetFieldValue<bool?>(DatHeader.UseRomNameKey, GetBoolFieldValue(DatHeader.UseRomNameKey)); header.SetFieldValue<string?>(DatHeader.PostfixKey,
GetStringFieldValue(DatHeader.PostfixKey));
header.SetFieldValue<string?>(DatHeader.PrefixKey,
GetStringFieldValue(DatHeader.PrefixKey));
header.SetFieldValue<bool?>(DatHeader.RemoveExtensionKey,
GetBoolFieldValue(DatHeader.RemoveExtensionKey));
header.SetFieldValue<string?>(DatHeader.ReplaceExtensionKey,
GetStringFieldValue(DatHeader.ReplaceExtensionKey));
header.SetFieldValue<bool?>(DatHeader.QuotesKey,
GetBoolFieldValue(DatHeader.QuotesKey));
header.SetFieldValue<bool?>(DatHeader.UseRomNameKey,
GetBoolFieldValue(DatHeader.UseRomNameKey));
return header; return header;
} }
@@ -230,77 +259,105 @@ namespace SabreTools.DatFiles
return; return;
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.FileNameKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.FileNameKey)))
SetFieldValue<string?>(DatHeader.FileNameKey, datHeader.GetStringFieldValue(DatHeader.FileNameKey)); SetFieldValue<string?>(DatHeader.FileNameKey,
datHeader.GetStringFieldValue(DatHeader.FileNameKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.NameKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.NameKey)))
SetFieldValue<string?>(Models.Metadata.Header.NameKey, datHeader.GetStringFieldValue(Models.Metadata.Header.NameKey)); SetFieldValue<string?>(Models.Metadata.Header.NameKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.NameKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.DescriptionKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)))
SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey, datHeader.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.DescriptionKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.RootDirKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.RootDirKey)))
SetFieldValue<string?>(Models.Metadata.Header.RootDirKey, datHeader.GetStringFieldValue(Models.Metadata.Header.RootDirKey)); SetFieldValue<string?>(Models.Metadata.Header.RootDirKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.RootDirKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.CategoryKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.CategoryKey)))
SetFieldValue<string?>(Models.Metadata.Header.CategoryKey, datHeader.GetStringFieldValue(Models.Metadata.Header.CategoryKey)); SetFieldValue<string?>(Models.Metadata.Header.CategoryKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.CategoryKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.VersionKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.VersionKey)))
SetFieldValue<string?>(Models.Metadata.Header.VersionKey, datHeader.GetStringFieldValue(Models.Metadata.Header.VersionKey)); SetFieldValue<string?>(Models.Metadata.Header.VersionKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.VersionKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.DateKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.DateKey)))
SetFieldValue<string?>(Models.Metadata.Header.DateKey, datHeader.GetStringFieldValue(Models.Metadata.Header.DateKey)); SetFieldValue<string?>(Models.Metadata.Header.DateKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.DateKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.AuthorKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.AuthorKey)))
SetFieldValue<string?>(Models.Metadata.Header.AuthorKey, datHeader.GetStringFieldValue(Models.Metadata.Header.AuthorKey)); SetFieldValue<string?>(Models.Metadata.Header.AuthorKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.AuthorKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.EmailKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.EmailKey)))
SetFieldValue<string?>(Models.Metadata.Header.EmailKey, datHeader.GetStringFieldValue(Models.Metadata.Header.EmailKey)); SetFieldValue<string?>(Models.Metadata.Header.EmailKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.EmailKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.HomepageKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.HomepageKey)))
SetFieldValue<string?>(Models.Metadata.Header.HomepageKey, datHeader.GetStringFieldValue(Models.Metadata.Header.HomepageKey)); SetFieldValue<string?>(Models.Metadata.Header.HomepageKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.HomepageKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.UrlKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.UrlKey)))
SetFieldValue<string?>(Models.Metadata.Header.UrlKey, datHeader.GetStringFieldValue(Models.Metadata.Header.UrlKey)); SetFieldValue<string?>(Models.Metadata.Header.UrlKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.UrlKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.CommentKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.CommentKey)))
SetFieldValue<string?>(Models.Metadata.Header.CommentKey, datHeader.GetStringFieldValue(Models.Metadata.Header.CommentKey)); SetFieldValue<string?>(Models.Metadata.Header.CommentKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.CommentKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.HeaderKey)))
SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, datHeader.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); SetFieldValue<string?>(Models.Metadata.Header.HeaderKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.HeaderKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.TypeKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.TypeKey)))
SetFieldValue<string?>(Models.Metadata.Header.TypeKey, datHeader.GetStringFieldValue(Models.Metadata.Header.TypeKey)); SetFieldValue<string?>(Models.Metadata.Header.TypeKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.TypeKey));
if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue<MergingFlag>() != MergingFlag.None) if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue<MergingFlag>() != MergingFlag.None)
SetFieldValue<string?>(Models.Metadata.Header.ForceMergingKey, datHeader.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue<MergingFlag>().AsStringValue()); SetFieldValue<string?>(Models.Metadata.Header.ForceMergingKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue<MergingFlag>().AsStringValue());
if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>() != NodumpFlag.None) if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>() != NodumpFlag.None)
SetFieldValue<string?>(Models.Metadata.Header.ForceNodumpKey, datHeader.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>().AsStringValue()); SetFieldValue<string?>(Models.Metadata.Header.ForceNodumpKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue<NodumpFlag>().AsStringValue());
if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>() != PackingFlag.None) if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>() != PackingFlag.None)
SetFieldValue<string?>(Models.Metadata.Header.ForcePackingKey, datHeader.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>().AsStringValue()); SetFieldValue<string?>(Models.Metadata.Header.ForcePackingKey,
datHeader.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>().AsStringValue());
if (datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey) != 0x00) if (datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey) != 0x00)
SetFieldValue<DatFormat>(DatHeader.DatFormatKey, datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey)); SetFieldValue<DatFormat>(DatHeader.DatFormatKey,
datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.PrefixKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.PrefixKey)))
SetFieldValue<string?>(DatHeader.PrefixKey, datHeader.GetStringFieldValue(DatHeader.PrefixKey)); SetFieldValue<string?>(DatHeader.PrefixKey,
datHeader.GetStringFieldValue(DatHeader.PrefixKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.PostfixKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.PostfixKey)))
SetFieldValue<string?>(DatHeader.PostfixKey, datHeader.GetStringFieldValue(DatHeader.PostfixKey)); SetFieldValue<string?>(DatHeader.PostfixKey,
datHeader.GetStringFieldValue(DatHeader.PostfixKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.AddExtensionKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.AddExtensionKey)))
SetFieldValue<string?>(DatHeader.AddExtensionKey, datHeader.GetStringFieldValue(DatHeader.AddExtensionKey)); SetFieldValue<string?>(DatHeader.AddExtensionKey,
datHeader.GetStringFieldValue(DatHeader.AddExtensionKey));
if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.ReplaceExtensionKey))) if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.ReplaceExtensionKey)))
SetFieldValue<string?>(DatHeader.ReplaceExtensionKey, datHeader.GetStringFieldValue(DatHeader.ReplaceExtensionKey)); SetFieldValue<string?>(DatHeader.ReplaceExtensionKey,
datHeader.GetStringFieldValue(DatHeader.ReplaceExtensionKey));
SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, datHeader.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation); SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey,
SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey, datHeader.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); datHeader.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation);
SetFieldValue<bool?>(DatHeader.GameNameKey, datHeader.GetBoolFieldValue(DatHeader.GameNameKey)); SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey,
SetFieldValue<bool?>(DatHeader.QuotesKey, datHeader.GetBoolFieldValue(DatHeader.QuotesKey)); datHeader.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.Clone() as DepotInformation);
SetFieldValue<bool?>(DatHeader.RemoveExtensionKey, datHeader.GetBoolFieldValue(DatHeader.RemoveExtensionKey)); SetFieldValue<bool?>(DatHeader.GameNameKey,
SetFieldValue<bool?>(DatHeader.UseRomNameKey, datHeader.GetBoolFieldValue(DatHeader.UseRomNameKey)); datHeader.GetBoolFieldValue(DatHeader.GameNameKey));
SetFieldValue<bool?>(DatHeader.QuotesKey,
datHeader.GetBoolFieldValue(DatHeader.QuotesKey));
SetFieldValue<bool?>(DatHeader.RemoveExtensionKey,
datHeader.GetBoolFieldValue(DatHeader.RemoveExtensionKey));
SetFieldValue<bool?>(DatHeader.UseRomNameKey,
datHeader.GetBoolFieldValue(DatHeader.UseRomNameKey));
} }
#endregion #endregion
@@ -363,15 +420,18 @@ namespace SabreTools.DatFiles
// Get all used extensions // Get all used extensions
List<string> usedExtensions = []; List<string> usedExtensions = [];
// Get the current format type
DatFormat datFormat = GetFieldValue<DatFormat>(DatHeader.DatFormatKey);
// Get the extensions from the output type // Get the extensions from the output type
#region .csv #region .csv
// CSV // CSV
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.CSV) != 0) if ((datFormat & DatFormat.CSV) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.CSV)) if (datFormat.HasFlag(DatFormat.CSV))
#endif #endif
{ {
outfileNames.Add(DatFormat.CSV, CreateOutFileNamesHelper(outDir, ".csv", overwrite)); outfileNames.Add(DatFormat.CSV, CreateOutFileNamesHelper(outDir, ".csv", overwrite));
@@ -384,9 +444,9 @@ namespace SabreTools.DatFiles
// ClrMamePro // ClrMamePro
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.ClrMamePro) != 0) if ((datFormat & DatFormat.ClrMamePro) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.ClrMamePro)) if (datFormat.HasFlag(DatFormat.ClrMamePro))
#endif #endif
{ {
outfileNames.Add(DatFormat.ClrMamePro, CreateOutFileNamesHelper(outDir, ".dat", overwrite)); outfileNames.Add(DatFormat.ClrMamePro, CreateOutFileNamesHelper(outDir, ".dat", overwrite));
@@ -395,9 +455,9 @@ namespace SabreTools.DatFiles
// RomCenter // RomCenter
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RomCenter) != 0) if ((datFormat & DatFormat.RomCenter) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RomCenter)) if (datFormat.HasFlag(DatFormat.RomCenter))
#endif #endif
{ {
if (usedExtensions.Contains(".dat")) if (usedExtensions.Contains(".dat"))
@@ -414,9 +474,9 @@ namespace SabreTools.DatFiles
// DOSCenter // DOSCenter
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.DOSCenter) != 0) if ((datFormat & DatFormat.DOSCenter) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.DOSCenter)) if (datFormat.HasFlag(DatFormat.DOSCenter))
#endif #endif
{ {
if (usedExtensions.Contains(".dat")) if (usedExtensions.Contains(".dat"))
@@ -437,9 +497,9 @@ namespace SabreTools.DatFiles
// JSON // JSON
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.SabreJSON) != 0) if ((datFormat & DatFormat.SabreJSON) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.SabreJSON)) if (datFormat.HasFlag(DatFormat.SabreJSON))
#endif #endif
{ {
outfileNames.Add(DatFormat.SabreJSON, CreateOutFileNamesHelper(outDir, ".json", overwrite)); outfileNames.Add(DatFormat.SabreJSON, CreateOutFileNamesHelper(outDir, ".json", overwrite));
@@ -452,9 +512,9 @@ namespace SabreTools.DatFiles
// Redump MD5 // Redump MD5
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RedumpMD5) != 0) if ((datFormat & DatFormat.RedumpMD5) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpMD5)) if (datFormat.HasFlag(DatFormat.RedumpMD5))
#endif #endif
{ {
outfileNames.Add(DatFormat.RedumpMD5, CreateOutFileNamesHelper(outDir, ".md5", overwrite)); outfileNames.Add(DatFormat.RedumpMD5, CreateOutFileNamesHelper(outDir, ".md5", overwrite));
@@ -467,9 +527,9 @@ namespace SabreTools.DatFiles
// Redump SFV // Redump SFV
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RedumpSFV) != 0) if ((datFormat & DatFormat.RedumpSFV) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSFV)) if (datFormat.HasFlag(DatFormat.RedumpSFV))
#endif #endif
{ {
outfileNames.Add(DatFormat.RedumpSFV, CreateOutFileNamesHelper(outDir, ".sfv", overwrite)); outfileNames.Add(DatFormat.RedumpSFV, CreateOutFileNamesHelper(outDir, ".sfv", overwrite));
@@ -482,9 +542,9 @@ namespace SabreTools.DatFiles
// Redump SHA-1 // Redump SHA-1
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RedumpSHA1) != 0) if ((datFormat & DatFormat.RedumpSHA1) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA1)) if (datFormat.HasFlag(DatFormat.RedumpSHA1))
#endif #endif
{ {
outfileNames.Add(DatFormat.RedumpSHA1, CreateOutFileNamesHelper(outDir, ".sha1", overwrite)); outfileNames.Add(DatFormat.RedumpSHA1, CreateOutFileNamesHelper(outDir, ".sha1", overwrite));
@@ -497,9 +557,9 @@ namespace SabreTools.DatFiles
// Redump SHA-256 // Redump SHA-256
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RedumpSHA256) != 0) if ((datFormat & DatFormat.RedumpSHA256) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA256)) if (datFormat.HasFlag(DatFormat.RedumpSHA256))
#endif #endif
{ {
outfileNames.Add(DatFormat.RedumpSHA256, CreateOutFileNamesHelper(outDir, ".sha256", overwrite)); outfileNames.Add(DatFormat.RedumpSHA256, CreateOutFileNamesHelper(outDir, ".sha256", overwrite));
@@ -512,9 +572,9 @@ namespace SabreTools.DatFiles
// Redump SHA-384 // Redump SHA-384
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RedumpSHA384) != 0) if ((datFormat & DatFormat.RedumpSHA384) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA384)) if (datFormat.HasFlag(DatFormat.RedumpSHA384))
#endif #endif
{ {
outfileNames.Add(DatFormat.RedumpSHA384, CreateOutFileNamesHelper(outDir, ".sha384", overwrite)); outfileNames.Add(DatFormat.RedumpSHA384, CreateOutFileNamesHelper(outDir, ".sha384", overwrite));
@@ -527,9 +587,9 @@ namespace SabreTools.DatFiles
// Redump SHA-512 // Redump SHA-512
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RedumpSHA512) != 0) if ((datFormat & DatFormat.RedumpSHA512) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA512)) if (datFormat.HasFlag(DatFormat.RedumpSHA512))
#endif #endif
{ {
outfileNames.Add(DatFormat.RedumpSHA512, CreateOutFileNamesHelper(outDir, ".sha512", overwrite)); outfileNames.Add(DatFormat.RedumpSHA512, CreateOutFileNamesHelper(outDir, ".sha512", overwrite));
@@ -542,9 +602,9 @@ namespace SabreTools.DatFiles
// Redump SpamSum // Redump SpamSum
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.RedumpSpamSum) != 0) if ((datFormat & DatFormat.RedumpSpamSum) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSpamSum)) if (datFormat.HasFlag(DatFormat.RedumpSpamSum))
#endif #endif
{ {
outfileNames.Add(DatFormat.RedumpSpamSum, CreateOutFileNamesHelper(outDir, ".spamsum", overwrite)); outfileNames.Add(DatFormat.RedumpSpamSum, CreateOutFileNamesHelper(outDir, ".spamsum", overwrite));
@@ -557,9 +617,9 @@ namespace SabreTools.DatFiles
// SSV // SSV
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.SSV) != 0) if ((datFormat & DatFormat.SSV) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.SSV)) if (datFormat.HasFlag(DatFormat.SSV))
#endif #endif
{ {
outfileNames.Add(DatFormat.SSV, CreateOutFileNamesHelper(outDir, ".ssv", overwrite)); outfileNames.Add(DatFormat.SSV, CreateOutFileNamesHelper(outDir, ".ssv", overwrite));
@@ -572,9 +632,9 @@ namespace SabreTools.DatFiles
// TSV // TSV
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.TSV) != 0) if ((datFormat & DatFormat.TSV) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.TSV)) if (datFormat.HasFlag(DatFormat.TSV))
#endif #endif
{ {
outfileNames.Add(DatFormat.TSV, CreateOutFileNamesHelper(outDir, ".tsv", overwrite)); outfileNames.Add(DatFormat.TSV, CreateOutFileNamesHelper(outDir, ".tsv", overwrite));
@@ -587,9 +647,9 @@ namespace SabreTools.DatFiles
// AttractMode // AttractMode
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.AttractMode) != 0) if ((datFormat & DatFormat.AttractMode) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.AttractMode)) if (datFormat.HasFlag(DatFormat.AttractMode))
#endif #endif
{ {
outfileNames.Add(DatFormat.AttractMode, CreateOutFileNamesHelper(outDir, ".txt", overwrite)); outfileNames.Add(DatFormat.AttractMode, CreateOutFileNamesHelper(outDir, ".txt", overwrite));
@@ -598,9 +658,9 @@ namespace SabreTools.DatFiles
// MAME Listroms // MAME Listroms
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.Listrom) != 0) if ((datFormat & DatFormat.Listrom) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.Listrom)) if (datFormat.HasFlag(DatFormat.Listrom))
#endif #endif
{ {
if (usedExtensions.Contains(".txt")) if (usedExtensions.Contains(".txt"))
@@ -617,9 +677,9 @@ namespace SabreTools.DatFiles
// Missfile // Missfile
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.MissFile) != 0) if ((datFormat & DatFormat.MissFile) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.MissFile)) if (datFormat.HasFlag(DatFormat.MissFile))
#endif #endif
{ {
if (usedExtensions.Contains(".txt")) if (usedExtensions.Contains(".txt"))
@@ -636,9 +696,9 @@ namespace SabreTools.DatFiles
// Everdrive SMDB // Everdrive SMDB
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.EverdriveSMDB) != 0) if ((datFormat & DatFormat.EverdriveSMDB) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.EverdriveSMDB)) if (datFormat.HasFlag(DatFormat.EverdriveSMDB))
#endif #endif
{ {
if (usedExtensions.Contains(".txt")) if (usedExtensions.Contains(".txt"))
@@ -659,18 +719,18 @@ namespace SabreTools.DatFiles
// Logiqx XML // Logiqx XML
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.Logiqx) != 0) if ((datFormat & DatFormat.Logiqx) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.Logiqx)) if (datFormat.HasFlag(DatFormat.Logiqx))
#endif #endif
{ {
outfileNames.Add(DatFormat.Logiqx, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); outfileNames.Add(DatFormat.Logiqx, CreateOutFileNamesHelper(outDir, ".xml", overwrite));
usedExtensions.Add(".xml"); usedExtensions.Add(".xml");
} }
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.LogiqxDeprecated) != 0) if ((datFormat & DatFormat.LogiqxDeprecated) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.LogiqxDeprecated)) if (datFormat.HasFlag(DatFormat.LogiqxDeprecated))
#endif #endif
{ {
outfileNames.Add(DatFormat.LogiqxDeprecated, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); outfileNames.Add(DatFormat.LogiqxDeprecated, CreateOutFileNamesHelper(outDir, ".xml", overwrite));
@@ -679,9 +739,9 @@ namespace SabreTools.DatFiles
// SabreDAT // SabreDAT
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.SabreXML) != 0) if ((datFormat & DatFormat.SabreXML) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.SabreXML)) if (datFormat.HasFlag(DatFormat.SabreXML))
#endif #endif
{ {
if (usedExtensions.Contains(".xml")) if (usedExtensions.Contains(".xml"))
@@ -698,9 +758,9 @@ namespace SabreTools.DatFiles
// Software List // Software List
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.SoftwareList) != 0) if ((datFormat & DatFormat.SoftwareList) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.SoftwareList)) if (datFormat.HasFlag(DatFormat.SoftwareList))
#endif #endif
{ {
if (usedExtensions.Contains(".xml")) if (usedExtensions.Contains(".xml"))
@@ -717,9 +777,9 @@ namespace SabreTools.DatFiles
// MAME Listxml // MAME Listxml
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.Listxml) != 0) if ((datFormat & DatFormat.Listxml) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.Listxml)) if (datFormat.HasFlag(DatFormat.Listxml))
#endif #endif
{ {
if (usedExtensions.Contains(".xml")) if (usedExtensions.Contains(".xml"))
@@ -736,9 +796,9 @@ namespace SabreTools.DatFiles
// OfflineList // OfflineList
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.OfflineList) != 0) if ((datFormat & DatFormat.OfflineList) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.OfflineList)) if (datFormat.HasFlag(DatFormat.OfflineList))
#endif #endif
{ {
if (usedExtensions.Contains(".xml")) if (usedExtensions.Contains(".xml"))
@@ -755,9 +815,9 @@ namespace SabreTools.DatFiles
// openMSX // openMSX
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.OpenMSX) != 0) if ((datFormat & DatFormat.OpenMSX) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.OpenMSX)) if (datFormat.HasFlag(DatFormat.OpenMSX))
#endif #endif
{ {
if (usedExtensions.Contains(".xml")) if (usedExtensions.Contains(".xml"))
@@ -774,9 +834,9 @@ namespace SabreTools.DatFiles
// Archive.org // Archive.org
#if NETFRAMEWORK #if NETFRAMEWORK
if ((GetFieldValue<DatFormat>(DatHeader.DatFormatKey) & DatFormat.ArchiveDotOrg) != 0) if ((datFormat & DatFormat.ArchiveDotOrg) != 0)
#else #else
if (GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.ArchiveDotOrg)) if (datFormat.HasFlag(DatFormat.ArchiveDotOrg))
#endif #endif
{ {
if (usedExtensions.Contains(".xml")) if (usedExtensions.Contains(".xml"))

View File

@@ -909,31 +909,41 @@ namespace SabreTools.DatFiles
{ {
DatItem item = this[key]![0]; DatItem item = this[key]![0];
// Match on CloneOf first // Get machine information
if (!string.IsNullOrEmpty(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey))) Machine? machine = item.GetFieldValue<Machine>(DatItem.MachineKey);
{ string? machineName = machine?.GetStringFieldValue(Models.Metadata.Machine.NameKey)?.ToLowerInvariant();
if (!parents.ContainsKey(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant())) if (machine == null || machineName == null)
parents.Add(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant(), []); continue;
parents[item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant()].Add(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); // Get the string values
string? cloneOf = machine.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)?.ToLowerInvariant();
string? romOf = machine.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)?.ToLowerInvariant();
// Match on CloneOf first
if (!string.IsNullOrEmpty(cloneOf))
{
if (!parents.ContainsKey(cloneOf!))
parents.Add(cloneOf!, []);
parents[cloneOf!].Add(machineName);
} }
// Then by RomOf // Then by RomOf
else if (!string.IsNullOrEmpty(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey))) else if (!string.IsNullOrEmpty(romOf))
{ {
if (!parents.ContainsKey(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant())) if (!parents.ContainsKey(romOf!))
parents.Add(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant(), []); parents.Add(romOf!, []);
parents[item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant()].Add(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); parents[romOf!].Add(machineName);
} }
// Otherwise, treat it as a parent // Otherwise, treat it as a parent
else else
{ {
if (!parents.ContainsKey(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant())) if (!parents.ContainsKey(machineName))
parents.Add(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant(), []); parents.Add(machineName, []);
parents[item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()].Add(item.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); parents[machineName].Add(machineName);
} }
} }

View File

@@ -1294,31 +1294,41 @@ namespace SabreTools.DatFiles
if (machine.Item2 == null) if (machine.Item2 == null)
continue; continue;
// Match on CloneOf first // Get machine information
if (!string.IsNullOrEmpty(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey))) Machine? machineObj = machine.Item2.GetFieldValue<Machine>(DatItem.MachineKey);
{ string? machineName = machineObj?.GetStringFieldValue(Models.Metadata.Machine.NameKey)?.ToLowerInvariant();
if (!parents.ContainsKey(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant())) if (machineObj == null || machineName == null)
parents.Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant(), []); continue;
parents[machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant()].Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); // Get the string values
string? cloneOf = machineObj.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)?.ToLowerInvariant();
string? romOf = machineObj.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)?.ToLowerInvariant();
// Match on CloneOf first
if (!string.IsNullOrEmpty(cloneOf))
{
if (!parents.ContainsKey(cloneOf!))
parents.Add(cloneOf!, []);
parents[cloneOf!].Add(machineName);
} }
// Then by RomOf // Then by RomOf
else if (!string.IsNullOrEmpty(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.RomOfKey))) else if (!string.IsNullOrEmpty(romOf))
{ {
if (!parents.ContainsKey(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant())) if (!parents.ContainsKey(romOf!))
parents.Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant(), []); parents.Add(romOf!, []);
parents[machine.Item2.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant()].Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); parents[romOf!].Add(machineName);
} }
// Otherwise, treat it as a parent // Otherwise, treat it as a parent
else else
{ {
if (!parents.ContainsKey(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant())) if (!parents.ContainsKey(machineName))
parents.Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant(), []); parents.Add(machineName, []);
parents[machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()].Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); parents[machineName].Add(machineName);
} }
} }

View File

@@ -65,8 +65,9 @@ namespace SabreTools.DatTools
outDir = outDir.Ensure(create: true); outDir = outDir.Ensure(create: true);
// Now we want to get forcepack flag if it's not overridden // Now we want to get forcepack flag if it's not overridden
if (outputFormat == OutputFormat.Folder && datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>() != PackingFlag.None) PackingFlag forcePacking = datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>();
outputFormat = GetOutputFormat(datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>()); if (outputFormat == OutputFormat.Folder && forcePacking != PackingFlag.None)
outputFormat = GetOutputFormat(forcePacking);
#endregion #endregion
@@ -219,8 +220,9 @@ namespace SabreTools.DatTools
} }
// Now we want to get forcepack flag if it's not overridden // Now we want to get forcepack flag if it's not overridden
if (outputFormat == OutputFormat.Folder && datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>() != PackingFlag.None) PackingFlag forcePacking = datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>();
outputFormat = GetOutputFormat(datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue<PackingFlag>()); if (outputFormat == OutputFormat.Folder && forcePacking != PackingFlag.None)
outputFormat = GetOutputFormat(forcePacking);
#endregion #endregion

View File

@@ -2195,14 +2195,13 @@ Some special strings that can be used:
logger.Error($"{ot} is not a recognized DAT format"); logger.Error($"{ot} is not a recognized DAT format");
return null; return null;
} }
else if (dftemp == DatFormat.Logiqx && deprecated)
{ // Handle deprecated Logiqx
datHeader.SetFieldValue<DatFormat>(DatHeader.DatFormatKey, datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey) | DatFormat.LogiqxDeprecated); DatFormat currentFormat = datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey);
} if (dftemp == DatFormat.Logiqx && deprecated)
datHeader.SetFieldValue(DatHeader.DatFormatKey, currentFormat | DatFormat.LogiqxDeprecated);
else else
{ datHeader.SetFieldValue(DatHeader.DatFormatKey, currentFormat | dftemp);
datHeader.SetFieldValue<DatFormat>(DatHeader.DatFormatKey, datHeader.GetFieldValue<DatFormat>(DatHeader.DatFormatKey) | dftemp);
}
} }
return datHeader; return datHeader;

View File

@@ -486,7 +486,8 @@ Reset the internal state: reset();";
batchState.DatFile.Header.SetFieldValue<DatFormat>(DatHeader.DatFormatKey, 0x00); batchState.DatFile.Header.SetFieldValue<DatFormat>(DatHeader.DatFormatKey, 0x00);
foreach (string format in Arguments) foreach (string format in Arguments)
{ {
batchState.DatFile.Header.SetFieldValue<DatFormat>(DatHeader.DatFormatKey, batchState.DatFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey) | GetDatFormat(format)); DatFormat currentFormat = batchState.DatFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey);
batchState.DatFile.Header.SetFieldValue(DatHeader.DatFormatKey, currentFormat | GetDatFormat(format));
} }
} }
} }

View File

@@ -6,7 +6,6 @@ using SabreTools.FileTypes;
using SabreTools.Help; using SabreTools.Help;
using SabreTools.IO; using SabreTools.IO;
using SabreTools.Logging; using SabreTools.Logging;
using SabreTools.Models.InstallShieldCabinet;
namespace SabreTools.Features namespace SabreTools.Features
{ {
@@ -73,8 +72,12 @@ namespace SabreTools.Features
bool updateDat = GetBoolean(features, UpdateDatValue); bool updateDat = GetBoolean(features, UpdateDatValue);
var outputFormat = GetOutputFormat(features); var outputFormat = GetOutputFormat(features);
// Get the depots
var inputDepot = Header!.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey);
var outputDepot = Header!.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey);
// If we have the romba flag // If we have the romba flag
if (Header!.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.IsActive == true) if (outputDepot?.IsActive == true)
{ {
// Update TorrentGzip output // Update TorrentGzip output
if (outputFormat == OutputFormat.TorrentGzip) if (outputFormat == OutputFormat.TorrentGzip)
@@ -98,8 +101,8 @@ namespace SabreTools.Features
Parser.ParseInto(datdata, datfile, int.MaxValue, keep: true); Parser.ParseInto(datdata, datfile, int.MaxValue, keep: true);
// Set depot information // Set depot information
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, Header.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation); datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation);
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey, Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey, outputDepot?.Clone() as DepotInformation);
// If we have overridden the header skipper, set it now // If we have overridden the header skipper, set it now
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey)))
@@ -107,7 +110,7 @@ namespace SabreTools.Features
// If we have the depot flag, respect it // If we have the depot flag, respect it
bool success; bool success;
if (Header.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.IsActive ?? false) if (inputDepot?.IsActive ?? false)
success = Rebuilder.RebuildDepot(datdata, Inputs, Path.Combine(OutputDir!, datdata.Header.GetStringFieldValue(DatHeader.FileNameKey)!), date, delete, inverse, outputFormat); success = Rebuilder.RebuildDepot(datdata, Inputs, Path.Combine(OutputDir!, datdata.Header.GetStringFieldValue(DatHeader.FileNameKey)!), date, delete, inverse, outputFormat);
else else
success = Rebuilder.RebuildGeneric(datdata, Inputs, Path.Combine(OutputDir!, datdata.Header.GetStringFieldValue(DatHeader.FileNameKey)!), quickScan, date, delete, inverse, outputFormat, asFiles); success = Rebuilder.RebuildGeneric(datdata, Inputs, Path.Combine(OutputDir!, datdata.Header.GetStringFieldValue(DatHeader.FileNameKey)!), quickScan, date, delete, inverse, outputFormat, asFiles);
@@ -138,18 +141,19 @@ namespace SabreTools.Features
} }
// Set depot information // Set depot information
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, Header.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation); datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation);
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey, Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey, outputDepot?.Clone() as DepotInformation);
// If we have overridden the header skipper, set it now // If we have overridden the header skipper, set it now
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) string? headerSkpper = Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey);
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); if (!string.IsNullOrEmpty(headerSkpper))
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, headerSkpper);
watch.Stop(); watch.Stop();
// If we have the depot flag, respect it // If we have the depot flag, respect it
bool success; bool success;
if (Header.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.IsActive ?? false) if (inputDepot?.IsActive ?? false)
success = Rebuilder.RebuildDepot(datdata, Inputs, OutputDir!, date, delete, inverse, outputFormat); success = Rebuilder.RebuildDepot(datdata, Inputs, OutputDir!, date, delete, inverse, outputFormat);
else else
success = Rebuilder.RebuildGeneric(datdata, Inputs, OutputDir!, quickScan, date, delete, inverse, outputFormat, asFiles); success = Rebuilder.RebuildGeneric(datdata, Inputs, OutputDir!, quickScan, date, delete, inverse, outputFormat, asFiles);
@@ -157,9 +161,13 @@ namespace SabreTools.Features
// If we have a success and we're updating the DAT, write it out // If we have a success and we're updating the DAT, write it out
if (success && updateDat) if (success && updateDat)
{ {
datdata.Header.SetFieldValue<string?>(DatHeader.FileNameKey, $"fixDAT_{Header.GetStringFieldValue(DatHeader.FileNameKey)}"); datdata.Header.SetFieldValue<string?>(DatHeader.FileNameKey,
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.NameKey, $"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.NameKey)}"); $"fixDAT_{Header.GetStringFieldValue(DatHeader.FileNameKey)}");
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey, $"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)}"); datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.NameKey,
$"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.NameKey)}");
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.DescriptionKey,
$"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)}");
datdata.Items.ClearMarked(); datdata.Items.ClearMarked();
datdata.ItemsDB.ClearMarked(); datdata.ItemsDB.ClearMarked();
Writer.Write(datdata, OutputDir); Writer.Write(datdata, OutputDir);

View File

@@ -167,10 +167,14 @@ namespace SabreTools.Features
// Create a new base DatFile // Create a new base DatFile
DatFile datFile = DatFile.Create(Header); DatFile datFile = DatFile.Create(Header);
logger.User($"Processing '{Path.GetFileName(inputPath.CurrentPath)}'"); logger.User($"Processing '{Path.GetFileName(inputPath.CurrentPath)}'");
Parser.ParseInto(datFile, inputPath, keep: true,
keepext: datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.TSV) // Check the current format
|| datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.CSV) DatFormat currentFormat = datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey);
|| datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey).HasFlag(DatFormat.SSV)); bool isSeparatedFile = currentFormat.HasFlag(DatFormat.CSV)
|| currentFormat.HasFlag(DatFormat.SSV)
|| currentFormat.HasFlag(DatFormat.TSV);
Parser.ParseInto(datFile, inputPath, keep: true, keepext: isSeparatedFile);
// Perform additional processing steps // Perform additional processing steps
Extras!.ApplyExtras(datFile); Extras!.ApplyExtras(datFile);

View File

@@ -73,14 +73,16 @@ namespace SabreTools.Features
Remover!.ApplyRemovals(datdata); Remover!.ApplyRemovals(datdata);
// Set depot information // Set depot information
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, Header!.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation); var inputDepot = Header!.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey);
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation);
// If we have overridden the header skipper, set it now // If we have overridden the header skipper, set it now
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) string? headerSkipper = Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey);
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); if (!string.IsNullOrEmpty(headerSkipper))
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, headerSkipper);
// If we have the depot flag, respect it // If we have the depot flag, respect it
if (Header.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.IsActive ?? false) if (inputDepot?.IsActive ?? false)
{ {
Verification.VerifyDepot(datdata, Inputs); Verification.VerifyDepot(datdata, Inputs);
} }
@@ -123,16 +125,18 @@ namespace SabreTools.Features
Remover!.ApplyRemovals(datdata); Remover!.ApplyRemovals(datdata);
// Set depot information // Set depot information
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, Header!.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.Clone() as DepotInformation); var inputDepot = Header!.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey);
datdata.Header.SetFieldValue<DepotInformation?>(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation);
// If we have overridden the header skipper, set it now // If we have overridden the header skipper, set it now
if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) string? headerSkipper = Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey);
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); if (!string.IsNullOrEmpty(headerSkipper))
datdata.Header.SetFieldValue<string?>(Models.Metadata.Header.HeaderKey, headerSkipper);
watch.Stop(); watch.Stop();
// If we have the depot flag, respect it // If we have the depot flag, respect it
if (Header.GetFieldValue<DepotInformation?>(DatHeader.InputDepotKey)?.IsActive ?? false) if (inputDepot?.IsActive ?? false)
{ {
Verification.VerifyDepot(datdata, Inputs); Verification.VerifyDepot(datdata, Inputs);
} }