diff --git a/SabreTools.Filtering/Cleaner.cs b/SabreTools.Filtering/Cleaner.cs index 77965be3..91d445ae 100644 --- a/SabreTools.Filtering/Cleaner.cs +++ b/SabreTools.Filtering/Cleaner.cs @@ -231,36 +231,54 @@ namespace SabreTools.Filtering /// DatItem to clean internal void CleanDatItem(DatItem datItem) { + // Get the machine associated with the item, if possible + var machine = datItem.GetFieldValue(DatItem.MachineKey); + if (machine == null) + return; + + // Get the fields for processing + string? machineName = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey); + string? machineDesc = machine.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey); + string? datItemName = datItem.GetName(); + // If we're stripping unicode characters, strip machine name and description if (RemoveUnicode) { - datItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, TextHelper.RemoveUnicodeCharacters(datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey))); - datItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.DescriptionKey, TextHelper.RemoveUnicodeCharacters(datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey))); - datItem.SetName(TextHelper.RemoveUnicodeCharacters(datItem.GetName())); + machineName = TextHelper.RemoveUnicodeCharacters(machineName); + machineDesc = TextHelper.RemoveUnicodeCharacters(machineDesc); + datItemName = TextHelper.RemoveUnicodeCharacters(datItemName); } // If we're in cleaning mode, sanitize machine name and description if (Clean) { - datItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, TextHelper.NormalizeCharacters(datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey))); - datItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.DescriptionKey, TextHelper.NormalizeCharacters(datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey))); + machineName = TextHelper.NormalizeCharacters(machineName); + machineDesc = TextHelper.NormalizeCharacters(machineDesc); } // If we are in single game mode, rename the machine if (Single) - datItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, "!"); + { + machineName = "!"; + machineDesc = "!"; + } // If we are in NTFS trim mode, trim the item name - if (Trim && datItem.GetName() != null) + if (Trim && datItemName != null) { // Windows max name length is 260 - int usableLength = 260 - datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.Length - (Root?.Length ?? 0); - if (datItem.GetName()!.Length > usableLength) + int usableLength = 260 - (machineName?.Length ?? 0) - (Root?.Length ?? 0); + if (datItemName.Length > usableLength) { - string ext = Path.GetExtension(datItem.GetName()!); - datItem.SetName(datItem.GetName()!.Substring(0, usableLength - ext.Length) + ext); + string ext = Path.GetExtension(datItemName); + datItemName = datItemName.Substring(0, usableLength - ext.Length) + ext; } } + + // Set the fields back, if necessary + machine.SetFieldValue(Models.Metadata.Machine.NameKey, machineName); + machine.SetFieldValue(Models.Metadata.Machine.DescriptionKey, machineDesc); + datItem.SetName(datItemName); } /// @@ -275,36 +293,49 @@ namespace SabreTools.Filtering if (machine.Item2 == null) return; + // Get the fields for processing + string? machineName = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey); + string? machineDesc = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey); + string? datItemName = datItem.Item2.GetName(); + // If we're stripping unicode characters, strip machine name and description if (RemoveUnicode) { - machine.Item2.SetFieldValue(Models.Metadata.Machine.NameKey, TextHelper.RemoveUnicodeCharacters(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey))); - machine.Item2.SetFieldValue(Models.Metadata.Machine.DescriptionKey, TextHelper.RemoveUnicodeCharacters(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey))); - datItem.Item2.SetName(TextHelper.RemoveUnicodeCharacters(datItem.Item2.GetName())); + machineName = TextHelper.RemoveUnicodeCharacters(machineName); + machineDesc = TextHelper.RemoveUnicodeCharacters(machineDesc); + datItemName = TextHelper.RemoveUnicodeCharacters(datItemName); } // If we're in cleaning mode, sanitize machine name and description if (Clean) { - machine.Item2.SetFieldValue(Models.Metadata.Machine.NameKey, TextHelper.NormalizeCharacters(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey))); - machine.Item2.SetFieldValue(Models.Metadata.Machine.DescriptionKey, TextHelper.NormalizeCharacters(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey))); + machineName = TextHelper.NormalizeCharacters(machineName); + machineDesc = TextHelper.NormalizeCharacters(machineDesc); } // If we are in single game mode, rename the machine if (Single) - machine.Item2.SetFieldValue(Models.Metadata.Machine.NameKey, "!"); + { + machineName = "!"; + machineDesc = "!"; + } // If we are in NTFS trim mode, trim the item name - if (Trim && datItem.Item2.GetName() != null) + if (Trim && datItemName != null) { // Windows max name length is 260 - int usableLength = 260 - machine.Item2.GetStringFieldValue(Models.Metadata.Machine.NameKey)!.Length - (Root?.Length ?? 0); - if (datItem.Item2.GetName()!.Length > usableLength) + int usableLength = 260 - (machineName?.Length ?? 0) - (Root?.Length ?? 0); + if (datItemName.Length > usableLength) { - string ext = Path.GetExtension(datItem.Item2.GetName()!); - datItem.Item2.SetName(datItem.Item2.GetName()!.Substring(0, usableLength - ext.Length) + ext); + string ext = Path.GetExtension(datItemName); + datItemName = datItemName.Substring(0, usableLength - ext.Length) + ext; } } + + // Set the fields back, if necessary + machine.Item2.SetFieldValue(Models.Metadata.Machine.NameKey, machineName); + machine.Item2.SetFieldValue(Models.Metadata.Machine.DescriptionKey, machineDesc); + datItem.Item2.SetName(datItemName); } #endregion