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:
parent
0e473f4570
commit
cfda8dbb2b
@ -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;
|
||||||
|
|
||||||
// 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:
|
|
||||||
// If 'type' was specified, we use that
|
|
||||||
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 {};
|
case Provider::FLAME:
|
||||||
|
algo = (type == "sha1") ? QCryptographicHash::Sha1 : QCryptographicHash::Md5;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user