Remove nearly all explict fields

This commit is contained in:
Matt Nadareski
2024-03-09 21:34:26 -05:00
parent c755abf4c0
commit 24d4e352a4
79 changed files with 1723 additions and 3554 deletions

View File

@@ -103,30 +103,30 @@ have a current entry in the DAT index.";
if (onlyNeeded && !noDb)
{
string query = "SELECT * FROM crcsha1 JOIN md5sha1 ON crcsha1.sha1=md5sha1.sha1"
+ $" WHERE crcsha1.crc=\"{rom.CRC}\""
+ $" OR md5sha1.md5=\"{rom.MD5}\""
+ $" OR md5sha1.sha1=\"{rom.SHA1}\"";
+ $" WHERE crcsha1.crc=\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\""
+ $" OR md5sha1.md5=\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\""
+ $" OR md5sha1.sha1=\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"";
SqliteCommand slc = new SqliteCommand(query, dbc);
SqliteDataReader sldr = slc.ExecuteReader();
if (sldr.HasRows)
{
// Add to the queries
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcquery += $" (\"{rom.CRC}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcquery += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5query += $" (\"{rom.MD5}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.SHA1))
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)))
{
sha1query += $" (\"{rom.SHA1}\", \"{_depots!.Keys.ToList()[0]}\"),";
sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\", \"{_depots!.Keys.ToList()[0]}\"),";
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcsha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
}
// Add to the Dat
@@ -139,21 +139,21 @@ have a current entry in the DAT index.";
// Add to the queries
if (!noDb)
{
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcquery += $" (\"{rom.CRC}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcquery += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5query += $" (\"{rom.MD5}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.SHA1))
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)))
{
sha1query += $" (\"{rom.SHA1}\", \"{_depots!.Keys.ToList()[0]}\"),";
sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\", \"{_depots!.Keys.ToList()[0]}\"),";
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcsha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
}
}

View File

@@ -812,15 +812,15 @@ CREATE TABLE IF NOT EXISTS dat (
Disk disk = (Disk)datItem;
hasItems = true;
if (!string.IsNullOrWhiteSpace(disk.MD5))
md5query += $" (\"{disk.MD5}\"),";
if (!string.IsNullOrWhiteSpace(disk.GetFieldValue<string?>(SabreTools.Models.Metadata.Disk.MD5Key)))
md5query += $" (\"{disk.GetFieldValue<string?>(SabreTools.Models.Metadata.Disk.MD5Key)}\"),";
if (!string.IsNullOrWhiteSpace(disk.SHA1))
if (!string.IsNullOrWhiteSpace(disk.GetFieldValue<string?>(SabreTools.Models.Metadata.Disk.SHA1Key)))
{
sha1query += $" (\"{disk.SHA1}\"),";
sha1query += $" (\"{disk.GetFieldValue<string?>(SabreTools.Models.Metadata.Disk.SHA1Key)}\"),";
if (!string.IsNullOrWhiteSpace(disk.MD5))
md5sha1query += $" (\"{disk.MD5}\", \"{disk.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(disk.GetFieldValue<string?>(SabreTools.Models.Metadata.Disk.MD5Key)))
md5sha1query += $" (\"{disk.GetFieldValue<string?>(SabreTools.Models.Metadata.Disk.MD5Key)}\", \"{disk.GetFieldValue<string?>(SabreTools.Models.Metadata.Disk.SHA1Key)}\"),";
}
}
else if (datItem.ItemType == ItemType.Media)
@@ -828,15 +828,15 @@ CREATE TABLE IF NOT EXISTS dat (
Media media = (Media)datItem;
hasItems = true;
if (!string.IsNullOrWhiteSpace(media.MD5))
md5query += $" (\"{media.MD5}\"),";
if (!string.IsNullOrWhiteSpace(media.GetFieldValue<string?>(SabreTools.Models.Metadata.Media.MD5Key)))
md5query += $" (\"{media.GetFieldValue<string?>(SabreTools.Models.Metadata.Media.MD5Key)}\"),";
if (!string.IsNullOrWhiteSpace(media.SHA1))
if (!string.IsNullOrWhiteSpace(media.GetFieldValue<string?>(SabreTools.Models.Metadata.Media.SHA1Key)))
{
sha1query += $" (\"{media.SHA1}\"),";
sha1query += $" (\"{media.GetFieldValue<string?>(SabreTools.Models.Metadata.Media.SHA1Key)}\"),";
if (!string.IsNullOrWhiteSpace(media.MD5))
md5sha1query += $" (\"{media.MD5}\", \"{media.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(media.GetFieldValue<string?>(SabreTools.Models.Metadata.Media.MD5Key)))
md5sha1query += $" (\"{media.GetFieldValue<string?>(SabreTools.Models.Metadata.Media.MD5Key)}\", \"{media.GetFieldValue<string?>(SabreTools.Models.Metadata.Media.SHA1Key)}\"),";
}
}
else if (datItem.ItemType == ItemType.Rom)
@@ -844,21 +844,21 @@ CREATE TABLE IF NOT EXISTS dat (
Rom rom = (Rom)datItem;
hasItems = true;
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcquery += $" (\"{rom.CRC}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcquery += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5query += $" (\"{rom.MD5}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.SHA1))
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)))
{
sha1query += $" (\"{rom.SHA1}\"),";
sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcsha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
}
}
}
@@ -898,7 +898,7 @@ CREATE TABLE IF NOT EXISTS dat (
// Only add the DAT if it's non-empty
if (hasItems)
{
string datquery = $"INSERT OR IGNORE INTO dat (hash) VALUES (\"{dat.SHA1}\")";
string datquery = $"INSERT OR IGNORE INTO dat (hash) VALUES (\"{dat.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\")";
slc = new SqliteCommand(datquery, dbc);
slc.ExecuteNonQuery();
}

View File

@@ -94,28 +94,28 @@ namespace RombaSharp.Features
foreach (Rom rom in roms)
{
if (hashes.Contains(rom.SHA1!))
if (hashes.Contains(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)!))
{
dupehashes.Add(rom.SHA1!);
hashes.Remove(rom.SHA1!);
dupehashes.Add(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)!);
hashes.Remove(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)!);
}
else if (!dupehashes.Contains(rom.SHA1!))
else if (!dupehashes.Contains(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)!))
{
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcquery += $" (\"{rom.CRC}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcquery += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5query += $" (\"{rom.MD5}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.SHA1))
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)))
{
sha1query += $" (\"{rom.SHA1}\", \"{depotname}\"),";
sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\", \"{depotname}\"),";
if (!string.IsNullOrWhiteSpace(rom.CRC))
crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)))
crcsha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
if (!string.IsNullOrWhiteSpace(rom.MD5))
md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),";
if (!string.IsNullOrWhiteSpace(rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)))
md5sha1query += $" (\"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue<string?>(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),";
}
}
}

View File

@@ -221,12 +221,12 @@ namespace SabreTools.DatFiles
if (item.ItemType == ItemType.Disk && item is Disk disk)
{
// If the file has aboslutely no hashes, skip and log
if (disk.ItemStatus != ItemStatus.Nodump
&& string.IsNullOrEmpty(disk.MD5)
&& string.IsNullOrEmpty(disk.SHA1))
if (disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) != ItemStatus.Nodump
&& string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key))
&& string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
{
logger.Verbose($"Incomplete entry for '{disk.GetName()}' will be output as nodump");
disk.ItemStatus = ItemStatus.Nodump;
disk.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, ItemStatus.Nodump);
}
item = disk;
@@ -234,10 +234,10 @@ namespace SabreTools.DatFiles
if (item.ItemType == ItemType.Media && item is Media media)
{
// If the file has aboslutely no hashes, skip and log
if (string.IsNullOrEmpty(media.MD5)
&& string.IsNullOrEmpty(media.SHA1)
&& string.IsNullOrEmpty(media.SHA256)
&& string.IsNullOrEmpty(media.SpamSum))
if (string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key))
&& string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key))
&& string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key))
&& string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)))
{
logger.Verbose($"Incomplete entry for '{media.GetName()}' will be output as nodump");
}
@@ -247,41 +247,41 @@ namespace SabreTools.DatFiles
else if (item.ItemType == ItemType.Rom && item is Rom rom)
{
// If we have the case where there is SHA-1 and nothing else, we don't fill in any other part of the data
if (rom.Size == null && !rom.HasHashes())
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null && !rom.HasHashes())
{
// No-op, just catch it so it doesn't go further
logger.Verbose($"{Header.FileName}: Entry with only SHA-1 found - '{rom.GetName()}'");
}
// If we have a rom and it's missing size AND the hashes match a 0-byte file, fill in the rest of the info
else if ((rom.Size == 0 || rom.Size == null)
&& (string.IsNullOrEmpty(rom.CRC) || rom.HasZeroHash()))
else if ((rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == 0 || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null)
&& (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)) || rom.HasZeroHash()))
{
// TODO: All instances of Hash.DeepHashes should be made into 0x0 eventually
rom.Size = Constants.SizeZero;
rom.CRC = Constants.CRCZero;
rom.MD5 = Constants.MD5Zero;
rom.SHA1 = Constants.SHA1Zero;
rom.SHA256 = null; // Constants.SHA256Zero;
rom.SHA384 = null; // Constants.SHA384Zero;
rom.SHA512 = null; // Constants.SHA512Zero;
rom.SpamSum = null; // Constants.SpamSumZero;
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, Constants.SizeZero);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, Constants.CRCZero);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, Constants.MD5Zero);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, Constants.SHA1Zero);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, null); // Constants.SHA256Zero;
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, null); // Constants.SHA384Zero;
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, null); // Constants.SHA512Zero;
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, null); // Constants.SpamSumZero;
}
// If the file has no size and it's not the above case, skip and log
else if (rom.ItemStatus != ItemStatus.Nodump && (rom.Size == 0 || rom.Size == null))
else if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump && (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == 0 || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null))
{
logger.Verbose($"{Header.FileName}: Incomplete entry for '{rom.GetName()}' will be output as nodump");
rom.ItemStatus = ItemStatus.Nodump;
rom.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump);
}
// If the file has a size but aboslutely no hashes, skip and log
else if (rom.ItemStatus != ItemStatus.Nodump
&& rom.Size != null && rom.Size > 0
else if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump
&& rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) != null && rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) > 0
&& !rom.HasHashes())
{
logger.Verbose($"{Header.FileName}: Incomplete entry for '{rom.GetName()}' will be output as nodump");
rom.ItemStatus = ItemStatus.Nodump;
rom.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump);
}
item = rom;
@@ -388,26 +388,26 @@ namespace SabreTools.DatFiles
// Ensure we have the proper values for replacement
if (item.ItemType == ItemType.Disk && item is Disk disk)
{
md5 = disk.MD5 ?? string.Empty;
sha1 = disk.SHA1 ?? string.Empty;
md5 = disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key) ?? string.Empty;
sha1 = disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key) ?? string.Empty;
}
else if (item.ItemType == ItemType.Media && item is Media media)
{
md5 = media.MD5 ?? string.Empty;
sha1 = media.SHA1 ?? string.Empty;
sha256 = media.SHA256 ?? string.Empty;
spamsum = media.SpamSum ?? string.Empty;
md5 = media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key) ?? string.Empty;
sha1 = media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key) ?? string.Empty;
sha256 = media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key) ?? string.Empty;
spamsum = media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey) ?? string.Empty;
}
else if (item.ItemType == ItemType.Rom && item is Rom rom)
{
crc = rom.CRC ?? string.Empty;
md5 = rom.MD5 ?? string.Empty;
sha1 = rom.SHA1 ?? string.Empty;
sha256 = rom.SHA256 ?? string.Empty;
sha384 = rom.SHA384 ?? string.Empty;
sha512 = rom.SHA512 ?? string.Empty;
size = rom.Size?.ToString() ?? string.Empty;
spamsum = rom.SpamSum ?? string.Empty;
crc = rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey) ?? string.Empty;
md5 = rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key) ?? string.Empty;
sha1 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key) ?? string.Empty;
sha256 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key) ?? string.Empty;
sha384 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key) ?? string.Empty;
sha512 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key) ?? string.Empty;
size = rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString() ?? string.Empty;
spamsum = rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey) ?? string.Empty;
}
// Now do bulk replacement where possible
@@ -459,27 +459,27 @@ namespace SabreTools.DatFiles
if (item.ItemType == ItemType.Disk && item is Disk disk)
{
// We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(disk.SHA1))
if (!string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
{
name = Utilities.GetDepotPath(disk.SHA1, Header.OutputDepot.Depth)?.Replace('\\', '/');
name = Utilities.GetDepotPath(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key), Header.OutputDepot.Depth)?.Replace('\\', '/');
item.SetName($"{pre}{name}{post}");
}
}
else if (item.ItemType == ItemType.Media && item is Media media)
{
// We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(media.SHA1))
if (!string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)))
{
name = Utilities.GetDepotPath(media.SHA1, Header.OutputDepot.Depth)?.Replace('\\', '/');
name = Utilities.GetDepotPath(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key), Header.OutputDepot.Depth)?.Replace('\\', '/');
item.SetName($"{pre}{name}{post}");
}
}
else if (item.ItemType == ItemType.Rom && item is Rom rom)
{
// We can only write out if there's a SHA-1
if (!string.IsNullOrEmpty(rom.SHA1))
if (!string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
{
name = Utilities.GetDepotPath(rom.SHA1, Header.OutputDepot.Depth)?.Replace('\\', '/');
name = Utilities.GetDepotPath(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key), Header.OutputDepot.Depth)?.Replace('\\', '/');
item.SetName($"{pre}{name}{post}");
}
}
@@ -537,19 +537,19 @@ namespace SabreTools.DatFiles
return datItem;
// If the Rom has "null" characteristics, ensure all fields
if (rom.Size == null && rom.CRC == "null")
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null && rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey) == "null")
{
logger.Verbose($"Empty folder found: {datItem.Machine.Name}");
rom.SetName(rom.GetName() == "null" ? "-" : rom.GetName());
rom.Size = Constants.SizeZero;
rom.CRC = rom.CRC == "null" ? Constants.CRCZero : null;
rom.MD5 = rom.MD5 == "null" ? Constants.MD5Zero : null;
rom.SHA1 = rom.SHA1 == "null" ? Constants.SHA1Zero : null;
rom.SHA256 = rom.SHA256 == "null" ? Constants.SHA256Zero : null;
rom.SHA384 = rom.SHA384 == "null" ? Constants.SHA384Zero : null;
rom.SHA512 = rom.SHA512 == "null" ? Constants.SHA512Zero : null;
rom.SpamSum = rom.SpamSum == "null" ? Constants.SpamSumZero : null;
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, Constants.SizeZero);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey) == "null" ? Constants.SpamSumZero : null);
}
return rom;
@@ -626,7 +626,7 @@ namespace SabreTools.DatFiles
if (ignoreBlanks && datItem.ItemType == ItemType.Rom && datItem is Rom rom)
{
// If we have a 0-size or blank rom, then we ignore
if (rom.Size == 0 || rom.Size == null)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == 0 || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null)
{
string itemString = JsonConvert.SerializeObject(datItem, Formatting.None);
logger?.Verbose($"Item '{itemString}' was skipped because it had an invalid size");

View File

@@ -20,6 +20,7 @@ namespace SabreTools.DatFiles.Formats
{
// Deserialize the input file
var files = new Serialization.Files.ArchiveDotOrg().Deserialize(filename);
var metadata = new Serialization.CrossModel.ArchiveDotOrg().Serialize(files);
// Convert the files data to the internal format
ConvertFiles(files?.File, filename, indexId, statsOnly);
@@ -103,75 +104,67 @@ namespace SabreTools.DatFiles.Formats
var rom = new Rom()
{
ArchiveDotOrgSource = file.Source,
//BitTorrentMagnetHash = file.BitTorrentMagnetHash, // TODO: Add to internal model
Date = file.LastModifiedTime?.ToString(),
Size = NumberHelper.ConvertToInt64(file.Size),
MD5 = file.MD5,
CRC = file.CRC32,
SHA1 = file.SHA1,
//FileCount = file.FileCount, // TODO: Add to internal model
ArchiveDotOrgFormat = file.Format,
OriginalFilename = file.Original,
Summation = file.Summation,
//MatrixNumber = file.MatrixNumber, // TODO: Add to internal model
//CollectionCatalogNumber = file.CollectionCatalogNumber, // TODO: Add to internal model
// ASR-Related
//ASRDetectedLang = file.ASRDetectedLang, // TODO: Add to internal model
//ASRDetectedLangConf = file.ASRDetectedLangConf, // TODO: Add to internal model
//ASRTranscribedLang = file.ASRTranscribedLang, // TODO: Add to internal model
//WhisperASRModuleVersion = file.WhisperASRModuleVersion, // TODO: Add to internal model
//WhisperModelHash = file.WhisperModelHash, // TODO: Add to internal model
//WhisperModelName = file.WhisperModelName, // TODO: Add to internal model
//WhisperVersion = file.WhisperVersion, // TODO: Add to internal model
// OCR-Related
//ClothCoverDetectionModuleVersion = file.ClothCoverDetectionModuleVersions, // TODO: Add to internal model
//hOCRCharToWordhOCRVersion = file.hOCRCharToWordhOCRVersion, // TODO: Add to internal model
//hOCRCharToWordModuleVersion = file.hOCRCharToWordModuleVersion, // TODO: Add to internal model
//hOCRFtsTexthOCRVersion = file.hOCRFtsTexthOCRVersion, // TODO: Add to internal model
//hOCRFtsTextModuleVersion = file.hOCRFtsTextModuleVersion, // TODO: Add to internal model
//hOCRPageIndexhOCRVersion = file.hOCRPageIndexhOCRVersion, // TODO: Add to internal model
//hOCRPageIndexModuleVersion = file.hOCRPageIndexModuleVersion, // TODO: Add to internal model
//TesseractOCR = file.TesseractOCR, // TODO: Add to internal model
//TesseractOCRConverted = file.TesseractOCRConverted, // TODO: Add to internal model
//TesseractOCRDetectedLang = file.TesseractOCRDetectedLang, // TODO: Add to internal model
//TesseractOCRDetectedLangConf = file.TesseractOCRDetectedLangConf, // TODO: Add to internal model
//TesseractOCRDetectedScript = file.TesseractOCRDetectedScript, // TODO: Add to internal model
//TesseractOCRDetectedScriptConf = file.TesseractOCRDetectedScriptConf, // TODO: Add to internal model
//TesseractOCRParameters = file.TesseractOCRParameters, // TODO: Add to internal model
//TesseractOCRModuleVersion = file.TesseractOCRModuleVersion, // TODO: Add to internal model
//PDFModuleVersion = file.PDFModuleVersion, // TODO: Add to internal model
//WordConfidenceInterval0To10 = file.WordConfidenceInterval0To10, // TODO: Add to internal model
//WordConfidenceInterval11To20 = file.WordConfidenceInterval11To20, // TODO: Add to internal model
//WordConfidenceInterval21To30 = file.WordConfidenceInterval21To30, // TODO: Add to internal model
//WordConfidenceInterval31To40 = file.WordConfidenceInterval31To40, // TODO: Add to internal model
//WordConfidenceInterval41To50 = file.WordConfidenceInterval41To50, // TODO: Add to internal model
//WordConfidenceInterval51To60 = file.WordConfidenceInterval51To60, // TODO: Add to internal model
//WordConfidenceInterval61To70 = file.WordConfidenceInterval61To70, // TODO: Add to internal model
//WordConfidenceInterval71To80 = file.WordConfidenceInterval71To80, // TODO: Add to internal model
//WordConfidenceInterval81To90 = file.WordConfidenceInterval81To90, // TODO: Add to internal model
//WordConfidenceInterval91To100 = file.WordConfidenceInterval91To100, // TODO: Add to internal model
// Media-Related
//Album = file.Album, // TODO: Add to internal model
//Artist = file.Artist, // TODO: Add to internal model
//Bitrate = file.Bitrate, // TODO: Add to internal model
//Creator = file.Creator, // TODO: Add to internal model
//Height = file.Height, // TODO: Add to internal model
//Length = file.Length, // TODO: Add to internal model
//PreviewImage = file.PreviewImage, // TODO: Add to internal model
//Rotation = file.Rotation, // TODO: Add to internal model
//Title = file.Title, // TODO: Add to internal model
//Track = file.Track, // TODO: Add to internal model
//Width = file.Width, // TODO: Add to internal model
ItemStatus = ItemStatus.None,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(name);
rom.SetFieldValue<string?>(Models.Metadata.Rom.AlbumKey, file.Album);
rom.SetFieldValue<string?>(Models.Metadata.Rom.ArtistKey, file.Artist);
rom.SetFieldValue<string?>(Models.Metadata.Rom.ASRDetectedLangKey, file.ASRDetectedLang);
rom.SetFieldValue<string?>(Models.Metadata.Rom.ASRDetectedLangConfKey, file.ASRDetectedLangConf);
rom.SetFieldValue<string?>(Models.Metadata.Rom.ASRTranscribedLangKey, file.ASRTranscribedLang);
rom.SetFieldValue<string?>(Models.Metadata.Rom.BitrateKey, file.Bitrate);
rom.SetFieldValue<string?>(Models.Metadata.Rom.BitTorrentMagnetHashKey, file.BitTorrentMagnetHash);
rom.SetFieldValue<string?>(Models.Metadata.Rom.ClothCoverDetectionModuleVersionKey, file.ClothCoverDetectionModuleVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CollectionCatalogNumberKey, file.CollectionCatalogNumber);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, file.CRC32);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CreatorKey, file.Creator);
rom.SetFieldValue<string?>(Models.Metadata.Rom.DateKey, file.LastModifiedTime?.ToString());
rom.SetFieldValue<string?>(Models.Metadata.Rom.FileCountKey, file.FileCount);
rom.SetFieldValue<string?>(Models.Metadata.Rom.FormatKey, file.Format);
rom.SetFieldValue<string?>(Models.Metadata.Rom.HeightKey, file.Height);
rom.SetFieldValue<string?>(Models.Metadata.Rom.hOCRCharToWordhOCRVersionKey, file.hOCRCharToWordhOCRVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.hOCRCharToWordModuleVersionKey, file.hOCRCharToWordModuleVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.hOCRFtsTexthOCRVersionKey, file.hOCRFtsTexthOCRVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.hOCRFtsTextModuleVersionKey, file.hOCRFtsTextModuleVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.hOCRPageIndexhOCRVersionKey, file.hOCRPageIndexhOCRVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.hOCRPageIndexModuleVersionKey, file.hOCRPageIndexModuleVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.LengthKey, file.Length);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MatrixNumberKey, file.MatrixNumber);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, file.MD5);
rom.SetFieldValue<string?>(Models.Metadata.Rom.OriginalKey, file.Original);
rom.SetFieldValue<string?>(Models.Metadata.Rom.PDFModuleVersionKey, file.PDFModuleVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.PreviewImageKey, file.PreviewImage);
rom.SetFieldValue<string?>(Models.Metadata.Rom.RotationKey, file.Rotation);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(file.Size));
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, file.SHA1);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SourceKey, file.Source);
rom.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SummationKey, file.Summation);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRKey, file.TesseractOCR);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRConvertedKey, file.TesseractOCRConverted);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRDetectedLangKey, file.TesseractOCRDetectedLang);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRDetectedLangConfKey, file.TesseractOCRDetectedLangConf);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRDetectedScriptKey, file.TesseractOCRDetectedScript);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRDetectedScriptConfKey, file.TesseractOCRDetectedScriptConf);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRModuleVersionKey, file.TesseractOCRModuleVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRParametersKey, file.TesseractOCRParameters);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TitleKey, file.Title);
rom.SetFieldValue<string?>(Models.Metadata.Rom.TrackKey, file.Track);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WhisperASRModuleVersionKey, file.WhisperASRModuleVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WhisperModelHashKey, file.WhisperModelHash);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WhisperModelNameKey, file.WhisperModelName);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WhisperVersionKey, file.WhisperVersion);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WidthKey, file.Width);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval0To10Key, file.WordConfidenceInterval0To10);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval11To20Key, file.WordConfidenceInterval11To20);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval21To30Key, file.WordConfidenceInterval21To30);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval31To40Key, file.WordConfidenceInterval31To40);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval41To50Key, file.WordConfidenceInterval41To50);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval51To60Key, file.WordConfidenceInterval51To60);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval61To70Key, file.WordConfidenceInterval61To70);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval71To80Key, file.WordConfidenceInterval71To80);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval81To90Key, file.WordConfidenceInterval81To90);
rom.SetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval91To100Key, file.WordConfidenceInterval91To100);
// Now process and add the rom
rom.CopyMachineInformation(machine);

View File

@@ -33,11 +33,11 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Rom rom:
if (rom.Size == null || rom.Size < 0)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < 0)
missingFields.Add(Models.Metadata.Rom.SizeKey);
if (string.IsNullOrEmpty(rom.CRC)
&& string.IsNullOrEmpty(rom.MD5)
&& string.IsNullOrEmpty(rom.SHA1))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
{
missingFields.Add(Models.Metadata.Rom.SHA1Key);
}
@@ -126,72 +126,72 @@ namespace SabreTools.DatFiles.Formats
var file = new Models.ArchiveDotOrg.File
{
Name = item.GetName(),
Source = item.ArchiveDotOrgSource,
//BitTorrentMagnetHash = item.BitTorrentMagnetHash, // TODO: Add to internal model
Size = item.Size?.ToString(),
MD5 = item.MD5,
CRC32 = item.CRC,
SHA1 = item.SHA1,
//FileCount = item.FileCount, // TODO: Add to internal model
Format = item.ArchiveDotOrgFormat,
//Original = item.Original, // TODO: Add to internal model
Summation = item.Summation,
//MatrixNumber = item.MatrixNumber, // TODO: Add to internal model
//CollectionCatalogNumber = item.CollectionCatalogNumber, // TODO: Add to internal model
Source = item.GetFieldValue<string?>(Models.Metadata.Rom.SourceKey),
BitTorrentMagnetHash = item.GetFieldValue<string?>(Models.Metadata.Rom.BitTorrentMagnetHashKey),
Size = item.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
MD5 = item.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key),
CRC32 = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
FileCount = item.GetFieldValue<string?>(Models.Metadata.Rom.FileCountKey),
Format = item.GetFieldValue<string?>(Models.Metadata.Rom.FormatKey),
Original = item.GetFieldValue<string?>(Models.Metadata.Rom.OriginalKey),
Summation = item.GetFieldValue<string?>(Models.Metadata.Rom.SummationKey),
MatrixNumber = item.GetFieldValue<string?>(Models.Metadata.Rom.MatrixNumberKey),
CollectionCatalogNumber = item.GetFieldValue<string?>(Models.Metadata.Rom.CollectionCatalogNumberKey),
// ASR-Related
//ASRDetectedLang = item.ASRDetectedLang, // TODO: Add to internal model
//ASRDetectedLangConf = item.ASRDetectedLangConf, // TODO: Add to internal model
//ASRTranscribedLang = item.ASRTranscribedLang, // TODO: Add to internal model
//WhisperASRModuleVersion = item.WhisperASRModuleVersion, // TODO: Add to internal model
//WhisperModelHash = item.WhisperModelHash, // TODO: Add to internal model
//WhisperModelName = item.WhisperModelName, // TODO: Add to internal model
//WhisperVersion = item.WhisperVersion, // TODO: Add to internal model
ASRDetectedLang = item.GetFieldValue<string?>(Models.Metadata.Rom.ASRDetectedLangKey),
ASRDetectedLangConf = item.GetFieldValue<string?>(Models.Metadata.Rom.ASRDetectedLangConfKey),
ASRTranscribedLang = item.GetFieldValue<string?>(Models.Metadata.Rom.ASRTranscribedLangKey),
WhisperASRModuleVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.WhisperASRModuleVersionKey),
WhisperModelHash = item.GetFieldValue<string?>(Models.Metadata.Rom.WhisperModelHashKey),
WhisperModelName = item.GetFieldValue<string?>(Models.Metadata.Rom.WhisperModelNameKey),
WhisperVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.WhisperVersionKey),
// OCR-Related
//ClothCoverDetectionModuleVersion = item.ClothCoverDetectionModuleVersions, // TODO: Add to internal model
//hOCRCharToWordhOCRVersion = item.hOCRCharToWordhOCRVersion, // TODO: Add to internal model
//hOCRCharToWordModuleVersion = item.hOCRCharToWordModuleVersion, // TODO: Add to internal model
//hOCRFtsTexthOCRVersion = item.hOCRFtsTexthOCRVersion, // TODO: Add to internal model
//hOCRFtsTextModuleVersion = item.hOCRFtsTextModuleVersion, // TODO: Add to internal model
//hOCRPageIndexhOCRVersion = item.hOCRPageIndexhOCRVersion, // TODO: Add to internal model
//hOCRPageIndexModuleVersion = item.hOCRPageIndexModuleVersion, // TODO: Add to internal model
//TesseractOCR = item.TesseractOCR, // TODO: Add to internal model
//TesseractOCRConverted = item.TesseractOCRConverted, // TODO: Add to internal model
//TesseractOCRDetectedLang = item.TesseractOCRDetectedLang, // TODO: Add to internal model
//TesseractOCRDetectedLangConf = item.TesseractOCRDetectedLangConf, // TODO: Add to internal model
//TesseractOCRDetectedScript = item.TesseractOCRDetectedScript, // TODO: Add to internal model
//TesseractOCRDetectedScriptConf = item.TesseractOCRDetectedScriptConf, // TODO: Add to internal model
//TesseractOCRParameters = item.TesseractOCRParameters, // TODO: Add to internal model
//TesseractOCRModuleVersion = item.TesseractOCRModuleVersion, // TODO: Add to internal model
//PDFModuleVersion = item.PDFModuleVersion, // TODO: Add to internal model
//WordConfidenceInterval0To10 = item.WordConfidenceInterval0To10, // TODO: Add to internal model
//WordConfidenceInterval11To20 = item.WordConfidenceInterval11To20, // TODO: Add to internal model
//WordConfidenceInterval21To30 = item.WordConfidenceInterval21To30, // TODO: Add to internal model
//WordConfidenceInterval31To40 = item.WordConfidenceInterval31To40, // TODO: Add to internal model
//WordConfidenceInterval41To50 = item.WordConfidenceInterval41To50, // TODO: Add to internal model
//WordConfidenceInterval51To60 = item.WordConfidenceInterval51To60, // TODO: Add to internal model
//WordConfidenceInterval61To70 = item.WordConfidenceInterval61To70, // TODO: Add to internal model
//WordConfidenceInterval71To80 = item.WordConfidenceInterval71To80, // TODO: Add to internal model
//WordConfidenceInterval81To90 = item.WordConfidenceInterval81To90, // TODO: Add to internal model
//WordConfidenceInterval91To100 = item.WordConfidenceInterval91To100, // TODO: Add to internal model
ClothCoverDetectionModuleVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.ClothCoverDetectionModuleVersionKey),
hOCRCharToWordhOCRVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.hOCRCharToWordhOCRVersionKey),
hOCRCharToWordModuleVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.hOCRCharToWordModuleVersionKey),
hOCRFtsTexthOCRVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.hOCRFtsTexthOCRVersionKey),
hOCRFtsTextModuleVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.hOCRFtsTextModuleVersionKey),
hOCRPageIndexhOCRVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.hOCRPageIndexhOCRVersionKey),
hOCRPageIndexModuleVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.hOCRPageIndexModuleVersionKey),
TesseractOCR = item.GetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRKey),
TesseractOCRConverted = item.GetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRConvertedKey),
TesseractOCRDetectedLang = item.GetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRDetectedLangKey),
TesseractOCRDetectedLangConf = item.GetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRDetectedLangConfKey),
TesseractOCRDetectedScript = item.GetFieldValue<string?>(fieldName: Models.Metadata.Rom.TesseractOCRDetectedScriptKey),
TesseractOCRDetectedScriptConf = item.GetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRDetectedScriptConfKey),
TesseractOCRParameters = item.GetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRParametersKey),
TesseractOCRModuleVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.TesseractOCRModuleVersionKey),
PDFModuleVersion = item.GetFieldValue<string?>(Models.Metadata.Rom.PDFModuleVersionKey),
WordConfidenceInterval0To10 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval0To10Key),
WordConfidenceInterval11To20 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval11To20Key),
WordConfidenceInterval21To30 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval21To30Key),
WordConfidenceInterval31To40 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval31To40Key),
WordConfidenceInterval41To50 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval41To50Key),
WordConfidenceInterval51To60 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval51To60Key),
WordConfidenceInterval61To70 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval61To70Key),
WordConfidenceInterval71To80 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval71To80Key),
WordConfidenceInterval81To90 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval81To90Key),
WordConfidenceInterval91To100 = item.GetFieldValue<string?>(Models.Metadata.Rom.WordConfidenceInterval91To100Key),
// Media-Related
//Album = item.Album, // TODO: Add to internal model
//Artist = item.Artist, // TODO: Add to internal model
//Bitrate = item.Bitrate, // TODO: Add to internal model
//Creator = item.Creator, // TODO: Add to internal model
//Height = item.Height, // TODO: Add to internal model
//Length = item.Length, // TODO: Add to internal model
//PreviewImage = item.PreviewImage, // TODO: Add to internal model
//Rotation = item.Rotation, // TODO: Add to internal model
//Title = item.Title, // TODO: Add to internal model
//Track = item.Track, // TODO: Add to internal model
//Width = item.Width, // TODO: Add to internal model
Album = item.GetFieldValue<string?>(Models.Metadata.Rom.AlbumKey),
Artist = item.GetFieldValue<string?>(Models.Metadata.Rom.ArtistKey),
Bitrate = item.GetFieldValue<string?>(Models.Metadata.Rom.BitrateKey),
Creator = item.GetFieldValue<string?>(Models.Metadata.Rom.CreatorKey),
Height = item.GetFieldValue<string?>(Models.Metadata.Rom.HeightKey),
Length = item.GetFieldValue<string?>(Models.Metadata.Rom.LengthKey),
PreviewImage = item.GetFieldValue<string?>(Models.Metadata.Rom.PreviewImageKey),
Rotation = item.GetFieldValue<string?>(Models.Metadata.Rom.RotationKey),
Title = item.GetFieldValue<string?>(Models.Metadata.Rom.TitleKey),
Track = item.GetFieldValue<string?>(Models.Metadata.Rom.TrackKey),
Width = item.GetFieldValue<string?>(Models.Metadata.Rom.WidthKey),
};
if (long.TryParse(item.Date ?? string.Empty, out long lastModifiedTime))
if (long.TryParse(item.GetFieldValue<string?>(Models.Metadata.Rom.DateKey) ?? string.Empty, out long lastModifiedTime))
file.LastModifiedTime = lastModifiedTime.ToString();
return file;

View File

@@ -65,15 +65,7 @@ namespace SabreTools.DatFiles.Formats
if (row == null)
return;
var rom = new Rom()
{
Size = Constants.SizeZero,
CRC = Constants.CRCZero,
MD5 = Constants.MD5Zero,
SHA1 = Constants.SHA1Zero,
ItemStatus = ItemStatus.None,
Machine = new Machine
var machine = new Machine
{
Name = row.Name,
Description = row.Title,
@@ -89,17 +81,23 @@ namespace SabreTools.DatFiles.Formats
DisplayType = row.DisplayType,
Comment = row.Extra,
Buttons = row.Buttons
},
AltName = row.AltRomname,
AltTitle = row.AltTitle,
// TODO: Add extended fields
};
var rom = new Rom()
{
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName("-");
rom.SetFieldValue<string?>(Models.Metadata.Rom.AltRomnameKey, row.AltRomname);
rom.SetFieldValue<string?>(Models.Metadata.Rom.AltTitleKey, row.AltTitle);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, Constants.CRCZero);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, Constants.MD5Zero);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, Constants.SHA1Zero);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, Constants.SizeZero);
rom.SetFieldValue<ItemStatus?>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
// Now process and add the rom
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);
}

View File

@@ -137,8 +137,8 @@ namespace SabreTools.DatFiles.Formats
Status = rom.Machine.Status,
DisplayCount = rom.Machine.DisplayCount,
DisplayType = rom.Machine.DisplayType,
AltRomname = rom.AltName,
AltTitle = rom.AltTitle,
AltRomname = rom.GetFieldValue<string?>(Models.Metadata.Rom.AltRomnameKey),
AltTitle = rom.GetFieldValue<string?>(Models.Metadata.Rom.AltTitleKey),
Extra = rom.Machine.Comment,
Buttons = rom.Machine.Buttons,
// TODO: Add extended fields

View File

@@ -168,14 +168,13 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Release
{
Region = release.Region,
Language = release.Language,
Date = release.Date,
Default = release.Default?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(release.Name);
item.SetFieldValue<string?>(Models.Metadata.Release.DateKey, release.Date);
item.SetFieldValue<bool?>(Models.Metadata.Release.DefaultKey, release.Default?.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Release.LanguageKey, release.Language);
item.SetFieldValue<string?>(Models.Metadata.Release.RegionKey, release.Region);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -202,12 +201,11 @@ namespace SabreTools.DatFiles.Formats
{
var item = new BiosSet
{
Description = biosset.Description,
Default = biosset.Default?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(biosset.Name);
item.SetFieldValue<bool?>(Models.Metadata.BiosSet.DefaultKey, biosset.Default?.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey, biosset.Description);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -234,30 +232,29 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Rom
{
Size = NumberHelper.ConvertToInt64(rom.Size),
CRC = rom.CRC,
MD5 = rom.MD5,
SHA1 = rom.SHA1,
SHA256 = rom.SHA256,
SHA384 = rom.SHA384,
SHA512 = rom.SHA512,
SpamSum = rom.SpamSum,
//xxHash364 = rom.xxHash364, // TODO: Add to internal model
//xxHash3128 = rom.xxHash3128, // TODO: Add to internal model
MergeTag = rom.Merge,
ItemStatus = rom.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL,
Region = rom.Region,
//Flags = rom.Flags, // TODO: Add to internal model
Offset = rom.Offs,
//Serial = rom.Serial, // TODO: Add to internal model
//Header = rom.Header, // TODO: Add to internal model
Date = rom.Date,
Inverted = rom.Inverted?.AsYesNo(),
MIA = rom.MIA?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(rom.Name);
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.CRC);
item.SetFieldValue<string?>(Models.Metadata.Rom.DateKey, rom.Date);
item.SetFieldValue<string?>(Models.Metadata.Rom.FlagsKey, rom.Flags);
item.SetFieldValue<string?>(Models.Metadata.Rom.HeaderKey, rom.Header);
item.SetFieldValue<bool?>(Models.Metadata.Rom.InvertedKey, rom.Inverted?.AsYesNo());
item.SetFieldValue<bool?>(Models.Metadata.Rom.MIAKey, rom.MIA?.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, rom.MD5);
item.SetFieldValue<string?>(Models.Metadata.Rom.MergeKey, rom.Merge);
item.SetFieldValue<string?>(Models.Metadata.Rom.OffsetKey, rom.Offs);
item.SetFieldValue<string?>(Models.Metadata.Rom.RegionKey, rom.Region);
item.SetFieldValue<string?>(Models.Metadata.Rom.SerialKey, rom.Serial);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.SHA1);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, rom.SHA256);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, rom.SHA384);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, rom.SHA512);
item.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size));
item.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, rom.SpamSum);
item.SetFieldValue<ItemStatus?>(Models.Metadata.Rom.StatusKey, rom.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL);
item.SetFieldValue<string?>(Models.Metadata.Rom.xxHash364Key, rom.xxHash364);
item.SetFieldValue<string?>(Models.Metadata.Rom.xxHash3128Key, rom.xxHash3128);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -284,15 +281,14 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Disk
{
MD5 = disk.MD5,
SHA1 = disk.SHA1,
MergeTag = disk.Merge,
ItemStatus = disk.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL,
//Flags = disk.Flags, // TODO: Add to internal model
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(disk.Name);
item.SetFieldValue<string?>(Models.Metadata.Disk.FlagsKey, disk.Flags);
item.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, disk.MD5);
item.SetFieldValue<string?>(Models.Metadata.Disk.MergeKey, disk.Merge);
item.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, disk.SHA1);
item.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -319,14 +315,13 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Media
{
MD5 = medium.MD5,
SHA1 = medium.SHA1,
SHA256 = medium.SHA256,
SpamSum = medium.SpamSum,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(medium.Name);
item.SetFieldValue<string?>(Models.Metadata.Media.MD5Key, medium.MD5);
item.SetFieldValue<string?>(Models.Metadata.Media.SHA1Key, medium.SHA1);
item.SetFieldValue<string?>(Models.Metadata.Media.SHA256Key, medium.SHA256);
item.SetFieldValue<string?>(Models.Metadata.Media.SpamSumKey, medium.SpamSum);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -382,13 +377,12 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Chip
{
ChipType = chip.Type?.AsEnumValue<ChipType>() ?? ChipType.NULL,
//Flags = chip.Flags, // TODO: Add to internal model
Clock = NumberHelper.ConvertToInt64(chip.Clock),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(chip.Name);
item.SetFieldValue<ChipType>(Models.Metadata.Chip.ChipTypeKey, chip.Type?.AsEnumValue<ChipType>() ?? ChipType.NULL);
item.SetFieldValue<long?>(Models.Metadata.Chip.ClockKey, NumberHelper.ConvertToInt64(chip.Clock));
item.SetFieldValue<string?>(Models.Metadata.Chip.FlagsKey, chip.Flags);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -415,23 +409,22 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Display
{
DisplayType = video.Screen?.AsEnumValue<DisplayType>() ?? DisplayType.NULL,
Width = NumberHelper.ConvertToInt64(video.X),
Height = NumberHelper.ConvertToInt64(video.Y),
//AspectX = video.AspectX, // TODO: Add to internal model or find mapping
//AspectY = video.AspectY, // TODO: Add to internal model or find mapping
Refresh = NumberHelper.ConvertToDouble(video.Freq),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<long?>("ASPECTX", NumberHelper.ConvertToInt64(video.AspectX));
item.SetFieldValue<long?>("ASPECTY", NumberHelper.ConvertToInt64(video.AspectY));
item.SetFieldValue<DisplayType>(Models.Metadata.Display.DisplayTypeKey, video.Screen?.AsEnumValue<DisplayType>() ?? DisplayType.NULL);
item.SetFieldValue<long?>(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(video.Y));
item.SetFieldValue<double?>(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(video.Freq));
item.SetFieldValue<long?>(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(video.X));
switch (video.Orientation)
{
case "horizontal":
item.Rotate = 0;
item.SetFieldValue<long?>(Models.Metadata.Display.RotateKey, 0);
break;
case "vertical":
item.Rotate = 90;
item.SetFieldValue<long?>(Models.Metadata.Display.RotateKey, 90);
break;
}
@@ -458,10 +451,9 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
var item = new Sound
{
Channels = NumberHelper.ConvertToInt64(sound.Channels),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<long?>(Models.Metadata.Sound.ChannelsKey, NumberHelper.ConvertToInt64(sound.Channels));
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -485,21 +477,18 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
var item = new Input
{
Players = NumberHelper.ConvertToInt64(input.Players),
//Control = input.Control, // TODO: Add to internal model or find mapping
Controls =
[
new Control
{
Buttons = NumberHelper.ConvertToInt64(input.Buttons),
},
],
Coins = NumberHelper.ConvertToInt64(input.Coins),
Tilt = input.Tilt?.AsYesNo(),
Service = input.Service?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<long?>(Models.Metadata.Input.CoinsKey, NumberHelper.ConvertToInt64(input.Coins));
//item.SetFieldValue<string?>(Models.Metadata.Input.ControlKey, input.Control);
item.SetFieldValue<long?>(Models.Metadata.Input.PlayersKey, NumberHelper.ConvertToInt64(input.Players));
item.SetFieldValue<bool?>(Models.Metadata.Input.ServiceKey, input.Service?.AsYesNo());
item.SetFieldValue<bool?>(Models.Metadata.Input.TiltKey, input.Tilt?.AsYesNo());
var control = new Control();
control.SetFieldValue<long?>(Models.Metadata.Control.ButtonsKey, NumberHelper.ConvertToInt64(input.Buttons));
item.SetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey, [control]);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -525,24 +514,23 @@ namespace SabreTools.DatFiles.Formats
{
var item = new DipSwitch
{
Values = [],
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(dipswitch.Name);
var values = new List<DipValue>();
foreach (string entry in dipswitch.Entry ?? [])
{
var dipValue = new DipValue
{
Value = entry,
Default = entry == dipswitch.Default,
};
var dipValue = new DipValue();
dipValue.SetName(dipswitch.Name);
dipValue.SetFieldValue<bool?>(Models.Metadata.DipValue.DefaultKey, entry == dipswitch.Default);
dipValue.SetFieldValue<string?>(Models.Metadata.DipValue.ValueKey, entry);
item.Values.Add(dipValue);
values.Add(dipValue);
}
item.SetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey, [.. values]);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
}
@@ -566,14 +554,13 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
var item = new Driver
{
Status = driver.Status?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL,
//Color = driver.Color, // TODO: Add to internal model or find mapping
//Sound = driver.Sound, // TODO: Add to internal model or find mapping
//PaletteSize = driver.PaletteSize, // TODO: Add to internal model or find mapping
//Blit = driver.Blit, // TODO: Add to internal model or find mapping
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<string?>(Models.Metadata.Driver.BlitKey, driver.Blit);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.ColorKey, driver.Color?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<long?>(Models.Metadata.Driver.PaletteSizeKey, NumberHelper.ConvertToInt64(driver.PaletteSize));
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.SoundKey, driver.Sound?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey, driver.Status?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);

View File

@@ -43,29 +43,29 @@ namespace SabreTools.DatFiles.Formats
case Release release:
if (string.IsNullOrEmpty(release.GetName()))
missingFields.Add(Models.Metadata.Release.NameKey);
if (string.IsNullOrEmpty(release.Region))
if (string.IsNullOrEmpty(release.GetFieldValue<string?>(Models.Metadata.Release.RegionKey)))
missingFields.Add(Models.Metadata.Release.RegionKey);
break;
case BiosSet biosset:
if (string.IsNullOrEmpty(biosset.GetName()))
missingFields.Add(Models.Metadata.BiosSet.NameKey);
if (string.IsNullOrEmpty(biosset.Description))
if (string.IsNullOrEmpty(biosset.GetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey)))
missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetName()))
missingFields.Add(Models.Metadata.Rom.NameKey);
if (rom.Size == null || rom.Size < 0)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < 0)
missingFields.Add(Models.Metadata.Rom.SizeKey);
if (string.IsNullOrEmpty(rom.CRC)
&& string.IsNullOrEmpty(rom.MD5)
&& string.IsNullOrEmpty(rom.SHA1)
&& string.IsNullOrEmpty(rom.SHA256)
&& string.IsNullOrEmpty(rom.SHA384)
&& string.IsNullOrEmpty(rom.SHA512)
&& string.IsNullOrEmpty(rom.SpamSum))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)))
{
missingFields.Add(Models.Metadata.Rom.SHA1Key);
}
@@ -74,8 +74,8 @@ namespace SabreTools.DatFiles.Formats
case Disk disk:
if (string.IsNullOrEmpty(disk.GetName()))
missingFields.Add(Models.Metadata.Disk.NameKey);
if (string.IsNullOrEmpty(disk.MD5)
&& string.IsNullOrEmpty(disk.SHA1))
if (string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key))
&& string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
{
missingFields.Add(Models.Metadata.Disk.SHA1Key);
}
@@ -92,26 +92,26 @@ namespace SabreTools.DatFiles.Formats
break;
case Chip chip:
if (!chip.ChipTypeSpecified)
if (chip.GetFieldValue<ChipType>(Models.Metadata.Chip.ChipTypeKey) == ChipType.NULL)
missingFields.Add(Models.Metadata.Chip.ChipTypeKey);
if (string.IsNullOrEmpty(chip.GetName()))
missingFields.Add(Models.Metadata.Chip.NameKey);
break;
case Display display:
if (!display.DisplayTypeSpecified)
if (display.GetFieldValue<DisplayType>(Models.Metadata.Display.DisplayTypeKey) == DisplayType.NULL)
missingFields.Add(Models.Metadata.Display.DisplayTypeKey);
if (!display.RotateSpecified)
if (display.GetFieldValue<long?>(Models.Metadata.Display.RotateKey) == null)
missingFields.Add(Models.Metadata.Display.RotateKey);
break;
case Sound sound:
if (!sound.ChannelsSpecified)
if (sound.GetFieldValue<long?>(Models.Metadata.Sound.ChannelsKey) == null)
missingFields.Add(Models.Metadata.Sound.ChannelsKey);
break;
case Input input:
if (!input.PlayersSpecified)
if (input.GetFieldValue<long?>(Models.Metadata.Input.PlayersKey) == null)
missingFields.Add(Models.Metadata.Input.PlayersKey);
if (!input.ControlsSpecified)
missingFields.Add(Models.Metadata.Input.ControlKey);
@@ -123,9 +123,9 @@ namespace SabreTools.DatFiles.Formats
break;
case Driver driver:
if (!driver.StatusSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.StatusKey);
if (!driver.EmulationSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.EmulationKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.EmulationKey);
break;
}
@@ -338,14 +338,12 @@ namespace SabreTools.DatFiles.Formats
var release = new Models.ClrMamePro.Release
{
Name = item.GetName(),
Region = item.Region,
Language = item.Language,
Date = item.Date,
Region = item.GetFieldValue<string?>(Models.Metadata.Release.RegionKey),
Language = item.GetFieldValue<string?>(Models.Metadata.Release.LanguageKey),
Date = item.GetFieldValue<string?>(Models.Metadata.Release.DateKey),
Default = item.GetFieldValue<bool?>(Models.Metadata.Release.DefaultKey).FromYesNo(),
};
if (item.DefaultSpecified)
release.Default = item.Default.FromYesNo();
return release;
}
@@ -357,12 +355,10 @@ namespace SabreTools.DatFiles.Formats
var biosset = new Models.ClrMamePro.BiosSet
{
Name = item.GetName(),
Description = item.Description,
Default = item.GetFieldValue<bool?>(Models.Metadata.BiosSet.DefaultKey).FromYesNo(),
Description = item.GetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey),
};
if (item.DefaultSpecified)
biosset.Default = item.Default.FromYesNo();
return biosset;
}
@@ -374,31 +370,29 @@ namespace SabreTools.DatFiles.Formats
var rom = new Models.ClrMamePro.Rom
{
Name = item.GetName(),
Size = item.Size?.ToString(),
CRC = item.CRC,
MD5 = item.MD5,
SHA1 = item.SHA1,
SHA256 = item.SHA256,
SHA384 = item.SHA384,
SHA512 = item.SHA512,
SpamSum = item.SpamSum,
//xxHash364 = item.xxHash364, // TODO: Add to internal model
//xxHash3128 = item.xxHash3128, // TODO: Add to internal model
Merge = item.MergeTag,
Region = item.Region,
//Flags = item.Flags, // TODO: Add to internal model
Offs = item.Offset,
//Serial = item.Serial, // TODO: Add to internal model
//Header = item.Header, // TODO: Add to internal model
Date = item.Date,
Size = item.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
CRC = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
MD5 = item.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
SHA256 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key),
SHA384 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key),
SHA512 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key),
SpamSum = item.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey),
xxHash364 = item.GetFieldValue<string?>(Models.Metadata.Rom.xxHash364Key),
xxHash3128 = item.GetFieldValue<string?>(Models.Metadata.Rom.xxHash3128Key),
Merge = item.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey),
Region = item.GetFieldValue<string?>(Models.Metadata.Rom.RegionKey),
Flags = item.GetFieldValue<string?>(Models.Metadata.Rom.FlagsKey),
Date = item.GetFieldValue<string?>(Models.Metadata.Rom.DateKey),
Offs = item.GetFieldValue<string?>(Models.Metadata.Rom.OffsetKey),
Serial = item.GetFieldValue<string?>(Models.Metadata.Rom.SerialKey),
Header = item.GetFieldValue<string?>(Models.Metadata.Rom.HeaderKey),
Inverted = item.GetFieldValue<bool?>(Models.Metadata.Rom.InvertedKey).FromYesNo(),
MIA = item.GetFieldValue<bool?>(Models.Metadata.Rom.MIAKey).FromYesNo(),
};
if (item.ItemStatusSpecified)
rom.Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false);
if (item.InvertedSpecified)
rom.Inverted = item.Inverted.FromYesNo();
if (item.MIASpecified)
rom.MIA = item.MIA.FromYesNo();
rom.Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey).AsStringValue<ItemStatus>(useSecond: false);
return rom;
}
@@ -411,14 +405,14 @@ namespace SabreTools.DatFiles.Formats
var disk = new Models.ClrMamePro.Disk
{
Name = item.GetName(),
MD5 = item.MD5,
SHA1 = item.SHA1,
Merge = item.MergeTag,
//Flags = item.Flags, // TODO: Add to internal model
MD5 = item.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key),
Merge = item.GetFieldValue<string?>(Models.Metadata.Disk.MergeKey),
Flags = item.GetFieldValue<string?>(Models.Metadata.Disk.FlagsKey),
};
if (item.ItemStatusSpecified)
disk.Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false);
if (item.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) != ItemStatus.NULL)
disk.Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey).AsStringValue<ItemStatus>(useSecond: false);
return disk;
}
@@ -431,10 +425,10 @@ namespace SabreTools.DatFiles.Formats
var media = new Models.ClrMamePro.Media
{
Name = item.GetName(),
MD5 = item.MD5,
SHA1 = item.SHA1,
SHA256 = item.SHA256,
SpamSum = item.SpamSum,
MD5 = item.GetFieldValue<string?>(Models.Metadata.Media.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key),
SHA256 = item.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key),
SpamSum = item.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey),
};
return media;
}
@@ -470,10 +464,10 @@ namespace SabreTools.DatFiles.Formats
{
var chip = new Models.ClrMamePro.Chip
{
Type = item.ChipType.AsStringValue<ChipType>(),
Type = item.GetFieldValue<ChipType>(Models.Metadata.Chip.ChipTypeKey).AsStringValue<ChipType>(),
Name = item.GetName(),
//Flags = item.Flags, // TODO: Add to internal model
Clock = item.Clock?.ToString(),
Flags = item.GetFieldValue<string?>(Models.Metadata.Chip.FlagsKey),
Clock = item.GetFieldValue<long?>(Models.Metadata.Chip.ClockKey)?.ToString(),
};
return chip;
}
@@ -485,15 +479,15 @@ namespace SabreTools.DatFiles.Formats
{
var video = new Models.ClrMamePro.Video
{
Screen = item.DisplayType.AsStringValue<DisplayType>(),
X = item.Width?.ToString(),
Y = item.Height?.ToString(),
//AspectX = item.AspectX, // TODO: Add to internal model or find mapping
//AspectY = item.AspectY, // TODO: Add to internal model or find mapping
Freq = item.Refresh?.ToString(),
Screen = item.GetFieldValue<DisplayType>(Models.Metadata.Display.DisplayTypeKey).AsStringValue<DisplayType>(),
X = item.GetFieldValue<long?>(Models.Metadata.Display.WidthKey)?.ToString(),
Y = item.GetFieldValue<long?>(Models.Metadata.Display.HeightKey)?.ToString(),
AspectX = item.GetFieldValue<string?>("ASPECTX"),
AspectY = item.GetFieldValue<string?>("ASPECTY"),
Freq = item.GetFieldValue<double?>(Models.Metadata.Display.RefreshKey)?.ToString(),
};
switch (item.Rotate)
switch (item.GetFieldValue<long?>(Models.Metadata.Display.RotateKey))
{
case 0:
case 180:
@@ -515,7 +509,7 @@ namespace SabreTools.DatFiles.Formats
{
var sound = new Models.ClrMamePro.Sound
{
Channels = item.Channels?.ToString(),
Channels = item.GetFieldValue<long?>(Models.Metadata.Sound.ChannelsKey)?.ToString(),
};
return sound;
}
@@ -527,15 +521,15 @@ namespace SabreTools.DatFiles.Formats
{
var input = new Models.ClrMamePro.Input
{
Players = item.Players?.ToString(),
//Control = item.Control, // TODO: Add to internal model or find mapping
Coins = item.Coins?.ToString(),
Tilt = item.Tilt.FromYesNo(),
Service = item.Service.FromYesNo(),
Players = item.GetFieldValue<long?>(Models.Metadata.Input.PlayersKey)?.ToString(),
//Control = item.GetFieldValue<string?>(Models.Metadata.Input.ControlKey),
Coins = item.GetFieldValue<long?>(Models.Metadata.Input.CoinsKey)?.ToString(),
Tilt = item.GetFieldValue<bool?>(Models.Metadata.Input.TiltKey).FromYesNo(),
Service = item.GetFieldValue<bool?>(Models.Metadata.Input.ServiceKey).FromYesNo(),
};
if (item.ControlsSpecified)
input.Buttons = item.Controls![0].Buttons?.ToString();
input.Buttons = item.GetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey)![0].GetFieldValue<long?>(Models.Metadata.Control.ButtonsKey)?.ToString();
return input;
}
@@ -553,11 +547,11 @@ namespace SabreTools.DatFiles.Formats
if (item.ValuesSpecified)
{
var entries = new List<string>();
foreach (var setting in item.Values!)
foreach (var setting in item.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey)!)
{
entries.Add(setting.Value!);
if (setting.Default == true)
dipswitch.Default = setting.Value;
entries.Add(setting.GetFieldValue<string?>(Models.Metadata.DipValue.ValueKey)!);
if (setting.GetFieldValue<bool?>(Models.Metadata.DipValue.DefaultKey) == true)
dipswitch.Default = setting.GetFieldValue<string?>(Models.Metadata.DipValue.ValueKey);
}
dipswitch.Entry = [.. entries];
@@ -573,12 +567,11 @@ namespace SabreTools.DatFiles.Formats
{
var driver = new Models.ClrMamePro.Driver
{
Status = item.Status.AsStringValue<SupportStatus>(),
//Color = item.Color, // TODO: Add to internal model or find mapping
//Sound = item.Sound, // TODO: Add to internal model or find mapping
//PaletteSize = item.PaletteSize, // TODO: Add to internal model or find mapping
//Blit = item.Blit, // TODO: Add to internal model or find mapping
Status = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey).AsStringValue<SupportStatus>(),
Color = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.ColorKey).AsStringValue<SupportStatus>(),
Sound = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.SoundKey).AsStringValue<SupportStatus>(),
PaletteSize = item.GetFieldValue<long?>(Models.Metadata.Driver.PaletteSizeKey)?.ToString(),
Blit = item.GetFieldValue<string?>(Models.Metadata.Driver.BlitKey),
};
return driver;
}

View File

@@ -133,17 +133,16 @@ namespace SabreTools.DatFiles.Formats
return;
containsItems = true;
foreach (var rom in files)
foreach (var file in files)
{
var item = new Rom
{
Size = NumberHelper.ConvertToInt64(rom.Size),
CRC = rom.CRC,
Date = rom.Date,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(rom.Name);
item.SetName(file.Name);
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, file.CRC);
item.SetFieldValue<string?>(Models.Metadata.Rom.DateKey, file.Date);
item.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(file.Size));
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);

View File

@@ -33,11 +33,11 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Rom rom:
if (!rom.SizeSpecified)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null)
missingFields.Add(Models.Metadata.Rom.SizeKey);
// if (string.IsNullOrEmpty(rom.Date))
// missingFields.Add(Models.Metadata.Rom.DateKey);
if (string.IsNullOrEmpty(rom.CRC))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)))
missingFields.Add(Models.Metadata.Rom.CRCKey);
break;
}
@@ -179,9 +179,9 @@ namespace SabreTools.DatFiles.Formats
var rom = new Models.DosCenter.File
{
Name = item.GetName(),
Size = item.Size?.ToString(),
CRC = item.CRC,
Date = item.Date,
Size = item.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
CRC = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
Date = item.GetFieldValue<string?>(Models.Metadata.Rom.DateKey),
};
return rom;
}

View File

@@ -100,16 +100,15 @@ namespace SabreTools.DatFiles.Formats
var rom = new Rom()
{
Size = NumberHelper.ConvertToInt64(row.Size),
CRC = row.CRC32,
MD5 = row.MD5,
SHA1 = row.SHA1,
SHA256 = row.SHA256,
ItemStatus = ItemStatus.None,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(name);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, row.CRC32);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, row.MD5);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, row.SHA1);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, row.SHA256);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size));
rom.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
// Now process and add the rom
rom.CopyMachineInformation(machine);

View File

@@ -33,13 +33,13 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.SHA256))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)))
missingFields.Add(Models.Metadata.Rom.SHA256Key);
if (string.IsNullOrEmpty(rom.SHA1))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
missingFields.Add(Models.Metadata.Rom.SHA1Key);
if (string.IsNullOrEmpty(rom.MD5))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)))
missingFields.Add(Models.Metadata.Rom.MD5Key);
if (string.IsNullOrEmpty(rom.CRC))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)))
missingFields.Add(Models.Metadata.Rom.CRCKey);
break;
}
@@ -138,12 +138,12 @@ namespace SabreTools.DatFiles.Formats
{
var row = new Models.EverdriveSMDB.Row
{
SHA256 = rom.SHA256,
SHA256 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key),
Name = $"{rom.Machine.Name ?? string.Empty}/{rom.GetName()}",
SHA1 = rom.SHA1,
MD5 = rom.MD5,
CRC32 = rom.CRC,
Size = rom.Size?.ToString(),
SHA1 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
MD5 = rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key),
CRC32 = rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
Size = rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
};
return row;
}

View File

@@ -146,12 +146,11 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Rom:
var rom = new Rom
{
Size = null,
CRC = sfv.Hash,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(itemName);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, sfv.Hash);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);
@@ -194,11 +193,10 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Disk:
var disk = new Disk
{
MD5 = md5.Hash,
Source = new Source { Index = indexId, Name = filename },
};
disk.SetName(itemName);
disk.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, md5.Hash);
disk.CopyMachineInformation(machine);
ParseAddHelper(disk, statsOnly);
@@ -207,11 +205,10 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Media:
var media = new Media
{
MD5 = md5.Hash,
Source = new Source { Index = indexId, Name = filename },
};
media.SetName(itemName);
media.SetFieldValue<string?>(Models.Metadata.Media.MD5Key, md5.Hash);
media.CopyMachineInformation(machine);
ParseAddHelper(media, statsOnly);
@@ -220,12 +217,11 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Rom:
var rom = new Rom
{
Size = null,
MD5 = md5.Hash,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(itemName);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, md5.Hash);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);
@@ -268,11 +264,10 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Disk:
var disk = new Disk
{
SHA1 = sha1.Hash,
Source = new Source { Index = indexId, Name = filename },
};
disk.SetName(itemName);
disk.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, sha1.Hash);
disk.CopyMachineInformation(machine);
ParseAddHelper(disk, statsOnly);
@@ -281,11 +276,10 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Media:
var media = new Media
{
SHA1 = sha1.Hash,
Source = new Source { Index = indexId, Name = filename },
};
media.SetName(itemName);
media.SetFieldValue<string?>(Models.Metadata.Media.SHA1Key, sha1.Hash);
media.CopyMachineInformation(machine);
ParseAddHelper(media, statsOnly);
@@ -294,12 +288,11 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Rom:
var rom = new Rom
{
Size = null,
SHA1 = sha1.Hash,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(itemName);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, sha1.Hash);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SizeKey, null);
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);
@@ -342,11 +335,10 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Media:
var media = new Media
{
SHA256 = sha256.Hash,
Source = new Source { Index = indexId, Name = filename },
};
media.SetName(itemName);
media.SetFieldValue<string?>(Models.Metadata.Media.SHA256Key, sha256.Hash);
media.CopyMachineInformation(machine);
ParseAddHelper(media, statsOnly);
@@ -356,12 +348,11 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Rom:
var rom = new Rom
{
Size = null,
SHA256 = sha256.Hash,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(itemName);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, sha256.Hash);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);
@@ -406,12 +397,11 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Rom:
var rom = new Rom
{
Size = null,
SHA384 = sha384.Hash,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(itemName);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, sha384.Hash);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);
@@ -456,12 +446,11 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Rom:
var rom = new Rom
{
Size = null,
SHA512 = sha512.Hash,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(itemName);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, sha512.Hash);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);
@@ -504,11 +493,10 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Media:
var media = new Media
{
SpamSum = spamsum.Hash,
Source = new Source { Index = indexId, Name = filename },
};
media.SetName(itemName);
media.SetFieldValue<string?>(Models.Metadata.Media.SpamSumKey, spamsum.Hash);
media.CopyMachineInformation(machine);
ParseAddHelper(media, statsOnly);
@@ -518,12 +506,11 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Rom:
var rom = new Rom
{
Size = null,
SpamSum = spamsum.Hash,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(itemName);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, spamsum.Hash);
rom.CopyMachineInformation(machine);
ParseAddHelper(rom, statsOnly);

View File

@@ -40,7 +40,7 @@ namespace SabreTools.DatFiles.Formats
switch (datItem.ItemType)
{
case ItemType.Rom:
if (string.IsNullOrEmpty((datItem as Rom)?.CRC))
if (string.IsNullOrEmpty((datItem as Rom)?.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)))
missingFields.Add(Models.Metadata.Rom.CRCKey);
break;
default:
@@ -52,15 +52,15 @@ namespace SabreTools.DatFiles.Formats
switch (datItem.ItemType)
{
case ItemType.Disk:
if (string.IsNullOrEmpty((datItem as Disk)?.MD5))
if (string.IsNullOrEmpty((datItem as Disk)?.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)))
missingFields.Add(Models.Metadata.Disk.MD5Key);
break;
case ItemType.Media:
if (string.IsNullOrEmpty((datItem as Media)?.MD5))
if (string.IsNullOrEmpty((datItem as Media)?.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)))
missingFields.Add(Models.Metadata.Media.MD5Key);
break;
case ItemType.Rom:
if (string.IsNullOrEmpty((datItem as Rom)?.MD5))
if (string.IsNullOrEmpty((datItem as Rom)?.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)))
missingFields.Add(Models.Metadata.Rom.MD5Key);
break;
default:
@@ -72,15 +72,15 @@ namespace SabreTools.DatFiles.Formats
switch (datItem.ItemType)
{
case ItemType.Disk:
if (string.IsNullOrEmpty((datItem as Disk)?.SHA1))
if (string.IsNullOrEmpty((datItem as Disk)?.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
missingFields.Add(Models.Metadata.Disk.SHA1Key);
break;
case ItemType.Media:
if (string.IsNullOrEmpty((datItem as Media)?.SHA1))
if (string.IsNullOrEmpty((datItem as Media)?.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)))
missingFields.Add(Models.Metadata.Media.SHA1Key);
break;
case ItemType.Rom:
if (string.IsNullOrEmpty((datItem as Rom)?.SHA1))
if (string.IsNullOrEmpty((datItem as Rom)?.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
missingFields.Add(Models.Metadata.Rom.SHA1Key);
break;
default:
@@ -92,11 +92,11 @@ namespace SabreTools.DatFiles.Formats
switch (datItem.ItemType)
{
case ItemType.Media:
if (string.IsNullOrEmpty((datItem as Media)?.SHA256))
if (string.IsNullOrEmpty((datItem as Media)?.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)))
missingFields.Add(Models.Metadata.Media.SHA256Key);
break;
case ItemType.Rom:
if (string.IsNullOrEmpty((datItem as Rom)?.SHA256))
if (string.IsNullOrEmpty((datItem as Rom)?.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)))
missingFields.Add(Models.Metadata.Rom.SHA256Key);
break;
default:
@@ -108,7 +108,7 @@ namespace SabreTools.DatFiles.Formats
switch (datItem.ItemType)
{
case ItemType.Rom:
if (string.IsNullOrEmpty((datItem as Rom)?.SHA384))
if (string.IsNullOrEmpty((datItem as Rom)?.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)))
missingFields.Add(Models.Metadata.Rom.SHA384Key);
break;
default:
@@ -120,7 +120,7 @@ namespace SabreTools.DatFiles.Formats
switch (datItem.ItemType)
{
case ItemType.Rom:
if (string.IsNullOrEmpty((datItem as Rom)?.SHA512))
if (string.IsNullOrEmpty((datItem as Rom)?.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)))
missingFields.Add(Models.Metadata.Rom.SHA512Key);
break;
default:
@@ -132,11 +132,11 @@ namespace SabreTools.DatFiles.Formats
switch (datItem.ItemType)
{
case ItemType.Media:
if (string.IsNullOrEmpty((datItem as Media)?.SpamSum))
if (string.IsNullOrEmpty((datItem as Media)?.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)))
missingFields.Add(Models.Metadata.Media.SpamSumKey);
break;
case ItemType.Rom:
if (string.IsNullOrEmpty((datItem as Rom)?.SpamSum))
if (string.IsNullOrEmpty((datItem as Rom)?.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)))
missingFields.Add(Models.Metadata.Rom.SpamSumKey);
break;
default:
@@ -252,7 +252,7 @@ namespace SabreTools.DatFiles.Formats
sfvs.Add(new Models.Hashfile.SFV
{
File = name + rom.GetName(),
Hash = rom.CRC,
Hash = rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
});
break;
}
@@ -302,7 +302,7 @@ namespace SabreTools.DatFiles.Formats
case Disk disk:
md5s.Add(new Models.Hashfile.MD5
{
Hash = disk.MD5,
Hash = disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key),
File = name + disk.GetName(),
});
break;
@@ -310,7 +310,7 @@ namespace SabreTools.DatFiles.Formats
case Media media:
md5s.Add(new Models.Hashfile.MD5
{
Hash = media.MD5,
Hash = media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key),
File = name + media.GetName(),
});
break;
@@ -318,7 +318,7 @@ namespace SabreTools.DatFiles.Formats
case Rom rom:
md5s.Add(new Models.Hashfile.MD5
{
Hash = rom.MD5,
Hash = rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key),
File = name + rom.GetName(),
});
break;
@@ -369,7 +369,7 @@ namespace SabreTools.DatFiles.Formats
case Disk disk:
sha1s.Add(new Models.Hashfile.SHA1
{
Hash = disk.SHA1,
Hash = disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key),
File = name + disk.GetName(),
});
break;
@@ -377,7 +377,7 @@ namespace SabreTools.DatFiles.Formats
case Media media:
sha1s.Add(new Models.Hashfile.SHA1
{
Hash = media.SHA1,
Hash = media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key),
File = name + media.GetName(),
});
break;
@@ -385,7 +385,7 @@ namespace SabreTools.DatFiles.Formats
case Rom rom:
sha1s.Add(new Models.Hashfile.SHA1
{
Hash = rom.SHA1,
Hash = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
File = name + rom.GetName(),
});
break;
@@ -436,7 +436,7 @@ namespace SabreTools.DatFiles.Formats
case Media media:
sha256s.Add(new Models.Hashfile.SHA256
{
Hash = media.SHA256,
Hash = media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key),
File = name + media.GetName(),
});
break;
@@ -444,7 +444,7 @@ namespace SabreTools.DatFiles.Formats
case Rom rom:
sha256s.Add(new Models.Hashfile.SHA256
{
Hash = rom.SHA256,
Hash = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key),
File = name + rom.GetName(),
});
break;
@@ -495,7 +495,7 @@ namespace SabreTools.DatFiles.Formats
case Rom rom:
sha384s.Add(new Models.Hashfile.SHA384
{
Hash = rom.SHA384,
Hash = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key),
File = name + rom.GetName(),
});
break;
@@ -546,7 +546,7 @@ namespace SabreTools.DatFiles.Formats
case Rom rom:
sha512s.Add(new Models.Hashfile.SHA512
{
Hash = rom.SHA512,
Hash = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key),
File = name + rom.GetName(),
});
break;
@@ -597,7 +597,7 @@ namespace SabreTools.DatFiles.Formats
case Media media:
spamsums.Add(new Models.Hashfile.SpamSum
{
Hash = media.SpamSum,
Hash = media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey),
File = name + media.GetName(),
});
break;
@@ -605,7 +605,7 @@ namespace SabreTools.DatFiles.Formats
case Rom rom:
spamsums.Add(new Models.Hashfile.SpamSum
{
Hash = rom.SpamSum,
Hash = rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey),
File = name + rom.GetName(),
});
break;

View File

@@ -116,16 +116,15 @@ namespace SabreTools.DatFiles.Formats
{
var disk = new Disk
{
ItemStatus = ItemStatus.None,
Source = new Source { Index = indexId, Name = filename },
};
disk.SetName(row.Name);
disk.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, ItemStatus.None);
if (!string.IsNullOrEmpty(row.MD5))
disk.MD5 = row.MD5;
disk.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, row.MD5);
else
disk.SHA1 = row.SHA1;
disk.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, row.SHA1);
// Now process and add the item
disk.CopyMachineInformation(machine);
@@ -139,14 +138,13 @@ namespace SabreTools.DatFiles.Formats
{
var rom = new Rom
{
Size = NumberHelper.ConvertToInt64(row.Size),
CRC = row.CRC,
SHA1 = row.SHA1,
ItemStatus = ItemStatus.None,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(row.Name);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, row.CRC);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, row.SHA1);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size));
rom.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
// Now process and add the item
rom.CopyMachineInformation(machine);
@@ -162,16 +160,15 @@ namespace SabreTools.DatFiles.Formats
{
var disk = new Disk
{
ItemStatus = ItemStatus.BadDump,
Source = new Source { Index = indexId, Name = filename },
};
disk.SetName(row.Name);
disk.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, value: ItemStatus.BadDump);
if (!string.IsNullOrEmpty(row.MD5))
disk.MD5 = row.MD5;
disk.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, row.MD5);
else
disk.SHA1 = row.SHA1;
disk.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, row.SHA1);
// Now process and add the item
disk.CopyMachineInformation(machine);
@@ -184,13 +181,12 @@ namespace SabreTools.DatFiles.Formats
{
var disk = new Disk
{
MD5 = null,
SHA1 = null,
ItemStatus = ItemStatus.Nodump,
Source = new Source { Index = indexId, Name = filename },
};
disk.SetName(row.Name);
disk.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, null);
disk.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, null);
disk.SetFieldValue<ItemStatus?>(Models.Metadata.Disk.StatusKey, ItemStatus.Nodump);
// Now process and add the item
disk.CopyMachineInformation(machine);
@@ -204,14 +200,13 @@ namespace SabreTools.DatFiles.Formats
{
var rom = new Rom
{
Size = NumberHelper.ConvertToInt64(row.Size),
CRC = row.CRC,
SHA1 = row.SHA1,
ItemStatus = ItemStatus.BadDump,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(row.Name);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, row.CRC);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, row.SHA1);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size));
rom.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.BadDump);
// Now process and add the item
rom.CopyMachineInformation(machine);
@@ -224,14 +219,13 @@ namespace SabreTools.DatFiles.Formats
{
var rom = new Rom
{
Size = NumberHelper.ConvertToInt64(row.Size),
CRC = null,
SHA1 = null,
ItemStatus = ItemStatus.Nodump,
Source = new Source { Index = indexId, Name = filename },
};
rom.SetName(row.Name);
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, null);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, null);
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size));
rom.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump);
// Now process and add the item
rom.CopyMachineInformation(machine);

View File

@@ -34,19 +34,19 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Disk disk:
if (string.IsNullOrEmpty(disk.MD5)
&& string.IsNullOrEmpty(disk.SHA1))
if (string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key))
&& string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
{
missingFields.Add(Models.Metadata.Disk.SHA1Key);
}
break;
case Rom rom:
if (rom.Size == null || rom.Size < 0)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < 0)
missingFields.Add(Models.Metadata.Rom.SizeKey);
if (string.IsNullOrEmpty(rom.CRC))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)))
missingFields.Add(Models.Metadata.Rom.CRCKey);
if (string.IsNullOrEmpty(rom.SHA1))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
missingFields.Add(Models.Metadata.Rom.SHA1Key);
break;
}
@@ -166,7 +166,7 @@ namespace SabreTools.DatFiles.Formats
/// <summary>
private static Models.Listrom.Row? CreateRow(Disk disk)
{
if (disk.ItemStatus == ItemStatus.Nodump)
if (disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump)
{
return new Models.Listrom.Row
{
@@ -174,7 +174,7 @@ namespace SabreTools.DatFiles.Formats
NoGoodDumpKnown = true,
};
}
else if (disk.ItemStatus == ItemStatus.BadDump)
else if (disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump)
{
var row = new Models.Listrom.Row
{
@@ -182,10 +182,10 @@ namespace SabreTools.DatFiles.Formats
Bad = true,
};
if (!string.IsNullOrEmpty(disk.MD5))
row.MD5 = disk.MD5;
if (!string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)))
row.MD5 = disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key);
else
row.SHA1 = disk.SHA1;
row.SHA1 = disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key);
return row;
}
@@ -196,10 +196,10 @@ namespace SabreTools.DatFiles.Formats
Name = disk.GetName(),
};
if (!string.IsNullOrEmpty(disk.MD5))
row.MD5 = disk.MD5;
if (!string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)))
row.MD5 = disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key);
else
row.SHA1 = disk.SHA1;
row.SHA1 = disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key);
return row;
}
@@ -210,24 +210,24 @@ namespace SabreTools.DatFiles.Formats
/// <summary>
private static Models.Listrom.Row? CreateRow(Rom rom)
{
if (rom.ItemStatus == ItemStatus.Nodump)
if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump)
{
return new Models.Listrom.Row
{
Name = rom.GetName(),
Size = rom.Size?.ToString(),
Size = rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
NoGoodDumpKnown = true,
};
}
else if (rom.ItemStatus == ItemStatus.BadDump)
else if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump)
{
return new Models.Listrom.Row
{
Name = rom.GetName(),
Size = rom.Size?.ToString(),
Size = rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
Bad = true,
CRC = rom.CRC,
SHA1 = rom.SHA1,
CRC = rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
SHA1 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
};
}
else
@@ -235,9 +235,9 @@ namespace SabreTools.DatFiles.Formats
return new Models.Listrom.Row
{
Name = rom.GetName(),
Size = rom.Size?.ToString(),
CRC = rom.CRC,
SHA1 = rom.SHA1,
Size = rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
CRC = rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
SHA1 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
};
}
}

View File

@@ -172,12 +172,11 @@ namespace SabreTools.DatFiles.Formats
{
var item = new BiosSet
{
Description = biosset.Description,
Default = biosset.Default?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(biosset.Name);
item.SetFieldValue<bool?>(Models.Metadata.BiosSet.DefaultKey, biosset.Default?.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey, biosset.Description);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -204,21 +203,20 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Rom
{
Bios = rom.Bios,
Size = NumberHelper.ConvertToInt64(rom.Size),
CRC = rom.CRC,
SHA1 = rom.SHA1,
MergeTag = rom.Merge,
Region = rom.Region,
Offset = rom.Offset,
ItemStatus = rom.Status.AsEnumValue<ItemStatus>(),
Optional = rom.Optional.AsYesNo(),
//Dispose = rom.Dispose.AsYesNo(), // TODO: Add to internal model
//SoundOnly = rom.SoundOnly.AsYesNo(), // TODO: Add to internal model
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(rom.Name);
item.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size));
item.SetFieldValue<string?>(Models.Metadata.Rom.BiosKey, rom.Bios);
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.CRC);
item.SetFieldValue<bool?>(Models.Metadata.Rom.DisposeKey, rom.Dispose.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Rom.MergeKey, rom.Merge);
item.SetFieldValue<string?>(Models.Metadata.Rom.OffsetKey, rom.Offset);
item.SetFieldValue<bool?>(Models.Metadata.Rom.OptionalKey, rom.Optional.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Rom.RegionKey, rom.Region);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.SHA1);
item.SetFieldValue<bool?>(Models.Metadata.Rom.SoundOnlyKey, rom.SoundOnly.AsYesNo());
item.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, rom.Status.AsEnumValue<ItemStatus>());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -245,18 +243,17 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Disk
{
MD5 = disk.MD5,
SHA1 = disk.SHA1,
MergeTag = disk.Merge,
Region = disk.Region,
Index = disk.Index,
Writable = disk.Writable.AsYesNo(),
ItemStatus = disk.Status.AsEnumValue<ItemStatus>(),
Optional = disk.Optional.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(disk.Name);
item.SetFieldValue<string?>(Models.Metadata.Disk.IndexKey, disk.Index);
item.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL);
item.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, disk.MD5);
item.SetFieldValue<string?>(Models.Metadata.Disk.MergeKey, disk.Merge);
item.SetFieldValue<bool?>(Models.Metadata.Disk.OptionalKey, disk.Optional.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Disk.RegionKey, disk.Region);
item.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, disk.SHA1);
item.SetFieldValue<bool?>(Models.Metadata.Disk.WritableKey, disk.Writable.AsYesNo());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -341,14 +338,13 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Chip
{
Tag = chip.Tag,
ChipType = chip.Type.AsEnumValue<ChipType>(),
//SoundOnly = chip.SoundOnly, // TODO: Add to internal model
Clock = NumberHelper.ConvertToInt64(chip.Clock),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(chip.Name);
item.SetFieldValue<ChipType?>(Models.Metadata.Chip.ChipTypeKey, chip.Type.AsEnumValue<ChipType>());
item.SetFieldValue<long?>(Models.Metadata.Chip.ClockKey, NumberHelper.ConvertToInt64(chip.Clock));
item.SetFieldValue<bool?>(Models.Metadata.Chip.SoundOnlyKey, chip.Type.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Chip.TagKey, chip.Tag);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -375,23 +371,22 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Display
{
Tag = display.Tag,
DisplayType = display.Type.AsEnumValue<DisplayType>(),
Rotate = NumberHelper.ConvertToInt64(display.Rotate),
FlipX = display.FlipX.AsYesNo(),
Width = NumberHelper.ConvertToInt64(display.Width),
Height = NumberHelper.ConvertToInt64(display.Height),
Refresh = NumberHelper.ConvertToDouble(display.Refresh),
PixClock = NumberHelper.ConvertToInt64(display.PixClock),
HTotal = NumberHelper.ConvertToInt64(display.HTotal),
HBEnd = NumberHelper.ConvertToInt64(display.HBEnd),
HBStart = NumberHelper.ConvertToInt64(display.HBStart),
VTotal = NumberHelper.ConvertToInt64(display.VTotal),
VBEnd = NumberHelper.ConvertToInt64(display.VBEnd),
VBStart = NumberHelper.ConvertToInt64(display.VBStart),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<DisplayType>(Models.Metadata.Display.DisplayTypeKey, display.Type.AsEnumValue<DisplayType>());
item.SetFieldValue<bool?>(Models.Metadata.Display.FlipXKey, display.FlipX.AsYesNo());
item.SetFieldValue<long?>(Models.Metadata.Display.HBEndKey, NumberHelper.ConvertToInt64(display.HBEnd));
item.SetFieldValue<long?>(Models.Metadata.Display.HBStartKey, NumberHelper.ConvertToInt64(display.HBStart));
item.SetFieldValue<long?>(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(display.Height));
item.SetFieldValue<long?>(Models.Metadata.Display.HTotalKey, NumberHelper.ConvertToInt64(display.HTotal));
item.SetFieldValue<long?>(Models.Metadata.Display.PixClockKey, NumberHelper.ConvertToInt64(display.PixClock));
item.SetFieldValue<double?>(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(display.Refresh));
item.SetFieldValue<long?>(Models.Metadata.Display.RotateKey, NumberHelper.ConvertToInt64(display.Rotate));
item.SetFieldValue<string?>(Models.Metadata.Display.TagKey, display.Tag);
item.SetFieldValue<long?>(Models.Metadata.Display.VBEndKey, NumberHelper.ConvertToInt64(display.VBEnd));
item.SetFieldValue<long?>(Models.Metadata.Display.VBStartKey, NumberHelper.ConvertToInt64(display.VBStart));
item.SetFieldValue<long?>(Models.Metadata.Display.VTotalKey, NumberHelper.ConvertToInt64(display.VTotal));
item.SetFieldValue<long?>(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(display.Width));
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -418,23 +413,22 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Display
{
DisplayType = video.Screen?.AsEnumValue<DisplayType>() ?? DisplayType.NULL,
Width = NumberHelper.ConvertToInt64(video.Width),
Height = NumberHelper.ConvertToInt64(video.Height),
//AspectX = video.AspectX, // TODO: Add to internal model or find mapping
//AspectY = video.AspectY, // TODO: Add to internal model or find mapping
Refresh = NumberHelper.ConvertToDouble(video.Refresh),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<long?>("ASPECTX", NumberHelper.ConvertToInt64(video.AspectX));
item.SetFieldValue<long?>("ASPECTY", NumberHelper.ConvertToInt64(video.AspectY));
item.SetFieldValue<DisplayType>(Models.Metadata.Display.DisplayTypeKey, video.Screen?.AsEnumValue<DisplayType>() ?? DisplayType.NULL);
item.SetFieldValue<long?>(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(video.Height));
item.SetFieldValue<double?>(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(video.Refresh));
item.SetFieldValue<long?>(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(video.Width));
switch (video.Orientation)
{
case "horizontal":
item.Rotate = 0;
item.SetFieldValue<long?>(Models.Metadata.Display.RotateKey, 0);
break;
case "vertical":
item.Rotate = 90;
item.SetFieldValue<long?>(Models.Metadata.Display.RotateKey, 90);
break;
}
@@ -461,10 +455,9 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
var item = new Sound
{
Channels = NumberHelper.ConvertToInt64(sound.Channels),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<long?>(Models.Metadata.Sound.ChannelsKey, NumberHelper.ConvertToInt64(sound.Channels));
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -488,39 +481,37 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
var item = new Input
{
Service = input.Service.AsYesNo(),
Tilt = input.Tilt.AsYesNo(),
Players = NumberHelper.ConvertToInt64(input.Players),
//ControlAttr = input.ControlAttr, // TODO: Add to internal model
//Buttons = input.Buttons, // TODO: Add to internal model
Coins = NumberHelper.ConvertToInt64(input.Coins),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<long?>(Models.Metadata.Input.ButtonsKey, NumberHelper.ConvertToInt64(input.Buttons));
item.SetFieldValue<long?>(Models.Metadata.Input.CoinsKey, NumberHelper.ConvertToInt64(input.Coins));
//item.SetFieldValue<string?>(Models.Metadata.Input.ControlKey, input.ControlAttr);
item.SetFieldValue<long?>(Models.Metadata.Input.PlayersKey, NumberHelper.ConvertToInt64(input.Players));
item.SetFieldValue<bool?>(Models.Metadata.Input.ServiceKey, input.Service?.AsYesNo());
item.SetFieldValue<bool?>(Models.Metadata.Input.TiltKey, input.Tilt?.AsYesNo());
var controls = new List<Control>();
foreach (var control in input.Control ?? [])
{
var controlItem = new Control
{
ControlType = control.Type.AsEnumValue<ControlType>(),
Player = NumberHelper.ConvertToInt64(control.Player),
Buttons = NumberHelper.ConvertToInt64(control.Buttons),
RequiredButtons = NumberHelper.ConvertToInt64(control.ReqButtons),
Minimum = NumberHelper.ConvertToInt64(control.Minimum),
Maximum = NumberHelper.ConvertToInt64(control.Maximum),
Sensitivity = NumberHelper.ConvertToInt64(control.Sensitivity),
KeyDelta = NumberHelper.ConvertToInt64(control.KeyDelta),
Reverse = control.Reverse.AsYesNo(),
Ways = control.Ways,
Ways2 = control.Ways2,
Ways3 = control.Ways3,
};
var controlItem = new Control();
controlItem.SetFieldValue<long?>(Models.Metadata.Control.ButtonsKey, NumberHelper.ConvertToInt64(control.Buttons));
controlItem.SetFieldValue<ControlType?>(Models.Metadata.Control.ControlTypeKey, control.Type.AsEnumValue<ControlType>());
controlItem.SetFieldValue<long?>(Models.Metadata.Control.KeyDeltaKey, NumberHelper.ConvertToInt64(control.KeyDelta));
controlItem.SetFieldValue<long?>(Models.Metadata.Control.MaximumKey, NumberHelper.ConvertToInt64(control.Maximum));
controlItem.SetFieldValue<long?>(Models.Metadata.Control.MinimumKey, NumberHelper.ConvertToInt64(control.Minimum));
controlItem.SetFieldValue<long?>(Models.Metadata.Control.PlayerKey, NumberHelper.ConvertToInt64(control.Player));
controlItem.SetFieldValue<long?>(Models.Metadata.Control.ReqButtonsKey, NumberHelper.ConvertToInt64(control.ReqButtons));
controlItem.SetFieldValue<bool?>(Models.Metadata.Control.ReverseKey, control.Reverse.AsYesNo());
controlItem.SetFieldValue<long?>(Models.Metadata.Control.SensitivityKey, NumberHelper.ConvertToInt64(control.Sensitivity));
controlItem.SetFieldValue<string?>(Models.Metadata.Control.WaysKey, control.Ways);
controlItem.SetFieldValue<string?>(Models.Metadata.Control.Ways2Key, control.Ways2);
controlItem.SetFieldValue<string?>(Models.Metadata.Control.Ways3Key, control.Ways3);
controls.Add(controlItem);
}
if (controls.Any())
item.Controls = controls;
item.SetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey, [.. controls]);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -546,68 +537,61 @@ namespace SabreTools.DatFiles.Formats
{
var item = new DipSwitch
{
Tag = dipswitch.Tag,
Mask = dipswitch.Mask,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(dipswitch.Name);
item.SetFieldValue<string?>(Models.Metadata.DipSwitch.MaskKey, dipswitch.Mask);
item.SetFieldValue<string?>(Models.Metadata.DipSwitch.TagKey, dipswitch.Tag);
if (dipswitch.Condition != null)
{
var condition = new Condition
{
Tag = dipswitch.Condition.Tag,
Mask = dipswitch.Condition.Mask,
Relation = dipswitch.Condition.Relation.AsEnumValue<Relation>(),
Value = dipswitch.Condition.Value,
};
item.Conditions = [condition];
var condition = new Condition();
condition.SetFieldValue<string?>(Models.Metadata.Condition.MaskKey, dipswitch.Condition.Mask);
condition.SetFieldValue<Relation?>(Models.Metadata.Condition.RelationKey, dipswitch.Condition.Relation.AsEnumValue<Relation>());
condition.SetFieldValue<string?>(Models.Metadata.Condition.TagKey, dipswitch.Condition.Tag);
condition.SetFieldValue<string?>(Models.Metadata.Condition.ValueKey, dipswitch.Condition.Value);
item.SetFieldValue<Condition[]?>(Models.Metadata.DipSwitch.ConditionKey, [condition]);
}
var locations = new List<DipLocation>();
foreach (var diplocation in dipswitch.DipLocation ?? [])
{
var locationItem = new DipLocation
{
Number = NumberHelper.ConvertToInt64(diplocation.Number),
Inverted = diplocation.Inverted.AsYesNo(),
};
var locationItem = new DipLocation();
locationItem.SetName(diplocation.Name);
locationItem.SetFieldValue<bool?>(Models.Metadata.DipLocation.InvertedKey, diplocation.Inverted.AsYesNo());
locationItem.SetFieldValue<long?>(Models.Metadata.DipLocation.NumberKey, NumberHelper.ConvertToInt64(diplocation.Number));
locations.Add(locationItem);
}
if (locations.Any())
item.Locations = locations;
item.SetFieldValue<DipLocation[]?>(Models.Metadata.DipSwitch.DipLocationKey, [.. locations]);
var settings = new List<DipValue>();
foreach (var dipvalue in dipswitch.DipValue ?? [])
{
var dipValueItem = new DipValue
{
Value = dipvalue.Value,
Default = dipvalue.Default.AsYesNo(),
};
var dipValueItem = new DipValue();
dipValueItem.SetName(dipvalue.Name);
dipValueItem.SetFieldValue<bool?>(Models.Metadata.DipValue.DefaultKey, dipvalue.Default.AsYesNo());
dipValueItem.SetFieldValue<string?>(Models.Metadata.DipValue.ValueKey, dipvalue.Value);
if (dipvalue.Condition != null)
{
var condition = new Condition
{
Tag = dipvalue.Condition.Tag,
Mask = dipvalue.Condition.Mask,
Relation = dipvalue.Condition.Relation.AsEnumValue<Relation>(),
Value = dipvalue.Condition.Value,
};
dipValueItem.Conditions = [condition];
var condition = new Condition();
condition.SetFieldValue<string?>(Models.Metadata.Condition.MaskKey, dipvalue.Condition.Mask);
condition.SetFieldValue<Relation?>(Models.Metadata.Condition.RelationKey, dipvalue.Condition.Relation.AsEnumValue<Relation>());
condition.SetFieldValue<string?>(Models.Metadata.Condition.TagKey, dipvalue.Condition.Tag);
condition.SetFieldValue<string?>(Models.Metadata.Condition.ValueKey, dipvalue.Condition.Value);
dipValueItem.SetFieldValue<Condition[]?>(Models.Metadata.DipValue.ConditionKey, [condition]);
}
settings.Add(dipValueItem);
}
if (settings.Any())
item.Values = settings;
item.SetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey, [.. settings]);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -634,67 +618,61 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Configuration
{
Tag = configuration.Tag,
Mask = configuration.Mask,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(configuration.Name);
item.SetFieldValue<string?>(Models.Metadata.Configuration.MaskKey, configuration.Mask);
item.SetFieldValue<string?>(Models.Metadata.Configuration.TagKey, configuration.Tag);
if (configuration.Condition != null)
{
var condition = new DatItems.Formats.Condition
{
Tag = configuration.Condition.Tag,
Mask = configuration.Condition.Mask,
Relation = configuration.Condition.Relation.AsEnumValue<Relation>(),
Value = configuration.Condition.Value,
};
item.Conditions = [condition];
var condition = new DatItems.Formats.Condition();
condition.SetFieldValue<string?>(Models.Metadata.Condition.MaskKey, configuration.Condition.Mask);
condition.SetFieldValue<Relation?>(Models.Metadata.Condition.RelationKey, configuration.Condition.Relation.AsEnumValue<Relation>());
condition.SetFieldValue<string?>(Models.Metadata.Condition.TagKey, configuration.Condition.Tag);
condition.SetFieldValue<string?>(Models.Metadata.Condition.ValueKey, configuration.Condition.Value);
item.SetFieldValue<Condition[]?>(Models.Metadata.Configuration.ConditionKey, [condition]);
}
var locations = new List<ConfLocation>();
foreach (var confLocation in configuration.ConfLocation ?? [])
{
var locationItem = new ConfLocation
{
Number = NumberHelper.ConvertToInt64(confLocation.Number),
Inverted = confLocation.Inverted.AsYesNo(),
};
var locationItem = new ConfLocation();
locationItem.SetName(confLocation.Name);
locationItem.SetFieldValue<bool?>(Models.Metadata.ConfLocation.InvertedKey, confLocation.Inverted.AsYesNo());
locationItem.SetFieldValue<long?>(Models.Metadata.ConfLocation.NumberKey, NumberHelper.ConvertToInt64(confLocation.Number));
locations.Add(locationItem);
}
if (locations.Any())
item.Locations = locations;
item.SetFieldValue<ConfLocation[]?>(Models.Metadata.Configuration.ConfLocationKey, [.. locations]);
var settings = new List<ConfSetting>();
foreach (var dipvalue in configuration.ConfSetting ?? [])
{
var settingItem = new ConfSetting
{
Value = dipvalue.Value,
Default = dipvalue.Default.AsYesNo(),
};
var settingItem = new ConfSetting();
settingItem.SetName(dipvalue.Name);
settingItem.SetFieldValue<bool?>(Models.Metadata.ConfSetting.DefaultKey, dipvalue.Default.AsYesNo());
settingItem.SetFieldValue<string?>(Models.Metadata.ConfSetting.ValueKey, dipvalue.Value);
if (dipvalue.Condition != null)
{
var condition = new Condition
{
Tag = dipvalue.Condition.Tag,
Mask = dipvalue.Condition.Mask,
Relation = dipvalue.Condition.Relation.AsEnumValue<Relation>(),
Value = dipvalue.Condition.Value,
};
settingItem.Conditions = [condition];
var condition = new Condition();
condition.SetFieldValue<string?>(Models.Metadata.Condition.MaskKey, dipvalue.Condition.Mask);
condition.SetFieldValue<Relation?>(Models.Metadata.Condition.RelationKey, dipvalue.Condition.Relation.AsEnumValue<Relation>());
condition.SetFieldValue<string?>(Models.Metadata.Condition.TagKey, dipvalue.Condition.Tag);
condition.SetFieldValue<string?>(Models.Metadata.Condition.ValueKey, dipvalue.Condition.Value);
settingItem.SetFieldValue<Condition[]?>(Models.Metadata.ConfSetting.ConditionKey, [condition]);
}
settings.Add(settingItem);
}
if (settings.Any())
item.Settings = settings;
item.SetFieldValue<ConfSetting[]?>(Models.Metadata.Configuration.ConfSettingKey, [.. settings]);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -721,23 +699,21 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Port
{
Tag = port.Tag,
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<string>(Models.Metadata.Port.TagKey, port.Tag);
var analogs = new List<Analog>();
foreach (var analog in port.Analog ?? [])
{
var analogItem = new Analog
{
Mask = analog.Mask,
};
var analogItem = new Analog();
analogItem.SetFieldValue<string?>(Models.Metadata.Analog.MaskKey, analog.Mask);
analogs.Add(analogItem);
}
if (analogs.Any())
item.Analogs = analogs;
item.SetFieldValue<Analog[]?>(Models.Metadata.Port.AnalogKey, [.. analogs]);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -762,19 +738,21 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
foreach (var adjuster in adjusters)
{
var item = new Adjuster { Source = new Source { Index = indexId, Name = filename } };
var item = new Adjuster
{
Source = new Source { Index = indexId, Name = filename }
};
item.SetName(adjuster.Name);
item.SetFieldValue<bool?>(Models.Metadata.Adjuster.DefaultKey, adjuster.Default.AsYesNo());
if (adjuster.Condition != null)
{
var condition = new Condition
{
Tag = adjuster.Condition.Tag,
Mask = adjuster.Condition.Mask,
Relation = adjuster.Condition.Relation.AsEnumValue<Relation>(),
Value = adjuster.Condition.Value,
};
var condition = new Condition();
condition.SetFieldValue<string?>(Models.Metadata.Condition.MaskKey, adjuster.Condition.Mask);
condition.SetFieldValue<Relation?>(Models.Metadata.Condition.RelationKey, adjuster.Condition.Relation.AsEnumValue<Relation>());
condition.SetFieldValue<string?>(Models.Metadata.Condition.TagKey, adjuster.Condition.Tag);
condition.SetFieldValue<string?>(Models.Metadata.Condition.ValueKey, adjuster.Condition.Value);
item.SetFieldValue<Condition[]?>(Models.Metadata.Adjuster.ConditionKey, [condition]);
}
@@ -801,20 +779,19 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
var item = new Driver
{
Status = driver.Status.AsEnumValue<SupportStatus>(),
//Color = driver.Color.AsEnumValue<SupportStatus>(), // TODO: Add to internal model
//Sound = driver.Sound.AsEnumValue<SupportStatus>(), // TODO: Add to internal model
//PaletteSize = NumberHelper.ConvertToInt64(driver.PaletteSize), // TODO: Add to internal model
Emulation = driver.Emulation.AsEnumValue<SupportStatus>(),
Cocktail = driver.Cocktail.AsEnumValue<SupportStatus>(),
SaveState = driver.SaveState.AsEnumValue<Supported>(),
RequiresArtwork = driver.RequiresArtwork.AsYesNo(),
Unofficial = driver.Unofficial.AsYesNo(),
NoSoundHardware = driver.NoSoundHardware.AsYesNo(),
Incomplete = driver.Incomplete.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.CocktailKey, driver.Cocktail?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.ColorKey, driver.Color?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.EmulationKey, driver.Emulation?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<bool?>(Models.Metadata.Driver.IncompleteKey, driver.Incomplete.AsYesNo());
item.SetFieldValue<bool?>(Models.Metadata.Driver.NoSoundHardwareKey, driver.NoSoundHardware.AsYesNo());
item.SetFieldValue<long?>(Models.Metadata.Driver.PaletteSizeKey, NumberHelper.ConvertToInt64(driver.PaletteSize));
item.SetFieldValue<bool?>(Models.Metadata.Driver.RequiresArtworkKey, driver.RequiresArtwork.AsYesNo());
item.SetFieldValue<Supported>(Models.Metadata.Driver.SaveStateKey, driver.SaveState?.AsEnumValue<Supported>() ?? Supported.NULL);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.SoundKey, driver.Sound?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey, driver.Status?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<bool?>(Models.Metadata.Driver.UnofficialKey, driver.Unofficial.AsYesNo());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -840,12 +817,11 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Feature
{
Type = feature.Type.AsEnumValue<FeatureType>(),
Status = feature.Status.AsEnumValue<FeatureStatus>(),
Overall = feature.Overall.AsEnumValue<FeatureStatus>(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<FeatureType>(Models.Metadata.Feature.FeatureTypeKey, feature.Type.AsEnumValue<FeatureType>());
item.SetFieldValue<FeatureStatus>(Models.Metadata.Feature.OverallKey, feature.Overall.AsEnumValue<FeatureStatus>());
item.SetFieldValue<FeatureStatus>(Models.Metadata.Feature.StatusKey, feature.Status.AsEnumValue<FeatureStatus>());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -872,23 +848,21 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Device
{
DeviceType = device.Type.AsEnumValue<DeviceType>(),
Tag = device.Tag,
FixedImage = device.FixedImage,
Mandatory = NumberHelper.ConvertToInt64(device.Mandatory),
Interface = device.Interface,
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<DeviceType>(Models.Metadata.Device.DeviceTypeKey, device.Type.AsEnumValue<DeviceType>());
item.SetFieldValue<string?>(Models.Metadata.Device.FixedImageKey, device.FixedImage);
item.SetFieldValue<string?>(Models.Metadata.Device.InterfaceKey, device.Interface);
item.SetFieldValue<long?>(Models.Metadata.Device.MandatoryKey, NumberHelper.ConvertToInt64(device.Mandatory));
item.SetFieldValue<string?>(Models.Metadata.Device.TagKey, device.Tag);
if (device.Instance != null)
{
var instance = new Instance
{
BriefName = device.Instance.BriefName,
};
var instance = new Instance();
instance.SetName(device.Instance.Name);
item.Instances = [instance];
instance.SetFieldValue<string?>(Models.Metadata.Instance.BriefNameKey, device.Instance.BriefName);
item.SetFieldValue<Instance[]?>(Models.Metadata.Device.InstanceKey, [instance]);
}
var extensions = new List<Extension>();
@@ -896,11 +870,12 @@ namespace SabreTools.DatFiles.Formats
{
var extensionItem = new Extension();
extensionItem.SetName(extension.Name);
extensions.Add(extensionItem);
}
if (extensions.Any())
item.Extensions = extensions;
item.SetFieldValue<Extension[]?>(Models.Metadata.Device.ExtensionKey, extensions.ToArray());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -934,17 +909,16 @@ namespace SabreTools.DatFiles.Formats
var slotoptions = new List<SlotOption>();
foreach (var slotoption in slot.SlotOption ?? [])
{
var slotoptionItem = new SlotOption
{
DeviceName = slotoption.DevName,
Default = slotoption.Default.AsYesNo(),
};
var slotoptionItem = new SlotOption();
slotoptionItem.SetName(slotoption.Name);
slotoptionItem.SetFieldValue<bool?>(Models.Metadata.SlotOption.DefaultKey, slotoption.Default.AsYesNo());
slotoptionItem.SetFieldValue<string?>(Models.Metadata.SlotOption.DevNameKey, slotoption.DevName);
slotoptions.Add(slotoptionItem);
}
if (slotoptions.Any())
item.SlotOptions = slotoptions;
item.SetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey, [.. slotoptions]);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -971,13 +945,12 @@ namespace SabreTools.DatFiles.Formats
{
var item = new DatItems.Formats.SoftwareList
{
Tag = softwarelist.Tag,
Status = softwarelist.Status.AsEnumValue<SoftwareListStatus>(),
Filter = softwarelist.Filter,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(softwarelist.Name);
item.SetFieldValue<string?>(Models.Metadata.SoftwareList.FilterKey, softwarelist.Filter);
item.SetFieldValue<SoftwareListStatus>(Models.Metadata.SoftwareList.StatusKey, softwarelist.Status.AsEnumValue<SoftwareListStatus>());
item.SetFieldValue<string?>(Models.Metadata.SoftwareList.TagKey, softwarelist.Tag);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -1004,12 +977,11 @@ namespace SabreTools.DatFiles.Formats
{
var item = new RamOption
{
Default = ramoption.Default.AsYesNo(),
Content = ramoption.Content,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(ramoption.Name);
item.SetFieldValue<string?>(Models.Metadata.RamOption.ContentKey, ramoption.Content);
item.SetFieldValue<bool?>(Models.Metadata.RamOption.DefaultKey, ramoption.Default.AsYesNo());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);

View File

@@ -5,7 +5,6 @@ using SabreTools.Core;
using SabreTools.Core.Tools;
using SabreTools.DatItems;
using SabreTools.DatItems.Formats;
using SabreTools.Serialization.CrossModel;
namespace SabreTools.DatFiles.Formats
{
@@ -51,17 +50,17 @@ namespace SabreTools.DatFiles.Formats
case BiosSet biosset:
if (string.IsNullOrEmpty(biosset.GetName()))
missingFields.Add(Models.Metadata.BiosSet.NameKey);
if (string.IsNullOrEmpty(biosset.Description))
if (string.IsNullOrEmpty(biosset.GetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey)))
missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetName()))
missingFields.Add(Models.Metadata.Rom.NameKey);
if (rom.Size == null || rom.Size < 0)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < 0)
missingFields.Add(Models.Metadata.Rom.SizeKey);
if (string.IsNullOrEmpty(rom.CRC)
&& string.IsNullOrEmpty(rom.SHA1))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
{
missingFields.Add(Models.Metadata.Rom.SHA1Key);
}
@@ -70,8 +69,8 @@ namespace SabreTools.DatFiles.Formats
case Disk disk:
if (string.IsNullOrEmpty(disk.GetName()))
missingFields.Add(Models.Metadata.Disk.NameKey);
if (string.IsNullOrEmpty(disk.MD5)
&& string.IsNullOrEmpty(disk.SHA1))
if (string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key))
&& string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
{
missingFields.Add(Models.Metadata.Disk.SHA1Key);
}
@@ -90,43 +89,43 @@ namespace SabreTools.DatFiles.Formats
case Chip chip:
if (string.IsNullOrEmpty(chip.GetName()))
missingFields.Add(Models.Metadata.Chip.NameKey);
if (!chip.ChipTypeSpecified)
if (chip.GetFieldValue<ChipType>(Models.Metadata.Chip.ChipTypeKey) == ChipType.NULL)
missingFields.Add(Models.Metadata.Chip.ChipTypeKey);
break;
case Display display:
if (!display.DisplayTypeSpecified)
if (display.GetFieldValue<DisplayType>(Models.Metadata.Display.DisplayTypeKey) == DisplayType.NULL)
missingFields.Add(Models.Metadata.Display.DisplayTypeKey);
if (display.Refresh == null)
if (display.GetFieldValue<double?>(Models.Metadata.Display.RefreshKey) == null)
missingFields.Add(Models.Metadata.Display.RefreshKey);
break;
case Sound sound:
if (sound.Channels == null)
if (sound.GetFieldValue<long?>(Models.Metadata.Sound.ChannelsKey) == null)
missingFields.Add(Models.Metadata.Sound.ChannelsKey);
break;
case Input input:
if (input.Players == null)
if (input.GetFieldValue<long?>(Models.Metadata.Input.PlayersKey) == null)
missingFields.Add(Models.Metadata.Input.PlayersKey);
break;
case DipSwitch dipswitch:
if (string.IsNullOrEmpty(dipswitch.GetName()))
missingFields.Add(Models.Metadata.DipSwitch.NameKey);
if (string.IsNullOrEmpty(dipswitch.Tag))
if (string.IsNullOrEmpty(dipswitch.GetFieldValue<string?>(Models.Metadata.DipSwitch.TagKey)))
missingFields.Add(Models.Metadata.DipSwitch.TagKey);
break;
case Configuration configuration:
if (string.IsNullOrEmpty(configuration.GetName()))
missingFields.Add(Models.Metadata.Configuration.NameKey);
if (string.IsNullOrEmpty(configuration.Tag))
if (string.IsNullOrEmpty(configuration.GetFieldValue<string>(Models.Metadata.Configuration.TagKey)))
missingFields.Add(Models.Metadata.Configuration.TagKey);
break;
case Port port:
if (string.IsNullOrEmpty(port.Tag))
if (string.IsNullOrEmpty(port.GetFieldValue<string>(Models.Metadata.Port.TagKey)))
missingFields.Add(Models.Metadata.Port.TagKey);
break;
@@ -136,23 +135,23 @@ namespace SabreTools.DatFiles.Formats
break;
case Driver driver:
if (!driver.StatusSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.StatusKey);
if (!driver.EmulationSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.EmulationKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.EmulationKey);
if (!driver.CocktailSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.CocktailKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.CocktailKey);
if (!driver.SaveStateSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.SaveStateKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.SaveStateKey);
break;
case Feature feature:
if (!feature.TypeSpecified)
if (feature.GetFieldValue<FeatureType>(Models.Metadata.Feature.FeatureTypeKey) == FeatureType.NULL)
missingFields.Add(Models.Metadata.Feature.FeatureTypeKey);
break;
case Device device:
if (!device.DeviceTypeSpecified)
if (device.GetFieldValue<DeviceType>(Models.Metadata.Device.DeviceTypeKey) != DeviceType.NULL)
missingFields.Add(Models.Metadata.Device.DeviceTypeKey);
break;
@@ -162,11 +161,11 @@ namespace SabreTools.DatFiles.Formats
break;
case DatItems.Formats.SoftwareList softwarelist:
if (string.IsNullOrEmpty(softwarelist.Tag))
if (string.IsNullOrEmpty(softwarelist.GetFieldValue<string?>(Models.Metadata.SoftwareList.TagKey)))
missingFields.Add(Models.Metadata.SoftwareList.TagKey);
if (string.IsNullOrEmpty(softwarelist.GetName()))
missingFields.Add(Models.Metadata.SoftwareList.NameKey);
if (!softwarelist.StatusSpecified)
if (softwarelist.GetFieldValue<SoftwareListStatus?>(Models.Metadata.SoftwareList.StatusKey) == SoftwareListStatus.None)
missingFields.Add(Models.Metadata.SoftwareList.StatusKey);
break;
@@ -412,12 +411,10 @@ namespace SabreTools.DatFiles.Formats
var biosset = new Models.Listxml.BiosSet
{
Name = item.GetName(),
Description = item.Description,
Default = item.GetFieldValue<bool?>(Models.Metadata.BiosSet.DefaultKey).FromYesNo(),
Description = item.GetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey),
};
if (item.DefaultSpecified)
biosset.Default = item.Default.FromYesNo();
return biosset;
}
@@ -429,17 +426,17 @@ namespace SabreTools.DatFiles.Formats
var rom = new Models.Listxml.Rom
{
Name = item.GetName(),
Bios = item.Bios,
Size = item.Size?.ToString(),
CRC = item.CRC,
SHA1 = item.SHA1,
Merge = item.MergeTag,
Region = item.Region,
Offset = item.Offset,
Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false),
Optional = item.Optional.FromYesNo(),
//Dispose = item.Dispose.FromYesNo(), // TODO: Add to internal model
//SoundOnly = item.SoundOnly.FromYesNo(), // TODO: Add to internal model
Bios = item.GetFieldValue<string?>(Models.Metadata.Rom.BiosKey),
Size = item.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
CRC = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
Merge = item.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey),
Region = item.GetFieldValue<string?>(Models.Metadata.Rom.RegionKey),
Offset = item.GetFieldValue<string?>(Models.Metadata.Rom.OffsetKey),
Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey).AsStringValue<ItemStatus>(useSecond: false),
Optional = item.GetFieldValue<bool?>(Models.Metadata.Rom.OptionalKey).FromYesNo(),
Dispose = item.GetFieldValue<bool?>(Models.Metadata.Rom.DisposeKey).FromYesNo(),
SoundOnly = item.GetFieldValue<bool?>(Models.Metadata.Rom.SoundOnlyKey).FromYesNo(),
};
return rom;
@@ -453,14 +450,14 @@ namespace SabreTools.DatFiles.Formats
var disk = new Models.Listxml.Disk
{
Name = item.GetName(),
MD5 = item.MD5,
SHA1 = item.SHA1,
Merge = item.MergeTag,
Region = item.Region,
Index = item.Index,
Writable = item.Writable.FromYesNo(),
Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false),
Optional = item.Optional.FromYesNo(),
MD5 = item.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key),
Merge = item.GetFieldValue<string?>(Models.Metadata.Disk.MergeKey),
Region = item.GetFieldValue<string?>(Models.Metadata.Disk.RegionKey),
Index = item.GetFieldValue<string?>(Models.Metadata.Disk.IndexKey),
Writable = item.GetFieldValue<bool?>(Models.Metadata.Disk.WritableKey).FromYesNo(),
Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey).AsStringValue<ItemStatus>(useSecond: false),
Optional = item.GetFieldValue<bool?>(Models.Metadata.Disk.OptionalKey).FromYesNo(),
};
return disk;
@@ -500,10 +497,10 @@ namespace SabreTools.DatFiles.Formats
var chip = new Models.Listxml.Chip
{
Name = item.GetName(),
Tag = item.Tag,
Type = item.ChipType.AsStringValue<ChipType>(),
//SoundOnly = item.SoundOnly, // TODO: Add to internal model
Clock = item.Clock?.ToString(),
Tag = item.GetFieldValue<string?>(Models.Metadata.Chip.TagKey),
Type = item.GetFieldValue<ChipType>(Models.Metadata.Chip.ChipTypeKey).AsStringValue<ChipType>(),
SoundOnly = item.GetFieldValue<bool?>(Models.Metadata.Chip.SoundOnlyKey).FromYesNo(),
Clock = item.GetFieldValue<long?>(Models.Metadata.Chip.TagKey)?.ToString(),
};
return chip;
@@ -516,20 +513,20 @@ namespace SabreTools.DatFiles.Formats
{
var display = new Models.Listxml.Display
{
Tag = item.Tag,
Type = item.DisplayType.AsStringValue<DisplayType>(),
Rotate = item.Rotate?.ToString(),
FlipX = item.FlipX.FromYesNo(),
Width = item.Width?.ToString(),
Height = item.Height?.ToString(),
Refresh = item.Refresh?.ToString(),
PixClock = item.PixClock?.ToString(),
HTotal = item.HTotal?.ToString(),
HBEnd = item.HBEnd?.ToString(),
HBStart = item.HBStart?.ToString(),
VTotal = item.VTotal?.ToString(),
VBEnd = item.VBEnd?.ToString(),
VBStart = item.VBStart?.ToString(),
Tag = item.GetFieldValue<string?>(Models.Metadata.Display.TagKey),
Type = item.GetFieldValue<DisplayType>(Models.Metadata.Display.DisplayTypeKey).AsStringValue<DisplayType>(),
Rotate = item.GetFieldValue<long?>(Models.Metadata.Display.RotateKey)?.ToString(),
FlipX = item.GetFieldValue<bool?>(Models.Metadata.Display.FlipXKey).FromYesNo(),
Width = item.GetFieldValue<string?>(Models.Metadata.Display.WidthKey)?.ToString(),
Height = item.GetFieldValue<string?>(Models.Metadata.Display.HeightKey)?.ToString(),
Refresh = item.GetFieldValue<double?>(Models.Metadata.Display.RefreshKey)?.ToString(),
PixClock = item.GetFieldValue<string?>(Models.Metadata.Display.PixClockKey)?.ToString(),
HTotal = item.GetFieldValue<string?>(Models.Metadata.Display.HTotalKey)?.ToString(),
HBEnd = item.GetFieldValue<string?>(Models.Metadata.Display.HBEndKey)?.ToString(),
HBStart = item.GetFieldValue<string?>(Models.Metadata.Display.HBStartKey)?.ToString(),
VTotal = item.GetFieldValue<string?>(Models.Metadata.Display.VTotalKey)?.ToString(),
VBEnd = item.GetFieldValue<string?>(Models.Metadata.Display.VBEndKey)?.ToString(),
VBStart = item.GetFieldValue<string?>(Models.Metadata.Display.VBStartKey)?.ToString(),
};
return display;
@@ -542,7 +539,7 @@ namespace SabreTools.DatFiles.Formats
{
var sound = new Models.Listxml.Sound
{
Channels = item.Channels?.ToString(),
Channels = item.GetFieldValue<long?>(Models.Metadata.Sound.ChannelsKey)?.ToString(),
};
return sound;
@@ -555,16 +552,16 @@ namespace SabreTools.DatFiles.Formats
{
var input = new Models.Listxml.Input
{
Service = item.Service.FromYesNo(),
Tilt = item.Tilt.FromYesNo(),
Players = item.Players?.ToString(),
//ControlAttr = item.ControlAttr, // TODO: Add to internal model
//Buttons = item.Buttons, // TODO: Add to internal model
Coins = item.Coins?.ToString(),
Service = item.GetFieldValue<bool?>(Models.Metadata.Input.ServiceKey).FromYesNo(),
Tilt = item.GetFieldValue<bool?>(Models.Metadata.Input.TiltKey).FromYesNo(),
Players = item.GetFieldValue<long?>(Models.Metadata.Input.PlayersKey)?.ToString(),
//ControlAttr = item.GetFieldValue<string?>(Models.Metadata.Input.ControlKey),
Buttons = item.GetFieldValue<long?>(Models.Metadata.Input.ButtonsKey)?.ToString(),
Coins = item.GetFieldValue<long?>(Models.Metadata.Input.CoinsKey)?.ToString(),
};
var controls = new List<Models.Listxml.Control>();
foreach (var controlItem in item.Controls ?? [])
foreach (var controlItem in item.GetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey) ?? [])
{
var control = CreateControl(controlItem);
controls.Add(control);
@@ -583,18 +580,18 @@ namespace SabreTools.DatFiles.Formats
{
var control = new Models.Listxml.Control
{
Type = item.ControlType.AsStringValue<ControlType>(),
Player = item.Player?.ToString(),
Buttons = item.Buttons?.ToString(),
ReqButtons = item.RequiredButtons?.ToString(),
Minimum = item.Minimum?.ToString(),
Maximum = item.Maximum?.ToString(),
Sensitivity = item.Sensitivity?.ToString(),
KeyDelta = item.KeyDelta?.ToString(),
Reverse = item.Reverse.FromYesNo(),
Ways = item.Ways,
Ways2 = item.Ways2,
Ways3 = item.Ways3,
Type = item.GetFieldValue<ControlType>(Models.Metadata.Control.ControlTypeKey).AsStringValue<ControlType>(),
Player = item.GetFieldValue<long?>(Models.Metadata.Control.PlayerKey)?.ToString(),
Buttons = item.GetFieldValue<long?>(Models.Metadata.Control.ButtonsKey)?.ToString(),
ReqButtons = item.GetFieldValue<long?>(Models.Metadata.Control.ReqButtonsKey)?.ToString(),
Minimum = item.GetFieldValue<long?>(Models.Metadata.Control.MinimumKey)?.ToString(),
Maximum = item.GetFieldValue<long?>(Models.Metadata.Control.MaximumKey)?.ToString(),
Sensitivity = item.GetFieldValue<long?>(Models.Metadata.Control.SensitivityKey)?.ToString(),
KeyDelta = item.GetFieldValue<long?>(Models.Metadata.Control.KeyDeltaKey)?.ToString(),
Reverse = item.GetFieldValue<bool?>(Models.Metadata.Control.ReverseKey).FromYesNo(),
Ways = item.GetFieldValue<string?>(Models.Metadata.Control.WaysKey),
Ways2 = item.GetFieldValue<string?>(Models.Metadata.Control.Ways2Key),
Ways3 = item.GetFieldValue<string?>(Models.Metadata.Control.Ways3Key),
};
return control;
@@ -608,25 +605,25 @@ namespace SabreTools.DatFiles.Formats
var dipswitch = new Models.Listxml.DipSwitch
{
Name = item.GetName(),
Tag = item.Tag,
Mask = item.Mask,
Tag = item.GetFieldValue<string?>(Models.Metadata.DipSwitch.TagKey),
Mask = item.GetFieldValue<string?>(Models.Metadata.DipSwitch.MaskKey),
};
if (item.ConditionsSpecified)
{
var conditionItem = item.Conditions?.FirstOrDefault();
var conditionItem = item.GetFieldValue<Condition[]?>(Models.Metadata.DipSwitch.ConditionKey)?.FirstOrDefault();
var condition = new Models.Listxml.Condition
{
Tag = conditionItem?.Tag,
Mask = conditionItem?.Mask,
Relation = conditionItem?.Relation.AsStringValue<Relation>(),
Value = conditionItem?.Value,
Tag = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.TagKey),
Mask = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.MaskKey),
Relation = conditionItem?.GetFieldValue<Relation>(Models.Metadata.Condition.RelationKey).AsStringValue<Relation>(),
Value = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.ValueKey),
};
dipswitch.Condition = condition;
}
var diplocations = new List<Models.Listxml.DipLocation>();
foreach (var locationItem in item.Locations ?? [])
foreach (var locationItem in item.GetFieldValue<DipLocation[]?>(Models.Metadata.DipSwitch.DipLocationKey) ?? [])
{
var control = CreateDipLocation(locationItem);
diplocations.Add(control);
@@ -636,7 +633,7 @@ namespace SabreTools.DatFiles.Formats
dipswitch.DipLocation = [.. diplocations];
var dipvalues = new List<Models.Listxml.DipValue>();
foreach (var dipValueItem in item.Values ?? [])
foreach (var dipValueItem in item.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey) ?? [])
{
var dipvalue = CreateDipValue(dipValueItem);
dipvalues.Add(dipvalue);
@@ -656,8 +653,8 @@ namespace SabreTools.DatFiles.Formats
var diplocation = new Models.Listxml.DipLocation
{
Name = item.GetName(),
Number = item.Number?.ToString(),
Inverted = item.Inverted.FromYesNo(),
Number = item.GetFieldValue<long?>(Models.Metadata.DipLocation.NumberKey)?.ToString(),
Inverted = item.GetFieldValue<bool?>(Models.Metadata.DipLocation.InvertedKey).FromYesNo(),
};
return diplocation;
@@ -671,19 +668,19 @@ namespace SabreTools.DatFiles.Formats
var dipvalue = new Models.Listxml.DipValue
{
Name = item.GetName(),
Value = item.Value,
Default = item.Default.FromYesNo(),
Value = item.GetFieldValue<string?>(Models.Metadata.DipValue.ValueKey),
Default = item.GetFieldValue<bool?>(Models.Metadata.DipValue.DefaultKey).FromYesNo(),
};
if (item.ConditionsSpecified)
{
var conditionItem = item.Conditions?.FirstOrDefault();
var conditionItem = item.GetFieldValue<Condition[]?>(Models.Metadata.DipValue.ConditionKey)?.FirstOrDefault();
var condition = new Models.Listxml.Condition
{
Tag = conditionItem?.Tag,
Mask = conditionItem?.Mask,
Relation = conditionItem?.Relation.AsStringValue<Relation>(),
Value = conditionItem?.Value,
Tag = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.TagKey),
Mask = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.MaskKey),
Relation = conditionItem?.GetFieldValue<Relation>(Models.Metadata.Condition.RelationKey).AsStringValue<Relation>(),
Value = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.ValueKey),
};
dipvalue.Condition = condition;
}
@@ -699,25 +696,25 @@ namespace SabreTools.DatFiles.Formats
var configuration = new Models.Listxml.Configuration
{
Name = item.GetName(),
Tag = item.Tag,
Mask = item.Mask,
Tag = item.GetFieldValue<string>(Models.Metadata.Configuration.TagKey),
Mask = item.GetFieldValue<string>(Models.Metadata.Configuration.MaskKey),
};
if (item.ConditionsSpecified)
{
var conditionItem = item.Conditions?.FirstOrDefault();
var conditionItem = item.GetFieldValue<Condition[]?>(Models.Metadata.Configuration.ConditionKey)?.FirstOrDefault();
var condition = new Models.Listxml.Condition
{
Tag = conditionItem?.Tag,
Mask = conditionItem?.Mask,
Relation = conditionItem?.Relation.AsStringValue<Relation>(),
Value = conditionItem?.Value,
Tag = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.TagKey),
Mask = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.MaskKey),
Relation = conditionItem?.GetFieldValue<Relation>(Models.Metadata.Condition.RelationKey).AsStringValue<Relation>(),
Value = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.ValueKey),
};
configuration.Condition = condition;
}
var confLocations = new List<Models.Listxml.ConfLocation>();
foreach (var location in item.Locations ?? [])
foreach (var location in item.GetFieldValue<ConfLocation[]?>(Models.Metadata.Configuration.ConfLocationKey) ?? [])
{
var control = CreateConfLocation(location);
confLocations.Add(control);
@@ -727,7 +724,7 @@ namespace SabreTools.DatFiles.Formats
configuration.ConfLocation = [.. confLocations];
var confsettings = new List<Models.Listxml.ConfSetting>();
foreach (var confSettingItem in item.Settings ?? [])
foreach (var confSettingItem in item.GetFieldValue<ConfSetting[]?>(Models.Metadata.Configuration.ConfSettingKey) ?? [])
{
var dipvalue = CreateConfSetting(confSettingItem);
confsettings.Add(dipvalue);
@@ -747,8 +744,8 @@ namespace SabreTools.DatFiles.Formats
var conflocation = new Models.Listxml.ConfLocation
{
Name = item.GetName(),
Number = item.Number?.ToString(),
Inverted = item.Inverted.FromYesNo(),
Number = item.GetFieldValue<long?>(Models.Metadata.ConfLocation.NumberKey)?.ToString(),
Inverted = item.GetFieldValue<bool?>(Models.Metadata.ConfLocation.InvertedKey).FromYesNo(),
};
return conflocation;
@@ -762,19 +759,19 @@ namespace SabreTools.DatFiles.Formats
var confsetting = new Models.Listxml.ConfSetting
{
Name = item.GetName(),
Value = item.Value,
Default = item.Default.FromYesNo(),
Value = item.GetFieldValue<string?>(Models.Metadata.ConfSetting.ValueKey),
Default = item.GetFieldValue<bool?>(Models.Metadata.ConfSetting.DefaultKey).FromYesNo(),
};
if (item.ConditionsSpecified)
{
var conditionItem = item.Conditions?.FirstOrDefault();
var conditionItem = item.GetFieldValue<Condition[]?>(Models.Metadata.ConfSetting.ConditionKey)?.FirstOrDefault();
var condition = new Models.Listxml.Condition
{
Tag = conditionItem?.Tag,
Mask = conditionItem?.Mask,
Relation = conditionItem?.Relation.AsStringValue<Relation>(),
Value = conditionItem?.Value,
Tag = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.TagKey),
Mask = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.MaskKey),
Relation = conditionItem?.GetFieldValue<Relation>(Models.Metadata.Condition.RelationKey).AsStringValue<Relation>(),
Value = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.ValueKey),
};
confsetting.Condition = condition;
}
@@ -789,7 +786,7 @@ namespace SabreTools.DatFiles.Formats
{
var port = new Models.Listxml.Port
{
Tag = item.Tag,
Tag = item.GetFieldValue<string>(Models.Metadata.Port.TagKey),
};
return port;
@@ -811,10 +808,10 @@ namespace SabreTools.DatFiles.Formats
var conditionItem = item.GetFieldValue<Condition[]?>(Models.Metadata.Adjuster.ConditionKey)?.FirstOrDefault();
var condition = new Models.Listxml.Condition
{
Tag = conditionItem?.Tag,
Mask = conditionItem?.Mask,
Relation = conditionItem?.Relation.AsStringValue<Relation>(),
Value = conditionItem?.Value,
Tag = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.TagKey),
Mask = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.MaskKey),
Relation = conditionItem?.GetFieldValue<Relation>(Models.Metadata.Condition.RelationKey).AsStringValue<Relation>(),
Value = conditionItem?.GetFieldValue<string?>(Models.Metadata.Condition.ValueKey),
};
adjuster.Condition = condition;
}
@@ -829,17 +826,17 @@ namespace SabreTools.DatFiles.Formats
{
var driver = new Models.Listxml.Driver
{
Status = item.Status.AsStringValue<SupportStatus>(),
//Color = item.Color.AsStringValue<SupportStatus>(), // TODO: Add to internal model
//Sound = item.Sound.AsStringValue<SupportStatus>(), // TODO: Add to internal model
//PaletteSize = driver.PaletteSize?.ToString(), // TODO: Add to internal model
Emulation = item.Emulation.AsStringValue<SupportStatus>(),
Cocktail = item.Cocktail.AsStringValue<SupportStatus>(),
SaveState = item.SaveState.AsStringValue<Supported>(useSecond: true),
RequiresArtwork = item.RequiresArtwork.FromYesNo(),
Unofficial = item.Unofficial.FromYesNo(),
NoSoundHardware = item.NoSoundHardware.FromYesNo(),
Incomplete = item.Incomplete.FromYesNo(),
Status = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey).AsStringValue<SupportStatus>(),
Color = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.ColorKey).AsStringValue<SupportStatus>(),
Sound = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.SoundKey).AsStringValue<SupportStatus>(),
PaletteSize = item.GetFieldValue<long?>(Models.Metadata.Driver.PaletteSizeKey)?.ToString(),
Emulation = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.EmulationKey).AsStringValue<SupportStatus>(),
Cocktail = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.CocktailKey).AsStringValue<SupportStatus>(),
SaveState = item.GetFieldValue<Supported>(Models.Metadata.Driver.SaveStateKey).AsStringValue<Supported>(useSecond: true),
RequiresArtwork = item.GetFieldValue<bool?>(Models.Metadata.Driver.RequiresArtworkKey).FromYesNo(),
Unofficial = item.GetFieldValue<bool?>(Models.Metadata.Driver.UnofficialKey).FromYesNo(),
NoSoundHardware = item.GetFieldValue<bool?>(Models.Metadata.Driver.NoSoundHardwareKey).FromYesNo(),
Incomplete = item.GetFieldValue<bool?>(Models.Metadata.Driver.IncompleteKey).FromYesNo(),
};
return driver;
@@ -852,9 +849,9 @@ namespace SabreTools.DatFiles.Formats
{
var feature = new Models.Listxml.Feature
{
Type = item.Type.AsStringValue<FeatureType>(),
Status = item.Status.AsStringValue<FeatureStatus>(),
Overall = item.Overall.AsStringValue<FeatureStatus>(),
Type = item.GetFieldValue<FeatureType>(Models.Metadata.Feature.FeatureTypeKey).AsStringValue<FeatureType>(),
Status = item.GetFieldValue<FeatureStatus>(Models.Metadata.Feature.StatusKey).AsStringValue<FeatureStatus>(),
Overall = item.GetFieldValue<FeatureStatus>(Models.Metadata.Feature.OverallKey).AsStringValue<FeatureStatus>(),
};
return feature;
@@ -867,26 +864,26 @@ namespace SabreTools.DatFiles.Formats
{
var device = new Models.Listxml.Device
{
Type = item.DeviceType.AsStringValue<DeviceType>(),
Tag = item.Tag,
FixedImage = item.FixedImage,
Mandatory = item.Mandatory?.ToString(),
Interface = item.Interface,
Type = item.GetFieldValue<DeviceType>(Models.Metadata.Device.DeviceTypeKey).AsStringValue<DeviceType>(),
Tag = item.GetFieldValue<string?>(Models.Metadata.Device.TagKey),
FixedImage = item.GetFieldValue<string?>(Models.Metadata.Device.FixedImageKey),
Mandatory = item.GetFieldValue<long?>(Models.Metadata.Device.MandatoryKey)?.ToString(),
Interface = item.GetFieldValue<string?>(Models.Metadata.Device.InterfaceKey),
};
if (item.InstancesSpecified)
{
var instanceItem = item.Instances?.FirstOrDefault();
var instanceItem = item.GetFieldValue<Instance[]?>(Models.Metadata.Device.InstanceKey)?.FirstOrDefault();
var instance = new Models.Listxml.Instance
{
Name = instanceItem?.GetName(),
BriefName = instanceItem?.BriefName,
BriefName = instanceItem?.GetFieldValue<string?>(Models.Metadata.Instance.BriefNameKey),
};
device.Instance = instance;
}
var extensions = new List<Models.Listxml.Extension>();
foreach (var extensionItem in item.Extensions ?? [])
foreach (var extensionItem in item.GetFieldValue<Extension[]?>(Models.Metadata.Device.ExtensionKey) ?? [])
{
var extension = new Models.Listxml.Extension
{
@@ -912,13 +909,13 @@ namespace SabreTools.DatFiles.Formats
};
var slotoptions = new List<Models.Listxml.SlotOption>();
foreach (var slotoptionItem in item.SlotOptions ?? [])
foreach (var slotoptionItem in item.GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey) ?? [])
{
var slotoption = new Models.Listxml.SlotOption
{
Name = slotoptionItem.GetName(),
DevName = slotoptionItem.DeviceName,
Default = slotoptionItem.Default.FromYesNo(),
DevName = slotoptionItem.GetFieldValue<string?>(Models.Metadata.SlotOption.DevNameKey),
Default = slotoptionItem.GetFieldValue<bool?>(Models.Metadata.SlotOption.DefaultKey).FromYesNo(),
};
slotoptions.Add(slotoption);
}
@@ -936,10 +933,10 @@ namespace SabreTools.DatFiles.Formats
{
var softwarelist = new Models.Listxml.SoftwareList
{
Tag = item.Tag,
Tag = item.GetFieldValue<string?>(Models.Metadata.SoftwareList.TagKey),
Name = item.GetName(),
Status = item.Status.AsStringValue<SoftwareListStatus>(),
Filter = item.Filter,
Status = item.GetFieldValue<SoftwareListStatus>(Models.Metadata.SoftwareList.StatusKey).AsStringValue<SoftwareListStatus>(),
Filter = item.GetFieldValue<string?>(Models.Metadata.SoftwareList.FilterKey),
};
return softwarelist;
@@ -953,8 +950,8 @@ namespace SabreTools.DatFiles.Formats
var softwarelist = new Models.Listxml.RamOption
{
Name = item.GetName(),
Default = item.Default.FromYesNo(),
Content = item.Content,
Default = item.GetFieldValue<bool?>(Models.Metadata.RamOption.DefaultKey).FromYesNo(),
Content = item.GetFieldValue<string?>(Models.Metadata.RamOption.ContentKey),
};
return softwarelist;

View File

@@ -316,14 +316,13 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Release
{
Region = release.Region,
Language = release.Language,
Date = release.Date,
Default = release.Default?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(release.Name);
item.SetFieldValue<string?>(Models.Metadata.Release.DateKey, release.Date);
item.SetFieldValue<bool?>(Models.Metadata.Release.DefaultKey, release.Default?.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Release.LanguageKey, release.Language);
item.SetFieldValue<string?>(Models.Metadata.Release.RegionKey, release.Region);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -350,12 +349,11 @@ namespace SabreTools.DatFiles.Formats
{
var item = new BiosSet
{
Description = biosset.Description,
Default = biosset.Default?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(biosset.Name);
item.SetFieldValue<bool?>(Models.Metadata.BiosSet.DefaultKey, biosset.Default?.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey, biosset.Description);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -382,27 +380,26 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Rom
{
Size = NumberHelper.ConvertToInt64(rom.Size),
CRC = rom.CRC,
MD5 = rom.MD5,
SHA1 = rom.SHA1,
SHA256 = rom.SHA256,
SHA384 = rom.SHA384,
SHA512 = rom.SHA512,
SpamSum = rom.SpamSum,
//xxHash364 = rom.xxHash364, // TODO: Add to internal model
//xxHash3128 = rom.xxHash3128, // TODO: Add to internal model
MergeTag = rom.Merge,
ItemStatus = rom.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL,
//Serial = rom.Serial, // TODO: Add to internal model
//Header = rom.Header, // TODO: Add to internal model
Date = rom.Date,
Inverted = rom.Inverted?.AsYesNo(),
MIA = rom.MIA?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(rom.Name);
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.CRC);
item.SetFieldValue<string?>(Models.Metadata.Rom.DateKey, rom.Date);
item.SetFieldValue<string?>(Models.Metadata.Rom.HeaderKey, rom.Header);
item.SetFieldValue<bool?>(Models.Metadata.Rom.InvertedKey, rom.Inverted?.AsYesNo());
item.SetFieldValue<bool?>(Models.Metadata.Rom.MIAKey, rom.MIA?.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, rom.MD5);
item.SetFieldValue<string?>(Models.Metadata.Rom.MergeKey, rom.Merge);
item.SetFieldValue<string?>(Models.Metadata.Rom.SerialKey, rom.Serial);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.SHA1);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, rom.SHA256);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, rom.SHA384);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, rom.SHA512);
item.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size));
item.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, rom.SpamSum);
item.SetFieldValue<ItemStatus?>(Models.Metadata.Rom.StatusKey, rom.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL);
item.SetFieldValue<string?>(Models.Metadata.Rom.xxHash364Key, rom.xxHash364);
item.SetFieldValue<string?>(Models.Metadata.Rom.xxHash3128Key, rom.xxHash3128);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -429,14 +426,14 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Disk
{
MD5 = disk.MD5,
SHA1 = disk.SHA1,
MergeTag = disk.Merge,
ItemStatus = disk.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(disk.Name);
item.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL);
item.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, disk.MD5);
item.SetFieldValue<string?>(Models.Metadata.Disk.MergeKey, disk.Merge);
item.SetFieldValue<string?>(Models.Metadata.Disk.RegionKey, disk.Region);
item.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, disk.SHA1);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -463,14 +460,13 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Media
{
MD5 = medium.MD5,
SHA1 = medium.SHA1,
SHA256 = medium.SHA256,
SpamSum = medium.SpamSum,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(medium.Name);
item.SetFieldValue<string?>(Models.Metadata.Media.MD5Key, medium.MD5);
item.SetFieldValue<string?>(Models.Metadata.Media.SHA1Key, medium.SHA1);
item.SetFieldValue<string?>(Models.Metadata.Media.SHA256Key, medium.SHA256);
item.SetFieldValue<string?>(Models.Metadata.Media.SpamSumKey, medium.SpamSum);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -582,17 +578,16 @@ namespace SabreTools.DatFiles.Formats
containsItems = true;
var item = new Driver
{
Status = driver.Status?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL,
Emulation = driver.Emulation?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL,
Cocktail = driver.Cocktail?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL,
SaveState = driver.SaveState?.AsEnumValue<Supported>() ?? Supported.NULL,
RequiresArtwork = driver.RequiresArtwork?.AsYesNo(),
Unofficial = driver.Unofficial?.AsYesNo(),
NoSoundHardware = driver.NoSoundHardware?.AsYesNo(),
Incomplete = driver.Incomplete?.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.CocktailKey, driver.Cocktail?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.EmulationKey, driver.Emulation?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<bool?>(Models.Metadata.Driver.IncompleteKey, driver.Incomplete.AsYesNo());
item.SetFieldValue<bool?>(Models.Metadata.Driver.NoSoundHardwareKey, driver.NoSoundHardware.AsYesNo());
item.SetFieldValue<bool?>(Models.Metadata.Driver.RequiresArtworkKey, driver.RequiresArtwork.AsYesNo());
item.SetFieldValue<Supported>(Models.Metadata.Driver.SaveStateKey, driver.SaveState?.AsEnumValue<Supported>() ?? Supported.NULL);
item.SetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey, driver.Status?.AsEnumValue<SupportStatus>() ?? SupportStatus.NULL);
item.SetFieldValue<bool?>(Models.Metadata.Driver.UnofficialKey, driver.Unofficial.AsYesNo());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -618,13 +613,12 @@ namespace SabreTools.DatFiles.Formats
{
var item = new DatItems.Formats.SoftwareList
{
Tag = softwarelist.Tag,
Status = softwarelist.Status?.AsEnumValue<SoftwareListStatus>() ?? SoftwareListStatus.None,
Filter = softwarelist.Filter,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(softwarelist.Name);
item.SetFieldValue<string?>(Models.Metadata.SoftwareList.FilterKey, softwarelist.Filter);
item.SetFieldValue<SoftwareListStatus>(Models.Metadata.SoftwareList.StatusKey, softwarelist.Status.AsEnumValue<SoftwareListStatus>());
item.SetFieldValue<string?>(Models.Metadata.SoftwareList.TagKey, softwarelist.Tag);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);

View File

@@ -37,29 +37,29 @@ namespace SabreTools.DatFiles.Formats
case Release release:
if (string.IsNullOrEmpty(release.GetName()))
missingFields.Add(Models.Metadata.Release.NameKey);
if (string.IsNullOrEmpty(release.Region))
if (string.IsNullOrEmpty(release.GetFieldValue<string?>(Models.Metadata.Release.RegionKey)))
missingFields.Add(Models.Metadata.Release.RegionKey);
break;
case BiosSet biosset:
if (string.IsNullOrEmpty(biosset.GetName()))
missingFields.Add(Models.Metadata.BiosSet.NameKey);
if (string.IsNullOrEmpty(biosset.Description))
if (string.IsNullOrEmpty(biosset.GetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey)))
missingFields.Add(Models.Metadata.BiosSet.DescriptionKey);
break;
case Rom rom:
if (string.IsNullOrEmpty(rom.GetName()))
missingFields.Add(Models.Metadata.Rom.NameKey);
if (rom.Size == null || rom.Size < 0)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < 0)
missingFields.Add(Models.Metadata.Rom.SizeKey);
if (string.IsNullOrEmpty(rom.CRC)
&& string.IsNullOrEmpty(rom.MD5)
&& string.IsNullOrEmpty(rom.SHA1)
&& string.IsNullOrEmpty(rom.SHA256)
&& string.IsNullOrEmpty(rom.SHA384)
&& string.IsNullOrEmpty(rom.SHA512)
&& string.IsNullOrEmpty(rom.SpamSum))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)))
{
missingFields.Add(Models.Metadata.Rom.SHA1Key);
}
@@ -68,8 +68,8 @@ namespace SabreTools.DatFiles.Formats
case Disk disk:
if (string.IsNullOrEmpty(disk.GetName()))
missingFields.Add(Models.Metadata.Disk.NameKey);
if (string.IsNullOrEmpty(disk.MD5)
&& string.IsNullOrEmpty(disk.SHA1))
if (string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key))
&& string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
{
missingFields.Add(Models.Metadata.Disk.SHA1Key);
}
@@ -78,10 +78,10 @@ namespace SabreTools.DatFiles.Formats
case Media media:
if (string.IsNullOrEmpty(media.GetName()))
missingFields.Add(Models.Metadata.Media.NameKey);
if (string.IsNullOrEmpty(media.MD5)
&& string.IsNullOrEmpty(media.SHA1)
&& string.IsNullOrEmpty(media.SHA256)
&& string.IsNullOrEmpty(media.SpamSum))
if (string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key))
&& string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key))
&& string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key))
&& string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)))
{
missingFields.Add(Models.Metadata.Media.SHA1Key);
}
@@ -103,22 +103,22 @@ namespace SabreTools.DatFiles.Formats
break;
case Driver driver:
if (!driver.StatusSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.StatusKey);
if (!driver.EmulationSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.EmulationKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.EmulationKey);
if (!driver.CocktailSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.CocktailKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.CocktailKey);
if (!driver.SaveStateSpecified)
if (driver.GetFieldValue<SupportStatus>(Models.Metadata.Driver.SaveStateKey) == SupportStatus.NULL)
missingFields.Add(Models.Metadata.Driver.SaveStateKey);
break;
case DatItems.Formats.SoftwareList softwarelist:
if (string.IsNullOrEmpty(softwarelist.Tag))
if (string.IsNullOrEmpty(softwarelist.GetFieldValue<string?>(Models.Metadata.SoftwareList.TagKey)))
missingFields.Add(Models.Metadata.SoftwareList.TagKey);
if (string.IsNullOrEmpty(softwarelist.GetName()))
missingFields.Add(Models.Metadata.SoftwareList.NameKey);
if (!softwarelist.StatusSpecified)
if (softwarelist.GetFieldValue<SoftwareListStatus?>(Models.Metadata.SoftwareList.StatusKey) == SoftwareListStatus.None)
missingFields.Add(Models.Metadata.SoftwareList.StatusKey);
break;
}
@@ -485,14 +485,12 @@ namespace SabreTools.DatFiles.Formats
var release = new Models.Logiqx.Release
{
Name = item.GetName(),
Region = item.Region,
Language = item.Language,
Date = item.Date,
Region = item.GetFieldValue<string?>(Models.Metadata.Release.RegionKey),
Language = item.GetFieldValue<string?>(Models.Metadata.Release.LanguageKey),
Date = item.GetFieldValue<string?>(Models.Metadata.Release.DateKey),
Default = item.GetFieldValue<bool?>(Models.Metadata.Release.DefaultKey).FromYesNo(),
};
if (item.DefaultSpecified)
release.Default = item.Default.FromYesNo();
return release;
}
@@ -504,12 +502,10 @@ namespace SabreTools.DatFiles.Formats
var biosset = new Models.Logiqx.BiosSet
{
Name = item.GetName(),
Description = item.Description,
Default = item.GetFieldValue<bool?>(Models.Metadata.BiosSet.DefaultKey).FromYesNo(),
Description = item.GetFieldValue<string?>(Models.Metadata.BiosSet.DescriptionKey),
};
if (item.DefaultSpecified)
biosset.Default = item.Default.FromYesNo();
return biosset;
}
@@ -521,28 +517,26 @@ namespace SabreTools.DatFiles.Formats
var rom = new Models.Logiqx.Rom
{
Name = item.GetName(),
Size = item.Size?.ToString(),
CRC = item.CRC,
MD5 = item.MD5,
SHA1 = item.SHA1,
SHA256 = item.SHA256,
SHA384 = item.SHA384,
SHA512 = item.SHA512,
SpamSum = item.SpamSum,
//xxHash364 = item.xxHash364, // TODO: Add to internal model
//xxHash3128 = item.xxHash3128, // TODO: Add to internal model
Merge = item.MergeTag,
//Serial = item.Serial, // TODO: Add to internal model
//Header = item.Header, // TODO: Add to internal model
Date = item.Date,
Size = item.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
CRC = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
MD5 = item.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
SHA256 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key),
SHA384 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key),
SHA512 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key),
SpamSum = item.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey),
xxHash364 = item.GetFieldValue<string?>(Models.Metadata.Rom.xxHash364Key),
xxHash3128 = item.GetFieldValue<string?>(Models.Metadata.Rom.xxHash3128Key),
Merge = item.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey),
Serial = item.GetFieldValue<string?>(Models.Metadata.Rom.SerialKey),
Header = item.GetFieldValue<string?>(Models.Metadata.Rom.HeaderKey),
Date = item.GetFieldValue<string?>(Models.Metadata.Rom.DateKey),
Inverted = item.GetFieldValue<bool?>(Models.Metadata.Rom.InvertedKey).FromYesNo(),
MIA = item.GetFieldValue<bool?>(Models.Metadata.Rom.MIAKey).FromYesNo(),
};
if (item.ItemStatusSpecified)
rom.Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false);
if (item.InvertedSpecified)
rom.Inverted = item.Inverted.FromYesNo();
if (item.MIASpecified)
rom.MIA = item.MIA.FromYesNo();
rom.Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey).AsStringValue<ItemStatus>(useSecond: false);
return rom;
}
@@ -555,14 +549,14 @@ namespace SabreTools.DatFiles.Formats
var disk = new Models.Logiqx.Disk
{
Name = item.GetName(),
MD5 = item.MD5,
SHA1 = item.SHA1,
Merge = item.MergeTag,
Region = item.Region,
MD5 = item.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key),
Merge = item.GetFieldValue<string?>(Models.Metadata.Disk.MergeKey),
Region = item.GetFieldValue<string?>(Models.Metadata.Disk.RegionKey),
};
if (item.ItemStatusSpecified)
disk.Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false);
if (item.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) != ItemStatus.NULL)
disk.Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey).AsStringValue<ItemStatus>(useSecond: false);
return disk;
}
@@ -575,10 +569,10 @@ namespace SabreTools.DatFiles.Formats
var media = new Models.Logiqx.Media
{
Name = item.GetName(),
MD5 = item.MD5,
SHA1 = item.SHA1,
SHA256 = item.SHA256,
SpamSum = item.SpamSum,
MD5 = item.GetFieldValue<string?>(Models.Metadata.Media.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key),
SHA256 = item.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key),
SpamSum = item.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey),
};
return media;
}
@@ -626,21 +620,16 @@ namespace SabreTools.DatFiles.Formats
{
var driver = new Models.Logiqx.Driver
{
Status = item.Status.AsStringValue<SupportStatus>(),
Emulation = item.Emulation.AsStringValue<SupportStatus>(),
Cocktail = item.Cocktail.AsStringValue<SupportStatus>(),
SaveState = item.SaveState.AsStringValue<Supported>(useSecond: true),
Status = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.StatusKey).AsStringValue<SupportStatus>(),
Emulation = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.EmulationKey).AsStringValue<SupportStatus>(),
Cocktail = item.GetFieldValue<SupportStatus>(Models.Metadata.Driver.CocktailKey).AsStringValue<SupportStatus>(),
SaveState = item.GetFieldValue<Supported>(Models.Metadata.Driver.SaveStateKey).AsStringValue<Supported>(useSecond: true),
RequiresArtwork = item.GetFieldValue<bool?>(Models.Metadata.Driver.RequiresArtworkKey).FromYesNo(),
Unofficial = item.GetFieldValue<bool?>(Models.Metadata.Driver.UnofficialKey).FromYesNo(),
NoSoundHardware = item.GetFieldValue<bool?>(Models.Metadata.Driver.NoSoundHardwareKey).FromYesNo(),
Incomplete = item.GetFieldValue<bool?>(Models.Metadata.Driver.IncompleteKey).FromYesNo(),
};
if (item.RequiresArtworkSpecified)
driver.RequiresArtwork = item.RequiresArtwork.FromYesNo();
if (item.UnofficialSpecified)
driver.Unofficial = item.Unofficial.FromYesNo();
if (item.NoSoundHardwareSpecified)
driver.NoSoundHardware = item.NoSoundHardware.FromYesNo();
if (item.IncompleteSpecified)
driver.Incomplete = item.Incomplete.FromYesNo();
return driver;
}
@@ -651,13 +640,13 @@ namespace SabreTools.DatFiles.Formats
{
var softwarelist = new Models.Logiqx.SoftwareList
{
Tag = item.Tag,
Tag = item.GetFieldValue<string?>(Models.Metadata.SoftwareList.TagKey),
Name = item.GetName(),
Filter = item.Filter,
Filter = item.GetFieldValue<string?>(Models.Metadata.SoftwareList.FilterKey),
};
if (item.StatusSpecified)
softwarelist.Status = item.Status.AsStringValue<SoftwareListStatus>();
if (item.GetFieldValue<SoftwareListStatus?>(Models.Metadata.SoftwareList.StatusKey) != SoftwareListStatus.None)
softwarelist.Status = item.GetFieldValue<SoftwareListStatus>(Models.Metadata.SoftwareList.StatusKey).AsStringValue<SoftwareListStatus>();
return softwarelist;
}

View File

@@ -366,13 +366,12 @@ namespace SabreTools.DatFiles.Formats
var item = new Rom
{
Size = size,
CRC = crc.Content,
ItemStatus = ItemStatus.None,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(name);
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, crc.Content);
item.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, size);
item.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);

View File

@@ -33,9 +33,9 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Rom rom:
if (rom.Size == null || rom.Size < 0)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < 0)
missingFields.Add(Models.Metadata.Rom.SizeKey);
if (string.IsNullOrEmpty(rom.CRC))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)))
missingFields.Add(Models.Metadata.Rom.CRCKey);
break;
}
@@ -388,7 +388,7 @@ namespace SabreTools.DatFiles.Formats
{
var romCRC = new Models.OfflineList.FileRomCRC
{
Content = item.CRC,
Content = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
};
return romCRC;

View File

@@ -139,34 +139,33 @@ namespace SabreTools.DatFiles.Formats
string name = $"{machine.Name}_{index++}{(!string.IsNullOrEmpty(rom.Remark) ? $" {rom.Remark}" : string.Empty)}";
var item = new Rom
{
Offset = dump.Rom?.Start,
OpenMSXType = rom.Type,
SHA1 = rom.Hash,
Remark = rom.Remark,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(name);
item.SetFieldValue<string?>(Models.Metadata.Rom.OffsetKey, dump.Rom?.Start);
item.SetFieldValue<string?>(Models.Metadata.Rom.OpenMSXType, rom.Type);
item.SetFieldValue<string?>(Models.Metadata.Rom.RemarkKey, rom.Remark);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.Hash);
if (dump.Original != null)
{
item.Original = new Original
item.SetFieldValue<Original?>("ORIGINAL", new Original
{
Value = dump.Original.Value.AsYesNo(),
Content = dump.Original.Content,
};
});
}
switch (dump.Rom)
{
case Models.OpenMSX.Rom:
item.OpenMSXSubType = OpenMSXSubType.Rom;
item.SetFieldValue<OpenMSXSubType>(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.Rom);
break;
case Models.OpenMSX.MegaRom:
item.OpenMSXSubType = OpenMSXSubType.MegaRom;
item.SetFieldValue<OpenMSXSubType>(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.MegaRom);
break;
case Models.OpenMSX.SCCPlusCart:
item.OpenMSXSubType = OpenMSXSubType.SCCPlusCart;
item.SetFieldValue<OpenMSXSubType>(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.SCCPlusCart);
break;
}

View File

@@ -33,7 +33,7 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.SHA1))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
missingFields.Add(Models.Metadata.Rom.SHA1Key);
break;
}
@@ -151,24 +151,24 @@ namespace SabreTools.DatFiles.Formats
private static Models.OpenMSX.Dump CreateDump(Rom item)
{
Models.OpenMSX.Original? original = null;
if (item.OriginalSpecified && item.Original != null)
if (item.OriginalSpecified && item.GetFieldValue<Original?>("ORIGINAL") != null)
{
original = new Models.OpenMSX.Original { Content = item.Original.Content };
if (item.Original.Value != null)
original.Value = item.Original.Value.ToString();
original = new Models.OpenMSX.Original { Content = item.GetFieldValue<Original?>("ORIGINAL")!.Content };
if (item.GetFieldValue<Original?>("ORIGINAL")!.Value != null)
original.Value = item.GetFieldValue<Original?>("ORIGINAL")!.Value.ToString();
}
Models.OpenMSX.RomBase rom = item.OpenMSXSubType switch
Models.OpenMSX.RomBase rom = item.GetFieldValue<OpenMSXSubType>(Models.Metadata.Rom.OpenMSXMediaType) switch
{
OpenMSXSubType.MegaRom => new Models.OpenMSX.MegaRom(),
OpenMSXSubType.SCCPlusCart => new Models.OpenMSX.SCCPlusCart(),
_ => new Models.OpenMSX.Rom(),
};
rom.Start = item.Offset;
rom.Type = item.OpenMSXType;
rom.Hash = item.SHA1;
rom.Remark = item.Remark;
rom.Start = item.GetFieldValue<string?>(Models.Metadata.Rom.OffsetKey);
rom.Type = item.GetFieldValue<string?>(Models.Metadata.Rom.OpenMSXType);
rom.Hash = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key);
rom.Remark = item.GetFieldValue<string?>(Models.Metadata.Rom.RemarkKey);
var dump = new Models.OpenMSX.Dump
{

View File

@@ -107,27 +107,27 @@ namespace SabreTools.DatFiles.Formats
foreach (var rom in games.Rom)
{
var item = new Rom
{
Size = NumberHelper.ConvertToInt64(rom.RomSize),
CRC = rom.RomCRC,
MergeTag = rom.MergeName,
ItemStatus = ItemStatus.None,
Machine = new Machine
var machine = new Machine
{
Name = rom.GameName,
Description = rom.GameDescription,
CloneOf = rom.ParentName,
//CloneOfDescription = rom.ParentDescription, // TODO: Add to internal model or find mapping
RomOf = rom.RomOf,
},
};
var item = new Rom
{
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(rom.RomName);
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.RomCRC);
item.SetFieldValue<string?>(Models.Metadata.Rom.MergeKey, rom.MergeName);
item.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.RomSize));
item.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
// Now process and add the item
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
}
}

View File

@@ -33,9 +33,9 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Rom rom:
if (string.IsNullOrEmpty(rom.CRC))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)))
missingFields.Add(Models.Metadata.Rom.CRCKey);
if (!rom.SizeSpecified)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null)
missingFields.Add(Models.Metadata.Rom.SizeKey);
break;
}
@@ -188,10 +188,10 @@ namespace SabreTools.DatFiles.Formats
GameName = item.Machine.Name,
GameDescription = item.Machine.Description,
RomName = item.GetName(),
RomCRC = item.CRC,
RomSize = item.Size?.ToString(),
RomCRC = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
RomSize = item.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
RomOf = item.Machine.RomOf,
MergeName = item.MergeTag,
MergeName = item.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey),
};
return rom;
}

View File

@@ -84,43 +84,40 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Disk:
item = new Disk
{
MD5 = row.MD5,
SHA1 = row.SHA1,
ItemStatus = row.Status.AsEnumValue<ItemStatus>(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(row.DiskName);
item.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, row.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL);
item.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, row.MD5);
item.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, row.SHA1);
break;
case ItemType.Media:
item = new Media
{
MD5 = row.MD5,
SHA1 = row.SHA1,
SHA256 = row.SHA256,
SpamSum = row.SpamSum,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(row.DiskName);
item.SetFieldValue<string?>(Models.Metadata.Media.MD5Key, row.MD5);
item.SetFieldValue<string?>(Models.Metadata.Media.SHA1Key, row.SHA1);
item.SetFieldValue<string?>(Models.Metadata.Media.SHA256Key, row.SHA256);
item.SetFieldValue<string?>(Models.Metadata.Media.SpamSumKey, row.SpamSum);
break;
case ItemType.Rom:
item = new Rom
{
CRC = row.CRC,
MD5 = row.MD5,
SHA1 = row.SHA1,
SHA256 = row.SHA256,
SHA384 = row.SHA384,
SHA512 = row.SHA512,
SpamSum = row.SpamSum,
ItemStatus = row.Status.AsEnumValue<ItemStatus>(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(row.RomName);
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, row.CRC);
item.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, row.MD5);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, row.SHA1);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, row.SHA256);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, row.SHA384);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, row.SHA512);
item.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, row.SpamSum);
item.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, row.Status.AsEnumValue<ItemStatus>());
break;
}

View File

@@ -36,23 +36,23 @@ namespace SabreTools.DatFiles.Formats
switch (datItem)
{
case Disk disk:
if (string.IsNullOrEmpty(disk.MD5)
&& string.IsNullOrEmpty(disk.SHA1))
if (string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key))
&& string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
{
missingFields.Add(Models.Metadata.Disk.SHA1Key);
}
break;
case Rom rom:
if (rom.Size == null || rom.Size < 0)
if (rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < 0)
missingFields.Add(Models.Metadata.Rom.SizeKey);
if (string.IsNullOrEmpty(rom.CRC)
&& string.IsNullOrEmpty(rom.MD5)
&& string.IsNullOrEmpty(rom.SHA1)
&& string.IsNullOrEmpty(rom.SHA256)
&& string.IsNullOrEmpty(rom.SHA384)
&& string.IsNullOrEmpty(rom.SHA512)
&& string.IsNullOrEmpty(rom.SpamSum))
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key))
&& string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)))
{
missingFields.Add(Models.Metadata.Rom.SHA1Key);
}
@@ -164,18 +164,18 @@ namespace SabreTools.DatFiles.Formats
Description = Header.Description,
GameName = disk.Machine.Name,
GameDescription = disk.Machine.Description,
Type = disk.ItemType.AsStringValue<ItemType>(),
Type = disk.GetFieldValue<ItemType>(Models.Metadata.Disk.TypeKey).AsStringValue<ItemType>(),
RomName = string.Empty,
DiskName = disk.GetName(),
Size = string.Empty,
CRC = string.Empty,
MD5 = disk.MD5,
SHA1 = disk.SHA1,
MD5 = disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key),
SHA1 = disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key),
SHA256 = string.Empty,
SHA384 = string.Empty,
SHA512 = string.Empty,
SpamSum = string.Empty,
Status = disk.ItemStatus.AsStringValue<ItemStatus>(useSecond: false),
Status = disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey).AsStringValue<ItemStatus>(useSecond: false),
};
return row;
}
@@ -197,12 +197,12 @@ namespace SabreTools.DatFiles.Formats
DiskName = media.GetName(),
Size = string.Empty,
CRC = string.Empty,
MD5 = media.MD5,
SHA1 = media.SHA1,
SHA256 = media.SHA256,
MD5 = media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key),
SHA1 = media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key),
SHA256 = media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key),
SHA384 = string.Empty,
SHA512 = string.Empty,
SpamSum = media.SpamSum,
SpamSum = media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey),
Status = string.Empty,
};
return row;
@@ -223,15 +223,15 @@ namespace SabreTools.DatFiles.Formats
Type = rom.ItemType.AsStringValue<ItemType>(),
RomName = rom.GetName(),
DiskName = string.Empty,
Size = rom.Size?.ToString(),
CRC = rom.CRC,
MD5 = rom.MD5,
SHA1 = rom.SHA1,
SHA256 = rom.SHA256,
SHA384 = rom.SHA384,
SHA512 = rom.SHA512,
SpamSum = rom.SpamSum,
Status = rom.ItemStatus.AsStringValue<ItemStatus>(useSecond: false),
Size = rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
CRC = rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
MD5 = rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key),
SHA1 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
SHA256 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key),
SHA384 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key),
SHA512 = rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key),
SpamSum = rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey),
Status = rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey).AsStringValue<ItemStatus>(useSecond: false),
};
return row;
}

View File

@@ -106,11 +106,10 @@ namespace SabreTools.DatFiles.Formats
{
var infoItem = new Info
{
Value = info.Value,
Source = new Source { Index = indexId, Name = filename },
};
infoItem.SetName(info.Name);
infoItem.SetFieldValue<string?>(Models.Metadata.Info.ValueKey, info.Value);
infoItem.CopyMachineInformation(machine);
ParseAddHelper(infoItem, statsOnly);
@@ -121,11 +120,10 @@ namespace SabreTools.DatFiles.Formats
{
var sharedfeatItem = new SharedFeature
{
Value = sharedfeat.Value,
Source = new Source { Index = indexId, Name = filename },
};
sharedfeatItem.SetName(sharedfeat.Name);
sharedfeatItem.SetFieldValue<string?>(Models.Metadata.SharedFeat.ValueKey, sharedfeat.Value);
sharedfeatItem.CopyMachineInformation(machine);
ParseAddHelper(sharedfeatItem, statsOnly);
@@ -169,12 +167,11 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Part
{
Interface = part.Interface,
Features = CreateFeatures(part.Feature, machine, filename, indexId, statsOnly),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(part.Name);
item.SetFieldValue<string?>(Models.Metadata.Part.InterfaceKey, part.Interface);
item.SetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey, CreateFeatures(part.Feature, machine, filename, indexId, statsOnly));
item.CopyMachineInformation(machine);
@@ -192,7 +189,7 @@ namespace SabreTools.DatFiles.Formats
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param>
/// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param>
private static List<PartFeature>? CreateFeatures(Models.SoftwareList.Feature[]? features, Machine machine, string filename, int indexId, bool statsOnly)
private static PartFeature[]? CreateFeatures(Models.SoftwareList.Feature[]? features, Machine machine, string filename, int indexId, bool statsOnly)
{
// If the feature array is missing, we can't do anything
if (features == null || !features.Any())
@@ -203,17 +200,16 @@ namespace SabreTools.DatFiles.Formats
{
var item = new PartFeature
{
Value = feature.Value,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(feature.Name);
item.SetFieldValue<string?>(Models.Metadata.Feature.ValueKey, feature.Value);
item.CopyMachineInformation(machine);
partFeatures.Add(item);
}
return partFeatures;
return [.. partFeatures];
}
/// <summary>
@@ -236,13 +232,12 @@ namespace SabreTools.DatFiles.Formats
{
var item = new DataArea
{
Size = NumberHelper.ConvertToInt64(dataarea.Size),
Width = NumberHelper.ConvertToInt64(dataarea.Width),
Endianness = dataarea.Endianness.AsEnumValue<Endianness>(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(dataarea.Name);
item.SetFieldValue<Endianness?>(Models.Metadata.DataArea.EndiannessKey, dataarea.Endianness.AsEnumValue<Endianness>());
item.SetFieldValue<long?>(Models.Metadata.DataArea.SizeKey, NumberHelper.ConvertToInt64(dataarea.Size));
item.SetFieldValue<long?>(Models.Metadata.DataArea.WidthKey, NumberHelper.ConvertToInt64(dataarea.Width));
item.CopyMachineInformation(machine);
ConvertRoms(dataarea.Rom, part, item, machine, filename, indexId, statsOnly, ref containsItems);
@@ -271,20 +266,18 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Rom
{
Size = NumberHelper.ConvertToInt64(rom.Size ?? rom.Length),
CRC = rom.CRC,
SHA1 = rom.SHA1,
Offset = rom.Offset,
Value = rom.Value,
ItemStatus = rom.Status.AsEnumValue<ItemStatus>(),
LoadFlag = rom.LoadFlag.AsEnumValue<LoadFlag>(),
Part = part,
DataArea = dataarea,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(rom.Name);
item.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size ?? rom.Length));
item.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, rom.CRC);
item.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, rom.SHA1);
item.SetFieldValue<string?>(Models.Metadata.Rom.OffsetKey, rom.Offset);
item.SetFieldValue<string?>(Models.Metadata.Rom.ValueKey, rom.Value);
item.SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, rom.Status.AsEnumValue<ItemStatus>());
item.SetFieldValue<LoadFlag>(Models.Metadata.Rom.LoadFlagKey, rom.LoadFlag.AsEnumValue<LoadFlag>());
item.SetFieldValue<Part?>("PART", part);
item.SetFieldValue<DataArea?>("DATAAREA", dataarea);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -342,17 +335,15 @@ namespace SabreTools.DatFiles.Formats
{
var item = new Disk
{
MD5 = disk.MD5,
SHA1 = disk.SHA1,
ItemStatus = disk.Status.AsEnumValue<ItemStatus>(),
Writable = disk.Writeable.AsYesNo(),
Part = part,
DiskArea = diskarea,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(disk.Name);
item.SetFieldValue<DiskArea?>("DISKAREA", diskarea);
item.SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue<ItemStatus>() ?? ItemStatus.NULL);
item.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, disk.MD5);
item.SetFieldValue<Part?>("PART", part);
item.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, disk.SHA1);
item.SetFieldValue<bool?>(Models.Metadata.Disk.WritableKey, disk.Writeable.AsYesNo());
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -379,15 +370,13 @@ namespace SabreTools.DatFiles.Formats
{
var item = new DipSwitch
{
Tag = dipswitch.Tag,
Mask = dipswitch.Mask,
Values = CreateDipValues(dipswitch.DipValue, machine, filename, indexId),
Part = part,
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(dipswitch.Name);
item.SetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey, CreateDipValues(dipswitch.DipValue, machine, filename, indexId)?.ToArray());
item.SetFieldValue<Part?>("PART", part);
item.SetFieldValue<string?>(Models.Metadata.DipSwitch.MaskKey, dipswitch.Mask);
item.SetFieldValue<string?>(Models.Metadata.DipSwitch.TagKey, dipswitch.Tag);
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
@@ -412,12 +401,11 @@ namespace SabreTools.DatFiles.Formats
{
var item = new DipValue
{
Value = dipvalue.Value,
Default = dipvalue.Default.AsYesNo(),
Source = new Source { Index = indexId, Name = filename },
};
item.SetName(dipvalue.Name);
item.SetFieldValue<bool?>(Models.Metadata.DipValue.DefaultKey, dipvalue.Default.AsYesNo());
item.SetFieldValue<string?>(Models.Metadata.DipValue.ValueKey, dipvalue.Value);
item.CopyMachineInformation(machine);
settings.Add(item);

View File

@@ -41,22 +41,22 @@ namespace SabreTools.DatFiles.Formats
}
else
{
if (string.IsNullOrEmpty(dipSwitch.Part!.GetName()))
if (string.IsNullOrEmpty(dipSwitch.GetFieldValue<Part?>("PART")!.GetName()))
missingFields.Add(Models.Metadata.Part.NameKey);
if (string.IsNullOrEmpty(dipSwitch.Part.Interface))
if (string.IsNullOrEmpty(dipSwitch.GetFieldValue<Part?>("PART")!.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey)))
missingFields.Add(Models.Metadata.Part.InterfaceKey);
}
if (string.IsNullOrEmpty(dipSwitch.GetName()))
missingFields.Add(Models.Metadata.DipSwitch.NameKey);
if (string.IsNullOrEmpty(dipSwitch.Tag))
if (string.IsNullOrEmpty(dipSwitch.GetFieldValue<string?>(Models.Metadata.DipSwitch.TagKey)))
missingFields.Add(Models.Metadata.DipSwitch.TagKey);
if (string.IsNullOrEmpty(dipSwitch.Mask))
if (string.IsNullOrEmpty(dipSwitch.GetFieldValue<string?>(Models.Metadata.DipSwitch.MaskKey)))
missingFields.Add(Models.Metadata.DipSwitch.MaskKey);
if (dipSwitch.ValuesSpecified)
{
if (dipSwitch.Values!.Any(dv => string.IsNullOrEmpty(dv.GetName())))
if (dipSwitch.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey)!.Any(dv => string.IsNullOrEmpty(dv.GetName())))
missingFields.Add(Models.Metadata.DipValue.NameKey);
if (dipSwitch.Values!.Any(dv => string.IsNullOrEmpty(dv.Value)))
if (dipSwitch.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey)!.Any(dv => string.IsNullOrEmpty(dv.GetFieldValue<string?>(Models.Metadata.DipValue.ValueKey))))
missingFields.Add(Models.Metadata.DipValue.ValueKey);
}
@@ -70,9 +70,9 @@ namespace SabreTools.DatFiles.Formats
}
else
{
if (string.IsNullOrEmpty(disk.Part!.GetName()))
if (string.IsNullOrEmpty(disk.GetFieldValue<Part?>("PART")!.GetName()))
missingFields.Add(Models.Metadata.Part.NameKey);
if (string.IsNullOrEmpty(disk.Part.Interface))
if (string.IsNullOrEmpty(disk.GetFieldValue<Part?>("PART")!.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey)))
missingFields.Add(Models.Metadata.Part.InterfaceKey);
}
if (!disk.DiskAreaSpecified)
@@ -81,7 +81,7 @@ namespace SabreTools.DatFiles.Formats
}
else
{
if (string.IsNullOrEmpty(disk.DiskArea!.GetName()))
if (string.IsNullOrEmpty(disk.GetFieldValue<DiskArea?>("DISKAREA")!.GetName()))
missingFields.Add(Models.Metadata.DiskArea.NameKey);
}
if (string.IsNullOrEmpty(disk.GetName()))
@@ -101,9 +101,9 @@ namespace SabreTools.DatFiles.Formats
}
else
{
if (string.IsNullOrEmpty(rom.Part!.GetName()))
if (string.IsNullOrEmpty(rom.GetFieldValue<Part?>("PART")!.GetName()))
missingFields.Add(Models.Metadata.Part.NameKey);
if (string.IsNullOrEmpty(rom.Part.Interface))
if (string.IsNullOrEmpty(rom.GetFieldValue<Part?>("PART")!.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey)))
missingFields.Add(Models.Metadata.Part.InterfaceKey);
}
if (!rom.DataAreaSpecified)
@@ -113,9 +113,9 @@ namespace SabreTools.DatFiles.Formats
}
else
{
if (string.IsNullOrEmpty(rom.DataArea!.GetName()))
if (string.IsNullOrEmpty(rom.GetFieldValue<DataArea?>("DATAAREA")!.GetName()))
missingFields.Add(Models.Metadata.DataArea.NameKey);
if (!rom.DataArea.SizeSpecified)
if (rom.GetFieldValue<DataArea?>("DATAAREA")!.GetFieldValue<long?>(Models.Metadata.DataArea.SizeKey) == null)
missingFields.Add(Models.Metadata.DataArea.SizeKey);
}
break;
@@ -279,7 +279,7 @@ namespace SabreTools.DatFiles.Formats
var info = new Models.SoftwareList.Info
{
Name = item.GetName(),
Value = item.Value,
Value = item.GetFieldValue<string?>(Models.Metadata.Info.ValueKey),
};
return info;
}
@@ -292,7 +292,7 @@ namespace SabreTools.DatFiles.Formats
var sharedfeat = new Models.SoftwareList.SharedFeat
{
Name = item.GetName(),
Value = item.Value,
Value = item.GetFieldValue<string?>(Models.Metadata.SharedFeat.ValueKey),
};
return sharedfeat;
}
@@ -304,9 +304,9 @@ namespace SabreTools.DatFiles.Formats
{
var part = new Models.SoftwareList.Part
{
Name = item.Part?.GetName(),
Interface = item.Part?.Interface,
Feature = CreateFeatures(item.Part?.Features),
Name = item.GetFieldValue<Part?>("PART")?.GetName(),
Interface = item.GetFieldValue<Part?>("PART")?.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey),
Feature = CreateFeatures(item.GetFieldValue<Part?>("PART")?.GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey)),
DataArea = CreateDataAreas(item),
DiskArea = null,
DipSwitch = null,
@@ -321,9 +321,9 @@ namespace SabreTools.DatFiles.Formats
{
var part = new Models.SoftwareList.Part
{
Name = item.Part?.GetName(),
Interface = item.Part?.Interface,
Feature = CreateFeatures(item.Part?.Features),
Name = item.GetFieldValue<Part?>("PART")?.GetName(),
Interface = item.GetFieldValue<Part?>("PART")?.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey),
Feature = CreateFeatures(item.GetFieldValue<Part?>("PART")?.GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey)),
DataArea = null,
DiskArea = CreateDiskAreas(item),
DipSwitch = null,
@@ -338,9 +338,9 @@ namespace SabreTools.DatFiles.Formats
{
var part = new Models.SoftwareList.Part
{
Name = item.Part?.GetName(),
Interface = item.Part?.Interface,
Feature = CreateFeatures(item.Part?.Features),
Name = item.GetFieldValue<Part?>("PART")?.GetName(),
Interface = item.GetFieldValue<Part?>("PART")?.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey),
Feature = CreateFeatures(item.GetFieldValue<Part?>("PART")?.GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey)),
DataArea = null,
DiskArea = null,
DipSwitch = CreateDipSwitches(item),
@@ -351,7 +351,7 @@ namespace SabreTools.DatFiles.Formats
/// <summary>
/// Create a Feature array from the current list of PartFeature DatItems
/// <summary>
private static Models.SoftwareList.Feature[]? CreateFeatures(List<PartFeature>? items)
private static Models.SoftwareList.Feature[]? CreateFeatures(PartFeature[]? items)
{
// If we don't have features, we can't do anything
if (items == null || !items.Any())
@@ -363,7 +363,7 @@ namespace SabreTools.DatFiles.Formats
var feature = new Models.SoftwareList.Feature
{
Name = item.GetName(),
Value = item.Value,
Value = item.GetFieldValue<string?>(Models.Metadata.Feature.ValueKey),
};
features.Add(feature);
}
@@ -378,10 +378,10 @@ namespace SabreTools.DatFiles.Formats
{
var dataArea = new Models.SoftwareList.DataArea
{
Name = item.DataArea?.GetName(),
Size = item.DataArea?.Size?.ToString(),
Width = item.DataArea?.Width?.ToString(),
Endianness = item.DataArea?.Endianness.AsStringValue<Endianness>(),
Name = item.GetFieldValue<DataArea?>("DATAAREA")?.GetName(),
Size = item.GetFieldValue<DataArea?>("DATAAREA")?.GetFieldValue<long?>(Models.Metadata.DataArea.SizeKey)?.ToString(),
Width = item.GetFieldValue<DataArea?>("DATAAREA")?.GetFieldValue<long?>(Models.Metadata.DataArea.WidthKey)?.ToString(),
Endianness = item.GetFieldValue<DataArea?>("DATAAREA")?.GetFieldValue<Endianness>(Models.Metadata.DataArea.EndiannessKey).AsStringValue<Endianness>(),
Rom = CreateRom(item),
};
return [dataArea];
@@ -395,14 +395,14 @@ namespace SabreTools.DatFiles.Formats
var rom = new Models.SoftwareList.Rom
{
Name = item.GetName(),
Size = item.Size?.ToString(),
Size = item.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey)?.ToString(),
Length = null,
CRC = item.CRC,
SHA1 = item.SHA1,
Offset = item.Offset,
Value = item.Value,
Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false),
LoadFlag = item.LoadFlag.AsStringValue<LoadFlag>(),
CRC = item.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key),
Offset = item.GetFieldValue<string?>(Models.Metadata.Rom.OffsetKey),
Value = item.GetFieldValue<string?>(Models.Metadata.Rom.ValueKey),
Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey).AsStringValue<ItemStatus>(useSecond: false),
LoadFlag = item.GetFieldValue<LoadFlag>(Models.Metadata.Rom.LoadFlagKey).AsStringValue<LoadFlag>(),
};
return [rom];
}
@@ -427,10 +427,10 @@ namespace SabreTools.DatFiles.Formats
var disk = new Models.SoftwareList.Disk
{
Name = item.GetName(),
MD5 = item.MD5,
SHA1 = item.SHA1,
Status = item.ItemStatus.AsStringValue<ItemStatus>(useSecond: false),
Writeable = item.Writable?.ToString(),
MD5 = item.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key),
SHA1 = item.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key),
Status = item.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey).AsStringValue<ItemStatus>(useSecond: false),
Writeable = item.GetFieldValue<bool?>(Models.Metadata.Disk.WritableKey)?.ToString(),
};
return [disk];
}
@@ -441,13 +441,13 @@ namespace SabreTools.DatFiles.Formats
private static Models.SoftwareList.DipSwitch[]? CreateDipSwitches(DipSwitch item)
{
var dipValues = new List<Models.SoftwareList.DipValue>();
foreach (var setting in item.Values ?? [])
foreach (var setting in item.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey) ?? [])
{
var dipValue = new Models.SoftwareList.DipValue
{
Name = setting.GetName(),
Value = setting.Value,
Default = setting.Default?.ToString(),
Value = setting.GetFieldValue<string?>(Models.Metadata.DipValue.ValueKey),
Default = setting.GetFieldValue<bool?>(Models.Metadata.DipValue.DefaultKey).FromYesNo(),
};
dipValues.Add(dipValue);

View File

@@ -229,40 +229,40 @@ namespace SabreTools.DatFiles
switch (item)
{
case Disk disk:
if (disk.ItemStatus != ItemStatus.Nodump)
if (disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) != ItemStatus.Nodump)
{
AddHashCount(HashType.MD5, string.IsNullOrEmpty(disk.MD5) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.SHA1) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
}
AddStatusCount(ItemStatus.BadDump, disk.ItemStatus == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, disk.ItemStatus == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, disk.ItemStatus == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, disk.ItemStatus == ItemStatus.Verified ? 1 : 0);
AddStatusCount(ItemStatus.BadDump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
case Media media:
AddHashCount(HashType.MD5, string.IsNullOrEmpty(media.MD5) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.SHA1) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.SHA256) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.SpamSum) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
break;
case Rom rom:
if (rom.ItemStatus != ItemStatus.Nodump)
if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump)
{
TotalSize += rom.Size ?? 0;
AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.CRC) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.MD5) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.SHA1) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.SHA256) ? 0 : 1);
AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.SHA384) ? 0 : 1);
AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.SHA512) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.SpamSum) ? 0 : 1);
TotalSize += rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) ?? 0;
AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
}
AddStatusCount(ItemStatus.BadDump, rom.ItemStatus == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, rom.ItemStatus == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, rom.ItemStatus == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, rom.ItemStatus == ItemStatus.Verified ? 1 : 0);
AddStatusCount(ItemStatus.BadDump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
}
}
@@ -510,40 +510,40 @@ namespace SabreTools.DatFiles
switch (item)
{
case Disk disk:
if (disk.ItemStatus != ItemStatus.Nodump)
if (disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) != ItemStatus.Nodump)
{
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(disk.MD5) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.SHA1) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
}
RemoveStatusCount(ItemStatus.BadDump, disk.ItemStatus == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, disk.ItemStatus == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, disk.ItemStatus == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, disk.ItemStatus == ItemStatus.Verified ? 1 : 0);
RemoveStatusCount(ItemStatus.BadDump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
case Media media:
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(media.MD5) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.SHA1) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.SHA256) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.SpamSum) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
break;
case Rom rom:
if (rom.ItemStatus != ItemStatus.Nodump)
if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump)
{
TotalSize -= rom.Size ?? 0;
RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.CRC) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.MD5) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.SHA1) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.SHA256) ? 0 : 1);
RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.SHA384) ? 0 : 1);
RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.SHA512) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.SpamSum) ? 0 : 1);
TotalSize -= rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) ?? 0;
RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
}
RemoveStatusCount(ItemStatus.BadDump, rom.ItemStatus == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, rom.ItemStatus == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, rom.ItemStatus == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, rom.ItemStatus == ItemStatus.Verified ? 1 : 0);
RemoveStatusCount(ItemStatus.BadDump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
}
}

View File

@@ -346,40 +346,40 @@ namespace SabreTools.DatFiles
switch (item)
{
case Disk disk:
if (disk.ItemStatus != ItemStatus.Nodump)
if (disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) != ItemStatus.Nodump)
{
AddHashCount(HashType.MD5, string.IsNullOrEmpty(disk.MD5) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.SHA1) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
}
AddStatusCount(ItemStatus.BadDump, disk.ItemStatus == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, disk.ItemStatus == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, disk.ItemStatus == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, disk.ItemStatus == ItemStatus.Verified ? 1 : 0);
AddStatusCount(ItemStatus.BadDump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
case Media media:
AddHashCount(HashType.MD5, string.IsNullOrEmpty(media.MD5) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.SHA1) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.SHA256) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.SpamSum) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
break;
case Rom rom:
if (rom.ItemStatus != ItemStatus.Nodump)
if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump)
{
TotalSize += rom.Size ?? 0;
AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.CRC) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.MD5) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.SHA1) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.SHA256) ? 0 : 1);
AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.SHA384) ? 0 : 1);
AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.SHA512) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.SpamSum) ? 0 : 1);
TotalSize += rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) ?? 0;
AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
}
AddStatusCount(ItemStatus.BadDump, rom.ItemStatus == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, rom.ItemStatus == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, rom.ItemStatus == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, rom.ItemStatus == ItemStatus.Verified ? 1 : 0);
AddStatusCount(ItemStatus.BadDump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0);
AddStatusCount(ItemStatus.Good, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0);
AddStatusCount(ItemStatus.Nodump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0);
AddStatusCount(ItemStatus.Verified, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
}
}
@@ -654,40 +654,40 @@ namespace SabreTools.DatFiles
switch (item)
{
case Disk disk:
if (disk.ItemStatus != ItemStatus.Nodump)
if (disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) != ItemStatus.Nodump)
{
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(disk.MD5) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.SHA1) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
}
RemoveStatusCount(ItemStatus.BadDump, disk.ItemStatus == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, disk.ItemStatus == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, disk.ItemStatus == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, disk.ItemStatus == ItemStatus.Verified ? 1 : 0);
RemoveStatusCount(ItemStatus.BadDump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
case Media media:
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(media.MD5) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.SHA1) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.SHA256) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.SpamSum) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
break;
case Rom rom:
if (rom.ItemStatus != ItemStatus.Nodump)
if (rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump)
{
TotalSize -= rom.Size ?? 0;
RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.CRC) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.MD5) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.SHA1) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.SHA256) ? 0 : 1);
RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.SHA384) ? 0 : 1);
RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.SHA512) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.SpamSum) ? 0 : 1);
TotalSize -= rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) ?? 0;
RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
}
RemoveStatusCount(ItemStatus.BadDump, rom.ItemStatus == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, rom.ItemStatus == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, rom.ItemStatus == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, rom.ItemStatus == ItemStatus.Verified ? 1 : 0);
RemoveStatusCount(ItemStatus.BadDump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0);
RemoveStatusCount(ItemStatus.Good, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0);
RemoveStatusCount(ItemStatus.Nodump, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0);
RemoveStatusCount(ItemStatus.Verified, rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Verified ? 1 : 0);
break;
}
}

View File

@@ -0,0 +1,86 @@
using System.Linq;
using SabreTools.DatItems;
using SabreTools.Filter;
namespace SabreTools.DatFiles
{
public static class MetadataConverter
{
#region Converters
/// <summary>
/// Convert metadata information
/// </summary>
/// <param name="item">Metadata file to convert</param>
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param>
/// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param>
public static void ConvertMetadata(Models.Metadata.MetadataFile? item, string filename, int indexId, bool statsOnly)
{
// If the metadata file is invalid, we can't do anything
if (item == null || !item.Any())
return;
// Get the machines from the metadata
var machines = item.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
if (machines == null)
return;
// Loop through the machines and add
foreach (var machine in machines)
{
ConvertMachine(machine, filename, indexId, statsOnly);
}
}
/// <summary>
/// Convert machine information
/// </summary>
/// <param name="metadata">Metadata file to convert</param>
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param>
/// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param>
private static void ConvertMachine(Models.Metadata.Machine? item, string filename, int indexId, bool statsOnly)
{
// If the machine is invalid, we can't do anything
if (item == null || !item.Any())
return;
// Create an internal machine
var machine = new Machine(item);
// Process all possible items
/*
AdjusterKey
ArchiveKey
BiosSetKey
ChipKey
ConfigurationKey
DeviceKey
DeviceRefKey
DipSwitchKey
DiskKey
DisplayKey
DriverKey
DumpKey
FeatureKey
InfoKey
InputKey
MediaKey
PartKey
PortKey
RamOptionKey
ReleaseKey
RomKey
SampleKey
SharedFeatKey
SoftwareListKey
SoundKey
TruripKey
VideoKey
*/
}
#endregion
}
}

View File

@@ -263,7 +263,7 @@ namespace SabreTools.DatFiles
{
if (configuration.ConditionsSpecified)
{
foreach (Condition subCondition in configuration.Conditions!)
foreach (Condition subCondition in configuration.GetFieldValue<Condition[]?>(Models.Metadata.Configuration.ConditionKey)!)
{
SetFields(subCondition);
}
@@ -271,7 +271,7 @@ namespace SabreTools.DatFiles
if (configuration.LocationsSpecified)
{
foreach (ConfLocation subLocation in configuration.Locations!)
foreach (ConfLocation subLocation in configuration.GetFieldValue<ConfLocation[]?>(Models.Metadata.Configuration.ConfLocationKey)!)
{
SetFields(subLocation);
}
@@ -279,7 +279,7 @@ namespace SabreTools.DatFiles
if (configuration.SettingsSpecified)
{
foreach (ConfSetting subSetting in configuration.Settings!)
foreach (ConfSetting subSetting in configuration.GetFieldValue<ConfSetting[]?>(Models.Metadata.Configuration.ConfSettingKey)!)
{
SetFields(subSetting as DatItem);
}
@@ -294,7 +294,7 @@ namespace SabreTools.DatFiles
{
if (confSetting.ConditionsSpecified)
{
foreach (Condition subCondition in confSetting.Conditions!)
foreach (Condition subCondition in confSetting.GetFieldValue<Condition[]?>(Models.Metadata.ConfSetting.ConditionKey)!)
{
SetFields(subCondition);
}
@@ -309,7 +309,7 @@ namespace SabreTools.DatFiles
{
if (device.ExtensionsSpecified)
{
foreach (Extension subExtension in device.Extensions!)
foreach (Extension subExtension in device.GetFieldValue<Extension[]?>(Models.Metadata.Device.ExtensionKey)!)
{
SetFields(subExtension);
}
@@ -317,7 +317,7 @@ namespace SabreTools.DatFiles
if (device.InstancesSpecified)
{
foreach (Instance subInstance in device.Instances!)
foreach (Instance subInstance in device.GetFieldValue<Instance[]?>(Models.Metadata.Device.InstanceKey)!)
{
SetFields(subInstance);
}
@@ -332,7 +332,7 @@ namespace SabreTools.DatFiles
{
if (dipSwitch.ConditionsSpecified)
{
foreach (Condition subCondition in dipSwitch.Conditions!)
foreach (Condition subCondition in dipSwitch.GetFieldValue<Condition[]?>(Models.Metadata.DipSwitch.ConditionKey)!)
{
SetFields(subCondition);
}
@@ -340,7 +340,7 @@ namespace SabreTools.DatFiles
if (dipSwitch.LocationsSpecified)
{
foreach (DipLocation subLocation in dipSwitch.Locations!)
foreach (DipLocation subLocation in dipSwitch.GetFieldValue<DipLocation[]?>(Models.Metadata.DipSwitch.DipLocationKey)!)
{
SetFields(subLocation);
}
@@ -348,14 +348,16 @@ namespace SabreTools.DatFiles
if (dipSwitch.ValuesSpecified)
{
foreach (DipValue subValue in dipSwitch.Values!)
foreach (DipValue subValue in dipSwitch.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey)!)
{
SetFields(subValue as DatItem);
}
}
dipSwitch.Part ??= new Part();
SetFields(dipSwitch.Part as DatItem);
if (!dipSwitch.PartSpecified)
dipSwitch.SetFieldValue<Part?>("PART", new Part());
SetFields((dipSwitch.GetFieldValue<Part?>("PART") as DatItem)!);
}
/// <summary>
@@ -366,7 +368,7 @@ namespace SabreTools.DatFiles
{
if (dipValue.ConditionsSpecified)
{
foreach (Condition subCondition in dipValue.Conditions!)
foreach (Condition subCondition in dipValue.GetFieldValue<Condition[]?>(Models.Metadata.DipValue.ConditionKey)!)
{
SetFields(subCondition);
}
@@ -379,11 +381,15 @@ namespace SabreTools.DatFiles
/// <param name="disk">Disk to remove replace fields in</param>
private void SetFields(Disk disk)
{
disk.DiskArea ??= new DiskArea();
SetFields(disk.DiskArea);
if (!disk.DiskAreaSpecified)
disk.SetFieldValue<DiskArea?>("DISKAREA", new DiskArea());
disk.Part ??= new Part();
SetFields(disk.Part as DatItem);
SetFields(disk.GetFieldValue<DiskArea?>("DISKAREA")! as DatItem);
if (!disk.PartSpecified)
disk.SetFieldValue<Part?>("PART", new Part());
SetFields(disk.GetFieldValue<Part?>("PART")! as DatItem);
}
/// <summary>
@@ -394,7 +400,7 @@ namespace SabreTools.DatFiles
{
if (input.ControlsSpecified)
{
foreach (Control subControl in input.Controls!)
foreach (Control subControl in input.GetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey)!)
{
SetFields(subControl);
}
@@ -409,7 +415,7 @@ namespace SabreTools.DatFiles
{
if (part.FeaturesSpecified)
{
foreach (PartFeature subPartFeature in part.Features!)
foreach (PartFeature subPartFeature in part.GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey)!)
{
SetFields(subPartFeature);
}
@@ -424,7 +430,7 @@ namespace SabreTools.DatFiles
{
if (port.AnalogsSpecified)
{
foreach (Analog subAnalog in port.Analogs!)
foreach (Analog subAnalog in port.GetFieldValue<Analog[]?>(Models.Metadata.Port.AnalogKey)!)
{
SetFields(subAnalog);
}
@@ -437,11 +443,15 @@ namespace SabreTools.DatFiles
/// <param name="rom">Rom to remove replace fields in</param>
private void SetFields(Rom rom)
{
rom.DataArea ??= new DataArea();
SetFields(rom.DataArea);
if (!rom.DataAreaSpecified)
rom.SetFieldValue<DataArea?>("DATAAREA", new DataArea());
rom.Part ??= new Part();
SetFields(rom.Part as DatItem);
SetFields(rom.GetFieldValue<DataArea?>("DATAAREA")! as DatItem);
if (!rom.PartSpecified)
rom.SetFieldValue<Part?>("PART", new Part());
SetFields(rom.GetFieldValue<Part?>("PART")! as DatItem);
}
/// <summary>
@@ -452,7 +462,7 @@ namespace SabreTools.DatFiles
{
if (slot.SlotOptionsSpecified)
{
foreach (SlotOption subSlotOption in slot.SlotOptions!)
foreach (SlotOption subSlotOption in slot.GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey)!)
{
SetFields(subSlotOption);
}

View File

@@ -557,13 +557,13 @@ namespace SabreTools.DatItems
}
// If it's a nodump, add and skip
if (file is Rom rom && rom.ItemStatus == ItemStatus.Nodump)
if (file is Rom rom && rom.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump)
{
outfiles.Add(file);
nodumpCount++;
continue;
}
else if (file is Disk disk && disk.ItemStatus == ItemStatus.Nodump)
else if (file is Disk disk && disk.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump)
{
outfiles.Add(file);
nodumpCount++;

View File

@@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("analog"), XmlRoot("analog")]
public class Analog : DatItem
{
#region Fields
/// <summary>
/// Analog mask value
/// </summary>
[JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mask")]
public string? Mask
{
get => _internal.ReadString(Models.Metadata.Analog.MaskKey);
set => _internal[Models.Metadata.Analog.MaskKey] = value;
}
#endregion
#region Constructors
/// <summary>

View File

@@ -10,33 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("biosset"), XmlRoot("biosset")]
public class BiosSet : DatItem
{
#region Fields
/// <summary>
/// Description of the BIOS
/// </summary>
[JsonProperty("description", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("description")]
public string? Description
{
get => _internal.ReadString(Models.Metadata.BiosSet.DescriptionKey);
set => _internal[Models.Metadata.BiosSet.DescriptionKey] = value;
}
/// <summary>
/// Determine whether the BIOS is default
/// </summary>
[JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("default")]
public bool? Default
{
get => _internal.ReadBool(Models.Metadata.BiosSet.DefaultKey);
set => _internal[Models.Metadata.BiosSet.DefaultKey] = value;
}
[JsonIgnore]
public bool DefaultSpecified { get { return Default != null; } }
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,8 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -12,47 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("chip"), XmlRoot("chip")]
public class Chip : DatItem
{
#region Fields
/// <summary>
/// Internal tag
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
{
get => _internal.ReadString(Models.Metadata.Chip.TagKey);
set => _internal[Models.Metadata.Chip.TagKey] = value;
}
/// <summary>
/// Type of the chip
/// </summary>
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")]
[JsonConverter(typeof(StringEnumConverter))]
public ChipType ChipType
{
get => _internal.ReadString(Models.Metadata.Chip.ChipTypeKey).AsEnumValue<ChipType>();
set => _internal[Models.Metadata.Chip.ChipTypeKey] = value.AsStringValue<ChipType>();
}
[JsonIgnore]
public bool ChipTypeSpecified { get { return ChipType != ChipType.NULL; } }
/// <summary>
/// Clock speed
/// </summary>
[JsonProperty("clock", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("clock")]
public long? Clock
{
get => _internal.ReadLong(Models.Metadata.Chip.ClockKey);
set => _internal[Models.Metadata.Chip.ClockKey] = value;
}
[JsonIgnore]
public bool ClockSpecified { get { return Clock != null; } }
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,8 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -12,54 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("condition"), XmlRoot("condition")]
public class Condition : DatItem
{
#region Fields
/// <summary>
/// Condition tag value
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
{
get => _internal.ReadString(Models.Metadata.Condition.TagKey);
set => _internal[Models.Metadata.Condition.TagKey] = value;
}
/// <summary>
/// Condition mask
/// </summary>
[JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mask")]
public string? Mask
{
get => _internal.ReadString(Models.Metadata.Condition.MaskKey);
set => _internal[Models.Metadata.Condition.MaskKey] = value;
}
/// <summary>
/// Condition relationship
/// </summary>
[JsonProperty("relation", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("relation")]
[JsonConverter(typeof(StringEnumConverter))]
public Relation Relation
{
get => _internal.ReadString(Models.Metadata.Condition.RelationKey).AsEnumValue<Relation>();
set => _internal[Models.Metadata.Condition.RelationKey] = value.AsStringValue<Relation>();
}
[JsonIgnore]
public bool RelationSpecified { get { return Relation != Core.Relation.NULL; } }
/// <summary>
/// Condition value
/// </summary>
[JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("value")]
public string? Value
{
get => _internal.ReadString(Models.Metadata.Condition.ValueKey);
set => _internal[Models.Metadata.Condition.ValueKey] = value;
}
#endregion
#region Constructors
/// <summary>

View File

@@ -10,36 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("conflocation"), XmlRoot("conflocation")]
public class ConfLocation : DatItem
{
#region Fields
/// <summary>
/// Location ID
/// </summary>
[JsonProperty("number", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("number")]
public long? Number
{
get => _internal.ReadLong(Models.Metadata.ConfLocation.NumberKey);
set => _internal[Models.Metadata.ConfLocation.NumberKey] = value;
}
[JsonIgnore]
public bool NumberSpecified { get { return Number != null; } }
/// <summary>
/// Determines if location is inverted or not
/// </summary>
[JsonProperty("inverted", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("inverted")]
public bool? Inverted
{
get => _internal.ReadBool(Models.Metadata.ConfLocation.InvertedKey);
set => _internal[Models.Metadata.ConfLocation.InvertedKey] = value;
}
[JsonIgnore]
public bool InvertedSpecified { get { return Inverted != null; } }
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,5 +1,3 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -14,41 +12,15 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
/// <summary>
/// Setting value
/// </summary>
[JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("value")]
public string? Value
{
get => _internal.ReadString(Models.Metadata.ConfSetting.ValueKey);
set => _internal[Models.Metadata.ConfSetting.ValueKey] = value;
}
/// <summary>
/// Determines if the setting is default or not
/// </summary>
[JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("default")]
public bool? Default
{
get => _internal.ReadBool(Models.Metadata.ConfSetting.DefaultKey);
set => _internal[Models.Metadata.ConfSetting.DefaultKey] = value;
}
[JsonIgnore]
public bool DefaultSpecified { get { return Default != null; } }
/// <summary>
/// List of conditions on the setting
/// </summary>
[JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")]
public List<Condition>? Conditions
public bool ConditionsSpecified
{
get => _internal.Read<Condition[]>(Models.Metadata.ConfSetting.ConditionKey)?.ToList();
set => _internal[Models.Metadata.ConfSetting.ConditionKey] = value?.ToArray();
get
{
var conditions = GetFieldValue<Condition[]?>(Models.Metadata.ConfSetting.ConditionKey);
return conditions != null && conditions.Length > 0;
}
}
[JsonIgnore]
public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } }
#endregion

View File

@@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -14,64 +12,35 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
/// <summary>
/// Tag associated with the configuration
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
[JsonIgnore]
public bool ConditionsSpecified
{
get => _internal.ReadString(Models.Metadata.Configuration.TagKey);
set => _internal[Models.Metadata.Configuration.TagKey] = value;
get
{
var conditions = GetFieldValue<Condition[]?>(Models.Metadata.Configuration.ConditionKey);
return conditions != null && conditions.Length > 0;
}
/// <summary>
/// Mask associated with the configuration
/// </summary>
[JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mask")]
public string? Mask
{
get => _internal.ReadString(Models.Metadata.Configuration.MaskKey);
set => _internal[Models.Metadata.Configuration.MaskKey] = value;
}
/// <summary>
/// Conditions associated with the configuration
/// </summary>
[JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")]
public List<Condition>? Conditions
{
get => _internal.Read<Condition[]>(Models.Metadata.Configuration.ConditionKey)?.ToList();
set => _internal[Models.Metadata.Configuration.ConditionKey] = value?.ToArray();
}
[JsonIgnore]
public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } }
/// <summary>
/// Locations associated with the configuration
/// </summary>
[JsonProperty("locations", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("locations")]
public List<ConfLocation>? Locations
public bool LocationsSpecified
{
get => _internal.Read<ConfLocation[]>(Models.Metadata.Configuration.ConfLocationKey)?.ToList();
set => _internal[Models.Metadata.Configuration.ConfLocationKey] = value?.ToArray();
get
{
var locations = GetFieldValue<ConfLocation[]?>(Models.Metadata.Configuration.ConfLocationKey);
return locations != null && locations.Length > 0;
}
}
[JsonIgnore]
public bool LocationsSpecified { get { return Locations != null && Locations.Count > 0; } }
/// <summary>
/// Settings associated with the configuration
/// </summary>
[JsonProperty("settings", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("settings")]
public List<ConfSetting>? Settings
public bool SettingsSpecified
{
get => _internal.Read<List<ConfSetting>>(Models.Metadata.Configuration.ConfSettingKey);
set => _internal[Models.Metadata.Configuration.ConfSettingKey] = value;
get
{
var settings = GetFieldValue<ConfSetting[]?>(Models.Metadata.Configuration.ConfSettingKey);
return settings != null && settings.Length > 0;
}
}
[JsonIgnore]
public bool SettingsSpecified { get { return Settings != null && Settings.Count > 0; } }
#endregion

View File

@@ -1,8 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -12,158 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("control"), XmlRoot("control")]
public class Control : DatItem
{
#region Fields
/// <summary>
/// General type of input
/// </summary>
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")]
[JsonConverter(typeof(StringEnumConverter))]
public ControlType ControlType
{
get => _internal.ReadString(Models.Metadata.Control.ControlTypeKey).AsEnumValue<ControlType>();
set => _internal[Models.Metadata.Control.ControlTypeKey] = value.AsStringValue<ControlType>();
}
[JsonIgnore]
public bool ControlTypeSpecified { get { return ControlType != ControlType.NULL; } }
/// <summary>
/// Player which the input belongs to
/// </summary>
[JsonProperty("player", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("player")]
public long? Player
{
get => _internal.ReadLong(Models.Metadata.Control.PlayerKey);
set => _internal[Models.Metadata.Control.PlayerKey] = value;
}
[JsonIgnore]
public bool PlayerSpecified { get { return Player != null; } }
/// <summary>
/// Total number of buttons
/// </summary>
[JsonProperty("buttons", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("buttons")]
public long? Buttons
{
get => _internal.ReadLong(Models.Metadata.Control.ButtonsKey);
set => _internal[Models.Metadata.Control.ButtonsKey] = value;
}
[JsonIgnore]
public bool ButtonsSpecified { get { return Buttons != null; } }
/// <summary>
/// Total number of non-optional buttons
/// </summary>
[JsonProperty("reqbuttons", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("reqbuttons")]
public long? RequiredButtons
{
get => _internal.ReadLong(Models.Metadata.Control.ReqButtonsKey);
set => _internal[Models.Metadata.Control.ReqButtonsKey] = value;
}
[JsonIgnore]
public bool RequiredButtonsSpecified { get { return RequiredButtons != null; } }
/// <summary>
/// Analog minimum value
/// </summary>
[JsonProperty("minimum", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("minimum")]
public long? Minimum
{
get => _internal.ReadLong(Models.Metadata.Control.MinimumKey);
set => _internal[Models.Metadata.Control.MinimumKey] = value;
}
[JsonIgnore]
public bool MinimumSpecified { get { return Minimum != null; } }
/// <summary>
/// Analog maximum value
/// </summary>
[JsonProperty("maximum", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("maximum")]
public long? Maximum
{
get => _internal.ReadLong(Models.Metadata.Control.MaximumKey);
set => _internal[Models.Metadata.Control.MaximumKey] = value;
}
[JsonIgnore]
public bool MaximumSpecified { get { return Maximum != null; } }
/// <summary>
/// Default analog sensitivity
/// </summary>
[JsonProperty("sensitivity", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sensitivity")]
public long? Sensitivity
{
get => _internal.ReadLong(Models.Metadata.Control.SensitivityKey);
set => _internal[Models.Metadata.Control.SensitivityKey] = value;
}
[JsonIgnore]
public bool SensitivitySpecified { get { return Sensitivity != null; } }
/// <summary>
/// Default analog keydelta
/// </summary>
[JsonProperty("keydelta", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("keydelta")]
public long? KeyDelta
{
get => _internal.ReadLong(Models.Metadata.Control.KeyDeltaKey);
set => _internal[Models.Metadata.Control.KeyDeltaKey] = value;
}
[JsonIgnore]
public bool KeyDeltaSpecified { get { return KeyDelta != null; } }
/// <summary>
/// Default analog reverse setting
/// </summary>
[JsonProperty("reverse", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("reverse")]
public bool? Reverse
{
get => _internal.ReadBool(Models.Metadata.Control.ReverseKey);
set => _internal[Models.Metadata.Control.ReverseKey] = value;
}
[JsonIgnore]
public bool ReverseSpecified { get { return Reverse != null; } }
/// <summary>
/// First set of ways
/// </summary>
[JsonProperty("ways", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("ways")]
public string? Ways
{
get => _internal.ReadString(Models.Metadata.Control.WaysKey);
set => _internal[Models.Metadata.Control.WaysKey] = value;
}
/// <summary>
/// Second set of ways
/// </summary>
[JsonProperty("ways2", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("ways2")]
public string? Ways2
{
get => _internal.ReadString(Models.Metadata.Control.Ways2Key);
set => _internal[Models.Metadata.Control.Ways2Key] = value;
}
/// <summary>
/// Third set of ways
/// </summary>
[JsonProperty("ways3", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("ways3")]
public string? Ways3
{
get => _internal.ReadString(Models.Metadata.Control.Ways3Key);
set => _internal[Models.Metadata.Control.Ways3Key] = value;
}
#endregion
#region Constructors
/// <summary>

View File

@@ -1,7 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -12,49 +11,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("dataarea"), XmlRoot("dataarea")]
public class DataArea : DatItem
{
#region Fields
/// <summary>
/// Total size of the area
/// </summary>
[JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("size")]
public long? Size
{
get => _internal.ReadLong(Models.Metadata.DataArea.SizeKey);
set => _internal[Models.Metadata.DataArea.SizeKey] = value;
}
[JsonIgnore]
public bool SizeSpecified { get { return Size != null; } }
/// <summary>
/// Word width for the area
/// </summary>
[JsonProperty("width", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("width")]
public long? Width
{
get => _internal.ReadLong(Models.Metadata.DataArea.WidthKey);
set => _internal[Models.Metadata.DataArea.WidthKey] = value;
}
[JsonIgnore]
public bool WidthSpecified { get { return Width != null; } }
/// <summary>
/// Byte endianness of the area
/// </summary>
[JsonProperty("endianness", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("endianness")]
public Endianness Endianness
{
get => _internal.ReadString(Models.Metadata.DataArea.WidthKey).AsEnumValue<Endianness>();
set => _internal[Models.Metadata.DataArea.WidthKey] = value.AsStringValue<Endianness>();
}
[JsonIgnore]
public bool EndiannessSpecified { get { return Endianness != Endianness.NULL; } }
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,10 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -16,90 +12,26 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
/// <summary>
/// Device type
/// </summary>
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")]
[JsonConverter(typeof(StringEnumConverter))]
public DeviceType DeviceType
[JsonIgnore]
public bool InstancesSpecified
{
get => _internal.ReadString(Models.Metadata.Device.DeviceTypeKey).AsEnumValue<DeviceType>();
set => _internal[Models.Metadata.Device.DeviceTypeKey] = value.AsStringValue<DeviceType>();
get
{
var instances = GetFieldValue<Instance[]?>(Models.Metadata.Device.InstanceKey);
return instances != null && instances.Length > 0;
}
}
[JsonIgnore]
public bool DeviceTypeSpecified { get { return DeviceType != DeviceType.NULL; } }
/// <summary>
/// Device tag
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
public bool ExtensionsSpecified
{
get => _internal.ReadString(Models.Metadata.Device.TagKey);
set => _internal[Models.Metadata.Device.TagKey] = value;
}
/// <summary>
/// Fixed image format
/// </summary>
[JsonProperty("fixed_image", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("fixed_image")]
public string? FixedImage
get
{
get => _internal.ReadString(Models.Metadata.Device.FixedImageKey);
set => _internal[Models.Metadata.Device.FixedImageKey] = value;
var extensions = GetFieldValue<Extension[]?>(Models.Metadata.Device.ExtensionKey);
return extensions != null && extensions.Length > 0;
}
/// <summary>
/// Determines if the devices is mandatory
/// </summary>
/// <remarks>Only value used seems to be 1. Used like bool, but actually int</remarks>
[JsonProperty("mandatory", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mandatory")]
public long? Mandatory
{
get => _internal.ReadLong(Models.Metadata.Device.MandatoryKey);
set => _internal[Models.Metadata.Device.MandatoryKey] = value;
}
[JsonIgnore]
public bool MandatorySpecified { get { return Mandatory != null; } }
/// <summary>
/// Device interface
/// </summary>
[JsonProperty("interface", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("interface")]
public string? Interface
{
get => _internal.ReadString(Models.Metadata.Device.InterfaceKey);
set => _internal[Models.Metadata.Device.InterfaceKey] = value;
}
/// <summary>
/// Device instances
/// </summary>
[JsonProperty("instances", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("instances")]
public List<Instance>? Instances
{
get => _internal.Read<Instance[]>(Models.Metadata.Device.InstanceKey)?.ToList();
set => _internal[Models.Metadata.Device.InstanceKey] = value?.ToArray();
}
[JsonIgnore]
public bool InstancesSpecified { get { return Instances != null && Instances.Count > 0; } }
/// <summary>
/// Device extensions
/// </summary>
[JsonProperty("extensions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("extensions")]
public List<Extension>? Extensions
{
get => _internal.Read<Extension[]>(Models.Metadata.Device.ExtensionKey)?.ToList();
set => _internal[Models.Metadata.Device.ExtensionKey] = value?.ToArray();
}
[JsonIgnore]
public bool ExtensionsSpecified { get { return Extensions != null && Extensions.Count > 0; } }
#endregion
#region Constructors

View File

@@ -10,36 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("diplocation"), XmlRoot("diplocation")]
public class DipLocation : DatItem
{
#region Fields
/// <summary>
/// Location ID
/// </summary>
[JsonProperty("number", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("number")]
public long? Number
{
get => _internal.ReadLong(Models.Metadata.DipLocation.NameKey);
set => _internal[Models.Metadata.DipLocation.NameKey] = value;
}
[JsonIgnore]
public bool NumberSpecified { get { return Number != null; } }
/// <summary>
/// Determines if location is inverted or not
/// </summary>
[JsonProperty("inverted", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("inverted")]
public bool? Inverted
{
get => _internal.ReadBool(Models.Metadata.DipLocation.InvertedKey);
set => _internal[Models.Metadata.DipLocation.InvertedKey] = value;
}
[JsonIgnore]
public bool InvertedSpecified { get { return Inverted != null; } }
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -14,93 +12,50 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
#region Common
/// <summary>
/// Tag associated with the dipswitch
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
[JsonIgnore]
public bool ConditionsSpecified
{
get => _internal.ReadString(Models.Metadata.DipSwitch.TagKey);
set => _internal[Models.Metadata.DipSwitch.TagKey] = value;
get
{
var conditions = GetFieldValue<Condition[]?>(Models.Metadata.DipSwitch.ConditionKey);
return conditions != null && conditions.Length > 0;
}
/// <summary>
/// Mask associated with the dipswitch
/// </summary>
[JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mask")]
public string? Mask
{
get => _internal.ReadString(Models.Metadata.DipSwitch.MaskKey);
set => _internal[Models.Metadata.DipSwitch.MaskKey] = value;
}
/// <summary>
/// Conditions associated with the dipswitch
/// </summary>
[JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")]
public List<Condition>? Conditions
{
get => _internal.Read<Condition[]>(Models.Metadata.DipSwitch.ConditionKey)?.ToList();
set => _internal[Models.Metadata.DipSwitch.ConditionKey] = value?.ToArray();
}
[JsonIgnore]
public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } }
/// <summary>
/// Locations associated with the dipswitch
/// </summary>
[JsonProperty("locations", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("locations")]
public List<DipLocation>? Locations
public bool LocationsSpecified
{
get => _internal.Read<DipLocation[]>(Models.Metadata.DipSwitch.DipLocationKey)?.ToList();
set => _internal[Models.Metadata.DipSwitch.DipLocationKey] = value?.ToArray();
get
{
var locations = GetFieldValue<DipLocation[]?>(Models.Metadata.DipSwitch.DipLocationKey);
return locations != null && locations.Length > 0;
}
}
[JsonIgnore]
public bool LocationsSpecified { get { return Locations != null && Locations.Count > 0; } }
/// <summary>
/// Settings associated with the dipswitch
/// </summary>
[JsonProperty("values", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("values")]
public List<DipValue>? Values
public bool ValuesSpecified
{
get => _internal.Read<DipValue[]>(Models.Metadata.DipSwitch.DipValueKey)?.ToList();
set => _internal[Models.Metadata.DipSwitch.DipValueKey] = value?.ToArray();
get
{
var values = GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey);
return values != null && values.Length > 0;
}
}
[JsonIgnore]
public bool ValuesSpecified { get { return Values != null && Values.Count > 0; } }
#endregion
#region SoftwareList
/// <summary>
/// Original hardware part associated with the item
/// </summary>
/// <remarks>This is inverted from the internal model</remarks>
[JsonProperty("part", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("part")]
public Part? Part { get; set; }
[JsonIgnore]
public bool PartSpecified
{
get
{
return Part != null
&& (!string.IsNullOrEmpty(Part.GetName())
|| !string.IsNullOrEmpty(Part.Interface));
var part = GetFieldValue<Part?>("PART");
return part != null
&& (!string.IsNullOrEmpty(part.GetName())
|| !string.IsNullOrEmpty(part.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey)));
}
}
#endregion
#endregion // Fields
#region Accessors
/// <inheritdoc/>
@@ -142,8 +97,6 @@ namespace SabreTools.DatItems.Formats
Remove = this.Remove,
_internal = this._internal?.Clone() as Models.Metadata.DipSwitch ?? [],
Part = this.Part,
};
}

View File

@@ -1,5 +1,3 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -14,41 +12,15 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
/// <summary>
/// Setting value
/// </summary>
[JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("value")]
public string? Value
{
get => _internal.ReadString(Models.Metadata.DipValue.ValueKey);
set => _internal[Models.Metadata.DipValue.ValueKey] = value;
}
/// <summary>
/// Determines if the setting is default or not
/// </summary>
[JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("default")]
public bool? Default
{
get => _internal.ReadBool(Models.Metadata.DipValue.DefaultKey);
set => _internal[Models.Metadata.DipValue.DefaultKey] = value;
}
[JsonIgnore]
public bool DefaultSpecified { get { return Default != null; } }
/// <summary>
/// List of conditions on the setting
/// </summary>
[JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")]
public List<Condition>? Conditions
public bool ConditionsSpecified
{
get => _internal.Read<Condition[]>(Models.Metadata.DipValue.ConditionKey)?.ToList();
set => _internal[Models.Metadata.DipValue.ConditionKey] = value?.ToArray();
get
{
var conditions = GetFieldValue<Condition[]?>(Models.Metadata.DipValue.ConditionKey);
return conditions != null && conditions.Length > 0;
}
}
[JsonIgnore]
public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } }
#endregion

View File

@@ -1,6 +1,5 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
using SabreTools.FileTypes;
@@ -15,149 +14,30 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
#region Common
/// <summary>
/// Data MD5 hash
/// </summary>
[JsonProperty("md5", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("md5")]
public string? MD5
{
get => _internal.ReadString(Models.Metadata.Disk.MD5Key);
set => _internal[Models.Metadata.Disk.MD5Key] = TextHelper.NormalizeMD5(value);
}
/// <summary>
/// Data SHA-1 hash
/// </summary>
[JsonProperty("sha1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha1")]
public string? SHA1
{
get => _internal.ReadString(Models.Metadata.Disk.SHA1Key);
set => _internal[Models.Metadata.Disk.SHA1Key] = TextHelper.NormalizeSHA1(value);
}
/// <summary>
/// Disk name to merge from parent
/// </summary>
[JsonProperty("merge", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("merge")]
public string? MergeTag
{
get => _internal.ReadString(Models.Metadata.Disk.MergeKey);
set => _internal[Models.Metadata.Disk.MergeKey] = value;
}
/// <summary>
/// Disk region
/// </summary>
[JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("region")]
public string? Region
{
get => _internal.ReadString(Models.Metadata.Disk.RegionKey);
set => _internal[Models.Metadata.Disk.RegionKey] = value;
}
/// <summary>
/// Disk index
/// </summary>
[JsonProperty("index", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("index")]
public string? Index
{
get => _internal.ReadString(Models.Metadata.Disk.IndexKey);
set => _internal[Models.Metadata.Disk.IndexKey] = value;
}
/// <summary>
/// Disk writable flag
/// </summary>
[JsonProperty("writable", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("writable")]
public bool? Writable
{
get => _internal.ReadBool(Models.Metadata.Disk.WritableKey);
set => _internal[Models.Metadata.Disk.WritableKey] = value;
}
[JsonIgnore]
public bool WritableSpecified { get { return Writable != null; } }
/// <summary>
/// Disk dump status
/// </summary>
[JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")]
[JsonConverter(typeof(StringEnumConverter))]
public ItemStatus ItemStatus
{
get => _internal.ReadString(Models.Metadata.Disk.StatusKey).AsEnumValue<ItemStatus>();
set => _internal[Models.Metadata.Disk.StatusKey] = value.AsStringValue<ItemStatus>(useSecond: false);
}
[JsonIgnore]
public bool ItemStatusSpecified { get { return ItemStatus != ItemStatus.NULL; } }
/// <summary>
/// Determine if the disk is optional in the set
/// </summary>
[JsonProperty("optional", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("optional")]
public bool? Optional
{
get => _internal.ReadBool(Models.Metadata.Disk.OptionalKey);
set => _internal[Models.Metadata.Disk.OptionalKey] = value;
}
[JsonIgnore]
public bool OptionalSpecified { get { return Optional != null; } }
#endregion
#region SoftwareList
/// <summary>
/// Disk area information
/// </summary>
/// <remarks>Hack on top of internal model</remarks>
[JsonProperty("diskarea", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("diskarea")]
public DiskArea? DiskArea
{
get => _internal.Read<DiskArea>("DISKAREA");
set => _internal["DISKAREA"] = value;
}
[JsonIgnore]
public bool DiskAreaSpecified
{
get
{
return DiskArea != null
&& !string.IsNullOrEmpty(DiskArea.GetName());
var diskArea = GetFieldValue<DiskArea?>("DISKAREA");
return diskArea != null && !string.IsNullOrEmpty(diskArea.GetName());
}
}
/// <summary>
/// Original hardware part associated with the item
/// </summary>
/// <remarks>Hack on top of internal model</remarks>
[JsonProperty("part", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("part")]
public Part? Part
{
get => _internal.Read<Part>("PART");
set => _internal["PART"] = value;
}
[JsonIgnore]
public bool PartSpecified
{
get
{
return Part != null
&& (!string.IsNullOrEmpty(Part.GetName())
|| !string.IsNullOrEmpty(Part.Interface));
var part = GetFieldValue<Part?>("PART");
return part != null
&& (!string.IsNullOrEmpty(part.GetName())
|| !string.IsNullOrEmpty(part.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey)));
}
}
#endregion
#endregion // Fields
#region Accessors
/// <inheritdoc/>
@@ -181,7 +61,7 @@ namespace SabreTools.DatItems.Formats
SetName(string.Empty);
ItemType = ItemType.Disk;
DupeType = 0x00;
ItemStatus = ItemStatus.None;
SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, ItemStatus.None);
}
/// <summary>
@@ -193,12 +73,12 @@ namespace SabreTools.DatItems.Formats
Machine = new Machine();
SetName(baseFile.Filename);
MD5 = TextHelper.ByteArrayToString(baseFile.MD5);
SHA1 = TextHelper.ByteArrayToString(baseFile.SHA1);
SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5));
SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1));
ItemType = ItemType.Disk;
DupeType = 0x00;
ItemStatus = ItemStatus.None;
SetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey, ItemStatus.None);
}
#endregion
@@ -230,8 +110,8 @@ namespace SabreTools.DatItems.Formats
{
Filename = this.GetName(),
Parent = this.Machine.Name,
MD5 = TextHelper.StringToByteArray(this.MD5),
SHA1 = TextHelper.StringToByteArray(this.SHA1),
MD5 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)),
SHA1 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)),
};
}
@@ -249,12 +129,9 @@ namespace SabreTools.DatItems.Formats
Machine = this.Machine.Clone() as Machine ?? new Machine(),
Source = this.Source?.Clone() as Source,
Remove = this.Remove,
DataArea = new DataArea(),
Part = this.Part,
};
rom.DataArea.SetName(this.DiskArea?.GetName());
rom.GetFieldValue<DataArea?>("DATAAREA")?.SetName(this.GetFieldValue<DiskArea?>("DISKAREA")?.GetName());
return rom;
}
@@ -289,11 +166,11 @@ namespace SabreTools.DatItems.Formats
switch (bucketedBy)
{
case ItemKey.MD5:
key = MD5;
key = GetFieldValue<string?>(Models.Metadata.Disk.MD5Key);
break;
case ItemKey.SHA1:
key = SHA1;
key = GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key);
break;
// Let the base handle generic stuff

View File

@@ -1,8 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -12,190 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("display"), XmlRoot("display")]
public class Display : DatItem
{
#region Fields
/// <summary>
/// Display tag
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
{
get => _internal.ReadString(Models.Metadata.Display.TagKey);
set => _internal[Models.Metadata.Display.TagKey] = value;
}
/// <summary>
/// Display type
/// </summary>
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")]
[JsonConverter(typeof(StringEnumConverter))]
public DisplayType DisplayType
{
get => _internal.ReadString(Models.Metadata.Display.DisplayTypeKey).AsEnumValue<DisplayType>();
set => _internal[Models.Metadata.Display.DisplayTypeKey] = value.AsStringValue<DisplayType>();
}
[JsonIgnore]
public bool DisplayTypeSpecified { get { return DisplayType != DisplayType.NULL; } }
/// <summary>
/// Display rotation
/// </summary>
[JsonProperty("rotate", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("rotate")]
public long? Rotate
{
get => _internal.ReadLong(Models.Metadata.Display.RotateKey);
set => _internal[Models.Metadata.Display.RotateKey] = value;
}
[JsonIgnore]
public bool RotateSpecified { get { return Rotate != null; } }
/// <summary>
/// Determines if display is flipped in the X-coordinates
/// </summary>
[JsonProperty("flipx", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("flipx")]
public bool? FlipX
{
get => _internal.ReadBool(Models.Metadata.Display.FlipXKey);
set => _internal[Models.Metadata.Display.FlipXKey] = value;
}
[JsonIgnore]
public bool FlipXSpecified { get { return FlipX != null; } }
/// <summary>
/// Display width
/// </summary>
[JsonProperty("width", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("width")]
public long? Width
{
get => _internal.ReadLong(Models.Metadata.Display.WidthKey);
set => _internal[Models.Metadata.Display.WidthKey] = value;
}
[JsonIgnore]
public bool WidthSpecified { get { return Width != null; } }
/// <summary>
/// Display height
/// </summary>
[JsonProperty("height", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("height")]
public long? Height
{
get => _internal.ReadLong(Models.Metadata.Display.HeightKey);
set => _internal[Models.Metadata.Display.HeightKey] = value;
}
[JsonIgnore]
public bool HeightSpecified { get { return Height != null; } }
/// <summary>
/// Refresh rate
/// </summary>
[JsonProperty("refresh", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("refresh")]
public double? Refresh
{
get => _internal.ReadDouble(Models.Metadata.Display.RefreshKey);
set => _internal[Models.Metadata.Display.RefreshKey] = value;
}
[JsonIgnore]
public bool RefreshSpecified { get { return Refresh != null; } }
/// <summary>
/// Pixel clock timer
/// </summary>
[JsonProperty("pixclock", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("pixclock")]
public long? PixClock
{
get => _internal.ReadLong(Models.Metadata.Display.PixClockKey);
set => _internal[Models.Metadata.Display.PixClockKey] = value;
}
[JsonIgnore]
public bool PixClockSpecified { get { return PixClock != null; } }
/// <summary>
/// Total horizontal lines
/// </summary>
[JsonProperty("htotal", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("htotal")]
public long? HTotal
{
get => _internal.ReadLong(Models.Metadata.Display.HTotalKey);
set => _internal[Models.Metadata.Display.HTotalKey] = value;
}
[JsonIgnore]
public bool HTotalSpecified { get { return HTotal != null; } }
/// <summary>
/// Horizontal blank end
/// </summary>
[JsonProperty("hbend", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("hbend")]
public long? HBEnd
{
get => _internal.ReadLong(Models.Metadata.Display.HBEndKey);
set => _internal[Models.Metadata.Display.HBEndKey] = value;
}
[JsonIgnore]
public bool HBEndSpecified { get { return HBEnd != null; } }
/// <summary>
/// Horizontal blank start
/// </summary>
[JsonProperty("hbstart", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("hbstart")]
public long? HBStart
{
get => _internal.ReadLong(Models.Metadata.Display.HBStartKey);
set => _internal[Models.Metadata.Display.HBStartKey] = value;
}
[JsonIgnore]
public bool HBStartSpecified { get { return HBStart != null; } }
/// <summary>
/// Total vertical lines
/// </summary>
[JsonProperty("vtotal", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("vtotal")]
public long? VTotal
{
get => _internal.ReadLong(Models.Metadata.Display.VTotalKey);
set => _internal[Models.Metadata.Display.VTotalKey] = value;
}
[JsonIgnore]
public bool VTotalSpecified { get { return VTotal != null; } }
/// <summary>
/// Vertical blank end
/// </summary>
[JsonProperty("vbend", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("vbend")]
public long? VBEnd
{
get => _internal.ReadLong(Models.Metadata.Display.VBEndKey);
set => _internal[Models.Metadata.Display.VBEndKey] = value;
}
[JsonIgnore]
public bool VBEndSpecified { get { return VBEnd != null; } }
/// <summary>
/// Vertical blank start
/// </summary>
[JsonProperty("vbstart", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("vbstart")]
public long? VBStart
{
get => _internal.ReadLong(Models.Metadata.Display.VBStartKey);
set => _internal[Models.Metadata.Display.VBStartKey] = value;
}
[JsonIgnore]
public bool VBStartSpecified { get { return VBStart != null; } }
#endregion
#region Constructors
/// <summary>

View File

@@ -1,8 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -15,118 +13,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("driver"), XmlRoot("driver")]
public class Driver : DatItem
{
#region Fields
/// <summary>
/// Overall driver status
/// </summary>
[JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")]
[JsonConverter(typeof(StringEnumConverter))]
public SupportStatus Status
{
get => _internal.ReadString(Models.Metadata.Driver.StatusKey).AsEnumValue<SupportStatus>();
set => _internal[Models.Metadata.Driver.StatusKey] = value.AsStringValue<SupportStatus>();
}
[JsonIgnore]
public bool StatusSpecified { get { return Status != SupportStatus.NULL; } }
/// <summary>
/// Driver emulation status
/// </summary>
[JsonProperty("emulation", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("emulation")]
[JsonConverter(typeof(StringEnumConverter))]
public SupportStatus Emulation
{
get => _internal.ReadString(Models.Metadata.Driver.EmulationKey).AsEnumValue<SupportStatus>();
set => _internal[Models.Metadata.Driver.EmulationKey] = value.AsStringValue<SupportStatus>();
}
[JsonIgnore]
public bool EmulationSpecified { get { return Emulation != SupportStatus.NULL; } }
/// <summary>
/// Cocktail orientation status
/// </summary>
[JsonProperty("cocktail", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("cocktail")]
[JsonConverter(typeof(StringEnumConverter))]
public SupportStatus Cocktail
{
get => _internal.ReadString(Models.Metadata.Driver.CocktailKey).AsEnumValue<SupportStatus>();
set => _internal[Models.Metadata.Driver.CocktailKey] = value.AsStringValue<SupportStatus>();
}
[JsonIgnore]
public bool CocktailSpecified { get { return Cocktail != SupportStatus.NULL; } }
/// <summary>
/// Save state support status
/// </summary>
[JsonProperty("savestate", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("savestate")]
[JsonConverter(typeof(StringEnumConverter))]
public Supported SaveState
{
get => _internal.ReadString(Models.Metadata.Driver.SaveStateKey).AsEnumValue<Supported>();
set => _internal[Models.Metadata.Driver.SaveStateKey] = value.AsStringValue<Supported>(useSecond: true);
}
[JsonIgnore]
public bool SaveStateSpecified { get { return SaveState != Supported.NULL; } }
/// <summary>
/// Requires artwork
/// </summary>
[JsonProperty("requiresartwork", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("requiresartwork")]
public bool? RequiresArtwork
{
get => _internal.ReadBool(Models.Metadata.Driver.RequiresArtworkKey);
set => _internal[Models.Metadata.Driver.RequiresArtworkKey] = value;
}
[JsonIgnore]
public bool RequiresArtworkSpecified { get { return RequiresArtwork != null; } }
/// <summary>
/// Unofficial
/// </summary>
[JsonProperty("unofficial", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("unofficial")]
public bool? Unofficial
{
get => _internal.ReadBool(Models.Metadata.Driver.UnofficialKey);
set => _internal[Models.Metadata.Driver.UnofficialKey] = value;
}
[JsonIgnore]
public bool UnofficialSpecified { get { return Unofficial != null; } }
/// <summary>
/// No sound hardware
/// </summary>
[JsonProperty("nosoundhardware", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("nosoundhardware")]
public bool? NoSoundHardware
{
get => _internal.ReadBool(Models.Metadata.Driver.NoSoundHardwareKey);
set => _internal[Models.Metadata.Driver.NoSoundHardwareKey] = value;
}
[JsonIgnore]
public bool NoSoundHardwareSpecified { get { return NoSoundHardware != null; } }
/// <summary>
/// Incomplete
/// </summary>
[JsonProperty("incomplete", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("incomplete")]
public bool? Incomplete
{
get => _internal.ReadBool(Models.Metadata.Driver.IncompleteKey);
set => _internal[Models.Metadata.Driver.IncompleteKey] = value;
}
[JsonIgnore]
public bool IncompleteSpecified { get { return Incomplete != null; } }
#endregion
#region Constructors
/// <summary>

View File

@@ -1,8 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -12,52 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("feature"), XmlRoot("feature")]
public class Feature : DatItem
{
#region Fields
/// <summary>
/// Type of feature
/// </summary>
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")]
[JsonConverter(typeof(StringEnumConverter))]
public FeatureType Type
{
get => _internal.ReadString(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue<FeatureType>();
set => _internal[Models.Metadata.Feature.FeatureTypeKey] = value.AsStringValue<FeatureType>();
}
[JsonIgnore]
public bool TypeSpecified { get { return Type != FeatureType.NULL; } }
/// <summary>
/// Emulation status
/// </summary>
[JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")]
[JsonConverter(typeof(StringEnumConverter))]
public FeatureStatus Status
{
get => _internal.ReadString(Models.Metadata.Feature.StatusKey).AsEnumValue<FeatureStatus>();
set => _internal[Models.Metadata.Feature.StatusKey] = value.AsStringValue<FeatureStatus>();
}
[JsonIgnore]
public bool StatusSpecified { get { return Status != FeatureStatus.NULL; } }
/// <summary>
/// Overall status
/// </summary>
[JsonProperty("overall", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("overall")]
[JsonConverter(typeof(StringEnumConverter))]
public FeatureStatus Overall
{
get => _internal.ReadString(Models.Metadata.Feature.OverallKey).AsEnumValue<FeatureStatus>();
set => _internal[Models.Metadata.Feature.OverallKey] = value.AsStringValue<FeatureStatus>();
}
[JsonIgnore]
public bool OverallSpecified { get { return Overall != FeatureStatus.NULL; } }
#endregion
#region Constructors
/// <summary>

View File

@@ -45,9 +45,6 @@ namespace SabreTools.DatItems.Formats
[JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("size")]
public long? Size { get; set; } = null;
[JsonIgnore]
public bool SizeSpecified { get { return Size != null; } }
/// <summary>
/// File CRC32 hash
/// </summary>
@@ -177,13 +174,12 @@ namespace SabreTools.DatItems.Formats
Machine = this.Machine.Clone() as Machine ?? new Machine(),
Source = this.Source?.Clone() as Source,
Remove = this.Remove,
CRC = this.CRC,
MD5 = this.MD5,
SHA1 = this.SHA1,
SHA256 = this.SHA256,
};
rom.SetName($"{this.Id}.{this.Extension}");
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, CRC);
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, MD5);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, SHA1);
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, SHA256);
return rom;
}

View File

@@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("info"), XmlRoot("info")]
public class Info : DatItem
{
#region Fields
/// <summary>
/// Information value
/// </summary>
[JsonProperty("value"), XmlElement("value")]
public string? Value
{
get => _internal.ReadString(Models.Metadata.Info.ValueKey);
set => _internal[Models.Metadata.Info.ValueKey] = value;
}
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -14,71 +12,16 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
/// <summary>
/// Input service ID
/// </summary>
[JsonProperty("service", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("service")]
public bool? Service
{
get => _internal.ReadBool(Models.Metadata.Input.ServiceKey);
set => _internal[Models.Metadata.Input.ServiceKey] = value;
}
[JsonIgnore]
public bool ServiceSpecified { get { return Service != null; } }
/// <summary>
/// Determins if this has a tilt sensor
/// </summary>
[JsonProperty("tilt", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tilt")]
public bool? Tilt
public bool ControlsSpecified
{
get => _internal.ReadBool(Models.Metadata.Input.TiltKey);
set => _internal[Models.Metadata.Input.TiltKey] = value;
}
[JsonIgnore]
public bool TiltSpecified { get { return Tilt != null; } }
/// <summary>
/// Number of players on the input
/// </summary>
[JsonProperty("players", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("players")]
public long? Players
get
{
get => _internal.ReadLong(Models.Metadata.Input.PlayersKey);
set => _internal[Models.Metadata.Input.PlayersKey] = value;
var controls = GetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey);
return controls != null && controls.Length > 0;
}
[JsonIgnore]
public bool PlayersSpecified { get { return Players != null; } }
/// <summary>
/// Number of coins required
/// </summary>
[JsonProperty("coins", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("coins")]
public long? Coins
{
get => _internal.ReadLong(Models.Metadata.Input.CoinsKey);
set => _internal[Models.Metadata.Input.CoinsKey] = value;
}
[JsonIgnore]
public bool CoinsSpecified { get { return Coins != null; } }
/// <summary>
/// Set of controls for the input
/// </summary>
[JsonProperty("controls", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("controls")]
public List<Control>? Controls
{
get => _internal.Read<Control[]>(Models.Metadata.Input.ControlKey)?.ToList();
set => _internal[Models.Metadata.Input.ControlKey] = value?.ToArray();
}
[JsonIgnore]
public bool ControlsSpecified { get { return Controls != null && Controls.Count > 0; } }
#endregion
#region Constructors

View File

@@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("instance"), XmlRoot("instance")]
public class Instance : DatItem
{
#region Fields
/// <summary>
/// Short name for the instance
/// </summary>
[JsonProperty("briefname", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("briefname")]
public string? BriefName
{
get => _internal.ReadString(Models.Metadata.Instance.BriefNameKey);
set => _internal[Models.Metadata.Instance.BriefNameKey] = value;
}
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -12,50 +12,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("media"), XmlRoot("media")]
public class Media : DatItem
{
#region Fields
/// <summary>
/// Data MD5 hash
/// </summary>
[JsonProperty("md5", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("md5")]
public string? MD5
{
get => _internal.ReadString(Models.Metadata.Media.MD5Key);
set => _internal[Models.Metadata.Media.MD5Key] = TextHelper.NormalizeMD5(value);
}
/// <summary>
/// Data SHA-1 hash
/// </summary>
[JsonProperty("sha1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha1")]
public string? SHA1
{
get => _internal.ReadString(Models.Metadata.Media.SHA1Key);
set => _internal[Models.Metadata.Media.SHA1Key] = TextHelper.NormalizeSHA1(value);
}
/// <summary>
/// Data SHA-256 hash
/// </summary>
[JsonProperty("sha256", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha256")]
public string? SHA256
{
get => _internal.ReadString(Models.Metadata.Media.SHA256Key);
set => _internal[Models.Metadata.Media.SHA256Key] = TextHelper.NormalizeSHA256(value);
}
/// <summary>
/// File SpamSum fuzzy hash
/// </summary>
[JsonProperty("spamsum", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("spamsum")]
public string? SpamSum
{
get => _internal.ReadString(Models.Metadata.Media.SpamSumKey);
set => _internal[Models.Metadata.Media.SpamSumKey] = value;
}
#endregion
#region Accessors
/// <inheritdoc/>
@@ -91,10 +47,10 @@ namespace SabreTools.DatItems.Formats
Machine = new Machine();
SetName(baseFile.Filename);
MD5 = TextHelper.ByteArrayToString(baseFile.MD5);
SHA1 = TextHelper.ByteArrayToString(baseFile.SHA1);
SHA256 = TextHelper.ByteArrayToString(baseFile.SHA256);
SpamSum = System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []);
SetFieldValue<string?>(Models.Metadata.Media.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5));
SetFieldValue<string?>(Models.Metadata.Media.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1));
SetFieldValue<string?>(Models.Metadata.Media.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256));
SetFieldValue<string?>(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []));
ItemType = ItemType.Media;
DupeType = 0x00;
@@ -129,10 +85,10 @@ namespace SabreTools.DatItems.Formats
{
Filename = this.GetName(),
Parent = this.Machine.Name,
MD5 = TextHelper.StringToByteArray(this.MD5),
SHA1 = TextHelper.StringToByteArray(this.SHA1),
SHA256 = TextHelper.StringToByteArray(this.SHA256),
SpamSum = System.Text.Encoding.UTF8.GetBytes(this.SpamSum ?? string.Empty),
MD5 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Media.MD5Key)),
SHA1 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)),
SHA256 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)),
SpamSum = System.Text.Encoding.UTF8.GetBytes(GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey) ?? string.Empty),
};
}
@@ -185,19 +141,19 @@ namespace SabreTools.DatItems.Formats
switch (bucketedBy)
{
case ItemKey.MD5:
key = MD5;
key = GetFieldValue<string?>(Models.Metadata.Media.MD5Key);
break;
case ItemKey.SHA1:
key = SHA1;
key = GetFieldValue<string?>(Models.Metadata.Media.SHA1Key);
break;
case ItemKey.SHA256:
key = SHA256;
key = GetFieldValue<string?>(Models.Metadata.Media.SHA256Key);
break;
case ItemKey.SpamSum:
key = SpamSum;
key = GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey);
break;
// Let the base handle generic stuff

View File

@@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -15,22 +13,15 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
[JsonProperty("interface"), XmlElement("interface")]
public string? Interface
{
get => _internal.ReadString(Models.Metadata.Part.InterfaceKey);
set => _internal[Models.Metadata.Part.InterfaceKey] = value;
}
[JsonProperty("features", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("features")]
public List<PartFeature>? Features
{
get => _internal.Read<PartFeature[]>(Models.Metadata.Part.FeatureKey)?.ToList();
set => _internal[Models.Metadata.Part.FeatureKey] = value?.ToArray();
}
[JsonIgnore]
public bool FeaturesSpecified { get { return Features != null && Features.Count > 0; } }
public bool FeaturesSpecified
{
get
{
var features = GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey);
return features != null && features.Length > 0;
}
}
#endregion

View File

@@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("part_feature"), XmlRoot("part_feature")]
public class PartFeature : DatItem
{
#region Fields
/// <summary>
/// PartFeature value
/// </summary>
[JsonProperty("value"), XmlElement("value")]
public string? Value
{
get => _internal.ReadString(Models.Metadata.Feature.ValueKey);
set => _internal[Models.Metadata.Feature.ValueKey] = value;
}
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -14,28 +12,15 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
/// <summary>
/// Tag for the port
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")]
public string? Tag
{
get => _internal.ReadString(Models.Metadata.Port.TagKey);
set => _internal[Models.Metadata.Port.TagKey] = value;
}
/// <summary>
/// List of analogs on the port
/// </summary>
[JsonProperty("analogs", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("analogs")]
public List<Analog>? Analogs
{
get => _internal.Read<Analog[]>(Models.Metadata.Port.AnalogKey)?.ToList();
set => _internal[Models.Metadata.Port.AnalogKey] = value?.ToArray();
}
[JsonIgnore]
public bool AnalogsSpecified { get { return Analogs != null && Analogs.Count > 0; } }
public bool AnalogsSpecified
{
get
{
var analogs = GetFieldValue<Analog[]?>(Models.Metadata.Port.AnalogKey);
return analogs != null && analogs.Length > 0;
}
}
#endregion

View File

@@ -10,33 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("ramoption"), XmlRoot("ramoption")]
public class RamOption : DatItem
{
#region Fields
/// <summary>
/// Determine whether the RamOption is default
/// </summary>
[JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("default")]
public bool? Default
{
get => _internal.ReadBool(Models.Metadata.RamOption.DefaultKey);
set => _internal[Models.Metadata.RamOption.DefaultKey] = value;
}
[JsonIgnore]
public bool DefaultSpecified { get { return Default != null; } }
/// <summary>
/// Determines the content of the RamOption
/// </summary>
[JsonProperty("content", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("content")]
public string? Content
{
get => _internal.ReadString(Models.Metadata.RamOption.ContentKey);
set => _internal[Models.Metadata.RamOption.ContentKey] = value;
}
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -10,53 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("release"), XmlRoot("release")]
public class Release : DatItem
{
#region Fields
/// <summary>
/// Release region(s)
/// </summary>
[JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("region")]
public string? Region
{
get => _internal.ReadString(Models.Metadata.Release.RegionKey);
set => _internal[Models.Metadata.Release.RegionKey] = value;
}
/// <summary>
/// Release language(s)
/// </summary>
[JsonProperty("language", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("language")]
public string? Language
{
get => _internal.ReadString(Models.Metadata.Release.LanguageKey);
set => _internal[Models.Metadata.Release.LanguageKey] = value;
}
/// <summary>
/// Date of release
/// </summary>
[JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("date")]
public string? Date
{
get => _internal.ReadString(Models.Metadata.Release.DateKey);
set => _internal[Models.Metadata.Release.DateKey] = value;
}
/// <summary>
/// Default release, if applicable
/// </summary>
[JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("default")]
public bool? Default
{
get => _internal.ReadBool(Models.Metadata.Release.DefaultKey);
set => _internal[Models.Metadata.Release.DefaultKey] = value;
}
[JsonIgnore]
public bool DefaultSpecified { get { return Default != null; } }
#endregion
#region Accessors
/// <inheritdoc/>
@@ -79,10 +32,6 @@ namespace SabreTools.DatItems.Formats
SetName(string.Empty);
ItemType = ItemType.Release;
Region = string.Empty;
Language = string.Empty;
Date = string.Empty;
Default = null;
}
#endregion

View File

@@ -50,9 +50,6 @@ namespace SabreTools.DatItems.Formats
[JsonProperty("nfosize", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("nfosize")]
public long? NfoSize { get; set; }
[JsonIgnore]
public bool NfoSizeSpecified { get { return NfoSize != null; } }
/// <summary>
/// NFO CRC value
/// </summary>

View File

@@ -1,6 +1,5 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
using SabreTools.FileTypes;
@@ -15,356 +14,24 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
#region Common
/// <summary>
/// What BIOS is required for this rom
/// </summary>
[JsonProperty("bios", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("bios")]
public string? Bios
[JsonIgnore]
public bool ItemStatusSpecified
{
get => _internal.ReadString(Models.Metadata.Rom.BiosKey);
set => _internal[Models.Metadata.Rom.BiosKey] = value;
get
{
var status = GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey);
return status != ItemStatus.NULL && status != ItemStatus.None;
}
/// <summary>
/// Byte size of the rom
/// </summary>
[JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("size")]
public long? Size
{
get => _internal.ReadLong(Models.Metadata.Rom.SizeKey);
set => _internal[Models.Metadata.Rom.SizeKey] = value;
}
[JsonIgnore]
public bool SizeSpecified { get { return Size != null; } }
/// <summary>
/// File CRC32 hash
/// </summary>
[JsonProperty("crc", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("crc")]
public string? CRC
public bool OriginalSpecified
{
get => _internal.ReadString(Models.Metadata.Rom.CRCKey);
set => _internal[Models.Metadata.Rom.CRCKey] = TextHelper.NormalizeCRC32(value);
get
{
var original = GetFieldValue<Original?>("ORIGINAL");
return original != null && original != default;
}
/// <summary>
/// File MD5 hash
/// </summary>
[JsonProperty("md5", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("md5")]
public string? MD5
{
get => _internal.ReadString(Models.Metadata.Rom.MD5Key);
set => _internal[Models.Metadata.Rom.MD5Key] = TextHelper.NormalizeMD5(value);
}
/// <summary>
/// File SHA-1 hash
/// </summary>
[JsonProperty("sha1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha1")]
public string? SHA1
{
get => _internal.ReadString(Models.Metadata.Rom.SHA1Key);
set => _internal[Models.Metadata.Rom.SHA1Key] = TextHelper.NormalizeSHA1(value);
}
/// <summary>
/// File SHA-256 hash
/// </summary>
[JsonProperty("sha256", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha256")]
public string? SHA256
{
get => _internal.ReadString(Models.Metadata.Rom.SHA256Key);
set => _internal[Models.Metadata.Rom.SHA256Key] = TextHelper.NormalizeSHA256(value);
}
/// <summary>
/// File SHA-384 hash
/// </summary>
[JsonProperty("sha384", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha384")]
public string? SHA384
{
get => _internal.ReadString(Models.Metadata.Rom.SHA384Key);
set => _internal[Models.Metadata.Rom.SHA384Key] = TextHelper.NormalizeSHA384(value);
}
/// <summary>
/// File SHA-512 hash
/// </summary>
[JsonProperty("sha512", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha512")]
public string? SHA512
{
get => _internal.ReadString(Models.Metadata.Rom.SHA512Key);
set => _internal[Models.Metadata.Rom.SHA512Key] = TextHelper.NormalizeSHA512(value);
}
/// <summary>
/// File SpamSum fuzzy hash
/// </summary>
[JsonProperty("spamsum", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("spamsum")]
public string? SpamSum
{
get => _internal.ReadString(Models.Metadata.Rom.SpamSumKey);
set => _internal[Models.Metadata.Rom.SpamSumKey] = value;
}
/// <summary>
/// Rom name to merge from parent
/// </summary>
[JsonProperty("merge", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("merge")]
public string? MergeTag
{
get => _internal.ReadString(Models.Metadata.Rom.MergeKey);
set => _internal[Models.Metadata.Rom.MergeKey] = value;
}
/// <summary>
/// Rom region
/// </summary>
[JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("biregionos")]
public string? Region
{
get => _internal.ReadString(Models.Metadata.Rom.RegionKey);
set => _internal[Models.Metadata.Rom.RegionKey] = value;
}
/// <summary>
/// Data offset within rom
/// </summary>
[JsonProperty("offset", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("offset")]
public string? Offset
{
get => _internal.ReadString(Models.Metadata.Rom.OffsetKey);
set => _internal[Models.Metadata.Rom.OffsetKey] = value;
}
/// <summary>
/// File created date
/// </summary>
[JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("date")]
public string? Date
{
get => _internal.ReadString(Models.Metadata.Rom.DateKey);
set => _internal[Models.Metadata.Rom.DateKey] = value;
}
/// <summary>
/// Rom dump status
/// </summary>
[JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")]
[JsonConverter(typeof(StringEnumConverter))]
public ItemStatus ItemStatus
{
get => _internal.ReadString(Models.Metadata.Rom.StatusKey).AsEnumValue<ItemStatus>();
set => _internal[Models.Metadata.Rom.StatusKey] = value.AsStringValue<ItemStatus>(useSecond: false);
}
[JsonIgnore]
public bool ItemStatusSpecified { get { return ItemStatus != ItemStatus.NULL && ItemStatus != ItemStatus.None; } }
/// <summary>
/// Determine if the rom is optional in the set
/// </summary>
[JsonProperty("optional", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("optional")]
public bool? Optional
{
get => _internal.ReadBool(Models.Metadata.Rom.OptionalKey);
set => _internal[Models.Metadata.Rom.OptionalKey] = value;
}
[JsonIgnore]
public bool OptionalSpecified { get { return Optional != null; } }
/// <summary>
/// Determine if the CRC32 hash is inverted
/// </summary>
[JsonProperty("inverted", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("inverted")]
public bool? Inverted
{
get => _internal.ReadBool(Models.Metadata.Rom.InvertedKey);
set => _internal[Models.Metadata.Rom.InvertedKey] = value;
}
[JsonIgnore]
public bool InvertedSpecified { get { return Inverted != null; } }
#endregion
#region Archive.org
/// <summary>
/// Source of file
/// </summary>
[JsonProperty("ado_source", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("ado_source")]
public string? ArchiveDotOrgSource
{
get => _internal.ReadString(Models.Metadata.Rom.SourceKey);
set => _internal[Models.Metadata.Rom.SourceKey] = value;
}
/// <summary>
/// Archive.org recognized file format
/// </summary>
[JsonProperty("ado_format", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("ado_format")]
public string? ArchiveDotOrgFormat
{
get => _internal.ReadString(Models.Metadata.Rom.FormatKey);
set => _internal[Models.Metadata.Rom.FormatKey] = value;
}
/// <summary>
/// Original filename
/// </summary>
[JsonProperty("original_filename", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("original_filename")]
public string? OriginalFilename
{
get => _internal.ReadString(Models.Metadata.Rom.OriginalKey);
set => _internal[Models.Metadata.Rom.OriginalKey] = value;
}
/// <summary>
/// Image rotation
/// </summary>
/// <remarks>
/// TODO: This might be Int32?
/// </remarks>
[JsonProperty("rotation", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("rotation")]
public string? Rotation
{
get => _internal.ReadString(Models.Metadata.Rom.RotationKey);
set => _internal[Models.Metadata.Rom.RotationKey] = value;
}
/// <summary>
/// Summation value?
/// </summary>
[JsonProperty("summation", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("summation")]
public string? Summation
{
get => _internal.ReadString(Models.Metadata.Rom.SummationKey);
set => _internal[Models.Metadata.Rom.SummationKey] = value;
}
#endregion
#region AttractMode
/// <summary>
/// Alternate name for the item
/// </summary>
[JsonProperty("alt_internalname", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("alt_internalname")]
public string? AltName
{
get => _internal.ReadString(Models.Metadata.Rom.AltRomnameKey);
set => _internal[Models.Metadata.Rom.AltRomnameKey] = value;
}
/// <summary>
/// Alternate title for the item
/// </summary>
[JsonProperty("alt_title", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("alt_title")]
public string? AltTitle
{
get => _internal.ReadString(Models.Metadata.Rom.AltTitleKey);
set => _internal[Models.Metadata.Rom.AltTitleKey] = value;
}
#endregion
#region Logiqx
/// <summary>
/// Alternate title for the item
/// </summary>
[JsonProperty("mia", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mia")]
public bool? MIA
{
get => _internal.ReadBool(Models.Metadata.Rom.MIAKey);
set => _internal[Models.Metadata.Rom.MIAKey] = value;
}
[JsonIgnore]
public bool MIASpecified { get { return MIA != null; } }
#endregion
#region OpenMSX
/// <summary>
/// OpenMSX sub item type
/// </summary>
/// <remarks>Hack on top of internal model</remarks>
[JsonProperty("original", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("original")]
public Original? Original
{
get => _internal.Read<Original>("ORIGINAL");
set => _internal["ORIGINAL"] = value;
}
[JsonIgnore]
public bool OriginalSpecified { get { return Original != null && Original != default; } }
/// <summary>
/// OpenMSX sub item type
/// </summary>
[JsonProperty("openmsx_subtype", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("openmsx_subtype")]
[JsonConverter(typeof(StringEnumConverter))]
public OpenMSXSubType OpenMSXSubType
{
get => _internal.ReadString(Models.Metadata.Rom.OpenMSXMediaType).AsEnumValue<OpenMSXSubType>();
set => _internal[Models.Metadata.Rom.OpenMSXMediaType] = value.AsStringValue<OpenMSXSubType>();
}
[JsonIgnore]
public bool OpenMSXSubTypeSpecified { get { return OpenMSXSubType != OpenMSXSubType.NULL; } }
/// <summary>
/// OpenMSX sub item type
/// </summary>
/// <remarks>Not related to the subtype above</remarks>
[JsonProperty("openmsx_type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("openmsx_type")]
public string? OpenMSXType
{
get => _internal.ReadString(Models.Metadata.Rom.OpenMSXType);
set => _internal[Models.Metadata.Rom.OpenMSXType] = value;
}
/// <summary>
/// Item remark (like a comment)
/// </summary>
[JsonProperty("remark", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("remark")]
public string? Remark
{
get => _internal.ReadString(Models.Metadata.Rom.RemarkKey);
set => _internal[Models.Metadata.Rom.RemarkKey] = value;
}
/// <summary>
/// Boot state
/// </summary>
/// TODO: Investigate where this value came from?
[JsonProperty("boot", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("boot")]
public string? Boot
{
get => _internal.ReadString("BOOT");
set => _internal["BOOT"] = value;
}
#endregion
#region SoftwareList
/// <summary>
/// Data area information
/// </summary>
/// <remarks>Hack on top of internal model</remarks>
[JsonProperty("dataarea", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("dataarea")]
public DataArea? DataArea
{
get => _internal.Read<DataArea>("DATAAREA");
set => _internal["DATAAREA"] = value;
}
[JsonIgnore]
@@ -372,62 +39,27 @@ namespace SabreTools.DatItems.Formats
{
get
{
return DataArea != null
&& (!string.IsNullOrEmpty(DataArea.GetName())
|| DataArea.SizeSpecified
|| DataArea.WidthSpecified
|| DataArea.EndiannessSpecified);
var dataArea = GetFieldValue<DataArea?>("DATAAREA");
return dataArea != null
&& (!string.IsNullOrEmpty(dataArea.GetName())
|| dataArea.GetFieldValue<long?>(Models.Metadata.DataArea.SizeKey) != null
|| dataArea.GetFieldValue<long?>(Models.Metadata.DataArea.WidthKey) != null
|| dataArea.GetFieldValue<Endianness>(Models.Metadata.DataArea.EndiannessKey) != Endianness.NULL);
}
}
/// <summary>
/// Loading flag
/// </summary>
[JsonProperty("loadflag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("loadflag")]
[JsonConverter(typeof(StringEnumConverter))]
public LoadFlag LoadFlag
{
get => _internal.ReadString(Models.Metadata.Rom.LoadFlagKey).AsEnumValue<LoadFlag>();
set => _internal[Models.Metadata.Rom.LoadFlagKey] = value.AsStringValue<LoadFlag>();
}
[JsonIgnore]
public bool LoadFlagSpecified { get { return LoadFlag != LoadFlag.NULL; } }
/// <summary>
/// Original hardware part associated with the item
/// </summary>
/// <remarks>Hack on top of internal model</remarks>
[JsonProperty("part", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("part")]
public Part? Part
{
get => _internal.Read<Part>("PART");
set => _internal["PART"] = value;
}
[JsonIgnore]
public bool PartSpecified
{
get
{
return Part != null
&& (!string.IsNullOrEmpty(Part.GetName())
|| !string.IsNullOrEmpty(Part.Interface));
var part = GetFieldValue<Part?>("PART");
return part != null
&& (!string.IsNullOrEmpty(part.GetName())
|| !string.IsNullOrEmpty(part.GetFieldValue<string?>(Models.Metadata.Part.InterfaceKey)));
}
}
/// <summary>
/// SoftwareList value associated with the item
/// </summary>
[JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("value")]
public string? Value
{
get => _internal.ReadString(Models.Metadata.Rom.ValueKey);
set => _internal[Models.Metadata.Rom.ValueKey] = value;
}
#endregion
#endregion // Fields
#region Accessors
@@ -453,7 +85,7 @@ namespace SabreTools.DatItems.Formats
SetName(null);
ItemType = ItemType.Rom;
DupeType = 0x00;
ItemStatus = ItemStatus.None;
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
}
/// <summary>
@@ -467,8 +99,8 @@ namespace SabreTools.DatItems.Formats
_internal = new Models.Metadata.Rom();
SetName(name);
ItemType = ItemType.Rom;
Size = null;
ItemStatus = ItemStatus.None;
SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, null);
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
Machine = new Machine
{
@@ -487,19 +119,19 @@ namespace SabreTools.DatItems.Formats
Machine = new Machine();
SetName(baseFile.Filename);
Size = baseFile.Size;
CRC = TextHelper.ByteArrayToString(baseFile.CRC);
MD5 = TextHelper.ByteArrayToString(baseFile.MD5);
SHA1 = TextHelper.ByteArrayToString(baseFile.SHA1);
SHA256 = TextHelper.ByteArrayToString(baseFile.SHA256);
SHA384 = TextHelper.ByteArrayToString(baseFile.SHA384);
SHA512 = TextHelper.ByteArrayToString(baseFile.SHA512);
SpamSum = System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []);
SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, baseFile.Size);
SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, TextHelper.ByteArrayToString(baseFile.CRC));
SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5));
SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1));
SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256));
SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, TextHelper.ByteArrayToString(baseFile.SHA384));
SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, TextHelper.ByteArrayToString(baseFile.SHA512));
SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []));
ItemType = ItemType.Rom;
DupeType = 0x00;
ItemStatus = ItemStatus.None;
Date = baseFile.Date;
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
SetFieldValue<string?>(Models.Metadata.Rom.DateKey, baseFile.Date);
}
/// <summary>
@@ -511,7 +143,7 @@ namespace SabreTools.DatItems.Formats
ItemType = ItemType.Rom;
DupeType = 0x00;
ItemStatus = ItemStatus.None;
SetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey, ItemStatus.None);
}
#endregion
@@ -541,17 +173,17 @@ namespace SabreTools.DatItems.Formats
{
return new BaseFile()
{
Filename = this.GetName(),
Filename = GetName(),
Parent = this.Machine.Name,
Date = this.Date,
Size = this.Size,
CRC = TextHelper.StringToByteArray(this.CRC),
MD5 = TextHelper.StringToByteArray(this.MD5),
SHA1 = TextHelper.StringToByteArray(this.SHA1),
SHA256 = TextHelper.StringToByteArray(this.SHA256),
SHA384 = TextHelper.StringToByteArray(this.SHA384),
SHA512 = TextHelper.StringToByteArray(this.SHA512),
SpamSum = System.Text.Encoding.UTF8.GetBytes(this.SpamSum ?? string.Empty),
Date = GetFieldValue<string?>(Models.Metadata.Rom.DateKey),
Size = GetFieldValue<long?>(Models.Metadata.Rom.SizeKey),
CRC = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)),
MD5 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)),
SHA1 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)),
SHA256 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)),
SHA384 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)),
SHA512 = TextHelper.StringToByteArray(GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)),
SpamSum = System.Text.Encoding.UTF8.GetBytes(GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey) ?? string.Empty),
};
}
@@ -597,31 +229,31 @@ namespace SabreTools.DatItems.Formats
switch (bucketedBy)
{
case ItemKey.CRC:
key = CRC;
key = GetFieldValue<string?>(Models.Metadata.Rom.CRCKey);
break;
case ItemKey.MD5:
key = MD5;
key = GetFieldValue<string?>(Models.Metadata.Rom.MD5Key);
break;
case ItemKey.SHA1:
key = SHA1;
key = GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key);
break;
case ItemKey.SHA256:
key = SHA256;
key = GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key);
break;
case ItemKey.SHA384:
key = SHA384;
key = GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key);
break;
case ItemKey.SHA512:
key = SHA512;
key = GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key);
break;
case ItemKey.SpamSum:
key = SpamSum;
key = GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey);
break;
// Let the base handle generic stuff

View File

@@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("sharedfeat"), XmlRoot("sharedfeat")]
public class SharedFeature : DatItem
{
#region Fields
/// <summary>
/// SharedFeature value
/// </summary>
[JsonProperty("value"), XmlElement("value")]
public string? Value
{
get => _internal.ReadString(Models.Metadata.SharedFeat.ValueKey);
set => _internal[Models.Metadata.SharedFeat.ValueKey] = value;
}
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Core;
@@ -14,18 +12,15 @@ namespace SabreTools.DatItems.Formats
{
#region Fields
/// <summary>
/// Slot options associated with the slot
/// </summary>
[JsonProperty("slotoptions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("slotoptions")]
public List<SlotOption>? SlotOptions
{
get => _internal.Read<SlotOption[]>(Models.Metadata.Slot.SlotOptionKey)?.ToList();
set => _internal[Models.Metadata.Slot.SlotOptionKey] = value?.ToArray();
}
[JsonIgnore]
public bool SlotOptionsSpecified { get { return SlotOptions != null && SlotOptions.Count > 0; } }
public bool SlotOptionsSpecified
{
get
{
var slotOptions = GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey);
return slotOptions != null && slotOptions.Length > 0;
}
}
#endregion

View File

@@ -10,33 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("slotoption"), XmlRoot("slotoption")]
public class SlotOption : DatItem
{
#region Fields
/// <summary>
/// Referenced device name
/// </summary>
[JsonProperty("devname"), XmlElement("devname")]
public string? DeviceName
{
get => _internal.ReadString(Models.Metadata.SlotOption.DevNameKey);
set => _internal[Models.Metadata.SlotOption.DevNameKey] = value;
}
/// <summary>
/// Determines if this slot option is default or not
/// </summary>
[JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("default")]
public bool? Default
{
get => _internal.ReadBool(Models.Metadata.SlotOption.DefaultKey);
set => _internal[Models.Metadata.SlotOption.DefaultKey] = value;
}
[JsonIgnore]
public bool DefaultSpecified { get { return Default != null; } }
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -1,8 +1,6 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using SabreTools.Core;
using SabreTools.Core.Tools;
namespace SabreTools.DatItems.Formats
{
@@ -15,47 +13,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("softwarelist"), XmlRoot("softwarelist")]
public class SoftwareList : DatItem
{
#region Fields
/// <summary>
/// Tag for the software list
/// </summary>
[JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)]
[XmlElement("tag")]
public string? Tag
{
get => _internal.ReadString(Models.Metadata.SoftwareList.TagKey);
set => _internal[Models.Metadata.SoftwareList.TagKey] = value;
}
/// <summary>
/// Status of the softare list according to the machine
/// </summary>
[JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonConverter(typeof(StringEnumConverter))]
[XmlElement("status")]
public SoftwareListStatus Status
{
get => _internal.ReadString(Models.Metadata.SoftwareList.StatusKey).AsEnumValue<SoftwareListStatus>();
set => _internal[Models.Metadata.SoftwareList.StatusKey] = value.AsStringValue<SoftwareListStatus>();
}
[JsonIgnore]
public bool StatusSpecified { get { return Status != SoftwareListStatus.None; } }
/// <summary>
/// Filter to apply to the software list
/// </summary>
[JsonProperty("filter", DefaultValueHandling = DefaultValueHandling.Ignore)]
[XmlElement("filter")]
public string? Filter
{
get => _internal.ReadString(Models.Metadata.SoftwareList.FilterKey);
set => _internal[Models.Metadata.SoftwareList.FilterKey] = value;
}
#endregion
#region Accessors
/// <inheritdoc/>

View File

@@ -10,23 +10,6 @@ namespace SabreTools.DatItems.Formats
[JsonObject("sound"), XmlRoot("sound")]
public class Sound : DatItem
{
#region Fields
/// <summary>
/// Number of speakers or channels
/// </summary>
[JsonProperty("channels", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("channels")]
public long? Channels
{
get => _internal.ReadLong(Models.Metadata.Sound.ChannelsKey);
set => _internal[Models.Metadata.Sound.ChannelsKey] = value;
}
[JsonIgnore]
public bool ChannelsSpecified { get { return Channels != null; } }
#endregion
#region Constructors
/// <summary>

View File

@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Xml.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
@@ -493,6 +494,26 @@ namespace SabreTools.DatItems
{
}
/// <summary>
/// Create a new Machine object from an existing metadata model
/// </summary>
/// <param name="machine">Machine metadata model</param>
public Machine(Models.Metadata.Machine machine)
{
// Get all fields to automatically copy without processing
var nonItemFields = TypeHelper.GetConstants(typeof(Models.Metadata.Machine));
if (nonItemFields == null)
return;
// Populate the internal machine from non-filter fields
_machine = [];
foreach (string fieldName in nonItemFields)
{
if (machine.ContainsKey(fieldName))
_machine[fieldName] = machine[fieldName];
}
}
/// <summary>
/// Create a new Machine object with the included information
/// </summary>

View File

@@ -405,7 +405,7 @@ namespace SabreTools.DatTools
datItem = media.ConvertToRom();
// Prepopluate a key string
string crc = (datItem as Rom)!.CRC ?? string.Empty;
string crc = (datItem as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey) ?? string.Empty;
// Try to get the stream for the file
if (!GetFileStream(datItem, file, isZip, out Stream? fileStream))
@@ -588,7 +588,7 @@ namespace SabreTools.DatTools
logger.User($"Matches found for '{Path.GetFileName(datItem.GetName() ?? string.Empty)}', rebuilding accordingly...");
// Get the proper output path
string sha1 = (datItem as Rom)!.SHA1 ?? string.Empty;
string sha1 = (datItem as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key) ?? string.Empty;
if (outputFormat == OutputFormat.TorrentGzipRomba)
outDir = Path.Combine(outDir, Utilities.GetDepotPath(sha1, datFile.Header.OutputDepot?.Depth ?? 0) ?? string.Empty);
else
@@ -634,7 +634,7 @@ namespace SabreTools.DatTools
logger.User($"Matches found for '{Path.GetFileName(datItem.GetName() ?? string.Empty)}', rebuilding accordingly...");
// Get the proper output path
string sha1 = (datItem as Rom)!.SHA1 ?? string.Empty;
string sha1 = (datItem as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key) ?? string.Empty;
if (outputFormat == OutputFormat.TorrentXZRomba)
outDir = Path.Combine(outDir, Utilities.GetDepotPath(sha1, datFile.Header.OutputDepot?.Depth ?? 0) ?? string.Empty).Replace(".gz", ".xz");
else

View File

@@ -185,49 +185,49 @@ namespace SabreTools.DatTools
continue;
// If the file is a nodump
if ((item.ItemType == ItemType.Rom && (item as Rom)!.ItemStatus == ItemStatus.Nodump)
|| (item.ItemType == ItemType.Disk && (item as Disk)!.ItemStatus == ItemStatus.Nodump))
if ((item.ItemType == ItemType.Rom && (item as Rom)!.GetFieldValue<ItemStatus>(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump)
|| (item.ItemType == ItemType.Disk && (item as Disk)!.GetFieldValue<ItemStatus>(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump))
{
fieldDats[Models.Metadata.Rom.StatusKey].Items.Add(key, item);
}
// If the file has a SHA-512
else if ((item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.SHA512)))
else if ((item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key))))
{
fieldDats[Models.Metadata.Rom.SHA512Key].Items.Add(key, item);
}
// If the file has a SHA-384
else if ((item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.SHA384)))
else if ((item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key))))
{
fieldDats[Models.Metadata.Rom.SHA384Key].Items.Add(key, item);
}
// If the file has a SHA-256
else if ((item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.SHA256))
|| (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.SHA256)))
else if ((item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)))
|| (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key))))
{
fieldDats[Models.Metadata.Rom.SHA256Key].Items.Add(key, item);
}
// If the file has a SHA-1
else if ((item.ItemType == ItemType.Disk && !string.IsNullOrEmpty((item as Disk)!.SHA1))
|| (item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.SHA1))
|| (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.SHA1)))
else if ((item.ItemType == ItemType.Disk && !string.IsNullOrEmpty((item as Disk)!.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
|| (item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)))
|| (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key))))
{
fieldDats[Models.Metadata.Rom.SHA1Key].Items.Add(key, item);
}
// If the file has an MD5
else if ((item.ItemType == ItemType.Disk && !string.IsNullOrEmpty((item as Disk)!.MD5))
|| (item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.MD5))
|| (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.MD5)))
else if ((item.ItemType == ItemType.Disk && !string.IsNullOrEmpty((item as Disk)!.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)))
|| (item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)))
|| (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key))))
{
fieldDats[Models.Metadata.Rom.MD5Key].Items.Add(key, item);
}
// If the file has a CRC
else if ((item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.CRC)))
else if ((item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey))))
{
fieldDats[Models.Metadata.Rom.CRCKey].Items.Add(key, item);
}
@@ -415,15 +415,15 @@ namespace SabreTools.DatTools
lessThan.Items.Add(key, item);
// If the file is a Rom and has no size, put it in the "lesser" dat
else if (item.ItemType == ItemType.Rom && (item as Rom)!.Size == null)
else if (item.ItemType == ItemType.Rom && (item as Rom)!.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) == null)
lessThan.Items.Add(key, item);
// If the file is a Rom and less than the radix, put it in the "lesser" dat
else if (item.ItemType == ItemType.Rom && (item as Rom)!.Size < radix)
else if (item.ItemType == ItemType.Rom && (item as Rom)!.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) < radix)
lessThan.Items.Add(key, item);
// If the file is a Rom and greater than or equal to the radix, put it in the "greater" dat
else if (item.ItemType == ItemType.Rom && (item as Rom)!.Size >= radix)
else if (item.ItemType == ItemType.Rom && (item as Rom)!.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) >= radix)
greaterThan.Items.Add(key, item);
}
#if NET40_OR_GREATER || NETCOREAPP
@@ -487,8 +487,8 @@ namespace SabreTools.DatTools
if (item is Rom rom)
{
// TODO: Should there be more than just a log if a single item is larger than the chunksize?
machineSize += rom.Size ?? 0;
if ((rom.Size ?? 0) > chunkSize)
machineSize += rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) ?? 0;
if ((rom.GetFieldValue<long?>(Models.Metadata.Rom.SizeKey) ?? 0) > chunkSize)
logger.Error($"{rom.GetName() ?? string.Empty} in {machine} is larger than {chunkSize}");
}
}

View File

@@ -296,7 +296,7 @@ namespace SabreTools.Filtering
{
if (configuration.ConditionsSpecified)
{
foreach (Condition subCondition in configuration.Conditions!)
foreach (Condition subCondition in configuration.GetFieldValue<Condition[]?>(Models.Metadata.Configuration.ConditionKey)!)
{
RemoveFields(subCondition);
}
@@ -304,7 +304,7 @@ namespace SabreTools.Filtering
if (configuration.LocationsSpecified)
{
foreach (ConfLocation subLocation in configuration.Locations!)
foreach (ConfLocation subLocation in configuration.GetFieldValue<ConfLocation[]?>(Models.Metadata.Configuration.ConfLocationKey)!)
{
RemoveFields(subLocation);
}
@@ -312,7 +312,7 @@ namespace SabreTools.Filtering
if (configuration.SettingsSpecified)
{
foreach (ConfSetting subSetting in configuration.Settings!)
foreach (ConfSetting subSetting in configuration.GetFieldValue<ConfSetting[]?>(Models.Metadata.Configuration.ConfSettingKey)!)
{
RemoveFields(subSetting as DatItem);
}
@@ -327,7 +327,7 @@ namespace SabreTools.Filtering
{
if (confsetting.ConditionsSpecified)
{
foreach (Condition subCondition in confsetting.Conditions!)
foreach (Condition subCondition in confsetting.GetFieldValue<Condition[]?>(Models.Metadata.ConfSetting.ConditionKey)!)
{
RemoveFields(subCondition);
}
@@ -342,7 +342,7 @@ namespace SabreTools.Filtering
{
if (device.ExtensionsSpecified)
{
foreach (Extension subExtension in device.Extensions!)
foreach (Extension subExtension in device.GetFieldValue<Extension[]?>(Models.Metadata.Device.ExtensionKey)!)
{
RemoveFields(subExtension);
}
@@ -350,7 +350,7 @@ namespace SabreTools.Filtering
if (device.InstancesSpecified)
{
foreach (Instance subInstance in device.Instances!)
foreach (Instance subInstance in device.GetFieldValue<Instance[]?>(Models.Metadata.Device.InstanceKey)!)
{
RemoveFields(subInstance);
}
@@ -365,7 +365,7 @@ namespace SabreTools.Filtering
{
if (dipSwitch.ConditionsSpecified)
{
foreach (Condition subCondition in dipSwitch.Conditions!)
foreach (Condition subCondition in dipSwitch.GetFieldValue<Condition[]?>(Models.Metadata.DipSwitch.ConditionKey)!)
{
RemoveFields(subCondition);
}
@@ -373,7 +373,7 @@ namespace SabreTools.Filtering
if (dipSwitch.LocationsSpecified)
{
foreach (DipLocation subLocation in dipSwitch.Locations!)
foreach (DipLocation subLocation in dipSwitch.GetFieldValue<DipLocation[]?>(Models.Metadata.DipSwitch.DipLocationKey)!)
{
RemoveFields(subLocation);
}
@@ -381,14 +381,14 @@ namespace SabreTools.Filtering
if (dipSwitch.ValuesSpecified)
{
foreach (DipValue subValue in dipSwitch.Values!)
foreach (DipValue subValue in dipSwitch.GetFieldValue<DipValue[]?>(Models.Metadata.DipSwitch.DipValueKey)!)
{
RemoveFields(subValue as DatItem);
}
}
if (dipSwitch.PartSpecified)
RemoveFields(dipSwitch.Part! as DatItem);
RemoveFields(dipSwitch.GetFieldValue<Part?>("PART")! as DatItem);
}
/// <summary>
@@ -399,7 +399,7 @@ namespace SabreTools.Filtering
{
if (dipValue.ConditionsSpecified)
{
foreach (Condition subCondition in dipValue.Conditions!)
foreach (Condition subCondition in dipValue.GetFieldValue<Condition[]?>(Models.Metadata.DipValue.ConditionKey)!)
{
RemoveFields(subCondition);
}
@@ -413,10 +413,10 @@ namespace SabreTools.Filtering
private void RemoveFields(Disk disk)
{
if (disk.DiskAreaSpecified)
RemoveFields(disk.DiskArea);
RemoveFields(disk.GetFieldValue<DiskArea?>("DISKAREA")! as DatItem);
if (disk.PartSpecified)
RemoveFields(disk.Part! as DatItem);
RemoveFields(disk.GetFieldValue<Part?>("PART")! as DatItem);
}
/// <summary>
@@ -427,7 +427,7 @@ namespace SabreTools.Filtering
{
if (input.ControlsSpecified)
{
foreach (Control subControl in input.Controls!)
foreach (Control subControl in input.GetFieldValue<Control[]?>(Models.Metadata.Input.ControlKey)!)
{
RemoveFields(subControl);
}
@@ -442,7 +442,7 @@ namespace SabreTools.Filtering
{
if (part.FeaturesSpecified)
{
foreach (PartFeature subPartFeature in part.Features!)
foreach (PartFeature subPartFeature in part.GetFieldValue<PartFeature[]?>(Models.Metadata.Part.FeatureKey)!)
{
RemoveFields(subPartFeature);
}
@@ -457,7 +457,7 @@ namespace SabreTools.Filtering
{
if (port.AnalogsSpecified)
{
foreach (Analog subAnalog in port.Analogs!)
foreach (Analog subAnalog in port.GetFieldValue<Analog[]?>(Models.Metadata.Port.AnalogKey)!)
{
RemoveFields(subAnalog);
}
@@ -471,10 +471,10 @@ namespace SabreTools.Filtering
private void RemoveFields(Rom rom)
{
if (rom.DataAreaSpecified)
RemoveFields(rom.DataArea!);
RemoveFields(rom.GetFieldValue<DataArea?>("DATAAREA")!);
if (rom.PartSpecified)
RemoveFields(rom.Part! as DatItem);
RemoveFields(rom.GetFieldValue<Part?>("PART")! as DatItem);
}
/// <summary>
@@ -485,7 +485,7 @@ namespace SabreTools.Filtering
{
if (slot.SlotOptionsSpecified)
{
foreach (SlotOption subSlotOption in slot.SlotOptions!)
foreach (SlotOption subSlotOption in slot.GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey)!)
{
RemoveFields(subSlotOption);
}

View File

@@ -107,14 +107,14 @@ namespace SabreTools.Filtering
{
if (datItemFields.Contains(Models.Metadata.Disk.MD5Key))
{
if (string.IsNullOrEmpty(disk.MD5) && !string.IsNullOrEmpty(newItem.MD5))
disk.MD5 = newItem.MD5;
if (string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key)))
disk.SetFieldValue<string?>(Models.Metadata.Disk.MD5Key, newItem.GetFieldValue<string?>(Models.Metadata.Disk.MD5Key));
}
if (datItemFields.Contains(Models.Metadata.Disk.SHA1Key))
{
if (string.IsNullOrEmpty(disk.SHA1) && !string.IsNullOrEmpty(newItem.SHA1))
disk.SHA1 = newItem.SHA1;
if (string.IsNullOrEmpty(disk.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key)))
disk.SetFieldValue<string?>(Models.Metadata.Disk.SHA1Key, newItem.GetFieldValue<string?>(Models.Metadata.Disk.SHA1Key));
}
}
@@ -128,26 +128,26 @@ namespace SabreTools.Filtering
{
if (datItemFields.Contains(Models.Metadata.Media.MD5Key))
{
if (string.IsNullOrEmpty(media.MD5) && !string.IsNullOrEmpty(newItem.MD5))
media.MD5 = newItem.MD5;
if (string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Media.MD5Key)))
media.SetFieldValue<string?>(Models.Metadata.Media.MD5Key, newItem.GetFieldValue<string?>(Models.Metadata.Media.MD5Key));
}
if (datItemFields.Contains(Models.Metadata.Media.SHA1Key))
{
if (string.IsNullOrEmpty(media.SHA1) && !string.IsNullOrEmpty(newItem.SHA1))
media.SHA1 = newItem.SHA1;
if (string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key)))
media.SetFieldValue<string?>(Models.Metadata.Media.SHA1Key, newItem.GetFieldValue<string?>(Models.Metadata.Media.SHA1Key));
}
if (datItemFields.Contains(Models.Metadata.Media.SHA256Key))
{
if (string.IsNullOrEmpty(media.SHA256) && !string.IsNullOrEmpty(newItem.SHA256))
media.SHA256 = newItem.SHA256;
if (string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key)))
media.SetFieldValue<string?>(Models.Metadata.Media.SHA256Key, newItem.GetFieldValue<string?>(Models.Metadata.Media.SHA256Key));
}
if (datItemFields.Contains(Models.Metadata.Media.SpamSumKey))
{
if (string.IsNullOrEmpty(media.SpamSum) && !string.IsNullOrEmpty(newItem.SpamSum))
media.SpamSum = newItem.SpamSum;
if (string.IsNullOrEmpty(media.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey)))
media.SetFieldValue<string?>(Models.Metadata.Media.SpamSumKey, newItem.GetFieldValue<string?>(Models.Metadata.Media.SpamSumKey));
}
}
@@ -161,44 +161,44 @@ namespace SabreTools.Filtering
{
if (datItemFields.Contains(Models.Metadata.Rom.CRCKey))
{
if (string.IsNullOrEmpty(rom.CRC) && !string.IsNullOrEmpty(newItem.CRC))
rom.CRC = newItem.CRC;
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey)))
rom.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, newItem.GetFieldValue<string?>(Models.Metadata.Rom.CRCKey));
}
if (datItemFields.Contains(Models.Metadata.Rom.MD5Key))
{
if (string.IsNullOrEmpty(rom.MD5) && !string.IsNullOrEmpty(newItem.MD5))
rom.MD5 = newItem.MD5;
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key)))
rom.SetFieldValue<string?>(Models.Metadata.Rom.MD5Key, newItem.GetFieldValue<string?>(Models.Metadata.Rom.MD5Key));
}
if (datItemFields.Contains(Models.Metadata.Rom.SHA1Key))
{
if (string.IsNullOrEmpty(rom.SHA1) && !string.IsNullOrEmpty(newItem.SHA1))
rom.SHA1 = newItem.SHA1;
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key)))
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA1Key));
}
if (datItemFields.Contains(Models.Metadata.Rom.SHA256Key))
{
if (string.IsNullOrEmpty(rom.SHA256) && !string.IsNullOrEmpty(newItem.SHA256))
rom.SHA256 = newItem.SHA256;
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key)))
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA256Key, newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA256Key));
}
if (datItemFields.Contains(Models.Metadata.Rom.SHA384Key))
{
if (string.IsNullOrEmpty(rom.SHA384) && !string.IsNullOrEmpty(newItem.SHA384))
rom.SHA384 = newItem.SHA384;
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key)))
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA384Key, newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA384Key));
}
if (datItemFields.Contains(Models.Metadata.Rom.SHA512Key))
{
if (string.IsNullOrEmpty(rom.SHA512) && !string.IsNullOrEmpty(newItem.SHA512))
rom.SHA512 = newItem.SHA512;
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key)))
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA512Key, newItem.GetFieldValue<string?>(Models.Metadata.Rom.SHA512Key));
}
if (datItemFields.Contains(Models.Metadata.Rom.SpamSumKey))
{
if (string.IsNullOrEmpty(rom.SpamSum) && !string.IsNullOrEmpty(newItem.SpamSum))
rom.SpamSum = newItem.SpamSum;
if (string.IsNullOrEmpty(rom.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)) && !string.IsNullOrEmpty(newItem.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey)))
rom.SetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey, newItem.GetFieldValue<string?>(Models.Metadata.Rom.SpamSumKey));
}
}
}

View File

@@ -310,8 +310,8 @@ namespace SabreTools.Filtering
.Where(i => i.ItemType == ItemType.Slot)
.Select(i => i as Slot)
.Where(s => s!.SlotOptionsSpecified)
.SelectMany(s => s!.SlotOptions!)
.Select(so => so.DeviceName)
.SelectMany(s => s!.GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey)!)
.Select(so => so.GetFieldValue<string?>(Models.Metadata.SlotOption.DevNameKey))
.Distinct()
.ToList();
@@ -384,8 +384,8 @@ namespace SabreTools.Filtering
newSlotOptions.AddRange(slotItems
.Where(i => i.ItemType == ItemType.Slot)
.Where(s => (s as Slot)!.SlotOptionsSpecified)
.SelectMany(s => (s as Slot)!.SlotOptions!)
.Select(o => o.DeviceName!));
.SelectMany(s => (s as Slot)!.GetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey)!)
.Select(o => o.GetFieldValue<string?>(Models.Metadata.SlotOption.DevNameKey)!));
// Set new machine information and add to the current machine
DatItem copyFrom = datFile.Items[machine]![0];
@@ -409,7 +409,15 @@ namespace SabreTools.Filtering
foreach (string slotOption in newSlotOptions.Distinct())
{
if (!slotOptions.Contains(slotOption))
datFile.Items[machine]!.Add(new Slot() { SlotOptions = new List<SlotOption> { new SlotOption { DeviceName = slotOption } } });
{
var slotOptionItem = new SlotOption();
slotOptionItem.SetFieldValue<string?>(Models.Metadata.SlotOption.DevNameKey, slotOption);
var slotItem = new Slot();
slotItem.SetFieldValue<SlotOption[]?>(Models.Metadata.Slot.SlotOptionKey, [slotOptionItem]);
datFile.Items[machine]!.Add(slotItem);
}
}
}
}
@@ -513,22 +521,23 @@ namespace SabreTools.Filtering
if (item.ItemType == ItemType.Disk)
{
Disk disk = (item as Disk)!;
string? mergeTag = disk.GetFieldValue<string?>(Models.Metadata.Disk.MergeKey);
// If the merge tag exists and the parent already contains it, skip
if (disk.MergeTag != null && datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Disk).Select(i => (i as Disk)!.GetName()).Contains(disk.MergeTag))
if (mergeTag != null && datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Disk).Select(i => (i as Disk)!.GetName()).Contains(mergeTag))
{
continue;
}
// If the merge tag exists but the parent doesn't contain it, add to parent
else if (disk.MergeTag != null && !datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Disk).Select(i => (i as Disk)!.GetName()).Contains(disk.MergeTag))
else if (mergeTag != null && !datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Disk).Select(i => (i as Disk)!.GetName()).Contains(mergeTag))
{
disk.CopyMachineInformation(copyFrom);
datFile.Items.Add(parent!, disk);
}
// If there is no merge tag, add to parent
else if (disk.MergeTag == null)
else if (mergeTag == null)
{
disk.CopyMachineInformation(copyFrom);
datFile.Items.Add(parent!, disk);
@@ -541,13 +550,13 @@ namespace SabreTools.Filtering
Rom rom = (item as Rom)!;
// If the merge tag exists and the parent already contains it, skip
if (rom.MergeTag != null && datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Rom).Select(i => (i as Rom)!.GetName()).Contains(rom.MergeTag))
if (rom.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey) != null && datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Rom).Select(i => (i as Rom)!.GetName()).Contains(rom.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey)))
{
continue;
}
// If the merge tag exists but the parent doesn't contain it, add to subfolder of parent
else if (rom.MergeTag != null && !datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Rom).Select(i => (i as Rom)!.GetName()).Contains(rom.MergeTag))
else if (rom.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey) != null && !datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Rom).Select(i => (i as Rom)!.GetName()).Contains(rom.GetFieldValue<string?>(Models.Metadata.Rom.MergeKey)))
{
if (subfolder)
rom.SetName($"{rom.Machine.Name}\\{rom.GetName()}");

View File

@@ -14,48 +14,37 @@ namespace SabreTools.Test.DatFiles
[InlineData(ItemKey.SHA1, 4)]
public void BucketByTest(ItemKey itemKey, int expected)
{
// Setup the items
var rom1 = new Rom { Machine = new Machine { Name = "game-1" } };
rom1.SetName("rom-1");
rom1.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, "DEADBEEF");
rom1.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6");
rom1.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
var rom2 = new Rom { Machine = new Machine { Name = "game-1" } };
rom2.SetName("rom-2");
rom2.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, "DEADBEEF");
rom2.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44");
rom2.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
var rom3 = new Rom { Machine = new Machine { Name = "game-2" } };
rom3.SetName("rom-3");
rom3.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, "DEADBEEF");
rom3.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "00000ea4014ce66679e7e17d56ac510f67e39e26");
rom3.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
var rom4 = new Rom { Machine = new Machine { Name = "game-2" } };
rom4.SetName("rom-4");
rom4.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, "DEADBEEF");
rom4.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "00000151d437442e74e5134023fab8bf694a2487");
rom4.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
// Setup the dictionary
var dict = new ItemDictionary
{
["game-1"] =
[
new Rom
{
Size = 1024,
CRC = "DEADBEEF",
SHA1 = "0000000fbbb37f8488100b1b4697012de631a5e6",
Machine = new Machine { Name = "game-1" },
},
new Rom
{
Size = 1024,
CRC = "DEADBEEF",
SHA1 = "000000e948edcb4f7704b8af85a77a3339ecce44",
Machine = new Machine { Name = "game-1" },
},
],
["game-2"] =
[
new Rom
{
Size = 1024,
CRC = "DEADBEEF",
SHA1 = "00000ea4014ce66679e7e17d56ac510f67e39e26",
Machine = new Machine { Name = "game-2" },
},
new Rom
{
Size = 1024,
CRC = "DEADBEEF",
SHA1 = "00000151d437442e74e5134023fab8bf694a2487",
Machine = new Machine { Name = "game-2" },
},
],
["game-1"] = [rom1, rom2],
["game-2"] = [rom3, rom4],
};
dict["game-1"]![0].SetName("rom-1");
dict["game-1"]![1].SetName("rom-2");
dict["game-2"]![0].SetName("rom-3");
dict["game-2"]![1].SetName("rom-4");
dict.BucketBy(itemKey, DedupeType.None);
Assert.Equal(expected, dict.Keys.Count);
@@ -79,30 +68,24 @@ namespace SabreTools.Test.DatFiles
[Fact]
public void ClearMarkedTest()
{
// Setup the items
var rom1 = new Rom { Machine = new Machine { Name = "game-1" } };
rom1.SetName("rom-1");
rom1.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, "DEADBEEF");
rom1.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6");
rom1.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
var rom2 = new Rom { Machine = new Machine { Name = "game-1" }, Remove = true };
rom2.SetName("rom-2");
rom2.SetFieldValue<string?>(Models.Metadata.Rom.CRCKey, "DEADBEEF");
rom2.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44");
rom2.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
// Setup the dictionary
var dict = new ItemDictionary
{
["game-1"] =
[
new Rom
{
Size = 1024,
CRC = "DEADBEEF",
SHA1 = "0000000fbbb37f8488100b1b4697012de631a5e6",
Machine = new Machine { Name = "game-1" },
},
new Rom
{
Size = 1024,
CRC = "DEADBEEF",
SHA1 = "000000e948edcb4f7704b8af85a77a3339ecce44",
Machine = new Machine { Name = "game-1" },
Remove = true,
},
],
["game-1"] = [rom1, rom2],
};
dict["game-1"]![0].SetName("rom-1");
dict["game-1"]![1].SetName("rom-2");
dict.ClearMarked();
string key = Assert.Single(dict.Keys);
@@ -116,35 +99,28 @@ namespace SabreTools.Test.DatFiles
[InlineData(false, 0)]
public void GetDuplicatesTest(bool hasDuplicate, int expected)
{
// Setup the items
var rom1 = new Rom { Machine = new Machine { Name = "game-1" } };
rom1.SetName("rom-1");
rom1.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6");
rom1.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
var rom2 = new Rom { Machine = new Machine { Name = "game-1" } };
rom2.SetName("rom-2");
rom2.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44");
rom2.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
// Setup the dictionary
var dict = new ItemDictionary
{
["game-1"] =
[
new Rom
{
Size = 1024,
SHA1 = "0000000fbbb37f8488100b1b4697012de631a5e6",
Machine = new Machine { Name = "game-1" },
},
new Rom
{
Size = 1024,
SHA1 = "000000e948edcb4f7704b8af85a77a3339ecce44",
Machine = new Machine { Name = "game-1" },
},
],
["game-1"] = [rom1, rom2],
};
dict["game-1"]![0].SetName("rom-1");
dict["game-1"]![1].SetName("rom-2");
var rom = new Rom
{
Size = hasDuplicate ? 1024 : 2048,
SHA1 = "0000000fbbb37f8488100b1b4697012de631a5e6",
Machine = new Machine { Name = "game-1" },
};
// Setup the test item
var rom = new Rom { Machine = new Machine { Name = "game-1" } };
rom.SetName("rom-1");
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6");
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, hasDuplicate ? 1024 : 2048);
var actual = dict.GetDuplicates(rom);
Assert.Equal(expected, actual.Count);
@@ -155,35 +131,28 @@ namespace SabreTools.Test.DatFiles
[InlineData(false)]
public void HasDuplicatesTest(bool expected)
{
// Setup the items
var rom1 = new Rom { Machine = new Machine { Name = "game-1" } };
rom1.SetName("rom-1");
rom1.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6");
rom1.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
var rom2 = new Rom { Machine = new Machine { Name = "game-1" } };
rom2.SetName("rom-2");
rom2.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44");
rom2.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, 1024);
// Setup the dictionary
var dict = new ItemDictionary
{
["game-1"] =
[
new Rom
{
Size = 1024,
SHA1 = "0000000fbbb37f8488100b1b4697012de631a5e6",
Machine = new Machine { Name = "game-1" },
},
new Rom
{
Size = 1024,
SHA1 = "000000e948edcb4f7704b8af85a77a3339ecce44",
Machine = new Machine { Name = "game-1" },
},
],
["game-1"] = [rom1, rom2],
};
dict["game-1"]![0].SetName("rom-1");
dict["game-1"]![1].SetName("rom-2");
var rom = new Rom
{
Size = expected ? 1024 : 2048,
SHA1 = "0000000fbbb37f8488100b1b4697012de631a5e6",
Machine = new Machine { Name = "game-1" },
};
// Setup the test item
var rom = new Rom { Machine = new Machine { Name = "game-1" } };
rom.SetName("rom-1");
rom.SetFieldValue<string?>(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6");
rom.SetFieldValue<long?>(Models.Metadata.Rom.SizeKey, expected ? 1024 : 2048);
bool actual = dict.HasDuplicates(rom);
Assert.Equal(expected, actual);

View File

@@ -49,24 +49,19 @@ namespace SabreTools.Test.DatItems
{
var romA = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "name-same",
},
Machine = new Machine { Name = "name-same" },
Source = new Source { Index = 0 },
};
romA.SetName("same-name");
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var romB = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "name-same",
},
Machine = new Machine { Name = "name-same" },
Source = new Source { Index = 1 },
};
romB.SetName("same-name");
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var actual = romA.GetDuplicateStatus(romB);
Assert.Equal(DupeType.External | DupeType.All, actual);
@@ -77,24 +72,19 @@ namespace SabreTools.Test.DatItems
{
var romA = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "name-same",
},
Machine = new Machine { Name = "name-same" },
Source = new Source { Index = 0 },
};
romA.SetName("same-name");
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var romB = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "not-name-same",
},
Machine = new Machine { Name = "not-name-same" },
Source = new Source { Index = 1 },
};
romB.SetName("same-name");
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var actual = romA.GetDuplicateStatus(romB);
Assert.Equal(DupeType.External | DupeType.Hash, actual);
@@ -105,24 +95,19 @@ namespace SabreTools.Test.DatItems
{
var romA = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "name-same",
},
Machine = new Machine { Name = "name-same" },
Source = new Source { Index = 0 },
};
romA.SetName("same-name");
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var romB = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "name-same",
},
Machine = new Machine { Name = "name-same" },
Source = new Source { Index = 0 },
};
romB.SetName("same-name");
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var actual = romA.GetDuplicateStatus(romB);
Assert.Equal(DupeType.Internal | DupeType.All, actual);
@@ -133,24 +118,19 @@ namespace SabreTools.Test.DatItems
{
var romA = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "name-same",
},
Machine = new Machine { Name = "name-same" },
Source = new Source { Index = 0 },
};
romA.SetName("same-name");
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var romB = new Rom
{
CRC = "DEADBEEF",
Machine = new Machine
{
Name = "not-name-same",
},
Machine = new Machine { Name = "not-name-same" },
Source = new Source { Index = 0 },
};
romB.SetName("same-name");
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
var actual = romA.GetDuplicateStatus(romB);
Assert.Equal(DupeType.Internal | DupeType.Hash, actual);