PrismLauncher/launcher/modplatform/flame/FileResolvingTask.cpp

64 lines
2.5 KiB
C++
Raw Normal View History

#include "FileResolvingTask.h"
#include "Json.h"
Flame::FileResolvingTask::FileResolvingTask(shared_qobject_ptr<QNetworkAccessManager> network, Flame::Manifest& toProcess)
: m_network(network), m_toProcess(toProcess)
2022-05-08 08:22:50 +01:00
{}
2017-04-22 17:51:04 +01:00
void Flame::FileResolvingTask::executeTask()
{
2018-07-15 13:51:05 +01:00
setStatus(tr("Resolving mod IDs..."));
setProgress(0, m_toProcess.files.size());
m_dljob = new NetJob("Mod id resolver", m_network);
2018-07-15 13:51:05 +01:00
results.resize(m_toProcess.files.size());
int index = 0;
2022-05-08 08:22:50 +01:00
for (auto& file : m_toProcess.files) {
2018-07-15 13:51:05 +01:00
auto projectIdStr = QString::number(file.projectId);
auto fileIdStr = QString::number(file.fileId);
2022-05-08 08:22:50 +01:00
QString metaurl = QString("https://api.curseforge.com/v1/mods/%1/files/%2").arg(projectIdStr, fileIdStr);
2018-07-15 13:51:05 +01:00
auto dl = Net::Download::makeByteArray(QUrl(metaurl), &results[index]);
m_dljob->addNetAction(dl);
2022-05-08 08:22:50 +01:00
index++;
2018-07-15 13:51:05 +01:00
}
connect(m_dljob.get(), &NetJob::finished, this, &Flame::FileResolvingTask::netJobFinished);
m_dljob->start();
}
2017-04-22 17:51:04 +01:00
void Flame::FileResolvingTask::netJobFinished()
{
2018-07-15 13:51:05 +01:00
bool failed = false;
int index = 0;
2022-05-08 08:22:50 +01:00
for (auto& bytes : results) {
auto& out = m_toProcess.files[index];
try {
2022-05-20 20:19:19 +01:00
bool fail = (!out.parseFromBytes(bytes));
if(fail){
//failed :( probably disabled mod, try to add to the list
auto doc = Json::requireDocument(bytes);
if (!doc.isObject()) {
throw JSONValidationError(QString("data is not an object? that's not supposed to happen"));
}
auto obj = Json::ensureObject(doc.object(), "data");
//FIXME : HACK, MAY NOT WORK FOR LONG
out.url = QUrl(QString("https://media.forgecdn.net/files/%1/%2/%3")
.arg(QString::number(QString::number(out.fileId).leftRef(4).toInt())
,QString::number(QString::number(out.fileId).rightRef(3).toInt())
,QUrl::toPercentEncoding(out.fileName)), QUrl::TolerantMode);
}
failed &= fail;
2022-05-08 08:22:50 +01:00
} catch (const JSONValidationError& e) {
2018-07-15 13:51:05 +01:00
qCritical() << "Resolving of" << out.projectId << out.fileId << "failed because of a parsing error:";
qCritical() << e.cause();
qCritical() << "JSON:";
qCritical() << bytes;
failed = true;
}
index++;
}
2022-05-08 08:22:50 +01:00
if (!failed) {
2018-07-15 13:51:05 +01:00
emitSucceeded();
2022-05-08 08:22:50 +01:00
} else {
2018-07-15 13:51:05 +01:00
emitFailed(tr("Some mod ID resolving tasks failed."));
}
}