From e76e6329cdf4f1613c6303debd3ca43493147f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 3 May 2017 23:11:52 +0200 Subject: NOISSUE Revert all recent changes to NetAction and NetJob --- api/logic/InstanceCopyTask.cpp | 2 +- api/logic/InstanceCreationTask.cpp | 2 +- api/logic/InstanceImportTask.cpp | 8 +- api/logic/java/JavaInstallList.cpp | 2 +- api/logic/launch/steps/Update.cpp | 2 +- api/logic/minecraft/AssetsUtils.cpp | 2 +- api/logic/minecraft/Library.cpp | 2 +- api/logic/minecraft/SkinUpload.cpp | 2 +- api/logic/minecraft/auth/YggdrasilTask.cpp | 2 +- api/logic/minecraft/flame/FileResolvingTask.cpp | 2 +- api/logic/minecraft/forge/ForgeXzDownload.cpp | 56 +++++++------- api/logic/minecraft/forge/ForgeXzDownload.h | 7 +- api/logic/minecraft/legacy/LegacyInstance.cpp | 4 +- api/logic/minecraft/legacy/LegacyUpdate.cpp | 16 ++-- api/logic/minecraft/onesix/OneSixUpdate.cpp | 14 ++-- api/logic/minecraft/onesix/OneSixUpdate.h | 2 +- .../minecraft/onesix/update/AssetUpdateTask.cpp | 4 +- .../minecraft/onesix/update/FMLLibrariesTask.cpp | 6 +- .../minecraft/onesix/update/LibrariesTask.cpp | 2 +- api/logic/net/ByteArraySink.h | 22 +++--- api/logic/net/Download.cpp | 88 +++++++++------------ api/logic/net/Download.h | 7 +- api/logic/net/FileSink.cpp | 36 ++++----- api/logic/net/FileSink.h | 12 +-- api/logic/net/MetaCacheSink.cpp | 10 +-- api/logic/net/MetaCacheSink.h | 4 +- api/logic/net/NetAction.h | 71 ++++++++++++++--- api/logic/net/NetJob.cpp | 89 +++++++--------------- api/logic/net/NetJob.h | 68 +++++++++++++---- api/logic/net/PasteUpload.cpp | 2 +- api/logic/net/Sink.h | 8 +- api/logic/notifications/NotificationChecker.cpp | 2 +- api/logic/notifications/NotificationChecker.h | 2 +- api/logic/screenshots/ImgurAlbumCreation.cpp | 24 +++--- api/logic/screenshots/ImgurAlbumCreation.h | 4 +- api/logic/screenshots/ImgurUpload.cpp | 24 +++--- api/logic/screenshots/ImgurUpload.h | 5 +- api/logic/tasks/SequentialTask.cpp | 2 +- api/logic/tasks/Task.cpp | 8 +- api/logic/tasks/Task.h | 41 +++------- api/logic/tasks/ThreadTask.cpp | 2 +- api/logic/translations/TranslationsModel.cpp | 2 +- api/logic/updater/DownloadTask.cpp | 16 ++-- api/logic/updater/DownloadTask.h | 4 +- application/dialogs/ProgressDialog.cpp | 2 +- 45 files changed, 355 insertions(+), 337 deletions(-) diff --git a/api/logic/InstanceCopyTask.cpp b/api/logic/InstanceCopyTask.cpp index c30610ed..b1bd39ef 100644 --- a/api/logic/InstanceCopyTask.cpp +++ b/api/logic/InstanceCopyTask.cpp @@ -26,7 +26,7 @@ InstanceCopyTask::InstanceCopyTask(SettingsObjectPtr settings, BaseInstanceProvi void InstanceCopyTask::executeTask() { - setStatusText(tr("Copying instance %1").arg(m_origInstance->name())); + setStatus(tr("Copying instance %1").arg(m_origInstance->name())); m_stagingPath = m_target->getStagedInstancePath(); FS::copy folderCopy(m_origInstance->instanceRoot(), m_stagingPath); folderCopy.followSymlinks(false).blacklist(m_matcher.get()); diff --git a/api/logic/InstanceCreationTask.cpp b/api/logic/InstanceCreationTask.cpp index ef33610e..e7b0de7c 100644 --- a/api/logic/InstanceCreationTask.cpp +++ b/api/logic/InstanceCreationTask.cpp @@ -19,7 +19,7 @@ InstanceCreationTask::InstanceCreationTask(SettingsObjectPtr settings, BaseInsta void InstanceCreationTask::executeTask() { - setStatusText(tr("Creating instance from version %1").arg(m_version->name())); + setStatus(tr("Creating instance from version %1").arg(m_version->name())); /* auto minecraftVersion = std::dynamic_pointer_cast(m_version); if(!minecraftVersion) diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp index f60d329c..f1b3d5aa 100644 --- a/api/logic/InstanceImportTask.cpp +++ b/api/logic/InstanceImportTask.cpp @@ -38,7 +38,7 @@ void InstanceImportTask::executeTask() } else { - setStatusText(tr("Downloading modpack:\n%1").arg(m_sourceUrl.toString())); + setStatus(tr("Downloading modpack:\n%1").arg(m_sourceUrl.toString())); m_downloadRequired = true; const QString path = m_sourceUrl.host() + '/' + m_sourceUrl.path(); @@ -94,7 +94,7 @@ static QFileInfo findRecursive(const QString &dir, const QString &name) void InstanceImportTask::extractAndTweak() { - setStatusText(tr("Extracting modpack")); + setStatus(tr("Extracting modpack")); m_stagingPath = m_target->getStagedInstancePath(); QDir extractDir(m_stagingPath); qDebug() << "Attempting to create instance from" << m_archivePath; @@ -321,7 +321,7 @@ void InstanceImportTask::processFlame(const QFileInfo & manifest) { setProgress(current, total); }); - setStatusText(tr("Downloading mods...")); + setStatus(tr("Downloading mods...")); m_filesNetJob->start(); } ); @@ -337,7 +337,7 @@ void InstanceImportTask::processFlame(const QFileInfo & manifest) }); connect(m_modIdResolver.get(), &Flame::FileResolvingTask::status, [&](QString status) { - setStatusText(status); + setStatus(status); }); m_modIdResolver->start(); } diff --git a/api/logic/java/JavaInstallList.cpp b/api/logic/java/JavaInstallList.cpp index e0915497..44ac861d 100644 --- a/api/logic/java/JavaInstallList.cpp +++ b/api/logic/java/JavaInstallList.cpp @@ -144,7 +144,7 @@ JavaListLoadTask::~JavaListLoadTask() void JavaListLoadTask::executeTask() { - setStatusText(tr("Detecting Java installations...")); + setStatus(tr("Detecting Java installations...")); JavaUtils ju; QList candidate_paths = ju.FindJavaPaths(); diff --git a/api/logic/launch/steps/Update.cpp b/api/logic/launch/steps/Update.cpp index 461d8036..956230f4 100644 --- a/api/logic/launch/steps/Update.cpp +++ b/api/logic/launch/steps/Update.cpp @@ -28,7 +28,7 @@ void Update::executeTask() { connect(m_updateTask.get(), SIGNAL(finished()), this, SLOT(updateFinished())); connect(m_updateTask.get(), &Task::progress, this, &Task::setProgress); - connect(m_updateTask.get(), &Task::status, this, &Task::setStatusText); + connect(m_updateTask.get(), &Task::status, this, &Task::setStatus); emit progressReportingRequest(); return; } diff --git a/api/logic/minecraft/AssetsUtils.cpp b/api/logic/minecraft/AssetsUtils.cpp index ad864d51..5191e5bd 100644 --- a/api/logic/minecraft/AssetsUtils.cpp +++ b/api/logic/minecraft/AssetsUtils.cpp @@ -199,7 +199,7 @@ NetActionPtr AssetObject::getDownloadAction() auto rawHash = QByteArray::fromHex(hash.toLatin1()); objectDL->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, rawHash)); } - objectDL->setProgress(0, size); + objectDL->m_total_progress = size; return objectDL; } return nullptr; diff --git a/api/logic/minecraft/Library.cpp b/api/logic/minecraft/Library.cpp index 0fdc2e12..22e1bd33 100644 --- a/api/logic/minecraft/Library.cpp +++ b/api/logic/minecraft/Library.cpp @@ -51,7 +51,7 @@ void Library::getApplicableFiles(OpSys system, QStringList& jar, QStringList& na } } -QList Library::getDownloads(OpSys system, class HttpMetaCache* cache, +QList< std::shared_ptr< NetAction > > Library::getDownloads(OpSys system, class HttpMetaCache* cache, QStringList& failedFiles, const QString & overridePath) const { QList out; diff --git a/api/logic/minecraft/SkinUpload.cpp b/api/logic/minecraft/SkinUpload.cpp index dafd3a85..1d1e38f3 100644 --- a/api/logic/minecraft/SkinUpload.cpp +++ b/api/logic/minecraft/SkinUpload.cpp @@ -43,7 +43,7 @@ void SkinUpload::executeTask() QNetworkReply *rep = ENV.qnam().put(request, multiPart); m_reply = std::shared_ptr(rep); - setStatusText(tr("Uploading skin")); + setStatus(tr("Uploading skin")); connect(rep, &QNetworkReply::uploadProgress, this, &Task::setProgress); connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished())); diff --git a/api/logic/minecraft/auth/YggdrasilTask.cpp b/api/logic/minecraft/auth/YggdrasilTask.cpp index 72c1c66f..425da76a 100644 --- a/api/logic/minecraft/auth/YggdrasilTask.cpp +++ b/api/logic/minecraft/auth/YggdrasilTask.cpp @@ -237,7 +237,7 @@ QString YggdrasilTask::getStateMessage() const void YggdrasilTask::changeState(YggdrasilTask::State newState, QString reason) { m_state = newState; - setStatusText(getStateMessage()); + setStatus(getStateMessage()); if (newState == STATE_SUCCEEDED) { emitSucceeded(); diff --git a/api/logic/minecraft/flame/FileResolvingTask.cpp b/api/logic/minecraft/flame/FileResolvingTask.cpp index 093de3ec..582e4a07 100644 --- a/api/logic/minecraft/flame/FileResolvingTask.cpp +++ b/api/logic/minecraft/flame/FileResolvingTask.cpp @@ -10,7 +10,7 @@ Flame::FileResolvingTask::FileResolvingTask(Flame::Manifest& toProcess) void Flame::FileResolvingTask::executeTask() { - setStatusText(tr("Resolving mod IDs...")); + setStatus(tr("Resolving mod IDs...")); setProgress(0, m_toProcess.files.size()); m_dljob.reset(new NetJob("Mod id resolver")); results.resize(m_toProcess.files.size()); diff --git a/api/logic/minecraft/forge/ForgeXzDownload.cpp b/api/logic/minecraft/forge/ForgeXzDownload.cpp index 8bcd43aa..4d94dd12 100644 --- a/api/logic/minecraft/forge/ForgeXzDownload.cpp +++ b/api/logic/minecraft/forge/ForgeXzDownload.cpp @@ -28,31 +28,31 @@ ForgeXzDownload::ForgeXzDownload(QString relative_path, MetaEntryPtr entry) : Ne m_entry = entry; m_target_path = entry->getFullPath(); m_pack200_xz_file.setFileTemplate("./dl_temp.XXXXXX"); - m_status = Status::NotStarted; + m_status = Job_NotStarted; m_url_path = relative_path; m_url = "http://files.minecraftforge.net/maven/" + m_url_path + ".pack.xz"; } -void ForgeXzDownload::executeTask() +void ForgeXzDownload::start() { - if(m_status == Status::Aborted) + if(m_status == Job_Aborted) { qWarning() << "Attempt to start an aborted Download:" << m_url.toString(); - emit aborted(); + emit aborted(m_index_within_job); return; } - m_status = Status::InProgress; + m_status = Job_InProgress; if (!m_entry->isStale()) { - m_status = Status::Finished; - emit succeeded(); + m_status = Job_Finished; + emit succeeded(m_index_within_job); return; } // can we actually create the real, final file? if (!FS::ensureFilePathExists(m_target_path)) { - m_status = Status::Failed; - emit failed(); + m_status = Job_Failed; + emit failed(m_index_within_job); return; } @@ -72,9 +72,9 @@ void ForgeXzDownload::executeTask() void ForgeXzDownload::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { - m_progressTotal = bytesTotal; + m_total_progress = bytesTotal; m_progress = bytesReceived; - emit progress(bytesReceived, bytesTotal); + emit netActionProgress(m_index_within_job, bytesReceived, bytesTotal); } void ForgeXzDownload::downloadError(QNetworkReply::NetworkError error) @@ -82,29 +82,29 @@ void ForgeXzDownload::downloadError(QNetworkReply::NetworkError error) if(error == QNetworkReply::OperationCanceledError) { qCritical() << "Aborted " << m_url.toString(); - m_status = Status::Aborted; + m_status = Job_Aborted; } else { // error happened during download. qCritical() << "Failed " << m_url.toString() << " with reason " << error; - m_status = Status::Failed; + m_status = Job_Failed; } } void ForgeXzDownload::failAndTryNextMirror() { - m_status = Status::Failed; - emit failed(); + m_status = Job_Failed; + emit failed(m_index_within_job); } void ForgeXzDownload::downloadFinished() { // if the download succeeded - if (m_status != Status::Failed && m_status != Status::Aborted) + if (m_status != Job_Failed && m_status != Job_Aborted) { // nothing went wrong... - m_status = Status::Finished; + m_status = Job_Finished; if (m_pack200_xz_file.isOpen()) { // we actually downloaded something! process and isntall it @@ -114,25 +114,25 @@ void ForgeXzDownload::downloadFinished() else { // something bad happened -- on the local machine! - m_status = Status::Failed; + m_status = Job_Failed; m_pack200_xz_file.remove(); m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } } - else if(m_status == Status::Aborted) + else if(m_status == Job_Aborted) { m_pack200_xz_file.remove(); m_reply.reset(); - emit failed(); - emit aborted(); + emit failed(m_index_within_job); + emit aborted(m_index_within_job); return; } // else the download failed else { - m_status = Status::Failed; + m_status = Job_Failed; m_pack200_xz_file.close(); m_pack200_xz_file.remove(); m_reply.reset(); @@ -152,7 +152,7 @@ void ForgeXzDownload::downloadReadyRead() * Can't open the file... the job failed */ m_reply->abort(); - emit failed(); + emit failed(m_index_within_job); return; } } @@ -345,7 +345,7 @@ void ForgeXzDownload::decompressAndInstall() } catch (std::runtime_error &err) { - m_status = Status::Failed; + m_status = Job_Failed; qCritical() << "Error unpacking " << pack200_file.fileName() << " : " << err.what(); QFile f(m_target_path); if (f.exists()) @@ -374,18 +374,18 @@ void ForgeXzDownload::decompressAndInstall() ENV.metacache()->updateEntry(m_entry); m_reply.reset(); - emit succeeded(); + emit succeeded(m_index_within_job); } bool ForgeXzDownload::abort() { if(m_reply) m_reply->abort(); - m_status = Status::Aborted; + m_status = Job_Aborted; return true; } -bool ForgeXzDownload::canAbort() const +bool ForgeXzDownload::canAbort() { return true; } diff --git a/api/logic/minecraft/forge/ForgeXzDownload.h b/api/logic/minecraft/forge/ForgeXzDownload.h index 8d6ad74a..ef23809b 100644 --- a/api/logic/minecraft/forge/ForgeXzDownload.h +++ b/api/logic/minecraft/forge/ForgeXzDownload.h @@ -19,9 +19,8 @@ #include "net/HttpMetaCache.h" #include #include -#include "QObjectPtr.h" -typedef shared_qobject_ptr ForgeXzDownloadPtr; +typedef std::shared_ptr ForgeXzDownloadPtr; class ForgeXzDownload : public NetAction { @@ -42,7 +41,7 @@ public: return ForgeXzDownloadPtr(new ForgeXzDownload(relative_path, entry)); } virtual ~ForgeXzDownload(){}; - bool canAbort() const override; + bool canAbort() override; protected slots: @@ -53,7 +52,7 @@ slots: public slots: - void executeTask() override; + void start() override; bool abort() override; private: diff --git a/api/logic/minecraft/legacy/LegacyInstance.cpp b/api/logic/minecraft/legacy/LegacyInstance.cpp index 5894d7f0..0987d56f 100644 --- a/api/logic/minecraft/legacy/LegacyInstance.cpp +++ b/api/logic/minecraft/legacy/LegacyInstance.cpp @@ -131,7 +131,7 @@ std::shared_ptr LegacyInstance::createJarModdingTask() return; } - setStatusText(tr("Installing mods: Backing up minecraft.jar ...")); + setStatus(tr("Installing mods: Backing up minecraft.jar ...")); if (!baseJar.exists() && !QFile::copy(runnableJar.filePath(), baseJar.filePath())) { emitFailed("It seems both the active and base jar are gone. A fresh base jar will " @@ -155,7 +155,7 @@ std::shared_ptr LegacyInstance::createJarModdingTask() return; } - setStatusText(tr("Installing mods: Opening minecraft.jar ...")); + setStatus(tr("Installing mods: Opening minecraft.jar ...")); QString outputJarPath = runnableJar.filePath(); QString inputJarPath = baseJar.filePath(); diff --git a/api/logic/minecraft/legacy/LegacyUpdate.cpp b/api/logic/minecraft/legacy/LegacyUpdate.cpp index 4bde6ff8..337a3e4e 100644 --- a/api/logic/minecraft/legacy/LegacyUpdate.cpp +++ b/api/logic/minecraft/legacy/LegacyUpdate.cpp @@ -58,7 +58,7 @@ void LegacyUpdate::fmllibsStart() auto &libList = fmlLibsMapping[version]; // determine if we need some libs for FML or forge - setStatusText(tr("Checking for FML libraries...")); + setStatus(tr("Checking for FML libraries...")); for (unsigned i = 0; i < modList->size(); i++) { auto &mod = modList->operator[](i); @@ -105,7 +105,7 @@ void LegacyUpdate::fmllibsStart() } // download missing libs to our place - setStatusText(tr("Dowloading FML libraries...")); + setStatus(tr("Dowloading FML libraries...")); auto dljob = new NetJob("FML libraries"); auto metacache = ENV.metacache(); for (auto &lib : fmlLibsToProcess) @@ -128,7 +128,7 @@ void LegacyUpdate::fmllibsFinished() legacyDownloadJob.reset(); if(!fmlLibsToProcess.isEmpty()) { - setStatusText(tr("Copying FML libraries into the instance...")); + setStatus(tr("Copying FML libraries into the instance...")); LegacyInstance *inst = (LegacyInstance *)m_inst; auto metacache = ENV.metacache(); int index = 0; @@ -183,7 +183,7 @@ void LegacyUpdate::lwjglStart() return; } - setStatusText(tr("Downloading new LWJGL...")); + setStatus(tr("Downloading new LWJGL...")); auto version = std::dynamic_pointer_cast(list->findVersion(lwjglVersion)); if (!version) { @@ -247,7 +247,7 @@ void LegacyUpdate::lwjglFinished(QNetworkReply *reply) saveMe.open(QIODevice::WriteOnly); saveMe.write(m_reply->readAll()); saveMe.close(); - setStatusText(tr("Installing new LWJGL...")); + setStatus(tr("Installing new LWJGL...")); extractLwjgl(); jarStart(); } @@ -323,7 +323,7 @@ void LegacyUpdate::extractLwjgl() // Now if destFileName is still empty, go to the next file. if (!destFileName.isEmpty()) { - setStatusText(tr("Installing new LWJGL - extracting ") + name + "..."); + setStatus(tr("Installing new LWJGL - extracting ") + name + "..."); QFile output(destFileName); output.open(QIODevice::WriteOnly); output.write(file.readAll()); @@ -353,7 +353,7 @@ void LegacyUpdate::jarStart() return; } - setStatusText(tr("Checking for jar updates...")); + setStatus(tr("Checking for jar updates...")); // Make directories QDir binDir(inst->binRoot()); if (!binDir.exists() && !binDir.mkpath(".")) @@ -363,7 +363,7 @@ void LegacyUpdate::jarStart() } // Build a list of URLs that will need to be downloaded. - setStatusText(tr("Downloading new minecraft.jar ...")); + setStatus(tr("Downloading new minecraft.jar ...")); QString version_id = inst->intendedVersionId(); diff --git a/api/logic/minecraft/onesix/OneSixUpdate.cpp b/api/logic/minecraft/onesix/OneSixUpdate.cpp index 163cb1a3..e0027032 100644 --- a/api/logic/minecraft/onesix/OneSixUpdate.cpp +++ b/api/logic/minecraft/onesix/OneSixUpdate.cpp @@ -41,7 +41,7 @@ OneSixUpdate::OneSixUpdate(OneSixInstance *inst, QObject *parent) : Task(parent) { // create folders { - m_tasks.append(new FoldersTask(m_inst)); + m_tasks.append(std::make_shared(m_inst)); } // add metadata update tasks, if necessary @@ -66,7 +66,7 @@ OneSixUpdate::OneSixUpdate(OneSixInstance *inst, QObject *parent) : Task(parent) if(task) { qDebug() << "Loading remote meta patch" << id; - m_tasks.append(task); + m_tasks.append(task.unwrap()); } } else @@ -78,17 +78,17 @@ OneSixUpdate::OneSixUpdate(OneSixInstance *inst, QObject *parent) : Task(parent) // libraries download { - m_tasks.append(new LibrariesTask(m_inst)); + m_tasks.append(std::make_shared(m_inst)); } // FML libraries download and copy into the instance { - m_tasks.append(new FMLLibrariesTask(m_inst)); + m_tasks.append(std::make_shared(m_inst)); } // assets update { - m_tasks.append(new AssetUpdateTask(m_inst)); + m_tasks.append(std::make_shared(m_inst)); } } @@ -116,7 +116,7 @@ void OneSixUpdate::next() disconnect(task.get(), &Task::succeeded, this, &OneSixUpdate::subtaskSucceeded); disconnect(task.get(), &Task::failed, this, &OneSixUpdate::subtaskFailed); disconnect(task.get(), &Task::progress, this, &OneSixUpdate::progress); - disconnect(task.get(), &Task::status, this, &OneSixUpdate::setStatusText); + disconnect(task.get(), &Task::status, this, &OneSixUpdate::setStatus); } if(m_currentTask == m_tasks.size()) { @@ -132,7 +132,7 @@ void OneSixUpdate::next() connect(task.get(), &Task::succeeded, this, &OneSixUpdate::subtaskSucceeded); connect(task.get(), &Task::failed, this, &OneSixUpdate::subtaskFailed); connect(task.get(), &Task::progress, this, &OneSixUpdate::progress); - connect(task.get(), &Task::status, this, &OneSixUpdate::setStatusText); + connect(task.get(), &Task::status, this, &OneSixUpdate::setStatus); // if the task is already running, do not start it again if(!task->isRunning()) { diff --git a/api/logic/minecraft/onesix/OneSixUpdate.h b/api/logic/minecraft/onesix/OneSixUpdate.h index 7b6fa5ca..6bcfd41a 100644 --- a/api/logic/minecraft/onesix/OneSixUpdate.h +++ b/api/logic/minecraft/onesix/OneSixUpdate.h @@ -46,7 +46,7 @@ private: private: OneSixInstance *m_inst = nullptr; - QList> m_tasks; + QList> m_tasks; QString m_preFailure; int m_currentTask = -1; bool m_abort = false; diff --git a/api/logic/minecraft/onesix/update/AssetUpdateTask.cpp b/api/logic/minecraft/onesix/update/AssetUpdateTask.cpp index bdd50fd1..21600ff0 100644 --- a/api/logic/minecraft/onesix/update/AssetUpdateTask.cpp +++ b/api/logic/minecraft/onesix/update/AssetUpdateTask.cpp @@ -10,7 +10,7 @@ AssetUpdateTask::AssetUpdateTask(OneSixInstance * inst) } void AssetUpdateTask::executeTask() { - setStatusText(tr("Updating assets index...")); + setStatus(tr("Updating assets index...")); auto profile = m_inst->getMinecraftProfile(); auto assets = profile->getMinecraftAssets(); QUrl indexUrl = assets->url; @@ -63,7 +63,7 @@ void AssetUpdateTask::assetIndexFinished() auto job = index.getDownloadJob(); if(job) { - setStatusText(tr("Getting the assets files from Mojang...")); + setStatus(tr("Getting the assets files from Mojang...")); downloadJob = job; connect(downloadJob.get(), &NetJob::succeeded, this, &AssetUpdateTask::emitSucceeded); connect(downloadJob.get(), &NetJob::failed, this, &AssetUpdateTask::assetsFailed); diff --git a/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp b/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp index 4a0a97ea..1cbee95e 100644 --- a/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp +++ b/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp @@ -32,7 +32,7 @@ void FMLLibrariesTask::executeTask() auto &libList = fmlLibsMapping[version]; // determine if we need some libs for FML or forge - setStatusText(tr("Checking for FML libraries...")); + setStatus(tr("Checking for FML libraries...")); forge_present = (profile->versionPatch("net.minecraftforge") != nullptr); // we don't... if (!forge_present) @@ -58,7 +58,7 @@ void FMLLibrariesTask::executeTask() } // download missing libs to our place - setStatusText(tr("Dowloading FML libraries...")); + setStatus(tr("Dowloading FML libraries...")); auto dljob = new NetJob("FML libraries"); auto metacache = ENV.metacache(); for (auto &lib : fmlLibsToProcess) @@ -86,7 +86,7 @@ void FMLLibrariesTask::fmllibsFinished() downloadJob.reset(); if (!fmlLibsToProcess.isEmpty()) { - setStatusText(tr("Copying FML libraries into the instance...")); + setStatus(tr("Copying FML libraries into the instance...")); OneSixInstance *inst = (OneSixInstance *)m_inst; auto metacache = ENV.metacache(); int index = 0; diff --git a/api/logic/minecraft/onesix/update/LibrariesTask.cpp b/api/logic/minecraft/onesix/update/LibrariesTask.cpp index 748ab10c..2cd41ded 100644 --- a/api/logic/minecraft/onesix/update/LibrariesTask.cpp +++ b/api/logic/minecraft/onesix/update/LibrariesTask.cpp @@ -9,7 +9,7 @@ LibrariesTask::LibrariesTask(OneSixInstance * inst) void LibrariesTask::executeTask() { - setStatusText(tr("Getting the library files from Mojang...")); + setStatus(tr("Getting the library files from Mojang...")); qDebug() << m_inst->name() << ": downloading libraries"; OneSixInstance *inst = (OneSixInstance *)m_inst; inst->reloadProfile(); diff --git a/api/logic/net/ByteArraySink.h b/api/logic/net/ByteArraySink.h index c81b952b..03b77fcc 100644 --- a/api/logic/net/ByteArraySink.h +++ b/api/logic/net/ByteArraySink.h @@ -21,34 +21,34 @@ public: } public: - Task::Status init(QNetworkRequest & request) override + JobStatus init(QNetworkRequest & request) override { m_output->clear(); if(initAllValidators(request)) - return Task::Status::InProgress; - return Task::Status::Failed; + return Job_InProgress; + return Job_Failed; }; - Task::Status write(QByteArray & data) override + JobStatus write(QByteArray & data) override { m_output->append(data); if(writeAllValidators(data)) - return Task::Status::InProgress; - return Task::Status::Failed; + return Job_InProgress; + return Job_Failed; } - Task::Status abort() override + JobStatus abort() override { m_output->clear(); failAllValidators(); - return Task::Status::Failed; + return Job_Failed; } - Task::Status finalize(QNetworkReply &reply) override + JobStatus finalize(QNetworkReply &reply) override { if(finalizeAllValidators(reply)) - return Task::Status::Finished; - return Task::Status::Failed; + return Job_Finished; + return Job_Failed; } bool hasLocalData() override diff --git a/api/logic/net/Download.cpp b/api/logic/net/Download.cpp index 12c4d7e0..ee872e33 100644 --- a/api/logic/net/Download.cpp +++ b/api/logic/net/Download.cpp @@ -28,7 +28,7 @@ namespace Net { Download::Download():NetAction() { - m_status = Status::NotStarted; + m_status = Job_NotStarted; } Download::Ptr Download::makeCached(QUrl url, MetaEntryPtr entry, Options options) @@ -40,7 +40,7 @@ Download::Ptr Download::makeCached(QUrl url, MetaEntryPtr entry, Options options auto cachedNode = new MetaCacheSink(entry, md5Node); dl->m_sink.reset(cachedNode); dl->m_target_path = entry->getFullPath(); - return dl; + return std::shared_ptr(dl); } Download::Ptr Download::makeByteArray(QUrl url, QByteArray *output, Options options) @@ -49,7 +49,7 @@ Download::Ptr Download::makeByteArray(QUrl url, QByteArray *output, Options opti dl->m_url = url; dl->m_options = options; dl->m_sink.reset(new ByteArraySink(output)); - return dl; + return std::shared_ptr(dl); } Download::Ptr Download::makeFile(QUrl url, QString path, Options options) @@ -58,7 +58,7 @@ Download::Ptr Download::makeFile(QUrl url, QString path, Options options) dl->m_url = url; dl->m_options = options; dl->m_sink.reset(new FileSink(path)); - return dl; + return std::shared_ptr(dl); } void Download::addValidator(Validator * v) @@ -66,30 +66,30 @@ void Download::addValidator(Validator * v) m_sink->addValidator(v); } -void Download::executeTask() +void Download::start() { - if(m_status == Status::Aborted) + if(m_status == Job_Aborted) { qWarning() << "Attempt to start an aborted Download:" << m_url.toString(); - emit aborted(); + emit aborted(m_index_within_job); return; } QNetworkRequest request(m_url); m_status = m_sink->init(request); switch(m_status) { - case Status::Finished: - emit succeeded(); + case Job_Finished: + emit succeeded(m_index_within_job); qDebug() << "Download cache hit " << m_url.toString(); return; - case Status::InProgress: + case Job_InProgress: qDebug() << "Downloading " << m_url.toString(); break; - case Status::NotStarted: - case Status::Failed: - emit failed(); + case Job_NotStarted: + case Job_Failed: + emit failed(m_index_within_job); return; - case Status::Aborted: + case Job_Aborted: return; } @@ -106,20 +106,9 @@ void Download::executeTask() void Download::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { - // FIXME: ignore unknown size. for now. - if(bytesTotal == -1) - { - return; - } - // FIXME: ignore redirects... for now. - auto redirectURL = getRedirect(); - if(!redirectURL.isEmpty()) - { - return; - } - m_progressTotal = bytesTotal; + m_total_progress = bytesTotal; m_progress = bytesReceived; - emit progress(bytesReceived, bytesTotal); + emit netActionProgress(m_index_within_job, bytesReceived, bytesTotal); } void Download::downloadError(QNetworkReply::NetworkError error) @@ -127,7 +116,7 @@ void Download::downloadError(QNetworkReply::NetworkError error) if(error == QNetworkReply::OperationCanceledError) { qCritical() << "Aborted " << m_url.toString(); - m_status = Status::Aborted; + m_status = Job_Aborted; } else { @@ -135,17 +124,17 @@ void Download::downloadError(QNetworkReply::NetworkError error) { if(m_sink->hasLocalData()) { - m_status = Status::Failed_Proceed; + m_status = Job_Failed_Proceed; return; } } // error happened during download. qCritical() << "Failed " << m_url.toString() << " with reason " << error; - m_status = Status::Failed; + m_status = Job_Failed; } } -QString Download::getRedirect() +bool Download::handleRedirect() { QVariant redirect = m_reply->header(QNetworkRequest::LocationHeader); QString redirectURL; @@ -162,15 +151,10 @@ QString Download::getRedirect() redirectURL = m_reply->url().scheme() + ":" + data; } } - return redirectURL; -} - -bool Download::handleRedirect() -{ - auto redirectURL = getRedirect(); if (!redirectURL.isEmpty()) { - m_url = QUrl(redirectURL); + m_url = QUrl(redirect.toString()); + qDebug() << "Following redirect to " << m_url.toString(); start(); return true; } @@ -188,28 +172,28 @@ void Download::downloadFinished() } // if the download failed before this point ... - if (m_status == Status::Failed_Proceed) + if (m_status == Job_Failed_Proceed) { qDebug() << "Download failed but we are allowed to proceed:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit succeeded(); + emit succeeded(m_index_within_job); return; } - else if (m_status == Status::Failed) + else if (m_status == Job_Failed) { qDebug() << "Download failed in previous step:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } - else if(m_status == Status::Aborted) + else if(m_status == Job_Aborted) { qDebug() << "Download aborted in previous step:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit aborted(); + emit aborted(m_index_within_job); return; } @@ -223,26 +207,26 @@ void Download::downloadFinished() // otherwise, finalize the whole graph m_status = m_sink->finalize(*m_reply.get()); - if (m_status != Status::Finished) + if (m_status != Job_Finished) { qDebug() << "Download failed to finalize:" << m_url.toString(); m_sink->abort(); m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } m_reply.reset(); qDebug() << "Download succeeded:" << m_url.toString(); - emit succeeded(); + emit succeeded(m_index_within_job); } void Download::downloadReadyRead() { - if(m_status == Status::InProgress) + if(m_status == Job_InProgress) { auto data = m_reply->readAll(); m_status = m_sink->write(data); - if(m_status == Status::Failed) + if(m_status == Job_Failed) { qCritical() << "Failed to process response chunk for " << m_target_path; } @@ -250,7 +234,7 @@ void Download::downloadReadyRead() } else { - qCritical() << "Cannot write to " << m_target_path << ", illegal status" << int(m_status); + qCritical() << "Cannot write to " << m_target_path << ", illegal status" << m_status; } } @@ -264,12 +248,12 @@ bool Net::Download::abort() } else { - m_status = Status::Aborted; + m_status = Job_Aborted; } return true; } -bool Net::Download::canAbort() const +bool Net::Download::canAbort() { return true; } diff --git a/api/logic/net/Download.h b/api/logic/net/Download.h index fdc83d5e..3347dc96 100644 --- a/api/logic/net/Download.h +++ b/api/logic/net/Download.h @@ -27,7 +27,7 @@ class MULTIMC_LOGIC_EXPORT Download : public NetAction Q_OBJECT public: /* types */ - typedef shared_qobject_ptr Ptr; + typedef std::shared_ptr Ptr; enum class Option { NoOptions = 0, @@ -50,10 +50,9 @@ public: /* methods */ } void addValidator(Validator * v); bool abort() override; - bool canAbort() const override; + bool canAbort() override; private: /* methods */ - QString getRedirect(); bool handleRedirect(); protected slots: @@ -63,7 +62,7 @@ protected slots: void downloadReadyRead() override; public slots: - void executeTask() override; + void start() override; private: /* data */ // FIXME: remove this, it has no business being here. diff --git a/api/logic/net/FileSink.cpp b/api/logic/net/FileSink.cpp index 83df6843..7dfc4336 100644 --- a/api/logic/net/FileSink.cpp +++ b/api/logic/net/FileSink.cpp @@ -17,10 +17,10 @@ FileSink::~FileSink() // nil }; -Task::Status FileSink::init(QNetworkRequest& request) +JobStatus FileSink::init(QNetworkRequest& request) { auto result = initCache(request); - if(result != Task::Status::InProgress) + if(result != Job_InProgress) { return result; } @@ -28,27 +28,27 @@ Task::Status FileSink::init(QNetworkRequest& request) if (!FS::ensureFilePathExists(m_filename)) { qCritical() << "Could not create folder for " + m_filename; - return Task::Status::Failed; + return Job_Failed; } wroteAnyData = false; m_output_file.reset(new QSaveFile(m_filename)); if (!m_output_file->open(QIODevice::WriteOnly)) { qCritical() << "Could not open " + m_filename + " for writing"; - return Task::Status::Failed; + return Job_Failed; } if(initAllValidators(request)) - return Task::Status::InProgress; - return Task::Status::Failed; + return Job_InProgress; + return Job_Failed; } -Task::Status FileSink::initCache(QNetworkRequest &) +JobStatus FileSink::initCache(QNetworkRequest &) { - return Task::Status::InProgress; + return Job_InProgress; } -Task::Status FileSink::write(QByteArray& data) +JobStatus FileSink::write(QByteArray& data) { if (!writeAllValidators(data) || m_output_file->write(data) != data.size()) { @@ -56,20 +56,20 @@ Task::Status FileSink::write(QByteArray& data) m_output_file->cancelWriting(); m_output_file.reset(); wroteAnyData = false; - return Task::Status::Failed; + return Job_Failed; } wroteAnyData = true; - return Task::Status::InProgress; + return Job_InProgress; } -Task::Status FileSink::abort() +JobStatus FileSink::abort() { m_output_file->cancelWriting(); failAllValidators(); - return Task::Status::Failed; + return Job_Failed; } -Task::Status FileSink::finalize(QNetworkReply& reply) +JobStatus FileSink::finalize(QNetworkReply& reply) { // if we wrote any data to the save file, we try to commit the data to the real file. if (wroteAnyData) @@ -77,13 +77,13 @@ Task::Status FileSink::finalize(QNetworkReply& reply) // ask validators for data consistency // we only do this for actual downloads, not 'your data is still the same' cache hits if(!finalizeAllValidators(reply)) - return Task::Status::Failed; + return Job_Failed; // nothing went wrong... if (!m_output_file->commit()) { qCritical() << "Failed to commit changes to " << m_filename; m_output_file->cancelWriting(); - return Task::Status::Failed; + return Job_Failed; } } // then get rid of the save file @@ -92,9 +92,9 @@ Task::Status FileSink::finalize(QNetworkReply& reply) return finalizeCache(reply); } -Task::Status FileSink::finalizeCache(QNetworkReply &) +JobStatus FileSink::finalizeCache(QNetworkReply &) { - return Task::Status::Finished; + return Job_Finished; } bool FileSink::hasLocalData() diff --git a/api/logic/net/FileSink.h b/api/logic/net/FileSink.h index a7528b5d..035d5bfd 100644 --- a/api/logic/net/FileSink.h +++ b/api/logic/net/FileSink.h @@ -10,15 +10,15 @@ public: /* con/des */ virtual ~FileSink(); public: /* methods */ - Task::Status init(QNetworkRequest & request) override; - Task::Status write(QByteArray & data) override; - Task::Status abort() override; - Task::Status finalize(QNetworkReply & reply) override; + JobStatus init(QNetworkRequest & request) override; + JobStatus write(QByteArray & data) override; + JobStatus abort() override; + JobStatus finalize(QNetworkReply & reply) override; bool hasLocalData() override; protected: /* methods */ - virtual Task::Status initCache(QNetworkRequest &); - virtual Task::Status finalizeCache(QNetworkReply &reply); + virtual JobStatus initCache(QNetworkRequest &); + virtual JobStatus finalizeCache(QNetworkReply &reply); protected: /* data */ QString m_filename; diff --git a/api/logic/net/MetaCacheSink.cpp b/api/logic/net/MetaCacheSink.cpp index 4fe4f3fb..c9d75310 100644 --- a/api/logic/net/MetaCacheSink.cpp +++ b/api/logic/net/MetaCacheSink.cpp @@ -17,11 +17,11 @@ MetaCacheSink::~MetaCacheSink() // nil }; -Task::Status MetaCacheSink::initCache(QNetworkRequest& request) +JobStatus MetaCacheSink::initCache(QNetworkRequest& request) { if (!m_entry->isStale()) { - return Task::Status::Finished; + return Job_Finished; } // check if file exists, if it does, use its information for the request QFile current(m_filename); @@ -36,10 +36,10 @@ Task::Status MetaCacheSink::initCache(QNetworkRequest& request) request.setRawHeader(QString("If-None-Match").toLatin1(), m_entry->getETag().toLatin1()); } } - return Task::Status::InProgress; + return Job_InProgress; } -Task::Status MetaCacheSink::finalizeCache(QNetworkReply & reply) +JobStatus MetaCacheSink::finalizeCache(QNetworkReply & reply) { QFileInfo output_file_info(m_filename); if(wroteAnyData) @@ -54,7 +54,7 @@ Task::Status MetaCacheSink::finalizeCache(QNetworkReply & reply) m_entry->setLocalChangedTimestamp(output_file_info.lastModified().toUTC().toMSecsSinceEpoch()); m_entry->setStale(false); ENV.metacache()->updateEntry(m_entry); - return Task::Status::Finished; + return Job_Finished; } bool MetaCacheSink::hasLocalData() diff --git a/api/logic/net/MetaCacheSink.h b/api/logic/net/MetaCacheSink.h index 8df03d06..0f3bbdf6 100644 --- a/api/logic/net/MetaCacheSink.h +++ b/api/logic/net/MetaCacheSink.h @@ -12,8 +12,8 @@ public: /* con/des */ bool hasLocalData() override; protected: /* methods */ - Task::Status initCache(QNetworkRequest & request) override; - Task::Status finalizeCache(QNetworkReply & reply) override; + JobStatus initCache(QNetworkRequest & request) override; + JobStatus finalizeCache(QNetworkReply & reply) override; private: /* data */ MetaEntryPtr m_entry; diff --git a/api/logic/net/NetAction.h b/api/logic/net/NetAction.h index 667484d1..a533c317 100644 --- a/api/logic/net/NetAction.h +++ b/api/logic/net/NetAction.h @@ -15,8 +15,6 @@ #pragma once -#include "tasks/Task.h" - #include #include #include @@ -25,29 +23,82 @@ #include "multimc_logic_export.h" -typedef shared_qobject_ptr NetActionPtr; -class MULTIMC_LOGIC_EXPORT NetAction : public Task +enum JobStatus +{ + Job_NotStarted, + Job_InProgress, + Job_Finished, + Job_Failed, + Job_Aborted, + Job_Failed_Proceed +}; + +typedef std::shared_ptr NetActionPtr; +class MULTIMC_LOGIC_EXPORT NetAction : public QObject { Q_OBJECT protected: - explicit NetAction(QObject *parent = 0) : Task(parent) {}; + explicit NetAction() : QObject(0) {}; public: virtual ~NetAction() {}; public: + virtual qint64 totalProgress() const + { + return m_total_progress; + } + virtual qint64 currentProgress() const + { + return m_progress; + } + virtual qint64 numberOfFailures() const + { + return m_failures; + } + virtual bool abort() + { + return false; + } + virtual bool canAbort() + { + return false; + } + +public: + /// the network reply unique_qobject_ptr m_reply; + + /// source URL QUrl m_url; - // FIXME: pull this up into Task - Status m_status = Status::NotStarted; + + /// The file's status + JobStatus m_status = Job_NotStarted; + + /// index within the parent job + int m_index_within_job = 0; + + qint64 m_progress = 0; + qint64 m_total_progress = 1; + + /// number of failures up to this point + int m_failures = 0; signals: - void failed(); - void aborted(); + void started(int index); + void netActionProgress(int index, qint64 current, qint64 total); + void succeeded(int index); + void failed(int index); + void aborted(int index); -protected slots: +protected +slots: virtual void downloadProgress(qint64 bytesReceived, qint64 bytesTotal) = 0; virtual void downloadError(QNetworkReply::NetworkError error) = 0; virtual void downloadFinished() = 0; virtual void downloadReadyRead() = 0; + +public +slots: + virtual void start() = 0; }; diff --git a/api/logic/net/NetJob.cpp b/api/logic/net/NetJob.cpp index ff2c711b..275da749 100644 --- a/api/logic/net/NetJob.cpp +++ b/api/logic/net/NetJob.cpp @@ -18,24 +18,22 @@ #include -void NetJob::partSucceeded() +void NetJob::partSucceeded(int index) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; // do progress. all slots are 1 in size at least - auto &slot = m_parts[index]; - setPartProgress(index, slot.total_progress, slot.total_progress); + auto &slot = parts_progress[index]; + partProgress(index, slot.total_progress, slot.total_progress); m_doing.remove(index); m_done.insert(index); - slot.download->disconnect(this); + downloads[index].get()->disconnect(this); startMoreParts(); } -void NetJob::partFailed() +void NetJob::partFailed(int index) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; m_doing.remove(index); - auto &slot = m_parts[index]; + auto &slot = parts_progress[index]; if (slot.failures == 3) { m_failed.insert(index); @@ -45,47 +43,38 @@ void NetJob::partFailed() slot.failures++; m_todo.enqueue(index); } - slot.download->disconnect(this); + downloads[index].get()->disconnect(this); startMoreParts(); } -void NetJob::partAborted() +void NetJob::partAborted(int index) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; m_aborted = true; m_doing.remove(index); - auto &slot = m_parts[index]; m_failed.insert(index); - slot.download->disconnect(this); + downloads[index].get()->disconnect(this); startMoreParts(); } -void NetJob::partProgress(qint64 bytesReceived, qint64 bytesTotal) +void NetJob::partProgress(int index, qint64 bytesReceived, qint64 bytesTotal) { - auto index = m_partsIndex[(NetAction *)QObject::sender()]; - setPartProgress(index, bytesReceived, bytesTotal); -} + auto &slot = parts_progress[index]; -void NetJob::setPartProgress(int index, qint64 bytesReceived, qint64 bytesTotal) -{ - auto &slot = m_parts[index]; + current_progress -= slot.current_progress; slot.current_progress = bytesReceived; + current_progress += slot.current_progress; + + total_progress -= slot.total_progress; slot.total_progress = bytesTotal; - qint64 current_progress = m_done.count() * 100; - qint64 total_progress = m_parts.count() * 100; - for(auto iter = m_doing.begin(); iter != m_doing.end(); iter++) - { - auto &part = m_parts[*iter]; - float percentage = (float(part.current_progress) / float(part.total_progress)) * 100.0f; - current_progress += (qint64) percentage; - } + total_progress += slot.total_progress; setProgress(current_progress, total_progress); } void NetJob::executeTask() { qDebug() << m_job_name.toLocal8Bit() << " started."; - for (int i = 0; i < m_parts.size(); i++) + m_running = true; + for (int i = 0; i < downloads.size(); i++) { m_todo.enqueue(i); } @@ -125,28 +114,24 @@ void NetJob::startMoreParts() return; int doThis = m_todo.dequeue(); m_doing.insert(doThis); - auto part = m_parts[doThis].download; + auto part = downloads[doThis]; // connect signals :D - connectAction(part.get()); + connect(part.get(), SIGNAL(succeeded(int)), SLOT(partSucceeded(int))); + connect(part.get(), SIGNAL(failed(int)), SLOT(partFailed(int))); + connect(part.get(), SIGNAL(aborted(int)), SLOT(partAborted(int))); + connect(part.get(), SIGNAL(netActionProgress(int, qint64, qint64)), + SLOT(partProgress(int, qint64, qint64))); part->start(); } } -void NetJob::connectAction(NetAction* action) -{ - connect(action, &NetAction::succeeded, this, &NetJob::partSucceeded); - connect(action, &NetAction::failed, this, &NetJob::partFailed); - connect(action, &NetAction::aborted, this, &NetJob::partAborted); - connect(action, &NetAction::progress, this, &NetJob::partProgress); -} - QStringList NetJob::getFailedFiles() { QStringList failed; for (auto index: m_failed) { - failed.push_back(m_parts[index].download->m_url.toString()); + failed.push_back(downloads[index]->m_url.toString()); } failed.sort(); return failed; @@ -158,13 +143,13 @@ bool NetJob::canAbort() const // can abort the waiting? for(auto index: m_todo) { - auto part = m_parts[index].download; + auto part = downloads[index]; canFullyAbort &= part->canAbort(); } // can abort the active? for(auto index: m_doing) { - auto part = m_parts[index].download; + auto part = downloads[index]; canFullyAbort &= part->canAbort(); } return canFullyAbort; @@ -180,26 +165,8 @@ bool NetJob::abort() auto toKill = m_doing.toList(); for(auto index: toKill) { - auto part = m_parts[index].download; + auto part = downloads[index]; fullyAborted &= part->abort(); } return fullyAborted; } - -void NetJob::addNetAction(NetActionPtr action) -{ - m_partsIndex[action.get()] = m_parts.count(); - part_info pi; - { - pi.current_progress = action->getProgress(); - pi.total_progress = action->getTotalProgress(); - pi.failures = 0; - pi.download = action; - } - m_parts.append(pi); - - if (isRunning()) - { - m_todo.enqueue(m_parts.size() - 1); - } -} diff --git a/api/logic/net/NetJob.h b/api/logic/net/NetJob.h index 5503cd24..ca4f5df1 100644 --- a/api/logic/net/NetJob.h +++ b/api/logic/net/NetJob.h @@ -32,12 +32,52 @@ class MULTIMC_LOGIC_EXPORT NetJob : public Task public: explicit NetJob(QString job_name) : Task(), m_job_name(job_name) {} virtual ~NetJob() {} + bool addNetAction(NetActionPtr action) + { + action->m_index_within_job = downloads.size(); + downloads.append(action); + part_info pi; + { + pi.current_progress = action->currentProgress(); + pi.total_progress = action->totalProgress(); + pi.failures = action->numberOfFailures(); + } + parts_progress.append(pi); + total_progress += pi.total_progress; + // if this is already running, the action needs to be started right away! + if (isRunning()) + { + setProgress(current_progress, total_progress); + connect(action.get(), SIGNAL(succeeded(int)), SLOT(partSucceeded(int))); + connect(action.get(), SIGNAL(failed(int)), SLOT(partFailed(int))); + connect(action.get(), SIGNAL(netActionProgress(int, qint64, qint64)), + SLOT(partProgress(int, qint64, qint64))); + action->start(); + } + return true; + } - void addNetAction(NetActionPtr action); - + NetActionPtr operator[](int index) + { + return downloads[index]; + } + const NetActionPtr at(const int index) + { + return downloads.at(index); + } + NetActionPtr first() + { + if (downloads.size()) + return downloads[0]; + return NetActionPtr(); + } int size() const { - return m_parts.size(); + return downloads.size(); + } + virtual bool isRunning() const override + { + return m_running; } QStringList getFailedFiles(); @@ -51,32 +91,28 @@ public slots: virtual bool abort() override; private slots: - void partProgress(qint64 bytesReceived, qint64 bytesTotal); - void partSucceeded(); - void partFailed(); - void partAborted(); - -private: - void setPartProgress(int index, qint64 bytesReceived, qint64 bytesTotal); - void connectAction(NetAction * action); + void partProgress(int index, qint64 bytesReceived, qint64 bytesTotal); + void partSucceeded(int index); + void partFailed(int index); + void partAborted(int index); private: struct part_info { - NetActionPtr download; qint64 current_progress = 0; qint64 total_progress = 1; int failures = 0; bool connected = false; }; QString m_job_name; - QVector m_parts; - QMap m_partsIndex; + QList downloads; + QList parts_progress; QQueue m_todo; QSet m_doing; QSet m_done; QSet m_failed; - //qint64 current_progress = 0; - //qint64 total_progress = 0; + qint64 current_progress = 0; + qint64 total_progress = 0; + bool m_running = false; bool m_aborted = false; }; diff --git a/api/logic/net/PasteUpload.cpp b/api/logic/net/PasteUpload.cpp index 17b59e6b..59779b2c 100644 --- a/api/logic/net/PasteUpload.cpp +++ b/api/logic/net/PasteUpload.cpp @@ -39,7 +39,7 @@ void PasteUpload::executeTask() QNetworkReply *rep = ENV.qnam().post(request, buf); m_reply = std::shared_ptr(rep); - setStatusText(tr("Uploading to paste.ee")); + setStatus(tr("Uploading to paste.ee")); connect(rep, &QNetworkReply::uploadProgress, this, &Task::setProgress); connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished())); diff --git a/api/logic/net/Sink.h b/api/logic/net/Sink.h index 28a54ef7..de9b1722 100644 --- a/api/logic/net/Sink.h +++ b/api/logic/net/Sink.h @@ -13,10 +13,10 @@ public: /* con/des */ virtual ~Sink() {}; public: /* methods */ - virtual Task::Status init(QNetworkRequest & request) = 0; - virtual Task::Status write(QByteArray & data) = 0; - virtual Task::Status abort() = 0; - virtual Task::Status finalize(QNetworkReply & reply) = 0; + virtual JobStatus init(QNetworkRequest & request) = 0; + virtual JobStatus write(QByteArray & data) = 0; + virtual JobStatus abort() = 0; + virtual JobStatus finalize(QNetworkReply & reply) = 0; virtual bool hasLocalData() = 0; void addValidator(Validator * validator) diff --git a/api/logic/notifications/NotificationChecker.cpp b/api/logic/notifications/NotificationChecker.cpp index ae5805bd..6d006c31 100644 --- a/api/logic/notifications/NotificationChecker.cpp +++ b/api/logic/notifications/NotificationChecker.cpp @@ -60,7 +60,7 @@ void NotificationChecker::checkForNotifications() m_checkJob->start(); } -void NotificationChecker::downloadSucceeded() +void NotificationChecker::downloadSucceeded(int) { m_entries.clear(); diff --git a/api/logic/notifications/NotificationChecker.h b/api/logic/notifications/NotificationChecker.h index ab3a79af..c8e831d5 100644 --- a/api/logic/notifications/NotificationChecker.h +++ b/api/logic/notifications/NotificationChecker.h @@ -43,7 +43,7 @@ slots: private slots: - void downloadSucceeded(); + void downloadSucceeded(int); signals: void notificationCheckFinished(); diff --git a/api/logic/screenshots/ImgurAlbumCreation.cpp b/api/logic/screenshots/ImgurAlbumCreation.cpp index 63179c6a..a6964681 100644 --- a/api/logic/screenshots/ImgurAlbumCreation.cpp +++ b/api/logic/screenshots/ImgurAlbumCreation.cpp @@ -13,12 +13,12 @@ ImgurAlbumCreation::ImgurAlbumCreation(QList screenshots) : NetAction(), m_screenshots(screenshots) { m_url = URLConstants::IMGUR_BASE_URL + "album.json"; - m_status = Status::NotStarted; + m_status = Job_NotStarted; } -void ImgurAlbumCreation::executeTask() +void ImgurAlbumCreation::start() { - m_status = Status::InProgress; + m_status = Job_InProgress; QNetworkRequest request(m_url); request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); @@ -43,11 +43,11 @@ void ImgurAlbumCreation::executeTask() void ImgurAlbumCreation::downloadError(QNetworkReply::NetworkError error) { qDebug() << m_reply->errorString(); - m_status = Status::Failed; + m_status = Job_Failed; } void ImgurAlbumCreation::downloadFinished() { - if (m_status != Status::Failed) + if (m_status != Job_Failed) { QByteArray data = m_reply->readAll(); m_reply.reset(); @@ -56,33 +56,33 @@ void ImgurAlbumCreation::downloadFinished() if (jsonError.error != QJsonParseError::NoError) { qDebug() << jsonError.errorString(); - emit failed(); + emit failed(m_index_within_job); return; } auto object = doc.object(); if (!object.value("success").toBool()) { qDebug() << doc.toJson(); - emit failed(); + emit failed(m_index_within_job); return; } m_deleteHash = object.value("data").toObject().value("deletehash").toString(); m_id = object.value("data").toObject().value("id").toString(); - m_status = Status::Finished; - emit succeeded(); + m_status = Job_Finished; + emit succeeded(m_index_within_job); return; } else { qDebug() << m_reply->readAll(); m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } } void ImgurAlbumCreation::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { - m_progressTotal = bytesTotal; + m_total_progress = bytesTotal; m_progress = bytesReceived; - emit progress(bytesReceived, bytesTotal); + emit netActionProgress(m_index_within_job, bytesReceived, bytesTotal); } diff --git a/api/logic/screenshots/ImgurAlbumCreation.h b/api/logic/screenshots/ImgurAlbumCreation.h index dd398491..469174e4 100644 --- a/api/logic/screenshots/ImgurAlbumCreation.h +++ b/api/logic/screenshots/ImgurAlbumCreation.h @@ -4,7 +4,7 @@ #include "multimc_logic_export.h" -typedef shared_qobject_ptr ImgurAlbumCreationPtr; +typedef std::shared_ptr ImgurAlbumCreationPtr; class MULTIMC_LOGIC_EXPORT ImgurAlbumCreation : public NetAction { public: @@ -34,7 +34,7 @@ slots: public slots: - virtual void executeTask(); + virtual void start(); private: QList m_screenshots; diff --git a/api/logic/screenshots/ImgurUpload.cpp b/api/logic/screenshots/ImgurUpload.cpp index 13c0c624..ef7fee6b 100644 --- a/api/logic/screenshots/ImgurUpload.cpp +++ b/api/logic/screenshots/ImgurUpload.cpp @@ -15,13 +15,13 @@ ImgurUpload::ImgurUpload(ScreenshotPtr shot) : NetAction(), m_shot(shot) { m_url = URLConstants::IMGUR_BASE_URL + "upload.json"; - m_status = Status::NotStarted; + m_status = Job_NotStarted; } -void ImgurUpload::executeTask() +void ImgurUpload::start() { finished = false; - m_status = Status::InProgress; + m_status = Job_InProgress; QNetworkRequest request(m_url); request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)"); request.setRawHeader("Authorization", "Client-ID 5b97b0713fba4a3"); @@ -30,7 +30,7 @@ void ImgurUpload::executeTask() QFile f(m_shot->m_file.absoluteFilePath()); if (!f.open(QFile::ReadOnly)) { - emit failed(); + emit failed(m_index_within_job); return; } @@ -65,10 +65,10 @@ void ImgurUpload::downloadError(QNetworkReply::NetworkError error) qCritical() << "Double finished ImgurUpload!"; return; } - m_status = Status::Failed; + m_status = Job_Failed; finished = true; m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); } void ImgurUpload::downloadFinished() { @@ -86,7 +86,7 @@ void ImgurUpload::downloadFinished() qDebug() << "imgur server did not reply with JSON" << jsonError.errorString(); finished = true; m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } auto object = doc.object(); @@ -95,19 +95,19 @@ void ImgurUpload::downloadFinished() qDebug() << "Screenshot upload not successful:" << doc.toJson(); finished = true; m_reply.reset(); - emit failed(); + emit failed(m_index_within_job); return; } m_shot->m_imgurId = object.value("data").toObject().value("id").toString(); m_shot->m_url = object.value("data").toObject().value("link").toString(); - m_status = Status::Finished; + m_status = Job_Finished; finished = true; - emit succeeded(); + emit succeeded(m_index_within_job); return; } void ImgurUpload::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { - m_progressTotal = bytesTotal; + m_total_progress = bytesTotal; m_progress = bytesReceived; - emit progress(bytesReceived, bytesTotal); + emit netActionProgress(m_index_within_job, bytesReceived, bytesTotal); } diff --git a/api/logic/screenshots/ImgurUpload.h b/api/logic/screenshots/ImgurUpload.h index fed650f0..0a766b8f 100644 --- a/api/logic/screenshots/ImgurUpload.h +++ b/api/logic/screenshots/ImgurUpload.h @@ -1,11 +1,10 @@ #pragma once #include "net/NetAction.h" #include "Screenshot.h" -#include "QObjectPtr.h" #include "multimc_logic_export.h" -typedef shared_qobject_ptr ImgurUploadPtr; +typedef std::shared_ptr ImgurUploadPtr; class MULTIMC_LOGIC_EXPORT ImgurUpload : public NetAction { public: @@ -26,7 +25,7 @@ slots: public slots: - virtual void executeTask(); + virtual void start(); private: ScreenshotPtr m_shot; diff --git a/api/logic/tasks/SequentialTask.cpp b/api/logic/tasks/SequentialTask.cpp index bcf69a0d..ac0e7820 100644 --- a/api/logic/tasks/SequentialTask.cpp +++ b/api/logic/tasks/SequentialTask.cpp @@ -42,7 +42,7 @@ void SequentialTask::subTaskFailed(const QString &msg) } void SequentialTask::subTaskStatus(const QString &msg) { - setStatusText(msg); + setStatus(msg); } void SequentialTask::subTaskProgress(qint64 current, qint64 total) { diff --git a/api/logic/tasks/Task.cpp b/api/logic/tasks/Task.cpp index 4e468b04..23ee08e4 100644 --- a/api/logic/tasks/Task.cpp +++ b/api/logic/tasks/Task.cpp @@ -21,12 +21,12 @@ Task::Task(QObject *parent) : QObject(parent) { } -void Task::setStatusText(const QString &new_status) +void Task::setStatus(const QString &new_status) { - if(m_statusText != new_status) + if(m_status != new_status) { - m_statusText = new_status; - emit status(m_statusText); + m_status = new_status; + emit status(m_status); } } diff --git a/api/logic/tasks/Task.h b/api/logic/tasks/Task.h index 17ea87f3..47c4a13e 100644 --- a/api/logic/tasks/Task.h +++ b/api/logic/tasks/Task.h @@ -23,16 +23,6 @@ class MULTIMC_LOGIC_EXPORT Task : public QObject { Q_OBJECT -public: - enum class Status - { - NotStarted, - InProgress, - Finished, - Failed, - Aborted, - Failed_Proceed - }; public: explicit Task(QObject *parent = 0); virtual ~Task() {}; @@ -53,22 +43,19 @@ public: */ virtual QString failReason() const; - virtual bool canAbort() const - { - return false; - } + virtual bool canAbort() const { return false; } - QString getStatusText() + QString getStatus() { - return m_statusText; + return m_status; } - virtual qint64 getProgress() + qint64 getProgress() { return m_progress; } - virtual qint64 getTotalProgress() + qint64 getTotalProgress() { return m_progressTotal; } @@ -81,12 +68,10 @@ signals: void failed(QString reason); void status(QString status); -public slots: +public +slots: virtual void start(); - virtual bool abort() - { - return false; - }; + virtual bool abort() { return false; }; protected: virtual void executeTask() = 0; @@ -96,18 +81,16 @@ protected slots: virtual void emitFailed(QString reason); public slots: - void setStatusText(const QString &status); + void setStatus(const QString &status); void setProgress(qint64 current, qint64 total); protected: - // FIXME: replace these with the m_status from NetAction bool m_running = false; bool m_finished = false; bool m_succeeded = false; QString m_failReason = ""; - QString m_statusText; - - qint64 m_progress = 0; - qint64 m_progressTotal = 1; + QString m_status; + int m_progress = 0; + int m_progressTotal = 100; }; diff --git a/api/logic/tasks/ThreadTask.cpp b/api/logic/tasks/ThreadTask.cpp index 6f9ce13e..ddd1dee5 100644 --- a/api/logic/tasks/ThreadTask.cpp +++ b/api/logic/tasks/ThreadTask.cpp @@ -32,7 +32,7 @@ void ThreadTask::iternal_started() void ThreadTask::iternal_status(QString status) { - setStatusText(status); + setStatus(status); } void ThreadTask::iternal_succeeded() diff --git a/api/logic/translations/TranslationsModel.cpp b/api/logic/translations/TranslationsModel.cpp index bbd4b47d..868aa98f 100644 --- a/api/logic/translations/TranslationsModel.cpp +++ b/api/logic/translations/TranslationsModel.cpp @@ -30,7 +30,7 @@ struct TranslationsModel::Private std::unique_ptr m_qt_translator; std::unique_ptr m_app_translator; - Net::Download::Ptr m_index_task; + std::shared_ptr m_index_task; QString m_downloadingTranslation; NetJobPtr m_dl_job; NetJobPtr m_index_job; diff --git a/api/logic/updater/DownloadTask.cpp b/api/logic/updater/DownloadTask.cpp index 0d364bfc..0d40f78a 100644 --- a/api/logic/updater/DownloadTask.cpp +++ b/api/logic/updater/DownloadTask.cpp @@ -26,7 +26,7 @@ namespace GoUpdate { -DownloadTask::DownloadTask(GoUpdate::Status status, QString target, QObject *parent) +DownloadTask::DownloadTask(Status status, QString target, QObject *parent) : Task(parent), m_updateFilesDir(target) { m_status = status; @@ -41,7 +41,7 @@ void DownloadTask::executeTask() void DownloadTask::loadVersionInfo() { - setStatusText(tr("Loading version information...")); + setStatus(tr("Loading version information...")); NetJob *netJob = new NetJob("Version Info"); @@ -70,7 +70,7 @@ void DownloadTask::vinfoDownloadFailed() { // Something failed. We really need the second download (current version info), so parse // downloads anyways as long as the first one succeeded. - if (m_newVersionFileListDownload->m_status != Status::Failed) + if (m_newVersionFileListDownload->m_status != Job_Failed) { processDownloadedVersionInfo(); return; @@ -86,7 +86,7 @@ void DownloadTask::processDownloadedVersionInfo() VersionFileList m_currentVersionFileList; VersionFileList m_newVersionFileList; - setStatusText(tr("Reading file list for new version...")); + setStatus(tr("Reading file list for new version...")); qDebug() << "Reading file list for new version..."; QString error; if (!parseVersionInfo(newVersionFileListData, m_newVersionFileList, error)) @@ -97,9 +97,9 @@ void DownloadTask::processDownloadedVersionInfo() } // if we have the current version info, use it. - if (m_currentVersionFileListDownload && m_currentVersionFileListDownload->m_status != Status::Failed) + if (m_currentVersionFileListDownload && m_currentVersionFileListDownload->m_status != Job_Failed) { - setStatusText(tr("Reading file list for current version...")); + setStatus(tr("Reading file list for current version...")); qDebug() << "Reading file list for current version..."; // if this fails, it's not a complete loss. QString error; @@ -114,7 +114,7 @@ void DownloadTask::processDownloadedVersionInfo() m_newVersionFileListDownload.reset(); m_vinfoNetJob.reset(); - setStatusText(tr("Processing file lists - figuring out how to install the update...")); + setStatus(tr("Processing file lists - figuring out how to install the update...")); // make a new netjob for the actual update files NetJobPtr netJob (new NetJob("Update Files")); @@ -131,7 +131,7 @@ void DownloadTask::processDownloadedVersionInfo() QObject::connect(netJob.get(), &NetJob::progress, this, &DownloadTask::fileDownloadProgressChanged); QObject::connect(netJob.get(), &NetJob::failed, this, &DownloadTask::fileDownloadFailed); - setStatusText(tr("Downloading %1 update files.").arg(QString::number(netJob->size()))); + setStatus(tr("Downloading %1 update files.").arg(QString::number(netJob->size()))); qDebug() << "Begin downloading update files to" << m_updateFilesDir.path(); m_filesNetJob = netJob; m_filesNetJob->start(); diff --git a/api/logic/updater/DownloadTask.h b/api/logic/updater/DownloadTask.h index c59b9b94..bcbe9736 100644 --- a/api/logic/updater/DownloadTask.h +++ b/api/logic/updater/DownloadTask.h @@ -37,7 +37,7 @@ public: * * target is a template - XXXXXX at the end will be replaced with a random generated string, ensuring uniqueness */ - explicit DownloadTask(GoUpdate::Status status, QString target, QObject* parent = 0); + explicit DownloadTask(Status status, QString target, QObject* parent = 0); /// Get the directory that will contain the update files. QString updateFilesDir(); @@ -71,7 +71,7 @@ protected: NetJobPtr m_filesNetJob; - GoUpdate::Status m_status; + Status m_status; OperationList m_operations; diff --git a/application/dialogs/ProgressDialog.cpp b/application/dialogs/ProgressDialog.cpp index 5888b959..db973c5a 100644 --- a/application/dialogs/ProgressDialog.cpp +++ b/application/dialogs/ProgressDialog.cpp @@ -87,7 +87,7 @@ int ProgressDialog::execWithTask(Task *task) if(task->isRunning()) { changeProgress(task->getProgress(), task->getTotalProgress()); - changeStatus(task->getStatusText()); + changeStatus(task->getStatus()); return QDialog::exec(); } else if(handleImmediateResult(result)) -- cgit v1.2.3