diff --git a/SabreTools.DatItems/DatItem.cs b/SabreTools.DatItems/DatItem.cs
index 55b242cb..1e2e98d6 100644
--- a/SabreTools.DatItems/DatItem.cs
+++ b/SabreTools.DatItems/DatItem.cs
@@ -128,27 +128,30 @@ namespace SabreTools.DatItems
/// Create a specific type of DatItem to be used based on a BaseFile
///
/// BaseFile containing information to be created
+ /// TreatAsFiles representing special format scanning
/// DatItem of the specific internal type that corresponds to the inputs
- public static DatItem? Create(BaseFile? baseFile)
+ public static DatItem? Create(BaseFile? baseFile, TreatAsFile asFiles = 0x00)
{
return baseFile switch
{
// Disk
- FileTypes.CHD.CHDFile => new Disk(baseFile),
+#if NET20 || NET35
+ FileTypes.CHD.CHDFile when (asFiles & TreatAsFile.CHD) == 0 => new Disk(baseFile),
+#else
+ FileTypes.CHD.CHDFile when !asFiles.HasFlag(TreatAsFile.CHD) => new Disk(baseFile),
+#endif
// Media
- FileTypes.Aaru.AaruFormat => new Media(baseFile),
+#if NET20 || NET35
+ FileTypes.Aaru.AaruFormat when (asFiles & TreatAsFile.AaruFormat) == 0 => new Media(baseFile),
+#else
+ FileTypes.Aaru.AaruFormat when !asFiles.HasFlag(TreatAsFile.AaruFormat) => new Media(baseFile),
+#endif
// Rom
- FileTypes.Archives.GZipArchive => new Rom(baseFile),
- FileTypes.Archives.RarArchive => new Rom(baseFile),
- FileTypes.Archives.SevenZipArchive => new Rom(baseFile),
- FileTypes.Archives.TapeArchive => new Rom(baseFile),
- FileTypes.Archives.XZArchive => new Rom(baseFile),
- FileTypes.Archives.ZipArchive => new Rom(baseFile),
- FileTypes.BaseArchive => new Rom(baseFile),
- FileTypes.Folder => null, // Folders cannot be a DatItem
- FileTypes.BaseFile => new Rom(baseFile),
+ BaseArchive => new Rom(baseFile),
+ Folder => null, // Folders cannot be a DatItem
+ BaseFile => new Rom(baseFile),
// Miscellaneous
_ => null,
diff --git a/SabreTools.DatItems/Formats/Disk.cs b/SabreTools.DatItems/Formats/Disk.cs
index 759b26eb..9aaa10b0 100644
--- a/SabreTools.DatItems/Formats/Disk.cs
+++ b/SabreTools.DatItems/Formats/Disk.cs
@@ -75,8 +75,17 @@ namespace SabreTools.DatItems.Formats
public Disk(BaseFile baseFile) : base()
{
SetName(baseFile.Filename);
- SetFieldValue(Models.Metadata.Disk.MD5Key, baseFile.MD5.ToHexString());
- SetFieldValue(Models.Metadata.Disk.SHA1Key, baseFile.SHA1.ToHexString());
+
+ if (baseFile is FileTypes.CHD.CHDFile chd)
+ {
+ SetFieldValue(Models.Metadata.Disk.MD5Key, chd.InternalMD5.ToHexString());
+ SetFieldValue(Models.Metadata.Disk.SHA1Key, chd.InternalSHA1.ToHexString());
+ }
+ else
+ {
+ SetFieldValue(Models.Metadata.Disk.MD5Key, baseFile.MD5.ToHexString());
+ SetFieldValue(Models.Metadata.Disk.SHA1Key, baseFile.SHA1.ToHexString());
+ }
SetFieldValue(DatItem.DupeTypeKey, 0x00);
}
@@ -132,7 +141,7 @@ namespace SabreTools.DatItems.Formats
public string GetDuplicateSuffix() => _internal.GetDuplicateSuffix();
#endregion
-
+
#region Sorting and Merging
///
diff --git a/SabreTools.DatItems/Formats/Media.cs b/SabreTools.DatItems/Formats/Media.cs
index ffb8d103..4072ec71 100644
--- a/SabreTools.DatItems/Formats/Media.cs
+++ b/SabreTools.DatItems/Formats/Media.cs
@@ -37,10 +37,21 @@ namespace SabreTools.DatItems.Formats
public Media(BaseFile baseFile) : base()
{
SetName(baseFile.Filename);
- SetFieldValue(Models.Metadata.Media.MD5Key, baseFile.MD5.ToHexString());
- SetFieldValue(Models.Metadata.Media.SHA1Key, baseFile.SHA1.ToHexString());
- SetFieldValue(Models.Metadata.Media.SHA256Key, baseFile.SHA256.ToHexString());
- SetFieldValue(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []));
+
+ if (baseFile is FileTypes.Aaru.AaruFormat aif)
+ {
+ SetFieldValue(Models.Metadata.Media.MD5Key, aif.InternalMD5.ToHexString());
+ SetFieldValue(Models.Metadata.Media.SHA1Key, aif.InternalSHA1.ToHexString());
+ SetFieldValue(Models.Metadata.Media.SHA256Key, aif.InternalSHA256.ToHexString());
+ SetFieldValue(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(aif.InternalSpamSum ?? []));
+ }
+ else
+ {
+ SetFieldValue(Models.Metadata.Media.MD5Key, baseFile.MD5.ToHexString());
+ SetFieldValue(Models.Metadata.Media.SHA1Key, baseFile.SHA1.ToHexString());
+ SetFieldValue(Models.Metadata.Media.SHA256Key, baseFile.SHA256.ToHexString());
+ SetFieldValue(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? []));
+ }
SetFieldValue(DatItem.DupeTypeKey, 0x00);
}
diff --git a/SabreTools.DatTools/DatFromDir.cs b/SabreTools.DatTools/DatFromDir.cs
index 8b4a1932..bdc6e5ef 100644
--- a/SabreTools.DatTools/DatFromDir.cs
+++ b/SabreTools.DatTools/DatFromDir.cs
@@ -406,8 +406,8 @@ namespace SabreTools.DatTools
{
logger.Verbose($"'{Path.GetFileName(item)}' treated like a file");
var header = datFile.Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey);
- BaseFile? baseFile = FileTypeTool.GetInfo(item, header, _hashes, asFiles);
- DatItem? datItem = DatItem.Create(baseFile);
+ BaseFile? baseFile = FileTypeTool.GetInfo(item, header, _hashes);
+ DatItem? datItem = DatItem.Create(baseFile, asFiles);
if (datItem != null)
ProcessFileHelper(datFile, item, datItem, basePath, string.Empty);
}
diff --git a/SabreTools.DatTools/Rebuilder.cs b/SabreTools.DatTools/Rebuilder.cs
index 66a2b0af..98561ea3 100644
--- a/SabreTools.DatTools/Rebuilder.cs
+++ b/SabreTools.DatTools/Rebuilder.cs
@@ -324,7 +324,7 @@ namespace SabreTools.DatTools
// If the entries list is null, we encountered an error or have a file and should scan externally
if (entries == null && System.IO.File.Exists(file))
{
- BaseFile? internalFileInfo = FileTypeTool.GetInfo(file, hashTypes, asFiles);
+ BaseFile? internalFileInfo = FileTypeTool.GetInfo(file, hashTypes);
// Create the correct DatItem
DatItem? internalDatItem;
diff --git a/SabreTools.FileTypes/Aaru/AaruFormat.cs b/SabreTools.FileTypes/Aaru/AaruFormat.cs
index 463c1289..adccb01f 100644
--- a/SabreTools.FileTypes/Aaru/AaruFormat.cs
+++ b/SabreTools.FileTypes/Aaru/AaruFormat.cs
@@ -211,19 +211,15 @@ namespace SabreTools.FileTypes.Aaru
case AaruChecksumAlgorithm.Invalid:
break;
case AaruChecksumAlgorithm.Md5:
- aif.MD5 = checksumEntry.checksum;
aif.InternalMD5 = checksumEntry.checksum;
break;
case AaruChecksumAlgorithm.Sha1:
- aif.SHA1 = checksumEntry.checksum;
aif.InternalSHA1 = checksumEntry.checksum;
break;
case AaruChecksumAlgorithm.Sha256:
- aif.SHA256 = checksumEntry.checksum;
aif.InternalSHA256 = checksumEntry.checksum;
break;
case AaruChecksumAlgorithm.SpamSum:
- aif.SpamSum = checksumEntry.checksum;
aif.InternalSpamSum = checksumEntry.checksum;
break;
}
diff --git a/SabreTools.FileTypes/CHD/CHDFile.cs b/SabreTools.FileTypes/CHD/CHDFile.cs
index 50edba7a..203aedc1 100644
--- a/SabreTools.FileTypes/CHD/CHDFile.cs
+++ b/SabreTools.FileTypes/CHD/CHDFile.cs
@@ -54,33 +54,27 @@ namespace SabreTools.FileTypes.CHD
HeaderV1 v1 => new CHDFile
{
_header = header,
- MD5 = v1.MD5,
InternalMD5 = v1.MD5,
},
HeaderV2 v2 => new CHDFile
{
_header = header,
- MD5 = v2.MD5,
InternalMD5 = v2.MD5,
},
HeaderV3 v3 => new CHDFile
{
_header = header,
- MD5 = v3.MD5,
InternalMD5 = v3.MD5,
- SHA1 = v3.SHA1,
InternalSHA1 = v3.SHA1,
},
HeaderV4 v4 => new CHDFile
{
_header = header,
- SHA1 = v4.SHA1,
InternalSHA1 = v4.SHA1,
},
HeaderV5 v5 => new CHDFile
{
_header = header,
- SHA1 = v5.SHA1,
InternalSHA1 = v5.SHA1,
},
_ => null,
diff --git a/SabreTools.FileTypes/FileTypeTool.cs b/SabreTools.FileTypes/FileTypeTool.cs
index 0394ed5f..08f3e6e3 100644
--- a/SabreTools.FileTypes/FileTypeTool.cs
+++ b/SabreTools.FileTypes/FileTypeTool.cs
@@ -21,17 +21,7 @@ namespace SabreTools.FileTypes
/// Hashes to include in the information
/// Populated BaseFile object if success, empty on error
public static BaseFile GetInfo(string input, HashType[] hashes)
- => GetInfo(input, header: null, hashes, asFiles: 0x00);
-
- ///
- /// Retrieve file information for a single file
- ///
- /// Filename to get information from
- /// Hashes to include in the information
- /// TreatAsFiles representing special format scanning
- /// Populated BaseFile object if success, empty on error
- public static BaseFile GetInfo(string input, HashType[] hashes, TreatAsFile asFiles)
- => GetInfo(input, header: null, hashes, asFiles);
+ => GetInfo(input, header: null, hashes);
///
/// Retrieve file information for a single file
@@ -39,9 +29,8 @@ namespace SabreTools.FileTypes
/// Filename to get information from
/// Populated string representing the name of the skipper to use, a blank string to use the first available checker, null otherwise
/// Hashes to include in the information
- /// TreatAsFiles representing special format scanning
/// Populated BaseFile object if success, empty on error
- public static BaseFile GetInfo(string input, string? header, HashType[] hashes, TreatAsFile asFiles)
+ public static BaseFile GetInfo(string input, string? header, HashType[] hashes)
{
// Add safeguard if file doesn't exist
if (!File.Exists(input))
@@ -52,7 +41,7 @@ namespace SabreTools.FileTypes
// Get input information
var fileType = GetFileType(input);
Stream inputStream = GetInfoStream(input, header);
- BaseFile? baseFile = GetBaseFile(inputStream, fileType, hashes, asFiles);
+ BaseFile? baseFile = GetBaseFile(inputStream, fileType, hashes);
// Dispose of the input stream
inputStream.Dispose();
@@ -162,21 +151,54 @@ namespace SabreTools.FileTypes
///
/// Get the correct base file based on the type and filter options
///
- private static BaseFile? GetBaseFile(Stream inputStream, FileType? fileType, HashType[] hashes, TreatAsFile asFiles)
+ private static BaseFile? GetBaseFile(Stream inputStream, FileType? fileType, HashType[] hashes)
{
-#if NET20 || NET35
- if (fileType == FileType.AaruFormat && (asFiles & TreatAsFile.AaruFormat) == 0)
- return AaruFormat.Create(inputStream);
- else if (fileType == FileType.CHD && (asFiles & TreatAsFile.CHD) == 0)
- return CHDFile.Create(inputStream);
-#else
- if (fileType == FileType.AaruFormat && !asFiles.HasFlag(TreatAsFile.AaruFormat))
- return AaruFormat.Create(inputStream);
- else if (fileType == FileType.CHD && !asFiles.HasFlag(TreatAsFile.CHD))
- return CHDFile.Create(inputStream);
-#endif
+ // Get external file information
+ BaseFile? baseFile = GetInfo(inputStream, hashes, keepReadOpen: true);
- return GetInfo(inputStream, hashes, keepReadOpen: false);
+ // Get internal hashes, if they exist
+ if (fileType == FileType.AaruFormat)
+ {
+ AaruFormat? aif = AaruFormat.Create(inputStream);
+ if (aif != null)
+ {
+ aif.Filename = baseFile.Filename;
+ aif.Parent = baseFile.Parent;
+ aif.Date = baseFile.Date;
+ aif.Size = baseFile.Size;
+ aif.CRC = baseFile.CRC;
+ aif.MD5 = baseFile.MD5;
+ aif.SHA1 = baseFile.SHA1;
+ aif.SHA256 = baseFile.SHA256;
+ aif.SHA384 = baseFile.SHA384;
+ aif.SHA512 = baseFile.SHA512;
+ aif.SpamSum = baseFile.SpamSum;
+
+ return aif;
+ }
+ }
+ else if (fileType == FileType.CHD)
+ {
+ CHDFile? chd = CHDFile.Create(inputStream);
+ if (chd != null)
+ {
+ chd.Filename = baseFile.Filename;
+ chd.Parent = baseFile.Parent;
+ chd.Date = baseFile.Date;
+ chd.Size = baseFile.Size;
+ chd.CRC = baseFile.CRC;
+ chd.MD5 = baseFile.MD5;
+ chd.SHA1 = baseFile.SHA1;
+ chd.SHA256 = baseFile.SHA256;
+ chd.SHA384 = baseFile.SHA384;
+ chd.SHA512 = baseFile.SHA512;
+ chd.SpamSum = baseFile.SpamSum;
+
+ return chd;
+ }
+ }
+
+ return baseFile;
}
///