refactor: use QIODevice instead of a whole QByteArray for hash calc.

This allows Qt to do its thing and optimize the data gathering from the
JAR.

Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
flow 2022-07-23 23:11:09 -03:00
parent 0e473f4570
commit cfda8dbb2b
No known key found for this signature in database
GPG Key ID: 8D0F221F0A59F469
2 changed files with 18 additions and 22 deletions

View File

@ -19,6 +19,8 @@
#include "modplatform/ModIndex.h" #include "modplatform/ModIndex.h"
#include <QCryptographicHash> #include <QCryptographicHash>
#include <QDebug>
#include <QIODevice>
namespace ModPlatform { namespace ModPlatform {
@ -53,34 +55,26 @@ auto ProviderCapabilities::hashType(Provider p) -> QStringList
} }
return {}; return {};
} }
auto ProviderCapabilities::hash(Provider p, QByteArray& data, QString type) -> QByteArray
auto ProviderCapabilities::hash(Provider p, QIODevice* device, QString type) -> QString
{ {
QCryptographicHash::Algorithm algo = QCryptographicHash::Sha1;
switch (p) { switch (p) {
case Provider::MODRINTH: { case Provider::MODRINTH: {
// NOTE: Data is the result of reading the entire JAR file! algo = (type == "sha1") ? QCryptographicHash::Sha1 : QCryptographicHash::Sha512;
break;
// If 'type' was specified, we use that
if (!type.isEmpty() && hashType(p).contains(type)) {
if (type == "sha512")
return QCryptographicHash::hash(data, QCryptographicHash::Sha512);
else if (type == "sha1")
return QCryptographicHash::hash(data, QCryptographicHash::Sha1);
}
return QCryptographicHash::hash(data, QCryptographicHash::Sha512);
} }
case Provider::FLAME: case Provider::FLAME:
// If 'type' was specified, we use that algo = (type == "sha1") ? QCryptographicHash::Sha1 : QCryptographicHash::Md5;
if (!type.isEmpty() && hashType(p).contains(type)) {
if(type == "sha1")
return QCryptographicHash::hash(data, QCryptographicHash::Sha1);
else if (type == "md5")
return QCryptographicHash::hash(data, QCryptographicHash::Md5);
}
break; break;
} }
return {};
QCryptographicHash hash(algo);
if(!hash.addData(device))
qCritical() << "Failed to read JAR to create hash!";
Q_ASSERT(hash.result().length() == hash.hashLength(algo));
return { hash.result().toHex() };
} }
} // namespace ModPlatform } // namespace ModPlatform

View File

@ -24,6 +24,8 @@
#include <QVariant> #include <QVariant>
#include <QVector> #include <QVector>
class QIODevice;
namespace ModPlatform { namespace ModPlatform {
enum class Provider { enum class Provider {
@ -36,7 +38,7 @@ class ProviderCapabilities {
auto name(Provider) -> const char*; auto name(Provider) -> const char*;
auto readableName(Provider) -> QString; auto readableName(Provider) -> QString;
auto hashType(Provider) -> QStringList; auto hashType(Provider) -> QStringList;
auto hash(Provider, QByteArray&, QString type = "") -> QByteArray; auto hash(Provider, QIODevice*, QString type = "") -> QString;
}; };
struct ModpackAuthor { struct ModpackAuthor {