Name is not guaranteed

This commit is contained in:
Matt Nadareski
2020-09-02 12:19:12 -07:00
parent c77bcca9ad
commit bd92f8993a
20 changed files with 1397 additions and 164 deletions

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using SabreTools.Library.Filtering;
@@ -15,9 +16,21 @@ namespace SabreTools.Library.DatItems
{
#region Fields
/// <summary>
/// Name of the item
/// </summary>
[JsonProperty("name")]
public string Name { get; set; }
/// <summary>
/// Status of the softare list according to the machine
/// </summary>
[JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore)]
public SoftwareListStatus Status { get; set; }
/// <summary>
/// Filter to apply to the software list
/// </summary>
[JsonProperty("filter", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Filter { get; set; }
@@ -25,6 +38,15 @@ namespace SabreTools.Library.DatItems
#region Accessors
/// <summary>
/// Gets the name to use for a DatItem
/// </summary>
/// <returns>Name if available, null otherwise</returns>
public override string GetName()
{
return Name;
}
/// <summary>
/// Set fields with given values
/// </summary>
@@ -35,6 +57,9 @@ namespace SabreTools.Library.DatItems
base.SetFields(mappings);
// Handle SoftwareList-specific fields
if (mappings.Keys.Contains(Field.DatItem_Name))
Name = mappings[Field.DatItem_Name];
if (mappings.Keys.Contains(Field.DatItem_SoftwareListStatus))
Status = mappings[Field.DatItem_Default].AsSoftwareListStatus();
@@ -117,6 +142,33 @@ namespace SabreTools.Library.DatItems
#region Filtering
/// <summary>
/// Clean a DatItem according to the cleaner
/// </summary>
/// <param name="cleaner">Cleaner to implement</param>
public override void Clean(Cleaner cleaner)
{
// Clean common items first
base.Clean(cleaner);
// If we're stripping unicode characters, strip item name
if (cleaner?.RemoveUnicode == true)
Name = Sanitizer.RemoveUnicodeCharacters(Name);
// If we are in NTFS trim mode, trim the game name
if (cleaner?.Trim == true)
{
// Windows max name length is 260
int usableLength = 260 - Machine.Name.Length - (cleaner.Root?.Length ?? 0);
if (Name.Length > usableLength)
{
string ext = Path.GetExtension(Name);
Name = Name.Substring(0, usableLength - ext.Length);
Name += ext;
}
}
}
/// <summary>
/// Check to see if a DatItem passes the filter
/// </summary>
@@ -128,6 +180,12 @@ namespace SabreTools.Library.DatItems
if (!base.PassesFilter(filter))
return false;
// Filter on item name
if (filter.DatItem_Name.MatchesPositiveSet(Name) == false)
return false;
if (filter.DatItem_Name.MatchesNegativeSet(Name) == true)
return false;
// Filter on status
if (filter.DatItem_SoftwareListStatus.MatchesPositive(SoftwareListStatus.NULL, Status) == false)
return false;
@@ -153,6 +211,9 @@ namespace SabreTools.Library.DatItems
base.RemoveFields(fields);
// Remove the fields
if (fields.Contains(Field.DatItem_Name))
Name = null;
if (fields.Contains(Field.DatItem_SoftwareListStatus))
Status = SoftwareListStatus.NULL;
@@ -160,6 +221,16 @@ namespace SabreTools.Library.DatItems
Filter = null;
}
/// <summary>
/// Set internal names to match One Rom Per Game (ORPG) logic
/// </summary>
public override void SetOneRomPerGame()
{
string[] splitname = Name.Split('.');
Machine.Name += $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1))}";
Name = Path.GetFileName(Name);
}
#endregion
#region Sorting and Merging
@@ -182,6 +253,9 @@ namespace SabreTools.Library.DatItems
SoftwareList newItem = item as SoftwareList;
// Replace the fields
if (fields.Contains(Field.DatItem_Name))
Name = newItem.Name;
if (fields.Contains(Field.DatItem_SoftwareListStatus))
Status = newItem.Status;