aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--launcher/modplatform/ModIndex.cpp60
-rw-r--r--launcher/modplatform/ModIndex.h5
-rw-r--r--launcher/modplatform/flame/FlameModIndex.cpp10
-rw-r--r--launcher/modplatform/modrinth/ModrinthPackIndex.cpp10
-rw-r--r--launcher/modplatform/packwiz/Packwiz.cpp2
5 files changed, 68 insertions, 19 deletions
diff --git a/launcher/modplatform/ModIndex.cpp b/launcher/modplatform/ModIndex.cpp
index b3c057fb..f6e134e0 100644
--- a/launcher/modplatform/ModIndex.cpp
+++ b/launcher/modplatform/ModIndex.cpp
@@ -1,26 +1,60 @@
#include "modplatform/ModIndex.h"
-namespace ModPlatform{
+#include <QCryptographicHash>
+
+namespace ModPlatform {
auto ProviderCapabilities::name(Provider p) -> const char*
{
- switch(p){
- case Provider::MODRINTH:
- return "modrinth";
- case Provider::FLAME:
- return "curseforge";
+ switch (p) {
+ case Provider::MODRINTH:
+ return "modrinth";
+ case Provider::FLAME:
+ return "curseforge";
+ }
+ return {};
+}
+auto ProviderCapabilities::readableName(Provider p) -> QString
+{
+ switch (p) {
+ case Provider::MODRINTH:
+ return "Modrinth";
+ case Provider::FLAME:
+ return "CurseForge";
}
return {};
}
-auto ProviderCapabilities::hashType(Provider p) -> QString
+auto ProviderCapabilities::hashType(Provider p) -> QStringList
{
- switch(p){
- case Provider::MODRINTH:
- return "sha512";
- case Provider::FLAME:
- return "murmur2";
+ switch (p) {
+ case Provider::MODRINTH:
+ return { "sha512", "sha1" };
+ case Provider::FLAME:
+ return { "murmur2" };
+ }
+ return {};
+}
+auto ProviderCapabilities::hash(Provider p, QByteArray& data, QString type) -> QByteArray
+{
+ switch (p) {
+ case Provider::MODRINTH: {
+ // NOTE: Data is the result of reading the entire JAR file!
+
+ // 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:
+ // TODO
+ break;
}
return {};
}
-} // namespace ModPlatform
+} // namespace ModPlatform
diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h
index 2137f616..8ada1fc6 100644
--- a/launcher/modplatform/ModIndex.h
+++ b/launcher/modplatform/ModIndex.h
@@ -16,7 +16,9 @@ enum class Provider {
class ProviderCapabilities {
public:
auto name(Provider) -> const char*;
- auto hashType(Provider) -> QString;
+ auto readableName(Provider) -> QString;
+ auto hashType(Provider) -> QStringList;
+ auto hash(Provider, QByteArray&, QString type = "") -> QByteArray;
};
struct ModpackAuthor {
@@ -33,6 +35,7 @@ struct IndexedVersion {
QString date;
QString fileName;
QVector<QString> loaders = {};
+ QString hash_type;
QString hash;
};
diff --git a/launcher/modplatform/flame/FlameModIndex.cpp b/launcher/modplatform/flame/FlameModIndex.cpp
index 4b172c13..63411275 100644
--- a/launcher/modplatform/flame/FlameModIndex.cpp
+++ b/launcher/modplatform/flame/FlameModIndex.cpp
@@ -64,8 +64,14 @@ void FlameMod::loadIndexedPackVersions(ModPlatform::IndexedPack& pack,
auto hash_list = Json::ensureArray(obj, "hashes");
if(!hash_list.isEmpty()){
- if(hash_list.contains(ProviderCaps.hashType(ModPlatform::Provider::FLAME)))
- file.hash = Json::requireString(hash_list, "value");
+ auto hash_types = ProviderCaps.hashType(ModPlatform::Provider::FLAME);
+ for(auto& hash_type : hash_types) {
+ if(hash_list.contains(hash_type)) {
+ file.hash = Json::requireString(hash_list, "value");
+ file.hash_type = hash_type;
+ break;
+ }
+ }
}
unsortedVersions.append(file);
diff --git a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp
index aa798381..30693a82 100644
--- a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp
+++ b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp
@@ -116,8 +116,14 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject &obj) -> ModPlatform::IndexedV
file.downloadUrl = Json::requireString(parent, "url");
file.fileName = Json::requireString(parent, "filename");
auto hash_list = Json::requireObject(parent, "hashes");
- if (hash_list.contains(ProviderCaps.hashType(ModPlatform::Provider::MODRINTH)))
- file.hash = Json::requireString(hash_list, ProviderCaps.hashType(ModPlatform::Provider::MODRINTH));
+ auto hash_types = ProviderCaps.hashType(ModPlatform::Provider::MODRINTH);
+ for (auto& hash_type : hash_types) {
+ if (hash_list.contains(hash_type)) {
+ file.hash = Json::requireString(hash_list, hash_type);
+ file.hash_type = hash_type;
+ break;
+ }
+ }
return file;
}
diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp
index 4fe4398a..cb430c1f 100644
--- a/launcher/modplatform/packwiz/Packwiz.cpp
+++ b/launcher/modplatform/packwiz/Packwiz.cpp
@@ -29,7 +29,7 @@ auto V1::createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, Mo
mod.filename = mod_version.fileName;
mod.url = mod_version.downloadUrl;
- mod.hash_format = ProviderCaps.hashType(mod_pack.provider);
+ mod.hash_format = mod_version.hash_type;
mod.hash = mod_version.hash;
mod.provider = mod_pack.provider;