Fix CHD parsing, threading, version

This commit is contained in:
Matt Nadareski
2020-07-19 21:59:34 -07:00
parent 4596c7b299
commit ce38911d66
10 changed files with 77 additions and 62 deletions

View File

@@ -4,6 +4,7 @@ using System.IO;
using SabreTools.Library.Data; using SabreTools.Library.Data;
using Newtonsoft.Json; using Newtonsoft.Json;
using SabreTools.Library.Tools;
namespace SabreTools.Library.DatFiles namespace SabreTools.Library.DatFiles
{ {
@@ -770,7 +771,11 @@ namespace SabreTools.Library.DatFiles
private string CreateOutFileNamesHelper(string outDir, string extension, bool overwrite) private string CreateOutFileNamesHelper(string outDir, string extension, bool overwrite)
{ {
string filename = (string.IsNullOrWhiteSpace(FileName) ? Description : FileName); string filename = (string.IsNullOrWhiteSpace(FileName) ? Description : FileName);
// Strip off the extension if it's a holdover from the DAT
if (PathExtensions.HasValidDatExtension(filename))
filename = Path.GetFileNameWithoutExtension(filename); filename = Path.GetFileNameWithoutExtension(filename);
string outfile = $"{outDir}{filename}{extension}"; string outfile = $"{outDir}{filename}{extension}";
outfile = outfile.Replace($"{Path.DirectorySeparatorChar}{Path.DirectorySeparatorChar}", Path.DirectorySeparatorChar.ToString()); outfile = outfile.Replace($"{Path.DirectorySeparatorChar}{Path.DirectorySeparatorChar}", Path.DirectorySeparatorChar.ToString());

View File

@@ -12,7 +12,7 @@ namespace SabreTools.Library.Data
/// <summary> /// <summary>
/// The current toolset version to be used by all child applications /// The current toolset version to be used by all child applications
/// </summary> /// </summary>
public readonly static string Version = $"v1.0.0-{File.GetCreationTime(Assembly.GetExecutingAssembly().Location):yyyy-MM-dd HH:mm:ss}"; public readonly static string Version = $"v1.0.1-{File.GetCreationTime(Assembly.GetExecutingAssembly().Location):yyyy-MM-dd HH:mm:ss}";
public const int HeaderHeight = 3; public const int HeaderHeight = 3;
#region 0-byte file constants #region 0-byte file constants

View File

@@ -15,7 +15,6 @@ namespace SabreTools.Library.Data
#region Private implementations #region Private implementations
private static Logger _logger = null; private static Logger _logger = null;
private static int _maxDegreeOfParallelism = System.Environment.ProcessorCount;
#endregion #endregion
@@ -33,37 +32,18 @@ namespace SabreTools.Library.Data
set { _logger = value; } set { _logger = value; }
} }
public static int MaxThreads public static int MaxThreads { get; set; } = Environment.ProcessorCount;
{
get { return _maxDegreeOfParallelism; }
set { _maxDegreeOfParallelism = value; }
}
public static ParallelOptions ParallelOptions public static ParallelOptions ParallelOptions => new ParallelOptions()
{ {
get MaxDegreeOfParallelism = MaxThreads
{
return new ParallelOptions()
{
MaxDegreeOfParallelism = _maxDegreeOfParallelism
}; };
}
}
public static string ExeName public static string ExeName => new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath;
{
get { return new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath; }
}
public static string ExeDir public static string ExeDir => Path.GetDirectoryName(ExeName);
{
get { return Path.GetDirectoryName(ExeName); }
}
public static string CommandLineArgs public static string CommandLineArgs => string.Join(" ", Environment.GetCommandLineArgs());
{
get { return string.Join(" ", Environment.GetCommandLineArgs()); }
}
#endregion #endregion
} }

View File

@@ -41,6 +41,8 @@ namespace SabreTools.Library.FileTypes
/// </summary> /// </summary>
/// <param name="chdstream">Stream representing the CHD file</param> /// <param name="chdstream">Stream representing the CHD file</param>
public static CHDFile Create(Stream chdstream) public static CHDFile Create(Stream chdstream)
{
try
{ {
// Read the standard CHD headers // Read the standard CHD headers
(char[] tag, uint length, uint version) = GetHeaderValues(chdstream); (char[] tag, uint length, uint version) = GetHeaderValues(chdstream);
@@ -58,6 +60,11 @@ namespace SabreTools.Library.FileTypes
return generated; return generated;
} }
catch
{
return null;
}
}
#endregion #endregion
@@ -85,7 +92,7 @@ namespace SabreTools.Library.FileTypes
using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true))
{ {
parsedTag = br.ReadCharsBigEndian(8); parsedTag = br.ReadChars(8);
parsedLength = br.ReadUInt32BigEndian(); parsedLength = br.ReadUInt32BigEndian();
parsedVersion = br.ReadUInt32BigEndian(); parsedVersion = br.ReadUInt32BigEndian();
} }

View File

@@ -62,7 +62,7 @@ namespace SabreTools.Library.FileTypes
using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true))
{ {
chd.tag = br.ReadCharsBigEndian(8); chd.tag = br.ReadChars(8);
chd.length = br.ReadUInt32BigEndian(); chd.length = br.ReadUInt32BigEndian();
chd.version = br.ReadUInt32BigEndian(); chd.version = br.ReadUInt32BigEndian();
chd.flags = (Flags)br.ReadUInt32BigEndian(); chd.flags = (Flags)br.ReadUInt32BigEndian();
@@ -72,8 +72,10 @@ namespace SabreTools.Library.FileTypes
chd.cylinders = br.ReadUInt32BigEndian(); chd.cylinders = br.ReadUInt32BigEndian();
chd.heads = br.ReadUInt32BigEndian(); chd.heads = br.ReadUInt32BigEndian();
chd.sectors = br.ReadUInt32BigEndian(); chd.sectors = br.ReadUInt32BigEndian();
chd.md5 = br.ReadBytesBigEndian(16); chd.md5 = br.ReadBytes(16);
chd.parentmd5 = br.ReadBytesBigEndian(16); chd.parentmd5 = br.ReadBytes(16);
chd.MD5 = chd.md5;
} }
return chd; return chd;

View File

@@ -63,7 +63,7 @@ namespace SabreTools.Library.FileTypes
using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true))
{ {
chd.tag = br.ReadCharsBigEndian(8); chd.tag = br.ReadChars(8);
chd.length = br.ReadUInt32BigEndian(); chd.length = br.ReadUInt32BigEndian();
chd.version = br.ReadUInt32BigEndian(); chd.version = br.ReadUInt32BigEndian();
chd.flags = (Flags)br.ReadUInt32BigEndian(); chd.flags = (Flags)br.ReadUInt32BigEndian();
@@ -73,9 +73,11 @@ namespace SabreTools.Library.FileTypes
chd.cylinders = br.ReadUInt32BigEndian(); chd.cylinders = br.ReadUInt32BigEndian();
chd.heads = br.ReadUInt32BigEndian(); chd.heads = br.ReadUInt32BigEndian();
chd.sectors = br.ReadUInt32BigEndian(); chd.sectors = br.ReadUInt32BigEndian();
chd.md5 = br.ReadBytesBigEndian(16); chd.md5 = br.ReadBytes(16);
chd.parentmd5 = br.ReadBytesBigEndian(16); chd.parentmd5 = br.ReadBytes(16);
chd.seclen = br.ReadUInt32BigEndian(); chd.seclen = br.ReadUInt32BigEndian();
chd.MD5 = chd.md5;
} }
return chd; return chd;

View File

@@ -67,7 +67,7 @@ namespace SabreTools.Library.FileTypes
using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true))
{ {
chd.tag = br.ReadCharsBigEndian(8); chd.tag = br.ReadChars(8);
chd.length = br.ReadUInt32BigEndian(); chd.length = br.ReadUInt32BigEndian();
chd.version = br.ReadUInt32BigEndian(); chd.version = br.ReadUInt32BigEndian();
chd.flags = (Flags)br.ReadUInt32BigEndian(); chd.flags = (Flags)br.ReadUInt32BigEndian();
@@ -75,11 +75,14 @@ namespace SabreTools.Library.FileTypes
chd.totalhunks = br.ReadUInt32BigEndian(); chd.totalhunks = br.ReadUInt32BigEndian();
chd.logicalbytes = br.ReadUInt64BigEndian(); chd.logicalbytes = br.ReadUInt64BigEndian();
chd.metaoffset = br.ReadUInt64BigEndian(); chd.metaoffset = br.ReadUInt64BigEndian();
chd.md5 = br.ReadBytesBigEndian(16); chd.md5 = br.ReadBytes(16);
chd.parentmd5 = br.ReadBytesBigEndian(16); chd.parentmd5 = br.ReadBytes(16);
chd.hunkbytes = br.ReadUInt32BigEndian(); chd.hunkbytes = br.ReadUInt32BigEndian();
chd.sha1 = br.ReadBytesBigEndian(20); chd.sha1 = br.ReadBytes(20);
chd.parentsha1 = br.ReadBytesBigEndian(20); chd.parentsha1 = br.ReadBytes(20);
chd.MD5 = chd.md5;
chd.SHA1 = chd.sha1;
} }
return chd; return chd;

View File

@@ -67,7 +67,7 @@ namespace SabreTools.Library.FileTypes
using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true))
{ {
chd.tag = br.ReadCharsBigEndian(8); chd.tag = br.ReadChars(8);
chd.length = br.ReadUInt32BigEndian(); chd.length = br.ReadUInt32BigEndian();
chd.version = br.ReadUInt32BigEndian(); chd.version = br.ReadUInt32BigEndian();
chd.flags = (Flags)br.ReadUInt32BigEndian(); chd.flags = (Flags)br.ReadUInt32BigEndian();
@@ -76,9 +76,11 @@ namespace SabreTools.Library.FileTypes
chd.logicalbytes = br.ReadUInt64BigEndian(); chd.logicalbytes = br.ReadUInt64BigEndian();
chd.metaoffset = br.ReadUInt64BigEndian(); chd.metaoffset = br.ReadUInt64BigEndian();
chd.hunkbytes = br.ReadUInt32BigEndian(); chd.hunkbytes = br.ReadUInt32BigEndian();
chd.sha1 = br.ReadBytesBigEndian(20); chd.sha1 = br.ReadBytes(20);
chd.parentsha1 = br.ReadBytesBigEndian(20); chd.parentsha1 = br.ReadBytes(20);
chd.rawsha1 = br.ReadBytesBigEndian(20); chd.rawsha1 = br.ReadBytes(20);
chd.SHA1 = chd.sha1;
} }
return chd; return chd;

View File

@@ -66,7 +66,7 @@ namespace SabreTools.Library.FileTypes
using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true))
{ {
chd.tag = br.ReadCharsBigEndian(8); chd.tag = br.ReadChars(8);
chd.length = br.ReadUInt32BigEndian(); chd.length = br.ReadUInt32BigEndian();
chd.version = br.ReadUInt32BigEndian(); chd.version = br.ReadUInt32BigEndian();
chd.compressors = new uint[4]; chd.compressors = new uint[4];
@@ -79,9 +79,11 @@ namespace SabreTools.Library.FileTypes
chd.metaoffset = br.ReadUInt64BigEndian(); chd.metaoffset = br.ReadUInt64BigEndian();
chd.hunkbytes = br.ReadUInt32BigEndian(); chd.hunkbytes = br.ReadUInt32BigEndian();
chd.unitbytes = br.ReadUInt32BigEndian(); chd.unitbytes = br.ReadUInt32BigEndian();
chd.rawsha1 = br.ReadBytesBigEndian(20); chd.rawsha1 = br.ReadBytes(20);
chd.sha1 = br.ReadBytesBigEndian(20); chd.sha1 = br.ReadBytes(20);
chd.parentsha1 = br.ReadBytesBigEndian(20); chd.parentsha1 = br.ReadBytes(20);
chd.SHA1 = chd.sha1;
} }
return chd; return chd;

View File

@@ -2939,6 +2939,10 @@ Some special strings that can be used:
public override void ProcessFeatures(Dictionary<string, Feature> features) public override void ProcessFeatures(Dictionary<string, Feature> features)
{ {
// Set threading flag, if necessary
if (features.ContainsKey(ThreadsInt32Value))
Globals.MaxThreads = GetInt32(features, ThreadsInt32Value);
// Get feature flags // Get feature flags
bool addBlankFiles = GetBoolean(features, AddBlankFilesValue); bool addBlankFiles = GetBoolean(features, AddBlankFilesValue);
bool addFileDates = GetBoolean(features, AddDateValue); bool addFileDates = GetBoolean(features, AddDateValue);
@@ -3168,6 +3172,10 @@ The following systems have headers that this program can work with:
public override void ProcessFeatures(Dictionary<string, Feature> features) public override void ProcessFeatures(Dictionary<string, Feature> features)
{ {
// Set threading flag, if necessary
if (features.ContainsKey(ThreadsInt32Value))
Globals.MaxThreads = GetInt32(features, ThreadsInt32Value);
// Get feature flags // Get feature flags
bool chdsAsFiles = GetBoolean(features, ChdsAsFilesValue); bool chdsAsFiles = GetBoolean(features, ChdsAsFilesValue);
bool date = GetBoolean(features, AddDateValue); bool date = GetBoolean(features, AddDateValue);
@@ -3466,6 +3474,10 @@ The stats that are outputted are as follows:
public override void ProcessFeatures(Dictionary<string, Feature> features) public override void ProcessFeatures(Dictionary<string, Feature> features)
{ {
// Set threading flag, if necessary
if (features.ContainsKey(ThreadsInt32Value))
Globals.MaxThreads = GetInt32(features, ThreadsInt32Value);
// Get feature flags // Get feature flags
var datHeader = GetDatHeader(features); var datHeader = GetDatHeader(features);
var updateFields = GetUpdateFields(features); var updateFields = GetUpdateFields(features);