Skip to content

Commit

Permalink
Merge pull request PrismLauncher#1694 from Trial97/concurrent
Browse files Browse the repository at this point in the history
  • Loading branch information
Scrumplex authored and LunaisLazier committed Feb 9, 2024
1 parent 93fc083 commit 22a6615
Show file tree
Hide file tree
Showing 29 changed files with 160 additions and 102 deletions.
1 change: 0 additions & 1 deletion launcher/minecraft/mod/ResourceFolderModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,6 @@ void ResourceFolderModel::applyUpdates(QSet<QString>& current_set, QSet<QString>
auto removed_it = m_resources.begin() + removed_index;

Q_ASSERT(removed_it != m_resources.end());
Q_ASSERT(removed_set.contains(removed_it->get()->internal_id()));

if ((*removed_it)->isResolving()) {
auto ticket = (*removed_it)->resolutionTicket();
Expand Down
4 changes: 3 additions & 1 deletion launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,9 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen

ResourceAPI::DependencySearchArgs args = { dep, m_version, m_loaderType };
ResourceAPI::DependencySearchCallbacks callbacks;

callbacks.on_fail = [](QString reason, int) {
qCritical() << tr("A network error occurred. Could not load project dependenies:%1").arg(reason);
};
callbacks.on_succeed = [dep, provider, pDep, level, this](auto& doc, [[maybe_unused]] auto& pack) {
try {
QJsonArray arr;
Expand Down
1 change: 1 addition & 0 deletions launcher/modplatform/EnsureMetadataTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ void EnsureMetadataTask::executeTask()
if (m_current_task)
m_current_task.reset();
});
connect(project_task.get(), &Task::failed, this, &EnsureMetadataTask::emitFailed);

m_current_task = project_task;
project_task->start();
Expand Down
2 changes: 2 additions & 0 deletions launcher/modplatform/ResourceAPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ class ResourceAPI {
};
struct VersionSearchCallbacks {
std::function<void(QJsonDocument&, ModPlatform::IndexedPack)> on_succeed;
std::function<void(QString const& reason, int network_error_code)> on_fail;
};

struct ProjectInfoArgs {
Expand All @@ -118,6 +119,7 @@ class ResourceAPI {

struct DependencySearchCallbacks {
std::function<void(QJsonDocument&, const ModPlatform::Dependency&)> on_succeed;
std::function<void(QString const& reason, int network_error_code)> on_fail;
};

public:
Expand Down
1 change: 0 additions & 1 deletion launcher/modplatform/flame/FileResolvingTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ void Flame::FileResolvingTask::netJobFinished()
connect(m_checkJob.get(), &NetJob::failed, this, [this, step_progress](QString reason) {
step_progress->state = TaskStepState::Failed;
stepProgress(*step_progress);
emitFailed(reason);
});
connect(m_checkJob.get(), &NetJob::stepProgress, this, &FileResolvingTask::propagateStepProgress);
connect(m_checkJob.get(), &NetJob::progress, this, [this, step_progress](qint64 current, qint64 total) {
Expand Down
7 changes: 4 additions & 3 deletions launcher/modplatform/flame/FlameCheckUpdate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ bool FlameCheckUpdate::abort()
return true;
}

ModPlatform::IndexedPack getProjectInfo(ModPlatform::IndexedVersion& ver_info)
ModPlatform::IndexedPack FlameCheckUpdate::getProjectInfo(ModPlatform::IndexedVersion& ver_info)
{
ModPlatform::IndexedPack pack;

Expand Down Expand Up @@ -57,6 +57,7 @@ ModPlatform::IndexedPack getProjectInfo(ModPlatform::IndexedVersion& ver_info)
}
});

connect(get_project_job, &NetJob::failed, this, &FlameCheckUpdate::emitFailed);
QObject::connect(get_project_job, &NetJob::finished, [&loop, get_project_job] {
get_project_job->deleteLater();
loop.quit();
Expand All @@ -68,7 +69,7 @@ ModPlatform::IndexedPack getProjectInfo(ModPlatform::IndexedVersion& ver_info)
return pack;
}

ModPlatform::IndexedVersion getFileInfo(int addonId, int fileId)
ModPlatform::IndexedVersion FlameCheckUpdate::getFileInfo(int addonId, int fileId)
{
ModPlatform::IndexedVersion ver;

Expand Down Expand Up @@ -100,7 +101,7 @@ ModPlatform::IndexedVersion getFileInfo(int addonId, int fileId)
qDebug() << doc;
}
});

connect(get_file_info_job, &NetJob::failed, this, &FlameCheckUpdate::emitFailed);
QObject::connect(get_file_info_job, &NetJob::finished, [&loop, get_file_info_job] {
get_file_info_job->deleteLater();
loop.quit();
Expand Down
3 changes: 3 additions & 0 deletions launcher/modplatform/flame/FlameCheckUpdate.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ class FlameCheckUpdate : public CheckUpdateTask {
void executeTask() override;

private:
ModPlatform::IndexedPack getProjectInfo(ModPlatform::IndexedVersion& ver_info);
ModPlatform::IndexedVersion getFileInfo(int addonId, int fileId);

NetJob* m_net_job = nullptr;

bool m_was_aborted = false;
Expand Down
1 change: 1 addition & 0 deletions launcher/modplatform/flame/FlameInstanceCreationTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ bool FlameCreationTask::updateInstance()
m_files_to_remove.append(old_minecraft_dir.absoluteFilePath(relative_path));
}
});
connect(job.get(), &Task::failed, this, [](QString reason) { qCritical() << "Failed to get files: " << reason; });
connect(job.get(), &Task::finished, &loop, &QEventLoop::quit);

m_process_update_file_info_job = job;
Expand Down
1 change: 1 addition & 0 deletions launcher/modplatform/flame/FlamePackExportTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ void FlamePackExportTask::getProjectsInfo()
}
buildZip();
});
connect(projTask.get(), &Task::failed, this, &FlamePackExportTask::emitFailed);
task.reset(projTask);
task->start();
}
Expand Down
13 changes: 13 additions & 0 deletions launcher/modplatform/helpers/NetworkResourceAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,13 @@ Task::Ptr NetworkResourceAPI::getProjectVersions(VersionSearchArgs&& args, Versi

callbacks.on_succeed(doc, args.pack);
});
QObject::connect(netJob.get(), &NetJob::failed, [&netJob, callbacks](QString reason) {
int network_error_code = -1;
if (auto* failed_action = netJob->getFailedActions().at(0); failed_action && failed_action->m_reply)
network_error_code = failed_action->m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

callbacks.on_fail(reason, network_error_code);
});

return netJob;
}
Expand Down Expand Up @@ -146,6 +153,12 @@ Task::Ptr NetworkResourceAPI::getDependencyVersion(DependencySearchArgs&& args,

callbacks.on_succeed(doc, args.dependency);
});
QObject::connect(netJob.get(), &NetJob::failed, [&netJob, callbacks](QString reason) {
int network_error_code = -1;
if (auto* failed_action = netJob->getFailedActions().at(0); failed_action && failed_action->m_reply)
network_error_code = failed_action->m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

callbacks.on_fail(reason, network_error_code);
});
return netJob;
}
16 changes: 6 additions & 10 deletions launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,17 +72,15 @@ void ModrinthCheckUpdate::executeTask()
auto response = std::make_shared<QByteArray>();
auto job = api.latestVersions(hashes, best_hash_type, m_game_versions, m_loaders, response);

QEventLoop lock;

connect(job.get(), &Task::succeeded, this, [this, response, &mappings, best_hash_type, job] {
connect(job.get(), &Task::succeeded, this, [this, response, mappings, best_hash_type, job] {
QJsonParseError parse_error{};
QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
if (parse_error.error != QJsonParseError::NoError) {
qWarning() << "Error while parsing JSON response from ModrinthCheckUpdate at " << parse_error.offset
<< " reason: " << parse_error.errorString();
qWarning() << *response;

failed(parse_error.errorString());
emitFailed(parse_error.errorString());
return;
}

Expand Down Expand Up @@ -167,19 +165,17 @@ void ModrinthCheckUpdate::executeTask()
m_deps.append(std::make_shared<GetModDependenciesTask::PackDependency>(pack, project_ver));
}
} catch (Json::JsonException& e) {
failed(e.cause() + " : " + e.what());
emitFailed(e.cause() + " : " + e.what());
return;
}
emitSucceeded();
});

connect(job.get(), &Task::finished, &lock, &QEventLoop::quit);
connect(job.get(), &Task::failed, this, &ModrinthCheckUpdate::emitFailed);

setStatus(tr("Waiting for the API response from Modrinth..."));
setProgress(1, 3);

m_net_job = qSharedPointerObjectCast<NetJob, Task>(job);
job->start();

lock.exec();

emitSucceeded();
}
18 changes: 8 additions & 10 deletions launcher/net/NetJob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
*/

#include "NetJob.h"
#include "tasks/ConcurrentTask.h"
#if defined(LAUNCHER_APPLICATION)
#include "Application.h"
#endif
Expand All @@ -56,18 +57,15 @@ auto NetJob::addNetAction(NetAction::Ptr action) -> bool
return true;
}

void NetJob::startNext()
void NetJob::executeNextSubTask()
{
if (m_queue.isEmpty() && m_doing.isEmpty()) {
// We're finished, check for failures and retry if we can (up to 3 times)
if (!m_failed.isEmpty() && m_try < 3) {
m_try += 1;
while (!m_failed.isEmpty())
m_queue.enqueue(m_failed.take(*m_failed.keyBegin()));
}
// We're finished, check for failures and retry if we can (up to 3 times)
if (isRunning() && m_queue.isEmpty() && m_doing.isEmpty() && !m_failed.isEmpty() && m_try < 3) {
m_try += 1;
while (!m_failed.isEmpty())
m_queue.enqueue(m_failed.take(*m_failed.keyBegin()));
}

ConcurrentTask::startNext();
ConcurrentTask::executeNextSubTask();
}

auto NetJob::size() const -> int
Expand Down
5 changes: 3 additions & 2 deletions launcher/net/NetJob.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ class NetJob : public ConcurrentTask {
explicit NetJob(QString job_name, shared_qobject_ptr<QNetworkAccessManager> network);
~NetJob() override = default;

void startNext() override;

auto size() const -> int;

auto canAbort() const -> bool override;
Expand All @@ -69,6 +67,9 @@ class NetJob : public ConcurrentTask {
// Qt can't handle auto at the start for some reason?
bool abort() override;

protected slots:
void executeNextSubTask() override;

protected:
void updateState() override;

Expand Down
4 changes: 2 additions & 2 deletions launcher/screenshots/ImgurUpload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,14 @@ void ImgurUpload::init()

QNetworkReply* ImgurUpload::getReply(QNetworkRequest& request)
{
auto file = new QFile(m_fileInfo.absoluteFilePath());
auto file = new QFile(m_fileInfo.absoluteFilePath(), this);

if (!file->open(QFile::ReadOnly)) {
emitFailed();
return nullptr;
}

QHttpMultiPart* multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpMultiPart* multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType, this);
file->setParent(multipart);
QHttpPart filePart;
filePart.setBodyDevice(file);
Expand Down

0 comments on commit 22a6615

Please sign in to comment.