DatItems of destiny

This commit is contained in:
Matt Nadareski
2020-08-17 17:28:32 -07:00
parent fafac31ea8
commit 5660da7b0e
8 changed files with 521 additions and 294 deletions

View File

@@ -615,7 +615,7 @@ namespace SabreTools.Library.DatItems
/// <summary>
/// Get the value of that field as a string, if possible
/// </summary>
public string GetField(Field field, List<Field> excludeFields)
public virtual string GetField(Field field, List<Field> excludeFields)
{
// If the field is to be excluded, return empty string
if (excludeFields.Contains(field))
@@ -625,196 +625,80 @@ namespace SabreTools.Library.DatItems
switch (field)
{
case Field.Name:
fieldValue = this.Name;
fieldValue = Name;
break;
case Field.PartName:
fieldValue = this.PartName;
fieldValue = PartName;
break;
case Field.PartInterface:
fieldValue = this.PartInterface;
fieldValue = PartInterface;
break;
case Field.Features:
fieldValue = string.Join(";", (this.Features ?? new List<KeyValuePair<string, string>>()).Select(f => $"{f.Key}={f.Value}"));
fieldValue = string.Join(";", (Features ?? new List<KeyValuePair<string, string>>()).Select(f => $"{f.Key}={f.Value}"));
break;
case Field.AreaName:
fieldValue = this.AreaName;
fieldValue = AreaName;
break;
case Field.AreaSize:
fieldValue = this.AreaSize?.ToString();
fieldValue = AreaSize?.ToString();
break;
case Field.MachineName:
fieldValue = this.MachineName;
fieldValue = MachineName;
break;
case Field.Comment:
fieldValue = this.Comment;
fieldValue = Comment;
break;
case Field.Description:
fieldValue = this.MachineDescription;
fieldValue = MachineDescription;
break;
case Field.Year:
fieldValue = this.Year;
fieldValue = Year;
break;
case Field.Manufacturer:
fieldValue = this.Manufacturer;
fieldValue = Manufacturer;
break;
case Field.Publisher:
fieldValue = this.Publisher;
fieldValue = Publisher;
break;
case Field.Category:
fieldValue = this.Category;
fieldValue = Category;
break;
case Field.RomOf:
fieldValue = this.RomOf;
fieldValue = RomOf;
break;
case Field.CloneOf:
fieldValue = this.CloneOf;
fieldValue = CloneOf;
break;
case Field.SampleOf:
fieldValue = this.SampleOf;
fieldValue = SampleOf;
break;
case Field.Supported:
fieldValue = this.Supported?.ToString();
fieldValue = Supported?.ToString();
break;
case Field.SourceFile:
fieldValue = this.SourceFile;
fieldValue = SourceFile;
break;
case Field.Runnable:
fieldValue = this.Runnable?.ToString();
fieldValue = Runnable?.ToString();
break;
case Field.Board:
fieldValue = this.Board;
fieldValue = Board;
break;
case Field.RebuildTo:
fieldValue = this.RebuildTo;
fieldValue = RebuildTo;
break;
case Field.Devices:
fieldValue = string.Join(";", this.Devices ?? new List<string>());
fieldValue = string.Join(";", Devices ?? new List<string>());
break;
case Field.SlotOptions:
fieldValue = string.Join(";", this.SlotOptions ?? new List<string>());
fieldValue = string.Join(";", SlotOptions ?? new List<string>());
break;
case Field.Infos:
fieldValue = string.Join(";", (this.Infos ?? new List<KeyValuePair<string, string>>()).Select(i => $"{i.Key}={i.Value}"));
fieldValue = string.Join(";", (Infos ?? new List<KeyValuePair<string, string>>()).Select(i => $"{i.Key}={i.Value}"));
break;
case Field.MachineType:
fieldValue = this.MachineType.ToString();
break;
case Field.Default:
if (ItemType == ItemType.BiosSet)
fieldValue = (this as BiosSet).Default?.ToString();
else if (ItemType == ItemType.Release)
fieldValue = (this as Release).Default?.ToString();
break;
case Field.BiosDescription:
if (ItemType == ItemType.BiosSet)
fieldValue = (this as BiosSet).Description;
break;
case Field.MD5:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).MD5;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).MD5;
break;
#if NET_FRAMEWORK
case Field.RIPEMD160:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).RIPEMD160;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).RIPEMD160;
break;
#endif
case Field.SHA1:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).SHA1;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).SHA1;
break;
case Field.SHA256:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).SHA256;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).SHA256;
break;
case Field.SHA384:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).SHA384;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).SHA384;
break;
case Field.SHA512:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).SHA512;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).SHA512;
break;
case Field.Merge:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).MergeTag;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).MergeTag;
break;
case Field.Region:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).Region;
else if (ItemType == ItemType.Release)
fieldValue = (this as Release).Region;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Region;
break;
case Field.Index:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).Index;
break;
case Field.Writable:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).Writable?.ToString();
break;
case Field.Optional:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).Optional?.ToString();
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Optional?.ToString();
break;
case Field.Status:
if (ItemType == ItemType.Disk)
fieldValue = (this as Disk).ItemStatus.ToString();
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).ItemStatus.ToString();
break;
case Field.Language:
if (ItemType == ItemType.Release)
fieldValue = (this as Release).Language;
break;
case Field.Date:
if (ItemType == ItemType.Release)
fieldValue = (this as Release).Date;
else if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Date;
break;
case Field.Bios:
if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Bios;
break;
case Field.Size:
if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Size.ToString();
break;
case Field.CRC:
if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).CRC;
break;
case Field.Offset:
if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Offset;
break;
case Field.Inverted:
if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Inverted?.ToString();
fieldValue = MachineType.ToString();
break;
case Field.NULL:
@@ -949,10 +833,10 @@ namespace SabreTools.Library.DatItems
{
try
{
if (this.Name == other.Name)
return this.Equals(other) ? 0 : 1;
if (Name == other.Name)
return Equals(other) ? 0 : 1;
return String.Compare(this.Name, other.Name);
return string.Compare(Name, other.Name);
}
catch
{
@@ -977,13 +861,13 @@ namespace SabreTools.Library.DatItems
DupeType output = 0x00;
// If we don't have a duplicate at all, return none
if (!this.Equals(lastItem))
if (!Equals(lastItem))
return output;
// If the duplicate is external already or should be, set it
if (lastItem.DupeType.HasFlag(DupeType.External) || lastItem.IndexId != this.IndexId)
if (lastItem.DupeType.HasFlag(DupeType.External) || lastItem.IndexId != IndexId)
{
if (lastItem.MachineName == this.MachineName && lastItem.Name == this.Name)
if (lastItem.MachineName == MachineName && lastItem.Name == Name)
output = DupeType.External | DupeType.All;
else
output = DupeType.External | DupeType.Hash;
@@ -992,7 +876,7 @@ namespace SabreTools.Library.DatItems
// Otherwise, it's considered an internal dupe
else
{
if (lastItem.MachineName == this.MachineName && lastItem.Name == this.Name)
if (lastItem.MachineName == MachineName && lastItem.Name == Name)
output = DupeType.Internal | DupeType.All;
else
output = DupeType.Internal | DupeType.Hash;
@@ -1012,7 +896,7 @@ namespace SabreTools.Library.DatItems
/// <param name="lower">True if the key should be lowercased (default), false otherwise</param>
/// <param name="norename">True if games should only be compared on game and file name, false if system and source are counted</param>
/// <returns>String representing the key to be used for the DatItem</returns>
public string GetKey(BucketedBy bucketedBy, bool lower = true, bool norename = true)
public virtual string GetKey(BucketedBy bucketedBy, bool lower = true, bool norename = true)
{
// Set the output key as the default blank string
string key = string.Empty;
@@ -1021,16 +905,16 @@ namespace SabreTools.Library.DatItems
switch (bucketedBy)
{
case BucketedBy.CRC:
key = (this.ItemType == ItemType.Rom ? ((Rom)this).CRC : Constants.CRCZero);
key = Constants.CRCZero;
break;
case BucketedBy.Game:
key = (norename ? string.Empty
: this.IndexId.ToString().PadLeft(10, '0')
: IndexId.ToString().PadLeft(10, '0')
+ "-")
+ (string.IsNullOrWhiteSpace(this.MachineName)
+ (string.IsNullOrWhiteSpace(MachineName)
? "Default"
: this.MachineName);
: MachineName);
if (lower)
key = key.ToLowerInvariant();
@@ -1041,53 +925,29 @@ namespace SabreTools.Library.DatItems
break;
case BucketedBy.MD5:
key = (this.ItemType == ItemType.Rom
? ((Rom)this).MD5
: (this.ItemType == ItemType.Disk
? ((Disk)this).MD5
: Constants.MD5Zero));
key = Constants.MD5Zero;
break;
#if NET_FRAMEWORK
case BucketedBy.RIPEMD160:
key = (this.ItemType == ItemType.Rom
? ((Rom)this).RIPEMD160
: (this.ItemType == ItemType.Disk
? ((Disk)this).RIPEMD160
: Constants.RIPEMD160Zero));
key = Constants.RIPEMD160Zero;
break;
#endif
case BucketedBy.SHA1:
key = (this.ItemType == ItemType.Rom
? ((Rom)this).SHA1
: (this.ItemType == ItemType.Disk
? ((Disk)this).SHA1
: Constants.SHA1Zero));
key = Constants.SHA1Zero;
break;
case BucketedBy.SHA256:
key = (this.ItemType == ItemType.Rom
? ((Rom)this).SHA256
: (this.ItemType == ItemType.Disk
? ((Disk)this).SHA256
: Constants.SHA256Zero));
key = Constants.SHA256Zero;
break;
case BucketedBy.SHA384:
key = (this.ItemType == ItemType.Rom
? ((Rom)this).SHA384
: (this.ItemType == ItemType.Disk
? ((Disk)this).SHA384
: Constants.SHA384Zero));
key = Constants.SHA384Zero;
break;
case BucketedBy.SHA512:
key = (this.ItemType == ItemType.Rom
? ((Rom)this).SHA512
: (this.ItemType == ItemType.Disk
? ((Disk)this).SHA512
: Constants.SHA512Zero));
key = Constants.SHA512Zero;
break;
}
@@ -1151,13 +1011,13 @@ namespace SabreTools.Library.DatItems
continue;
// If it's a nodump, add and skip
if (file.ItemType == ItemType.Rom && ((Rom)file).ItemStatus == ItemStatus.Nodump)
if (file.ItemType == ItemType.Rom && (file as Rom).ItemStatus == ItemStatus.Nodump)
{
outfiles.Add(file);
nodumpCount++;
continue;
}
else if (file.ItemType == ItemType.Disk && ((Disk)file).ItemStatus == ItemStatus.Nodump)
else if (file.ItemType == ItemType.Disk && (file as Disk).ItemStatus == ItemStatus.Nodump)
{
outfiles.Add(file);
nodumpCount++;
@@ -1172,7 +1032,7 @@ namespace SabreTools.Library.DatItems
// Check if the rom is a duplicate
DupeType dupetype = 0x00;
DatItem saveditem = new Rom();
DatItem saveditem = new Blank();
int pos = -1;
for (int i = 0; i < outfiles.Count; i++)
{
@@ -1187,59 +1047,11 @@ namespace SabreTools.Library.DatItems
saveditem = lastrom;
pos = i;
// Roms have more infomration to save
if (file.ItemType == ItemType.Rom)
{
((Rom)saveditem).Size = (((Rom)saveditem).Size == -1 && ((Rom)file).Size != -1
? ((Rom)file).Size
: ((Rom)saveditem).Size);
((Rom)saveditem).CRC = (string.IsNullOrWhiteSpace(((Rom)saveditem).CRC) && !string.IsNullOrWhiteSpace(((Rom)file).CRC)
? ((Rom)file).CRC
: ((Rom)saveditem).CRC);
((Rom)saveditem).MD5 = (string.IsNullOrWhiteSpace(((Rom)saveditem).MD5) && !string.IsNullOrWhiteSpace(((Rom)file).MD5)
? ((Rom)file).MD5
: ((Rom)saveditem).MD5);
#if NET_FRAMEWORK
((Rom)saveditem).RIPEMD160 = (string.IsNullOrWhiteSpace(((Rom)saveditem).RIPEMD160) && !string.IsNullOrWhiteSpace(((Rom)file).RIPEMD160)
? ((Rom)file).RIPEMD160
: ((Rom)saveditem).RIPEMD160);
#endif
((Rom)saveditem).SHA1 = (string.IsNullOrWhiteSpace(((Rom)saveditem).SHA1) && !string.IsNullOrWhiteSpace(((Rom)file).SHA1)
? ((Rom)file).SHA1
: ((Rom)saveditem).SHA1);
((Rom)saveditem).SHA256 = (string.IsNullOrWhiteSpace(((Rom)saveditem).SHA256) && !string.IsNullOrWhiteSpace(((Rom)file).SHA256)
? ((Rom)file).SHA256
: ((Rom)saveditem).SHA256);
((Rom)saveditem).SHA384 = (string.IsNullOrWhiteSpace(((Rom)saveditem).SHA384) && !string.IsNullOrWhiteSpace(((Rom)file).SHA384)
? ((Rom)file).SHA384
: ((Rom)saveditem).SHA384);
((Rom)saveditem).SHA512 = (string.IsNullOrWhiteSpace(((Rom)saveditem).SHA512) && !string.IsNullOrWhiteSpace(((Rom)file).SHA512)
? ((Rom)file).SHA512
: ((Rom)saveditem).SHA512);
}
else if (file.ItemType == ItemType.Disk)
{
((Disk)saveditem).MD5 = (string.IsNullOrWhiteSpace(((Disk)saveditem).MD5) && !string.IsNullOrWhiteSpace(((Disk)file).MD5)
? ((Disk)file).MD5
: ((Disk)saveditem).MD5);
#if NET_FRAMEWORK
((Disk)saveditem).RIPEMD160 = (string.IsNullOrWhiteSpace(((Disk)saveditem).RIPEMD160) && !string.IsNullOrWhiteSpace(((Disk)file).RIPEMD160)
? ((Disk)file).RIPEMD160
: ((Disk)saveditem).RIPEMD160);
#endif
((Disk)saveditem).SHA1 = (string.IsNullOrWhiteSpace(((Disk)saveditem).SHA1) && !string.IsNullOrWhiteSpace(((Disk)file).SHA1)
? ((Disk)file).SHA1
: ((Disk)saveditem).SHA1);
((Disk)saveditem).SHA256 = (string.IsNullOrWhiteSpace(((Disk)saveditem).SHA256) && !string.IsNullOrWhiteSpace(((Disk)file).SHA256)
? ((Disk)file).SHA256
: ((Disk)saveditem).SHA256);
((Disk)saveditem).SHA384 = (string.IsNullOrWhiteSpace(((Disk)saveditem).SHA384) && !string.IsNullOrWhiteSpace(((Disk)file).SHA384)
? ((Disk)file).SHA384
: ((Disk)saveditem).SHA384);
((Disk)saveditem).SHA512 = (string.IsNullOrWhiteSpace(((Disk)saveditem).SHA512) && !string.IsNullOrWhiteSpace(((Disk)file).SHA512)
? ((Disk)file).SHA512
: ((Disk)saveditem).SHA512);
}
// Disks and Roms have more information to fill
if (file.ItemType == ItemType.Disk)
(saveditem as Disk).FillMissingInformation(file as Disk);
else if (file.ItemType == ItemType.Rom)
(saveditem as Rom).FillMissingInformation(file as Rom);
saveditem.DupeType = dupetype;
@@ -1370,29 +1182,9 @@ namespace SabreTools.Library.DatItems
private static string GetDuplicateSuffix(DatItem datItem)
{
if (datItem.ItemType == ItemType.Disk)
{
Disk disk = datItem as Disk;
if (string.IsNullOrWhiteSpace(disk.MD5))
return $"_{disk.MD5}";
else if (string.IsNullOrWhiteSpace(disk.SHA1))
return $"_{disk.SHA1}";
else
return "_1";
}
return (datItem as Disk).GetDuplicateSuffix();
else if (datItem.ItemType == ItemType.Rom)
{
Rom rom = datItem as Rom;
if (string.IsNullOrWhiteSpace(rom.CRC))
return $"_{rom.CRC}";
else if (string.IsNullOrWhiteSpace(rom.MD5))
return $"_{rom.MD5}";
else if (string.IsNullOrWhiteSpace(rom.SHA1))
return $"_{rom.SHA1}";
else
return "_1";
}
return (datItem as Rom).GetDuplicateSuffix();
return "_1";
}
@@ -1414,31 +1206,22 @@ namespace SabreTools.Library.DatItems
{
if (x.MachineName == y.MachineName)
{
if ((x.ItemType == ItemType.Rom || x.ItemType == ItemType.Disk) && (y.ItemType == ItemType.Rom || y.ItemType == ItemType.Disk))
// Special case for comparing a Disk or Rom to another item type
if ((x.ItemType == ItemType.Disk || x.ItemType == ItemType.Rom) ^ (y.ItemType == ItemType.Disk || y.ItemType == ItemType.Rom))
{
if (Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(x.Name)) == Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(y.Name)))
{
return nc.Compare(Path.GetFileName(Sanitizer.RemovePathUnsafeCharacters(x.Name)), Path.GetFileName(Sanitizer.RemovePathUnsafeCharacters(y.Name)));
}
if (x.ItemType == ItemType.Disk || x.ItemType == ItemType.Rom)
return -1;
else
return 1;
}
return nc.Compare(Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(x.Name)), Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(y.Name)));
}
else if ((x.ItemType == ItemType.Rom || x.ItemType == ItemType.Disk) && (y.ItemType != ItemType.Rom && y.ItemType != ItemType.Disk))
{
return -1;
}
else if ((x.ItemType != ItemType.Rom && x.ItemType != ItemType.Disk) && (y.ItemType == ItemType.Rom || y.ItemType == ItemType.Disk))
{
return 1;
}
// Otherwise, we compare names naturally
else
{
if (Path.GetDirectoryName(x.Name) == Path.GetDirectoryName(y.Name))
{
return nc.Compare(Path.GetFileName(x.Name), Path.GetFileName(y.Name));
}
if (Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(x.Name)) == Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(y.Name)))
return nc.Compare(Path.GetFileName(Sanitizer.RemovePathUnsafeCharacters(x.Name)), Path.GetFileName(Sanitizer.RemovePathUnsafeCharacters(y.Name)));
return nc.Compare(Path.GetDirectoryName(x.Name), Path.GetDirectoryName(y.Name));
return nc.Compare(Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(x.Name)), Path.GetDirectoryName(Sanitizer.RemovePathUnsafeCharacters(y.Name)));
}
}