Fix everything

This commit is contained in:
Matt Nadareski
2026-03-24 19:17:25 -04:00
parent e11a08b587
commit 8f49e190d8
206 changed files with 1202 additions and 1647 deletions

View File

@@ -5,6 +5,7 @@ using SabreTools.CommandLine;
using SabreTools.CommandLine.Inputs;
using SabreTools.Hashing;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using SabreTools.Wrappers;
namespace InfoPrint.Features

View File

@@ -79,6 +79,10 @@ Below are a list of the included namespaces with links to their README files:
- [SabreTools.Data.Extensions](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Data.Extensions)
- [SabreTools.Data.Models](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Data.Models)
- [SabreTools.Metadata](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Metadata)
- [SabreTools.Metadata.DatFiles](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Metadata.DatFiles)
- [SabreTools.Metadata.DatItems](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Metadata.Datitems)
- [SabreTools.Metadata.Filter](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Metadata.Filter)
- [SabreTools.ObjectIdentifier](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.ObjectIdentifier)
- [SabreTools.Serialization.CrossModel](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Serialization.CrossModel)
- [SabreTools.Serialization.Readers](https://github.com/SabreTools/SabreTools.Serialization/tree/main/SabreTools.Serialization.Readers)

View File

@@ -2,6 +2,7 @@ using System;
using System.IO;
using SabreTools.Data.Models.CDROM;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
namespace SabreTools.Data.Extensions
{

View File

@@ -2,6 +2,7 @@ using System;
using SabreTools.Data.Models.Metadata;
using SabreTools.Hashing;
using SabreTools.IO.Extensions;
using SabreTools.Matching;
namespace SabreTools.Data.Extensions
{

View File

@@ -178,7 +178,7 @@ namespace SabreTools.Data.Extensions
};
}
/// <summary>
/// <summary>
/// Convert a <see cref="TVSystemExtended"/> value to string
/// </summary>
public static string FromTVSystemExtended(this TVSystemExtended system)

View File

@@ -36,8 +36,8 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.Data.Models\SabreTools.Data.Models.csproj" />
<ProjectReference Include="..\SabreTools.ObjectIdentifier\SabreTools.ObjectIdentifier.csproj" />
<ProjectReference Include="..\SabreTools.Data.Models\SabreTools.Data.Models.csproj" />
<ProjectReference Include="..\SabreTools.ObjectIdentifier\SabreTools.ObjectIdentifier.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,5 +1,5 @@
using System;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
namespace SabreTools.Data.Extensions
{

View File

@@ -1,3 +1,5 @@
using SabreTools.Numerics;
namespace SabreTools.Data.Models.AACS
{
/// <summary>
@@ -23,6 +25,6 @@ namespace SabreTools.Data.Models.AACS
/// fields themselves. Record lengths are always multiples of 4 bytes.
/// </summary>
// <remarks>UInt24 not UInt32</remarks>
public uint RecordLength { get; set; }
public UInt24 RecordLength { get; set; } = new();
}
}

View File

@@ -717,7 +717,7 @@ namespace SabreTools.Metadata.DatFiles
}
// Now that every device reference is accounted for, add the new list of device references, if they don't already exist
foreach (string deviceReference in newDeviceReferences)
foreach (var deviceReference in newDeviceReferences)
{
if (!deviceReferences.Contains(deviceReference))
{
@@ -767,7 +767,7 @@ namespace SabreTools.Metadata.DatFiles
}
// Now that every device is accounted for, add the new list of slot options, if they don't already exist
foreach (string slotOption in newSlotOptions)
foreach (var slotOption in newSlotOptions)
{
if (!slotOptions.Contains(slotOption))
{
@@ -884,7 +884,7 @@ namespace SabreTools.Metadata.DatFiles
}
// Now that every device reference is accounted for, add the new list of device references, if they don't already exist
foreach (string deviceReference in newDeviceReferences)
foreach (var deviceReference in newDeviceReferences)
{
if (!deviceReferences.Contains(deviceReference))
{
@@ -940,7 +940,7 @@ namespace SabreTools.Metadata.DatFiles
}
// Now that every device is accounted for, add the new list of slot options, if they don't already exist
foreach (string slotOption in newSlotOptions)
foreach (var slotOption in newSlotOptions)
{
if (!slotOptions.Contains(slotOption))
{

View File

@@ -80,7 +80,7 @@ namespace SabreTools.Metadata.DatFiles
// Handle Trurip object, if it exists
if (machine.ContainsKey(Data.Models.Metadata.Machine.TruripKey))
{
var trurip = machine.Read<DatItems.Trurip>(Data.Models.Metadata.Machine.TruripKey);
var trurip = machine.Read<Trurip>(Data.Models.Metadata.Machine.TruripKey);
if (trurip is not null)
{
var truripItem = trurip.ConvertToLogiqx();
@@ -294,6 +294,9 @@ namespace SabreTools.Metadata.DatFiles
EnsureMachineKey<Data.Models.Metadata.Sound?>(machine, Data.Models.Metadata.Machine.SoundKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SoundKey, soundItem);
break;
default:
// This should never happen
break;
}
}
@@ -506,7 +509,7 @@ namespace SabreTools.Metadata.DatFiles
// Handle Trurip object, if it exists
if (machine.ContainsKey(Data.Models.Metadata.Machine.TruripKey))
{
var trurip = machine.Read<DatItems.Trurip>(Data.Models.Metadata.Machine.TruripKey);
var trurip = machine.Read<Trurip>(Data.Models.Metadata.Machine.TruripKey);
if (trurip is not null)
{
var truripItem = trurip.ConvertToLogiqx();
@@ -717,6 +720,9 @@ namespace SabreTools.Metadata.DatFiles
EnsureMachineKey<Data.Models.Metadata.Sound?>(machine, Data.Models.Metadata.Machine.SoundKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SoundKey, soundItem);
break;
default:
// This should never happen
break;
}
}
@@ -944,6 +950,9 @@ namespace SabreTools.Metadata.DatFiles
case 270:
videoItem[Data.Models.Metadata.Video.OrientationKey] = "vertical";
break;
default:
// This should never happen
break;
}
EnsureMachineKey<Data.Models.Metadata.Video?>(machine, Data.Models.Metadata.Machine.VideoKey);
@@ -1052,6 +1061,11 @@ namespace SabreTools.Metadata.DatFiles
EnsureMachineKey<Data.Models.Metadata.Dump?>(machine, Data.Models.Metadata.Machine.DumpKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DumpKey, dumpSccPlusCart);
break;
case OpenMSXSubType.NULL:
break;
default:
// This should never happen
break;
}
return romItem;

View File

@@ -3,13 +3,14 @@ using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.Tools;
using SabreTools.Hashing;
using SabreTools.Logging;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Hashing;
using SabreTools.IO.Logging;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Compare;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatFiles
{

View File

@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Metadata.Filter;
namespace SabreTools.Metadata.DatFiles.Formats
{

View File

@@ -0,0 +1,19 @@
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents a comma-separated value file
/// </summary>
public sealed class CommaSeparatedValue : SeparatedValue
{
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public CommaSeparatedValue(DatFile? datFile) : base(datFile)
{
_delim = ',';
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.CSV);
}
}
}

View File

@@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Hashing;
using SabreTools.Metadata.Filter;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
@@ -26,6 +23,7 @@ namespace SabreTools.Metadata.DatFiles.Formats
/// <param name="datFile">Parent DatFile to copy from</param>
public Hashfile(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA1;
}
/// <inheritdoc/>
@@ -78,524 +76,4 @@ namespace SabreTools.Metadata.DatFiles.Formats
return true;
}
}
/// <summary>
/// Represents an SFV (CRC-32) hashfile
/// </summary>
public sealed class SfvFile : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public SfvFile(DatFile? datFile) : base(datFile)
{
_hash = HashType.CRC32;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSFV);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.CRCKey)))
missingFields.Add(Data.Models.Metadata.Rom.CRCKey);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an MD2 hashfile
/// </summary>
public sealed class Md2File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Md2File(DatFile? datFile) : base(datFile)
{
_hash = HashType.MD2;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD2);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.MD2Key)))
missingFields.Add(Data.Models.Metadata.Rom.MD2Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an MD4 hashfile
/// </summary>
public sealed class Md4File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Md4File(DatFile? datFile) : base(datFile)
{
_hash = HashType.MD4;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD4);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.MD4Key)))
missingFields.Add(Data.Models.Metadata.Rom.MD4Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an MD5 hashfile
/// </summary>
public sealed class Md5File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Disk,
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Md5File(DatFile? datFile) : base(datFile)
{
_hash = HashType.MD5;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD5);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Disk disk:
if (string.IsNullOrEmpty(disk.GetStringFieldValue(Data.Models.Metadata.Disk.MD5Key)))
missingFields.Add(Data.Models.Metadata.Disk.MD5Key);
break;
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.MD5Key)))
missingFields.Add(Data.Models.Metadata.Media.MD5Key);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.MD5Key)))
missingFields.Add(Data.Models.Metadata.Rom.MD5Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an RIPEMD128 hashfile
/// </summary>
public sealed class RipeMD128File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public RipeMD128File(DatFile? datFile) : base(datFile)
{
_hash = HashType.RIPEMD128;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpRIPEMD128);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.RIPEMD128Key)))
missingFields.Add(Data.Models.Metadata.Rom.RIPEMD128Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an RIPEMD160 hashfile
/// </summary>
public sealed class RipeMD160File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public RipeMD160File(DatFile? datFile) : base(datFile)
{
_hash = HashType.RIPEMD160;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpRIPEMD160);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.RIPEMD160Key)))
missingFields.Add(Data.Models.Metadata.Rom.RIPEMD160Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an SHA-1 hashfile
/// </summary>
public sealed class Sha1File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Disk,
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha1File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA1;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA1);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Disk disk:
if (string.IsNullOrEmpty(disk.GetStringFieldValue(Data.Models.Metadata.Disk.SHA1Key)))
missingFields.Add(Data.Models.Metadata.Disk.SHA1Key);
break;
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.SHA1Key)))
missingFields.Add(Data.Models.Metadata.Media.SHA1Key);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA1Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA1Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an SHA-256 hashfile
/// </summary>
public sealed class Sha256File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha256File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA256;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA256);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.SHA256Key)))
missingFields.Add(Data.Models.Metadata.Media.SHA256Key);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA256Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA256Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an SHA-384 hashfile
/// </summary>
public sealed class Sha384File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha384File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA384;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA384);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA384Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA384Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an SHA-512 hashfile
/// </summary>
public sealed class Sha512File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha512File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA512;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA512);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA512Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA512Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
/// <summary>
/// Represents an SpamSum hashfile
/// </summary>
public sealed class SpamSumFile : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public SpamSumFile(DatFile? datFile) : base(datFile)
{
_hash = HashType.SpamSum;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSpamSum);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.SpamSumKey)))
missingFields.Add(Data.Models.Metadata.Media.SpamSumKey);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SpamSumKey)))
missingFields.Add(Data.Models.Metadata.Rom.SpamSumKey);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Metadata.Filter;
namespace SabreTools.Metadata.DatFiles.Formats
{

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an MD2 hashfile
/// </summary>
public sealed class Md2File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Md2File(DatFile? datFile) : base(datFile)
{
_hash = HashType.MD2;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD2);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.MD2Key)))
missingFields.Add(Data.Models.Metadata.Rom.MD2Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an MD4 hashfile
/// </summary>
public sealed class Md4File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Md4File(DatFile? datFile) : base(datFile)
{
_hash = HashType.MD4;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD4);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.MD4Key)))
missingFields.Add(Data.Models.Metadata.Rom.MD4Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,64 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an MD5 hashfile
/// </summary>
public sealed class Md5File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Disk,
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Md5File(DatFile? datFile) : base(datFile)
{
_hash = HashType.MD5;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD5);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Disk disk:
if (string.IsNullOrEmpty(disk.GetStringFieldValue(Data.Models.Metadata.Disk.MD5Key)))
missingFields.Add(Data.Models.Metadata.Disk.MD5Key);
break;
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.MD5Key)))
missingFields.Add(Data.Models.Metadata.Media.MD5Key);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.MD5Key)))
missingFields.Add(Data.Models.Metadata.Rom.MD5Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -2,8 +2,8 @@
using System.Collections.Generic;
using System.IO;
using System.Text;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.Filter;
namespace SabreTools.Metadata.DatFiles.Formats
{

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an RIPEMD128 hashfile
/// </summary>
public sealed class RipeMD128File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public RipeMD128File(DatFile? datFile) : base(datFile)
{
_hash = HashType.RIPEMD128;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpRIPEMD128);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.RIPEMD128Key)))
missingFields.Add(Data.Models.Metadata.Rom.RIPEMD128Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an RIPEMD160 hashfile
/// </summary>
public sealed class RipeMD160File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public RipeMD160File(DatFile? datFile) : base(datFile)
{
_hash = HashType.RIPEMD160;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpRIPEMD160);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.RIPEMD160Key)))
missingFields.Add(Data.Models.Metadata.Rom.RIPEMD160Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -6,9 +6,9 @@ using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Metadata.Filter;
namespace SabreTools.Metadata.DatFiles.Formats
{

View File

@@ -5,8 +5,8 @@ using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.Filter;
#pragma warning disable IDE0060 // Remove unused parameter
namespace SabreTools.Metadata.DatFiles.Formats

View File

@@ -0,0 +1,19 @@
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents a semicolon-separated value file
/// </summary>
public sealed class SemicolonSeparatedValue : SeparatedValue
{
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public SemicolonSeparatedValue(DatFile? datFile) : base(datFile)
{
_delim = ';';
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.SSV);
}
}
}

View File

@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Metadata.Filter;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
@@ -140,52 +140,4 @@ namespace SabreTools.Metadata.DatFiles.Formats
return true;
}
}
/// <summary>
/// Represents a comma-separated value file
/// </summary>
public sealed class CommaSeparatedValue : SeparatedValue
{
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public CommaSeparatedValue(DatFile? datFile) : base(datFile)
{
_delim = ',';
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.CSV);
}
}
/// <summary>
/// Represents a semicolon-separated value file
/// </summary>
public sealed class SemicolonSeparatedValue : SeparatedValue
{
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public SemicolonSeparatedValue(DatFile? datFile) : base(datFile)
{
_delim = ';';
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.SSV);
}
}
/// <summary>
/// Represents a tab-separated value file
/// </summary>
public sealed class TabSeparatedValue : SeparatedValue
{
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public TabSeparatedValue(DatFile? datFile) : base(datFile)
{
_delim = '\t';
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.TSV);
}
}
}

View File

@@ -1,6 +1,6 @@
using System;
using SabreTools.Metadata.Filter;
using SabreTools.Data.Models.Metadata;
using SabreTools.Metadata.Filter;
using SabreTools.Serialization.CrossModel;
using SabreTools.Serialization.Readers;
using SabreTools.Serialization.Writers;

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an SFV (CRC-32) hashfile
/// </summary>
public sealed class SfvFile : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public SfvFile(DatFile? datFile) : base(datFile)
{
_hash = HashType.CRC32;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSFV);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.CRCKey)))
missingFields.Add(Data.Models.Metadata.Rom.CRCKey);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,64 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an SHA-1 hashfile
/// </summary>
public sealed class Sha1File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Disk,
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha1File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA1;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA1);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Disk disk:
if (string.IsNullOrEmpty(disk.GetStringFieldValue(Data.Models.Metadata.Disk.SHA1Key)))
missingFields.Add(Data.Models.Metadata.Disk.SHA1Key);
break;
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.SHA1Key)))
missingFields.Add(Data.Models.Metadata.Media.SHA1Key);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA1Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA1Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,58 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an SHA-256 hashfile
/// </summary>
public sealed class Sha256File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha256File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA256;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA256);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.SHA256Key)))
missingFields.Add(Data.Models.Metadata.Media.SHA256Key);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA256Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA256Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an SHA-384 hashfile
/// </summary>
public sealed class Sha384File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha384File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA384;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA384);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA384Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA384Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an SHA-512 hashfile
/// </summary>
public sealed class Sha512File : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public Sha512File(DatFile? datFile) : base(datFile)
{
_hash = HashType.SHA512;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA512);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SHA512Key)))
missingFields.Add(Data.Models.Metadata.Rom.SHA512Key);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,58 @@
using System.Collections.Generic;
using SabreTools.Hashing;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents an SpamSum hashfile
/// </summary>
public sealed class SpamSumFile : Hashfile
{
/// <inheritdoc/>
public override ItemType[] SupportedTypes
=> [
ItemType.Media,
ItemType.Rom,
];
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public SpamSumFile(DatFile? datFile) : base(datFile)
{
_hash = HashType.SpamSum;
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSpamSum);
}
/// <inheritdoc/>
protected internal override List<string>? GetMissingRequiredFields(DatItem datItem)
{
List<string> missingFields = [];
// Check item name
if (string.IsNullOrEmpty(datItem.GetName()))
missingFields.Add(Data.Models.Metadata.Rom.NameKey);
#pragma warning disable IDE0010
switch (datItem)
{
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Data.Models.Metadata.Media.SpamSumKey)))
missingFields.Add(Data.Models.Metadata.Media.SpamSumKey);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Data.Models.Metadata.Rom.SpamSumKey)))
missingFields.Add(Data.Models.Metadata.Rom.SpamSumKey);
break;
}
#pragma warning restore IDE0010
return missingFields;
}
}
}

View File

@@ -0,0 +1,19 @@
#pragma warning disable IDE0290 // Use primary constructor
namespace SabreTools.Metadata.DatFiles.Formats
{
/// <summary>
/// Represents a tab-separated value file
/// </summary>
public sealed class TabSeparatedValue : SeparatedValue
{
/// <summary>
/// Constructor designed for casting a base DatFile
/// </summary>
/// <param name="datFile">Parent DatFile to copy from</param>
public TabSeparatedValue(DatFile? datFile) : base(datFile)
{
_delim = '\t';
Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.TSV);
}
}
}

View File

@@ -8,12 +8,12 @@ using System.Threading.Tasks;
#endif
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Metadata.Tools;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Hashing;
using SabreTools.IO.Logging;
using SabreTools.Logging;
using SabreTools.Text.Compare;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatFiles
{

View File

@@ -10,12 +10,12 @@ using System.Threading.Tasks;
#endif
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Metadata.Tools;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Hashing;
using SabreTools.IO.Logging;
using SabreTools.Logging;
using SabreTools.Text.Compare;
using SabreTools.Text.Extensions;
/*
* Planning Notes:
@@ -685,9 +685,7 @@ namespace SabreTools.Metadata.DatFiles
/// </summary>
public void Deduplicate()
{
#if NET452_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
Parallel.ForEach(SortedKeys, Core.Globals.ParallelOptions, key =>
#elif NET40_OR_GREATER
#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
Parallel.ForEach(SortedKeys, key =>
#else
foreach (var key in SortedKeys)
@@ -1067,9 +1065,7 @@ namespace SabreTools.Metadata.DatFiles
// Get the current list of item indicies
long[] itemIndicies = [.. _items.Keys];
#if NET452_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
Parallel.For(0, itemIndicies.Length, Core.Globals.ParallelOptions, i =>
#elif NET40_OR_GREATER
#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
Parallel.For(0, itemIndicies.Length, i =>
#else
for (int i = 0; i < itemIndicies.Length; i++)
@@ -1116,9 +1112,7 @@ namespace SabreTools.Metadata.DatFiles
// Get the current list of bucket keys
string[] bucketKeys = [.. _buckets.Keys];
#if NET452_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
Parallel.For(0, bucketKeys.Length, Core.Globals.ParallelOptions, i =>
#elif NET40_OR_GREATER
#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
Parallel.For(0, bucketKeys.Length, i =>
#else
for (int i = 0; i < bucketKeys.Length; i++)

View File

@@ -0,0 +1,3 @@
# SabreTools.Metadata.DatFiles
This library contains wrapper classes and functionality for various metadata file formats.

View File

@@ -35,19 +35,22 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.Data.Extensions\SabreTools.Data.Extensions.csproj" />
<ProjectReference Include="..\SabreTools.Metadata\SabreTools.Metadata.csproj" />
<ProjectReference Include="..\SabreTools.Metadata.DatItems\SabreTools.Metadata.DatItems.csproj" />
<ProjectReference Include="..\SabreTools.Metadata.Filter\SabreTools.Metadata.Filter.csproj" />
<ProjectReference Include="..\SabreTools.Serialization.CrossModel\SabreTools.Serialization.CrossModel.csproj" />
<ProjectReference Include="..\SabreTools.Serialization.Readers\SabreTools.Serialization.Readers.csproj" />
<ProjectReference Include="..\SabreTools.Serialization.Writers\SabreTools.Serialization.Writers.csproj" />
<ProjectReference Include="..\SabreTools.Data.Extensions\SabreTools.Data.Extensions.csproj" />
<ProjectReference Include="..\SabreTools.Metadata\SabreTools.Metadata.csproj" />
<ProjectReference Include="..\SabreTools.Metadata.DatItems\SabreTools.Metadata.DatItems.csproj" />
<ProjectReference Include="..\SabreTools.Metadata.Filter\SabreTools.Metadata.Filter.csproj" />
<ProjectReference Include="..\SabreTools.Serialization.CrossModel\SabreTools.Serialization.CrossModel.csproj" />
<ProjectReference Include="..\SabreTools.Serialization.Readers\SabreTools.Serialization.Readers.csproj" />
<ProjectReference Include="..\SabreTools.Serialization.Writers\SabreTools.Serialization.Writers.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="SabreTools.Hashing" Version="[2.0.0]" />
<PackageReference Include="SabreTools.IO" Version="[2.0.0]" />
<PackageReference Include="MinValueTupleBridge" Version="0.2.1" Condition="$(TargetFramework.StartsWith(`net2`)) OR $(TargetFramework.StartsWith(`net3`))" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="SabreTools.Hashing" Version="[2.0.0]" />
<PackageReference Include="SabreTools.IO" Version="[2.0.0]" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" Condition="$(TargetFramework.StartsWith(`net40`)) OR $(TargetFramework.StartsWith(`net45`))" />
<PackageReference Include="System.ValueTuple" Version="4.6.1" Condition="$(TargetFramework.StartsWith(`net46`)) OR $(TargetFramework.StartsWith(`net47`)) OR $(TargetFramework.StartsWith(`net48`))" />
</ItemGroup>
</Project>

View File

@@ -3,7 +3,7 @@ using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
using SabreTools.Hashing;
using SabreTools.IO.Logging;
using SabreTools.Logging;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Metadata.Filter;

View File

@@ -2,6 +2,7 @@
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatItems.Formats
{

View File

@@ -1,6 +1,7 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatItems.Formats
{

View File

@@ -4,7 +4,7 @@ using Newtonsoft.Json;
using SabreTools.Data.Extensions;
using SabreTools.Hashing;
using SabreTools.IO.Extensions;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
// TODO: Add item mappings for all fields
namespace SabreTools.Metadata.DatItems.Formats

View File

@@ -1,7 +1,7 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatItems.Formats
{

View File

@@ -2,6 +2,7 @@
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatItems.Formats
{

View File

@@ -4,6 +4,7 @@ using Newtonsoft.Json;
using SabreTools.Data.Extensions;
using SabreTools.Metadata.Filter;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatItems
{

View File

@@ -0,0 +1,3 @@
# SabreTools.Metadata.DatItems
This library contains wrapper classes and functionality for various metadata item formats.

View File

@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using SabreTools.IO.Logging;
using SabreTools.IO.Readers;
using SabreTools.Logging;
using SabreTools.Text.INI;
namespace SabreTools.Metadata.Filter
{
@@ -63,7 +63,7 @@ namespace SabreTools.Metadata.Filter
return false;
// Prepare all internal variables
var ir = new IniReader(iniPath) { ValidateRows = false };
var ir = new Reader(iniPath) { ValidateRows = false };
bool foundRootFolder = false;
// If we got a null reader, just return
@@ -79,11 +79,11 @@ namespace SabreTools.Metadata.Filter
ir.ReadNextLine();
// We don't care about whitespace or comments
if (ir.RowType == IniRowType.None || ir.RowType == IniRowType.Comment)
if (ir.RowType == RowType.None || ir.RowType == RowType.Comment)
continue;
// If we have a section, just read it in
if (ir.RowType == IniRowType.SectionHeader)
if (ir.RowType == RowType.SectionHeader)
{
// If we've found the start of the extras, set the flag
if (string.Equals(ir.Section, "ROOT_FOLDER", StringComparison.OrdinalIgnoreCase))

View File

@@ -2,6 +2,7 @@ using System;
using System.Text.RegularExpressions;
using SabreTools.Data.Models.Metadata;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.Filter
{

View File

@@ -0,0 +1,3 @@
# SabreTools.Metadata.Filter
This library contains filtering functionality used by metadata format processing.

View File

@@ -2,6 +2,7 @@ using System;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Metadata.Tools;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata
{

View File

@@ -0,0 +1,3 @@
# SabreTools.Metadata
This library contains common code used across multiple metadata file operations.

View File

@@ -1,264 +0,0 @@
using System;
namespace SabreTools.Metadata.Tools
{
// TODO: Replace when IO is updated
public static class NumberHelper
{
#region Constants
#region Byte (1000-based) size comparisons
private const long KiloByte = 1000;
private static readonly long MegaByte = (long)Math.Pow(KiloByte, 2);
private static readonly long GigaByte = (long)Math.Pow(KiloByte, 3);
private static readonly long TeraByte = (long)Math.Pow(KiloByte, 4);
private static readonly long PetaByte = (long)Math.Pow(KiloByte, 5);
// The following are too big to be represented in Int64
// private readonly static long ExaByte = (long)Math.Pow(KiloByte, 6);
// private readonly static long ZettaByte = (long)Math.Pow(KiloByte, 7);
// private readonly static long YottaByte = (long)Math.Pow(KiloByte, 8);
#endregion
#region Byte (1024-based) size comparisons
private const long KibiByte = 1024;
private static readonly long MibiByte = (long)Math.Pow(KibiByte, 2);
private static readonly long GibiByte = (long)Math.Pow(KibiByte, 3);
private static readonly long TibiByte = (long)Math.Pow(KibiByte, 4);
private static readonly long PibiByte = (long)Math.Pow(KibiByte, 5);
// The following are too big to be represented in Int64
// private readonly static long ExiByte = (long)Math.Pow(KibiByte, 6);
// private readonly static long ZittiByte = (long)Math.Pow(KibiByte, 7);
// private readonly static long YittiByte = (long)Math.Pow(KibiByte, 8);
#endregion
#endregion
/// <summary>
/// Convert a string to a Double
/// </summary>
public static double? ConvertToDouble(string? numeric)
{
// If we don't have a valid string, we can't do anything
if (string.IsNullOrEmpty(numeric))
return null;
if (!double.TryParse(numeric, out double doubleValue))
return null;
return doubleValue;
}
/// <summary>
/// Convert a string to an Int64
/// </summary>
public static long? ConvertToInt64(string? numeric)
{
// If we don't have a valid string, we can't do anything
if (string.IsNullOrEmpty(numeric))
return null;
// Normalize the string for easier comparison
numeric = numeric!.ToLowerInvariant();
// Parse the numeric string, if possible
if (numeric.StartsWith("0x"))
{
return Convert.ToInt64(numeric.Substring(2), 16);
}
else
{
// Get the multiplication modifier and trim characters
long multiplier = DetermineMultiplier(numeric);
numeric = numeric.TrimEnd(['k', 'm', 'g', 't', 'p', 'e', 'z', 'y', 'i', 'b', ' ']);
// Apply the multiplier and return
if (!long.TryParse(numeric, out long longValue))
return null;
return longValue * multiplier;
}
}
/// <summary>
/// Determine the multiplier from a numeric string
/// </summary>
public static long DetermineMultiplier(string? numeric)
{
if (string.IsNullOrEmpty(numeric))
return 0;
long multiplier = 1;
if (numeric!.EndsWith("k") || numeric.EndsWith("kb"))
multiplier = KiloByte;
else if (numeric.EndsWith("ki") || numeric.EndsWith("kib"))
multiplier = KibiByte;
else if (numeric.EndsWith("m") || numeric.EndsWith("mb"))
multiplier = MegaByte;
else if (numeric.EndsWith("mi") || numeric.EndsWith("mib"))
multiplier = MibiByte;
else if (numeric.EndsWith("g") || numeric.EndsWith("gb"))
multiplier = GigaByte;
else if (numeric.EndsWith("gi") || numeric.EndsWith("gib"))
multiplier = GibiByte;
else if (numeric.EndsWith("t") || numeric.EndsWith("tb"))
multiplier = TeraByte;
else if (numeric.EndsWith("ti") || numeric.EndsWith("tib"))
multiplier = TibiByte;
else if (numeric.EndsWith("p") || numeric.EndsWith("pb"))
multiplier = PetaByte;
else if (numeric.EndsWith("pi") || numeric.EndsWith("pib"))
multiplier = PibiByte;
// The following are too big to be represented in Int64
// else if (numeric.EndsWith("e") || numeric.EndsWith("eb"))
// multiplier = ExaByte;
// else if (numeric.EndsWith("ei") || numeric.EndsWith("eib"))
// multiplier = ExiByte;
// else if (numeric.EndsWith("z") || numeric.EndsWith("zb"))
// multiplier = ZettaByte;
// else if (numeric.EndsWith("zi") || numeric.EndsWith("zib"))
// multiplier = ZittiByte;
// else if (numeric.EndsWith("y") || numeric.EndsWith("yb"))
// multiplier = YottaByte;
// else if (numeric.EndsWith("yi") || numeric.EndsWith("yib"))
// multiplier = YittiByte;
return multiplier;
}
/// <summary>
/// Determine if a string is fully numeric or not
/// </summary>
public static bool IsNumeric(string? value)
{
// If we have no value, it is not numeric
if (string.IsNullOrEmpty(value))
return false;
// If we have a hex value
value = value!.ToLowerInvariant();
if (value.StartsWith("0x"))
value = value.Substring(2);
// If we have a negative value
if (value.StartsWith("-"))
value = value.Substring(1);
// If the value has a multiplier
if (DetermineMultiplier(value) > 1)
value = value.TrimEnd(['k', 'm', 'g', 't', 'p', 'e', 'z', 'y', 'i', 'b', ' ']);
// If the value is empty after trimming
if (value.Length == 0)
return false;
// Otherwise, make sure that every character is a proper match
for (int i = 0; i < value.Length; i++)
{
char c = value[i];
#if NET7_0_OR_GREATER
if (!char.IsAsciiHexDigit(c) && c != '.' && c != ',')
#else
if (!c.IsAsciiHexDigit() && c != '.' && c != ',')
#endif
return false;
}
return true;
}
/// <summary>
/// Returns the human-readable file size for an arbitrary, 64-bit file size
/// The default format is "0.### XB", e.g. "4.2 KB" or "1.434 GB".
/// </summary>
/// <link>http://www.somacon.com/p576.php</link>
/// <remarks>This uses 1024-byte partitions, not 1000-byte</remarks>
public static string GetBytesReadable(long input)
{
// Get absolute value
long absolute_i = input < 0 ? -input : input;
// Determine the suffix and readable value
string suffix;
double readable;
if (absolute_i >= 0x1000_0000_0000_0000) // Exabyte
{
suffix = "EB";
readable = input >> 50;
}
else if (absolute_i >= 0x4_0000_0000_0000) // Petabyte
{
suffix = "PB";
readable = input >> 40;
}
else if (absolute_i >= 0x100_0000_0000) // Terabyte
{
suffix = "TB";
readable = input >> 30;
}
else if (absolute_i >= 0x4000_0000) // Gigabyte
{
suffix = "GB";
readable = input >> 20;
}
else if (absolute_i >= 0x10_0000) // Megabyte
{
suffix = "MB";
readable = input >> 10;
}
else if (absolute_i >= 0x400) // Kilobyte
{
suffix = "KB";
readable = input;
}
else
{
return input.ToString("0 B"); // Byte
}
// Divide by 1024 to get fractional value
readable /= 1024;
// Return formatted number with suffix
return readable.ToString("0.### ") + suffix;
}
#if NETFRAMEWORK || NETCOREAPP3_1 || NET5_0 || NET6_0 || NETSTANDARD2_0_OR_GREATER
/// <summary>
/// Indicates whether a character is categorized as an ASCII hexademical digit.
/// </summary>
/// <param name="c">The character to evaluate.</param>
/// <returns>true if c is a hexademical digit; otherwise, false.</returns>
/// <remarks>This method determines whether the character is in the range '0' through '9', inclusive, 'A' through 'F', inclusive, or 'a' through 'f', inclusive.</remarks>
internal static bool IsAsciiHexDigit(this char c)
{
return char.ToLowerInvariant(c) switch
{
'0' => true,
'1' => true,
'2' => true,
'3' => true,
'4' => true,
'5' => true,
'6' => true,
'7' => true,
'8' => true,
'9' => true,
'a' => true,
'b' => true,
'c' => true,
'd' => true,
'e' => true,
'f' => true,
_ => false,
};
}
#endif
}
}

View File

@@ -1,302 +0,0 @@
using System;
using System.IO;
using System.Text.RegularExpressions;
using SabreTools.Hashing;
namespace SabreTools.Metadata.Tools
{
// TODO: Replace when IO is updated
public static class TextHelper
{
#region Normalization
/// <summary>
/// Normalize a string to the WoD standard
/// </summary>
public static string? NormalizeCharacters(string? input)
{
if (string.IsNullOrEmpty(input))
return input;
///Run the name through the filters to make sure that it's correct
input = NormalizeChars(input!);
input = RussianToLatin(input);
input = SearchPattern(input);
input = new Regex(@"(([[(].*[\)\]] )?([^([]+))", RegexOptions.Compiled).Match(input).Groups[1].Value;
input = input.TrimStart().TrimEnd();
return input;
}
/// <summary>
/// Normalize a CRC32 string and pad to the correct size
/// </summary>
public static string? NormalizeCRC32(string? hash)
=> NormalizeHashData(hash, Constants.CRCLength);
/// <summary>
/// Normalize a MD2 string and pad to the correct size
/// </summary>
/// <remarks>MD2 is the same length as MD5</remarks>
public static string? NormalizeMD2(string? hash)
=> NormalizeHashData(hash, Constants.MD5Length);
/// <summary>
/// Normalize a MD4 string and pad to the correct size
/// </summary>
/// <remarks>MD4 is the same length as MD5</remarks>
public static string? NormalizeMD4(string? hash)
=> NormalizeHashData(hash, Constants.MD5Length);
/// <summary>
/// Normalize a MD5 string and pad to the correct size
/// </summary>
public static string? NormalizeMD5(string? hash)
=> NormalizeHashData(hash, Constants.MD5Length);
/// <summary>
/// Normalize a RIPEMD128 string and pad to the correct size
/// </summary>
public static string? NormalizeRIPEMD128(string? hash)
=> NormalizeHashData(hash, Constants.MD5Length);
/// <summary>
/// Normalize a RIPEMD160 string and pad to the correct size
/// </summary>
public static string? NormalizeRIPEMD160(string? hash)
=> NormalizeHashData(hash, Constants.SHA1Length);
/// <summary>
/// Normalize a SHA1 string and pad to the correct size
/// </summary>
public static string? NormalizeSHA1(string? hash)
=> NormalizeHashData(hash, Constants.SHA1Length);
/// <summary>
/// Normalize a SHA256 string and pad to the correct size
/// </summary>
public static string? NormalizeSHA256(string? hash)
=> NormalizeHashData(hash, Constants.SHA256Length);
/// <summary>
/// Normalize a SHA384 string and pad to the correct size
/// </summary>
public static string? NormalizeSHA384(string? hash)
=> NormalizeHashData(hash, Constants.SHA384Length);
/// <summary>
/// Normalize a SHA512 string and pad to the correct size
/// </summary>
public static string? NormalizeSHA512(string? hash)
=> NormalizeHashData(hash, Constants.SHA512Length);
/// <summary>
/// Remove all chars that are considered path unsafe
/// </summary>
public static string RemovePathUnsafeCharacters(string? input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
foreach (char invalid in Path.GetInvalidPathChars())
{
input = input!.Replace(invalid.ToString(), string.Empty);
}
return input!;
}
/// <summary>
/// Remove all Unicode-specific chars from a string
/// </summary>
/// <remarks>
/// "Unicode characters" here means any characters outside of the
/// Extended ASCII (0x00 to 0xFF) set. This is just a simple
/// way of filtering out characters that won't work on all
/// supported platforms.
/// </remarks>
public static string RemoveUnicodeCharacters(string? input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
return new string(Array.FindAll(input!.ToCharArray(), c => c <= 255));
}
#endregion
#region Helpers
/// <summary>
/// Replace accented characters
/// </summary>
private static string NormalizeChars(string input)
{
string[,] charmap = {
{ "Á", "A" }, { "á", "a" },
{ "À", "A" }, { "à", "a" },
{ "Â", "A" }, { "â", "a" },
{ "Ä", "Ae" }, { "ä", "ae" },
{ "Ã", "A" }, { "ã", "a" },
{ "Å", "A" }, { "å", "a" },
{ "Æ", "Ae" }, { "æ", "ae" },
{ "Ç", "C" }, { "ç", "c" },
{ "Ð", "D" }, { "ð", "d" },
{ "É", "E" }, { "é", "e" },
{ "È", "E" }, { "è", "e" },
{ "Ê", "E" }, { "ê", "e" },
{ "Ë", "E" }, { "ë", "e" },
{ "ƒ", "f" },
{ "Í", "I" }, { "í", "i" },
{ "Ì", "I" }, { "ì", "i" },
{ "Î", "I" }, { "î", "i" },
{ "Ï", "I" }, { "ï", "i" },
{ "Ñ", "N" }, { "ñ", "n" },
{ "Ó", "O" }, { "ó", "o" },
{ "Ò", "O" }, { "ò", "o" },
{ "Ô", "O" }, { "ô", "o" },
{ "Ö", "Oe" }, { "ö", "oe" },
{ "Õ", "O" }, { "õ", "o" },
{ "Ø", "O" }, { "ø", "o" },
{ "Š", "S" }, { "š", "s" },
{ "ß", "ss" },
{ "Þ", "B" }, { "þ", "b" },
{ "Ú", "U" }, { "ú", "u" },
{ "Ù", "U" }, { "ù", "u" },
{ "Û", "U" }, { "û", "u" },
{ "Ü", "Ue" }, { "ü", "ue" },
{ "ÿ", "y" },
{ "Ý", "Y" }, { "ý", "y" },
{ "Ž", "Z" }, { "ž", "z" },
};
for (int i = 0; i < charmap.GetLength(0); i++)
{
input = input.Replace(charmap[i, 0], charmap[i, 1]);
}
return input;
}
/// <summary>
/// Normalize a hash string and pad to the correct size
/// </summary>
private static string? NormalizeHashData(string? hash, int expectedLength)
{
// If we have a known blank hash, return blank
if (hash is null)
return null;
else if (hash == string.Empty || hash == "-" || hash == "_")
return string.Empty;
// Check to see if it's a "hex" hash
hash = hash!.Trim().Replace("0x", string.Empty);
// If we have a blank hash now, return blank
if (string.IsNullOrEmpty(hash))
return string.Empty;
// If the hash shorter than the required length, pad it
if (hash.Length < expectedLength)
hash = hash.PadLeft(expectedLength, '0');
// If the hash is longer than the required length, it's invalid
else if (hash.Length > expectedLength)
return string.Empty;
// Now normalize the hash
hash = hash.ToLowerInvariant();
// Otherwise, make sure that every character is a proper match
for (int i = 0; i < hash.Length; i++)
{
char c = hash[i];
#if NET7_0_OR_GREATER
if (!char.IsAsciiHexDigit(c))
#else
if (!c.IsAsciiHexDigit())
#endif
{
hash = string.Empty;
break;
}
}
return hash;
}
/// <summary>
/// Convert Cyrillic lettering to Latin lettering
/// </summary>
private static string RussianToLatin(string input)
{
string[,] charmap = {
{ "А", "A" }, { "Б", "B" }, { "В", "V" }, { "Г", "G" }, { "Д", "D" },
{ "Е", "E" }, { "Ё", "Yo" }, { "Ж", "Zh" }, { "З", "Z" }, { "И", "I" },
{ "Й", "J" }, { "К", "K" }, { "Л", "L" }, { "М", "M" }, { "Н", "N" },
{ "О", "O" }, { "П", "P" }, { "Р", "R" }, { "С", "S" }, { "Т", "T" },
{ "У", "U" }, { "Ф", "f" }, { "Х", "Kh" }, { "Ц", "Ts" }, { "Ч", "Ch" },
{ "Ш", "Sh" }, { "Щ", "Sch" }, { "Ъ", string.Empty }, { "Ы", "y" }, { "Ь", string.Empty },
{ "Э", "e" }, { "Ю", "yu" }, { "Я", "ya" }, { "а", "a" }, { "б", "b" },
{ "в", "v" }, { "г", "g" }, { "д", "d" }, { "е", "e" }, { "ё", "yo" },
{ "ж", "zh" }, { "з", "z" }, { "и", "i" }, { "й", "j" }, { "к", "k" },
{ "л", "l" }, { "м", "m" }, { "н", "n" }, { "о", "o" }, { "п", "p" },
{ "р", "r" }, { "с", "s" }, { "т", "t" }, { "у", "u" }, { "ф", "f" },
{ "х", "kh" }, { "ц", "ts" }, { "ч", "ch" }, { "ш", "sh" }, { "щ", "sch" },
{ "ъ", string.Empty }, { "ы", "y" }, { "ь", string.Empty }, { "э", "e" }, { "ю", "yu" },
{ "я", "ya" },
};
for (int i = 0; i < charmap.GetLength(0); i++)
{
input = input.Replace(charmap[i, 0], charmap[i, 1]);
}
return input;
}
/// <summary>
/// Replace special characters and patterns
/// </summary>
private static string SearchPattern(string input)
{
string[,] charmap = {
{ @"~", " - " },
{ @"_", " " },
{ @":", " " },
{ @">", ")" },
{ @"<", "(" },
{ @"\|", "-" },
{ "\"", "'" },
{ @"\*", "." },
{ @"\\", "-" },
{ @"/", "-" },
{ @"\?", " " },
{ @"\(([^)(]*)\(([^)]*)\)([^)(]*)\)", " " },
{ @"\(([^)]+)\)", " " },
{ @"\[([^]]+)\]", " " },
{ @"\{([^}]+)\}", " " },
{ @"(ZZZJUNK|ZZZ-UNK-|ZZZ-UNK |zzz unknow |zzz unk |Copy of |[.][a-z]{3}[.][a-z]{3}[.]|[.][a-z]{3}[.])", " " },
{ @" (r|rev|v|ver)\s*[\d\.]+[^\s]*", " " },
{ @"(( )|(\A))(\d{6}|\d{8})(( )|(\Z))", " " },
{ @"(( )|(\A))(\d{1,2})-(\d{1,2})-(\d{4}|\d{2})", " " },
{ @"(( )|(\A))(\d{4}|\d{2})-(\d{1,2})-(\d{1,2})", " " },
{ @"[-]+", "-" },
{ @"\A\s*\)", " " },
{ @"\A\s*(,|-)", " " },
{ @"\s+", " " },
{ @"\s+,", "," },
{ @"\s*(,|-)\s*\Z", " " },
};
for (int i = 0; i < charmap.GetLength(0); i++)
{
input = Regex.Replace(input, charmap[i, 0], charmap[i, 1]);
}
return input;
}
#endregion
}
}

View File

@@ -1,6 +1,6 @@
using System.IO;
using SabreTools.Hashing;
using SabreTools.IO.Extensions;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.Tools
{
@@ -34,14 +34,14 @@ namespace SabreTools.Metadata.Tools
return null;
// If the hash isn't the right size, then we return null
if (hash!.Length != Constants.SHA1Length)
if (hash!.Length != HashType.SHA1.ZeroString.Length)
return null;
// Cap the depth between 0 and 20, for now
if (depth < 0)
depth = 0;
else if (depth > ZeroHash.SHA1Arr.Length)
depth = ZeroHash.SHA1Arr.Length;
else if (depth > HashType.SHA1.ZeroBytes.Length)
depth = HashType.SHA1.ZeroBytes.Length;
// Loop through and generate the subdirectory
string path = string.Empty;

View File

@@ -218,21 +218,26 @@ namespace SabreTools.Serialization.CrossModel.Test
/// </summary>
private static Data.Models.Hashfile.Hashfile Build(HashType hashType)
{
#pragma warning disable IDE0072
return hashType switch
{
HashType.CRC32 => new Data.Models.Hashfile.Hashfile { SFV = [new Data.Models.Hashfile.SFV { File = "XXXXXX", Hash = "XXXXXX" }] },
HashType.MD2 => new Data.Models.Hashfile.Hashfile { MD2 = [new Data.Models.Hashfile.MD2 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD4 => new Data.Models.Hashfile.Hashfile { MD4 = [new Data.Models.Hashfile.MD4 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD5 => new Data.Models.Hashfile.Hashfile { MD5 = [new Data.Models.Hashfile.MD5 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA1 => new Data.Models.Hashfile.Hashfile { SHA1 = [new Data.Models.Hashfile.SHA1 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA256 => new Data.Models.Hashfile.Hashfile { SHA256 = [new Data.Models.Hashfile.SHA256 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA384 => new Data.Models.Hashfile.Hashfile { SHA384 = [new Data.Models.Hashfile.SHA384 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA512 => new Data.Models.Hashfile.Hashfile { SHA512 = [new Data.Models.Hashfile.SHA512 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SpamSum => new Data.Models.Hashfile.Hashfile { SpamSum = [new Data.Models.Hashfile.SpamSum { Hash = "XXXXXX", File = "XXXXXX" }] },
_ => throw new ArgumentOutOfRangeException(nameof(hashType)),
};
#pragma warning restore IDE0072
if (hashType == HashType.CRC32)
return new Data.Models.Hashfile.Hashfile { SFV = [new Data.Models.Hashfile.SFV { File = "XXXXXX", Hash = "XXXXXX" }] };
else if (hashType == HashType.MD2)
return new Data.Models.Hashfile.Hashfile { MD2 = [new Data.Models.Hashfile.MD2 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.MD4)
return new Data.Models.Hashfile.Hashfile { MD4 = [new Data.Models.Hashfile.MD4 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.MD5)
return new Data.Models.Hashfile.Hashfile { MD5 = [new Data.Models.Hashfile.MD5 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA1)
return new Data.Models.Hashfile.Hashfile { SHA1 = [new Data.Models.Hashfile.SHA1 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA256)
return new Data.Models.Hashfile.Hashfile { SHA256 = [new Data.Models.Hashfile.SHA256 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA384)
return new Data.Models.Hashfile.Hashfile { SHA384 = [new Data.Models.Hashfile.SHA384 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA512)
return new Data.Models.Hashfile.Hashfile { SHA512 = [new Data.Models.Hashfile.SHA512 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SpamSum)
return new Data.Models.Hashfile.Hashfile { SpamSum = [new Data.Models.Hashfile.SpamSum { Hash = "XXXXXX", File = "XXXXXX" }] };
else
throw new ArgumentOutOfRangeException(nameof(hashType));
}
/// <summary>

View File

@@ -36,7 +36,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.Data.Models\SabreTools.Data.Models.csproj" />
<ProjectReference Include="..\SabreTools.Data.Models\SabreTools.Data.Models.csproj" />
</ItemGroup>
</Project>

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new ArchiveDotOrg();
var serializer = new Serialization.Writers.ArchiveDotOrg();
var serializer = new Writers.ArchiveDotOrg();
// Build the data
Data.Models.ArchiveDotOrg.Files files = Build();

View File

@@ -75,7 +75,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new AttractMode();
var serializer = new Serialization.Writers.AttractMode();
var serializer = new Writers.AttractMode();
// Build the data
Data.Models.AttractMode.MetadataFile mf = Build();
@@ -100,7 +100,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new AttractMode();
var serializer = new Serialization.Writers.AttractMode();
var serializer = new Writers.AttractMode();
// Build the data
Data.Models.AttractMode.MetadataFile mf = Build();
@@ -167,9 +167,9 @@ namespace SabreTools.Serialization.Readers.Test
{
Assert.NotNull(header);
if (longHeader)
Assert.True(Serialization.Writers.AttractMode.HeaderArrayWithRomname.SequenceEqual(header));
Assert.True(Writers.AttractMode.HeaderArrayWithRomname.SequenceEqual(header));
else
Assert.True(Serialization.Writers.AttractMode.HeaderArrayWithoutRomname.SequenceEqual(header));
Assert.True(Writers.AttractMode.HeaderArrayWithoutRomname.SequenceEqual(header));
}
/// <summary>

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new ClrMamePro();
var serializer = new Serialization.Writers.ClrMamePro();
var serializer = new Writers.ClrMamePro();
// Build the data
Data.Models.ClrMamePro.MetadataFile mf = Build(game: true);
@@ -100,7 +100,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new ClrMamePro();
var serializer = new Serialization.Writers.ClrMamePro();
var serializer = new Writers.ClrMamePro();
// Build the data
Data.Models.ClrMamePro.MetadataFile mf = Build(game: true);
@@ -126,7 +126,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new ClrMamePro();
var serializer = new Serialization.Writers.ClrMamePro();
var serializer = new Writers.ClrMamePro();
// Build the data
Data.Models.ClrMamePro.MetadataFile mf = Build(game: false);
@@ -151,7 +151,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new ClrMamePro();
var serializer = new Serialization.Writers.ClrMamePro();
var serializer = new Writers.ClrMamePro();
// Build the data
Data.Models.ClrMamePro.MetadataFile mf = Build(game: false);

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new DosCenter();
var serializer = new Serialization.Writers.DosCenter();
var serializer = new Writers.DosCenter();
// Build the data
Data.Models.DosCenter.MetadataFile mf = Build();

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new EverdriveSMDB();
var serializer = new Serialization.Writers.EverdriveSMDB();
var serializer = new Writers.EverdriveSMDB();
// Build the data
Data.Models.EverdriveSMDB.MetadataFile mf = Build();

View File

@@ -76,7 +76,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.CRC32);
@@ -100,7 +100,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.MD2);
@@ -124,7 +124,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.MD4);
@@ -148,7 +148,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.MD5);
@@ -172,7 +172,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.SHA1);
@@ -196,7 +196,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.SHA256);
@@ -220,7 +220,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.SHA384);
@@ -244,7 +244,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.SHA512);
@@ -268,7 +268,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Hashfile();
var serializer = new Serialization.Writers.Hashfile();
var serializer = new Writers.Hashfile();
// Build the data
Data.Models.Hashfile.Hashfile hf = Build(HashType.SpamSum);
@@ -292,21 +292,26 @@ namespace SabreTools.Serialization.Readers.Test
/// </summary>
private static Data.Models.Hashfile.Hashfile Build(HashType hashType)
{
#pragma warning disable IDE0072
return hashType switch
{
HashType.CRC32 => new Data.Models.Hashfile.Hashfile { SFV = [new Data.Models.Hashfile.SFV { File = "XXXXXX", Hash = "XXXXXX" }] },
HashType.MD2 => new Data.Models.Hashfile.Hashfile { MD2 = [new Data.Models.Hashfile.MD2 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD4 => new Data.Models.Hashfile.Hashfile { MD4 = [new Data.Models.Hashfile.MD4 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD5 => new Data.Models.Hashfile.Hashfile { MD5 = [new Data.Models.Hashfile.MD5 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA1 => new Data.Models.Hashfile.Hashfile { SHA1 = [new Data.Models.Hashfile.SHA1 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA256 => new Data.Models.Hashfile.Hashfile { SHA256 = [new Data.Models.Hashfile.SHA256 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA384 => new Data.Models.Hashfile.Hashfile { SHA384 = [new Data.Models.Hashfile.SHA384 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA512 => new Data.Models.Hashfile.Hashfile { SHA512 = [new Data.Models.Hashfile.SHA512 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SpamSum => new Data.Models.Hashfile.Hashfile { SpamSum = [new Data.Models.Hashfile.SpamSum { Hash = "XXXXXX", File = "XXXXXX" }] },
_ => throw new ArgumentOutOfRangeException(nameof(hashType)),
};
#pragma warning restore IDE0072
if (hashType == HashType.CRC32)
return new Data.Models.Hashfile.Hashfile { SFV = [new Data.Models.Hashfile.SFV { File = "XXXXXX", Hash = "XXXXXX" }] };
else if (hashType == HashType.MD2)
return new Data.Models.Hashfile.Hashfile { MD2 = [new Data.Models.Hashfile.MD2 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.MD4)
return new Data.Models.Hashfile.Hashfile { MD4 = [new Data.Models.Hashfile.MD4 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.MD5)
return new Data.Models.Hashfile.Hashfile { MD5 = [new Data.Models.Hashfile.MD5 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA1)
return new Data.Models.Hashfile.Hashfile { SHA1 = [new Data.Models.Hashfile.SHA1 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA256)
return new Data.Models.Hashfile.Hashfile { SHA256 = [new Data.Models.Hashfile.SHA256 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA384)
return new Data.Models.Hashfile.Hashfile { SHA384 = [new Data.Models.Hashfile.SHA384 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SHA512)
return new Data.Models.Hashfile.Hashfile { SHA512 = [new Data.Models.Hashfile.SHA512 { Hash = "XXXXXX", File = "XXXXXX" }] };
else if (hashType == HashType.SpamSum)
return new Data.Models.Hashfile.Hashfile { SpamSum = [new Data.Models.Hashfile.SpamSum { Hash = "XXXXXX", File = "XXXXXX" }] };
else
throw new ArgumentOutOfRangeException(nameof(hashType));
}
/// <summary>

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Listrom();
var serializer = new Serialization.Writers.Listrom();
var serializer = new Writers.Listrom();
// Build the data
Data.Models.Listrom.MetadataFile mf = Build();

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Listxml();
var serializer = new Serialization.Writers.Listxml();
var serializer = new Writers.Listxml();
// Build the data
Data.Models.Listxml.Mame mame = Build(game: true);
@@ -102,7 +102,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Listxml();
var serializer = new Serialization.Writers.Listxml();
var serializer = new Writers.Listxml();
// Build the data
Data.Models.Listxml.Mame mame = Build(game: false);

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Logiqx();
var serializer = new Serialization.Writers.Logiqx();
var serializer = new Writers.Logiqx();
// Build the data
Data.Models.Logiqx.Datafile df = Build(game: true);
@@ -106,7 +106,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Logiqx();
var serializer = new Serialization.Writers.Logiqx();
var serializer = new Writers.Logiqx();
// Build the data
Data.Models.Logiqx.Datafile df = Build(game: false);

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new M1();
var serializer = new Serialization.Writers.M1();
var serializer = new Writers.M1();
// Build the data
Data.Models.Listxml.M1 m1 = Build(game: true);
@@ -100,7 +100,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new M1();
var serializer = new Serialization.Writers.M1();
var serializer = new Writers.M1();
// Build the data
Data.Models.Listxml.M1 m1 = Build(game: false);

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Mess();
var serializer = new Serialization.Writers.Mess();
var serializer = new Writers.Mess();
// Build the data
Data.Models.Listxml.Mess m1 = Build(game: true);
@@ -100,7 +100,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new Mess();
var serializer = new Serialization.Writers.Mess();
var serializer = new Writers.Mess();
// Build the data
Data.Models.Listxml.Mess m1 = Build(game: false);

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new OfflineList();
var serializer = new Serialization.Writers.OfflineList();
var serializer = new Writers.OfflineList();
// Build the data
Data.Models.OfflineList.Dat dat = Build();

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new OpenMSX();
var serializer = new Serialization.Writers.OpenMSX();
var serializer = new Writers.OpenMSX();
// Build the data
Data.Models.OpenMSX.SoftwareDb sdb = Build();

View File

@@ -74,7 +74,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new RomCenter();
var serializer = new Serialization.Writers.RomCenter();
var serializer = new Writers.RomCenter();
// Build the data
Data.Models.RomCenter.MetadataFile mf = Build();

View File

@@ -75,7 +75,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new SeparatedValue();
var serializer = new Serialization.Writers.SeparatedValue();
var serializer = new Writers.SeparatedValue();
// Build the data
Data.Models.SeparatedValue.MetadataFile mf = Build();
@@ -103,7 +103,7 @@ namespace SabreTools.Serialization.Readers.Test
{
// Get the serializer and deserializer
var deserializer = new SeparatedValue();
var serializer = new Serialization.Writers.SeparatedValue();
var serializer = new Writers.SeparatedValue();
// Build the data
Data.Models.SeparatedValue.MetadataFile mf = Build();
@@ -196,9 +196,9 @@ namespace SabreTools.Serialization.Readers.Test
{
Assert.NotNull(header);
if (longHeader)
Assert.True(Serialization.Writers.SeparatedValue.HeaderArrayExtended.SequenceEqual(header));
Assert.True(Writers.SeparatedValue.HeaderArrayExtended.SequenceEqual(header));
else
Assert.True(Serialization.Writers.SeparatedValue.HeaderArrayStandard.SequenceEqual(header));
Assert.True(Writers.SeparatedValue.HeaderArrayStandard.SequenceEqual(header));
}
/// <summary>

View File

@@ -3,6 +3,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.AACS;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
#pragma warning disable IDE0017 // Simplify object initialization
namespace SabreTools.Serialization.Readers
@@ -106,9 +107,9 @@ namespace SabreTools.Serialization.Readers
obj.RecordType = (RecordType)data.ReadByteValue();
obj.RecordLength = data.ReadUInt24LittleEndian();
if (obj.RecordLength > 4)
if ((uint)obj.RecordLength > 4)
{
byte[] copyright = data.ReadBytes((int)(obj.RecordLength - 4));
byte[] copyright = data.ReadBytes((int)((uint)obj.RecordLength - 4));
obj.Copyright = Encoding.ASCII.GetString(copyright).TrimEnd('\0');
}
@@ -149,7 +150,7 @@ namespace SabreTools.Serialization.Readers
// Try to parse the signature blocks
var blocks = new List<DriveRevocationSignatureBlock>();
uint entryCount = 0;
while (entryCount < obj.TotalNumberOfEntries && data.Position < initialOffset + obj.RecordLength)
while (entryCount < obj.TotalNumberOfEntries && data.Position < initialOffset + (uint)obj.RecordLength)
{
var block = ParseDriveRevocationSignatureBlock(data);
entryCount += block.NumberOfEntries;
@@ -164,8 +165,8 @@ namespace SabreTools.Serialization.Readers
obj.SignatureBlocks = [.. blocks];
// If there's any data left, discard it
if (data.Position < initialOffset + obj.RecordLength)
_ = data.ReadBytes((int)(initialOffset + obj.RecordLength - data.Position));
if (data.Position < initialOffset + (uint)obj.RecordLength)
_ = data.ReadBytes((int)(initialOffset + (uint)obj.RecordLength - data.Position));
return obj;
}
@@ -200,8 +201,8 @@ namespace SabreTools.Serialization.Readers
obj.RecordType = (RecordType)data.ReadByteValue();
obj.RecordLength = data.ReadUInt24LittleEndian();
if (obj.RecordLength > 4)
obj.SignatureData = data.ReadBytes((int)(obj.RecordLength - 4));
if ((uint)obj.RecordLength > 4)
obj.SignatureData = data.ReadBytes((int)((uint)obj.RecordLength - 4));
return obj;
}
@@ -223,7 +224,7 @@ namespace SabreTools.Serialization.Readers
// Try to parse the subset differences
var subsetDifferences = new List<SubsetDifference>();
while (data.Position < initialOffset + obj.RecordLength - 5)
while (data.Position < initialOffset + (uint)obj.RecordLength - 5)
{
var subsetDifference = ParseSubsetDifference(data);
subsetDifferences.Add(subsetDifference);
@@ -233,8 +234,8 @@ namespace SabreTools.Serialization.Readers
obj.SubsetDifferences = [.. subsetDifferences];
// If there's any data left, discard it
if (data.Position < initialOffset + obj.RecordLength)
_ = data.ReadBytes((int)(initialOffset + obj.RecordLength - data.Position));
if (data.Position < initialOffset + (uint)obj.RecordLength)
_ = data.ReadBytes((int)(initialOffset + (uint)obj.RecordLength - data.Position));
return obj;
}
@@ -288,7 +289,7 @@ namespace SabreTools.Serialization.Readers
// Try to parse the signature blocks
var blocks = new List<HostRevocationSignatureBlock>();
for (uint entryCount = 0; entryCount < obj.TotalNumberOfEntries && data.Position < initialOffset + obj.RecordLength;)
for (uint entryCount = 0; entryCount < obj.TotalNumberOfEntries && data.Position < initialOffset + (uint)obj.RecordLength;)
{
var block = ParseHostRevocationSignatureBlock(data);
entryCount += block.NumberOfEntries;
@@ -303,8 +304,8 @@ namespace SabreTools.Serialization.Readers
obj.SignatureBlocks = [.. blocks];
// If there's any data left, discard it
if (data.Position < initialOffset + obj.RecordLength)
_ = data.ReadBytes((int)(initialOffset + obj.RecordLength - data.Position));
if (data.Position < initialOffset + (uint)obj.RecordLength)
_ = data.ReadBytes((int)(initialOffset + (uint)obj.RecordLength - data.Position));
return obj;
}
@@ -345,7 +346,7 @@ namespace SabreTools.Serialization.Readers
// Try to parse the media keys
var mediaKeys = new List<byte[]>();
while (data.Position < initialOffset + obj.RecordLength)
while (data.Position < initialOffset + (uint)obj.RecordLength)
{
byte[] mediaKey = data.ReadBytes(0x10);
mediaKeys.Add(mediaKey);
@@ -390,7 +391,7 @@ namespace SabreTools.Serialization.Readers
// Try to parse the offsets
var offsets = new List<uint>();
while (data.Position < initialOffset + obj.RecordLength)
while (data.Position < initialOffset + (uint)obj.RecordLength)
{
uint offset = data.ReadUInt32BigEndian();
offsets.Add(offset);

View File

@@ -2,6 +2,7 @@ using System.Collections.Generic;
using System.IO;
using SabreTools.Data.Models.ASN1;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
#pragma warning disable CA1822 // Mark members as static
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -2,6 +2,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.AdvancedInstaller;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.AdvancedInstaller.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -1,6 +1,7 @@
using System.IO;
using System.Text;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.PlayStation4.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -1,6 +1,8 @@
using System.IO;
using SabreTools.Data.Models.Atari7800;
using SabreTools.IO.Extensions;
using SabreTools.Matching;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.Atari7800.Constants;
namespace SabreTools.Serialization.Readers

View File

@@ -1,6 +1,8 @@
using System.IO;
using SabreTools.Data.Models.AtariLynx;
using SabreTools.IO.Extensions;
using SabreTools.Matching;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.AtariLynx.Constants;
namespace SabreTools.Serialization.Readers

View File

@@ -2,7 +2,7 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using SabreTools.Data.Models.AttractMode;
using SabreTools.IO.Readers;
using SabreTools.Text.SeparatedValue;
namespace SabreTools.Serialization.Readers
{
@@ -28,7 +28,7 @@ namespace SabreTools.Serialization.Readers
try
{
// Setup the reader and output
var reader = new SeparatedValueReader(data, Encoding.UTF8)
var reader = new Reader(data, Encoding.UTF8)
{
Separator = ';',
VerifyFieldCount = false,

View File

@@ -2,6 +2,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.BDPlus;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.BDPlus.Constants;
namespace SabreTools.Serialization.Readers

View File

@@ -2,6 +2,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.BFPK;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.BFPK.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -3,6 +3,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.BSP;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.BSP.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -2,6 +2,7 @@ using System.IO;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.CDROM;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
#pragma warning disable IDE0017 // Simplify object initialization
namespace SabreTools.Serialization.Readers

View File

@@ -5,6 +5,7 @@ using System.Text;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.CFB;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.CFB.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -3,6 +3,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.CHD;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
namespace SabreTools.Serialization.Readers
{

View File

@@ -2,6 +2,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.N3DS;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
#pragma warning disable IDE0017 // Simplify object initialization
namespace SabreTools.Serialization.Readers

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using SabreTools.Data.Models.ClrMamePro;
using SabreTools.IO.Readers;
using SabreTools.Text.ClrMamePro;
#pragma warning disable CA1822 // Mark members as static
namespace SabreTools.Serialization.Readers
@@ -78,7 +78,7 @@ namespace SabreTools.Serialization.Readers
try
{
// Setup the reader and output
var reader = new ClrMameProReader(data, Encoding.UTF8) { Quotes = quotes };
var reader = new Reader(data, Encoding.UTF8) { Quotes = quotes };
var dat = new MetadataFile();
// Loop through and parse out the values
@@ -437,9 +437,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Release object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Release object created from the reader context</returns>
private static Release? CreateRelease(ClrMameProReader reader)
private static Release? CreateRelease(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -477,9 +477,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a BiosSet object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>BiosSet object created from the reader context</returns>
private static BiosSet? CreateBiosSet(ClrMameProReader reader)
private static BiosSet? CreateBiosSet(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -510,9 +510,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Rom object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Rom object created from the reader context</returns>
private static Rom? CreateRom(ClrMameProReader reader)
private static Rom? CreateRom(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -615,9 +615,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Disk object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Disk object created from the reader context</returns>
private static Disk? CreateDisk(ClrMameProReader reader)
private static Disk? CreateDisk(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -657,9 +657,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Media object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Media object created from the reader context</returns>
private static Media? CreateMedia(ClrMameProReader reader)
private static Media? CreateMedia(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -696,9 +696,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Sample object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Sample object created from the reader context</returns>
private static Sample? CreateSample(ClrMameProReader reader)
private static Sample? CreateSample(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -723,9 +723,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Archive object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Archive object created from the reader context</returns>
private static Archive? CreateArchive(ClrMameProReader reader)
private static Archive? CreateArchive(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -750,9 +750,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Chip object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Chip object created from the reader context</returns>
private static Chip? CreateChip(ClrMameProReader reader)
private static Chip? CreateChip(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -786,9 +786,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Video object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Video object created from the reader context</returns>
private static Video? CreateVideo(ClrMameProReader reader)
private static Video? CreateVideo(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -831,9 +831,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Sound object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Sound object created from the reader context</returns>
private static Sound? CreateSound(ClrMameProReader reader)
private static Sound? CreateSound(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -858,9 +858,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Input object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Input object created from the reader context</returns>
private static Input? CreateInput(ClrMameProReader reader)
private static Input? CreateInput(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -900,9 +900,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a DipSwitch object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>DipSwitch object created from the reader context</returns>
private static DipSwitch? CreateDipSwitch(ClrMameProReader reader)
private static DipSwitch? CreateDipSwitch(Reader reader)
{
if (reader.Internal is null)
return null;
@@ -935,9 +935,9 @@ namespace SabreTools.Serialization.Readers
/// <summary>
/// Create a Driver object from the current reader context
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <param name="reader">Reader representing the metadata file</param>
/// <returns>Driver object created from the reader context</returns>
private static Driver? CreateDriver(ClrMameProReader reader)
private static Driver? CreateDriver(Reader reader)
{
if (reader.Internal is null)
return null;

View File

@@ -2,7 +2,7 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using SabreTools.Data.Models.DosCenter;
using SabreTools.IO.Readers;
using SabreTools.Text.ClrMamePro;
namespace SabreTools.Serialization.Readers
{
@@ -18,7 +18,7 @@ namespace SabreTools.Serialization.Readers
try
{
// Setup the reader and output
var reader = new ClrMameProReader(data, Encoding.UTF8) { DosCenter = true };
var reader = new Reader(data, Encoding.UTF8) { DosCenter = true };
var dat = new MetadataFile();
// Loop through and parse out the values
@@ -176,7 +176,7 @@ namespace SabreTools.Serialization.Readers
/// </summary>
/// <param name="reader">ClrMameProReader representing the metadata file</param>
/// <returns>File object created from the reader context</returns>
private static Data.Models.DosCenter.File? CreateFile(ClrMameProReader reader)
private static Data.Models.DosCenter.File? CreateFile(Reader reader)
{
if (reader.Internal is null)
return null;

View File

@@ -2,7 +2,7 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using SabreTools.Data.Models.EverdriveSMDB;
using SabreTools.IO.Readers;
using SabreTools.Text.SeparatedValue;
namespace SabreTools.Serialization.Readers
{
@@ -18,7 +18,7 @@ namespace SabreTools.Serialization.Readers
try
{
// Setup the reader and output
var reader = new SeparatedValueReader(data, Encoding.UTF8)
var reader = new Reader(data, Encoding.UTF8)
{
Header = false,
Separator = '\t',

View File

@@ -1,6 +1,8 @@
using System.IO;
using SabreTools.Data.Models.NES;
using SabreTools.IO.Extensions;
using SabreTools.Matching;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.NES.Constants;
namespace SabreTools.Serialization.Readers

View File

@@ -2,6 +2,8 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.GCF;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using SabreTools.Text.Extensions;
#pragma warning disable IDE0017 // Simplify object initialization
namespace SabreTools.Serialization.Readers

View File

@@ -2,6 +2,8 @@ using System.Collections.Generic;
using System.IO;
using SabreTools.Data.Models.GZIP;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using SabreTools.Text.Extensions;
using static SabreTools.Data.Models.GZIP.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -69,24 +69,30 @@ namespace SabreTools.Serialization.Readers
/// <inheritdoc cref="Deserialize(Stream)"/>
public Data.Models.Hashfile.Hashfile? Deserialize(Stream? data, HashType hash)
{
#pragma warning disable IDE0072
return hash switch
{
HashType.CRC32 => DeserializeSFV(data),
HashType.MD2 => DeserializeMD2(data),
HashType.MD4 => DeserializeMD4(data),
HashType.MD5 => DeserializeMD5(data),
HashType.RIPEMD128 => DeserializeRIPEMD128(data),
HashType.RIPEMD160 => DeserializeRIPEMD160(data),
HashType.SHA1 => DeserializeSHA1(data),
HashType.SHA256 => DeserializeSHA256(data),
HashType.SHA384 => DeserializeSHA384(data),
HashType.SHA512 => DeserializeSHA512(data),
HashType.SpamSum => DeserializeSpamSum(data),
_ => null,
};
#pragma warning restore IDE0072
if (hash == HashType.CRC32)
return DeserializeSFV(data);
else if (hash == HashType.MD2)
return DeserializeMD2(data);
else if (hash == HashType.MD4)
return DeserializeMD4(data);
else if (hash == HashType.MD5)
return DeserializeMD5(data);
else if (hash == HashType.RIPEMD128)
return DeserializeRIPEMD128(data);
else if (hash == HashType.RIPEMD160)
return DeserializeRIPEMD160(data);
else if (hash == HashType.SHA1)
return DeserializeSHA1(data);
else if (hash == HashType.SHA256)
return DeserializeSHA256(data);
else if (hash == HashType.SHA384)
return DeserializeSHA384(data);
else if (hash == HashType.SHA512)
return DeserializeSHA512(data);
else if (hash == HashType.SpamSum)
return DeserializeSpamSum(data);
else
return null;
}
/// <inheritdoc cref="Deserialize(Stream)"/>

View File

@@ -1,6 +1,7 @@
using System.IO;
using System.Text;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
#pragma warning disable IDE0017 // Simplify object initialization
namespace SabreTools.Serialization.Readers

View File

@@ -3,6 +3,8 @@ using System.IO;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.ISO9660;
using SabreTools.IO.Extensions;
using SabreTools.Matching;
using SabreTools.Numerics.Extensions;
#pragma warning disable CA1822 // Mark members as static
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -3,6 +3,8 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.InstallShieldArchiveV3;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using SabreTools.Text.Extensions;
#pragma warning disable IDE0017 // Simplify object initialization
namespace SabreTools.Serialization.Readers

View File

@@ -5,6 +5,8 @@ using System.Text;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.InstallShieldCabinet;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using SabreTools.Text.Extensions;
using static SabreTools.Data.Models.InstallShieldCabinet.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -2,6 +2,7 @@ using System.Collections.Generic;
using System.IO;
using SabreTools.Data.Models.InstallShieldExecutable;
using SabreTools.IO.Extensions;
using SabreTools.Text.Extensions;
using static SabreTools.Data.Models.InstallShieldExecutable.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -2,6 +2,8 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.LZ;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using SabreTools.Text.Extensions;
using static SabreTools.Data.Models.LZ.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -2,6 +2,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.LZ;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.LZ.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -2,6 +2,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.LZ;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.LZ.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

View File

@@ -3,6 +3,7 @@ using System.IO;
using System.Text;
using SabreTools.Data.Models.LinearExecutable;
using SabreTools.IO.Extensions;
using SabreTools.Numerics.Extensions;
using static SabreTools.Data.Models.LinearExecutable.Constants;
#pragma warning disable IDE0017 // Simplify object initialization

Some files were not shown because too many files have changed in this diff Show More