diff --git a/SabreTools.Core.Test/DictionaryBaseExtensionsTests.cs b/SabreTools.Core.Test/DictionaryBaseExtensionsTests.cs index 96daf827..bd476d0b 100644 --- a/SabreTools.Core.Test/DictionaryBaseExtensionsTests.cs +++ b/SabreTools.Core.Test/DictionaryBaseExtensionsTests.cs @@ -6,12 +6,6 @@ namespace SabreTools.Core.Test { public class DictionaryBaseExtensionsTests { - #region Clone - - // TODO: Figure out how to test Clone - - #endregion - #region ConvertToRom [Fact] @@ -385,6 +379,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -398,6 +394,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -418,6 +416,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = string.Empty, @@ -430,6 +430,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = "XXXXXX", @@ -449,6 +451,8 @@ namespace SabreTools.Core.Test { [Rom.NameKey] = "XXXXXX1", [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -461,6 +465,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -481,6 +487,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -492,6 +500,8 @@ namespace SabreTools.Core.Test { [Rom.NameKey] = "XXXXXX2", [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -512,6 +522,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -524,6 +536,80 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", + [Rom.MD5Key] = "XXXXXX", + [Rom.SHA1Key] = "XXXXXX", + [Rom.SHA256Key] = "XXXXXX", + [Rom.SHA384Key] = "XXXXXX", + [Rom.SHA512Key] = "XXXXXX", + [Rom.SpamSumKey] = "XXXXXX", + }; + + bool actual = self.EqualTo(other); + Assert.True(actual); + } + + [Fact] + public void EqualTo_Rom_PartialMD2_True() + { + DictionaryBase self = new Rom + { + [Rom.NameKey] = "XXXXXX1", + [Rom.SizeKey] = 12345, + [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = string.Empty, + [Rom.MD5Key] = string.Empty, + [Rom.SHA1Key] = string.Empty, + [Rom.SHA256Key] = string.Empty, + [Rom.SHA384Key] = string.Empty, + [Rom.SHA512Key] = string.Empty, + [Rom.SpamSumKey] = string.Empty, + }; + DictionaryBase other = new Rom + { + [Rom.NameKey] = "XXXXXX2", + [Rom.SizeKey] = 12345, + [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", + [Rom.MD5Key] = "XXXXXX", + [Rom.SHA1Key] = "XXXXXX", + [Rom.SHA256Key] = "XXXXXX", + [Rom.SHA384Key] = "XXXXXX", + [Rom.SHA512Key] = "XXXXXX", + [Rom.SpamSumKey] = "XXXXXX", + }; + + bool actual = self.EqualTo(other); + Assert.True(actual); + } + + [Fact] + public void EqualTo_Rom_PartialMD4_True() + { + DictionaryBase self = new Rom + { + [Rom.NameKey] = "XXXXXX1", + [Rom.SizeKey] = 12345, + [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = "XXXXXX", + [Rom.MD5Key] = string.Empty, + [Rom.SHA1Key] = string.Empty, + [Rom.SHA256Key] = string.Empty, + [Rom.SHA384Key] = string.Empty, + [Rom.SHA512Key] = string.Empty, + [Rom.SpamSumKey] = string.Empty, + }; + DictionaryBase other = new Rom + { + [Rom.NameKey] = "XXXXXX2", + [Rom.SizeKey] = 12345, + [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -544,6 +630,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -556,6 +644,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -576,6 +666,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = string.Empty, @@ -588,6 +680,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -608,6 +702,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = "XXXXXX", @@ -620,6 +716,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -640,6 +738,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -652,6 +752,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -672,6 +774,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -684,6 +788,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -704,6 +810,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -716,6 +824,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -736,6 +846,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX1", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -748,6 +860,8 @@ namespace SabreTools.Core.Test [Rom.NameKey] = "XXXXXX2", [Rom.SizeKey] = 12345, [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1049,6 +1163,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = string.Empty, @@ -1059,6 +1175,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = "XXXXXX", @@ -1077,6 +1195,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1087,6 +1207,72 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", + [Rom.MD5Key] = "XXXXXX", + [Rom.SHA1Key] = "XXXXXX", + [Rom.SHA256Key] = "XXXXXX", + [Rom.SHA384Key] = "XXXXXX", + [Rom.SHA512Key] = "XXXXXX", + [Rom.SpamSumKey] = "XXXXXX", + }; + + bool actual = self.HashMatch(other); + Assert.True(actual); + } + + [Fact] + public void HashMatch_Rom_PartialMD2_True() + { + Rom self = new Rom + { + [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = string.Empty, + [Rom.MD5Key] = string.Empty, + [Rom.SHA1Key] = string.Empty, + [Rom.SHA256Key] = string.Empty, + [Rom.SHA384Key] = string.Empty, + [Rom.SHA512Key] = string.Empty, + [Rom.SpamSumKey] = string.Empty, + }; + Rom other = new Rom + { + [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", + [Rom.MD5Key] = "XXXXXX", + [Rom.SHA1Key] = "XXXXXX", + [Rom.SHA256Key] = "XXXXXX", + [Rom.SHA384Key] = "XXXXXX", + [Rom.SHA512Key] = "XXXXXX", + [Rom.SpamSumKey] = "XXXXXX", + }; + + bool actual = self.HashMatch(other); + Assert.True(actual); + } + + [Fact] + public void HashMatch_Rom_PartialMD4_True() + { + Rom self = new Rom + { + [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = "XXXXXX", + [Rom.MD5Key] = string.Empty, + [Rom.SHA1Key] = string.Empty, + [Rom.SHA256Key] = string.Empty, + [Rom.SHA384Key] = string.Empty, + [Rom.SHA512Key] = string.Empty, + [Rom.SpamSumKey] = string.Empty, + }; + Rom other = new Rom + { + [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1105,6 +1291,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1115,6 +1303,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1133,6 +1323,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = string.Empty, @@ -1143,6 +1335,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1161,6 +1355,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = "XXXXXX", @@ -1171,6 +1367,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1189,6 +1387,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1199,6 +1399,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1217,6 +1419,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1227,6 +1431,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1245,6 +1451,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1255,6 +1463,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1273,6 +1483,8 @@ namespace SabreTools.Core.Test Rom self = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1283,6 +1495,8 @@ namespace SabreTools.Core.Test Rom other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1471,6 +1685,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1489,6 +1705,48 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = ZeroHash.CRC32Str, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, + [Rom.MD5Key] = string.Empty, + [Rom.SHA1Key] = string.Empty, + [Rom.SHA256Key] = string.Empty, + [Rom.SHA384Key] = string.Empty, + [Rom.SHA512Key] = string.Empty, + [Rom.SpamSumKey] = string.Empty, + }; + + bool actual = self.HasZeroHash(); + Assert.True(actual); + } + + [Fact] + public void HasZeroHash_Rom_ZeroMD2_True() + { + DictionaryBase self = new Rom + { + [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = ZeroHash.GetString(HashType.MD2), + [Rom.MD4Key] = string.Empty, + [Rom.MD5Key] = string.Empty, + [Rom.SHA1Key] = string.Empty, + [Rom.SHA256Key] = string.Empty, + [Rom.SHA384Key] = string.Empty, + [Rom.SHA512Key] = string.Empty, + [Rom.SpamSumKey] = string.Empty, + }; + + bool actual = self.HasZeroHash(); + Assert.True(actual); + } + + [Fact] + public void HasZeroHash_Rom_ZeroMD4_True() + { + DictionaryBase self = new Rom + { + [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = ZeroHash.GetString(HashType.MD4), [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1507,6 +1765,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = ZeroHash.MD5Str, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1525,6 +1785,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = ZeroHash.SHA1Str, [Rom.SHA256Key] = string.Empty, @@ -1543,6 +1805,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = ZeroHash.SHA256Str, @@ -1561,6 +1825,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1579,6 +1845,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1597,6 +1865,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = string.Empty, + [Rom.MD2Key] = string.Empty, + [Rom.MD4Key] = string.Empty, [Rom.MD5Key] = string.Empty, [Rom.SHA1Key] = string.Empty, [Rom.SHA256Key] = string.Empty, @@ -1615,6 +1885,8 @@ namespace SabreTools.Core.Test DictionaryBase self = new Rom { [Rom.CRCKey] = ZeroHash.CRC32Str, + [Rom.MD2Key] = ZeroHash.GetString(HashType.MD2), + [Rom.MD4Key] = ZeroHash.GetString(HashType.MD4), [Rom.MD5Key] = ZeroHash.MD5Str, [Rom.SHA1Key] = ZeroHash.SHA1Str, [Rom.SHA256Key] = ZeroHash.SHA256Str, @@ -1702,6 +1974,8 @@ namespace SabreTools.Core.Test DictionaryBase other = new Rom { [Rom.CRCKey] = "XXXXXX", + [Rom.MD2Key] = "XXXXXX", + [Rom.MD4Key] = "XXXXXX", [Rom.MD5Key] = "XXXXXX", [Rom.SHA1Key] = "XXXXXX", [Rom.SHA256Key] = "XXXXXX", @@ -1804,6 +2078,24 @@ namespace SabreTools.Core.Test Assert.Equal($"_{hash}", actual); } + [Fact] + public void GetDuplicateSuffix_Rom_MD2() + { + string hash = "XXXXXX"; + DictionaryBase self = new Rom { [Rom.MD2Key] = hash }; + string actual = self.GetDuplicateSuffix(); + Assert.Equal($"_{hash}", actual); + } + + [Fact] + public void GetDuplicateSuffix_Rom_MD4() + { + string hash = "XXXXXX"; + DictionaryBase self = new Rom { [Rom.MD4Key] = hash }; + string actual = self.GetDuplicateSuffix(); + Assert.Equal($"_{hash}", actual); + } + [Fact] public void GetDuplicateSuffix_Rom_MD5() { diff --git a/SabreTools.Core.Test/Tools/TextHelperTests.cs b/SabreTools.Core.Test/Tools/TextHelperTests.cs index f41680a3..4ca4d506 100644 --- a/SabreTools.Core.Test/Tools/TextHelperTests.cs +++ b/SabreTools.Core.Test/Tools/TextHelperTests.cs @@ -35,6 +35,54 @@ namespace SabreTools.Core.Test.Tools #endregion + #region NormalizeMD2 + + [Theory] + [InlineData(null, null)] + [InlineData("", "")] + [InlineData("-", "")] + [InlineData("_", "")] + [InlineData("0x", "")] + [InlineData("1234", "00000000000000000000000000001234")] + [InlineData("0x1234", "00000000000000000000000000001234")] + [InlineData("1234ABCD1234ABCD1234ABCD1234ABCDE", "")] + [InlineData("0x1234ABCD1234ABCD1234ABCD1234ABCDE", "")] + [InlineData("1234ABCD1234ABCD1234ABCD1234ABCD", "1234abcd1234abcd1234abcd1234abcd")] + [InlineData("0x1234ABCD1234ABCD1234ABCD1234ABCD", "1234abcd1234abcd1234abcd1234abcd")] + [InlineData("abcdefghabcdefghabcdefghabcdefgh", "")] + [InlineData("0xabcdefghabcdefghabcdefghabcdefgh", "")] + public void NormalizeMD2Test(string? hash, string? expected) + { + string? actual = TextHelper.NormalizeMD2(hash); + Assert.Equal(expected, actual); + } + + #endregion + + #region NormalizeMD4 + + [Theory] + [InlineData(null, null)] + [InlineData("", "")] + [InlineData("-", "")] + [InlineData("_", "")] + [InlineData("0x", "")] + [InlineData("1234", "00000000000000000000000000001234")] + [InlineData("0x1234", "00000000000000000000000000001234")] + [InlineData("1234ABCD1234ABCD1234ABCD1234ABCDE", "")] + [InlineData("0x1234ABCD1234ABCD1234ABCD1234ABCDE", "")] + [InlineData("1234ABCD1234ABCD1234ABCD1234ABCD", "1234abcd1234abcd1234abcd1234abcd")] + [InlineData("0x1234ABCD1234ABCD1234ABCD1234ABCD", "1234abcd1234abcd1234abcd1234abcd")] + [InlineData("abcdefghabcdefghabcdefghabcdefgh", "")] + [InlineData("0xabcdefghabcdefghabcdefghabcdefgh", "")] + public void NormalizeMD4Test(string? hash, string? expected) + { + string? actual = TextHelper.NormalizeMD4(hash); + Assert.Equal(expected, actual); + } + + #endregion + #region NormalizeMD5 [Theory] diff --git a/SabreTools.Core/DictionaryBaseExtensions.cs b/SabreTools.Core/DictionaryBaseExtensions.cs index e2232018..ea4775da 100644 --- a/SabreTools.Core/DictionaryBaseExtensions.cs +++ b/SabreTools.Core/DictionaryBaseExtensions.cs @@ -319,7 +319,8 @@ namespace SabreTools.Core string? otherSha1 = other.ReadString(Disk.SHA1Key); bool conditionalSha1 = Tools.Utilities.ConditionalHashEquals(selfSha1, otherSha1); - return conditionalMd5 && conditionalSha1; + return conditionalMd5 + && conditionalSha1; } /// @@ -352,7 +353,10 @@ namespace SabreTools.Core string? otherSpamSum = other.ReadString(Media.SpamSumKey); bool conditionalSpamSum = Tools.Utilities.ConditionalHashEquals(selfSpamSum, otherSpamSum); - return conditionalMd5 && conditionalSha1 && conditionalSha256 && conditionalSpamSum; + return conditionalMd5 + && conditionalSha1 + && conditionalSha256 + && conditionalSpamSum; } /// @@ -373,6 +377,14 @@ namespace SabreTools.Core string? otherCrc = other.ReadString(Rom.CRCKey); bool conditionalCrc = Tools.Utilities.ConditionalHashEquals(selfCrc, otherCrc); + string? selfMd2 = self.ReadString(Rom.MD2Key); + string? otherMd2 = other.ReadString(Rom.MD2Key); + bool conditionalMd2 = Tools.Utilities.ConditionalHashEquals(selfMd2, otherMd2); + + string? selfMd4 = self.ReadString(Rom.MD4Key); + string? otherMd4 = other.ReadString(Rom.MD4Key); + bool conditionalMd4 = Tools.Utilities.ConditionalHashEquals(selfMd4, otherMd4); + string? selfMd5 = self.ReadString(Rom.MD5Key); string? otherMd5 = other.ReadString(Rom.MD5Key); bool conditionalMd5 = Tools.Utilities.ConditionalHashEquals(selfMd5, otherMd5); @@ -397,7 +409,15 @@ namespace SabreTools.Core string? otherSpamSum = other.ReadString(Rom.SpamSumKey); bool conditionalSpamSum = Tools.Utilities.ConditionalHashEquals(selfSpamSum, otherSpamSum); - return conditionalCrc && conditionalMd5 && conditionalSha1 && conditionalSha256 && conditionalSha384 && conditionalSha512 && conditionalSpamSum; + return conditionalCrc + && conditionalMd2 + && conditionalMd4 + && conditionalMd5 + && conditionalSha1 + && conditionalSha256 + && conditionalSha384 + && conditionalSha512 + && conditionalSpamSum; } /// @@ -439,7 +459,8 @@ namespace SabreTools.Core bool sha1Null = string.IsNullOrEmpty(self.ReadString(Disk.SHA1Key)); sha1Null ^= string.IsNullOrEmpty(other.ReadString(Disk.SHA1Key)); - return !md5Null || !sha1Null; + return !md5Null + || !sha1Null; } /// @@ -459,7 +480,10 @@ namespace SabreTools.Core bool spamsumNull = string.IsNullOrEmpty(self.ReadString(Media.SpamSumKey)); spamsumNull ^= string.IsNullOrEmpty(other.ReadString(Media.SpamSumKey)); - return !md5Null || !sha1Null || !sha256Null || !spamsumNull; + return !md5Null + || !sha1Null + || !sha256Null + || !spamsumNull; } /// @@ -470,6 +494,12 @@ namespace SabreTools.Core bool crcNull = string.IsNullOrEmpty(self.ReadString(Rom.CRCKey)); crcNull ^= string.IsNullOrEmpty(other.ReadString(Rom.CRCKey)); + bool md2Null = string.IsNullOrEmpty(self.ReadString(Rom.MD2Key)); + md2Null ^= string.IsNullOrEmpty(other.ReadString(Rom.MD2Key)); + + bool md4Null = string.IsNullOrEmpty(self.ReadString(Rom.MD4Key)); + md4Null ^= string.IsNullOrEmpty(other.ReadString(Rom.MD4Key)); + bool md5Null = string.IsNullOrEmpty(self.ReadString(Rom.MD5Key)); md5Null ^= string.IsNullOrEmpty(other.ReadString(Rom.MD5Key)); @@ -488,7 +518,15 @@ namespace SabreTools.Core bool spamsumNull = string.IsNullOrEmpty(self.ReadString(Rom.SpamSumKey)); spamsumNull ^= string.IsNullOrEmpty(other.ReadString(Rom.SpamSumKey)); - return !crcNull || !md5Null || !sha1Null || !sha256Null || !sha384Null || !sha512Null || !spamsumNull; + return !crcNull + || !md2Null + || !md4Null + || !md5Null + || !sha1Null + || !sha256Null + || !sha384Null + || !sha512Null + || !spamsumNull; } /// @@ -499,7 +537,8 @@ namespace SabreTools.Core bool md5Null = string.IsNullOrEmpty(disk.ReadString(Disk.MD5Key)); bool sha1Null = string.IsNullOrEmpty(disk.ReadString(Disk.SHA1Key)); - return !md5Null || !sha1Null; + return !md5Null + || !sha1Null; } /// @@ -512,7 +551,10 @@ namespace SabreTools.Core bool sha256Null = string.IsNullOrEmpty(media.ReadString(Media.SHA256Key)); bool spamsumNull = string.IsNullOrEmpty(media.ReadString(Media.SpamSumKey)); - return !md5Null || !sha1Null || !sha256Null || !spamsumNull; + return !md5Null + || !sha1Null + || !sha256Null + || !spamsumNull; } /// @@ -521,6 +563,8 @@ namespace SabreTools.Core private static bool HasHashes(this Rom rom) { bool crcNull = string.IsNullOrEmpty(rom.ReadString(Rom.CRCKey)); + bool md2Null = string.IsNullOrEmpty(rom.ReadString(Rom.MD2Key)); + bool md4Null = string.IsNullOrEmpty(rom.ReadString(Rom.MD4Key)); bool md5Null = string.IsNullOrEmpty(rom.ReadString(Rom.MD5Key)); bool sha1Null = string.IsNullOrEmpty(rom.ReadString(Rom.SHA1Key)); bool sha256Null = string.IsNullOrEmpty(rom.ReadString(Rom.SHA256Key)); @@ -528,7 +572,15 @@ namespace SabreTools.Core bool sha512Null = string.IsNullOrEmpty(rom.ReadString(Rom.SHA512Key)); bool spamsumNull = string.IsNullOrEmpty(rom.ReadString(Rom.SpamSumKey)); - return !crcNull || !md5Null || !sha1Null || !sha256Null || !sha384Null || !sha512Null || !spamsumNull; + return !crcNull + || !md2Null + || !md4Null + || !md5Null + || !sha1Null + || !sha256Null + || !sha384Null + || !sha512Null + || !spamsumNull; } /// @@ -542,7 +594,8 @@ namespace SabreTools.Core string? sha1 = disk.ReadString(Disk.SHA1Key); bool sha1Null = string.IsNullOrEmpty(sha1) || string.Equals(sha1, ZeroHash.SHA1Str, StringComparison.OrdinalIgnoreCase); - return md5Null && sha1Null; + return md5Null + && sha1Null; } /// @@ -562,7 +615,10 @@ namespace SabreTools.Core string? spamsum = media.ReadString(Media.SpamSumKey); bool spamsumNull = string.IsNullOrEmpty(spamsum) || string.Equals(spamsum, ZeroHash.SpamSumStr, StringComparison.OrdinalIgnoreCase); - return md5Null && sha1Null && sha256Null && spamsumNull; + return md5Null + && sha1Null + && sha256Null + && spamsumNull; } /// @@ -573,6 +629,12 @@ namespace SabreTools.Core string? crc = rom.ReadString(Rom.CRCKey); bool crcNull = string.IsNullOrEmpty(crc) || string.Equals(crc, ZeroHash.CRC32Str, StringComparison.OrdinalIgnoreCase); + string? md2 = rom.ReadString(Rom.MD2Key); + bool md2Null = string.IsNullOrEmpty(md2) || string.Equals(md2, ZeroHash.GetString(HashType.MD2), StringComparison.OrdinalIgnoreCase); + + string? md4 = rom.ReadString(Rom.MD4Key); + bool md4Null = string.IsNullOrEmpty(md4) || string.Equals(md4, ZeroHash.GetString(HashType.MD4), StringComparison.OrdinalIgnoreCase); + string? md5 = rom.ReadString(Rom.MD5Key); bool md5Null = string.IsNullOrEmpty(md5) || string.Equals(md5, ZeroHash.MD5Str, StringComparison.OrdinalIgnoreCase); @@ -591,7 +653,15 @@ namespace SabreTools.Core string? spamsum = rom.ReadString(Rom.SpamSumKey); bool spamsumNull = string.IsNullOrEmpty(spamsum) || string.Equals(spamsum, ZeroHash.SpamSumStr, StringComparison.OrdinalIgnoreCase); - return crcNull && md5Null && sha1Null && sha256Null && sha384Null && sha512Null && spamsumNull; + return crcNull + && md2Null + && md4Null + && md5Null + && sha1Null + && sha256Null + && sha384Null + && sha512Null + && spamsumNull; } #endregion @@ -686,6 +756,16 @@ namespace SabreTools.Core if (string.IsNullOrEmpty(selfCrc) && !string.IsNullOrEmpty(otherCrc)) self[Rom.CRCKey] = otherCrc; + string? selfMd2 = self.ReadString(Rom.MD2Key); + string? otherMd2 = other.ReadString(Rom.MD2Key); + if (string.IsNullOrEmpty(selfMd2) && !string.IsNullOrEmpty(otherMd2)) + self[Rom.MD2Key] = otherMd2; + + string? selfMd4 = self.ReadString(Rom.MD4Key); + string? otherMd4 = other.ReadString(Rom.MD4Key); + if (string.IsNullOrEmpty(selfMd4) && !string.IsNullOrEmpty(otherMd4)) + self[Rom.MD4Key] = otherMd4; + string? selfMd5 = self.ReadString(Rom.MD5Key); string? otherMd5 = other.ReadString(Rom.MD5Key); if (string.IsNullOrEmpty(selfMd5) && !string.IsNullOrEmpty(otherMd5)) @@ -787,6 +867,14 @@ namespace SabreTools.Core if (!string.IsNullOrEmpty(crc)) return $"_{crc}"; + string? md2 = self.ReadString(Rom.MD2Key); + if (!string.IsNullOrEmpty(md2)) + return $"_{md2}"; + + string? md4 = self.ReadString(Rom.MD4Key); + if (!string.IsNullOrEmpty(md4)) + return $"_{md4}"; + string? md5 = self.ReadString(Rom.MD5Key); if (!string.IsNullOrEmpty(md5)) return $"_{md5}"; diff --git a/SabreTools.Core/README.1ST b/SabreTools.Core/README.1ST index 14b933df..4faff74f 100644 --- a/SabreTools.Core/README.1ST +++ b/SabreTools.Core/README.1ST @@ -185,6 +185,16 @@ Features and Options: overrides the default hashing behavior of including CRC32, MD5, and SHA-1 hashes. + -md2, --include-md2 Include MD2 in output + This enables MD2 calculation for each of the files. Adding this flag + overrides the default hashing behavior of including CRC32, MD5, and + SHA-1 hashes. + + -md4, --include-md4 Include MD4 in output + This enables MD4 calculation for each of the files. Adding this flag + overrides the default hashing behavior of including CRC32, MD5, and + SHA-1 hashes. + -md5, --include-md5 Include MD5 in output This enables MD5 calculation for each of the files. Adding this flag overrides the default hashing behavior of including CRC32, MD5, and @@ -248,6 +258,8 @@ Features and Options: lr, listrom - MAME Listrom lx, listxml - MAME Listxml miss, missfile - GoodTools Missfile + md2 - MD2 + md4 - MD4 md5 - MD5 msx, openmsx - openMSX Software List ol, offlinelist - OfflineList XML @@ -559,6 +571,8 @@ Features and Options: lr, listrom - MAME Listrom lx, listxml - MAME Listxml miss, missfile - GoodTools Missfile + md2 - MD2 + md4 - MD4 md5 - MD5 msx, openmsx - openMSX Software List ol, offlinelist - OfflineList XML @@ -610,7 +624,7 @@ Features and Options: For a DAT, or set of DATs, allow for splitting based on the best available hash for each file within. The order of preference for the outputted DATs is as follows: Nodump, SHA-512, SHA-384, SHA-256, - SHA-1, MD5, CRC (or worse). + SHA-1, MD5, MD4, MD2, CRC (or worse). -ls, --level Split a SuperDAT or folder by lowest available level For a DAT, or set of DATs, allow for splitting based on the lowest @@ -724,6 +738,8 @@ Features and Options: lr, listrom - MAME Listrom lx, listxml - MAME Listxml miss, missfile - GoodTools Missfile + md2 - MD2 + md4 - MD4 md5 - MD5 msx, openmsx - openMSX Software List ol, offlinelist - OfflineList XML @@ -755,6 +771,8 @@ Features and Options: - %publisher% - Replaced with game Publisher - %category% - Replaced with game Category - %crc% - Replaced with the CRC + - %md2% - Replaced with the MD2 + - %md4% - Replaced with the MD4 - %md5% - Replaced with the MD5 - %sha1% - Replaced with the SHA-1 - %sha256% - Replaced with the SHA-256 diff --git a/SabreTools.Core/Tools/TextHelper.cs b/SabreTools.Core/Tools/TextHelper.cs index 66088173..70df48a1 100644 --- a/SabreTools.Core/Tools/TextHelper.cs +++ b/SabreTools.Core/Tools/TextHelper.cs @@ -33,6 +33,20 @@ namespace SabreTools.Core.Tools public static string? NormalizeCRC32(string? hash) => NormalizeHashData(hash, Constants.CRCLength); + /// + /// Normalize a MD2 string and pad to the correct size + /// + /// MD2 is the same length as MD5 + public static string? NormalizeMD2(string? hash) + => NormalizeHashData(hash, Constants.MD5Length); + + /// + /// Normalize a MD4 string and pad to the correct size + /// + /// MD4 is the same length as MD5 + public static string? NormalizeMD4(string? hash) + => NormalizeHashData(hash, Constants.MD5Length); + /// /// Normalize a MD5 string and pad to the correct size /// diff --git a/SabreTools.DatFiles/DatFile.FromMetadata.cs b/SabreTools.DatFiles/DatFile.FromMetadata.cs index 4c12f7fd..eddb78bb 100644 --- a/SabreTools.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.DatFiles/DatFile.FromMetadata.cs @@ -978,6 +978,10 @@ namespace SabreTools.DatFiles datItem.SetFieldValue(Models.Metadata.Rom.SizeKey, datItem.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString()); if (datItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey) != null) datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.NormalizeCRC32(datItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey))); + if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key) != null) + datItem.SetFieldValue(Models.Metadata.Rom.MD2Key, TextHelper.NormalizeMD2(datItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key))); + if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key) != null) + datItem.SetFieldValue(Models.Metadata.Rom.MD4Key, TextHelper.NormalizeMD5(datItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key))); if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key) != null) datItem.SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.NormalizeMD5(datItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key))); if (datItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) != null) @@ -1234,6 +1238,10 @@ namespace SabreTools.DatFiles romItem.SetFieldValue(Models.Metadata.Rom.SizeKey, romItem.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString()); if (romItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey) != null) romItem.SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.NormalizeCRC32(romItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey))); + if (romItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key) != null) + romItem.SetFieldValue(Models.Metadata.Rom.MD2Key, TextHelper.NormalizeMD2(romItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key))); + if (romItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key) != null) + romItem.SetFieldValue(Models.Metadata.Rom.MD4Key, TextHelper.NormalizeMD4(romItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key))); if (romItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key) != null) romItem.SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.NormalizeMD5(romItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key))); if (romItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) != null) @@ -1542,6 +1550,10 @@ namespace SabreTools.DatFiles datItem.SetFieldValue(Models.Metadata.Rom.SizeKey, datItem.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString()); if (datItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey) != null) datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.NormalizeCRC32(datItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey))); + if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key) != null) + datItem.SetFieldValue(Models.Metadata.Rom.MD2Key, TextHelper.NormalizeMD2(datItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key))); + if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key) != null) + datItem.SetFieldValue(Models.Metadata.Rom.MD4Key, TextHelper.NormalizeMD4(datItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key))); if (datItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key) != null) datItem.SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.NormalizeMD5(datItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key))); if (datItem.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) != null) diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs index 45de6504..04a6ad1c 100644 --- a/SabreTools.DatFiles/DatFile.cs +++ b/SabreTools.DatFiles/DatFile.cs @@ -219,6 +219,8 @@ namespace SabreTools.DatFiles category = machine.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, name = item.GetName() ?? type.AsEnumValue().AsStringValue() ?? string.Empty, crc = string.Empty, + md2 = string.Empty, + md4 = string.Empty, md5 = string.Empty, sha1 = string.Empty, sha256 = string.Empty, @@ -260,6 +262,8 @@ namespace SabreTools.DatFiles else if (item is Rom rom) { crc = rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) ?? string.Empty; + md2 = rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key) ?? string.Empty; + md4 = rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key) ?? string.Empty; md5 = rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) ?? string.Empty; sha1 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) ?? string.Empty; sha256 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) ?? string.Empty; @@ -278,6 +282,8 @@ namespace SabreTools.DatFiles .Replace("%publisher%", publisher) .Replace("%category%", category) .Replace("%crc%", crc) + .Replace("%md2%", md2) + .Replace("%md4%", md4) .Replace("%md5%", md5) .Replace("%sha1%", sha1) .Replace("%sha256%", sha256) @@ -311,6 +317,8 @@ namespace SabreTools.DatFiles category = machine.Value.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) ?? string.Empty, name = item.Value.GetName() ?? type.AsEnumValue().AsStringValue() ?? string.Empty, crc = string.Empty, + md2 = string.Empty, + md4 = string.Empty, md5 = string.Empty, sha1 = string.Empty, sha256 = string.Empty, @@ -352,6 +360,8 @@ namespace SabreTools.DatFiles else if (item.Value is Rom rom) { crc = rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) ?? string.Empty; + md2 = rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key) ?? string.Empty; + md4 = rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key) ?? string.Empty; md5 = rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) ?? string.Empty; sha1 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) ?? string.Empty; sha256 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) ?? string.Empty; @@ -370,6 +380,8 @@ namespace SabreTools.DatFiles .Replace("%publisher%", publisher) .Replace("%category%", category) .Replace("%crc%", crc) + .Replace("%md2%", md2) + .Replace("%md4%", md4) .Replace("%md5%", md5) .Replace("%sha1%", sha1) .Replace("%sha256%", sha256) @@ -615,6 +627,10 @@ namespace SabreTools.DatFiles rom.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); rom.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? ZeroHash.CRC32Str : null); + rom.SetFieldValue(Models.Metadata.Rom.MD2Key, + rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key) == "null" ? ZeroHash.GetString(HashType.MD2) : null); + rom.SetFieldValue(Models.Metadata.Rom.MD4Key, + rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key) == "null" ? ZeroHash.GetString(HashType.MD4) : null); rom.SetFieldValue(Models.Metadata.Rom.MD5Key, rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? ZeroHash.MD5Str : null); rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, @@ -659,6 +675,10 @@ namespace SabreTools.DatFiles rom.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); rom.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) == "null" ? ZeroHash.CRC32Str : null); + rom.SetFieldValue(Models.Metadata.Rom.MD2Key, + rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key) == "null" ? ZeroHash.GetString(HashType.MD2) : null); + rom.SetFieldValue(Models.Metadata.Rom.MD4Key, + rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key) == "null" ? ZeroHash.GetString(HashType.MD4) : null); rom.SetFieldValue(Models.Metadata.Rom.MD5Key, rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) == "null" ? ZeroHash.MD5Str : null); rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, diff --git a/SabreTools.DatFiles/DatStatistics.cs b/SabreTools.DatFiles/DatStatistics.cs index 6a4c68db..771c197c 100644 --- a/SabreTools.DatFiles/DatStatistics.cs +++ b/SabreTools.DatFiles/DatStatistics.cs @@ -145,6 +145,8 @@ namespace SabreTools.DatFiles { TotalSize += rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) ?? 0; AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1); + AddHashCount(HashType.MD2, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key)) ? 0 : 1); + AddHashCount(HashType.MD4, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key)) ? 0 : 1); AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1); AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1); AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1); @@ -345,6 +347,8 @@ namespace SabreTools.DatFiles { TotalSize -= rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) ?? 0; RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1); + RemoveHashCount(HashType.MD2, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key)) ? 0 : 1); + RemoveHashCount(HashType.MD4, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key)) ? 0 : 1); RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1); RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1); RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1); diff --git a/SabreTools.DatFiles/Formats/Hashfile.cs b/SabreTools.DatFiles/Formats/Hashfile.cs index 85c6886a..d395c4e4 100644 --- a/SabreTools.DatFiles/Formats/Hashfile.cs +++ b/SabreTools.DatFiles/Formats/Hashfile.cs @@ -88,6 +88,30 @@ namespace SabreTools.DatFiles.Formats break; } break; + case HashType.MD2: + switch (datItem) + { + case Rom rom: + if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key))) + missingFields.Add(Models.Metadata.Rom.MD2Key); + break; + default: + missingFields.Add(Models.Metadata.Rom.MD2Key); + break; + } + break; + case HashType.MD4: + switch (datItem) + { + case Rom rom: + if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key))) + missingFields.Add(Models.Metadata.Rom.MD4Key); + break; + default: + missingFields.Add(Models.Metadata.Rom.MD4Key); + break; + } + break; case HashType.MD5: switch (datItem) { diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs index 6ea1297c..6c1a454a 100644 --- a/SabreTools.DatFiles/ItemDictionary.cs +++ b/SabreTools.DatFiles/ItemDictionary.cs @@ -232,6 +232,8 @@ namespace SabreTools.DatFiles { rom.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); rom.SetFieldValue(Models.Metadata.Rom.CRCKey, ZeroHash.CRC32Str); + rom.SetFieldValue(Models.Metadata.Rom.MD2Key, null); // ZeroHash.GetString(HashType.MD2) + rom.SetFieldValue(Models.Metadata.Rom.MD4Key, null); // ZeroHash.GetString(HashType.MD4) rom.SetFieldValue(Models.Metadata.Rom.MD5Key, ZeroHash.MD5Str); rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, ZeroHash.SHA1Str); rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, null); // ZeroHash.SHA256Str; @@ -667,6 +669,14 @@ namespace SabreTools.DatFiles else if (diskCount + mediaCount + romCount - nodumpCount == DatStatistics.GetHashCount(HashType.MD5)) return ItemKey.MD5; + // // If all items are supposed to have a MD4, we bucket by that + // else if (diskCount + mediaCount + romCount - nodumpCount == DatStatistics.GetHashCount(HashType.MD4)) + // return ItemKey.MD4; + + // // If all items are supposed to have a MD2, we bucket by that + // else if (diskCount + mediaCount + romCount - nodumpCount == DatStatistics.GetHashCount(HashType.MD2)) + // return ItemKey.MD2; + // Otherwise, we bucket by CRC else return ItemKey.CRC; diff --git a/SabreTools.DatFiles/ItemDictionaryDB.cs b/SabreTools.DatFiles/ItemDictionaryDB.cs index 5403e869..5e723fb2 100644 --- a/SabreTools.DatFiles/ItemDictionaryDB.cs +++ b/SabreTools.DatFiles/ItemDictionaryDB.cs @@ -222,6 +222,8 @@ namespace SabreTools.DatFiles { rom.SetFieldValue(Models.Metadata.Rom.SizeKey, Constants.SizeZero.ToString()); rom.SetFieldValue(Models.Metadata.Rom.CRCKey, ZeroHash.CRC32Str); + rom.SetFieldValue(Models.Metadata.Rom.MD2Key, null); // ZeroHash.GetString(HashType.MD2) + rom.SetFieldValue(Models.Metadata.Rom.MD4Key, null); // ZeroHash.GetString(HashType.MD4) rom.SetFieldValue(Models.Metadata.Rom.MD5Key, ZeroHash.MD5Str); rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, ZeroHash.SHA1Str); rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, null); // ZeroHash.SHA256Str; @@ -865,6 +867,14 @@ namespace SabreTools.DatFiles else if (diskCount + mediaCount + romCount - nodumpCount == DatStatistics.GetHashCount(HashType.MD5)) return ItemKey.MD5; + // // If all items are supposed to have a MD4, we bucket by that + // else if (diskCount + mediaCount + romCount - nodumpCount == DatStatistics.GetHashCount(HashType.MD4)) + // return ItemKey.MD4; + + // // If all items are supposed to have a MD2, we bucket by that + // else if (diskCount + mediaCount + romCount - nodumpCount == DatStatistics.GetHashCount(HashType.MD2)) + // return ItemKey.MD2; + // Otherwise, we bucket by CRC else return ItemKey.CRC; @@ -917,6 +927,8 @@ namespace SabreTools.DatFiles Disk disk => bucketBy switch { ItemKey.CRC => ZeroHash.CRC32Str, + // ItemKey.MD2 => ZeroHash.GetString(HashType.MD2), + // ItemKey.MD4 => ZeroHash.GetString(HashType.MD4), ItemKey.MD5 => disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key) ?? string.Empty, ItemKey.SHA1 => disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key) ?? string.Empty, ItemKey.SHA256 => ZeroHash.SHA256Str, @@ -928,6 +940,8 @@ namespace SabreTools.DatFiles Media media => bucketBy switch { ItemKey.CRC => ZeroHash.CRC32Str, + // ItemKey.MD2 => ZeroHash.GetString(HashType.MD2), + // ItemKey.MD4 => ZeroHash.GetString(HashType.MD4), ItemKey.MD5 => media.GetStringFieldValue(Models.Metadata.Media.MD5Key) ?? string.Empty, ItemKey.SHA1 => media.GetStringFieldValue(Models.Metadata.Media.SHA1Key) ?? string.Empty, ItemKey.SHA256 => media.GetStringFieldValue(Models.Metadata.Media.SHA256Key) ?? string.Empty, @@ -939,6 +953,8 @@ namespace SabreTools.DatFiles Rom rom => bucketBy switch { ItemKey.CRC => rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey) ?? string.Empty, + // ItemKey.MD2 => rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key) ?? string.Empty, + // ItemKey.MD4 => rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key) ?? string.Empty, ItemKey.MD5 => rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key) ?? string.Empty, ItemKey.SHA1 => rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key) ?? string.Empty, ItemKey.SHA256 => rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key) ?? string.Empty, @@ -950,6 +966,8 @@ namespace SabreTools.DatFiles _ => bucketBy switch { ItemKey.CRC => ZeroHash.CRC32Str, + // ItemKey.MD2 => ZeroHash.GetString(HashType.MD2), + // ItemKey.MD4 => ZeroHash.GetString(HashType.MD4), ItemKey.MD5 => ZeroHash.MD5Str, ItemKey.SHA1 => ZeroHash.SHA1Str, ItemKey.SHA256 => ZeroHash.SHA256Str, diff --git a/SabreTools.DatFiles/Replacer.cs b/SabreTools.DatFiles/Replacer.cs index 961bd683..bb1d4266 100644 --- a/SabreTools.DatFiles/Replacer.cs +++ b/SabreTools.DatFiles/Replacer.cs @@ -162,6 +162,18 @@ namespace SabreTools.DatFiles rom.SetFieldValue(Models.Metadata.Rom.CRCKey, newItem.GetStringFieldValue(Models.Metadata.Rom.CRCKey)); } + if (datItemFields.Contains(Models.Metadata.Rom.MD2Key)) + { + if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key))) + rom.SetFieldValue(Models.Metadata.Rom.MD2Key, newItem.GetStringFieldValue(Models.Metadata.Rom.MD2Key)); + } + + if (datItemFields.Contains(Models.Metadata.Rom.MD4Key)) + { + if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key))) + rom.SetFieldValue(Models.Metadata.Rom.MD4Key, newItem.GetStringFieldValue(Models.Metadata.Rom.MD4Key)); + } + if (datItemFields.Contains(Models.Metadata.Rom.MD5Key)) { if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)) && !string.IsNullOrEmpty(newItem.GetStringFieldValue(Models.Metadata.Rom.MD5Key))) diff --git a/SabreTools.DatItems.Test/DatItemTests.cs b/SabreTools.DatItems.Test/DatItemTests.cs index 242f9c28..c0e7e5ef 100644 --- a/SabreTools.DatItems.Test/DatItemTests.cs +++ b/SabreTools.DatItems.Test/DatItemTests.cs @@ -675,6 +675,8 @@ namespace SabreTools.DatItems.Test datItem.SetFieldValue(DatItem.SourceKey, new Source(0)); datItem.SetFieldValue(DatItem.MachineKey, machine); datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD2Key, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD4Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.MD5Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA1Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA256Key, "DEADBEEF"); @@ -789,6 +791,8 @@ namespace SabreTools.DatItems.Test DatItem datItem = new Rom(); datItem.SetFieldValue(DatItem.MachineKey, machine); datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD2Key, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD4Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.MD5Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA1Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA256Key, "DEADBEEF"); diff --git a/SabreTools.DatItems.Test/DatItemToolTests.cs b/SabreTools.DatItems.Test/DatItemToolTests.cs index ea425e13..8ffccaef 100644 --- a/SabreTools.DatItems.Test/DatItemToolTests.cs +++ b/SabreTools.DatItems.Test/DatItemToolTests.cs @@ -198,6 +198,8 @@ namespace SabreTools.DatItems.Test string filename = "XXXXXX"; string date = "XXXXXX"; string crc = TextHelper.NormalizeCRC32("1234abcd")!; + string md2 = TextHelper.NormalizeMD2("1234abcd")!; + string md4 = TextHelper.NormalizeMD4("1234abcd")!; string md5 = TextHelper.NormalizeMD5("1234abcd")!; string sha1 = TextHelper.NormalizeSHA1("1234abcd")!; string sha256 = TextHelper.NormalizeSHA256("1234abcd")!; @@ -210,6 +212,8 @@ namespace SabreTools.DatItems.Test Filename = filename, Date = date, CRC = crc.FromHexString(), + MD2 = md2.FromHexString(), + MD4 = md4.FromHexString(), MD5 = md5.FromHexString(), SHA1 = sha1.FromHexString(), SHA256 = sha256.FromHexString(), @@ -224,6 +228,8 @@ namespace SabreTools.DatItems.Test Assert.Equal(filename, actual.GetStringFieldValue(Models.Metadata.Rom.NameKey)); Assert.Equal(date, actual.GetStringFieldValue(Models.Metadata.Rom.DateKey)); Assert.Equal(crc, actual.GetStringFieldValue(Models.Metadata.Rom.CRCKey)); + Assert.Equal(md2, actual.GetStringFieldValue(Models.Metadata.Rom.MD2Key)); + Assert.Equal(md4, actual.GetStringFieldValue(Models.Metadata.Rom.MD4Key)); Assert.Equal(md5, actual.GetStringFieldValue(Models.Metadata.Rom.MD5Key)); Assert.Equal(sha1, actual.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)); Assert.Equal(sha256, actual.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)); @@ -324,6 +330,8 @@ namespace SabreTools.DatItems.Test string filename = "XXXXXX"; string date = "XXXXXX"; string crc = TextHelper.NormalizeCRC32("1234abcd")!; + string md2 = TextHelper.NormalizeMD2("1234abcd")!; + string md4 = TextHelper.NormalizeMD4("1234abcd")!; string md5 = TextHelper.NormalizeMD5("1234abcd")!; string sha1 = TextHelper.NormalizeSHA1("1234abcd")!; string sha256 = TextHelper.NormalizeSHA256("1234abcd")!; @@ -336,6 +344,8 @@ namespace SabreTools.DatItems.Test rom.SetFieldValue(Models.Metadata.Rom.NameKey, filename); rom.SetFieldValue(Models.Metadata.Rom.DateKey, date); rom.SetFieldValue(Models.Metadata.Rom.CRCKey, crc); + rom.SetFieldValue(Models.Metadata.Rom.MD2Key, md2); + rom.SetFieldValue(Models.Metadata.Rom.MD4Key, md4); rom.SetFieldValue(Models.Metadata.Rom.MD5Key, md5); rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, sha1); rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, sha256); @@ -349,6 +359,8 @@ namespace SabreTools.DatItems.Test Assert.Equal(filename, actual.Filename); Assert.Equal(date, actual.Date); Assert.Equal(crc, actual.CRC.ToHexString()); + Assert.Equal(md2, actual.MD2.ToHexString()); + Assert.Equal(md4, actual.MD4.ToHexString()); Assert.Equal(md5, actual.MD5.ToHexString()); Assert.Equal(sha1, actual.SHA1.ToHexString()); Assert.Equal(sha256, actual.SHA256.ToHexString()); diff --git a/SabreTools.DatItems.Test/Formats/RomTests.cs b/SabreTools.DatItems.Test/Formats/RomTests.cs index 2e84d6fc..90f8054f 100644 --- a/SabreTools.DatItems.Test/Formats/RomTests.cs +++ b/SabreTools.DatItems.Test/Formats/RomTests.cs @@ -17,6 +17,8 @@ namespace SabreTools.DatItems.Test.Formats self.FillMissingInformation(other); Assert.Null(self.GetStringFieldValue(Models.Metadata.Rom.CRCKey)); + Assert.Null(self.GetStringFieldValue(Models.Metadata.Rom.MD2Key)); + Assert.Null(self.GetStringFieldValue(Models.Metadata.Rom.MD4Key)); Assert.Null(self.GetStringFieldValue(Models.Metadata.Rom.MD5Key)); Assert.Null(self.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)); Assert.Null(self.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)); @@ -32,6 +34,8 @@ namespace SabreTools.DatItems.Test.Formats Rom other = new Rom(); other.SetFieldValue(Models.Metadata.Rom.CRCKey, "XXXXXX"); + other.SetFieldValue(Models.Metadata.Rom.MD2Key, "XXXXXX"); + other.SetFieldValue(Models.Metadata.Rom.MD4Key, "XXXXXX"); other.SetFieldValue(Models.Metadata.Rom.MD5Key, "XXXXXX"); other.SetFieldValue(Models.Metadata.Rom.SHA1Key, "XXXXXX"); other.SetFieldValue(Models.Metadata.Rom.SHA256Key, "XXXXXX"); @@ -42,6 +46,8 @@ namespace SabreTools.DatItems.Test.Formats self.FillMissingInformation(other); Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Rom.CRCKey)); + Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Rom.MD2Key)); + Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Rom.MD4Key)); Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Rom.MD5Key)); Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)); Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)); @@ -73,6 +79,28 @@ namespace SabreTools.DatItems.Test.Formats Assert.Equal($"_{hash}", actual); } + [Fact] + public void GetDuplicateSuffix_MD2() + { + string hash = "XXXXXX"; + Rom self = new Rom(); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, hash); + + string actual = self.GetDuplicateSuffix(); + Assert.Equal($"_{hash}", actual); + } + + [Fact] + public void GetDuplicateSuffix_MD4() + { + string hash = "XXXXXX"; + Rom self = new Rom(); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, hash); + + string actual = self.GetDuplicateSuffix(); + Assert.Equal($"_{hash}", actual); + } + [Fact] public void GetDuplicateSuffix_MD5() { @@ -156,6 +184,44 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, "XXXXXX"); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA384Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA512Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SpamSumKey, string.Empty); + + bool actual = self.HasHashes(); + Assert.True(actual); + } + + [Fact] + public void HasHashes_MD2_True() + { + Rom self = new Rom(); + self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, "XXXXXX"); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA384Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA512Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SpamSumKey, string.Empty); + + bool actual = self.HasHashes(); + Assert.True(actual); + } + + [Fact] + public void HasHashes_MD4_True() + { + Rom self = new Rom(); + self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, "XXXXXX"); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -172,6 +238,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, "XXXXXX"); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -188,6 +256,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, "XXXXXX"); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -204,6 +274,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, "XXXXXX"); @@ -220,6 +292,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -236,6 +310,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -252,6 +328,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -268,6 +346,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, "XXXXXX"); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, "XXXXXX"); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, "XXXXXX"); self.SetFieldValue(Models.Metadata.Rom.MD5Key, "XXXXXX"); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, "XXXXXX"); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, "XXXXXX"); @@ -323,11 +403,49 @@ namespace SabreTools.DatItems.Test.Formats Assert.True(actual); } + [Fact] + public void HasZeroHash_ZeroMD2_True() + { + Rom self = new Rom(); + self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, ZeroHash.GetString(HashType.MD2)); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA384Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA512Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SpamSumKey, string.Empty); + + bool actual = self.HasZeroHash(); + Assert.True(actual); + } + + [Fact] + public void HasZeroHash_ZeroMD4_True() + { + Rom self = new Rom(); + self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, ZeroHash.GetString(HashType.MD4)); + self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA384Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SHA512Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.SpamSumKey, string.Empty); + + bool actual = self.HasZeroHash(); + Assert.True(actual); + } + [Fact] public void HasZeroHash_ZeroMD5_True() { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, ZeroHash.MD5Str); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -344,6 +462,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, ZeroHash.SHA1Str); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -360,6 +480,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, ZeroHash.SHA256Str); @@ -376,6 +498,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -392,6 +516,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -408,6 +534,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, string.Empty); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.MD5Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, string.Empty); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, string.Empty); @@ -424,6 +552,8 @@ namespace SabreTools.DatItems.Test.Formats { Rom self = new Rom(); self.SetFieldValue(Models.Metadata.Rom.CRCKey, ZeroHash.CRC32Str); + self.SetFieldValue(Models.Metadata.Rom.MD2Key, ZeroHash.GetString(HashType.MD2)); + self.SetFieldValue(Models.Metadata.Rom.MD4Key, ZeroHash.GetString(HashType.MD4)); self.SetFieldValue(Models.Metadata.Rom.MD5Key, ZeroHash.MD5Str); self.SetFieldValue(Models.Metadata.Rom.SHA1Key, ZeroHash.SHA1Str); self.SetFieldValue(Models.Metadata.Rom.SHA256Key, ZeroHash.SHA256Str); @@ -483,6 +613,8 @@ namespace SabreTools.DatItems.Test.Formats DatItem datItem = new Rom(); datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD2Key, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD4Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.MD5Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA1Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA256Key, "DEADBEEF"); @@ -547,6 +679,8 @@ namespace SabreTools.DatItems.Test.Formats DatItem datItem = new Rom(); datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD2Key, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Rom.MD4Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.MD5Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA1Key, "DEADBEEF"); datItem.SetFieldValue(Models.Metadata.Rom.SHA256Key, "DEADBEEF"); diff --git a/SabreTools.DatItems/DatItem.cs b/SabreTools.DatItems/DatItem.cs index 33b60384..2b6d9432 100644 --- a/SabreTools.DatItems/DatItem.cs +++ b/SabreTools.DatItems/DatItem.cs @@ -396,6 +396,14 @@ namespace SabreTools.DatItems key = $"{sourceString}{machineString}"; break; + // case ItemKey.MD2: + // key = ZeroHash.GetString(HashType.MD2); + // break; + + // case ItemKey.MD4: + // key = ZeroHash.GetString(HashType.MD4); + // break; + case ItemKey.MD5: key = ZeroHash.MD5Str; break; @@ -466,6 +474,14 @@ namespace SabreTools.DatItems key = $"{sourceString}{machineString}"; break; + // case ItemKey.MD2: + // key = ZeroHash.GetString(HashType.MD2); + // break; + + // case ItemKey.MD4: + // key = ZeroHash.GetString(HashType.MD4); + // break; + case ItemKey.MD5: key = ZeroHash.MD5Str; break; diff --git a/SabreTools.DatItems/DatItemTool.cs b/SabreTools.DatItems/DatItemTool.cs index cfe39cbb..2ecc3428 100644 --- a/SabreTools.DatItems/DatItemTool.cs +++ b/SabreTools.DatItems/DatItemTool.cs @@ -137,6 +137,8 @@ namespace SabreTools.DatItems rom.SetName(baseFile.Filename); rom.SetFieldValue(Models.Metadata.Rom.DateKey, baseFile.Date); rom.SetFieldValue(Models.Metadata.Rom.CRCKey, baseFile.CRC.ToHexString()); + rom.SetFieldValue(Models.Metadata.Rom.MD2Key, baseFile.MD2.ToHexString()); + rom.SetFieldValue(Models.Metadata.Rom.MD4Key, baseFile.MD4.ToHexString()); rom.SetFieldValue(Models.Metadata.Rom.MD5Key, baseFile.MD5.ToHexString()); rom.SetFieldValue(Models.Metadata.Rom.SHA1Key, baseFile.SHA1.ToHexString()); rom.SetFieldValue(Models.Metadata.Rom.SHA256Key, baseFile.SHA256.ToHexString()); @@ -243,6 +245,8 @@ namespace SabreTools.DatItems Date = rom.GetStringFieldValue(Models.Metadata.Rom.DateKey), Size = NumberHelper.ConvertToInt64(rom.GetStringFieldValue(Models.Metadata.Rom.SizeKey)), CRC = rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey).FromHexString(), + MD2 = rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key).FromHexString(), + MD4 = rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key).FromHexString(), MD5 = rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key).FromHexString(), SHA1 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key).FromHexString(), SHA256 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key).FromHexString(), diff --git a/SabreTools.DatItems/Enums.cs b/SabreTools.DatItems/Enums.cs index f4266445..f4632fd3 100644 --- a/SabreTools.DatItems/Enums.cs +++ b/SabreTools.DatItems/Enums.cs @@ -310,6 +310,8 @@ namespace SabreTools.DatItems Machine, CRC, + // MD2, + // MD4, MD5, SHA1, SHA256, diff --git a/SabreTools.DatItems/Formats/Rom.cs b/SabreTools.DatItems/Formats/Rom.cs index 0ada3080..2c242488 100644 --- a/SabreTools.DatItems/Formats/Rom.cs +++ b/SabreTools.DatItems/Formats/Rom.cs @@ -140,6 +140,14 @@ namespace SabreTools.DatItems.Formats key = GetStringFieldValue(Models.Metadata.Rom.CRCKey); break; + // case ItemKey.MD2: + // key = GetStringFieldValue(Models.Metadata.Rom.MD2Key); + // break; + + // case ItemKey.MD4: + // key = GetStringFieldValue(Models.Metadata.Rom.MD4Key); + // break; + case ItemKey.MD5: key = GetStringFieldValue(Models.Metadata.Rom.MD5Key); break; @@ -190,6 +198,14 @@ namespace SabreTools.DatItems.Formats key = GetStringFieldValue(Models.Metadata.Rom.CRCKey); break; + // case ItemKey.MD2: + // key = GetStringFieldValue(Models.Metadata.Rom.MD2Key); + // break; + + // case ItemKey.MD4: + // key = GetStringFieldValue(Models.Metadata.Rom.MD4Key); + // break; + case ItemKey.MD5: key = GetStringFieldValue(Models.Metadata.Rom.MD5Key); break; diff --git a/SabreTools.DatTools/Splitter.cs b/SabreTools.DatTools/Splitter.cs index f1d9ceb7..822fbbd9 100644 --- a/SabreTools.DatTools/Splitter.cs +++ b/SabreTools.DatTools/Splitter.cs @@ -224,6 +224,8 @@ namespace SabreTools.DatTools [Models.Metadata.Rom.SHA256Key] = " (SHA-256)", [Models.Metadata.Rom.SHA1Key] = " (SHA-1)", [Models.Metadata.Rom.MD5Key] = " (MD5)", + [Models.Metadata.Rom.MD4Key] = " (MD4)", + [Models.Metadata.Rom.MD2Key] = " (MD2)", [Models.Metadata.Rom.CRCKey] = " (CRC)", ["null"] = " (Other)", }; @@ -296,6 +298,10 @@ namespace SabreTools.DatTools fieldDats[Models.Metadata.Rom.SHA1Key].Items.Add(key, item); else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))) fieldDats[Models.Metadata.Rom.MD5Key].Items.Add(key, item); + else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key))) + fieldDats[Models.Metadata.Rom.MD4Key].Items.Add(key, item); + else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key))) + fieldDats[Models.Metadata.Rom.MD2Key].Items.Add(key, item); else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))) fieldDats[Models.Metadata.Rom.CRCKey].Items.Add(key, item); else @@ -335,6 +341,8 @@ namespace SabreTools.DatTools [Models.Metadata.Rom.SHA256Key] = " (SHA-256)", [Models.Metadata.Rom.SHA1Key] = " (SHA-1)", [Models.Metadata.Rom.MD5Key] = " (MD5)", + [Models.Metadata.Rom.MD4Key] = " (MD4)", + [Models.Metadata.Rom.MD2Key] = " (MD2)", [Models.Metadata.Rom.CRCKey] = " (CRC)", ["null"] = " (Other)", }; @@ -370,6 +378,8 @@ namespace SabreTools.DatTools _ = fieldDats[Models.Metadata.Rom.SHA256Key].ItemsDB.AddSource(source.Value); _ = fieldDats[Models.Metadata.Rom.SHA1Key].ItemsDB.AddSource(source.Value); _ = fieldDats[Models.Metadata.Rom.MD5Key].ItemsDB.AddSource(source.Value); + _ = fieldDats[Models.Metadata.Rom.MD4Key].ItemsDB.AddSource(source.Value); + _ = fieldDats[Models.Metadata.Rom.MD2Key].ItemsDB.AddSource(source.Value); _ = fieldDats[Models.Metadata.Rom.CRCKey].ItemsDB.AddSource(source.Value); _ = fieldDats["null"].ItemsDB.AddSource(source.Value); } @@ -383,6 +393,8 @@ namespace SabreTools.DatTools _ = fieldDats[Models.Metadata.Rom.SHA256Key].ItemsDB.AddMachine(machine.Value); _ = fieldDats[Models.Metadata.Rom.SHA1Key].ItemsDB.AddMachine(machine.Value); _ = fieldDats[Models.Metadata.Rom.MD5Key].ItemsDB.AddMachine(machine.Value); + _ = fieldDats[Models.Metadata.Rom.MD4Key].ItemsDB.AddMachine(machine.Value); + _ = fieldDats[Models.Metadata.Rom.MD2Key].ItemsDB.AddMachine(machine.Value); _ = fieldDats[Models.Metadata.Rom.CRCKey].ItemsDB.AddMachine(machine.Value); _ = fieldDats["null"].ItemsDB.AddMachine(machine.Value); machineRemapping[machine.Key] = newMachineIndex; @@ -441,6 +453,10 @@ namespace SabreTools.DatTools fieldDats[Models.Metadata.Rom.SHA1Key].ItemsDB.AddItem(item.Value, machineRemapping[machineIndex], sourceRemapping[sourceIndex], statsOnly: false); else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key))) fieldDats[Models.Metadata.Rom.MD5Key].ItemsDB.AddItem(item.Value, machineRemapping[machineIndex], sourceRemapping[sourceIndex], statsOnly: false); + else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key))) + fieldDats[Models.Metadata.Rom.MD4Key].ItemsDB.AddItem(item.Value, machineRemapping[machineIndex], sourceRemapping[sourceIndex], statsOnly: false); + else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key))) + fieldDats[Models.Metadata.Rom.MD2Key].ItemsDB.AddItem(item.Value, machineRemapping[machineIndex], sourceRemapping[sourceIndex], statsOnly: false); else if (!string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey))) fieldDats[Models.Metadata.Rom.CRCKey].ItemsDB.AddItem(item.Value, machineRemapping[machineIndex], sourceRemapping[sourceIndex], statsOnly: false); else diff --git a/SabreTools.FileTypes/BaseFile.cs b/SabreTools.FileTypes/BaseFile.cs index 1a7c6ed0..0954768e 100644 --- a/SabreTools.FileTypes/BaseFile.cs +++ b/SabreTools.FileTypes/BaseFile.cs @@ -29,6 +29,16 @@ /// public byte[]? CRC { get; set; } + /// + /// MD2 hash of the file + /// + public byte[]? MD2 { get; set; } + + /// + /// MD4 hash of the file + /// + public byte[]? MD4 { get; set; } + /// /// MD5 hash of the file /// diff --git a/SabreTools.FileTypes/FileTypeTool.cs b/SabreTools.FileTypes/FileTypeTool.cs index 6778fa4d..dd52ae79 100644 --- a/SabreTools.FileTypes/FileTypeTool.cs +++ b/SabreTools.FileTypes/FileTypeTool.cs @@ -96,6 +96,8 @@ namespace SabreTools.FileTypes { Size = size, CRC = hashDict.ContainsKey(HashType.CRC32) ? hashDict[HashType.CRC32].FromHexString() : null, + MD2 = hashDict.ContainsKey(HashType.MD2) ? hashDict[HashType.MD2].FromHexString() : null, + MD4 = hashDict.ContainsKey(HashType.MD4) ? hashDict[HashType.MD4].FromHexString() : null, MD5 = hashDict.ContainsKey(HashType.MD5) ? hashDict[HashType.MD5].FromHexString() : null, SHA1 = hashDict.ContainsKey(HashType.SHA1) ? hashDict[HashType.SHA1].FromHexString() : null, SHA256 = hashDict.ContainsKey(HashType.SHA256) ? hashDict[HashType.SHA256].FromHexString() : null, @@ -125,6 +127,8 @@ namespace SabreTools.FileTypes to.Date ??= from.Date; to.Size ??= from.Size; to.CRC ??= from.CRC; + to.MD2 ??= from.MD2; + to.MD4 ??= from.MD4; to.MD5 ??= from.MD5; to.SHA1 ??= from.SHA1; to.SHA256 ??= from.SHA256; diff --git a/SabreTools/Features/BaseFeature.cs b/SabreTools/Features/BaseFeature.cs index 644eea54..81bf11ee 100644 --- a/SabreTools/Features/BaseFeature.cs +++ b/SabreTools/Features/BaseFeature.cs @@ -471,7 +471,7 @@ namespace SabreTools.Features new List() { "-hs", "--hash" }, "Split DAT(s) or folder by best-available hashes", ParameterType.Flag, - longDescription: "For a DAT, or set of DATs, allow for splitting based on the best available hash for each file within. The order of preference for the outputted DATs is as follows: Nodump, SHA-512, SHA-384, SHA-256, SHA-1, MD5, CRC (or worse)."); + longDescription: "For a DAT, or set of DATs, allow for splitting based on the best available hash for each file within. The order of preference for the outputted DATs is as follows: Nodump, SHA-512, SHA-384, SHA-256, SHA-1, MD5, MD4, MD2, CRC (or worse)."); } } @@ -503,6 +503,34 @@ namespace SabreTools.Features } } + internal const string IncludeMd2Value = "include-md2"; + internal static Feature IncludeMd2Flag + { + get + { + return new Feature( + IncludeMd2Value, + new List() { "-md2", "--include-md2" }, + "Include MD2 in output", + ParameterType.Flag, + longDescription: "This enables MD2 calculation for each of the files. Adding this flag overrides the default hashing behavior of including CRC32, MD5, and SHA-1 hashes."); + } + } + + internal const string IncludeMd4Value = "include-md4"; + internal static Feature IncludeMd4Flag + { + get + { + return new Feature( + IncludeMd4Value, + new List() { "-md4", "--include-md4" }, + "Include MD4 in output", + ParameterType.Flag, + longDescription: "This enables MD4 calculation for each of the files. Adding this flag overrides the default hashing behavior of including CRC32, MD5, and SHA-1 hashes."); + } + } + internal const string IncludeMd5Value = "include-md5"; internal static Feature IncludeMd5Flag { @@ -1312,6 +1340,8 @@ Possible values are: lr, listrom - MAME Listrom lx, listxml - MAME Listxml miss, missfile - GoodTools Missfile + md2 - MD2 + md4 - MD4 md5 - MD5 msx, openmsx - openMSX Software List ol, offlinelist - OfflineList XML @@ -1634,6 +1664,8 @@ Some special strings that can be used: - %publisher% - Replaced with game Publisher - %category% - Replaced with game Category - %crc% - Replaced with the CRC +- %md2% - Replaced with the MD2 +- %md4% - Replaced with the MD4 - %md5% - Replaced with the MD5 - %sha1% - Replaced with the SHA-1 - %sha256% - Replaced with the SHA-256 @@ -1662,6 +1694,8 @@ Some special strings that can be used: - %publisher% - Replaced with game Publisher - %category% - Replaced with game Category - %crc% - Replaced with the CRC +- %md2% - Replaced with the MD2 +- %md4% - Replaced with the MD4 - %md5% - Replaced with the MD5 - %sha1% - Replaced with the SHA-1 - %sha256% - Replaced with the SHA-256 @@ -1903,6 +1937,10 @@ Some special strings that can be used: if (GetBoolean(features, IncludeCrcValue)) includeInScan.Add(HashType.CRC32); + if (GetBoolean(features, IncludeMd2Value)) + includeInScan.Add(HashType.MD2); + if (GetBoolean(features, IncludeMd4Value)) + includeInScan.Add(HashType.MD4); if (GetBoolean(features, IncludeMd5Value)) includeInScan.Add(HashType.MD5); if (GetBoolean(features, IncludeSha1Value))