diff --git a/RombaSharp/Features/Archive.cs b/RombaSharp/Features/Archive.cs index 4a8253bd..3787dbbd 100644 --- a/RombaSharp/Features/Archive.cs +++ b/RombaSharp/Features/Archive.cs @@ -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(SabreTools.Models.Metadata.Rom.CRCKey)}\"" + + $" OR md5sha1.md5=\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\"" + + $" OR md5sha1.sha1=\"{rom.GetFieldValue(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(SabreTools.Models.Metadata.Rom.CRCKey))) + crcquery += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5query += $" (\"{rom.MD5}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.SHA1)) + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key))) { - sha1query += $" (\"{rom.SHA1}\", \"{_depots!.Keys.ToList()[0]}\"),"; + sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\", \"{_depots!.Keys.ToList()[0]}\"),"; - if (!string.IsNullOrWhiteSpace(rom.CRC)) - crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey))) + crcsha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue(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(SabreTools.Models.Metadata.Rom.CRCKey))) + crcquery += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5query += $" (\"{rom.MD5}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.SHA1)) + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key))) { - sha1query += $" (\"{rom.SHA1}\", \"{_depots!.Keys.ToList()[0]}\"),"; + sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\", \"{_depots!.Keys.ToList()[0]}\"),"; - if (!string.IsNullOrWhiteSpace(rom.CRC)) - crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey))) + crcsha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),"; } } diff --git a/RombaSharp/Features/BaseFeature.cs b/RombaSharp/Features/BaseFeature.cs index 0e9184fc..6b8ec09a 100644 --- a/RombaSharp/Features/BaseFeature.cs +++ b/RombaSharp/Features/BaseFeature.cs @@ -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(SabreTools.Models.Metadata.Disk.MD5Key))) + md5query += $" (\"{disk.GetFieldValue(SabreTools.Models.Metadata.Disk.MD5Key)}\"),"; - if (!string.IsNullOrWhiteSpace(disk.SHA1)) + if (!string.IsNullOrWhiteSpace(disk.GetFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key))) { - sha1query += $" (\"{disk.SHA1}\"),"; + sha1query += $" (\"{disk.GetFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key)}\"),"; - if (!string.IsNullOrWhiteSpace(disk.MD5)) - md5sha1query += $" (\"{disk.MD5}\", \"{disk.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(disk.GetFieldValue(SabreTools.Models.Metadata.Disk.MD5Key))) + md5sha1query += $" (\"{disk.GetFieldValue(SabreTools.Models.Metadata.Disk.MD5Key)}\", \"{disk.GetFieldValue(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(SabreTools.Models.Metadata.Media.MD5Key))) + md5query += $" (\"{media.GetFieldValue(SabreTools.Models.Metadata.Media.MD5Key)}\"),"; - if (!string.IsNullOrWhiteSpace(media.SHA1)) + if (!string.IsNullOrWhiteSpace(media.GetFieldValue(SabreTools.Models.Metadata.Media.SHA1Key))) { - sha1query += $" (\"{media.SHA1}\"),"; + sha1query += $" (\"{media.GetFieldValue(SabreTools.Models.Metadata.Media.SHA1Key)}\"),"; - if (!string.IsNullOrWhiteSpace(media.MD5)) - md5sha1query += $" (\"{media.MD5}\", \"{media.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(media.GetFieldValue(SabreTools.Models.Metadata.Media.MD5Key))) + md5sha1query += $" (\"{media.GetFieldValue(SabreTools.Models.Metadata.Media.MD5Key)}\", \"{media.GetFieldValue(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(SabreTools.Models.Metadata.Rom.CRCKey))) + crcquery += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5query += $" (\"{rom.MD5}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.SHA1)) + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key))) { - sha1query += $" (\"{rom.SHA1}\"),"; + sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.CRC)) - crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey))) + crcsha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue(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(SabreTools.Models.Metadata.Rom.SHA1Key)}\")"; slc = new SqliteCommand(datquery, dbc); slc.ExecuteNonQuery(); } diff --git a/RombaSharp/Features/RescanDepots.cs b/RombaSharp/Features/RescanDepots.cs index 6ee33b08..13a39cb7 100644 --- a/RombaSharp/Features/RescanDepots.cs +++ b/RombaSharp/Features/RescanDepots.cs @@ -94,28 +94,28 @@ namespace RombaSharp.Features foreach (Rom rom in roms) { - if (hashes.Contains(rom.SHA1!)) + if (hashes.Contains(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)!)) { - dupehashes.Add(rom.SHA1!); - hashes.Remove(rom.SHA1!); + dupehashes.Add(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)!); + hashes.Remove(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)!); } - else if (!dupehashes.Contains(rom.SHA1!)) + else if (!dupehashes.Contains(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)!)) { - if (!string.IsNullOrWhiteSpace(rom.CRC)) - crcquery += $" (\"{rom.CRC}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey))) + crcquery += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5query += $" (\"{rom.MD5}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.SHA1)) + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key))) { - sha1query += $" (\"{rom.SHA1}\", \"{depotname}\"),"; + sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\", \"{depotname}\"),"; - if (!string.IsNullOrWhiteSpace(rom.CRC)) - crcsha1query += $" (\"{rom.CRC}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey))) + crcsha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\", \"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),"; - if (!string.IsNullOrWhiteSpace(rom.MD5)) - md5sha1query += $" (\"{rom.MD5}\", \"{rom.SHA1}\"),"; + if (!string.IsNullOrWhiteSpace(rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key))) + md5sha1query += $" (\"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\", \"{rom.GetFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\"),"; } } } diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs index 78050693..04265261 100644 --- a/SabreTools.DatFiles/DatFile.cs +++ b/SabreTools.DatFiles/DatFile.cs @@ -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(Models.Metadata.Disk.StatusKey) != ItemStatus.Nodump + && string.IsNullOrEmpty(disk.GetFieldValue(Models.Metadata.Disk.MD5Key)) + && string.IsNullOrEmpty(disk.GetFieldValue(Models.Metadata.Disk.SHA1Key))) { logger.Verbose($"Incomplete entry for '{disk.GetName()}' will be output as nodump"); - disk.ItemStatus = ItemStatus.Nodump; + disk.SetFieldValue(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(Models.Metadata.Media.MD5Key)) + && string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA1Key)) + && string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA256Key)) + && string.IsNullOrEmpty(media.GetFieldValue(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(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(Models.Metadata.Rom.SizeKey) == 0 || rom.GetFieldValue(Models.Metadata.Rom.SizeKey) == null) + && (string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey, Constants.SizeZero); + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, Constants.CRCZero); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, Constants.MD5Zero); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, Constants.SHA1Zero); + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, null); // Constants.SHA256Zero; + rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, null); // Constants.SHA384Zero; + rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, null); // Constants.SHA512Zero; + rom.SetFieldValue(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(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump && (rom.GetFieldValue(Models.Metadata.Rom.SizeKey) == 0 || rom.GetFieldValue(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(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(Models.Metadata.Rom.StatusKey) != ItemStatus.Nodump + && rom.GetFieldValue(Models.Metadata.Rom.SizeKey) != null && rom.GetFieldValue(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(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(Models.Metadata.Disk.MD5Key) ?? string.Empty; + sha1 = disk.GetFieldValue(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(Models.Metadata.Media.MD5Key) ?? string.Empty; + sha1 = media.GetFieldValue(Models.Metadata.Media.SHA1Key) ?? string.Empty; + sha256 = media.GetFieldValue(Models.Metadata.Media.SHA256Key) ?? string.Empty; + spamsum = media.GetFieldValue(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(Models.Metadata.Rom.CRCKey) ?? string.Empty; + md5 = rom.GetFieldValue(Models.Metadata.Rom.MD5Key) ?? string.Empty; + sha1 = rom.GetFieldValue(Models.Metadata.Rom.SHA1Key) ?? string.Empty; + sha256 = rom.GetFieldValue(Models.Metadata.Rom.SHA256Key) ?? string.Empty; + sha384 = rom.GetFieldValue(Models.Metadata.Rom.SHA384Key) ?? string.Empty; + sha512 = rom.GetFieldValue(Models.Metadata.Rom.SHA512Key) ?? string.Empty; + size = rom.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString() ?? string.Empty; + spamsum = rom.GetFieldValue(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(Models.Metadata.Disk.SHA1Key))) { - name = Utilities.GetDepotPath(disk.SHA1, Header.OutputDepot.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(disk.GetFieldValue(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(Models.Metadata.Media.SHA1Key))) { - name = Utilities.GetDepotPath(media.SHA1, Header.OutputDepot.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(media.GetFieldValue(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(Models.Metadata.Rom.SHA1Key))) { - name = Utilities.GetDepotPath(rom.SHA1, Header.OutputDepot.Depth)?.Replace('\\', '/'); + name = Utilities.GetDepotPath(rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey) == null && rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey, Constants.SizeZero); + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.GetFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? Constants.CRCZero : null); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, rom.GetFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? Constants.MD5Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.GetFieldValue(Models.Metadata.Rom.SHA1Key) == "null" ? Constants.SHA1Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, rom.GetFieldValue(Models.Metadata.Rom.SHA256Key) == "null" ? Constants.SHA256Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, rom.GetFieldValue(Models.Metadata.Rom.SHA384Key) == "null" ? Constants.SHA384Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, rom.GetFieldValue(Models.Metadata.Rom.SHA512Key) == "null" ? Constants.SHA512Zero : null); + rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey) == 0 || rom.GetFieldValue(Models.Metadata.Rom.SizeKey) == null) { string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); logger?.Verbose($"Item '{itemString}' was skipped because it had an invalid size"); diff --git a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs index 1d4c4623..b9940604 100644 --- a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs +++ b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs @@ -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(Models.Metadata.Rom.AlbumKey, file.Album); + rom.SetFieldValue(Models.Metadata.Rom.ArtistKey, file.Artist); + rom.SetFieldValue(Models.Metadata.Rom.ASRDetectedLangKey, file.ASRDetectedLang); + rom.SetFieldValue(Models.Metadata.Rom.ASRDetectedLangConfKey, file.ASRDetectedLangConf); + rom.SetFieldValue(Models.Metadata.Rom.ASRTranscribedLangKey, file.ASRTranscribedLang); + rom.SetFieldValue(Models.Metadata.Rom.BitrateKey, file.Bitrate); + rom.SetFieldValue(Models.Metadata.Rom.BitTorrentMagnetHashKey, file.BitTorrentMagnetHash); + rom.SetFieldValue(Models.Metadata.Rom.ClothCoverDetectionModuleVersionKey, file.ClothCoverDetectionModuleVersion); + rom.SetFieldValue(Models.Metadata.Rom.CollectionCatalogNumberKey, file.CollectionCatalogNumber); + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, file.CRC32); + rom.SetFieldValue(Models.Metadata.Rom.CreatorKey, file.Creator); + rom.SetFieldValue(Models.Metadata.Rom.DateKey, file.LastModifiedTime?.ToString()); + rom.SetFieldValue(Models.Metadata.Rom.FileCountKey, file.FileCount); + rom.SetFieldValue(Models.Metadata.Rom.FormatKey, file.Format); + rom.SetFieldValue(Models.Metadata.Rom.HeightKey, file.Height); + rom.SetFieldValue(Models.Metadata.Rom.hOCRCharToWordhOCRVersionKey, file.hOCRCharToWordhOCRVersion); + rom.SetFieldValue(Models.Metadata.Rom.hOCRCharToWordModuleVersionKey, file.hOCRCharToWordModuleVersion); + rom.SetFieldValue(Models.Metadata.Rom.hOCRFtsTexthOCRVersionKey, file.hOCRFtsTexthOCRVersion); + rom.SetFieldValue(Models.Metadata.Rom.hOCRFtsTextModuleVersionKey, file.hOCRFtsTextModuleVersion); + rom.SetFieldValue(Models.Metadata.Rom.hOCRPageIndexhOCRVersionKey, file.hOCRPageIndexhOCRVersion); + rom.SetFieldValue(Models.Metadata.Rom.hOCRPageIndexModuleVersionKey, file.hOCRPageIndexModuleVersion); + rom.SetFieldValue(Models.Metadata.Rom.LengthKey, file.Length); + rom.SetFieldValue(Models.Metadata.Rom.MatrixNumberKey, file.MatrixNumber); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, file.MD5); + rom.SetFieldValue(Models.Metadata.Rom.OriginalKey, file.Original); + rom.SetFieldValue(Models.Metadata.Rom.PDFModuleVersionKey, file.PDFModuleVersion); + rom.SetFieldValue(Models.Metadata.Rom.PreviewImageKey, file.PreviewImage); + rom.SetFieldValue(Models.Metadata.Rom.RotationKey, file.Rotation); + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(file.Size)); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, file.SHA1); + rom.SetFieldValue(Models.Metadata.Rom.SourceKey, file.Source); + rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); + rom.SetFieldValue(Models.Metadata.Rom.SummationKey, file.Summation); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRKey, file.TesseractOCR); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRConvertedKey, file.TesseractOCRConverted); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRDetectedLangKey, file.TesseractOCRDetectedLang); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRDetectedLangConfKey, file.TesseractOCRDetectedLangConf); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRDetectedScriptKey, file.TesseractOCRDetectedScript); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRDetectedScriptConfKey, file.TesseractOCRDetectedScriptConf); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRModuleVersionKey, file.TesseractOCRModuleVersion); + rom.SetFieldValue(Models.Metadata.Rom.TesseractOCRParametersKey, file.TesseractOCRParameters); + rom.SetFieldValue(Models.Metadata.Rom.TitleKey, file.Title); + rom.SetFieldValue(Models.Metadata.Rom.TrackKey, file.Track); + rom.SetFieldValue(Models.Metadata.Rom.WhisperASRModuleVersionKey, file.WhisperASRModuleVersion); + rom.SetFieldValue(Models.Metadata.Rom.WhisperModelHashKey, file.WhisperModelHash); + rom.SetFieldValue(Models.Metadata.Rom.WhisperModelNameKey, file.WhisperModelName); + rom.SetFieldValue(Models.Metadata.Rom.WhisperVersionKey, file.WhisperVersion); + rom.SetFieldValue(Models.Metadata.Rom.WidthKey, file.Width); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval0To10Key, file.WordConfidenceInterval0To10); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval11To20Key, file.WordConfidenceInterval11To20); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval21To30Key, file.WordConfidenceInterval21To30); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval31To40Key, file.WordConfidenceInterval31To40); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval41To50Key, file.WordConfidenceInterval41To50); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval51To60Key, file.WordConfidenceInterval51To60); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval61To70Key, file.WordConfidenceInterval61To70); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval71To80Key, file.WordConfidenceInterval71To80); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval81To90Key, file.WordConfidenceInterval81To90); + rom.SetFieldValue(Models.Metadata.Rom.WordConfidenceInterval91To100Key, file.WordConfidenceInterval91To100); // Now process and add the rom rom.CopyMachineInformation(machine); diff --git a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs index 5b8e9fd2..441ae529 100644 --- a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs +++ b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Writer.cs @@ -33,11 +33,11 @@ namespace SabreTools.DatFiles.Formats switch (datItem) { case Rom rom: - if (rom.Size == null || rom.Size < 0) + if (rom.GetFieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue(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(Models.Metadata.Rom.CRCKey)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Rom.SourceKey), + BitTorrentMagnetHash = item.GetFieldValue(Models.Metadata.Rom.BitTorrentMagnetHashKey), + Size = item.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString(), + MD5 = item.GetFieldValue(Models.Metadata.Rom.MD5Key), + CRC32 = item.GetFieldValue(Models.Metadata.Rom.CRCKey), + SHA1 = item.GetFieldValue(Models.Metadata.Rom.SHA1Key), + FileCount = item.GetFieldValue(Models.Metadata.Rom.FileCountKey), + Format = item.GetFieldValue(Models.Metadata.Rom.FormatKey), + Original = item.GetFieldValue(Models.Metadata.Rom.OriginalKey), + Summation = item.GetFieldValue(Models.Metadata.Rom.SummationKey), + MatrixNumber = item.GetFieldValue(Models.Metadata.Rom.MatrixNumberKey), + CollectionCatalogNumber = item.GetFieldValue(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(Models.Metadata.Rom.ASRDetectedLangKey), + ASRDetectedLangConf = item.GetFieldValue(Models.Metadata.Rom.ASRDetectedLangConfKey), + ASRTranscribedLang = item.GetFieldValue(Models.Metadata.Rom.ASRTranscribedLangKey), + WhisperASRModuleVersion = item.GetFieldValue(Models.Metadata.Rom.WhisperASRModuleVersionKey), + WhisperModelHash = item.GetFieldValue(Models.Metadata.Rom.WhisperModelHashKey), + WhisperModelName = item.GetFieldValue(Models.Metadata.Rom.WhisperModelNameKey), + WhisperVersion = item.GetFieldValue(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(Models.Metadata.Rom.ClothCoverDetectionModuleVersionKey), + hOCRCharToWordhOCRVersion = item.GetFieldValue(Models.Metadata.Rom.hOCRCharToWordhOCRVersionKey), + hOCRCharToWordModuleVersion = item.GetFieldValue(Models.Metadata.Rom.hOCRCharToWordModuleVersionKey), + hOCRFtsTexthOCRVersion = item.GetFieldValue(Models.Metadata.Rom.hOCRFtsTexthOCRVersionKey), + hOCRFtsTextModuleVersion = item.GetFieldValue(Models.Metadata.Rom.hOCRFtsTextModuleVersionKey), + hOCRPageIndexhOCRVersion = item.GetFieldValue(Models.Metadata.Rom.hOCRPageIndexhOCRVersionKey), + hOCRPageIndexModuleVersion = item.GetFieldValue(Models.Metadata.Rom.hOCRPageIndexModuleVersionKey), + TesseractOCR = item.GetFieldValue(Models.Metadata.Rom.TesseractOCRKey), + TesseractOCRConverted = item.GetFieldValue(Models.Metadata.Rom.TesseractOCRConvertedKey), + TesseractOCRDetectedLang = item.GetFieldValue(Models.Metadata.Rom.TesseractOCRDetectedLangKey), + TesseractOCRDetectedLangConf = item.GetFieldValue(Models.Metadata.Rom.TesseractOCRDetectedLangConfKey), + TesseractOCRDetectedScript = item.GetFieldValue(fieldName: Models.Metadata.Rom.TesseractOCRDetectedScriptKey), + TesseractOCRDetectedScriptConf = item.GetFieldValue(Models.Metadata.Rom.TesseractOCRDetectedScriptConfKey), + TesseractOCRParameters = item.GetFieldValue(Models.Metadata.Rom.TesseractOCRParametersKey), + TesseractOCRModuleVersion = item.GetFieldValue(Models.Metadata.Rom.TesseractOCRModuleVersionKey), + PDFModuleVersion = item.GetFieldValue(Models.Metadata.Rom.PDFModuleVersionKey), + WordConfidenceInterval0To10 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval0To10Key), + WordConfidenceInterval11To20 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval11To20Key), + WordConfidenceInterval21To30 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval21To30Key), + WordConfidenceInterval31To40 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval31To40Key), + WordConfidenceInterval41To50 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval41To50Key), + WordConfidenceInterval51To60 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval51To60Key), + WordConfidenceInterval61To70 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval61To70Key), + WordConfidenceInterval71To80 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval71To80Key), + WordConfidenceInterval81To90 = item.GetFieldValue(Models.Metadata.Rom.WordConfidenceInterval81To90Key), + WordConfidenceInterval91To100 = item.GetFieldValue(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(Models.Metadata.Rom.AlbumKey), + Artist = item.GetFieldValue(Models.Metadata.Rom.ArtistKey), + Bitrate = item.GetFieldValue(Models.Metadata.Rom.BitrateKey), + Creator = item.GetFieldValue(Models.Metadata.Rom.CreatorKey), + Height = item.GetFieldValue(Models.Metadata.Rom.HeightKey), + Length = item.GetFieldValue(Models.Metadata.Rom.LengthKey), + PreviewImage = item.GetFieldValue(Models.Metadata.Rom.PreviewImageKey), + Rotation = item.GetFieldValue(Models.Metadata.Rom.RotationKey), + Title = item.GetFieldValue(Models.Metadata.Rom.TitleKey), + Track = item.GetFieldValue(Models.Metadata.Rom.TrackKey), + Width = item.GetFieldValue(Models.Metadata.Rom.WidthKey), }; - if (long.TryParse(item.Date ?? string.Empty, out long lastModifiedTime)) + if (long.TryParse(item.GetFieldValue(Models.Metadata.Rom.DateKey) ?? string.Empty, out long lastModifiedTime)) file.LastModifiedTime = lastModifiedTime.ToString(); return file; diff --git a/SabreTools.DatFiles/Formats/AttractMode.Reader.cs b/SabreTools.DatFiles/Formats/AttractMode.Reader.cs index ad0eb8e9..414e1974 100644 --- a/SabreTools.DatFiles/Formats/AttractMode.Reader.cs +++ b/SabreTools.DatFiles/Formats/AttractMode.Reader.cs @@ -65,41 +65,39 @@ namespace SabreTools.DatFiles.Formats if (row == null) return; + var machine = new Machine + { + Name = row.Name, + Description = row.Title, + CloneOf = row.CloneOf, + Year = row.Year, + Manufacturer = row.Manufacturer, + Category = row.Category, + Players = row.Players, + Rotation = row.Rotation, + Control = row.Control, + Status = row.Status, + DisplayCount = row.DisplayCount, + DisplayType = row.DisplayType, + Comment = row.Extra, + Buttons = row.Buttons + }; + var rom = new Rom() { - Size = Constants.SizeZero, - CRC = Constants.CRCZero, - MD5 = Constants.MD5Zero, - SHA1 = Constants.SHA1Zero, - ItemStatus = ItemStatus.None, - - Machine = new Machine - { - Name = row.Name, - Description = row.Title, - CloneOf = row.CloneOf, - Year = row.Year, - Manufacturer = row.Manufacturer, - Category = row.Category, - Players = row.Players, - Rotation = row.Rotation, - Control = row.Control, - Status = row.Status, - DisplayCount = row.DisplayCount, - DisplayType = row.DisplayType, - Comment = row.Extra, - Buttons = row.Buttons - }, - - AltName = row.AltRomname, - AltTitle = row.AltTitle, - // TODO: Add extended fields - Source = new Source { Index = indexId, Name = filename }, }; rom.SetName("-"); + rom.SetFieldValue(Models.Metadata.Rom.AltRomnameKey, row.AltRomname); + rom.SetFieldValue(Models.Metadata.Rom.AltTitleKey, row.AltTitle); + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, Constants.CRCZero); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, Constants.MD5Zero); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, Constants.SHA1Zero); + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero); + rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); // Now process and add the rom + rom.CopyMachineInformation(machine); ParseAddHelper(rom, statsOnly); } diff --git a/SabreTools.DatFiles/Formats/AttractMode.Writer.cs b/SabreTools.DatFiles/Formats/AttractMode.Writer.cs index f098c595..ce8fd6c5 100644 --- a/SabreTools.DatFiles/Formats/AttractMode.Writer.cs +++ b/SabreTools.DatFiles/Formats/AttractMode.Writer.cs @@ -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(Models.Metadata.Rom.AltRomnameKey), + AltTitle = rom.GetFieldValue(Models.Metadata.Rom.AltTitleKey), Extra = rom.Machine.Comment, Buttons = rom.Machine.Buttons, // TODO: Add extended fields diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs b/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs index ab3f33d5..4a05e326 100644 --- a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs +++ b/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs @@ -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(Models.Metadata.Release.DateKey, release.Date); + item.SetFieldValue(Models.Metadata.Release.DefaultKey, release.Default?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Release.LanguageKey, release.Language); + item.SetFieldValue(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(Models.Metadata.BiosSet.DefaultKey, biosset.Default?.AsYesNo()); + item.SetFieldValue(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.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(Models.Metadata.Rom.CRCKey, rom.CRC); + item.SetFieldValue(Models.Metadata.Rom.DateKey, rom.Date); + item.SetFieldValue(Models.Metadata.Rom.FlagsKey, rom.Flags); + item.SetFieldValue(Models.Metadata.Rom.HeaderKey, rom.Header); + item.SetFieldValue(Models.Metadata.Rom.InvertedKey, rom.Inverted?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Rom.MIAKey, rom.MIA?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Rom.MD5Key, rom.MD5); + item.SetFieldValue(Models.Metadata.Rom.MergeKey, rom.Merge); + item.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.Offs); + item.SetFieldValue(Models.Metadata.Rom.RegionKey, rom.Region); + item.SetFieldValue(Models.Metadata.Rom.SerialKey, rom.Serial); + item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.SHA1); + item.SetFieldValue(Models.Metadata.Rom.SHA256Key, rom.SHA256); + item.SetFieldValue(Models.Metadata.Rom.SHA384Key, rom.SHA384); + item.SetFieldValue(Models.Metadata.Rom.SHA512Key, rom.SHA512); + item.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size)); + item.SetFieldValue(Models.Metadata.Rom.SpamSumKey, rom.SpamSum); + item.SetFieldValue(Models.Metadata.Rom.StatusKey, rom.Status?.AsEnumValue() ?? ItemStatus.NULL); + item.SetFieldValue(Models.Metadata.Rom.xxHash364Key, rom.xxHash364); + item.SetFieldValue(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.NULL, - //Flags = disk.Flags, // TODO: Add to internal model - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(disk.Name); + item.SetFieldValue(Models.Metadata.Disk.FlagsKey, disk.Flags); + item.SetFieldValue(Models.Metadata.Disk.MD5Key, disk.MD5); + item.SetFieldValue(Models.Metadata.Disk.MergeKey, disk.Merge); + item.SetFieldValue(Models.Metadata.Disk.SHA1Key, disk.SHA1); + item.SetFieldValue(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue() ?? 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(Models.Metadata.Media.MD5Key, medium.MD5); + item.SetFieldValue(Models.Metadata.Media.SHA1Key, medium.SHA1); + item.SetFieldValue(Models.Metadata.Media.SHA256Key, medium.SHA256); + item.SetFieldValue(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.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(Models.Metadata.Chip.ChipTypeKey, chip.Type?.AsEnumValue() ?? ChipType.NULL); + item.SetFieldValue(Models.Metadata.Chip.ClockKey, NumberHelper.ConvertToInt64(chip.Clock)); + item.SetFieldValue(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.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("ASPECTX", NumberHelper.ConvertToInt64(video.AspectX)); + item.SetFieldValue("ASPECTY", NumberHelper.ConvertToInt64(video.AspectY)); + item.SetFieldValue(Models.Metadata.Display.DisplayTypeKey, video.Screen?.AsEnumValue() ?? DisplayType.NULL); + item.SetFieldValue(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(video.Y)); + item.SetFieldValue(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(video.Freq)); + item.SetFieldValue(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(video.X)); switch (video.Orientation) { case "horizontal": - item.Rotate = 0; + item.SetFieldValue(Models.Metadata.Display.RotateKey, 0); break; case "vertical": - item.Rotate = 90; + item.SetFieldValue(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(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(Models.Metadata.Input.CoinsKey, NumberHelper.ConvertToInt64(input.Coins)); + //item.SetFieldValue(Models.Metadata.Input.ControlKey, input.Control); + item.SetFieldValue(Models.Metadata.Input.PlayersKey, NumberHelper.ConvertToInt64(input.Players)); + item.SetFieldValue(Models.Metadata.Input.ServiceKey, input.Service?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Input.TiltKey, input.Tilt?.AsYesNo()); + + var control = new Control(); + control.SetFieldValue(Models.Metadata.Control.ButtonsKey, NumberHelper.ConvertToInt64(input.Buttons)); + + item.SetFieldValue(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(); 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(Models.Metadata.DipValue.DefaultKey, entry == dipswitch.Default); + dipValue.SetFieldValue(Models.Metadata.DipValue.ValueKey, entry); - item.Values.Add(dipValue); + values.Add(dipValue); } + item.SetFieldValue(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.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(Models.Metadata.Driver.BlitKey, driver.Blit); + item.SetFieldValue(Models.Metadata.Driver.ColorKey, driver.Color?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.PaletteSizeKey, NumberHelper.ConvertToInt64(driver.PaletteSize)); + item.SetFieldValue(Models.Metadata.Driver.SoundKey, driver.Sound?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.StatusKey, driver.Status?.AsEnumValue() ?? SupportStatus.NULL); item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs b/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs index 6ec2f587..e9a2233f 100644 --- a/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs +++ b/SabreTools.DatFiles/Formats/ClrMamePro.Writer.cs @@ -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(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(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(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue(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(Models.Metadata.Rom.CRCKey)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA384Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA512Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Disk.MD5Key)) + && string.IsNullOrEmpty(disk.GetFieldValue(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(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(Models.Metadata.Display.DisplayTypeKey) == DisplayType.NULL) missingFields.Add(Models.Metadata.Display.DisplayTypeKey); - if (!display.RotateSpecified) + if (display.GetFieldValue(Models.Metadata.Display.RotateKey) == null) missingFields.Add(Models.Metadata.Display.RotateKey); break; case Sound sound: - if (!sound.ChannelsSpecified) + if (sound.GetFieldValue(Models.Metadata.Sound.ChannelsKey) == null) missingFields.Add(Models.Metadata.Sound.ChannelsKey); break; case Input input: - if (!input.PlayersSpecified) + if (input.GetFieldValue(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(Models.Metadata.Driver.StatusKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.StatusKey); - if (!driver.EmulationSpecified) + if (driver.GetFieldValue(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(Models.Metadata.Release.RegionKey), + Language = item.GetFieldValue(Models.Metadata.Release.LanguageKey), + Date = item.GetFieldValue(Models.Metadata.Release.DateKey), + Default = item.GetFieldValue(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(Models.Metadata.BiosSet.DefaultKey).FromYesNo(), + Description = item.GetFieldValue(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(Models.Metadata.Rom.SizeKey)?.ToString(), + CRC = item.GetFieldValue(Models.Metadata.Rom.CRCKey), + MD5 = item.GetFieldValue(Models.Metadata.Rom.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Rom.SHA1Key), + SHA256 = item.GetFieldValue(Models.Metadata.Rom.SHA256Key), + SHA384 = item.GetFieldValue(Models.Metadata.Rom.SHA384Key), + SHA512 = item.GetFieldValue(Models.Metadata.Rom.SHA512Key), + SpamSum = item.GetFieldValue(Models.Metadata.Rom.SpamSumKey), + xxHash364 = item.GetFieldValue(Models.Metadata.Rom.xxHash364Key), + xxHash3128 = item.GetFieldValue(Models.Metadata.Rom.xxHash3128Key), + Merge = item.GetFieldValue(Models.Metadata.Rom.MergeKey), + Region = item.GetFieldValue(Models.Metadata.Rom.RegionKey), + Flags = item.GetFieldValue(Models.Metadata.Rom.FlagsKey), + Date = item.GetFieldValue(Models.Metadata.Rom.DateKey), + Offs = item.GetFieldValue(Models.Metadata.Rom.OffsetKey), + Serial = item.GetFieldValue(Models.Metadata.Rom.SerialKey), + Header = item.GetFieldValue(Models.Metadata.Rom.HeaderKey), + Inverted = item.GetFieldValue(Models.Metadata.Rom.InvertedKey).FromYesNo(), + MIA = item.GetFieldValue(Models.Metadata.Rom.MIAKey).FromYesNo(), }; if (item.ItemStatusSpecified) - rom.Status = item.ItemStatus.AsStringValue(useSecond: false); - if (item.InvertedSpecified) - rom.Inverted = item.Inverted.FromYesNo(); - if (item.MIASpecified) - rom.MIA = item.MIA.FromYesNo(); + rom.Status = item.GetFieldValue(Models.Metadata.Rom.StatusKey).AsStringValue(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(Models.Metadata.Disk.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Disk.SHA1Key), + Merge = item.GetFieldValue(Models.Metadata.Disk.MergeKey), + Flags = item.GetFieldValue(Models.Metadata.Disk.FlagsKey), }; - if (item.ItemStatusSpecified) - disk.Status = item.ItemStatus.AsStringValue(useSecond: false); + if (item.GetFieldValue(Models.Metadata.Disk.StatusKey) != ItemStatus.NULL) + disk.Status = item.GetFieldValue(Models.Metadata.Disk.StatusKey).AsStringValue(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(Models.Metadata.Media.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Media.SHA1Key), + SHA256 = item.GetFieldValue(Models.Metadata.Media.SHA256Key), + SpamSum = item.GetFieldValue(Models.Metadata.Media.SpamSumKey), }; return media; } @@ -470,10 +464,10 @@ namespace SabreTools.DatFiles.Formats { var chip = new Models.ClrMamePro.Chip { - Type = item.ChipType.AsStringValue(), + Type = item.GetFieldValue(Models.Metadata.Chip.ChipTypeKey).AsStringValue(), Name = item.GetName(), - //Flags = item.Flags, // TODO: Add to internal model - Clock = item.Clock?.ToString(), + Flags = item.GetFieldValue(Models.Metadata.Chip.FlagsKey), + Clock = item.GetFieldValue(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(), - 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(Models.Metadata.Display.DisplayTypeKey).AsStringValue(), + X = item.GetFieldValue(Models.Metadata.Display.WidthKey)?.ToString(), + Y = item.GetFieldValue(Models.Metadata.Display.HeightKey)?.ToString(), + AspectX = item.GetFieldValue("ASPECTX"), + AspectY = item.GetFieldValue("ASPECTY"), + Freq = item.GetFieldValue(Models.Metadata.Display.RefreshKey)?.ToString(), }; - switch (item.Rotate) + switch (item.GetFieldValue(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(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(Models.Metadata.Input.PlayersKey)?.ToString(), + //Control = item.GetFieldValue(Models.Metadata.Input.ControlKey), + Coins = item.GetFieldValue(Models.Metadata.Input.CoinsKey)?.ToString(), + Tilt = item.GetFieldValue(Models.Metadata.Input.TiltKey).FromYesNo(), + Service = item.GetFieldValue(Models.Metadata.Input.ServiceKey).FromYesNo(), }; if (item.ControlsSpecified) - input.Buttons = item.Controls![0].Buttons?.ToString(); + input.Buttons = item.GetFieldValue(Models.Metadata.Input.ControlKey)![0].GetFieldValue(Models.Metadata.Control.ButtonsKey)?.ToString(); return input; } @@ -553,11 +547,11 @@ namespace SabreTools.DatFiles.Formats if (item.ValuesSpecified) { var entries = new List(); - foreach (var setting in item.Values!) + foreach (var setting in item.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey)!) { - entries.Add(setting.Value!); - if (setting.Default == true) - dipswitch.Default = setting.Value; + entries.Add(setting.GetFieldValue(Models.Metadata.DipValue.ValueKey)!); + if (setting.GetFieldValue(Models.Metadata.DipValue.DefaultKey) == true) + dipswitch.Default = setting.GetFieldValue(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(), - //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(Models.Metadata.Driver.StatusKey).AsStringValue(), + Color = item.GetFieldValue(Models.Metadata.Driver.ColorKey).AsStringValue(), + Sound = item.GetFieldValue(Models.Metadata.Driver.SoundKey).AsStringValue(), + PaletteSize = item.GetFieldValue(Models.Metadata.Driver.PaletteSizeKey)?.ToString(), + Blit = item.GetFieldValue(Models.Metadata.Driver.BlitKey), }; return driver; } diff --git a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs b/SabreTools.DatFiles/Formats/DosCenter.Reader.cs index 55061ee6..bb8399b6 100644 --- a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs +++ b/SabreTools.DatFiles/Formats/DosCenter.Reader.cs @@ -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(Models.Metadata.Rom.CRCKey, file.CRC); + item.SetFieldValue(Models.Metadata.Rom.DateKey, file.Date); + item.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(file.Size)); item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); diff --git a/SabreTools.DatFiles/Formats/DosCenter.Writer.cs b/SabreTools.DatFiles/Formats/DosCenter.Writer.cs index b4f4af79..7db2af33 100644 --- a/SabreTools.DatFiles/Formats/DosCenter.Writer.cs +++ b/SabreTools.DatFiles/Formats/DosCenter.Writer.cs @@ -33,11 +33,11 @@ namespace SabreTools.DatFiles.Formats switch (datItem) { case Rom rom: - if (!rom.SizeSpecified) + if (rom.GetFieldValue(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(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(Models.Metadata.Rom.SizeKey)?.ToString(), + CRC = item.GetFieldValue(Models.Metadata.Rom.CRCKey), + Date = item.GetFieldValue(Models.Metadata.Rom.DateKey), }; return rom; } diff --git a/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs b/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs index c19300b7..fa427c23 100644 --- a/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs +++ b/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs @@ -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(Models.Metadata.Rom.CRCKey, row.CRC32); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, row.MD5); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, row.SHA1); + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, row.SHA256); + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size)); + rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); // Now process and add the rom rom.CopyMachineInformation(machine); diff --git a/SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs b/SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs index 08f1345e..de516642 100644 --- a/SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs +++ b/SabreTools.DatFiles/Formats/EverdriveSMDB.Writer.cs @@ -33,13 +33,13 @@ namespace SabreTools.DatFiles.Formats switch (datItem) { case Rom rom: - if (string.IsNullOrEmpty(rom.SHA256)) + if (string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key))) missingFields.Add(Models.Metadata.Rom.SHA256Key); - if (string.IsNullOrEmpty(rom.SHA1)) + if (string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key))) missingFields.Add(Models.Metadata.Rom.SHA1Key); - if (string.IsNullOrEmpty(rom.MD5)) + if (string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key))) missingFields.Add(Models.Metadata.Rom.MD5Key); - if (string.IsNullOrEmpty(rom.CRC)) + if (string.IsNullOrEmpty(rom.GetFieldValue(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(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(Models.Metadata.Rom.SHA1Key), + MD5 = rom.GetFieldValue(Models.Metadata.Rom.MD5Key), + CRC32 = rom.GetFieldValue(Models.Metadata.Rom.CRCKey), + Size = rom.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString(), }; return row; } diff --git a/SabreTools.DatFiles/Formats/Hashfile.Reader.cs b/SabreTools.DatFiles/Formats/Hashfile.Reader.cs index 4f490786..fd0d9b9e 100644 --- a/SabreTools.DatFiles/Formats/Hashfile.Reader.cs +++ b/SabreTools.DatFiles/Formats/Hashfile.Reader.cs @@ -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(Models.Metadata.Rom.CRCKey, sfv.Hash); + rom.SetFieldValue(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(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(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(Models.Metadata.Rom.MD5Key, md5.Hash); + rom.SetFieldValue(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(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(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(Models.Metadata.Rom.SHA1Key, sha1.Hash); + rom.SetFieldValue(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(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(Models.Metadata.Rom.SHA256Key, sha256.Hash); + rom.SetFieldValue(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(Models.Metadata.Rom.SHA384Key, sha384.Hash); + rom.SetFieldValue(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(Models.Metadata.Rom.SHA512Key, sha512.Hash); + rom.SetFieldValue(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(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(Models.Metadata.Rom.SizeKey, null); + rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, spamsum.Hash); rom.CopyMachineInformation(machine); ParseAddHelper(rom, statsOnly); diff --git a/SabreTools.DatFiles/Formats/Hashfile.Writer.cs b/SabreTools.DatFiles/Formats/Hashfile.Writer.cs index eed444f8..07061f7c 100644 --- a/SabreTools.DatFiles/Formats/Hashfile.Writer.cs +++ b/SabreTools.DatFiles/Formats/Hashfile.Writer.cs @@ -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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(Models.Metadata.Rom.SpamSumKey), File = name + rom.GetName(), }); break; diff --git a/SabreTools.DatFiles/Formats/Listrom.Reader.cs b/SabreTools.DatFiles/Formats/Listrom.Reader.cs index 110ed532..f6c51736 100644 --- a/SabreTools.DatFiles/Formats/Listrom.Reader.cs +++ b/SabreTools.DatFiles/Formats/Listrom.Reader.cs @@ -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(Models.Metadata.Disk.StatusKey, ItemStatus.None); if (!string.IsNullOrEmpty(row.MD5)) - disk.MD5 = row.MD5; + disk.SetFieldValue(Models.Metadata.Disk.MD5Key, row.MD5); else - disk.SHA1 = row.SHA1; + disk.SetFieldValue(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(Models.Metadata.Rom.CRCKey, row.CRC); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, row.SHA1); + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size)); + rom.SetFieldValue(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(Models.Metadata.Disk.StatusKey, value: ItemStatus.BadDump); if (!string.IsNullOrEmpty(row.MD5)) - disk.MD5 = row.MD5; + disk.SetFieldValue(Models.Metadata.Disk.MD5Key, row.MD5); else - disk.SHA1 = row.SHA1; + disk.SetFieldValue(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(Models.Metadata.Disk.MD5Key, null); + disk.SetFieldValue(Models.Metadata.Disk.SHA1Key, null); + disk.SetFieldValue(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(Models.Metadata.Rom.CRCKey, row.CRC); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, row.SHA1); + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size)); + rom.SetFieldValue(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(Models.Metadata.Rom.CRCKey, null); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, null); + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(row.Size)); + rom.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.Nodump); // Now process and add the item rom.CopyMachineInformation(machine); diff --git a/SabreTools.DatFiles/Formats/Listrom.Writer.cs b/SabreTools.DatFiles/Formats/Listrom.Writer.cs index 791b3f0b..95b5f6a5 100644 --- a/SabreTools.DatFiles/Formats/Listrom.Writer.cs +++ b/SabreTools.DatFiles/Formats/Listrom.Writer.cs @@ -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(Models.Metadata.Disk.MD5Key)) + && string.IsNullOrEmpty(disk.GetFieldValue(Models.Metadata.Disk.SHA1Key))) { missingFields.Add(Models.Metadata.Disk.SHA1Key); } break; case Rom rom: - if (rom.Size == null || rom.Size < 0) + if (rom.GetFieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue(Models.Metadata.Rom.SizeKey) < 0) missingFields.Add(Models.Metadata.Rom.SizeKey); - if (string.IsNullOrEmpty(rom.CRC)) + if (string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.CRCKey))) missingFields.Add(Models.Metadata.Rom.CRCKey); - if (string.IsNullOrEmpty(rom.SHA1)) + if (string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key))) missingFields.Add(Models.Metadata.Rom.SHA1Key); break; } @@ -166,7 +166,7 @@ namespace SabreTools.DatFiles.Formats /// private static Models.Listrom.Row? CreateRow(Disk disk) { - if (disk.ItemStatus == ItemStatus.Nodump) + if (disk.GetFieldValue(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(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(Models.Metadata.Disk.MD5Key))) + row.MD5 = disk.GetFieldValue(Models.Metadata.Disk.MD5Key); else - row.SHA1 = disk.SHA1; + row.SHA1 = disk.GetFieldValue(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(Models.Metadata.Disk.MD5Key))) + row.MD5 = disk.GetFieldValue(Models.Metadata.Disk.MD5Key); else - row.SHA1 = disk.SHA1; + row.SHA1 = disk.GetFieldValue(Models.Metadata.Disk.SHA1Key); return row; } @@ -210,24 +210,24 @@ namespace SabreTools.DatFiles.Formats /// private static Models.Listrom.Row? CreateRow(Rom rom) { - if (rom.ItemStatus == ItemStatus.Nodump) + if (rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump) { return new Models.Listrom.Row { Name = rom.GetName(), - Size = rom.Size?.ToString(), + Size = rom.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString(), NoGoodDumpKnown = true, }; } - else if (rom.ItemStatus == ItemStatus.BadDump) + else if (rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump) { return new Models.Listrom.Row { Name = rom.GetName(), - Size = rom.Size?.ToString(), + Size = rom.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString(), Bad = true, - CRC = rom.CRC, - SHA1 = rom.SHA1, + CRC = rom.GetFieldValue(Models.Metadata.Rom.CRCKey), + SHA1 = rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey)?.ToString(), + CRC = rom.GetFieldValue(Models.Metadata.Rom.CRCKey), + SHA1 = rom.GetFieldValue(Models.Metadata.Rom.SHA1Key), }; } } diff --git a/SabreTools.DatFiles/Formats/Listxml.Reader.cs b/SabreTools.DatFiles/Formats/Listxml.Reader.cs index ca811244..6ae1c5eb 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Reader.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Reader.cs @@ -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(Models.Metadata.BiosSet.DefaultKey, biosset.Default?.AsYesNo()); + item.SetFieldValue(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(), - 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(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size)); + item.SetFieldValue(Models.Metadata.Rom.BiosKey, rom.Bios); + item.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.CRC); + item.SetFieldValue(Models.Metadata.Rom.DisposeKey, rom.Dispose.AsYesNo()); + item.SetFieldValue(Models.Metadata.Rom.MergeKey, rom.Merge); + item.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.Offset); + item.SetFieldValue(Models.Metadata.Rom.OptionalKey, rom.Optional.AsYesNo()); + item.SetFieldValue(Models.Metadata.Rom.RegionKey, rom.Region); + item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.SHA1); + item.SetFieldValue(Models.Metadata.Rom.SoundOnlyKey, rom.SoundOnly.AsYesNo()); + item.SetFieldValue(Models.Metadata.Rom.StatusKey, rom.Status.AsEnumValue()); 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(), - Optional = disk.Optional.AsYesNo(), - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(disk.Name); + item.SetFieldValue(Models.Metadata.Disk.IndexKey, disk.Index); + item.SetFieldValue(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue() ?? ItemStatus.NULL); + item.SetFieldValue(Models.Metadata.Disk.MD5Key, disk.MD5); + item.SetFieldValue(Models.Metadata.Disk.MergeKey, disk.Merge); + item.SetFieldValue(Models.Metadata.Disk.OptionalKey, disk.Optional.AsYesNo()); + item.SetFieldValue(Models.Metadata.Disk.RegionKey, disk.Region); + item.SetFieldValue(Models.Metadata.Disk.SHA1Key, disk.SHA1); + item.SetFieldValue(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(), - //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(Models.Metadata.Chip.ChipTypeKey, chip.Type.AsEnumValue()); + item.SetFieldValue(Models.Metadata.Chip.ClockKey, NumberHelper.ConvertToInt64(chip.Clock)); + item.SetFieldValue(Models.Metadata.Chip.SoundOnlyKey, chip.Type.AsYesNo()); + item.SetFieldValue(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(), - 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(Models.Metadata.Display.DisplayTypeKey, display.Type.AsEnumValue()); + item.SetFieldValue(Models.Metadata.Display.FlipXKey, display.FlipX.AsYesNo()); + item.SetFieldValue(Models.Metadata.Display.HBEndKey, NumberHelper.ConvertToInt64(display.HBEnd)); + item.SetFieldValue(Models.Metadata.Display.HBStartKey, NumberHelper.ConvertToInt64(display.HBStart)); + item.SetFieldValue(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(display.Height)); + item.SetFieldValue(Models.Metadata.Display.HTotalKey, NumberHelper.ConvertToInt64(display.HTotal)); + item.SetFieldValue(Models.Metadata.Display.PixClockKey, NumberHelper.ConvertToInt64(display.PixClock)); + item.SetFieldValue(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(display.Refresh)); + item.SetFieldValue(Models.Metadata.Display.RotateKey, NumberHelper.ConvertToInt64(display.Rotate)); + item.SetFieldValue(Models.Metadata.Display.TagKey, display.Tag); + item.SetFieldValue(Models.Metadata.Display.VBEndKey, NumberHelper.ConvertToInt64(display.VBEnd)); + item.SetFieldValue(Models.Metadata.Display.VBStartKey, NumberHelper.ConvertToInt64(display.VBStart)); + item.SetFieldValue(Models.Metadata.Display.VTotalKey, NumberHelper.ConvertToInt64(display.VTotal)); + item.SetFieldValue(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.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("ASPECTX", NumberHelper.ConvertToInt64(video.AspectX)); + item.SetFieldValue("ASPECTY", NumberHelper.ConvertToInt64(video.AspectY)); + item.SetFieldValue(Models.Metadata.Display.DisplayTypeKey, video.Screen?.AsEnumValue() ?? DisplayType.NULL); + item.SetFieldValue(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(video.Height)); + item.SetFieldValue(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(video.Refresh)); + item.SetFieldValue(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(video.Width)); switch (video.Orientation) { case "horizontal": - item.Rotate = 0; + item.SetFieldValue(Models.Metadata.Display.RotateKey, 0); break; case "vertical": - item.Rotate = 90; + item.SetFieldValue(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(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(Models.Metadata.Input.ButtonsKey, NumberHelper.ConvertToInt64(input.Buttons)); + item.SetFieldValue(Models.Metadata.Input.CoinsKey, NumberHelper.ConvertToInt64(input.Coins)); + //item.SetFieldValue(Models.Metadata.Input.ControlKey, input.ControlAttr); + item.SetFieldValue(Models.Metadata.Input.PlayersKey, NumberHelper.ConvertToInt64(input.Players)); + item.SetFieldValue(Models.Metadata.Input.ServiceKey, input.Service?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Input.TiltKey, input.Tilt?.AsYesNo()); var controls = new List(); foreach (var control in input.Control ?? []) { - var controlItem = new Control - { - ControlType = control.Type.AsEnumValue(), - 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(Models.Metadata.Control.ButtonsKey, NumberHelper.ConvertToInt64(control.Buttons)); + controlItem.SetFieldValue(Models.Metadata.Control.ControlTypeKey, control.Type.AsEnumValue()); + controlItem.SetFieldValue(Models.Metadata.Control.KeyDeltaKey, NumberHelper.ConvertToInt64(control.KeyDelta)); + controlItem.SetFieldValue(Models.Metadata.Control.MaximumKey, NumberHelper.ConvertToInt64(control.Maximum)); + controlItem.SetFieldValue(Models.Metadata.Control.MinimumKey, NumberHelper.ConvertToInt64(control.Minimum)); + controlItem.SetFieldValue(Models.Metadata.Control.PlayerKey, NumberHelper.ConvertToInt64(control.Player)); + controlItem.SetFieldValue(Models.Metadata.Control.ReqButtonsKey, NumberHelper.ConvertToInt64(control.ReqButtons)); + controlItem.SetFieldValue(Models.Metadata.Control.ReverseKey, control.Reverse.AsYesNo()); + controlItem.SetFieldValue(Models.Metadata.Control.SensitivityKey, NumberHelper.ConvertToInt64(control.Sensitivity)); + controlItem.SetFieldValue(Models.Metadata.Control.WaysKey, control.Ways); + controlItem.SetFieldValue(Models.Metadata.Control.Ways2Key, control.Ways2); + controlItem.SetFieldValue(Models.Metadata.Control.Ways3Key, control.Ways3); + controls.Add(controlItem); } if (controls.Any()) - item.Controls = controls; + item.SetFieldValue(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(Models.Metadata.DipSwitch.MaskKey, dipswitch.Mask); + item.SetFieldValue(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(), - Value = dipswitch.Condition.Value, - }; - item.Conditions = [condition]; + var condition = new Condition(); + condition.SetFieldValue(Models.Metadata.Condition.MaskKey, dipswitch.Condition.Mask); + condition.SetFieldValue(Models.Metadata.Condition.RelationKey, dipswitch.Condition.Relation.AsEnumValue()); + condition.SetFieldValue(Models.Metadata.Condition.TagKey, dipswitch.Condition.Tag); + condition.SetFieldValue(Models.Metadata.Condition.ValueKey, dipswitch.Condition.Value); + + item.SetFieldValue(Models.Metadata.DipSwitch.ConditionKey, [condition]); } var locations = new List(); 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(Models.Metadata.DipLocation.InvertedKey, diplocation.Inverted.AsYesNo()); + locationItem.SetFieldValue(Models.Metadata.DipLocation.NumberKey, NumberHelper.ConvertToInt64(diplocation.Number)); locations.Add(locationItem); } if (locations.Any()) - item.Locations = locations; + item.SetFieldValue(Models.Metadata.DipSwitch.DipLocationKey, [.. locations]); var settings = new List(); 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(Models.Metadata.DipValue.DefaultKey, dipvalue.Default.AsYesNo()); + dipValueItem.SetFieldValue(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(), - Value = dipvalue.Condition.Value, - }; - dipValueItem.Conditions = [condition]; + var condition = new Condition(); + condition.SetFieldValue(Models.Metadata.Condition.MaskKey, dipvalue.Condition.Mask); + condition.SetFieldValue(Models.Metadata.Condition.RelationKey, dipvalue.Condition.Relation.AsEnumValue()); + condition.SetFieldValue(Models.Metadata.Condition.TagKey, dipvalue.Condition.Tag); + condition.SetFieldValue(Models.Metadata.Condition.ValueKey, dipvalue.Condition.Value); + + dipValueItem.SetFieldValue(Models.Metadata.DipValue.ConditionKey, [condition]); } settings.Add(dipValueItem); } if (settings.Any()) - item.Values = settings; + item.SetFieldValue(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(Models.Metadata.Configuration.MaskKey, configuration.Mask); + item.SetFieldValue(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(), - Value = configuration.Condition.Value, - }; - item.Conditions = [condition]; + var condition = new DatItems.Formats.Condition(); + condition.SetFieldValue(Models.Metadata.Condition.MaskKey, configuration.Condition.Mask); + condition.SetFieldValue(Models.Metadata.Condition.RelationKey, configuration.Condition.Relation.AsEnumValue()); + condition.SetFieldValue(Models.Metadata.Condition.TagKey, configuration.Condition.Tag); + condition.SetFieldValue(Models.Metadata.Condition.ValueKey, configuration.Condition.Value); + + item.SetFieldValue(Models.Metadata.Configuration.ConditionKey, [condition]); } var locations = new List(); 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(Models.Metadata.ConfLocation.InvertedKey, confLocation.Inverted.AsYesNo()); + locationItem.SetFieldValue(Models.Metadata.ConfLocation.NumberKey, NumberHelper.ConvertToInt64(confLocation.Number)); + locations.Add(locationItem); } if (locations.Any()) - item.Locations = locations; + item.SetFieldValue(Models.Metadata.Configuration.ConfLocationKey, [.. locations]); var settings = new List(); 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(Models.Metadata.ConfSetting.DefaultKey, dipvalue.Default.AsYesNo()); + settingItem.SetFieldValue(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(), - Value = dipvalue.Condition.Value, - }; - settingItem.Conditions = [condition]; + var condition = new Condition(); + condition.SetFieldValue(Models.Metadata.Condition.MaskKey, dipvalue.Condition.Mask); + condition.SetFieldValue(Models.Metadata.Condition.RelationKey, dipvalue.Condition.Relation.AsEnumValue()); + condition.SetFieldValue(Models.Metadata.Condition.TagKey, dipvalue.Condition.Tag); + condition.SetFieldValue(Models.Metadata.Condition.ValueKey, dipvalue.Condition.Value); + + settingItem.SetFieldValue(Models.Metadata.ConfSetting.ConditionKey, [condition]); } settings.Add(settingItem); } if (settings.Any()) - item.Settings = settings; + item.SetFieldValue(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(Models.Metadata.Port.TagKey, port.Tag); var analogs = new List(); foreach (var analog in port.Analog ?? []) { - var analogItem = new Analog - { - Mask = analog.Mask, - }; + var analogItem = new Analog(); + analogItem.SetFieldValue(Models.Metadata.Analog.MaskKey, analog.Mask); + analogs.Add(analogItem); } if (analogs.Any()) - item.Analogs = analogs; + item.SetFieldValue(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(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(), - Value = adjuster.Condition.Value, - }; + var condition = new Condition(); + condition.SetFieldValue(Models.Metadata.Condition.MaskKey, adjuster.Condition.Mask); + condition.SetFieldValue(Models.Metadata.Condition.RelationKey, adjuster.Condition.Relation.AsEnumValue()); + condition.SetFieldValue(Models.Metadata.Condition.TagKey, adjuster.Condition.Tag); + condition.SetFieldValue(Models.Metadata.Condition.ValueKey, adjuster.Condition.Value); + item.SetFieldValue(Models.Metadata.Adjuster.ConditionKey, [condition]); } @@ -801,20 +779,19 @@ namespace SabreTools.DatFiles.Formats containsItems = true; var item = new Driver { - Status = driver.Status.AsEnumValue(), - //Color = driver.Color.AsEnumValue(), // TODO: Add to internal model - //Sound = driver.Sound.AsEnumValue(), // TODO: Add to internal model - //PaletteSize = NumberHelper.ConvertToInt64(driver.PaletteSize), // TODO: Add to internal model - Emulation = driver.Emulation.AsEnumValue(), - Cocktail = driver.Cocktail.AsEnumValue(), - SaveState = driver.SaveState.AsEnumValue(), - 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(Models.Metadata.Driver.CocktailKey, driver.Cocktail?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.ColorKey, driver.Color?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.EmulationKey, driver.Emulation?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.IncompleteKey, driver.Incomplete.AsYesNo()); + item.SetFieldValue(Models.Metadata.Driver.NoSoundHardwareKey, driver.NoSoundHardware.AsYesNo()); + item.SetFieldValue(Models.Metadata.Driver.PaletteSizeKey, NumberHelper.ConvertToInt64(driver.PaletteSize)); + item.SetFieldValue(Models.Metadata.Driver.RequiresArtworkKey, driver.RequiresArtwork.AsYesNo()); + item.SetFieldValue(Models.Metadata.Driver.SaveStateKey, driver.SaveState?.AsEnumValue() ?? Supported.NULL); + item.SetFieldValue(Models.Metadata.Driver.SoundKey, driver.Sound?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.StatusKey, driver.Status?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(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(), - Status = feature.Status.AsEnumValue(), - Overall = feature.Overall.AsEnumValue(), - Source = new Source { Index = indexId, Name = filename }, }; + item.SetFieldValue(Models.Metadata.Feature.FeatureTypeKey, feature.Type.AsEnumValue()); + item.SetFieldValue(Models.Metadata.Feature.OverallKey, feature.Overall.AsEnumValue()); + item.SetFieldValue(Models.Metadata.Feature.StatusKey, feature.Status.AsEnumValue()); item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); @@ -872,23 +848,21 @@ namespace SabreTools.DatFiles.Formats { var item = new Device { - DeviceType = device.Type.AsEnumValue(), - Tag = device.Tag, - FixedImage = device.FixedImage, - Mandatory = NumberHelper.ConvertToInt64(device.Mandatory), - Interface = device.Interface, - Source = new Source { Index = indexId, Name = filename }, }; + item.SetFieldValue(Models.Metadata.Device.DeviceTypeKey, device.Type.AsEnumValue()); + item.SetFieldValue(Models.Metadata.Device.FixedImageKey, device.FixedImage); + item.SetFieldValue(Models.Metadata.Device.InterfaceKey, device.Interface); + item.SetFieldValue(Models.Metadata.Device.MandatoryKey, NumberHelper.ConvertToInt64(device.Mandatory)); + item.SetFieldValue(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(Models.Metadata.Instance.BriefNameKey, device.Instance.BriefName); + + item.SetFieldValue(Models.Metadata.Device.InstanceKey, [instance]); } var extensions = new List(); @@ -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(Models.Metadata.Device.ExtensionKey, extensions.ToArray()); item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); @@ -934,17 +909,16 @@ namespace SabreTools.DatFiles.Formats var slotoptions = new List(); 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(Models.Metadata.SlotOption.DefaultKey, slotoption.Default.AsYesNo()); + slotoptionItem.SetFieldValue(Models.Metadata.SlotOption.DevNameKey, slotoption.DevName); + slotoptions.Add(slotoptionItem); } if (slotoptions.Any()) - item.SlotOptions = slotoptions; + item.SetFieldValue(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(), - Filter = softwarelist.Filter, - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(softwarelist.Name); + item.SetFieldValue(Models.Metadata.SoftwareList.FilterKey, softwarelist.Filter); + item.SetFieldValue(Models.Metadata.SoftwareList.StatusKey, softwarelist.Status.AsEnumValue()); + item.SetFieldValue(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(Models.Metadata.RamOption.ContentKey, ramoption.Content); + item.SetFieldValue(Models.Metadata.RamOption.DefaultKey, ramoption.Default.AsYesNo()); item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); diff --git a/SabreTools.DatFiles/Formats/Listxml.Writer.cs b/SabreTools.DatFiles/Formats/Listxml.Writer.cs index 2be98ed5..496b8a52 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Writer.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Writer.cs @@ -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(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(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue(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(Models.Metadata.Rom.CRCKey)) + && string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Disk.MD5Key)) + && string.IsNullOrEmpty(disk.GetFieldValue(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(Models.Metadata.Chip.ChipTypeKey) == ChipType.NULL) missingFields.Add(Models.Metadata.Chip.ChipTypeKey); break; case Display display: - if (!display.DisplayTypeSpecified) + if (display.GetFieldValue(Models.Metadata.Display.DisplayTypeKey) == DisplayType.NULL) missingFields.Add(Models.Metadata.Display.DisplayTypeKey); - if (display.Refresh == null) + if (display.GetFieldValue(Models.Metadata.Display.RefreshKey) == null) missingFields.Add(Models.Metadata.Display.RefreshKey); break; case Sound sound: - if (sound.Channels == null) + if (sound.GetFieldValue(Models.Metadata.Sound.ChannelsKey) == null) missingFields.Add(Models.Metadata.Sound.ChannelsKey); break; case Input input: - if (input.Players == null) + if (input.GetFieldValue(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(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(Models.Metadata.Configuration.TagKey))) missingFields.Add(Models.Metadata.Configuration.TagKey); break; case Port port: - if (string.IsNullOrEmpty(port.Tag)) + if (string.IsNullOrEmpty(port.GetFieldValue(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(Models.Metadata.Driver.StatusKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.StatusKey); - if (!driver.EmulationSpecified) + if (driver.GetFieldValue(Models.Metadata.Driver.EmulationKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.EmulationKey); - if (!driver.CocktailSpecified) + if (driver.GetFieldValue(Models.Metadata.Driver.CocktailKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.CocktailKey); - if (!driver.SaveStateSpecified) + if (driver.GetFieldValue(Models.Metadata.Driver.SaveStateKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.SaveStateKey); break; case Feature feature: - if (!feature.TypeSpecified) + if (feature.GetFieldValue(Models.Metadata.Feature.FeatureTypeKey) == FeatureType.NULL) missingFields.Add(Models.Metadata.Feature.FeatureTypeKey); break; case Device device: - if (!device.DeviceTypeSpecified) + if (device.GetFieldValue(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(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(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(Models.Metadata.BiosSet.DefaultKey).FromYesNo(), + Description = item.GetFieldValue(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(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(Models.Metadata.Rom.BiosKey), + Size = item.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString(), + CRC = item.GetFieldValue(Models.Metadata.Rom.CRCKey), + SHA1 = item.GetFieldValue(Models.Metadata.Rom.SHA1Key), + Merge = item.GetFieldValue(Models.Metadata.Rom.MergeKey), + Region = item.GetFieldValue(Models.Metadata.Rom.RegionKey), + Offset = item.GetFieldValue(Models.Metadata.Rom.OffsetKey), + Status = item.GetFieldValue(Models.Metadata.Rom.StatusKey).AsStringValue(useSecond: false), + Optional = item.GetFieldValue(Models.Metadata.Rom.OptionalKey).FromYesNo(), + Dispose = item.GetFieldValue(Models.Metadata.Rom.DisposeKey).FromYesNo(), + SoundOnly = item.GetFieldValue(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(useSecond: false), - Optional = item.Optional.FromYesNo(), + MD5 = item.GetFieldValue(Models.Metadata.Disk.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Disk.SHA1Key), + Merge = item.GetFieldValue(Models.Metadata.Disk.MergeKey), + Region = item.GetFieldValue(Models.Metadata.Disk.RegionKey), + Index = item.GetFieldValue(Models.Metadata.Disk.IndexKey), + Writable = item.GetFieldValue(Models.Metadata.Disk.WritableKey).FromYesNo(), + Status = item.GetFieldValue(Models.Metadata.Disk.StatusKey).AsStringValue(useSecond: false), + Optional = item.GetFieldValue(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(), - //SoundOnly = item.SoundOnly, // TODO: Add to internal model - Clock = item.Clock?.ToString(), + Tag = item.GetFieldValue(Models.Metadata.Chip.TagKey), + Type = item.GetFieldValue(Models.Metadata.Chip.ChipTypeKey).AsStringValue(), + SoundOnly = item.GetFieldValue(Models.Metadata.Chip.SoundOnlyKey).FromYesNo(), + Clock = item.GetFieldValue(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(), - 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(Models.Metadata.Display.TagKey), + Type = item.GetFieldValue(Models.Metadata.Display.DisplayTypeKey).AsStringValue(), + Rotate = item.GetFieldValue(Models.Metadata.Display.RotateKey)?.ToString(), + FlipX = item.GetFieldValue(Models.Metadata.Display.FlipXKey).FromYesNo(), + Width = item.GetFieldValue(Models.Metadata.Display.WidthKey)?.ToString(), + Height = item.GetFieldValue(Models.Metadata.Display.HeightKey)?.ToString(), + Refresh = item.GetFieldValue(Models.Metadata.Display.RefreshKey)?.ToString(), + PixClock = item.GetFieldValue(Models.Metadata.Display.PixClockKey)?.ToString(), + HTotal = item.GetFieldValue(Models.Metadata.Display.HTotalKey)?.ToString(), + HBEnd = item.GetFieldValue(Models.Metadata.Display.HBEndKey)?.ToString(), + HBStart = item.GetFieldValue(Models.Metadata.Display.HBStartKey)?.ToString(), + VTotal = item.GetFieldValue(Models.Metadata.Display.VTotalKey)?.ToString(), + VBEnd = item.GetFieldValue(Models.Metadata.Display.VBEndKey)?.ToString(), + VBStart = item.GetFieldValue(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(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(Models.Metadata.Input.ServiceKey).FromYesNo(), + Tilt = item.GetFieldValue(Models.Metadata.Input.TiltKey).FromYesNo(), + Players = item.GetFieldValue(Models.Metadata.Input.PlayersKey)?.ToString(), + //ControlAttr = item.GetFieldValue(Models.Metadata.Input.ControlKey), + Buttons = item.GetFieldValue(Models.Metadata.Input.ButtonsKey)?.ToString(), + Coins = item.GetFieldValue(Models.Metadata.Input.CoinsKey)?.ToString(), }; var controls = new List(); - foreach (var controlItem in item.Controls ?? []) + foreach (var controlItem in item.GetFieldValue(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(), - 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(Models.Metadata.Control.ControlTypeKey).AsStringValue(), + Player = item.GetFieldValue(Models.Metadata.Control.PlayerKey)?.ToString(), + Buttons = item.GetFieldValue(Models.Metadata.Control.ButtonsKey)?.ToString(), + ReqButtons = item.GetFieldValue(Models.Metadata.Control.ReqButtonsKey)?.ToString(), + Minimum = item.GetFieldValue(Models.Metadata.Control.MinimumKey)?.ToString(), + Maximum = item.GetFieldValue(Models.Metadata.Control.MaximumKey)?.ToString(), + Sensitivity = item.GetFieldValue(Models.Metadata.Control.SensitivityKey)?.ToString(), + KeyDelta = item.GetFieldValue(Models.Metadata.Control.KeyDeltaKey)?.ToString(), + Reverse = item.GetFieldValue(Models.Metadata.Control.ReverseKey).FromYesNo(), + Ways = item.GetFieldValue(Models.Metadata.Control.WaysKey), + Ways2 = item.GetFieldValue(Models.Metadata.Control.Ways2Key), + Ways3 = item.GetFieldValue(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(Models.Metadata.DipSwitch.TagKey), + Mask = item.GetFieldValue(Models.Metadata.DipSwitch.MaskKey), }; if (item.ConditionsSpecified) { - var conditionItem = item.Conditions?.FirstOrDefault(); + var conditionItem = item.GetFieldValue(Models.Metadata.DipSwitch.ConditionKey)?.FirstOrDefault(); var condition = new Models.Listxml.Condition { - Tag = conditionItem?.Tag, - Mask = conditionItem?.Mask, - Relation = conditionItem?.Relation.AsStringValue(), - Value = conditionItem?.Value, + Tag = conditionItem?.GetFieldValue(Models.Metadata.Condition.TagKey), + Mask = conditionItem?.GetFieldValue(Models.Metadata.Condition.MaskKey), + Relation = conditionItem?.GetFieldValue(Models.Metadata.Condition.RelationKey).AsStringValue(), + Value = conditionItem?.GetFieldValue(Models.Metadata.Condition.ValueKey), }; dipswitch.Condition = condition; } var diplocations = new List(); - foreach (var locationItem in item.Locations ?? []) + foreach (var locationItem in item.GetFieldValue(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(); - foreach (var dipValueItem in item.Values ?? []) + foreach (var dipValueItem in item.GetFieldValue(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(Models.Metadata.DipLocation.NumberKey)?.ToString(), + Inverted = item.GetFieldValue(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(Models.Metadata.DipValue.ValueKey), + Default = item.GetFieldValue(Models.Metadata.DipValue.DefaultKey).FromYesNo(), }; if (item.ConditionsSpecified) { - var conditionItem = item.Conditions?.FirstOrDefault(); + var conditionItem = item.GetFieldValue(Models.Metadata.DipValue.ConditionKey)?.FirstOrDefault(); var condition = new Models.Listxml.Condition { - Tag = conditionItem?.Tag, - Mask = conditionItem?.Mask, - Relation = conditionItem?.Relation.AsStringValue(), - Value = conditionItem?.Value, + Tag = conditionItem?.GetFieldValue(Models.Metadata.Condition.TagKey), + Mask = conditionItem?.GetFieldValue(Models.Metadata.Condition.MaskKey), + Relation = conditionItem?.GetFieldValue(Models.Metadata.Condition.RelationKey).AsStringValue(), + Value = conditionItem?.GetFieldValue(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(Models.Metadata.Configuration.TagKey), + Mask = item.GetFieldValue(Models.Metadata.Configuration.MaskKey), }; if (item.ConditionsSpecified) { - var conditionItem = item.Conditions?.FirstOrDefault(); + var conditionItem = item.GetFieldValue(Models.Metadata.Configuration.ConditionKey)?.FirstOrDefault(); var condition = new Models.Listxml.Condition { - Tag = conditionItem?.Tag, - Mask = conditionItem?.Mask, - Relation = conditionItem?.Relation.AsStringValue(), - Value = conditionItem?.Value, + Tag = conditionItem?.GetFieldValue(Models.Metadata.Condition.TagKey), + Mask = conditionItem?.GetFieldValue(Models.Metadata.Condition.MaskKey), + Relation = conditionItem?.GetFieldValue(Models.Metadata.Condition.RelationKey).AsStringValue(), + Value = conditionItem?.GetFieldValue(Models.Metadata.Condition.ValueKey), }; configuration.Condition = condition; } var confLocations = new List(); - foreach (var location in item.Locations ?? []) + foreach (var location in item.GetFieldValue(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(); - foreach (var confSettingItem in item.Settings ?? []) + foreach (var confSettingItem in item.GetFieldValue(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(Models.Metadata.ConfLocation.NumberKey)?.ToString(), + Inverted = item.GetFieldValue(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(Models.Metadata.ConfSetting.ValueKey), + Default = item.GetFieldValue(Models.Metadata.ConfSetting.DefaultKey).FromYesNo(), }; if (item.ConditionsSpecified) { - var conditionItem = item.Conditions?.FirstOrDefault(); + var conditionItem = item.GetFieldValue(Models.Metadata.ConfSetting.ConditionKey)?.FirstOrDefault(); var condition = new Models.Listxml.Condition { - Tag = conditionItem?.Tag, - Mask = conditionItem?.Mask, - Relation = conditionItem?.Relation.AsStringValue(), - Value = conditionItem?.Value, + Tag = conditionItem?.GetFieldValue(Models.Metadata.Condition.TagKey), + Mask = conditionItem?.GetFieldValue(Models.Metadata.Condition.MaskKey), + Relation = conditionItem?.GetFieldValue(Models.Metadata.Condition.RelationKey).AsStringValue(), + Value = conditionItem?.GetFieldValue(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(Models.Metadata.Port.TagKey), }; return port; @@ -811,10 +808,10 @@ namespace SabreTools.DatFiles.Formats var conditionItem = item.GetFieldValue(Models.Metadata.Adjuster.ConditionKey)?.FirstOrDefault(); var condition = new Models.Listxml.Condition { - Tag = conditionItem?.Tag, - Mask = conditionItem?.Mask, - Relation = conditionItem?.Relation.AsStringValue(), - Value = conditionItem?.Value, + Tag = conditionItem?.GetFieldValue(Models.Metadata.Condition.TagKey), + Mask = conditionItem?.GetFieldValue(Models.Metadata.Condition.MaskKey), + Relation = conditionItem?.GetFieldValue(Models.Metadata.Condition.RelationKey).AsStringValue(), + Value = conditionItem?.GetFieldValue(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(), - //Color = item.Color.AsStringValue(), // TODO: Add to internal model - //Sound = item.Sound.AsStringValue(), // TODO: Add to internal model - //PaletteSize = driver.PaletteSize?.ToString(), // TODO: Add to internal model - Emulation = item.Emulation.AsStringValue(), - Cocktail = item.Cocktail.AsStringValue(), - SaveState = item.SaveState.AsStringValue(useSecond: true), - RequiresArtwork = item.RequiresArtwork.FromYesNo(), - Unofficial = item.Unofficial.FromYesNo(), - NoSoundHardware = item.NoSoundHardware.FromYesNo(), - Incomplete = item.Incomplete.FromYesNo(), + Status = item.GetFieldValue(Models.Metadata.Driver.StatusKey).AsStringValue(), + Color = item.GetFieldValue(Models.Metadata.Driver.ColorKey).AsStringValue(), + Sound = item.GetFieldValue(Models.Metadata.Driver.SoundKey).AsStringValue(), + PaletteSize = item.GetFieldValue(Models.Metadata.Driver.PaletteSizeKey)?.ToString(), + Emulation = item.GetFieldValue(Models.Metadata.Driver.EmulationKey).AsStringValue(), + Cocktail = item.GetFieldValue(Models.Metadata.Driver.CocktailKey).AsStringValue(), + SaveState = item.GetFieldValue(Models.Metadata.Driver.SaveStateKey).AsStringValue(useSecond: true), + RequiresArtwork = item.GetFieldValue(Models.Metadata.Driver.RequiresArtworkKey).FromYesNo(), + Unofficial = item.GetFieldValue(Models.Metadata.Driver.UnofficialKey).FromYesNo(), + NoSoundHardware = item.GetFieldValue(Models.Metadata.Driver.NoSoundHardwareKey).FromYesNo(), + Incomplete = item.GetFieldValue(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(), - Status = item.Status.AsStringValue(), - Overall = item.Overall.AsStringValue(), + Type = item.GetFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsStringValue(), + Status = item.GetFieldValue(Models.Metadata.Feature.StatusKey).AsStringValue(), + Overall = item.GetFieldValue(Models.Metadata.Feature.OverallKey).AsStringValue(), }; return feature; @@ -867,26 +864,26 @@ namespace SabreTools.DatFiles.Formats { var device = new Models.Listxml.Device { - Type = item.DeviceType.AsStringValue(), - Tag = item.Tag, - FixedImage = item.FixedImage, - Mandatory = item.Mandatory?.ToString(), - Interface = item.Interface, + Type = item.GetFieldValue(Models.Metadata.Device.DeviceTypeKey).AsStringValue(), + Tag = item.GetFieldValue(Models.Metadata.Device.TagKey), + FixedImage = item.GetFieldValue(Models.Metadata.Device.FixedImageKey), + Mandatory = item.GetFieldValue(Models.Metadata.Device.MandatoryKey)?.ToString(), + Interface = item.GetFieldValue(Models.Metadata.Device.InterfaceKey), }; if (item.InstancesSpecified) { - var instanceItem = item.Instances?.FirstOrDefault(); + var instanceItem = item.GetFieldValue(Models.Metadata.Device.InstanceKey)?.FirstOrDefault(); var instance = new Models.Listxml.Instance { Name = instanceItem?.GetName(), - BriefName = instanceItem?.BriefName, + BriefName = instanceItem?.GetFieldValue(Models.Metadata.Instance.BriefNameKey), }; device.Instance = instance; } var extensions = new List(); - foreach (var extensionItem in item.Extensions ?? []) + foreach (var extensionItem in item.GetFieldValue(Models.Metadata.Device.ExtensionKey) ?? []) { var extension = new Models.Listxml.Extension { @@ -912,13 +909,13 @@ namespace SabreTools.DatFiles.Formats }; var slotoptions = new List(); - foreach (var slotoptionItem in item.SlotOptions ?? []) + foreach (var slotoptionItem in item.GetFieldValue(Models.Metadata.Slot.SlotOptionKey) ?? []) { var slotoption = new Models.Listxml.SlotOption { Name = slotoptionItem.GetName(), - DevName = slotoptionItem.DeviceName, - Default = slotoptionItem.Default.FromYesNo(), + DevName = slotoptionItem.GetFieldValue(Models.Metadata.SlotOption.DevNameKey), + Default = slotoptionItem.GetFieldValue(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(Models.Metadata.SoftwareList.TagKey), Name = item.GetName(), - Status = item.Status.AsStringValue(), - Filter = item.Filter, + Status = item.GetFieldValue(Models.Metadata.SoftwareList.StatusKey).AsStringValue(), + Filter = item.GetFieldValue(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(Models.Metadata.RamOption.DefaultKey).FromYesNo(), + Content = item.GetFieldValue(Models.Metadata.RamOption.ContentKey), }; return softwarelist; diff --git a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs index 686c3af1..4b155d17 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs @@ -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(Models.Metadata.Release.DateKey, release.Date); + item.SetFieldValue(Models.Metadata.Release.DefaultKey, release.Default?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Release.LanguageKey, release.Language); + item.SetFieldValue(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(Models.Metadata.BiosSet.DefaultKey, biosset.Default?.AsYesNo()); + item.SetFieldValue(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.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(Models.Metadata.Rom.CRCKey, rom.CRC); + item.SetFieldValue(Models.Metadata.Rom.DateKey, rom.Date); + item.SetFieldValue(Models.Metadata.Rom.HeaderKey, rom.Header); + item.SetFieldValue(Models.Metadata.Rom.InvertedKey, rom.Inverted?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Rom.MIAKey, rom.MIA?.AsYesNo()); + item.SetFieldValue(Models.Metadata.Rom.MD5Key, rom.MD5); + item.SetFieldValue(Models.Metadata.Rom.MergeKey, rom.Merge); + item.SetFieldValue(Models.Metadata.Rom.SerialKey, rom.Serial); + item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.SHA1); + item.SetFieldValue(Models.Metadata.Rom.SHA256Key, rom.SHA256); + item.SetFieldValue(Models.Metadata.Rom.SHA384Key, rom.SHA384); + item.SetFieldValue(Models.Metadata.Rom.SHA512Key, rom.SHA512); + item.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size)); + item.SetFieldValue(Models.Metadata.Rom.SpamSumKey, rom.SpamSum); + item.SetFieldValue(Models.Metadata.Rom.StatusKey, rom.Status?.AsEnumValue() ?? ItemStatus.NULL); + item.SetFieldValue(Models.Metadata.Rom.xxHash364Key, rom.xxHash364); + item.SetFieldValue(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.NULL, - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(disk.Name); + item.SetFieldValue(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue() ?? ItemStatus.NULL); + item.SetFieldValue(Models.Metadata.Disk.MD5Key, disk.MD5); + item.SetFieldValue(Models.Metadata.Disk.MergeKey, disk.Merge); + item.SetFieldValue(Models.Metadata.Disk.RegionKey, disk.Region); + item.SetFieldValue(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(Models.Metadata.Media.MD5Key, medium.MD5); + item.SetFieldValue(Models.Metadata.Media.SHA1Key, medium.SHA1); + item.SetFieldValue(Models.Metadata.Media.SHA256Key, medium.SHA256); + item.SetFieldValue(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.NULL, - Emulation = driver.Emulation?.AsEnumValue() ?? SupportStatus.NULL, - Cocktail = driver.Cocktail?.AsEnumValue() ?? SupportStatus.NULL, - SaveState = driver.SaveState?.AsEnumValue() ?? 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(Models.Metadata.Driver.CocktailKey, driver.Cocktail?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.EmulationKey, driver.Emulation?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(Models.Metadata.Driver.IncompleteKey, driver.Incomplete.AsYesNo()); + item.SetFieldValue(Models.Metadata.Driver.NoSoundHardwareKey, driver.NoSoundHardware.AsYesNo()); + item.SetFieldValue(Models.Metadata.Driver.RequiresArtworkKey, driver.RequiresArtwork.AsYesNo()); + item.SetFieldValue(Models.Metadata.Driver.SaveStateKey, driver.SaveState?.AsEnumValue() ?? Supported.NULL); + item.SetFieldValue(Models.Metadata.Driver.StatusKey, driver.Status?.AsEnumValue() ?? SupportStatus.NULL); + item.SetFieldValue(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.None, - Filter = softwarelist.Filter, - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(softwarelist.Name); + item.SetFieldValue(Models.Metadata.SoftwareList.FilterKey, softwarelist.Filter); + item.SetFieldValue(Models.Metadata.SoftwareList.StatusKey, softwarelist.Status.AsEnumValue()); + item.SetFieldValue(Models.Metadata.SoftwareList.TagKey, softwarelist.Tag); item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); diff --git a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs index cb2a2536..6a4a3985 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs @@ -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(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(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(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue(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(Models.Metadata.Rom.CRCKey)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA384Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA512Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Disk.MD5Key)) + && string.IsNullOrEmpty(disk.GetFieldValue(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(Models.Metadata.Media.MD5Key)) + && string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA1Key)) + && string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA256Key)) + && string.IsNullOrEmpty(media.GetFieldValue(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(Models.Metadata.Driver.StatusKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.StatusKey); - if (!driver.EmulationSpecified) + if (driver.GetFieldValue(Models.Metadata.Driver.EmulationKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.EmulationKey); - if (!driver.CocktailSpecified) + if (driver.GetFieldValue(Models.Metadata.Driver.CocktailKey) == SupportStatus.NULL) missingFields.Add(Models.Metadata.Driver.CocktailKey); - if (!driver.SaveStateSpecified) + if (driver.GetFieldValue(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(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(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(Models.Metadata.Release.RegionKey), + Language = item.GetFieldValue(Models.Metadata.Release.LanguageKey), + Date = item.GetFieldValue(Models.Metadata.Release.DateKey), + Default = item.GetFieldValue(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(Models.Metadata.BiosSet.DefaultKey).FromYesNo(), + Description = item.GetFieldValue(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(Models.Metadata.Rom.SizeKey)?.ToString(), + CRC = item.GetFieldValue(Models.Metadata.Rom.CRCKey), + MD5 = item.GetFieldValue(Models.Metadata.Rom.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Rom.SHA1Key), + SHA256 = item.GetFieldValue(Models.Metadata.Rom.SHA256Key), + SHA384 = item.GetFieldValue(Models.Metadata.Rom.SHA384Key), + SHA512 = item.GetFieldValue(Models.Metadata.Rom.SHA512Key), + SpamSum = item.GetFieldValue(Models.Metadata.Rom.SpamSumKey), + xxHash364 = item.GetFieldValue(Models.Metadata.Rom.xxHash364Key), + xxHash3128 = item.GetFieldValue(Models.Metadata.Rom.xxHash3128Key), + Merge = item.GetFieldValue(Models.Metadata.Rom.MergeKey), + Serial = item.GetFieldValue(Models.Metadata.Rom.SerialKey), + Header = item.GetFieldValue(Models.Metadata.Rom.HeaderKey), + Date = item.GetFieldValue(Models.Metadata.Rom.DateKey), + Inverted = item.GetFieldValue(Models.Metadata.Rom.InvertedKey).FromYesNo(), + MIA = item.GetFieldValue(Models.Metadata.Rom.MIAKey).FromYesNo(), }; if (item.ItemStatusSpecified) - rom.Status = item.ItemStatus.AsStringValue(useSecond: false); - if (item.InvertedSpecified) - rom.Inverted = item.Inverted.FromYesNo(); - if (item.MIASpecified) - rom.MIA = item.MIA.FromYesNo(); + rom.Status = item.GetFieldValue(Models.Metadata.Rom.StatusKey).AsStringValue(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(Models.Metadata.Disk.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Disk.SHA1Key), + Merge = item.GetFieldValue(Models.Metadata.Disk.MergeKey), + Region = item.GetFieldValue(Models.Metadata.Disk.RegionKey), }; - if (item.ItemStatusSpecified) - disk.Status = item.ItemStatus.AsStringValue(useSecond: false); + if (item.GetFieldValue(Models.Metadata.Disk.StatusKey) != ItemStatus.NULL) + disk.Status = item.GetFieldValue(Models.Metadata.Disk.StatusKey).AsStringValue(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(Models.Metadata.Media.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Media.SHA1Key), + SHA256 = item.GetFieldValue(Models.Metadata.Media.SHA256Key), + SpamSum = item.GetFieldValue(Models.Metadata.Media.SpamSumKey), }; return media; } @@ -626,21 +620,16 @@ namespace SabreTools.DatFiles.Formats { var driver = new Models.Logiqx.Driver { - Status = item.Status.AsStringValue(), - Emulation = item.Emulation.AsStringValue(), - Cocktail = item.Cocktail.AsStringValue(), - SaveState = item.SaveState.AsStringValue(useSecond: true), + Status = item.GetFieldValue(Models.Metadata.Driver.StatusKey).AsStringValue(), + Emulation = item.GetFieldValue(Models.Metadata.Driver.EmulationKey).AsStringValue(), + Cocktail = item.GetFieldValue(Models.Metadata.Driver.CocktailKey).AsStringValue(), + SaveState = item.GetFieldValue(Models.Metadata.Driver.SaveStateKey).AsStringValue(useSecond: true), + RequiresArtwork = item.GetFieldValue(Models.Metadata.Driver.RequiresArtworkKey).FromYesNo(), + Unofficial = item.GetFieldValue(Models.Metadata.Driver.UnofficialKey).FromYesNo(), + NoSoundHardware = item.GetFieldValue(Models.Metadata.Driver.NoSoundHardwareKey).FromYesNo(), + Incomplete = item.GetFieldValue(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(Models.Metadata.SoftwareList.TagKey), Name = item.GetName(), - Filter = item.Filter, + Filter = item.GetFieldValue(Models.Metadata.SoftwareList.FilterKey), }; - if (item.StatusSpecified) - softwarelist.Status = item.Status.AsStringValue(); + if (item.GetFieldValue(Models.Metadata.SoftwareList.StatusKey) != SoftwareListStatus.None) + softwarelist.Status = item.GetFieldValue(Models.Metadata.SoftwareList.StatusKey).AsStringValue(); return softwarelist; } diff --git a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs b/SabreTools.DatFiles/Formats/OfflineList.Reader.cs index 27c1a4f5..9c476622 100644 --- a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs +++ b/SabreTools.DatFiles/Formats/OfflineList.Reader.cs @@ -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(Models.Metadata.Rom.CRCKey, crc.Content); + item.SetFieldValue(Models.Metadata.Rom.SizeKey, size); + item.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); diff --git a/SabreTools.DatFiles/Formats/OfflineList.Writer.cs b/SabreTools.DatFiles/Formats/OfflineList.Writer.cs index b37f8d5e..f4944c0c 100644 --- a/SabreTools.DatFiles/Formats/OfflineList.Writer.cs +++ b/SabreTools.DatFiles/Formats/OfflineList.Writer.cs @@ -33,9 +33,9 @@ namespace SabreTools.DatFiles.Formats switch (datItem) { case Rom rom: - if (rom.Size == null || rom.Size < 0) + if (rom.GetFieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue(Models.Metadata.Rom.SizeKey) < 0) missingFields.Add(Models.Metadata.Rom.SizeKey); - if (string.IsNullOrEmpty(rom.CRC)) + if (string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Rom.CRCKey), }; return romCRC; diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs b/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs index 0c8d897d..adf25de6 100644 --- a/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs +++ b/SabreTools.DatFiles/Formats/OpenMSX.Reader.cs @@ -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(Models.Metadata.Rom.OffsetKey, dump.Rom?.Start); + item.SetFieldValue(Models.Metadata.Rom.OpenMSXType, rom.Type); + item.SetFieldValue(Models.Metadata.Rom.RemarkKey, rom.Remark); + item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.Hash); if (dump.Original != null) { - item.Original = new Original + item.SetFieldValue("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(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.Rom); break; case Models.OpenMSX.MegaRom: - item.OpenMSXSubType = OpenMSXSubType.MegaRom; + item.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.MegaRom); break; case Models.OpenMSX.SCCPlusCart: - item.OpenMSXSubType = OpenMSXSubType.SCCPlusCart; + item.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, OpenMSXSubType.SCCPlusCart); break; } diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs b/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs index 98a40181..48fc19f0 100644 --- a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs +++ b/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs @@ -33,7 +33,7 @@ namespace SabreTools.DatFiles.Formats switch (datItem) { case Rom rom: - if (string.IsNullOrEmpty(rom.SHA1)) + if (string.IsNullOrEmpty(rom.GetFieldValue(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") != 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")!.Content }; + if (item.GetFieldValue("ORIGINAL")!.Value != null) + original.Value = item.GetFieldValue("ORIGINAL")!.Value.ToString(); } - Models.OpenMSX.RomBase rom = item.OpenMSXSubType switch + Models.OpenMSX.RomBase rom = item.GetFieldValue(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(Models.Metadata.Rom.OffsetKey); + rom.Type = item.GetFieldValue(Models.Metadata.Rom.OpenMSXType); + rom.Hash = item.GetFieldValue(Models.Metadata.Rom.SHA1Key); + rom.Remark = item.GetFieldValue(Models.Metadata.Rom.RemarkKey); var dump = new Models.OpenMSX.Dump { diff --git a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs b/SabreTools.DatFiles/Formats/RomCenter.Reader.cs index b46d9b52..78dee870 100644 --- a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs +++ b/SabreTools.DatFiles/Formats/RomCenter.Reader.cs @@ -107,27 +107,27 @@ namespace SabreTools.DatFiles.Formats foreach (var rom in games.Rom) { + 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 { - Size = NumberHelper.ConvertToInt64(rom.RomSize), - CRC = rom.RomCRC, - MergeTag = rom.MergeName, - ItemStatus = ItemStatus.None, - - 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, - }, - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(rom.RomName); + item.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.RomCRC); + item.SetFieldValue(Models.Metadata.Rom.MergeKey, rom.MergeName); + item.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.RomSize)); + item.SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); // Now process and add the item + item.CopyMachineInformation(machine); ParseAddHelper(item, statsOnly); } } diff --git a/SabreTools.DatFiles/Formats/RomCenter.Writer.cs b/SabreTools.DatFiles/Formats/RomCenter.Writer.cs index c55cff47..4ce364c5 100644 --- a/SabreTools.DatFiles/Formats/RomCenter.Writer.cs +++ b/SabreTools.DatFiles/Formats/RomCenter.Writer.cs @@ -33,9 +33,9 @@ namespace SabreTools.DatFiles.Formats switch (datItem) { case Rom rom: - if (string.IsNullOrEmpty(rom.CRC)) + if (string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.CRCKey))) missingFields.Add(Models.Metadata.Rom.CRCKey); - if (!rom.SizeSpecified) + if (rom.GetFieldValue(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(Models.Metadata.Rom.CRCKey), + RomSize = item.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString(), RomOf = item.Machine.RomOf, - MergeName = item.MergeTag, + MergeName = item.GetFieldValue(Models.Metadata.Rom.MergeKey), }; return rom; } diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs b/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs index adb30489..71cfaed2 100644 --- a/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs +++ b/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs @@ -84,43 +84,40 @@ namespace SabreTools.DatFiles.Formats case ItemType.Disk: item = new Disk { - MD5 = row.MD5, - SHA1 = row.SHA1, - ItemStatus = row.Status.AsEnumValue(), - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(row.DiskName); + item.SetFieldValue(Models.Metadata.Disk.StatusKey, row.Status?.AsEnumValue() ?? ItemStatus.NULL); + item.SetFieldValue(Models.Metadata.Disk.MD5Key, row.MD5); + item.SetFieldValue(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(Models.Metadata.Media.MD5Key, row.MD5); + item.SetFieldValue(Models.Metadata.Media.SHA1Key, row.SHA1); + item.SetFieldValue(Models.Metadata.Media.SHA256Key, row.SHA256); + item.SetFieldValue(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(), - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(row.RomName); + item.SetFieldValue(Models.Metadata.Rom.CRCKey, row.CRC); + item.SetFieldValue(Models.Metadata.Rom.MD5Key, row.MD5); + item.SetFieldValue(Models.Metadata.Rom.SHA1Key, row.SHA1); + item.SetFieldValue(Models.Metadata.Rom.SHA256Key, row.SHA256); + item.SetFieldValue(Models.Metadata.Rom.SHA384Key, row.SHA384); + item.SetFieldValue(Models.Metadata.Rom.SHA512Key, row.SHA512); + item.SetFieldValue(Models.Metadata.Rom.SpamSumKey, row.SpamSum); + item.SetFieldValue(Models.Metadata.Rom.StatusKey, row.Status.AsEnumValue()); break; } diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs b/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs index 9a9b4711..d935bb1c 100644 --- a/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs +++ b/SabreTools.DatFiles/Formats/SeparatedValue.Writer.cs @@ -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(Models.Metadata.Disk.MD5Key)) + && string.IsNullOrEmpty(disk.GetFieldValue(Models.Metadata.Disk.SHA1Key))) { missingFields.Add(Models.Metadata.Disk.SHA1Key); } break; case Rom rom: - if (rom.Size == null || rom.Size < 0) + if (rom.GetFieldValue(Models.Metadata.Rom.SizeKey) == null || rom.GetFieldValue(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(Models.Metadata.Rom.CRCKey)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA384Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA512Key)) + && string.IsNullOrEmpty(rom.GetFieldValue(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(), + Type = disk.GetFieldValue(Models.Metadata.Disk.TypeKey).AsStringValue(), RomName = string.Empty, DiskName = disk.GetName(), Size = string.Empty, CRC = string.Empty, - MD5 = disk.MD5, - SHA1 = disk.SHA1, + MD5 = disk.GetFieldValue(Models.Metadata.Disk.MD5Key), + SHA1 = disk.GetFieldValue(Models.Metadata.Disk.SHA1Key), SHA256 = string.Empty, SHA384 = string.Empty, SHA512 = string.Empty, SpamSum = string.Empty, - Status = disk.ItemStatus.AsStringValue(useSecond: false), + Status = disk.GetFieldValue(Models.Metadata.Disk.StatusKey).AsStringValue(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(Models.Metadata.Media.MD5Key), + SHA1 = media.GetFieldValue(Models.Metadata.Media.SHA1Key), + SHA256 = media.GetFieldValue(Models.Metadata.Media.SHA256Key), SHA384 = string.Empty, SHA512 = string.Empty, - SpamSum = media.SpamSum, + SpamSum = media.GetFieldValue(Models.Metadata.Media.SpamSumKey), Status = string.Empty, }; return row; @@ -223,15 +223,15 @@ namespace SabreTools.DatFiles.Formats Type = rom.ItemType.AsStringValue(), 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(useSecond: false), + Size = rom.GetFieldValue(Models.Metadata.Rom.SizeKey)?.ToString(), + CRC = rom.GetFieldValue(Models.Metadata.Rom.CRCKey), + MD5 = rom.GetFieldValue(Models.Metadata.Rom.MD5Key), + SHA1 = rom.GetFieldValue(Models.Metadata.Rom.SHA1Key), + SHA256 = rom.GetFieldValue(Models.Metadata.Rom.SHA256Key), + SHA384 = rom.GetFieldValue(Models.Metadata.Rom.SHA384Key), + SHA512 = rom.GetFieldValue(Models.Metadata.Rom.SHA512Key), + SpamSum = rom.GetFieldValue(Models.Metadata.Rom.SpamSumKey), + Status = rom.GetFieldValue(Models.Metadata.Rom.StatusKey).AsStringValue(useSecond: false), }; return row; } diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs b/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs index d7832e59..16fd5034 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.Reader.cs @@ -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(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(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(Models.Metadata.Part.InterfaceKey, part.Interface); + item.SetFieldValue(Models.Metadata.Part.FeatureKey, CreateFeatures(part.Feature, machine, filename, indexId, statsOnly)); item.CopyMachineInformation(machine); @@ -192,7 +189,7 @@ namespace SabreTools.DatFiles.Formats /// Name of the file to be parsed /// Index ID for the DAT /// True to only add item statistics while parsing, false otherwise - private static List? 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(Models.Metadata.Feature.ValueKey, feature.Value); item.CopyMachineInformation(machine); partFeatures.Add(item); } - return partFeatures; + return [.. partFeatures]; } /// @@ -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(), - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(dataarea.Name); + item.SetFieldValue(Models.Metadata.DataArea.EndiannessKey, dataarea.Endianness.AsEnumValue()); + item.SetFieldValue(Models.Metadata.DataArea.SizeKey, NumberHelper.ConvertToInt64(dataarea.Size)); + item.SetFieldValue(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(), - LoadFlag = rom.LoadFlag.AsEnumValue(), - - Part = part, - DataArea = dataarea, - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(rom.Name); + item.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size ?? rom.Length)); + item.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.CRC); + item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.SHA1); + item.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.Offset); + item.SetFieldValue(Models.Metadata.Rom.ValueKey, rom.Value); + item.SetFieldValue(Models.Metadata.Rom.StatusKey, rom.Status.AsEnumValue()); + item.SetFieldValue(Models.Metadata.Rom.LoadFlagKey, rom.LoadFlag.AsEnumValue()); + item.SetFieldValue("PART", part); + item.SetFieldValue("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(), - Writable = disk.Writeable.AsYesNo(), - - Part = part, - DiskArea = diskarea, - Source = new Source { Index = indexId, Name = filename }, }; item.SetName(disk.Name); + item.SetFieldValue("DISKAREA", diskarea); + item.SetFieldValue(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue() ?? ItemStatus.NULL); + item.SetFieldValue(Models.Metadata.Disk.MD5Key, disk.MD5); + item.SetFieldValue("PART", part); + item.SetFieldValue(Models.Metadata.Disk.SHA1Key, disk.SHA1); + item.SetFieldValue(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(Models.Metadata.DipSwitch.DipValueKey, CreateDipValues(dipswitch.DipValue, machine, filename, indexId)?.ToArray()); + item.SetFieldValue("PART", part); + item.SetFieldValue(Models.Metadata.DipSwitch.MaskKey, dipswitch.Mask); + item.SetFieldValue(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(Models.Metadata.DipValue.DefaultKey, dipvalue.Default.AsYesNo()); + item.SetFieldValue(Models.Metadata.DipValue.ValueKey, dipvalue.Value); item.CopyMachineInformation(machine); settings.Add(item); diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs index 50675333..2312d6c3 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs @@ -41,22 +41,22 @@ namespace SabreTools.DatFiles.Formats } else { - if (string.IsNullOrEmpty(dipSwitch.Part!.GetName())) + if (string.IsNullOrEmpty(dipSwitch.GetFieldValue("PART")!.GetName())) missingFields.Add(Models.Metadata.Part.NameKey); - if (string.IsNullOrEmpty(dipSwitch.Part.Interface)) + if (string.IsNullOrEmpty(dipSwitch.GetFieldValue("PART")!.GetFieldValue(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(Models.Metadata.DipSwitch.TagKey))) missingFields.Add(Models.Metadata.DipSwitch.TagKey); - if (string.IsNullOrEmpty(dipSwitch.Mask)) + if (string.IsNullOrEmpty(dipSwitch.GetFieldValue(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(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(Models.Metadata.DipSwitch.DipValueKey)!.Any(dv => string.IsNullOrEmpty(dv.GetFieldValue(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")!.GetName())) missingFields.Add(Models.Metadata.Part.NameKey); - if (string.IsNullOrEmpty(disk.Part.Interface)) + if (string.IsNullOrEmpty(disk.GetFieldValue("PART")!.GetFieldValue(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")!.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")!.GetName())) missingFields.Add(Models.Metadata.Part.NameKey); - if (string.IsNullOrEmpty(rom.Part.Interface)) + if (string.IsNullOrEmpty(rom.GetFieldValue("PART")!.GetFieldValue(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")!.GetName())) missingFields.Add(Models.Metadata.DataArea.NameKey); - if (!rom.DataArea.SizeSpecified) + if (rom.GetFieldValue("DATAAREA")!.GetFieldValue(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(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(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")?.GetName(), + Interface = item.GetFieldValue("PART")?.GetFieldValue(Models.Metadata.Part.InterfaceKey), + Feature = CreateFeatures(item.GetFieldValue("PART")?.GetFieldValue(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")?.GetName(), + Interface = item.GetFieldValue("PART")?.GetFieldValue(Models.Metadata.Part.InterfaceKey), + Feature = CreateFeatures(item.GetFieldValue("PART")?.GetFieldValue(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")?.GetName(), + Interface = item.GetFieldValue("PART")?.GetFieldValue(Models.Metadata.Part.InterfaceKey), + Feature = CreateFeatures(item.GetFieldValue("PART")?.GetFieldValue(Models.Metadata.Part.FeatureKey)), DataArea = null, DiskArea = null, DipSwitch = CreateDipSwitches(item), @@ -351,7 +351,7 @@ namespace SabreTools.DatFiles.Formats /// /// Create a Feature array from the current list of PartFeature DatItems /// - private static Models.SoftwareList.Feature[]? CreateFeatures(List? 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(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(), + Name = item.GetFieldValue("DATAAREA")?.GetName(), + Size = item.GetFieldValue("DATAAREA")?.GetFieldValue(Models.Metadata.DataArea.SizeKey)?.ToString(), + Width = item.GetFieldValue("DATAAREA")?.GetFieldValue(Models.Metadata.DataArea.WidthKey)?.ToString(), + Endianness = item.GetFieldValue("DATAAREA")?.GetFieldValue(Models.Metadata.DataArea.EndiannessKey).AsStringValue(), 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(Models.Metadata.Rom.SizeKey)?.ToString(), Length = null, - CRC = item.CRC, - SHA1 = item.SHA1, - Offset = item.Offset, - Value = item.Value, - Status = item.ItemStatus.AsStringValue(useSecond: false), - LoadFlag = item.LoadFlag.AsStringValue(), + CRC = item.GetFieldValue(Models.Metadata.Rom.CRCKey), + SHA1 = item.GetFieldValue(Models.Metadata.Rom.SHA1Key), + Offset = item.GetFieldValue(Models.Metadata.Rom.OffsetKey), + Value = item.GetFieldValue(Models.Metadata.Rom.ValueKey), + Status = item.GetFieldValue(Models.Metadata.Rom.StatusKey).AsStringValue(useSecond: false), + LoadFlag = item.GetFieldValue(Models.Metadata.Rom.LoadFlagKey).AsStringValue(), }; 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(useSecond: false), - Writeable = item.Writable?.ToString(), + MD5 = item.GetFieldValue(Models.Metadata.Disk.MD5Key), + SHA1 = item.GetFieldValue(Models.Metadata.Disk.SHA1Key), + Status = item.GetFieldValue(Models.Metadata.Disk.StatusKey).AsStringValue(useSecond: false), + Writeable = item.GetFieldValue(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(); - foreach (var setting in item.Values ?? []) + foreach (var setting in item.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey) ?? []) { var dipValue = new Models.SoftwareList.DipValue { Name = setting.GetName(), - Value = setting.Value, - Default = setting.Default?.ToString(), + Value = setting.GetFieldValue(Models.Metadata.DipValue.ValueKey), + Default = setting.GetFieldValue(Models.Metadata.DipValue.DefaultKey).FromYesNo(), }; dipValues.Add(dipValue); diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs index 77efed88..8bcb097a 100644 --- a/SabreTools.DatFiles/ItemDictionary.cs +++ b/SabreTools.DatFiles/ItemDictionary.cs @@ -229,40 +229,40 @@ namespace SabreTools.DatFiles switch (item) { case Disk disk: - if (disk.ItemStatus != ItemStatus.Nodump) + if (disk.GetFieldValue(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(Models.Metadata.Disk.MD5Key)) ? 0 : 1); + AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue(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(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0); + AddStatusCount(ItemStatus.Good, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0); + AddStatusCount(ItemStatus.Nodump, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0); + AddStatusCount(ItemStatus.Verified, disk.GetFieldValue(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(Models.Metadata.Media.MD5Key)) ? 0 : 1); + AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA1Key)) ? 0 : 1); + AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA256Key)) ? 0 : 1); + AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SpamSumKey)) ? 0 : 1); break; case Rom rom: - if (rom.ItemStatus != ItemStatus.Nodump) + if (rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey) ?? 0; + AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1); + AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1); + AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1); + AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1); + AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA384Key)) ? 0 : 1); + AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA512Key)) ? 0 : 1); + AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0); + AddStatusCount(ItemStatus.Good, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0); + AddStatusCount(ItemStatus.Nodump, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0); + AddStatusCount(ItemStatus.Verified, rom.GetFieldValue(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(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(Models.Metadata.Disk.MD5Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue(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(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0); + RemoveStatusCount(ItemStatus.Good, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0); + RemoveStatusCount(ItemStatus.Nodump, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0); + RemoveStatusCount(ItemStatus.Verified, disk.GetFieldValue(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(Models.Metadata.Media.MD5Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA1Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA256Key)) ? 0 : 1); + RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SpamSumKey)) ? 0 : 1); break; case Rom rom: - if (rom.ItemStatus != ItemStatus.Nodump) + if (rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey) ?? 0; + RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1); + RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA384Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA512Key)) ? 0 : 1); + RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0); + RemoveStatusCount(ItemStatus.Good, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0); + RemoveStatusCount(ItemStatus.Nodump, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0); + RemoveStatusCount(ItemStatus.Verified, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Verified ? 1 : 0); break; } } diff --git a/SabreTools.DatFiles/ItemDictionaryDB.cs b/SabreTools.DatFiles/ItemDictionaryDB.cs index c4b2af61..8cb98f6d 100644 --- a/SabreTools.DatFiles/ItemDictionaryDB.cs +++ b/SabreTools.DatFiles/ItemDictionaryDB.cs @@ -346,40 +346,40 @@ namespace SabreTools.DatFiles switch (item) { case Disk disk: - if (disk.ItemStatus != ItemStatus.Nodump) + if (disk.GetFieldValue(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(Models.Metadata.Disk.MD5Key)) ? 0 : 1); + AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue(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(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0); + AddStatusCount(ItemStatus.Good, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0); + AddStatusCount(ItemStatus.Nodump, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0); + AddStatusCount(ItemStatus.Verified, disk.GetFieldValue(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(Models.Metadata.Media.MD5Key)) ? 0 : 1); + AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA1Key)) ? 0 : 1); + AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA256Key)) ? 0 : 1); + AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SpamSumKey)) ? 0 : 1); break; case Rom rom: - if (rom.ItemStatus != ItemStatus.Nodump) + if (rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey) ?? 0; + AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1); + AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1); + AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1); + AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1); + AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA384Key)) ? 0 : 1); + AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA512Key)) ? 0 : 1); + AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0); + AddStatusCount(ItemStatus.Good, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0); + AddStatusCount(ItemStatus.Nodump, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0); + AddStatusCount(ItemStatus.Verified, rom.GetFieldValue(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(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(Models.Metadata.Disk.MD5Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetFieldValue(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(Models.Metadata.Disk.StatusKey) == ItemStatus.BadDump ? 1 : 0); + RemoveStatusCount(ItemStatus.Good, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Good ? 1 : 0); + RemoveStatusCount(ItemStatus.Nodump, disk.GetFieldValue(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump ? 1 : 0); + RemoveStatusCount(ItemStatus.Verified, disk.GetFieldValue(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(Models.Metadata.Media.MD5Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA1Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SHA256Key)) ? 0 : 1); + RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetFieldValue(Models.Metadata.Media.SpamSumKey)) ? 0 : 1); break; case Rom rom: - if (rom.ItemStatus != ItemStatus.Nodump) + if (rom.GetFieldValue(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(Models.Metadata.Rom.SizeKey) ?? 0; + RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1); + RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA384Key)) ? 0 : 1); + RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetFieldValue(Models.Metadata.Rom.SHA512Key)) ? 0 : 1); + RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetFieldValue(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(Models.Metadata.Rom.StatusKey) == ItemStatus.BadDump ? 1 : 0); + RemoveStatusCount(ItemStatus.Good, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Good ? 1 : 0); + RemoveStatusCount(ItemStatus.Nodump, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump ? 1 : 0); + RemoveStatusCount(ItemStatus.Verified, rom.GetFieldValue(Models.Metadata.Rom.StatusKey) == ItemStatus.Verified ? 1 : 0); break; } } diff --git a/SabreTools.DatFiles/MetadataConverter.cs b/SabreTools.DatFiles/MetadataConverter.cs new file mode 100644 index 00000000..f34dd431 --- /dev/null +++ b/SabreTools.DatFiles/MetadataConverter.cs @@ -0,0 +1,86 @@ +using System.Linq; +using SabreTools.DatItems; +using SabreTools.Filter; + +namespace SabreTools.DatFiles +{ + public static class MetadataConverter + { + #region Converters + + /// + /// Convert metadata information + /// + /// Metadata file to convert + /// Name of the file to be parsed + /// Index ID for the DAT + /// True to only add item statistics while parsing, false otherwise + 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.MetadataFile.MachineKey); + if (machines == null) + return; + + // Loop through the machines and add + foreach (var machine in machines) + { + ConvertMachine(machine, filename, indexId, statsOnly); + } + } + + /// + /// Convert machine information + /// + /// Metadata file to convert + /// Name of the file to be parsed + /// Index ID for the DAT + /// True to only add item statistics while parsing, false otherwise + 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 + } +} \ No newline at end of file diff --git a/SabreTools.DatFiles/Setter.cs b/SabreTools.DatFiles/Setter.cs index d1cf4b91..96fe03b9 100644 --- a/SabreTools.DatFiles/Setter.cs +++ b/SabreTools.DatFiles/Setter.cs @@ -263,7 +263,7 @@ namespace SabreTools.DatFiles { if (configuration.ConditionsSpecified) { - foreach (Condition subCondition in configuration.Conditions!) + foreach (Condition subCondition in configuration.GetFieldValue(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(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(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(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(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(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(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(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(Models.Metadata.DipSwitch.DipValueKey)!) { SetFields(subValue as DatItem); } } - dipSwitch.Part ??= new Part(); - SetFields(dipSwitch.Part as DatItem); + if (!dipSwitch.PartSpecified) + dipSwitch.SetFieldValue("PART", new Part()); + + SetFields((dipSwitch.GetFieldValue("PART") as DatItem)!); } /// @@ -366,7 +368,7 @@ namespace SabreTools.DatFiles { if (dipValue.ConditionsSpecified) { - foreach (Condition subCondition in dipValue.Conditions!) + foreach (Condition subCondition in dipValue.GetFieldValue(Models.Metadata.DipValue.ConditionKey)!) { SetFields(subCondition); } @@ -379,11 +381,15 @@ namespace SabreTools.DatFiles /// Disk to remove replace fields in private void SetFields(Disk disk) { - disk.DiskArea ??= new DiskArea(); - SetFields(disk.DiskArea); + if (!disk.DiskAreaSpecified) + disk.SetFieldValue("DISKAREA", new DiskArea()); - disk.Part ??= new Part(); - SetFields(disk.Part as DatItem); + SetFields(disk.GetFieldValue("DISKAREA")! as DatItem); + + if (!disk.PartSpecified) + disk.SetFieldValue("PART", new Part()); + + SetFields(disk.GetFieldValue("PART")! as DatItem); } /// @@ -394,7 +400,7 @@ namespace SabreTools.DatFiles { if (input.ControlsSpecified) { - foreach (Control subControl in input.Controls!) + foreach (Control subControl in input.GetFieldValue(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(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(Models.Metadata.Port.AnalogKey)!) { SetFields(subAnalog); } @@ -437,11 +443,15 @@ namespace SabreTools.DatFiles /// Rom to remove replace fields in private void SetFields(Rom rom) { - rom.DataArea ??= new DataArea(); - SetFields(rom.DataArea); + if (!rom.DataAreaSpecified) + rom.SetFieldValue("DATAAREA", new DataArea()); - rom.Part ??= new Part(); - SetFields(rom.Part as DatItem); + SetFields(rom.GetFieldValue("DATAAREA")! as DatItem); + + if (!rom.PartSpecified) + rom.SetFieldValue("PART", new Part()); + + SetFields(rom.GetFieldValue("PART")! as DatItem); } /// @@ -452,7 +462,7 @@ namespace SabreTools.DatFiles { if (slot.SlotOptionsSpecified) { - foreach (SlotOption subSlotOption in slot.SlotOptions!) + foreach (SlotOption subSlotOption in slot.GetFieldValue(Models.Metadata.Slot.SlotOptionKey)!) { SetFields(subSlotOption); } diff --git a/SabreTools.DatItems/DatItem.cs b/SabreTools.DatItems/DatItem.cs index 17e68f49..ddfbcd39 100644 --- a/SabreTools.DatItems/DatItem.cs +++ b/SabreTools.DatItems/DatItem.cs @@ -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(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(Models.Metadata.Disk.StatusKey) == ItemStatus.Nodump) { outfiles.Add(file); nodumpCount++; diff --git a/SabreTools.DatItems/Formats/Analog.cs b/SabreTools.DatItems/Formats/Analog.cs index 8be7a46d..33510967 100644 --- a/SabreTools.DatItems/Formats/Analog.cs +++ b/SabreTools.DatItems/Formats/Analog.cs @@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("analog"), XmlRoot("analog")] public class Analog : DatItem { - #region Fields - - /// - /// Analog mask value - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/BiosSet.cs b/SabreTools.DatItems/Formats/BiosSet.cs index 812f8100..ec777aa9 100644 --- a/SabreTools.DatItems/Formats/BiosSet.cs +++ b/SabreTools.DatItems/Formats/BiosSet.cs @@ -10,33 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("biosset"), XmlRoot("biosset")] public class BiosSet : DatItem { - #region Fields - - /// - /// Description of the BIOS - /// - [JsonProperty("description", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("description")] - public string? Description - { - get => _internal.ReadString(Models.Metadata.BiosSet.DescriptionKey); - set => _internal[Models.Metadata.BiosSet.DescriptionKey] = value; - } - - /// - /// Determine whether the BIOS is default - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/Chip.cs b/SabreTools.DatItems/Formats/Chip.cs index f86b00f3..77767740 100644 --- a/SabreTools.DatItems/Formats/Chip.cs +++ b/SabreTools.DatItems/Formats/Chip.cs @@ -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 - - /// - /// Internal tag - /// - [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")] - public string? Tag - { - get => _internal.ReadString(Models.Metadata.Chip.TagKey); - set => _internal[Models.Metadata.Chip.TagKey] = value; - } - - /// - /// Type of the chip - /// - [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")] - [JsonConverter(typeof(StringEnumConverter))] - public ChipType ChipType - { - get => _internal.ReadString(Models.Metadata.Chip.ChipTypeKey).AsEnumValue(); - set => _internal[Models.Metadata.Chip.ChipTypeKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool ChipTypeSpecified { get { return ChipType != ChipType.NULL; } } - - /// - /// Clock speed - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/Condition.cs b/SabreTools.DatItems/Formats/Condition.cs index dcbdb427..537bced2 100644 --- a/SabreTools.DatItems/Formats/Condition.cs +++ b/SabreTools.DatItems/Formats/Condition.cs @@ -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 - - /// - /// Condition tag value - /// - [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")] - public string? Tag - { - get => _internal.ReadString(Models.Metadata.Condition.TagKey); - set => _internal[Models.Metadata.Condition.TagKey] = value; - } - - /// - /// Condition mask - /// - [JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mask")] - public string? Mask - { - get => _internal.ReadString(Models.Metadata.Condition.MaskKey); - set => _internal[Models.Metadata.Condition.MaskKey] = value; - } - - /// - /// Condition relationship - /// - [JsonProperty("relation", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("relation")] - [JsonConverter(typeof(StringEnumConverter))] - public Relation Relation - { - get => _internal.ReadString(Models.Metadata.Condition.RelationKey).AsEnumValue(); - set => _internal[Models.Metadata.Condition.RelationKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool RelationSpecified { get { return Relation != Core.Relation.NULL; } } - - /// - /// Condition value - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/ConfLocation.cs b/SabreTools.DatItems/Formats/ConfLocation.cs index 7bb68003..fdf0fe89 100644 --- a/SabreTools.DatItems/Formats/ConfLocation.cs +++ b/SabreTools.DatItems/Formats/ConfLocation.cs @@ -10,36 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("conflocation"), XmlRoot("conflocation")] public class ConfLocation : DatItem { - #region Fields - - /// - /// Location ID - /// - [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; } } - - /// - /// Determines if location is inverted or not - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/ConfSetting.cs b/SabreTools.DatItems/Formats/ConfSetting.cs index f2eaf423..e2a70147 100644 --- a/SabreTools.DatItems/Formats/ConfSetting.cs +++ b/SabreTools.DatItems/Formats/ConfSetting.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using System.Linq; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; @@ -14,42 +12,16 @@ namespace SabreTools.DatItems.Formats { #region Fields - /// - /// Setting value - /// - [JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("value")] - public string? Value - { - get => _internal.ReadString(Models.Metadata.ConfSetting.ValueKey); - set => _internal[Models.Metadata.ConfSetting.ValueKey] = value; - } - - /// - /// Determines if the setting is default or not - /// - [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; } } - - /// - /// List of conditions on the setting - /// - [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")] - public List? Conditions + public bool ConditionsSpecified { - get => _internal.Read(Models.Metadata.ConfSetting.ConditionKey)?.ToList(); - set => _internal[Models.Metadata.ConfSetting.ConditionKey] = value?.ToArray(); + get + { + var conditions = GetFieldValue(Models.Metadata.ConfSetting.ConditionKey); + return conditions != null && conditions.Length > 0; + } } - [JsonIgnore] - public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } } - #endregion #region Accessors diff --git a/SabreTools.DatItems/Formats/Configuration.cs b/SabreTools.DatItems/Formats/Configuration.cs index bcf49b18..ab82233e 100644 --- a/SabreTools.DatItems/Formats/Configuration.cs +++ b/SabreTools.DatItems/Formats/Configuration.cs @@ -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,65 +12,36 @@ namespace SabreTools.DatItems.Formats { #region Fields - /// - /// Tag associated with the configuration - /// - [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; - } - - /// - /// Mask associated with the configuration - /// - [JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mask")] - public string? Mask - { - get => _internal.ReadString(Models.Metadata.Configuration.MaskKey); - set => _internal[Models.Metadata.Configuration.MaskKey] = value; - } - - /// - /// Conditions associated with the configuration - /// - [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")] - public List? Conditions - { - get => _internal.Read(Models.Metadata.Configuration.ConditionKey)?.ToList(); - set => _internal[Models.Metadata.Configuration.ConditionKey] = value?.ToArray(); + get + { + var conditions = GetFieldValue(Models.Metadata.Configuration.ConditionKey); + return conditions != null && conditions.Length > 0; + } } [JsonIgnore] - public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } } - - /// - /// Locations associated with the configuration - /// - [JsonProperty("locations", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("locations")] - public List? Locations + public bool LocationsSpecified { - get => _internal.Read(Models.Metadata.Configuration.ConfLocationKey)?.ToList(); - set => _internal[Models.Metadata.Configuration.ConfLocationKey] = value?.ToArray(); + get + { + var locations = GetFieldValue(Models.Metadata.Configuration.ConfLocationKey); + return locations != null && locations.Length > 0; + } } [JsonIgnore] - public bool LocationsSpecified { get { return Locations != null && Locations.Count > 0; } } - - /// - /// Settings associated with the configuration - /// - [JsonProperty("settings", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("settings")] - public List? Settings + public bool SettingsSpecified { - get => _internal.Read>(Models.Metadata.Configuration.ConfSettingKey); - set => _internal[Models.Metadata.Configuration.ConfSettingKey] = value; + get + { + var settings = GetFieldValue(Models.Metadata.Configuration.ConfSettingKey); + return settings != null && settings.Length > 0; + } } - [JsonIgnore] - public bool SettingsSpecified { get { return Settings != null && Settings.Count > 0; } } - #endregion #region Accessors diff --git a/SabreTools.DatItems/Formats/Control.cs b/SabreTools.DatItems/Formats/Control.cs index 8f89d912..882fd10a 100644 --- a/SabreTools.DatItems/Formats/Control.cs +++ b/SabreTools.DatItems/Formats/Control.cs @@ -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 - - /// - /// General type of input - /// - [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")] - [JsonConverter(typeof(StringEnumConverter))] - public ControlType ControlType - { - get => _internal.ReadString(Models.Metadata.Control.ControlTypeKey).AsEnumValue(); - set => _internal[Models.Metadata.Control.ControlTypeKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool ControlTypeSpecified { get { return ControlType != ControlType.NULL; } } - - /// - /// Player which the input belongs to - /// - [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; } } - - /// - /// Total number of buttons - /// - [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; } } - - /// - /// Total number of non-optional buttons - /// - [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; } } - - /// - /// Analog minimum value - /// - [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; } } - - /// - /// Analog maximum value - /// - [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; } } - - /// - /// Default analog sensitivity - /// - [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; } } - - /// - /// Default analog keydelta - /// - [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; } } - - /// - /// Default analog reverse setting - /// - [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; } } - - /// - /// First set of ways - /// - [JsonProperty("ways", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("ways")] - public string? Ways - { - get => _internal.ReadString(Models.Metadata.Control.WaysKey); - set => _internal[Models.Metadata.Control.WaysKey] = value; - } - - /// - /// Second set of ways - /// - [JsonProperty("ways2", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("ways2")] - public string? Ways2 - { - get => _internal.ReadString(Models.Metadata.Control.Ways2Key); - set => _internal[Models.Metadata.Control.Ways2Key] = value; - } - - /// - /// Third set of ways - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/DataArea.cs b/SabreTools.DatItems/Formats/DataArea.cs index 254367e0..8c3e6731 100644 --- a/SabreTools.DatItems/Formats/DataArea.cs +++ b/SabreTools.DatItems/Formats/DataArea.cs @@ -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 - - /// - /// Total size of the area - /// - [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; } } - - /// - /// Word width for the area - /// - [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; } } - - /// - /// Byte endianness of the area - /// - [JsonProperty("endianness", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("endianness")] - public Endianness Endianness - { - get => _internal.ReadString(Models.Metadata.DataArea.WidthKey).AsEnumValue(); - set => _internal[Models.Metadata.DataArea.WidthKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool EndiannessSpecified { get { return Endianness != Endianness.NULL; } } - - #endregion - #region Accessors /// diff --git a/SabreTools.DatItems/Formats/Device.cs b/SabreTools.DatItems/Formats/Device.cs index cd2285df..a5ca55a2 100644 --- a/SabreTools.DatItems/Formats/Device.cs +++ b/SabreTools.DatItems/Formats/Device.cs @@ -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 - /// - /// Device type - /// - [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(); - set => _internal[Models.Metadata.Device.DeviceTypeKey] = value.AsStringValue(); + get + { + var instances = GetFieldValue(Models.Metadata.Device.InstanceKey); + return instances != null && instances.Length > 0; + } } [JsonIgnore] - public bool DeviceTypeSpecified { get { return DeviceType != DeviceType.NULL; } } - - /// - /// Device tag - /// - [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; + get + { + var extensions = GetFieldValue(Models.Metadata.Device.ExtensionKey); + return extensions != null && extensions.Length > 0; + } } - /// - /// Fixed image format - /// - [JsonProperty("fixed_image", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("fixed_image")] - public string? FixedImage - { - get => _internal.ReadString(Models.Metadata.Device.FixedImageKey); - set => _internal[Models.Metadata.Device.FixedImageKey] = value; - } - - /// - /// Determines if the devices is mandatory - /// - /// Only value used seems to be 1. Used like bool, but actually int - [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; } } - - /// - /// Device interface - /// - [JsonProperty("interface", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("interface")] - public string? Interface - { - get => _internal.ReadString(Models.Metadata.Device.InterfaceKey); - set => _internal[Models.Metadata.Device.InterfaceKey] = value; - } - - /// - /// Device instances - /// - [JsonProperty("instances", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("instances")] - public List? Instances - { - get => _internal.Read(Models.Metadata.Device.InstanceKey)?.ToList(); - set => _internal[Models.Metadata.Device.InstanceKey] = value?.ToArray(); - } - - [JsonIgnore] - public bool InstancesSpecified { get { return Instances != null && Instances.Count > 0; } } - - /// - /// Device extensions - /// - [JsonProperty("extensions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("extensions")] - public List? Extensions - { - get => _internal.Read(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 diff --git a/SabreTools.DatItems/Formats/DipLocation.cs b/SabreTools.DatItems/Formats/DipLocation.cs index b19d3ee7..58637890 100644 --- a/SabreTools.DatItems/Formats/DipLocation.cs +++ b/SabreTools.DatItems/Formats/DipLocation.cs @@ -10,36 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("diplocation"), XmlRoot("diplocation")] public class DipLocation : DatItem { - #region Fields - - /// - /// Location ID - /// - [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; } } - - /// - /// Determines if location is inverted or not - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/DipSwitch.cs b/SabreTools.DatItems/Formats/DipSwitch.cs index c500d4c1..9e442ab1 100644 --- a/SabreTools.DatItems/Formats/DipSwitch.cs +++ b/SabreTools.DatItems/Formats/DipSwitch.cs @@ -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 - - /// - /// Tag associated with the dipswitch - /// - [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; - } - - /// - /// Mask associated with the dipswitch - /// - [JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("mask")] - public string? Mask - { - get => _internal.ReadString(Models.Metadata.DipSwitch.MaskKey); - set => _internal[Models.Metadata.DipSwitch.MaskKey] = value; - } - - /// - /// Conditions associated with the dipswitch - /// - [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")] - public List? Conditions - { - get => _internal.Read(Models.Metadata.DipSwitch.ConditionKey)?.ToList(); - set => _internal[Models.Metadata.DipSwitch.ConditionKey] = value?.ToArray(); + get + { + var conditions = GetFieldValue(Models.Metadata.DipSwitch.ConditionKey); + return conditions != null && conditions.Length > 0; + } } [JsonIgnore] - public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } } - - /// - /// Locations associated with the dipswitch - /// - [JsonProperty("locations", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("locations")] - public List? Locations + public bool LocationsSpecified { - get => _internal.Read(Models.Metadata.DipSwitch.DipLocationKey)?.ToList(); - set => _internal[Models.Metadata.DipSwitch.DipLocationKey] = value?.ToArray(); + get + { + var locations = GetFieldValue(Models.Metadata.DipSwitch.DipLocationKey); + return locations != null && locations.Length > 0; + } } [JsonIgnore] - public bool LocationsSpecified { get { return Locations != null && Locations.Count > 0; } } - - /// - /// Settings associated with the dipswitch - /// - [JsonProperty("values", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("values")] - public List? Values + public bool ValuesSpecified { - get => _internal.Read(Models.Metadata.DipSwitch.DipValueKey)?.ToList(); - set => _internal[Models.Metadata.DipSwitch.DipValueKey] = value?.ToArray(); + get + { + var values = GetFieldValue(Models.Metadata.DipSwitch.DipValueKey); + return values != null && values.Length > 0; + } } - [JsonIgnore] - public bool ValuesSpecified { get { return Values != null && Values.Count > 0; } } - - #endregion - - #region SoftwareList - - /// - /// Original hardware part associated with the item - /// - /// This is inverted from the internal model - [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"); + return part != null + && (!string.IsNullOrEmpty(part.GetName()) + || !string.IsNullOrEmpty(part.GetFieldValue(Models.Metadata.Part.InterfaceKey))); } } #endregion - #endregion // Fields - #region Accessors /// @@ -142,8 +97,6 @@ namespace SabreTools.DatItems.Formats Remove = this.Remove, _internal = this._internal?.Clone() as Models.Metadata.DipSwitch ?? [], - - Part = this.Part, }; } diff --git a/SabreTools.DatItems/Formats/DipValue.cs b/SabreTools.DatItems/Formats/DipValue.cs index f9327e6b..68ef3461 100644 --- a/SabreTools.DatItems/Formats/DipValue.cs +++ b/SabreTools.DatItems/Formats/DipValue.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using System.Linq; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; @@ -14,42 +12,16 @@ namespace SabreTools.DatItems.Formats { #region Fields - /// - /// Setting value - /// - [JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("value")] - public string? Value - { - get => _internal.ReadString(Models.Metadata.DipValue.ValueKey); - set => _internal[Models.Metadata.DipValue.ValueKey] = value; - } - - /// - /// Determines if the setting is default or not - /// - [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; } } - - /// - /// List of conditions on the setting - /// - [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("conditions")] - public List? Conditions + public bool ConditionsSpecified { - get => _internal.Read(Models.Metadata.DipValue.ConditionKey)?.ToList(); - set => _internal[Models.Metadata.DipValue.ConditionKey] = value?.ToArray(); + get + { + var conditions = GetFieldValue(Models.Metadata.DipValue.ConditionKey); + return conditions != null && conditions.Length > 0; + } } - [JsonIgnore] - public bool ConditionsSpecified { get { return Conditions != null && Conditions.Count > 0; } } - #endregion #region Accessors diff --git a/SabreTools.DatItems/Formats/Disk.cs b/SabreTools.DatItems/Formats/Disk.cs index d602e644..68d5f813 100644 --- a/SabreTools.DatItems/Formats/Disk.cs +++ b/SabreTools.DatItems/Formats/Disk.cs @@ -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 - - /// - /// Data MD5 hash - /// - [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); - } - - /// - /// Data SHA-1 hash - /// - [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); - } - - /// - /// Disk name to merge from parent - /// - [JsonProperty("merge", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("merge")] - public string? MergeTag - { - get => _internal.ReadString(Models.Metadata.Disk.MergeKey); - set => _internal[Models.Metadata.Disk.MergeKey] = value; - } - - /// - /// Disk region - /// - [JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("region")] - public string? Region - { - get => _internal.ReadString(Models.Metadata.Disk.RegionKey); - set => _internal[Models.Metadata.Disk.RegionKey] = value; - } - - /// - /// Disk index - /// - [JsonProperty("index", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("index")] - public string? Index - { - get => _internal.ReadString(Models.Metadata.Disk.IndexKey); - set => _internal[Models.Metadata.Disk.IndexKey] = value; - } - - /// - /// Disk writable flag - /// - [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; } } - - /// - /// Disk dump status - /// - [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")] - [JsonConverter(typeof(StringEnumConverter))] - public ItemStatus ItemStatus - { - get => _internal.ReadString(Models.Metadata.Disk.StatusKey).AsEnumValue(); - set => _internal[Models.Metadata.Disk.StatusKey] = value.AsStringValue(useSecond: false); - } - - [JsonIgnore] - public bool ItemStatusSpecified { get { return ItemStatus != ItemStatus.NULL; } } - - /// - /// Determine if the disk is optional in the set - /// - [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 - - /// - /// Disk area information - /// - /// Hack on top of internal model - [JsonProperty("diskarea", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("diskarea")] - public DiskArea? DiskArea - { - get => _internal.Read("DISKAREA"); - set => _internal["DISKAREA"] = value; - } - [JsonIgnore] public bool DiskAreaSpecified { get { - return DiskArea != null - && !string.IsNullOrEmpty(DiskArea.GetName()); + var diskArea = GetFieldValue("DISKAREA"); + return diskArea != null && !string.IsNullOrEmpty(diskArea.GetName()); } } - /// - /// Original hardware part associated with the item - /// - /// Hack on top of internal model - [JsonProperty("part", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("part")] - public Part? Part - { - get => _internal.Read("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"); + return part != null + && (!string.IsNullOrEmpty(part.GetName()) + || !string.IsNullOrEmpty(part.GetFieldValue(Models.Metadata.Part.InterfaceKey))); } } #endregion - #endregion // Fields - #region Accessors /// @@ -181,7 +61,7 @@ namespace SabreTools.DatItems.Formats SetName(string.Empty); ItemType = ItemType.Disk; DupeType = 0x00; - ItemStatus = ItemStatus.None; + SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.None); } /// @@ -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(Models.Metadata.Disk.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); + SetFieldValue(Models.Metadata.Disk.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); ItemType = ItemType.Disk; DupeType = 0x00; - ItemStatus = ItemStatus.None; + SetFieldValue(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(Models.Metadata.Disk.MD5Key)), + SHA1 = TextHelper.StringToByteArray(GetFieldValue(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")?.SetName(this.GetFieldValue("DISKAREA")?.GetName()); return rom; } @@ -289,11 +166,11 @@ namespace SabreTools.DatItems.Formats switch (bucketedBy) { case ItemKey.MD5: - key = MD5; + key = GetFieldValue(Models.Metadata.Disk.MD5Key); break; case ItemKey.SHA1: - key = SHA1; + key = GetFieldValue(Models.Metadata.Disk.SHA1Key); break; // Let the base handle generic stuff diff --git a/SabreTools.DatItems/Formats/Display.cs b/SabreTools.DatItems/Formats/Display.cs index 36c74db7..3c0e7397 100644 --- a/SabreTools.DatItems/Formats/Display.cs +++ b/SabreTools.DatItems/Formats/Display.cs @@ -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 - - /// - /// Display tag - /// - [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")] - public string? Tag - { - get => _internal.ReadString(Models.Metadata.Display.TagKey); - set => _internal[Models.Metadata.Display.TagKey] = value; - } - - /// - /// Display type - /// - [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")] - [JsonConverter(typeof(StringEnumConverter))] - public DisplayType DisplayType - { - get => _internal.ReadString(Models.Metadata.Display.DisplayTypeKey).AsEnumValue(); - set => _internal[Models.Metadata.Display.DisplayTypeKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool DisplayTypeSpecified { get { return DisplayType != DisplayType.NULL; } } - - /// - /// Display rotation - /// - [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; } } - - /// - /// Determines if display is flipped in the X-coordinates - /// - [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; } } - - /// - /// Display width - /// - [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; } } - - /// - /// Display height - /// - [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; } } - - /// - /// Refresh rate - /// - [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; } } - - /// - /// Pixel clock timer - /// - [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; } } - - /// - /// Total horizontal lines - /// - [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; } } - - /// - /// Horizontal blank end - /// - [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; } } - - /// - /// Horizontal blank start - /// - [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; } } - - /// - /// Total vertical lines - /// - [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; } } - - /// - /// Vertical blank end - /// - [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; } } - - /// - /// Vertical blank start - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/Driver.cs b/SabreTools.DatItems/Formats/Driver.cs index 4c0166c2..7d06aae5 100644 --- a/SabreTools.DatItems/Formats/Driver.cs +++ b/SabreTools.DatItems/Formats/Driver.cs @@ -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 - - /// - /// Overall driver status - /// - [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")] - [JsonConverter(typeof(StringEnumConverter))] - public SupportStatus Status - { - get => _internal.ReadString(Models.Metadata.Driver.StatusKey).AsEnumValue(); - set => _internal[Models.Metadata.Driver.StatusKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool StatusSpecified { get { return Status != SupportStatus.NULL; } } - - /// - /// Driver emulation status - /// - [JsonProperty("emulation", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("emulation")] - [JsonConverter(typeof(StringEnumConverter))] - public SupportStatus Emulation - { - get => _internal.ReadString(Models.Metadata.Driver.EmulationKey).AsEnumValue(); - set => _internal[Models.Metadata.Driver.EmulationKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool EmulationSpecified { get { return Emulation != SupportStatus.NULL; } } - - /// - /// Cocktail orientation status - /// - [JsonProperty("cocktail", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("cocktail")] - [JsonConverter(typeof(StringEnumConverter))] - public SupportStatus Cocktail - { - get => _internal.ReadString(Models.Metadata.Driver.CocktailKey).AsEnumValue(); - set => _internal[Models.Metadata.Driver.CocktailKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool CocktailSpecified { get { return Cocktail != SupportStatus.NULL; } } - - /// - /// Save state support status - /// - [JsonProperty("savestate", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("savestate")] - [JsonConverter(typeof(StringEnumConverter))] - public Supported SaveState - { - get => _internal.ReadString(Models.Metadata.Driver.SaveStateKey).AsEnumValue(); - set => _internal[Models.Metadata.Driver.SaveStateKey] = value.AsStringValue(useSecond: true); - } - - [JsonIgnore] - public bool SaveStateSpecified { get { return SaveState != Supported.NULL; } } - - /// - /// Requires artwork - /// - [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; } } - - /// - /// Unofficial - /// - [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; } } - - /// - /// No sound hardware - /// - [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; } } - - /// - /// Incomplete - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/Feature.cs b/SabreTools.DatItems/Formats/Feature.cs index 96178045..0ca01240 100644 --- a/SabreTools.DatItems/Formats/Feature.cs +++ b/SabreTools.DatItems/Formats/Feature.cs @@ -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 - - /// - /// Type of feature - /// - [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("type")] - [JsonConverter(typeof(StringEnumConverter))] - public FeatureType Type - { - get => _internal.ReadString(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue(); - set => _internal[Models.Metadata.Feature.FeatureTypeKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool TypeSpecified { get { return Type != FeatureType.NULL; } } - - /// - /// Emulation status - /// - [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")] - [JsonConverter(typeof(StringEnumConverter))] - public FeatureStatus Status - { - get => _internal.ReadString(Models.Metadata.Feature.StatusKey).AsEnumValue(); - set => _internal[Models.Metadata.Feature.StatusKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool StatusSpecified { get { return Status != FeatureStatus.NULL; } } - - /// - /// Overall status - /// - [JsonProperty("overall", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("overall")] - [JsonConverter(typeof(StringEnumConverter))] - public FeatureStatus Overall - { - get => _internal.ReadString(Models.Metadata.Feature.OverallKey).AsEnumValue(); - set => _internal[Models.Metadata.Feature.OverallKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool OverallSpecified { get { return Overall != FeatureStatus.NULL; } } - - #endregion - #region Constructors /// diff --git a/SabreTools.DatItems/Formats/File.cs b/SabreTools.DatItems/Formats/File.cs index e7d78615..94dbbe51 100644 --- a/SabreTools.DatItems/Formats/File.cs +++ b/SabreTools.DatItems/Formats/File.cs @@ -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; } } - /// /// File CRC32 hash /// @@ -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(Models.Metadata.Rom.CRCKey, CRC); + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, MD5); + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, SHA1); + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, SHA256); return rom; } diff --git a/SabreTools.DatItems/Formats/Info.cs b/SabreTools.DatItems/Formats/Info.cs index b40336a4..3be6ed29 100644 --- a/SabreTools.DatItems/Formats/Info.cs +++ b/SabreTools.DatItems/Formats/Info.cs @@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("info"), XmlRoot("info")] public class Info : DatItem { - #region Fields - - /// - /// Information value - /// - [JsonProperty("value"), XmlElement("value")] - public string? Value - { - get => _internal.ReadString(Models.Metadata.Info.ValueKey); - set => _internal[Models.Metadata.Info.ValueKey] = value; - } - - #endregion - #region Accessors /// diff --git a/SabreTools.DatItems/Formats/Input.cs b/SabreTools.DatItems/Formats/Input.cs index 26a52399..1a15df1d 100644 --- a/SabreTools.DatItems/Formats/Input.cs +++ b/SabreTools.DatItems/Formats/Input.cs @@ -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 - /// - /// Input service ID - /// - [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; } } - - /// - /// Determins if this has a tilt sensor - /// - [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; + get + { + var controls = GetFieldValue(Models.Metadata.Input.ControlKey); + return controls != null && controls.Length > 0; + } } - [JsonIgnore] - public bool TiltSpecified { get { return Tilt != null; } } - - /// - /// Number of players on the input - /// - [JsonProperty("players", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("players")] - public long? Players - { - get => _internal.ReadLong(Models.Metadata.Input.PlayersKey); - set => _internal[Models.Metadata.Input.PlayersKey] = value; - } - - [JsonIgnore] - public bool PlayersSpecified { get { return Players != null; } } - - /// - /// Number of coins required - /// - [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; } } - - /// - /// Set of controls for the input - /// - [JsonProperty("controls", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("controls")] - public List? Controls - { - get => _internal.Read(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 diff --git a/SabreTools.DatItems/Formats/Instance.cs b/SabreTools.DatItems/Formats/Instance.cs index 275ff993..7653596c 100644 --- a/SabreTools.DatItems/Formats/Instance.cs +++ b/SabreTools.DatItems/Formats/Instance.cs @@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("instance"), XmlRoot("instance")] public class Instance : DatItem { - #region Fields - - /// - /// Short name for the instance - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/Media.cs b/SabreTools.DatItems/Formats/Media.cs index ac0914be..fccebd68 100644 --- a/SabreTools.DatItems/Formats/Media.cs +++ b/SabreTools.DatItems/Formats/Media.cs @@ -12,50 +12,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("media"), XmlRoot("media")] public class Media : DatItem { - #region Fields - - /// - /// Data MD5 hash - /// - [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); - } - - /// - /// Data SHA-1 hash - /// - [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); - } - - /// - /// Data SHA-256 hash - /// - [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); - } - - /// - /// File SpamSum fuzzy hash - /// - [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 /// @@ -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(Models.Metadata.Media.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); + SetFieldValue(Models.Metadata.Media.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); + SetFieldValue(Models.Metadata.Media.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256)); + SetFieldValue(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(Models.Metadata.Media.MD5Key)), + SHA1 = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Media.SHA1Key)), + SHA256 = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Media.SHA256Key)), + SpamSum = System.Text.Encoding.UTF8.GetBytes(GetFieldValue(Models.Metadata.Media.SpamSumKey) ?? string.Empty), }; } @@ -185,19 +141,19 @@ namespace SabreTools.DatItems.Formats switch (bucketedBy) { case ItemKey.MD5: - key = MD5; + key = GetFieldValue(Models.Metadata.Media.MD5Key); break; case ItemKey.SHA1: - key = SHA1; + key = GetFieldValue(Models.Metadata.Media.SHA1Key); break; case ItemKey.SHA256: - key = SHA256; + key = GetFieldValue(Models.Metadata.Media.SHA256Key); break; case ItemKey.SpamSum: - key = SpamSum; + key = GetFieldValue(Models.Metadata.Media.SpamSumKey); break; // Let the base handle generic stuff diff --git a/SabreTools.DatItems/Formats/Part.cs b/SabreTools.DatItems/Formats/Part.cs index 9d9c15b0..e62c15bc 100644 --- a/SabreTools.DatItems/Formats/Part.cs +++ b/SabreTools.DatItems/Formats/Part.cs @@ -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? Features - { - get => _internal.Read(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(Models.Metadata.Part.FeatureKey); + return features != null && features.Length > 0; + } + } #endregion diff --git a/SabreTools.DatItems/Formats/PartFeature.cs b/SabreTools.DatItems/Formats/PartFeature.cs index cda31206..a762a750 100644 --- a/SabreTools.DatItems/Formats/PartFeature.cs +++ b/SabreTools.DatItems/Formats/PartFeature.cs @@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("part_feature"), XmlRoot("part_feature")] public class PartFeature : DatItem { - #region Fields - - /// - /// PartFeature value - /// - [JsonProperty("value"), XmlElement("value")] - public string? Value - { - get => _internal.ReadString(Models.Metadata.Feature.ValueKey); - set => _internal[Models.Metadata.Feature.ValueKey] = value; - } - - #endregion - #region Accessors /// diff --git a/SabreTools.DatItems/Formats/Port.cs b/SabreTools.DatItems/Formats/Port.cs index 961b31ba..67bc7459 100644 --- a/SabreTools.DatItems/Formats/Port.cs +++ b/SabreTools.DatItems/Formats/Port.cs @@ -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 - /// - /// Tag for the port - /// - [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("tag")] - public string? Tag - { - get => _internal.ReadString(Models.Metadata.Port.TagKey); - set => _internal[Models.Metadata.Port.TagKey] = value; - } - - /// - /// List of analogs on the port - /// - [JsonProperty("analogs", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("analogs")] - public List? Analogs - { - get => _internal.Read(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(Models.Metadata.Port.AnalogKey); + return analogs != null && analogs.Length > 0; + } + } #endregion diff --git a/SabreTools.DatItems/Formats/RamOption.cs b/SabreTools.DatItems/Formats/RamOption.cs index e6b4255b..aba44c74 100644 --- a/SabreTools.DatItems/Formats/RamOption.cs +++ b/SabreTools.DatItems/Formats/RamOption.cs @@ -10,33 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("ramoption"), XmlRoot("ramoption")] public class RamOption : DatItem { - #region Fields - - /// - /// Determine whether the RamOption is default - /// - [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; } } - - /// - /// Determines the content of the RamOption - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/Release.cs b/SabreTools.DatItems/Formats/Release.cs index 20495b35..56d98934 100644 --- a/SabreTools.DatItems/Formats/Release.cs +++ b/SabreTools.DatItems/Formats/Release.cs @@ -10,53 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("release"), XmlRoot("release")] public class Release : DatItem { - #region Fields - - /// - /// Release region(s) - /// - [JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("region")] - public string? Region - { - get => _internal.ReadString(Models.Metadata.Release.RegionKey); - set => _internal[Models.Metadata.Release.RegionKey] = value; - } - - /// - /// Release language(s) - /// - [JsonProperty("language", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("language")] - public string? Language - { - get => _internal.ReadString(Models.Metadata.Release.LanguageKey); - set => _internal[Models.Metadata.Release.LanguageKey] = value; - } - - /// - /// Date of release - /// - [JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("date")] - public string? Date - { - get => _internal.ReadString(Models.Metadata.Release.DateKey); - set => _internal[Models.Metadata.Release.DateKey] = value; - } - - /// - /// Default release, if applicable - /// - [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 /// @@ -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 diff --git a/SabreTools.DatItems/Formats/ReleaseDetails.cs b/SabreTools.DatItems/Formats/ReleaseDetails.cs index a3c97774..b4df93ca 100644 --- a/SabreTools.DatItems/Formats/ReleaseDetails.cs +++ b/SabreTools.DatItems/Formats/ReleaseDetails.cs @@ -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; } } - /// /// NFO CRC value /// diff --git a/SabreTools.DatItems/Formats/Rom.cs b/SabreTools.DatItems/Formats/Rom.cs index 2ba6554e..422f7df9 100644 --- a/SabreTools.DatItems/Formats/Rom.cs +++ b/SabreTools.DatItems/Formats/Rom.cs @@ -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 - - /// - /// What BIOS is required for this rom - /// - [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; - } - - /// - /// Byte size of the rom - /// - [JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("size")] - public long? Size - { - get => _internal.ReadLong(Models.Metadata.Rom.SizeKey); - set => _internal[Models.Metadata.Rom.SizeKey] = value; + get + { + var status = GetFieldValue(Models.Metadata.Rom.StatusKey); + return status != ItemStatus.NULL && status != ItemStatus.None; + } } [JsonIgnore] - public bool SizeSpecified { get { return Size != null; } } - - /// - /// File CRC32 hash - /// - [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); - } - - /// - /// File MD5 hash - /// - [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); - } - - /// - /// File SHA-1 hash - /// - [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); - } - - /// - /// File SHA-256 hash - /// - [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); - } - - /// - /// File SHA-384 hash - /// - [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); - } - - /// - /// File SHA-512 hash - /// - [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); - } - - /// - /// File SpamSum fuzzy hash - /// - [JsonProperty("spamsum", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("spamsum")] - public string? SpamSum - { - get => _internal.ReadString(Models.Metadata.Rom.SpamSumKey); - set => _internal[Models.Metadata.Rom.SpamSumKey] = value; - } - - /// - /// Rom name to merge from parent - /// - [JsonProperty("merge", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("merge")] - public string? MergeTag - { - get => _internal.ReadString(Models.Metadata.Rom.MergeKey); - set => _internal[Models.Metadata.Rom.MergeKey] = value; - } - - /// - /// Rom region - /// - [JsonProperty("region", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("biregionos")] - public string? Region - { - get => _internal.ReadString(Models.Metadata.Rom.RegionKey); - set => _internal[Models.Metadata.Rom.RegionKey] = value; - } - - /// - /// Data offset within rom - /// - [JsonProperty("offset", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("offset")] - public string? Offset - { - get => _internal.ReadString(Models.Metadata.Rom.OffsetKey); - set => _internal[Models.Metadata.Rom.OffsetKey] = value; - } - - /// - /// File created date - /// - [JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("date")] - public string? Date - { - get => _internal.ReadString(Models.Metadata.Rom.DateKey); - set => _internal[Models.Metadata.Rom.DateKey] = value; - } - - /// - /// Rom dump status - /// - [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("status")] - [JsonConverter(typeof(StringEnumConverter))] - public ItemStatus ItemStatus - { - get => _internal.ReadString(Models.Metadata.Rom.StatusKey).AsEnumValue(); - set => _internal[Models.Metadata.Rom.StatusKey] = value.AsStringValue(useSecond: false); - } - - [JsonIgnore] - public bool ItemStatusSpecified { get { return ItemStatus != ItemStatus.NULL && ItemStatus != ItemStatus.None; } } - - /// - /// Determine if the rom is optional in the set - /// - [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; } } - - /// - /// Determine if the CRC32 hash is inverted - /// - [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 - - /// - /// Source of file - /// - [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; - } - - /// - /// Archive.org recognized file format - /// - [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; - } - - /// - /// Original filename - /// - [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; - } - - /// - /// Image rotation - /// - /// - /// TODO: This might be Int32? - /// - [JsonProperty("rotation", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("rotation")] - public string? Rotation - { - get => _internal.ReadString(Models.Metadata.Rom.RotationKey); - set => _internal[Models.Metadata.Rom.RotationKey] = value; - } - - /// - /// Summation value? - /// - [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 - - /// - /// Alternate name for the item - /// - [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; - } - - /// - /// Alternate title for the item - /// - [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 - - /// - /// Alternate title for the item - /// - [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 - - /// - /// OpenMSX sub item type - /// - /// Hack on top of internal model - [JsonProperty("original", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("original")] - public Original? Original - { - get => _internal.Read("ORIGINAL"); - set => _internal["ORIGINAL"] = value; - } - - [JsonIgnore] - public bool OriginalSpecified { get { return Original != null && Original != default; } } - - /// - /// OpenMSX sub item type - /// - [JsonProperty("openmsx_subtype", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("openmsx_subtype")] - [JsonConverter(typeof(StringEnumConverter))] - public OpenMSXSubType OpenMSXSubType - { - get => _internal.ReadString(Models.Metadata.Rom.OpenMSXMediaType).AsEnumValue(); - set => _internal[Models.Metadata.Rom.OpenMSXMediaType] = value.AsStringValue(); - } - - [JsonIgnore] - public bool OpenMSXSubTypeSpecified { get { return OpenMSXSubType != OpenMSXSubType.NULL; } } - - /// - /// OpenMSX sub item type - /// - /// Not related to the subtype above - [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; - } - - /// - /// Item remark (like a comment) - /// - [JsonProperty("remark", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("remark")] - public string? Remark - { - get => _internal.ReadString(Models.Metadata.Rom.RemarkKey); - set => _internal[Models.Metadata.Rom.RemarkKey] = value; - } - - /// - /// Boot state - /// - /// 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 - - /// - /// Data area information - /// - /// Hack on top of internal model - [JsonProperty("dataarea", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("dataarea")] - public DataArea? DataArea - { - get => _internal.Read("DATAAREA"); - set => _internal["DATAAREA"] = value; + get + { + var original = GetFieldValue("ORIGINAL"); + return original != null && original != default; + } } [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"); + return dataArea != null + && (!string.IsNullOrEmpty(dataArea.GetName()) + || dataArea.GetFieldValue(Models.Metadata.DataArea.SizeKey) != null + || dataArea.GetFieldValue(Models.Metadata.DataArea.WidthKey) != null + || dataArea.GetFieldValue(Models.Metadata.DataArea.EndiannessKey) != Endianness.NULL); } } - /// - /// Loading flag - /// - [JsonProperty("loadflag", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("loadflag")] - [JsonConverter(typeof(StringEnumConverter))] - public LoadFlag LoadFlag - { - get => _internal.ReadString(Models.Metadata.Rom.LoadFlagKey).AsEnumValue(); - set => _internal[Models.Metadata.Rom.LoadFlagKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool LoadFlagSpecified { get { return LoadFlag != LoadFlag.NULL; } } - - /// - /// Original hardware part associated with the item - /// - /// Hack on top of internal model - [JsonProperty("part", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("part")] - public Part? Part - { - get => _internal.Read("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"); + return part != null + && (!string.IsNullOrEmpty(part.GetName()) + || !string.IsNullOrEmpty(part.GetFieldValue(Models.Metadata.Part.InterfaceKey))); } } - /// - /// SoftwareList value associated with the item - /// - [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(Models.Metadata.Rom.StatusKey, ItemStatus.None); } /// @@ -467,8 +99,8 @@ namespace SabreTools.DatItems.Formats _internal = new Models.Metadata.Rom(); SetName(name); ItemType = ItemType.Rom; - Size = null; - ItemStatus = ItemStatus.None; + SetFieldValue(Models.Metadata.Rom.SizeKey, null); + SetFieldValue(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(Models.Metadata.Rom.SizeKey, baseFile.Size); + SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.ByteArrayToString(baseFile.CRC)); + SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); + SetFieldValue(Models.Metadata.Rom.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); + SetFieldValue(Models.Metadata.Rom.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256)); + SetFieldValue(Models.Metadata.Rom.SHA384Key, TextHelper.ByteArrayToString(baseFile.SHA384)); + SetFieldValue(Models.Metadata.Rom.SHA512Key, TextHelper.ByteArrayToString(baseFile.SHA512)); + SetFieldValue(Models.Metadata.Rom.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? [])); ItemType = ItemType.Rom; DupeType = 0x00; - ItemStatus = ItemStatus.None; - Date = baseFile.Date; + SetFieldValue(Models.Metadata.Rom.StatusKey, ItemStatus.None); + SetFieldValue(Models.Metadata.Rom.DateKey, baseFile.Date); } /// @@ -511,7 +143,7 @@ namespace SabreTools.DatItems.Formats ItemType = ItemType.Rom; DupeType = 0x00; - ItemStatus = ItemStatus.None; + SetFieldValue(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(Models.Metadata.Rom.DateKey), + Size = GetFieldValue(Models.Metadata.Rom.SizeKey), + CRC = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Rom.CRCKey)), + MD5 = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Rom.MD5Key)), + SHA1 = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Rom.SHA1Key)), + SHA256 = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Rom.SHA256Key)), + SHA384 = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Rom.SHA384Key)), + SHA512 = TextHelper.StringToByteArray(GetFieldValue(Models.Metadata.Rom.SHA512Key)), + SpamSum = System.Text.Encoding.UTF8.GetBytes(GetFieldValue(Models.Metadata.Rom.SpamSumKey) ?? string.Empty), }; } @@ -597,31 +229,31 @@ namespace SabreTools.DatItems.Formats switch (bucketedBy) { case ItemKey.CRC: - key = CRC; + key = GetFieldValue(Models.Metadata.Rom.CRCKey); break; case ItemKey.MD5: - key = MD5; + key = GetFieldValue(Models.Metadata.Rom.MD5Key); break; case ItemKey.SHA1: - key = SHA1; + key = GetFieldValue(Models.Metadata.Rom.SHA1Key); break; case ItemKey.SHA256: - key = SHA256; + key = GetFieldValue(Models.Metadata.Rom.SHA256Key); break; case ItemKey.SHA384: - key = SHA384; + key = GetFieldValue(Models.Metadata.Rom.SHA384Key); break; case ItemKey.SHA512: - key = SHA512; + key = GetFieldValue(Models.Metadata.Rom.SHA512Key); break; case ItemKey.SpamSum: - key = SpamSum; + key = GetFieldValue(Models.Metadata.Rom.SpamSumKey); break; // Let the base handle generic stuff diff --git a/SabreTools.DatItems/Formats/SharedFeature.cs b/SabreTools.DatItems/Formats/SharedFeature.cs index 969bf769..1afc67d8 100644 --- a/SabreTools.DatItems/Formats/SharedFeature.cs +++ b/SabreTools.DatItems/Formats/SharedFeature.cs @@ -10,20 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("sharedfeat"), XmlRoot("sharedfeat")] public class SharedFeature : DatItem { - #region Fields - - /// - /// SharedFeature value - /// - [JsonProperty("value"), XmlElement("value")] - public string? Value - { - get => _internal.ReadString(Models.Metadata.SharedFeat.ValueKey); - set => _internal[Models.Metadata.SharedFeat.ValueKey] = value; - } - - #endregion - #region Accessors /// diff --git a/SabreTools.DatItems/Formats/Slot.cs b/SabreTools.DatItems/Formats/Slot.cs index 769ac0f2..0a5a462f 100644 --- a/SabreTools.DatItems/Formats/Slot.cs +++ b/SabreTools.DatItems/Formats/Slot.cs @@ -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 - /// - /// Slot options associated with the slot - /// - [JsonProperty("slotoptions", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("slotoptions")] - public List? SlotOptions - { - get => _internal.Read(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(Models.Metadata.Slot.SlotOptionKey); + return slotOptions != null && slotOptions.Length > 0; + } + } #endregion diff --git a/SabreTools.DatItems/Formats/SlotOption.cs b/SabreTools.DatItems/Formats/SlotOption.cs index 03ff6825..1d8a9fc1 100644 --- a/SabreTools.DatItems/Formats/SlotOption.cs +++ b/SabreTools.DatItems/Formats/SlotOption.cs @@ -10,33 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("slotoption"), XmlRoot("slotoption")] public class SlotOption : DatItem { - #region Fields - - /// - /// Referenced device name - /// - [JsonProperty("devname"), XmlElement("devname")] - public string? DeviceName - { - get => _internal.ReadString(Models.Metadata.SlotOption.DevNameKey); - set => _internal[Models.Metadata.SlotOption.DevNameKey] = value; - } - - /// - /// Determines if this slot option is default or not - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/SoftwareList.cs b/SabreTools.DatItems/Formats/SoftwareList.cs index 714e9d5c..cafa3d0f 100644 --- a/SabreTools.DatItems/Formats/SoftwareList.cs +++ b/SabreTools.DatItems/Formats/SoftwareList.cs @@ -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 - - /// - /// Tag for the software list - /// - [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("tag")] - public string? Tag - { - get => _internal.ReadString(Models.Metadata.SoftwareList.TagKey); - set => _internal[Models.Metadata.SoftwareList.TagKey] = value; - } - - /// - /// Status of the softare list according to the machine - /// - [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore)] - [JsonConverter(typeof(StringEnumConverter))] - [XmlElement("status")] - public SoftwareListStatus Status - { - get => _internal.ReadString(Models.Metadata.SoftwareList.StatusKey).AsEnumValue(); - set => _internal[Models.Metadata.SoftwareList.StatusKey] = value.AsStringValue(); - } - - [JsonIgnore] - public bool StatusSpecified { get { return Status != SoftwareListStatus.None; } } - - /// - /// Filter to apply to the software list - /// - [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 /// diff --git a/SabreTools.DatItems/Formats/Sound.cs b/SabreTools.DatItems/Formats/Sound.cs index 0cf84148..2eb92d42 100644 --- a/SabreTools.DatItems/Formats/Sound.cs +++ b/SabreTools.DatItems/Formats/Sound.cs @@ -10,23 +10,6 @@ namespace SabreTools.DatItems.Formats [JsonObject("sound"), XmlRoot("sound")] public class Sound : DatItem { - #region Fields - - /// - /// Number of speakers or channels - /// - [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 /// diff --git a/SabreTools.DatItems/Machine.cs b/SabreTools.DatItems/Machine.cs index 128e78a4..befc2b67 100644 --- a/SabreTools.DatItems/Machine.cs +++ b/SabreTools.DatItems/Machine.cs @@ -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 { } + /// + /// Create a new Machine object from an existing metadata model + /// + /// Machine metadata model + 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]; + } + } + /// /// Create a new Machine object with the included information /// diff --git a/SabreTools.DatTools/Rebuilder.cs b/SabreTools.DatTools/Rebuilder.cs index 143a6113..cc34ddf6 100644 --- a/SabreTools.DatTools/Rebuilder.cs +++ b/SabreTools.DatTools/Rebuilder.cs @@ -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(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(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(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 diff --git a/SabreTools.DatTools/Splitter.cs b/SabreTools.DatTools/Splitter.cs index 66c1f494..40d88dba 100644 --- a/SabreTools.DatTools/Splitter.cs +++ b/SabreTools.DatTools/Splitter.cs @@ -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(Models.Metadata.Rom.StatusKey) == ItemStatus.Nodump) + || (item.ItemType == ItemType.Disk && (item as Disk)!.GetFieldValue(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(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(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(Models.Metadata.Media.SHA256Key))) + || (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue(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(Models.Metadata.Disk.SHA1Key))) + || (item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.GetFieldValue(Models.Metadata.Media.SHA1Key))) + || (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue(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(Models.Metadata.Disk.MD5Key))) + || (item.ItemType == ItemType.Media && !string.IsNullOrEmpty((item as Media)!.GetFieldValue(Models.Metadata.Media.MD5Key))) + || (item.ItemType == ItemType.Rom && !string.IsNullOrEmpty((item as Rom)!.GetFieldValue(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(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(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(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(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(Models.Metadata.Rom.SizeKey) ?? 0; + if ((rom.GetFieldValue(Models.Metadata.Rom.SizeKey) ?? 0) > chunkSize) logger.Error($"{rom.GetName() ?? string.Empty} in {machine} is larger than {chunkSize}"); } } diff --git a/SabreTools.Filtering/Remover.cs b/SabreTools.Filtering/Remover.cs index 2804c4c5..9b84bf61 100644 --- a/SabreTools.Filtering/Remover.cs +++ b/SabreTools.Filtering/Remover.cs @@ -296,7 +296,7 @@ namespace SabreTools.Filtering { if (configuration.ConditionsSpecified) { - foreach (Condition subCondition in configuration.Conditions!) + foreach (Condition subCondition in configuration.GetFieldValue(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(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(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(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(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(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(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(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(Models.Metadata.DipSwitch.DipValueKey)!) { RemoveFields(subValue as DatItem); } } if (dipSwitch.PartSpecified) - RemoveFields(dipSwitch.Part! as DatItem); + RemoveFields(dipSwitch.GetFieldValue("PART")! as DatItem); } /// @@ -399,7 +399,7 @@ namespace SabreTools.Filtering { if (dipValue.ConditionsSpecified) { - foreach (Condition subCondition in dipValue.Conditions!) + foreach (Condition subCondition in dipValue.GetFieldValue(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")! as DatItem); if (disk.PartSpecified) - RemoveFields(disk.Part! as DatItem); + RemoveFields(disk.GetFieldValue("PART")! as DatItem); } /// @@ -427,7 +427,7 @@ namespace SabreTools.Filtering { if (input.ControlsSpecified) { - foreach (Control subControl in input.Controls!) + foreach (Control subControl in input.GetFieldValue(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(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(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")!); if (rom.PartSpecified) - RemoveFields(rom.Part! as DatItem); + RemoveFields(rom.GetFieldValue("PART")! as DatItem); } /// @@ -485,7 +485,7 @@ namespace SabreTools.Filtering { if (slot.SlotOptionsSpecified) { - foreach (SlotOption subSlotOption in slot.SlotOptions!) + foreach (SlotOption subSlotOption in slot.GetFieldValue(Models.Metadata.Slot.SlotOptionKey)!) { RemoveFields(subSlotOption); } diff --git a/SabreTools.Filtering/Replacer.cs b/SabreTools.Filtering/Replacer.cs index 6a4cab53..57bd4e1f 100644 --- a/SabreTools.Filtering/Replacer.cs +++ b/SabreTools.Filtering/Replacer.cs @@ -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(Models.Metadata.Disk.MD5Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Disk.MD5Key))) + disk.SetFieldValue(Models.Metadata.Disk.MD5Key, newItem.GetFieldValue(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(Models.Metadata.Disk.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Disk.SHA1Key))) + disk.SetFieldValue(Models.Metadata.Disk.SHA1Key, newItem.GetFieldValue(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(Models.Metadata.Media.MD5Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Media.MD5Key))) + media.SetFieldValue(Models.Metadata.Media.MD5Key, newItem.GetFieldValue(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(Models.Metadata.Media.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Media.SHA1Key))) + media.SetFieldValue(Models.Metadata.Media.SHA1Key, newItem.GetFieldValue(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(Models.Metadata.Media.SHA256Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Media.SHA256Key))) + media.SetFieldValue(Models.Metadata.Media.SHA256Key, newItem.GetFieldValue(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(Models.Metadata.Media.SpamSumKey)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Media.SpamSumKey))) + media.SetFieldValue(Models.Metadata.Media.SpamSumKey, newItem.GetFieldValue(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(Models.Metadata.Rom.CRCKey)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Rom.CRCKey))) + rom.SetFieldValue(Models.Metadata.Rom.CRCKey, newItem.GetFieldValue(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(Models.Metadata.Rom.MD5Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Rom.MD5Key))) + rom.SetFieldValue(Models.Metadata.Rom.MD5Key, newItem.GetFieldValue(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(Models.Metadata.Rom.SHA1Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Rom.SHA1Key))) + rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, newItem.GetFieldValue(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(Models.Metadata.Rom.SHA256Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Rom.SHA256Key))) + rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, newItem.GetFieldValue(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(Models.Metadata.Rom.SHA384Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Rom.SHA384Key))) + rom.SetFieldValue(Models.Metadata.Rom.SHA384Key, newItem.GetFieldValue(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(Models.Metadata.Rom.SHA512Key)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Rom.SHA512Key))) + rom.SetFieldValue(Models.Metadata.Rom.SHA512Key, newItem.GetFieldValue(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(Models.Metadata.Rom.SpamSumKey)) && !string.IsNullOrEmpty(newItem.GetFieldValue(Models.Metadata.Rom.SpamSumKey))) + rom.SetFieldValue(Models.Metadata.Rom.SpamSumKey, newItem.GetFieldValue(Models.Metadata.Rom.SpamSumKey)); } } } diff --git a/SabreTools.Filtering/Splitter.cs b/SabreTools.Filtering/Splitter.cs index 6cf8d1f2..c6930dbe 100644 --- a/SabreTools.Filtering/Splitter.cs +++ b/SabreTools.Filtering/Splitter.cs @@ -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(Models.Metadata.Slot.SlotOptionKey)!) + .Select(so => so.GetFieldValue(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(Models.Metadata.Slot.SlotOptionKey)!) + .Select(o => o.GetFieldValue(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 { new SlotOption { DeviceName = slotOption } } }); + { + var slotOptionItem = new SlotOption(); + slotOptionItem.SetFieldValue(Models.Metadata.SlotOption.DevNameKey, slotOption); + + var slotItem = new Slot(); + slotItem.SetFieldValue(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(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(Models.Metadata.Rom.MergeKey) != null && datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Rom).Select(i => (i as Rom)!.GetName()).Contains(rom.GetFieldValue(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(Models.Metadata.Rom.MergeKey) != null && !datFile.Items[parent!]!.Where(i => i.ItemType == ItemType.Rom).Select(i => (i as Rom)!.GetName()).Contains(rom.GetFieldValue(Models.Metadata.Rom.MergeKey))) { if (subfolder) rom.SetName($"{rom.Machine.Name}\\{rom.GetName()}"); diff --git a/SabreTools.Test/DatFiles/ItemDictionaryTests.cs b/SabreTools.Test/DatFiles/ItemDictionaryTests.cs index 495b5b0b..175f817f 100644 --- a/SabreTools.Test/DatFiles/ItemDictionaryTests.cs +++ b/SabreTools.Test/DatFiles/ItemDictionaryTests.cs @@ -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(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + rom1.SetFieldValue(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6"); + rom1.SetFieldValue(Models.Metadata.Rom.SizeKey, 1024); + + var rom2 = new Rom { Machine = new Machine { Name = "game-1" } }; + rom2.SetName("rom-2"); + rom2.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + rom2.SetFieldValue(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44"); + rom2.SetFieldValue(Models.Metadata.Rom.SizeKey, 1024); + + var rom3 = new Rom { Machine = new Machine { Name = "game-2" } }; + rom3.SetName("rom-3"); + rom3.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + rom3.SetFieldValue(Models.Metadata.Rom.SHA1Key, "00000ea4014ce66679e7e17d56ac510f67e39e26"); + rom3.SetFieldValue(Models.Metadata.Rom.SizeKey, 1024); + + var rom4 = new Rom { Machine = new Machine { Name = "game-2" } }; + rom4.SetName("rom-4"); + rom4.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + rom4.SetFieldValue(Models.Metadata.Rom.SHA1Key, "00000151d437442e74e5134023fab8bf694a2487"); + rom4.SetFieldValue(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(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + rom1.SetFieldValue(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6"); + rom1.SetFieldValue(Models.Metadata.Rom.SizeKey, 1024); + + var rom2 = new Rom { Machine = new Machine { Name = "game-1" }, Remove = true }; + rom2.SetName("rom-2"); + rom2.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + rom2.SetFieldValue(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44"); + rom2.SetFieldValue(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(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6"); + rom1.SetFieldValue(Models.Metadata.Rom.SizeKey, 1024); + + var rom2 = new Rom { Machine = new Machine { Name = "game-1" } }; + rom2.SetName("rom-2"); + rom2.SetFieldValue(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44"); + rom2.SetFieldValue(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(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6"); + rom.SetFieldValue(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(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6"); + rom1.SetFieldValue(Models.Metadata.Rom.SizeKey, 1024); + + var rom2 = new Rom { Machine = new Machine { Name = "game-1" } }; + rom2.SetName("rom-2"); + rom2.SetFieldValue(Models.Metadata.Rom.SHA1Key, "000000e948edcb4f7704b8af85a77a3339ecce44"); + rom2.SetFieldValue(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(Models.Metadata.Rom.SHA1Key, "0000000fbbb37f8488100b1b4697012de631a5e6"); + rom.SetFieldValue(Models.Metadata.Rom.SizeKey, expected ? 1024 : 2048); bool actual = dict.HasDuplicates(rom); Assert.Equal(expected, actual); diff --git a/SabreTools.Test/DatItems/DatItemTests.cs b/SabreTools.Test/DatItems/DatItemTests.cs index 0183fdc6..18e2c92f 100644 --- a/SabreTools.Test/DatItems/DatItemTests.cs +++ b/SabreTools.Test/DatItems/DatItemTests.cs @@ -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);