diff --git a/RombaSharp/Features/BaseFeature.cs b/RombaSharp/Features/BaseFeature.cs index e5260492..425a7107 100644 --- a/RombaSharp/Features/BaseFeature.cs +++ b/RombaSharp/Features/BaseFeature.cs @@ -784,13 +784,14 @@ CREATE TABLE IF NOT EXISTS dat ( /// Database connection to use internal void AddDatToDatabase(Rom dat, SqliteConnection dbc) { - // Get the dat full path + // Get the machine var machine = dat.GetFieldValue(DatItem.MachineKey); - string fullpath = Path.Combine(_dats!, - (machine!.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey) == "dats" - ? string.Empty - : machine!.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey))! - , dat.GetName()!); + string? machineName = machine?.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey); + if (machine == null || machineName == null) + return; + + // Get the dat full path + string fullpath = Path.Combine(_dats!, machineName == "dats" ? string.Empty : machineName, dat.GetName()!); // Parse the Dat if possible logger.User($"Adding from '{dat.GetName()}'"); diff --git a/SabreTools.DatFiles/DatFile.Removal.cs b/SabreTools.DatFiles/DatFile.Removal.cs index 6cecc4f3..cc4a5be9 100644 --- a/SabreTools.DatFiles/DatFile.Removal.cs +++ b/SabreTools.DatFiles/DatFile.Removal.cs @@ -135,8 +135,9 @@ namespace SabreTools.DatFiles #region Common // Handle Machine fields - if (machineFieldNames.Any() && datItem.GetFieldValue(DatItem.MachineKey) != null) - RemoveFields(datItem.GetFieldValue(DatItem.MachineKey), machineFieldNames); + var machine = datItem.GetFieldValue(DatItem.MachineKey); + if (machineFieldNames.Any() && machine != null) + RemoveFields(machine, machineFieldNames); // If there are no field names, return if (itemFieldNames == null || !itemFieldNames.Any()) @@ -195,10 +196,8 @@ namespace SabreTools.DatFiles /// Adjuster to remove fields from private static void RemoveFields(Adjuster adjuster, Dictionary> itemFieldNames) { - if (!adjuster.ConditionsSpecified) - return; - - foreach (Condition subCondition in adjuster.GetFieldValue(Models.Metadata.Adjuster.ConditionKey)!) + var conditions = adjuster.GetFieldValue(Models.Metadata.Adjuster.ConditionKey) ?? []; + foreach (Condition subCondition in conditions) { RemoveFields(subCondition, [], itemFieldNames); } @@ -210,28 +209,22 @@ namespace SabreTools.DatFiles /// Configuration to remove fields from private static void RemoveFields(Configuration configuration, Dictionary> itemFieldNames) { - if (configuration.ConditionsSpecified) + var conditions = configuration.GetFieldValue(Models.Metadata.Configuration.ConditionKey) ?? []; + foreach (Condition subCondition in conditions) { - foreach (Condition subCondition in configuration.GetFieldValue(Models.Metadata.Configuration.ConditionKey)!) - { - RemoveFields(subCondition, [], itemFieldNames); - } + RemoveFields(subCondition, [], itemFieldNames); } - if (configuration.LocationsSpecified) + var locations = configuration.GetFieldValue(Models.Metadata.Configuration.ConfLocationKey) ?? []; + foreach (ConfLocation subLocation in locations) { - foreach (ConfLocation subLocation in configuration.GetFieldValue(Models.Metadata.Configuration.ConfLocationKey)!) - { - RemoveFields(subLocation, [], itemFieldNames); - } + RemoveFields(subLocation, [], itemFieldNames); } - if (configuration.SettingsSpecified) + var settings = configuration.GetFieldValue(Models.Metadata.Configuration.ConfSettingKey) ?? []; + foreach (ConfSetting subSetting in settings) { - foreach (ConfSetting subSetting in configuration.GetFieldValue(Models.Metadata.Configuration.ConfSettingKey)!) - { - RemoveFields(subSetting as DatItem, [], itemFieldNames); - } + RemoveFields(subSetting as DatItem, [], itemFieldNames); } } @@ -241,12 +234,10 @@ namespace SabreTools.DatFiles /// ConfSetting to remove fields from private static void RemoveFields(ConfSetting confsetting, Dictionary> itemFieldNames) { - if (confsetting.ConditionsSpecified) + var conditions = confsetting.GetFieldValue(Models.Metadata.ConfSetting.ConditionKey) ?? []; + foreach (Condition subCondition in conditions) { - foreach (Condition subCondition in confsetting.GetFieldValue(Models.Metadata.ConfSetting.ConditionKey)!) - { - RemoveFields(subCondition, [], itemFieldNames); - } + RemoveFields(subCondition, [], itemFieldNames); } } @@ -256,20 +247,16 @@ namespace SabreTools.DatFiles /// Device to remove fields from private static void RemoveFields(Device device, Dictionary> itemFieldNames) { - if (device.ExtensionsSpecified) + var extensions = device.GetFieldValue(Models.Metadata.Device.ExtensionKey) ?? []; + foreach (Extension subExtension in extensions) { - foreach (Extension subExtension in device.GetFieldValue(Models.Metadata.Device.ExtensionKey)!) - { - RemoveFields(subExtension, [], itemFieldNames); - } + RemoveFields(subExtension, [], itemFieldNames); } - if (device.InstancesSpecified) + var instances = device.GetFieldValue(Models.Metadata.Device.InstanceKey) ?? []; + foreach (Instance subInstance in instances) { - foreach (Instance subInstance in device.GetFieldValue(Models.Metadata.Device.InstanceKey)!) - { - RemoveFields(subInstance, [], itemFieldNames); - } + RemoveFields(subInstance, [], itemFieldNames); } } @@ -279,32 +266,27 @@ namespace SabreTools.DatFiles /// DipSwitch to remove fields from private static void RemoveFields(DipSwitch dipSwitch, Dictionary> itemFieldNames) { - if (dipSwitch.ConditionsSpecified) + var conditions = dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.ConditionKey) ?? []; + foreach (Condition subCondition in conditions) { - foreach (Condition subCondition in dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.ConditionKey)!) - { - RemoveFields(subCondition, [], itemFieldNames); - } + RemoveFields(subCondition, [], itemFieldNames); } - if (dipSwitch.LocationsSpecified) + var locations = dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipLocationKey) ?? []; + foreach (DipLocation subLocation in locations) { - foreach (DipLocation subLocation in dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipLocationKey)!) - { - RemoveFields(subLocation, [], itemFieldNames); - } + RemoveFields(subLocation, [], itemFieldNames); } - if (dipSwitch.ValuesSpecified) + var dipValues = dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey) ?? []; + foreach (DipValue subValue in dipValues) { - foreach (DipValue subValue in dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey)!) - { - RemoveFields(subValue as DatItem, [], itemFieldNames); - } + RemoveFields(subValue as DatItem, [], itemFieldNames); } - if (dipSwitch.PartSpecified) - RemoveFields(dipSwitch.GetFieldValue(DipSwitch.PartKey)! as DatItem, [], itemFieldNames); + var part = dipSwitch.GetFieldValue(DipSwitch.PartKey); + if (part != null) + RemoveFields(part as DatItem, [], itemFieldNames); } /// @@ -313,12 +295,10 @@ namespace SabreTools.DatFiles /// DipValue to remove fields from private static void RemoveFields(DipValue dipValue, Dictionary> itemFieldNames) { - if (dipValue.ConditionsSpecified) + var conditions = dipValue.GetFieldValue(Models.Metadata.DipValue.ConditionKey) ?? []; + foreach (Condition subCondition in conditions) { - foreach (Condition subCondition in dipValue.GetFieldValue(Models.Metadata.DipValue.ConditionKey)!) - { - RemoveFields(subCondition, [], itemFieldNames); - } + RemoveFields(subCondition, [], itemFieldNames); } } @@ -328,11 +308,13 @@ namespace SabreTools.DatFiles /// Disk to remove fields from private static void RemoveFields(Disk disk, Dictionary> itemFieldNames) { - if (disk.DiskAreaSpecified) - RemoveFields(disk.GetFieldValue(Disk.DiskAreaKey)! as DatItem, [], itemFieldNames); + var diskArea = disk.GetFieldValue(Disk.DiskAreaKey); + if (diskArea != null) + RemoveFields(diskArea as DatItem, [], itemFieldNames); - if (disk.PartSpecified) - RemoveFields(disk.GetFieldValue(Disk.PartKey)! as DatItem, [], itemFieldNames); + var part = disk.GetFieldValue(Disk.PartKey); + if (part != null) + RemoveFields(part as DatItem, [], itemFieldNames); } /// @@ -341,12 +323,10 @@ namespace SabreTools.DatFiles /// Input to remove fields from private static void RemoveFields(Input input, Dictionary> itemFieldNames) { - if (input.ControlsSpecified) + var controls = input.GetFieldValue(Models.Metadata.Input.ControlKey) ?? []; + foreach (Control subControl in controls) { - foreach (Control subControl in input.GetFieldValue(Models.Metadata.Input.ControlKey)!) - { - RemoveFields(subControl, [], itemFieldNames); - } + RemoveFields(subControl, [], itemFieldNames); } } @@ -356,12 +336,10 @@ namespace SabreTools.DatFiles /// Part to remove fields from private static void RemoveFields(Part part, Dictionary> itemFieldNames) { - if (part.FeaturesSpecified) + var features = part.GetFieldValue(Models.Metadata.Part.FeatureKey) ?? []; + foreach (PartFeature subPartFeature in features) { - foreach (PartFeature subPartFeature in part.GetFieldValue(Models.Metadata.Part.FeatureKey)!) - { - RemoveFields(subPartFeature, [], itemFieldNames); - } + RemoveFields(subPartFeature, [], itemFieldNames); } } @@ -371,12 +349,10 @@ namespace SabreTools.DatFiles /// Port to remove fields from private static void RemoveFields(Port port, Dictionary> itemFieldNames) { - if (port.AnalogsSpecified) + var analogs = port.GetFieldValue(Models.Metadata.Port.AnalogKey) ?? []; + foreach (Analog subAnalog in analogs) { - foreach (Analog subAnalog in port.GetFieldValue(Models.Metadata.Port.AnalogKey)!) - { - RemoveFields(subAnalog, [], itemFieldNames); - } + RemoveFields(subAnalog, [], itemFieldNames); } } @@ -386,11 +362,13 @@ namespace SabreTools.DatFiles /// Rom to remove fields from private static void RemoveFields(Rom rom, Dictionary> itemFieldNames) { - if (rom.DataAreaSpecified) - RemoveFields(rom.GetFieldValue(Rom.DataAreaKey)!, [], itemFieldNames); + var dataArea = rom.GetFieldValue(Rom.DataAreaKey); + if (dataArea != null) + RemoveFields(dataArea as DatItem, [], itemFieldNames); - if (rom.PartSpecified) - RemoveFields(rom.GetFieldValue(Rom.PartKey)! as DatItem, [], itemFieldNames); + var part = rom.GetFieldValue(Rom.PartKey); + if (part != null) + RemoveFields(part as DatItem, [], itemFieldNames); } /// @@ -399,12 +377,10 @@ namespace SabreTools.DatFiles /// Slot to remove fields from private static void RemoveFields(Slot slot, Dictionary> itemFieldNames) { - if (slot.SlotOptionsSpecified) + var slotOptions = slot.GetFieldValue(Models.Metadata.Slot.SlotOptionKey) ?? []; + foreach (SlotOption subSlotOption in slotOptions) { - foreach (SlotOption subSlotOption in slot.GetFieldValue(Models.Metadata.Slot.SlotOptionKey)!) - { - RemoveFields(subSlotOption, [], itemFieldNames); - } + RemoveFields(subSlotOption, [], itemFieldNames); } } diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs index e7db10f1..8e172713 100644 --- a/SabreTools.DatFiles/DatFile.cs +++ b/SabreTools.DatFiles/DatFile.cs @@ -119,7 +119,8 @@ namespace SabreTools.DatFiles /// DatHeader to get the values from public static DatFile Create(DatHeader datHeader) { - DatFile datFile = Create(datHeader.GetFieldValue(DatHeader.DatFormatKey)); + DatFormat format = datHeader.GetFieldValue(DatHeader.DatFormatKey); + DatFile datFile = Create(format); datFile.Header = (DatHeader)datHeader.Clone(); return datFile; } @@ -131,24 +132,29 @@ namespace SabreTools.DatFiles /// True if the date should be omitted from name and description, false otherwise 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 (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(Models.Metadata.Header.NameKey, Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); + Header.SetFieldValue(Models.Metadata.Header.NameKey, description); } // 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(Models.Metadata.Header.DescriptionKey, Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + (bare ? string.Empty : $" ({Header.GetStringFieldValue(Models.Metadata.Header.DateKey)})")); + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, name + (bare ? string.Empty : $" ({date})")); } // 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); Header.SetFieldValue(Models.Metadata.Header.NameKey, splitpath.Last()); - Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + (bare ? string.Empty : $" ({Header.GetStringFieldValue(Models.Metadata.Header.DateKey)})")); + Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, splitpath.Last() + (bare ? string.Empty : $" ({date})")); } } @@ -245,14 +251,17 @@ namespace SabreTools.DatFiles { // Get machine for the item var machine = item.GetFieldValue(DatItem.MachineKey); + if (machine == null) + return string.Empty; // Initialize strings + string? type = item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey); string fix, - game = item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, - manufacturer = machine!.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty, - publisher = machine!.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty, - category = machine!.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, - name = item.GetName() ?? item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue().AsStringValue() ?? string.Empty, + game = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, + manufacturer = machine.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty, + publisher = machine.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty, + category = machine.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, + name = item.GetName() ?? type.AsEnumValue().AsStringValue() ?? string.Empty, crc = string.Empty, md5 = string.Empty, sha1 = string.Empty, @@ -262,13 +271,22 @@ namespace SabreTools.DatFiles size = string.Empty, spamsum = string.Empty; + // Check for quotes + bool? quotes = Header.GetBoolFieldValue(DatHeader.QuotesKey); + // If we have a 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 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 if (item is Disk disk) @@ -325,14 +343,17 @@ namespace SabreTools.DatFiles { // Get machine for the item var machine = ItemsDB.GetMachineForItem(item.Item1); + if (machine.Item2 == null) + return string.Empty; // Initialize strings + string? type = item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey); string fix, - game = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, - manufacturer = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty, - publisher = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty, - category = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, - name = item.Item2.GetName() ?? item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue().AsStringValue() ?? string.Empty, + game = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty, + manufacturer = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey) ?? string.Empty, + publisher = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.PublisherKey) ?? string.Empty, + category = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, + name = item.Item2.GetName() ?? type.AsEnumValue().AsStringValue() ?? string.Empty, crc = string.Empty, md5 = string.Empty, sha1 = string.Empty, @@ -342,13 +363,22 @@ namespace SabreTools.DatFiles size = string.Empty, spamsum = string.Empty; + // Check for quotes + bool? quotes = Header.GetBoolFieldValue(DatHeader.QuotesKey); + // If we have a 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 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 if (item.Item2 is Disk disk) @@ -411,24 +441,30 @@ namespace SabreTools.DatFiles if (forceRomName) Header.SetFieldValue(DatHeader.UseRomNameKey, true); + // Get the machine + var machine = item.GetFieldValue(DatItem.MachineKey); + if (machine == null) + return; + // Get the name to update string? name = (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true ? item.GetName() - : item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)) ?? string.Empty; + : machine.GetStringFieldValue(Models.Metadata.Machine.NameKey)) ?? string.Empty; // Create the proper Prefix and Postfix string pre = CreatePrefixPostfix(item, true); string post = CreatePrefixPostfix(item, false); // If we're in Depot mode, take care of that instead - if (Header.GetFieldValue(DatHeader.OutputDepotKey)?.IsActive == true) + var outputDepot = Header.GetFieldValue(DatHeader.OutputDepotKey); + if (outputDepot?.IsActive == true) { if (item is Disk disk) { // We can only write out if there's a SHA-1 if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))) { - name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), Header.GetFieldValue(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), outputDepot.Depth)?.Replace('\\', '/'); item.SetName($"{pre}{name}{post}"); } } @@ -437,7 +473,7 @@ namespace SabreTools.DatFiles // We can only write out if there's a SHA-1 if (!string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key))) { - name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), Header.GetFieldValue(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), outputDepot.Depth)?.Replace('\\', '/'); item.SetName($"{pre}{name}{post}"); } } @@ -446,7 +482,7 @@ namespace SabreTools.DatFiles // We can only write out if there's a SHA-1 if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))) { - name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), Header.GetFieldValue(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), outputDepot.Depth)?.Replace('\\', '/'); item.SetName($"{pre}{name}{post}"); } } @@ -454,31 +490,34 @@ namespace SabreTools.DatFiles 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(DatHeader.ReplaceExtensionKey, string.Empty); string? dir = Path.GetDirectoryName(name); if (dir != null) { 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))) - name += Header.GetStringFieldValue(DatHeader.AddExtensionKey); + string? addExtension = Header.GetStringFieldValue(DatHeader.AddExtensionKey); + if (!string.IsNullOrEmpty(addExtension)) + name += addExtension; if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && Header.GetBoolFieldValue(DatHeader.GameNameKey) == true) - name = Path.Combine(item.GetFieldValue(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 name = $"{pre}{name}{post}"; if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true) item.SetName(name); - else if (item.GetFieldValue(DatItem.MachineKey) != null) - item.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, name); + else + machine.SetFieldValue(Models.Metadata.Machine.NameKey, name); // Restore all relevant values if (forceRemoveQuotes) @@ -517,14 +556,15 @@ namespace SabreTools.DatFiles string post = CreatePrefixPostfixDB(item, false); // If we're in Depot mode, take care of that instead - if (Header.GetFieldValue(DatHeader.OutputDepotKey)?.IsActive == true) + var outputDepot = Header.GetFieldValue(DatHeader.OutputDepotKey); + if (outputDepot?.IsActive == true) { if (item.Item2 is Disk disk) { // We can only write out if there's a SHA-1 if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key))) { - name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), Header.GetFieldValue(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), outputDepot.Depth)?.Replace('\\', '/'); item.Item2.SetName($"{pre}{name}{post}"); } } @@ -533,7 +573,7 @@ namespace SabreTools.DatFiles // We can only write out if there's a SHA-1 if (!string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key))) { - name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), Header.GetFieldValue(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key), outputDepot.Depth)?.Replace('\\', '/'); item.Item2.SetName($"{pre}{name}{post}"); } } @@ -542,7 +582,7 @@ namespace SabreTools.DatFiles // We can only write out if there's a SHA-1 if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key))) { - name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), Header.GetFieldValue(DatHeader.OutputDepotKey)!.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), outputDepot.Depth)?.Replace('\\', '/'); item.Item2.SetName($"{pre}{name}{post}"); } } @@ -550,21 +590,24 @@ namespace SabreTools.DatFiles 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(DatHeader.ReplaceExtensionKey, string.Empty); string? dir = Path.GetDirectoryName(name); if (dir != null) { 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))) - name += Header.GetStringFieldValue(DatHeader.AddExtensionKey); + string? addExtension = Header.GetStringFieldValue(DatHeader.AddExtensionKey); + if (!string.IsNullOrEmpty(addExtension)) + name += addExtension; if (Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && Header.GetBoolFieldValue(DatHeader.GameNameKey) == true) 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) return item; + // Get machine for the item + var machine = item.GetFieldValue(DatItem.MachineKey); + if (machine == null) + return item; + // 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(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.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); - rom.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null); - rom.SetFieldValue(Models.Metadata.Rom.MD5Key, rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null); + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, + rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, + rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, + rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null); } return rom; @@ -627,21 +683,32 @@ namespace SabreTools.DatFiles // Get machine for the item 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 (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.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); - rom.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null); - rom.SetFieldValue(Models.Metadata.Rom.MD5Key, rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null); - rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null); + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, + rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, + rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, + rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, + rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null); } return (item.Item1, rom); @@ -676,7 +743,8 @@ namespace SabreTools.DatFiles foreach (DatItem datItem in datItems) { - if (GetSupportedTypes().Contains(datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue())) + ItemType itemType = datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue(); + if (GetSupportedTypes().Contains(itemType)) return true; } @@ -697,7 +765,8 @@ namespace SabreTools.DatFiles foreach ((long, DatItem) datItem in datItems) { - if (GetSupportedTypes().Contains(datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue())) + ItemType itemType = datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue(); + if (GetSupportedTypes().Contains(itemType)) return true; } @@ -749,10 +818,11 @@ namespace SabreTools.DatFiles } // If we have an item type not in the list of supported values + string datFormat = Header?.GetFieldValue(DatHeader.DatFormatKey).ToString() ?? "Unknown Format"; if (!GetSupportedTypes().Contains(datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue())) { string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); - logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {Header?.GetFieldValue(DatHeader.DatFormatKey)}"); + logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {datFormat}"); return true; } @@ -762,9 +832,9 @@ namespace SabreTools.DatFiles { string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); #if NET20 || NET35 - logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue(DatHeader.DatFormatKey)}: {string.Join(", ", [.. missingFields])}"); + logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", [.. missingFields])}"); #else - logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue(DatHeader.DatFormatKey)}: {string.Join(", ", missingFields)}"); + logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", missingFields)}"); #endif return true; } @@ -817,10 +887,11 @@ namespace SabreTools.DatFiles } // If we have an item type not in the list of supported values + string datFormat = Header?.GetFieldValue(DatHeader.DatFormatKey).ToString() ?? "Unknown Format"; if (!GetSupportedTypes().Contains(datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue())) { string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); - logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {Header?.GetFieldValue(DatHeader.DatFormatKey)}"); + logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {datFormat}"); return true; } @@ -830,9 +901,9 @@ namespace SabreTools.DatFiles { string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); #if NET20 || NET35 - logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue(DatHeader.DatFormatKey)}: {string.Join(", ", [.. missingFields])}"); + logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", [.. missingFields])}"); #else - logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {Header?.GetFieldValue(DatHeader.DatFormatKey)}: {string.Join(", ", missingFields)}"); + logger?.Verbose($"Item '{itemString}' was skipped because it was missing required fields for {datFormat}: {string.Join(", ", missingFields)}"); #endif return true; } diff --git a/SabreTools.DatFiles/DatHeader.cs b/SabreTools.DatFiles/DatHeader.cs index 71548d7e..a832cef6 100644 --- a/SabreTools.DatFiles/DatHeader.cs +++ b/SabreTools.DatFiles/DatHeader.cs @@ -177,24 +177,42 @@ namespace SabreTools.DatFiles public DatHeader CloneStandard() { var header = new DatHeader(); - header.SetFieldValue(Models.Metadata.Header.AuthorKey, GetStringFieldValue(Models.Metadata.Header.AuthorKey)); - header.SetFieldValue(Models.Metadata.Header.CategoryKey, GetStringFieldValue(Models.Metadata.Header.CategoryKey)); - header.SetFieldValue(Models.Metadata.Header.CommentKey, GetStringFieldValue(Models.Metadata.Header.CommentKey)); - header.SetFieldValue(Models.Metadata.Header.DateKey, GetStringFieldValue(Models.Metadata.Header.DateKey)); - header.SetFieldValue(DatHeader.DatFormatKey, GetFieldValue(DatHeader.DatFormatKey)); - header.SetFieldValue(Models.Metadata.Header.DescriptionKey, GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); - header.SetFieldValue(Models.Metadata.Header.EmailKey, GetStringFieldValue(Models.Metadata.Header.EmailKey)); - header.SetFieldValue(DatHeader.FileNameKey, GetStringFieldValue(DatHeader.FileNameKey)); - header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue().AsStringValue()); - header.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue().AsStringValue()); - header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue().AsStringValue()); - header.SetFieldValue(Models.Metadata.Header.HeaderKey, GetStringFieldValue(Models.Metadata.Header.HeaderKey)); - header.SetFieldValue(Models.Metadata.Header.HomepageKey, GetStringFieldValue(Models.Metadata.Header.HomepageKey)); - header.SetFieldValue(Models.Metadata.Header.NameKey, GetStringFieldValue(Models.Metadata.Header.NameKey)); - header.SetFieldValue(Models.Metadata.Header.RootDirKey, GetStringFieldValue(Models.Metadata.Header.RootDirKey)); - header.SetFieldValue(Models.Metadata.Header.TypeKey, GetStringFieldValue(Models.Metadata.Header.TypeKey)); - header.SetFieldValue(Models.Metadata.Header.UrlKey, GetStringFieldValue(Models.Metadata.Header.UrlKey)); - header.SetFieldValue(Models.Metadata.Header.VersionKey, GetStringFieldValue(Models.Metadata.Header.VersionKey)); + header.SetFieldValue(Models.Metadata.Header.AuthorKey, + GetStringFieldValue(Models.Metadata.Header.AuthorKey)); + header.SetFieldValue(Models.Metadata.Header.CategoryKey, + GetStringFieldValue(Models.Metadata.Header.CategoryKey)); + header.SetFieldValue(Models.Metadata.Header.CommentKey, + GetStringFieldValue(Models.Metadata.Header.CommentKey)); + header.SetFieldValue(Models.Metadata.Header.DateKey, + GetStringFieldValue(Models.Metadata.Header.DateKey)); + header.SetFieldValue(DatHeader.DatFormatKey, + GetFieldValue(DatHeader.DatFormatKey)); + header.SetFieldValue(Models.Metadata.Header.DescriptionKey, + GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); + header.SetFieldValue(Models.Metadata.Header.EmailKey, + GetStringFieldValue(Models.Metadata.Header.EmailKey)); + header.SetFieldValue(DatHeader.FileNameKey, + GetStringFieldValue(DatHeader.FileNameKey)); + header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, + GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue().AsStringValue()); + header.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, + GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue().AsStringValue()); + header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, + GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue().AsStringValue()); + header.SetFieldValue(Models.Metadata.Header.HeaderKey, + GetStringFieldValue(Models.Metadata.Header.HeaderKey)); + header.SetFieldValue(Models.Metadata.Header.HomepageKey, + GetStringFieldValue(Models.Metadata.Header.HomepageKey)); + header.SetFieldValue(Models.Metadata.Header.NameKey, + GetStringFieldValue(Models.Metadata.Header.NameKey)); + header.SetFieldValue(Models.Metadata.Header.RootDirKey, + GetStringFieldValue(Models.Metadata.Header.RootDirKey)); + header.SetFieldValue(Models.Metadata.Header.TypeKey, + GetStringFieldValue(Models.Metadata.Header.TypeKey)); + header.SetFieldValue(Models.Metadata.Header.UrlKey, + GetStringFieldValue(Models.Metadata.Header.UrlKey)); + header.SetFieldValue(Models.Metadata.Header.VersionKey, + GetStringFieldValue(Models.Metadata.Header.VersionKey)); return header; } @@ -205,17 +223,28 @@ namespace SabreTools.DatFiles public DatHeader CloneFiltering() { var header = new DatHeader(); - header.SetFieldValue(DatHeader.AddExtensionKey, GetStringFieldValue(DatHeader.AddExtensionKey)); - header.SetFieldValue(DatHeader.DatFormatKey, GetFieldValue(DatHeader.DatFormatKey)); - header.SetFieldValue(DatHeader.GameNameKey, GetBoolFieldValue(DatHeader.GameNameKey)); - header.SetFieldValue(DatHeader.InputDepotKey, GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); - header.SetFieldValue(DatHeader.OutputDepotKey, GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); - header.SetFieldValue(DatHeader.PostfixKey, GetStringFieldValue(DatHeader.PostfixKey)); - header.SetFieldValue(DatHeader.PrefixKey, GetStringFieldValue(DatHeader.PrefixKey)); - header.SetFieldValue(DatHeader.RemoveExtensionKey, GetBoolFieldValue(DatHeader.RemoveExtensionKey)); - header.SetFieldValue(DatHeader.ReplaceExtensionKey, GetStringFieldValue(DatHeader.ReplaceExtensionKey)); - header.SetFieldValue(DatHeader.QuotesKey, GetBoolFieldValue(DatHeader.QuotesKey)); - header.SetFieldValue(DatHeader.UseRomNameKey, GetBoolFieldValue(DatHeader.UseRomNameKey)); + header.SetFieldValue(DatHeader.AddExtensionKey, + GetStringFieldValue(DatHeader.AddExtensionKey)); + header.SetFieldValue(DatHeader.DatFormatKey, + GetFieldValue(DatHeader.DatFormatKey)); + header.SetFieldValue(DatHeader.GameNameKey, + GetBoolFieldValue(DatHeader.GameNameKey)); + header.SetFieldValue(DatHeader.InputDepotKey, + GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); + header.SetFieldValue(DatHeader.OutputDepotKey, + GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); + header.SetFieldValue(DatHeader.PostfixKey, + GetStringFieldValue(DatHeader.PostfixKey)); + header.SetFieldValue(DatHeader.PrefixKey, + GetStringFieldValue(DatHeader.PrefixKey)); + header.SetFieldValue(DatHeader.RemoveExtensionKey, + GetBoolFieldValue(DatHeader.RemoveExtensionKey)); + header.SetFieldValue(DatHeader.ReplaceExtensionKey, + GetStringFieldValue(DatHeader.ReplaceExtensionKey)); + header.SetFieldValue(DatHeader.QuotesKey, + GetBoolFieldValue(DatHeader.QuotesKey)); + header.SetFieldValue(DatHeader.UseRomNameKey, + GetBoolFieldValue(DatHeader.UseRomNameKey)); return header; } @@ -230,77 +259,105 @@ namespace SabreTools.DatFiles return; if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.FileNameKey))) - SetFieldValue(DatHeader.FileNameKey, datHeader.GetStringFieldValue(DatHeader.FileNameKey)); + SetFieldValue(DatHeader.FileNameKey, + datHeader.GetStringFieldValue(DatHeader.FileNameKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.NameKey))) - SetFieldValue(Models.Metadata.Header.NameKey, datHeader.GetStringFieldValue(Models.Metadata.Header.NameKey)); + SetFieldValue(Models.Metadata.Header.NameKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.NameKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.DescriptionKey))) - SetFieldValue(Models.Metadata.Header.DescriptionKey, datHeader.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); + SetFieldValue(Models.Metadata.Header.DescriptionKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.RootDirKey))) - SetFieldValue(Models.Metadata.Header.RootDirKey, datHeader.GetStringFieldValue(Models.Metadata.Header.RootDirKey)); + SetFieldValue(Models.Metadata.Header.RootDirKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.RootDirKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.CategoryKey))) - SetFieldValue(Models.Metadata.Header.CategoryKey, datHeader.GetStringFieldValue(Models.Metadata.Header.CategoryKey)); + SetFieldValue(Models.Metadata.Header.CategoryKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.CategoryKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.VersionKey))) - SetFieldValue(Models.Metadata.Header.VersionKey, datHeader.GetStringFieldValue(Models.Metadata.Header.VersionKey)); + SetFieldValue(Models.Metadata.Header.VersionKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.VersionKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.DateKey))) - SetFieldValue(Models.Metadata.Header.DateKey, datHeader.GetStringFieldValue(Models.Metadata.Header.DateKey)); + SetFieldValue(Models.Metadata.Header.DateKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.DateKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.AuthorKey))) - SetFieldValue(Models.Metadata.Header.AuthorKey, datHeader.GetStringFieldValue(Models.Metadata.Header.AuthorKey)); + SetFieldValue(Models.Metadata.Header.AuthorKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.AuthorKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.EmailKey))) - SetFieldValue(Models.Metadata.Header.EmailKey, datHeader.GetStringFieldValue(Models.Metadata.Header.EmailKey)); + SetFieldValue(Models.Metadata.Header.EmailKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.EmailKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.HomepageKey))) - SetFieldValue(Models.Metadata.Header.HomepageKey, datHeader.GetStringFieldValue(Models.Metadata.Header.HomepageKey)); + SetFieldValue(Models.Metadata.Header.HomepageKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.HomepageKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.UrlKey))) - SetFieldValue(Models.Metadata.Header.UrlKey, datHeader.GetStringFieldValue(Models.Metadata.Header.UrlKey)); + SetFieldValue(Models.Metadata.Header.UrlKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.UrlKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.CommentKey))) - SetFieldValue(Models.Metadata.Header.CommentKey, datHeader.GetStringFieldValue(Models.Metadata.Header.CommentKey)); + SetFieldValue(Models.Metadata.Header.CommentKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.CommentKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) - SetFieldValue(Models.Metadata.Header.HeaderKey, datHeader.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); + SetFieldValue(Models.Metadata.Header.HeaderKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(Models.Metadata.Header.TypeKey))) - SetFieldValue(Models.Metadata.Header.TypeKey, datHeader.GetStringFieldValue(Models.Metadata.Header.TypeKey)); + SetFieldValue(Models.Metadata.Header.TypeKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.TypeKey)); if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue() != MergingFlag.None) - SetFieldValue(Models.Metadata.Header.ForceMergingKey, datHeader.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue().AsStringValue()); + SetFieldValue(Models.Metadata.Header.ForceMergingKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue().AsStringValue()); if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue() != NodumpFlag.None) - SetFieldValue(Models.Metadata.Header.ForceNodumpKey, datHeader.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue().AsStringValue()); + SetFieldValue(Models.Metadata.Header.ForceNodumpKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue().AsStringValue()); if (datHeader.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue() != PackingFlag.None) - SetFieldValue(Models.Metadata.Header.ForcePackingKey, datHeader.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue().AsStringValue()); + SetFieldValue(Models.Metadata.Header.ForcePackingKey, + datHeader.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue().AsStringValue()); if (datHeader.GetFieldValue(DatHeader.DatFormatKey) != 0x00) - SetFieldValue(DatHeader.DatFormatKey, datHeader.GetFieldValue(DatHeader.DatFormatKey)); + SetFieldValue(DatHeader.DatFormatKey, + datHeader.GetFieldValue(DatHeader.DatFormatKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.PrefixKey))) - SetFieldValue(DatHeader.PrefixKey, datHeader.GetStringFieldValue(DatHeader.PrefixKey)); + SetFieldValue(DatHeader.PrefixKey, + datHeader.GetStringFieldValue(DatHeader.PrefixKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.PostfixKey))) - SetFieldValue(DatHeader.PostfixKey, datHeader.GetStringFieldValue(DatHeader.PostfixKey)); + SetFieldValue(DatHeader.PostfixKey, + datHeader.GetStringFieldValue(DatHeader.PostfixKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.AddExtensionKey))) - SetFieldValue(DatHeader.AddExtensionKey, datHeader.GetStringFieldValue(DatHeader.AddExtensionKey)); + SetFieldValue(DatHeader.AddExtensionKey, + datHeader.GetStringFieldValue(DatHeader.AddExtensionKey)); if (!string.IsNullOrEmpty(datHeader.GetStringFieldValue(DatHeader.ReplaceExtensionKey))) - SetFieldValue(DatHeader.ReplaceExtensionKey, datHeader.GetStringFieldValue(DatHeader.ReplaceExtensionKey)); + SetFieldValue(DatHeader.ReplaceExtensionKey, + datHeader.GetStringFieldValue(DatHeader.ReplaceExtensionKey)); - SetFieldValue(DatHeader.InputDepotKey, datHeader.GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); - SetFieldValue(DatHeader.OutputDepotKey, datHeader.GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); - SetFieldValue(DatHeader.GameNameKey, datHeader.GetBoolFieldValue(DatHeader.GameNameKey)); - SetFieldValue(DatHeader.QuotesKey, datHeader.GetBoolFieldValue(DatHeader.QuotesKey)); - SetFieldValue(DatHeader.RemoveExtensionKey, datHeader.GetBoolFieldValue(DatHeader.RemoveExtensionKey)); - SetFieldValue(DatHeader.UseRomNameKey, datHeader.GetBoolFieldValue(DatHeader.UseRomNameKey)); + SetFieldValue(DatHeader.InputDepotKey, + datHeader.GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); + SetFieldValue(DatHeader.OutputDepotKey, + datHeader.GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); + SetFieldValue(DatHeader.GameNameKey, + datHeader.GetBoolFieldValue(DatHeader.GameNameKey)); + SetFieldValue(DatHeader.QuotesKey, + datHeader.GetBoolFieldValue(DatHeader.QuotesKey)); + SetFieldValue(DatHeader.RemoveExtensionKey, + datHeader.GetBoolFieldValue(DatHeader.RemoveExtensionKey)); + SetFieldValue(DatHeader.UseRomNameKey, + datHeader.GetBoolFieldValue(DatHeader.UseRomNameKey)); } #endregion @@ -363,15 +420,18 @@ namespace SabreTools.DatFiles // Get all used extensions List usedExtensions = []; + // Get the current format type + DatFormat datFormat = GetFieldValue(DatHeader.DatFormatKey); + // Get the extensions from the output type #region .csv // CSV #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.CSV) != 0) + if ((datFormat & DatFormat.CSV) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.CSV)) + if (datFormat.HasFlag(DatFormat.CSV)) #endif { outfileNames.Add(DatFormat.CSV, CreateOutFileNamesHelper(outDir, ".csv", overwrite)); @@ -384,9 +444,9 @@ namespace SabreTools.DatFiles // ClrMamePro #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.ClrMamePro) != 0) + if ((datFormat & DatFormat.ClrMamePro) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.ClrMamePro)) + if (datFormat.HasFlag(DatFormat.ClrMamePro)) #endif { outfileNames.Add(DatFormat.ClrMamePro, CreateOutFileNamesHelper(outDir, ".dat", overwrite)); @@ -395,9 +455,9 @@ namespace SabreTools.DatFiles // RomCenter #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RomCenter) != 0) + if ((datFormat & DatFormat.RomCenter) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RomCenter)) + if (datFormat.HasFlag(DatFormat.RomCenter)) #endif { if (usedExtensions.Contains(".dat")) @@ -414,9 +474,9 @@ namespace SabreTools.DatFiles // DOSCenter #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.DOSCenter) != 0) + if ((datFormat & DatFormat.DOSCenter) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.DOSCenter)) + if (datFormat.HasFlag(DatFormat.DOSCenter)) #endif { if (usedExtensions.Contains(".dat")) @@ -437,9 +497,9 @@ namespace SabreTools.DatFiles // JSON #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SabreJSON) != 0) + if ((datFormat & DatFormat.SabreJSON) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SabreJSON)) + if (datFormat.HasFlag(DatFormat.SabreJSON)) #endif { outfileNames.Add(DatFormat.SabreJSON, CreateOutFileNamesHelper(outDir, ".json", overwrite)); @@ -452,9 +512,9 @@ namespace SabreTools.DatFiles // Redump MD5 #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpMD5) != 0) + if ((datFormat & DatFormat.RedumpMD5) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpMD5)) + if (datFormat.HasFlag(DatFormat.RedumpMD5)) #endif { outfileNames.Add(DatFormat.RedumpMD5, CreateOutFileNamesHelper(outDir, ".md5", overwrite)); @@ -467,9 +527,9 @@ namespace SabreTools.DatFiles // Redump SFV #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSFV) != 0) + if ((datFormat & DatFormat.RedumpSFV) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSFV)) + if (datFormat.HasFlag(DatFormat.RedumpSFV)) #endif { outfileNames.Add(DatFormat.RedumpSFV, CreateOutFileNamesHelper(outDir, ".sfv", overwrite)); @@ -482,9 +542,9 @@ namespace SabreTools.DatFiles // Redump SHA-1 #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA1) != 0) + if ((datFormat & DatFormat.RedumpSHA1) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA1)) + if (datFormat.HasFlag(DatFormat.RedumpSHA1)) #endif { outfileNames.Add(DatFormat.RedumpSHA1, CreateOutFileNamesHelper(outDir, ".sha1", overwrite)); @@ -497,9 +557,9 @@ namespace SabreTools.DatFiles // Redump SHA-256 #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA256) != 0) + if ((datFormat & DatFormat.RedumpSHA256) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA256)) + if (datFormat.HasFlag(DatFormat.RedumpSHA256)) #endif { outfileNames.Add(DatFormat.RedumpSHA256, CreateOutFileNamesHelper(outDir, ".sha256", overwrite)); @@ -512,9 +572,9 @@ namespace SabreTools.DatFiles // Redump SHA-384 #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA384) != 0) + if ((datFormat & DatFormat.RedumpSHA384) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA384)) + if (datFormat.HasFlag(DatFormat.RedumpSHA384)) #endif { outfileNames.Add(DatFormat.RedumpSHA384, CreateOutFileNamesHelper(outDir, ".sha384", overwrite)); @@ -527,9 +587,9 @@ namespace SabreTools.DatFiles // Redump SHA-512 #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSHA512) != 0) + if ((datFormat & DatFormat.RedumpSHA512) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSHA512)) + if (datFormat.HasFlag(DatFormat.RedumpSHA512)) #endif { outfileNames.Add(DatFormat.RedumpSHA512, CreateOutFileNamesHelper(outDir, ".sha512", overwrite)); @@ -542,9 +602,9 @@ namespace SabreTools.DatFiles // Redump SpamSum #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.RedumpSpamSum) != 0) + if ((datFormat & DatFormat.RedumpSpamSum) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.RedumpSpamSum)) + if (datFormat.HasFlag(DatFormat.RedumpSpamSum)) #endif { outfileNames.Add(DatFormat.RedumpSpamSum, CreateOutFileNamesHelper(outDir, ".spamsum", overwrite)); @@ -557,9 +617,9 @@ namespace SabreTools.DatFiles // SSV #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SSV) != 0) + if ((datFormat & DatFormat.SSV) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SSV)) + if (datFormat.HasFlag(DatFormat.SSV)) #endif { outfileNames.Add(DatFormat.SSV, CreateOutFileNamesHelper(outDir, ".ssv", overwrite)); @@ -572,9 +632,9 @@ namespace SabreTools.DatFiles // TSV #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.TSV) != 0) + if ((datFormat & DatFormat.TSV) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.TSV)) + if (datFormat.HasFlag(DatFormat.TSV)) #endif { outfileNames.Add(DatFormat.TSV, CreateOutFileNamesHelper(outDir, ".tsv", overwrite)); @@ -587,9 +647,9 @@ namespace SabreTools.DatFiles // AttractMode #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.AttractMode) != 0) + if ((datFormat & DatFormat.AttractMode) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.AttractMode)) + if (datFormat.HasFlag(DatFormat.AttractMode)) #endif { outfileNames.Add(DatFormat.AttractMode, CreateOutFileNamesHelper(outDir, ".txt", overwrite)); @@ -598,9 +658,9 @@ namespace SabreTools.DatFiles // MAME Listroms #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.Listrom) != 0) + if ((datFormat & DatFormat.Listrom) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.Listrom)) + if (datFormat.HasFlag(DatFormat.Listrom)) #endif { if (usedExtensions.Contains(".txt")) @@ -617,9 +677,9 @@ namespace SabreTools.DatFiles // Missfile #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.MissFile) != 0) + if ((datFormat & DatFormat.MissFile) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.MissFile)) + if (datFormat.HasFlag(DatFormat.MissFile)) #endif { if (usedExtensions.Contains(".txt")) @@ -636,9 +696,9 @@ namespace SabreTools.DatFiles // Everdrive SMDB #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.EverdriveSMDB) != 0) + if ((datFormat & DatFormat.EverdriveSMDB) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.EverdriveSMDB)) + if (datFormat.HasFlag(DatFormat.EverdriveSMDB)) #endif { if (usedExtensions.Contains(".txt")) @@ -659,18 +719,18 @@ namespace SabreTools.DatFiles // Logiqx XML #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.Logiqx) != 0) + if ((datFormat & DatFormat.Logiqx) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.Logiqx)) + if (datFormat.HasFlag(DatFormat.Logiqx)) #endif { outfileNames.Add(DatFormat.Logiqx, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); usedExtensions.Add(".xml"); } #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.LogiqxDeprecated) != 0) + if ((datFormat & DatFormat.LogiqxDeprecated) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.LogiqxDeprecated)) + if (datFormat.HasFlag(DatFormat.LogiqxDeprecated)) #endif { outfileNames.Add(DatFormat.LogiqxDeprecated, CreateOutFileNamesHelper(outDir, ".xml", overwrite)); @@ -679,9 +739,9 @@ namespace SabreTools.DatFiles // SabreDAT #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SabreXML) != 0) + if ((datFormat & DatFormat.SabreXML) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SabreXML)) + if (datFormat.HasFlag(DatFormat.SabreXML)) #endif { if (usedExtensions.Contains(".xml")) @@ -698,9 +758,9 @@ namespace SabreTools.DatFiles // Software List #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.SoftwareList) != 0) + if ((datFormat & DatFormat.SoftwareList) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SoftwareList)) + if (datFormat.HasFlag(DatFormat.SoftwareList)) #endif { if (usedExtensions.Contains(".xml")) @@ -717,9 +777,9 @@ namespace SabreTools.DatFiles // MAME Listxml #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.Listxml) != 0) + if ((datFormat & DatFormat.Listxml) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.Listxml)) + if (datFormat.HasFlag(DatFormat.Listxml)) #endif { if (usedExtensions.Contains(".xml")) @@ -736,9 +796,9 @@ namespace SabreTools.DatFiles // OfflineList #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.OfflineList) != 0) + if ((datFormat & DatFormat.OfflineList) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.OfflineList)) + if (datFormat.HasFlag(DatFormat.OfflineList)) #endif { if (usedExtensions.Contains(".xml")) @@ -755,9 +815,9 @@ namespace SabreTools.DatFiles // openMSX #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.OpenMSX) != 0) + if ((datFormat & DatFormat.OpenMSX) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.OpenMSX)) + if (datFormat.HasFlag(DatFormat.OpenMSX)) #endif { if (usedExtensions.Contains(".xml")) @@ -774,9 +834,9 @@ namespace SabreTools.DatFiles // Archive.org #if NETFRAMEWORK - if ((GetFieldValue(DatHeader.DatFormatKey) & DatFormat.ArchiveDotOrg) != 0) + if ((datFormat & DatFormat.ArchiveDotOrg) != 0) #else - if (GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.ArchiveDotOrg)) + if (datFormat.HasFlag(DatFormat.ArchiveDotOrg)) #endif { if (usedExtensions.Contains(".xml")) diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs index b7e20c8f..16604cbb 100644 --- a/SabreTools.DatFiles/ItemDictionary.cs +++ b/SabreTools.DatFiles/ItemDictionary.cs @@ -909,31 +909,41 @@ namespace SabreTools.DatFiles { DatItem item = this[key]![0]; - // Match on CloneOf first - if (!string.IsNullOrEmpty(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey))) - { - if (!parents.ContainsKey(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant())) - parents.Add(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant(), []); + // Get machine information + Machine? machine = item.GetFieldValue(DatItem.MachineKey); + string? machineName = machine?.GetStringFieldValue(Models.Metadata.Machine.NameKey)?.ToLowerInvariant(); + if (machine == null || machineName == null) + continue; - parents[item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant()].Add(item.GetFieldValue(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 - else if (!string.IsNullOrEmpty(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey))) + else if (!string.IsNullOrEmpty(romOf)) { - if (!parents.ContainsKey(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant())) - parents.Add(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant(), []); + if (!parents.ContainsKey(romOf!)) + parents.Add(romOf!, []); - parents[item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant()].Add(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); + parents[romOf!].Add(machineName); } // Otherwise, treat it as a parent else { - if (!parents.ContainsKey(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant())) - parents.Add(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant(), []); + if (!parents.ContainsKey(machineName)) + parents.Add(machineName, []); - parents[item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()].Add(item.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant()); + parents[machineName].Add(machineName); } } diff --git a/SabreTools.DatFiles/ItemDictionaryDB.cs b/SabreTools.DatFiles/ItemDictionaryDB.cs index b8966274..591ad584 100644 --- a/SabreTools.DatFiles/ItemDictionaryDB.cs +++ b/SabreTools.DatFiles/ItemDictionaryDB.cs @@ -1294,31 +1294,41 @@ namespace SabreTools.DatFiles if (machine.Item2 == null) continue; - // Match on CloneOf first - if (!string.IsNullOrEmpty(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey))) - { - if (!parents.ContainsKey(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant())) - parents.Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)!.ToLowerInvariant(), []); + // Get machine information + Machine? machineObj = machine.Item2.GetFieldValue(DatItem.MachineKey); + string? machineName = machineObj?.GetStringFieldValue(Models.Metadata.Machine.NameKey)?.ToLowerInvariant(); + if (machineObj == null || machineName == null) + 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 - 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())) - parents.Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.RomOfKey)!.ToLowerInvariant(), []); + if (!parents.ContainsKey(romOf!)) + 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 else { - if (!parents.ContainsKey(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant())) - parents.Add(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.ToLowerInvariant(), []); + if (!parents.ContainsKey(machineName)) + 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); } } diff --git a/SabreTools.DatTools/Rebuilder.cs b/SabreTools.DatTools/Rebuilder.cs index 20ccada2..36a72864 100644 --- a/SabreTools.DatTools/Rebuilder.cs +++ b/SabreTools.DatTools/Rebuilder.cs @@ -65,8 +65,9 @@ namespace SabreTools.DatTools outDir = outDir.Ensure(create: true); // 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.None) - outputFormat = GetOutputFormat(datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue()); + PackingFlag forcePacking = datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue(); + if (outputFormat == OutputFormat.Folder && forcePacking != PackingFlag.None) + outputFormat = GetOutputFormat(forcePacking); #endregion @@ -219,8 +220,9 @@ namespace SabreTools.DatTools } // 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.None) - outputFormat = GetOutputFormat(datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue()); + PackingFlag forcePacking = datFile.Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue(); + if (outputFormat == OutputFormat.Folder && forcePacking != PackingFlag.None) + outputFormat = GetOutputFormat(forcePacking); #endregion diff --git a/SabreTools/Features/BaseFeature.cs b/SabreTools/Features/BaseFeature.cs index 099402f0..31b9cf5b 100644 --- a/SabreTools/Features/BaseFeature.cs +++ b/SabreTools/Features/BaseFeature.cs @@ -2195,14 +2195,13 @@ Some special strings that can be used: logger.Error($"{ot} is not a recognized DAT format"); return null; } - else if (dftemp == DatFormat.Logiqx && deprecated) - { - datHeader.SetFieldValue(DatHeader.DatFormatKey, datHeader.GetFieldValue(DatHeader.DatFormatKey) | DatFormat.LogiqxDeprecated); - } + + // Handle deprecated Logiqx + DatFormat currentFormat = datHeader.GetFieldValue(DatHeader.DatFormatKey); + if (dftemp == DatFormat.Logiqx && deprecated) + datHeader.SetFieldValue(DatHeader.DatFormatKey, currentFormat | DatFormat.LogiqxDeprecated); else - { - datHeader.SetFieldValue(DatHeader.DatFormatKey, datHeader.GetFieldValue(DatHeader.DatFormatKey) | dftemp); - } + datHeader.SetFieldValue(DatHeader.DatFormatKey, currentFormat | dftemp); } return datHeader; diff --git a/SabreTools/Features/Batch.cs b/SabreTools/Features/Batch.cs index e9512638..25d4c967 100644 --- a/SabreTools/Features/Batch.cs +++ b/SabreTools/Features/Batch.cs @@ -486,7 +486,8 @@ Reset the internal state: reset();"; batchState.DatFile.Header.SetFieldValue(DatHeader.DatFormatKey, 0x00); foreach (string format in Arguments) { - batchState.DatFile.Header.SetFieldValue(DatHeader.DatFormatKey, batchState.DatFile.Header.GetFieldValue(DatHeader.DatFormatKey) | GetDatFormat(format)); + DatFormat currentFormat = batchState.DatFile.Header.GetFieldValue(DatHeader.DatFormatKey); + batchState.DatFile.Header.SetFieldValue(DatHeader.DatFormatKey, currentFormat | GetDatFormat(format)); } } } diff --git a/SabreTools/Features/Sort.cs b/SabreTools/Features/Sort.cs index 3e1b5be5..74416c2a 100644 --- a/SabreTools/Features/Sort.cs +++ b/SabreTools/Features/Sort.cs @@ -6,7 +6,6 @@ using SabreTools.FileTypes; using SabreTools.Help; using SabreTools.IO; using SabreTools.Logging; -using SabreTools.Models.InstallShieldCabinet; namespace SabreTools.Features { @@ -73,8 +72,12 @@ namespace SabreTools.Features bool updateDat = GetBoolean(features, UpdateDatValue); var outputFormat = GetOutputFormat(features); + // Get the depots + var inputDepot = Header!.GetFieldValue(DatHeader.InputDepotKey); + var outputDepot = Header!.GetFieldValue(DatHeader.OutputDepotKey); + // If we have the romba flag - if (Header!.GetFieldValue(DatHeader.OutputDepotKey)?.IsActive == true) + if (outputDepot?.IsActive == true) { // Update TorrentGzip output if (outputFormat == OutputFormat.TorrentGzip) @@ -98,8 +101,8 @@ namespace SabreTools.Features Parser.ParseInto(datdata, datfile, int.MaxValue, keep: true); // Set depot information - datdata.Header.SetFieldValue(DatHeader.InputDepotKey, Header.GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); - datdata.Header.SetFieldValue(DatHeader.OutputDepotKey, Header.GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); + datdata.Header.SetFieldValue(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation); + datdata.Header.SetFieldValue(DatHeader.OutputDepotKey, outputDepot?.Clone() as DepotInformation); // If we have overridden the header skipper, set it now if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) @@ -107,7 +110,7 @@ namespace SabreTools.Features // If we have the depot flag, respect it bool success; - if (Header.GetFieldValue(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); else 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 - datdata.Header.SetFieldValue(DatHeader.InputDepotKey, Header.GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); - datdata.Header.SetFieldValue(DatHeader.OutputDepotKey, Header.GetFieldValue(DatHeader.OutputDepotKey)?.Clone() as DepotInformation); + datdata.Header.SetFieldValue(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation); + datdata.Header.SetFieldValue(DatHeader.OutputDepotKey, outputDepot?.Clone() as DepotInformation); // If we have overridden the header skipper, set it now - if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) - datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); + string? headerSkpper = Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey); + if (!string.IsNullOrEmpty(headerSkpper)) + datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, headerSkpper); watch.Stop(); // If we have the depot flag, respect it bool success; - if (Header.GetFieldValue(DatHeader.InputDepotKey)?.IsActive ?? false) + if (inputDepot?.IsActive ?? false) success = Rebuilder.RebuildDepot(datdata, Inputs, OutputDir!, date, delete, inverse, outputFormat); else 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 (success && updateDat) { - datdata.Header.SetFieldValue(DatHeader.FileNameKey, $"fixDAT_{Header.GetStringFieldValue(DatHeader.FileNameKey)}"); - datdata.Header.SetFieldValue(Models.Metadata.Header.NameKey, $"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.NameKey)}"); - datdata.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, $"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)}"); + datdata.Header.SetFieldValue(DatHeader.FileNameKey, + $"fixDAT_{Header.GetStringFieldValue(DatHeader.FileNameKey)}"); + datdata.Header.SetFieldValue(Models.Metadata.Header.NameKey, + $"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.NameKey)}"); + datdata.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, + $"fixDAT_{Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey)}"); + datdata.Items.ClearMarked(); datdata.ItemsDB.ClearMarked(); Writer.Write(datdata, OutputDir); diff --git a/SabreTools/Features/Update.cs b/SabreTools/Features/Update.cs index 91f3328d..94d1a989 100644 --- a/SabreTools/Features/Update.cs +++ b/SabreTools/Features/Update.cs @@ -167,10 +167,14 @@ namespace SabreTools.Features // Create a new base DatFile DatFile datFile = DatFile.Create(Header); logger.User($"Processing '{Path.GetFileName(inputPath.CurrentPath)}'"); - Parser.ParseInto(datFile, inputPath, keep: true, - keepext: datFile.Header.GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.TSV) - || datFile.Header.GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.CSV) - || datFile.Header.GetFieldValue(DatHeader.DatFormatKey).HasFlag(DatFormat.SSV)); + + // Check the current format + DatFormat currentFormat = datFile.Header.GetFieldValue(DatHeader.DatFormatKey); + 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 Extras!.ApplyExtras(datFile); diff --git a/SabreTools/Features/Verify.cs b/SabreTools/Features/Verify.cs index 9f1cc4bf..64324b20 100644 --- a/SabreTools/Features/Verify.cs +++ b/SabreTools/Features/Verify.cs @@ -73,14 +73,16 @@ namespace SabreTools.Features Remover!.ApplyRemovals(datdata); // Set depot information - datdata.Header.SetFieldValue(DatHeader.InputDepotKey, Header!.GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); + var inputDepot = Header!.GetFieldValue(DatHeader.InputDepotKey); + datdata.Header.SetFieldValue(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation); // If we have overridden the header skipper, set it now - if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) - datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); + string? headerSkipper = Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey); + if (!string.IsNullOrEmpty(headerSkipper)) + datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, headerSkipper); // If we have the depot flag, respect it - if (Header.GetFieldValue(DatHeader.InputDepotKey)?.IsActive ?? false) + if (inputDepot?.IsActive ?? false) { Verification.VerifyDepot(datdata, Inputs); } @@ -123,16 +125,18 @@ namespace SabreTools.Features Remover!.ApplyRemovals(datdata); // Set depot information - datdata.Header.SetFieldValue(DatHeader.InputDepotKey, Header!.GetFieldValue(DatHeader.InputDepotKey)?.Clone() as DepotInformation); + var inputDepot = Header!.GetFieldValue(DatHeader.InputDepotKey); + datdata.Header.SetFieldValue(DatHeader.InputDepotKey, inputDepot?.Clone() as DepotInformation); // If we have overridden the header skipper, set it now - if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) - datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey)); + string? headerSkipper = Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey); + if (!string.IsNullOrEmpty(headerSkipper)) + datdata.Header.SetFieldValue(Models.Metadata.Header.HeaderKey, headerSkipper); watch.Stop(); // If we have the depot flag, respect it - if (Header.GetFieldValue(DatHeader.InputDepotKey)?.IsActive ?? false) + if (inputDepot?.IsActive ?? false) { Verification.VerifyDepot(datdata, Inputs); }