From e46aba9da584338db8d8a1a8a487bdcc6cf84343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 18 Mar 2017 02:22:36 +0100 Subject: [PATCH] NOISSUE sanitize loading and downloading of metadata files --- api/logic/CMakeLists.txt | 10 +- api/logic/meta/BaseEntity.cpp | 119 ++++++++++++++++-- api/logic/meta/BaseEntity.h | 45 +++++-- api/logic/meta/Index.cpp | 13 +- api/logic/meta/Index.h | 7 -- api/logic/meta/Index_test.cpp | 6 - .../{format/Format.cpp => JsonFormat.cpp} | 15 +-- .../meta/{format/Format.h => JsonFormat.h} | 0 api/logic/meta/Util.cpp | 50 -------- api/logic/meta/Util.h | 28 ----- api/logic/meta/Version.cpp | 13 +- api/logic/meta/Version.h | 2 - api/logic/meta/VersionList.cpp | 70 +---------- api/logic/meta/VersionList.h | 3 - api/logic/meta/tasks/LocalLoadTask.cpp | 57 --------- api/logic/meta/tasks/LocalLoadTask.h | 39 ------ api/logic/meta/tasks/RemoteLoadTask.cpp | 103 --------------- api/logic/meta/tasks/RemoteLoadTask.h | 46 ------- application/MainWindow.cpp | 15 +-- application/pages/global/PackagesPage.cpp | 33 +---- 20 files changed, 164 insertions(+), 510 deletions(-) rename api/logic/meta/{format/Format.cpp => JsonFormat.cpp} (95%) rename api/logic/meta/{format/Format.h => JsonFormat.h} (100%) delete mode 100644 api/logic/meta/Util.cpp delete mode 100644 api/logic/meta/Util.h delete mode 100644 api/logic/meta/tasks/LocalLoadTask.cpp delete mode 100644 api/logic/meta/tasks/LocalLoadTask.h delete mode 100644 api/logic/meta/tasks/RemoteLoadTask.cpp delete mode 100644 api/logic/meta/tasks/RemoteLoadTask.h diff --git a/api/logic/CMakeLists.txt b/api/logic/CMakeLists.txt index 42754157..544ace80 100644 --- a/api/logic/CMakeLists.txt +++ b/api/logic/CMakeLists.txt @@ -416,12 +416,8 @@ set(TOOLS_SOURCES set(META_SOURCES # Metadata sources - meta/tasks/RemoteLoadTask.cpp - meta/tasks/RemoteLoadTask.h - meta/tasks/LocalLoadTask.cpp - meta/tasks/LocalLoadTask.h - meta/format/Format.cpp - meta/format/Format.h + meta/JsonFormat.cpp + meta/JsonFormat.h meta/BaseEntity.cpp meta/BaseEntity.h meta/VersionList.cpp @@ -430,8 +426,6 @@ set(META_SOURCES meta/Version.h meta/Index.cpp meta/Index.h - meta/Util.cpp - meta/Util.h meta/Reference.cpp meta/Reference.h ) diff --git a/api/logic/meta/BaseEntity.cpp b/api/logic/meta/BaseEntity.cpp index 87cd55c8..18b7f92f 100644 --- a/api/logic/meta/BaseEntity.cpp +++ b/api/logic/meta/BaseEntity.cpp @@ -16,26 +16,125 @@ #include "BaseEntity.h" #include "Json.h" -#include "Util.h" -namespace Meta +#include "net/Download.h" +#include "net/HttpMetaCache.h" +#include "net/NetJob.h" + +#include "Env.h" +#include "Json.h" + +class ParsingValidator : public Net::Validator { -BaseEntity::~BaseEntity() +public: /* con/des */ + ParsingValidator(Meta::BaseEntity *entity) : m_entity(entity) + { + }; + virtual ~ParsingValidator() + { + }; + +public: /* methods */ + bool init(QNetworkRequest &) override + { + return true; + } + bool write(QByteArray & data) override + { + this->data.append(data); + return true; + } + bool abort() override + { + return true; + } + bool validate(QNetworkReply &) override + { + auto fname = m_entity->localFilename(); + try + { + m_entity->parse(Json::requireObject(Json::requireDocument(data, fname), fname)); + return true; + } + catch (Exception &e) + { + qWarning() << "Unable to parse response:" << e.cause(); + return false; + } + } + +private: /* data */ + QByteArray data; + Meta::BaseEntity *m_entity; +}; + +Meta::BaseEntity::~BaseEntity() { } -QUrl BaseEntity::url() const +QUrl Meta::BaseEntity::url() const { - return rootUrl().resolved(localFilename()); + return QUrl("https://meta.multimc.org").resolved(localFilename()); } -void BaseEntity::notifyLocalLoadComplete() +bool Meta::BaseEntity::loadLocalFile() { - m_localLoaded = true; + const QString fname = QDir("meta").absoluteFilePath(localFilename()); + if (!QFile::exists(fname)) + { + return false; + } + // TODO: check if the file has the expected checksum + try + { + parse(Json::requireObject(Json::requireDocument(fname, fname), fname)); + return true; + } + catch (Exception &e) + { + qDebug() << QString("Unable to parse file %1: %2").arg(fname, e.cause()); + // just make sure it's gone and we never consider it again. + QFile::remove(fname); + return false; + } } -void BaseEntity::notifyRemoteLoadComplete() +void Meta::BaseEntity::load() { - m_remoteLoaded = true; -} + if(!isLoaded()) + { + loadLocalFile(); + } + if(!shouldStartRemoteUpdate()) + { + return; + } + NetJob *job = new NetJob(QObject::tr("Download of meta file %1").arg(localFilename())); + + auto url = this->url(); + auto entry = ENV.metacache()->resolveEntry("meta", localFilename()); + entry->setStale(true); + auto dl = Net::Download::makeCached(url, entry); + /* + * The validator parses the file and loads it into the object. + * If that fails, the file is not written to storage. + */ + dl->addValidator(new ParsingValidator(this)); + job->addNetAction(dl); + m_updateStatus = UpdateStatus::InProgress; + m_updateTask.reset(job); + QObject::connect(job, &NetJob::succeeded, [&]() + { + m_loadStatus = LoadStatus::Remote; + m_updateStatus = UpdateStatus::Succeeded; + m_updateTask.reset(); + }); + QObject::connect(job, &NetJob::failed, [&]() + { + m_updateStatus = UpdateStatus::Failed; + m_updateTask.reset(); + }); + m_updateTask->start(); } + +#include "BaseEntity.moc" diff --git a/api/logic/meta/BaseEntity.h b/api/logic/meta/BaseEntity.h index 7064e9d2..92a39272 100644 --- a/api/logic/meta/BaseEntity.h +++ b/api/logic/meta/BaseEntity.h @@ -15,9 +15,9 @@ #pragma once -#include -#include #include +#include +#include "QObjectPtr.h" #include "multimc_logic_export.h" @@ -26,29 +26,48 @@ namespace Meta { class MULTIMC_LOGIC_EXPORT BaseEntity { +public: /* types */ + using Ptr = std::shared_ptr; + enum class LoadStatus + { + NotLoaded, + Local, + Remote + }; + enum class UpdateStatus + { + NotDone, + InProgress, + Failed, + Succeeded + }; + public: virtual ~BaseEntity(); - using Ptr = std::shared_ptr; - - virtual std::unique_ptr remoteUpdateTask() = 0; - virtual std::unique_ptr localUpdateTask() = 0; virtual void merge(const std::shared_ptr &other) = 0; virtual void parse(const QJsonObject &obj) = 0; virtual QString localFilename() const = 0; virtual QUrl url() const; - bool isComplete() const { return m_localLoaded || m_remoteLoaded; } + bool isLoaded() const + { + return m_loadStatus > LoadStatus::NotLoaded; + } + bool shouldStartRemoteUpdate() const + { + return m_updateStatus == UpdateStatus::NotDone; + } - bool isLocalLoaded() const { return m_localLoaded; } - bool isRemoteLoaded() const { return m_remoteLoaded; } + void load(); - void notifyLocalLoadComplete(); - void notifyRemoteLoadComplete(); +protected: /* methods */ + bool loadLocalFile(); private: - bool m_localLoaded = false; - bool m_remoteLoaded = false; + LoadStatus m_loadStatus = LoadStatus::NotLoaded; + UpdateStatus m_updateStatus = UpdateStatus::NotDone; + shared_qobject_ptr m_updateTask; }; } diff --git a/api/logic/meta/Index.cpp b/api/logic/meta/Index.cpp index e0e8bc5d..35b9fb6f 100644 --- a/api/logic/meta/Index.cpp +++ b/api/logic/meta/Index.cpp @@ -16,9 +16,7 @@ #include "Index.h" #include "VersionList.h" -#include "tasks/LocalLoadTask.h" -#include "tasks/RemoteLoadTask.h" -#include "format/Format.h" +#include "JsonFormat.h" namespace Meta { @@ -78,15 +76,6 @@ QVariant Index::headerData(int section, Qt::Orientation orientation, int role) c } } -std::unique_ptr Index::remoteUpdateTask() -{ - return std::unique_ptr(new RemoteLoadTask(this)); -} -std::unique_ptr Index::localUpdateTask() -{ - return std::unique_ptr(new LocalLoadTask(this)); -} - bool Index::hasUid(const QString &uid) const { return m_uids.contains(uid); diff --git a/api/logic/meta/Index.h b/api/logic/meta/Index.h index 37341656..544a8b96 100644 --- a/api/logic/meta/Index.h +++ b/api/logic/meta/Index.h @@ -48,19 +48,12 @@ public: int columnCount(const QModelIndex &parent) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - std::unique_ptr remoteUpdateTask() override; - std::unique_ptr localUpdateTask() override; - QString localFilename() const override { return "index.json"; } // queries VersionListPtr get(const QString &uid); VersionPtr get(const QString &uid, const QString &version); bool hasUid(const QString &uid) const; - /* - VersionListPtr getList(const QString &uid) const; - VersionListPtr getListGuaranteed(const QString &uid) const; - */ QVector lists() const { return m_lists; } diff --git a/api/logic/meta/Index_test.cpp b/api/logic/meta/Index_test.cpp index b4dbd009..d4343c37 100644 --- a/api/logic/meta/Index_test.cpp +++ b/api/logic/meta/Index_test.cpp @@ -16,12 +16,6 @@ slots: QCOMPARE(ENV.metadataIndex(), ENV.metadataIndex()); } - void test_providesTasks() - { - QVERIFY(ENV.metadataIndex()->localUpdateTask() != nullptr); - QVERIFY(ENV.metadataIndex()->remoteUpdateTask() != nullptr); - } - void test_hasUid_and_getList() { Meta::Index windex({std::make_shared("list1"), std::make_shared("list2"), std::make_shared("list3")}); diff --git a/api/logic/meta/format/Format.cpp b/api/logic/meta/JsonFormat.cpp similarity index 95% rename from api/logic/meta/format/Format.cpp rename to api/logic/meta/JsonFormat.cpp index 39d3f14f..4e43b715 100644 --- a/api/logic/meta/format/Format.cpp +++ b/api/logic/meta/JsonFormat.cpp @@ -13,15 +13,16 @@ * limitations under the License. */ -#include "Format.h" - -#include "minecraft/onesix/OneSixVersionFormat.h"" - -#include "meta/Index.h" -#include "meta/Version.h" -#include "meta/VersionList.h" +#include "JsonFormat.h" +// FIXME: remove this from here... somehow +#include "minecraft/onesix/OneSixVersionFormat.h" #include "Json.h" + +#include "Index.h" +#include "Version.h" +#include "VersionList.h" + using namespace Json; namespace Meta diff --git a/api/logic/meta/format/Format.h b/api/logic/meta/JsonFormat.h similarity index 100% rename from api/logic/meta/format/Format.h rename to api/logic/meta/JsonFormat.h diff --git a/api/logic/meta/Util.cpp b/api/logic/meta/Util.cpp deleted file mode 100644 index 76941f83..00000000 --- a/api/logic/meta/Util.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright 2015-2017 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Util.h" - -#include -#include - -#include "Env.h" - -namespace Meta -{ -QUrl rootUrl() -{ - return QUrl("https://meta.multimc.org"); -} - -QUrl indexUrl() -{ - return rootUrl().resolved(QStringLiteral("index.json")); -} - -QUrl versionListUrl(const QString &uid) -{ - return rootUrl().resolved(uid + "/index.json"); -} - -QUrl versionUrl(const QString &uid, const QString &version) -{ - return rootUrl().resolved(uid + "/" + version + ".json"); -} - -QDir localDir() -{ - return QDir("meta"); -} - -} diff --git a/api/logic/meta/Util.h b/api/logic/meta/Util.h deleted file mode 100644 index 188bcaa3..00000000 --- a/api/logic/meta/Util.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright 2015-2017 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "multimc_logic_export.h" - -class QUrl; -class QString; -class QDir; - -namespace Meta -{ -MULTIMC_LOGIC_EXPORT QUrl rootUrl(); -MULTIMC_LOGIC_EXPORT QDir localDir(); -} diff --git a/api/logic/meta/Version.cpp b/api/logic/meta/Version.cpp index b79c178a..f8c865e7 100644 --- a/api/logic/meta/Version.cpp +++ b/api/logic/meta/Version.cpp @@ -17,9 +17,7 @@ #include -#include "tasks/LocalLoadTask.h" -#include "tasks/RemoteLoadTask.h" -#include "format/Format.h" +#include "JsonFormat.h" namespace Meta { @@ -46,15 +44,6 @@ QDateTime Version::time() const return QDateTime::fromMSecsSinceEpoch(m_time * 1000, Qt::UTC); } -std::unique_ptr Version::remoteUpdateTask() -{ - return std::unique_ptr(new RemoteLoadTask(this)); -} -std::unique_ptr Version::localUpdateTask() -{ - return std::unique_ptr(new LocalLoadTask(this)); -} - void Version::parse(const QJsonObject& obj) { parseVersion(obj, this); diff --git a/api/logic/meta/Version.h b/api/logic/meta/Version.h index 635b79f6..0be2d94a 100644 --- a/api/logic/meta/Version.h +++ b/api/logic/meta/Version.h @@ -56,8 +56,6 @@ public: QVector requires() const { return m_requires; } VersionFilePtr data() const { return m_data; } - std::unique_ptr remoteUpdateTask() override; - std::unique_ptr localUpdateTask() override; void merge(const std::shared_ptr &other) override; void parse(const QJsonObject &obj) override; diff --git a/api/logic/meta/VersionList.cpp b/api/logic/meta/VersionList.cpp index 7196d4be..a12f5418 100644 --- a/api/logic/meta/VersionList.cpp +++ b/api/logic/meta/VersionList.cpp @@ -18,64 +18,11 @@ #include #include "Version.h" -#include "tasks/RemoteLoadTask.h" -#include "tasks/LocalLoadTask.h" -#include "format/Format.h" +#include "JsonFormat.h" #include "Reference.h" namespace Meta { - -class WVLLoadTask : public Task -{ - Q_OBJECT -public: - explicit WVLLoadTask(VersionList *list, QObject *parent = nullptr) - : Task(parent), m_list(list) - { - } - - bool canAbort() const override - { - return !m_currentTask || m_currentTask->canAbort(); - } - bool abort() override - { - return m_currentTask->abort(); - } - -private: - void executeTask() override - { - if (!m_list->isLocalLoaded()) - { - m_currentTask = m_list->localUpdateTask(); - connect(m_currentTask.get(), &Task::succeeded, this, &WVLLoadTask::next); - } - else - { - m_currentTask = m_list->remoteUpdateTask(); - connect(m_currentTask.get(), &Task::succeeded, this, &WVLLoadTask::emitSucceeded); - } - connect(m_currentTask.get(), &Task::status, this, &WVLLoadTask::setStatus); - connect(m_currentTask.get(), &Task::progress, this, &WVLLoadTask::setProgress); - connect(m_currentTask.get(), &Task::failed, this, &WVLLoadTask::emitFailed); - m_currentTask->start(); - } - - void next() - { - m_currentTask = m_list->remoteUpdateTask(); - connect(m_currentTask.get(), &Task::status, this, &WVLLoadTask::setStatus); - connect(m_currentTask.get(), &Task::progress, this, &WVLLoadTask::setProgress); - connect(m_currentTask.get(), &Task::succeeded, this, &WVLLoadTask::emitSucceeded); - m_currentTask->start(); - } - - VersionList *m_list; - std::unique_ptr m_currentTask; -}; - VersionList::VersionList(const QString &uid, QObject *parent) : BaseVersionList(parent), m_uid(uid) { @@ -84,12 +31,13 @@ VersionList::VersionList(const QString &uid, QObject *parent) Task *VersionList::getLoadTask() { - return new WVLLoadTask(this); + // TODO: create a wrapper task that will chain from root to here. + return nullptr; } bool VersionList::isLoaded() { - return isLocalLoaded() && isRemoteLoaded(); + return isLoaded(); } const BaseVersionPtr VersionList::at(int i) const @@ -167,15 +115,6 @@ QHash VersionList::roleNames() const return roles; } -std::unique_ptr VersionList::remoteUpdateTask() -{ - return std::unique_ptr(new RemoteLoadTask(this)); -} -std::unique_ptr VersionList::localUpdateTask() -{ - return std::unique_ptr(new LocalLoadTask(this)); -} - QString VersionList::localFilename() const { return m_uid + "/index.json"; @@ -200,6 +139,7 @@ void VersionList::setName(const QString &name) m_name = name; emit nameChanged(name); } + void VersionList::setVersions(const QVector &versions) { beginResetModel(); diff --git a/api/logic/meta/VersionList.h b/api/logic/meta/VersionList.h index 934b20e4..e958475e 100644 --- a/api/logic/meta/VersionList.h +++ b/api/logic/meta/VersionList.h @@ -54,9 +54,6 @@ public: RoleList providesRoles() const override; QHash roleNames() const override; - std::unique_ptr remoteUpdateTask() override; - std::unique_ptr localUpdateTask() override; - QString localFilename() const override; QString uid() const { return m_uid; } diff --git a/api/logic/meta/tasks/LocalLoadTask.cpp b/api/logic/meta/tasks/LocalLoadTask.cpp deleted file mode 100644 index b64fc5d3..00000000 --- a/api/logic/meta/tasks/LocalLoadTask.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright 2015-2017 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "LocalLoadTask.h" - -#include - -#include "meta/format/Format.h" -#include "meta/Util.h" -#include "meta/Index.h" -#include "meta/Version.h" -#include "meta/VersionList.h" -#include "Env.h" -#include "Json.h" - -namespace Meta -{ -LocalLoadTask::LocalLoadTask(BaseEntity *entity, QObject *parent) - : Task(parent), m_entity(entity) -{ -} - -void LocalLoadTask::executeTask() -{ - const QString fname = Meta::localDir().absoluteFilePath(m_entity->localFilename()); - if (!QFile::exists(fname)) - { - emitFailed(tr("File doesn't exist")); - return; - } - setStatus(tr("Reading %1...").arg(fname)); - setProgress(0, 0); - - try - { - m_entity->parse(Json::requireObject(Json::requireDocument(fname, fname), fname)); - m_entity->notifyLocalLoadComplete(); - emitSucceeded(); - } - catch (Exception &e) - { - emitFailed(tr("Unable to parse file %1: %2").arg(fname, e.cause())); - } -} -} diff --git a/api/logic/meta/tasks/LocalLoadTask.h b/api/logic/meta/tasks/LocalLoadTask.h deleted file mode 100644 index 905660ed..00000000 --- a/api/logic/meta/tasks/LocalLoadTask.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright 2015-2017 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "tasks/Task.h" -#include - -namespace Meta -{ -class BaseEntity; -class Index; -class VersionList; -class Version; - -// FIXME: this is now just an odd function, get rid of it -class LocalLoadTask : public Task -{ - Q_OBJECT -public: - explicit LocalLoadTask(BaseEntity *entity, QObject *parent = nullptr); - -private: - void executeTask() override; - BaseEntity *m_entity; -}; -} diff --git a/api/logic/meta/tasks/RemoteLoadTask.cpp b/api/logic/meta/tasks/RemoteLoadTask.cpp deleted file mode 100644 index b73af021..00000000 --- a/api/logic/meta/tasks/RemoteLoadTask.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright 2015-2017 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "RemoteLoadTask.h" - -#include "net/Download.h" -#include "net/HttpMetaCache.h" -#include "net/NetJob.h" -#include "meta/format/Format.h" -#include "meta/Util.h" -#include "meta/Index.h" -#include "meta/Version.h" -#include "meta/VersionList.h" -#include "Env.h" -#include "Json.h" - -namespace Meta -{ - -RemoteLoadTask::RemoteLoadTask(BaseEntity *entity, QObject *parent) - : Task(parent), m_entity(entity) -{ -} - -class ParsingValidator : public Net::Validator -{ -public: /* con/des */ - ParsingValidator(BaseEntity *entity) : m_entity(entity) - { - }; - virtual ~ParsingValidator() - { - }; - -public: /* methods */ - bool init(QNetworkRequest &) override - { - return true; - } - bool write(QByteArray & data) override - { - this->data.append(data); - return true; - } - bool abort() override - { - return true; - } - bool validate(QNetworkReply &) override - { - auto fname = m_entity->localFilename(); - try - { - m_entity->parse(Json::requireObject(Json::requireDocument(data, fname), fname)); - m_entity->notifyRemoteLoadComplete(); - return true; - } - catch (Exception &e) - { - qWarning() << "Unable to parse response:" << e.cause(); - return false; - } - } - -private: /* data */ - QByteArray data; - BaseEntity *m_entity; -}; - -void RemoteLoadTask::executeTask() -{ - // FIXME: leak here!!! - NetJob *job = new NetJob(tr("Download of meta file %1").arg(m_entity->localFilename())); - - auto url = m_entity->url(); - auto entry = ENV.metacache()->resolveEntry("meta", m_entity->localFilename()); - entry->setStale(true); - m_dl = Net::Download::makeCached(url, entry); - /* - * The validator parses the file and loads it into the object. - * If that fails, the file is not written to storage. - */ - m_dl->addValidator(new ParsingValidator(m_entity)); - job->addNetAction(m_dl); - connect(job, &NetJob::failed, this, &RemoteLoadTask::emitFailed); - connect(job, &NetJob::succeeded, this, &RemoteLoadTask::succeeded); - connect(job, &NetJob::status, this, &RemoteLoadTask::setStatus); - connect(job, &NetJob::progress, this, &RemoteLoadTask::setProgress); - job->start(); -} -} diff --git a/api/logic/meta/tasks/RemoteLoadTask.h b/api/logic/meta/tasks/RemoteLoadTask.h deleted file mode 100644 index 6d81d8ea..00000000 --- a/api/logic/meta/tasks/RemoteLoadTask.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright 2015-2017 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "tasks/Task.h" -#include - -namespace Net -{ -class Download; -} - -namespace Meta -{ -class BaseEntity; -class Index; -class VersionList; -class Version; - -// FIXME: this is now just an oddly constructed NetJob, get rid of it. -class RemoteLoadTask : public Task -{ - Q_OBJECT -public: - explicit RemoteLoadTask(BaseEntity *entity, QObject *parent = nullptr); - -private: - void executeTask() override; - - BaseEntity *m_entity; - std::shared_ptr m_dl; -}; -} diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 9073c006..e0870d06 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -554,21 +554,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow job->start(); } - // run the things that load and download other things... FIXME: this is NOT the place - // FIXME: invisible actions in the background = NOPE. + // load the news { - /* - if (!MMC->minecraftlist()->isLoaded()) - { - m_versionLoadTask = MMC->minecraftlist()->getLoadTask(); - startTask(m_versionLoadTask); - } - if (!MMC->lwjgllist()->isLoaded()) - { - MMC->lwjgllist()->loadList(); - } - */ - m_newsChecker->reloadNews(); updateNewsLabel(); } diff --git a/application/pages/global/PackagesPage.cpp b/application/pages/global/PackagesPage.cpp index 81ad4da1..e4967532 100644 --- a/application/pages/global/PackagesPage.cpp +++ b/application/pages/global/PackagesPage.cpp @@ -97,7 +97,7 @@ QIcon PackagesPage::icon() const void PackagesPage::on_refreshIndexBtn_clicked() { - ProgressDialog(this).execWithTask(ENV.metadataIndex()->remoteUpdateTask()); + ENV.metadataIndex()->load(); } void PackagesPage::on_refreshFileBtn_clicked() { @@ -106,7 +106,7 @@ void PackagesPage::on_refreshFileBtn_clicked() { return; } - ProgressDialog(this).execWithTask(list->remoteUpdateTask()); + list->load(); } void PackagesPage::on_refreshVersionBtn_clicked() { @@ -115,7 +115,7 @@ void PackagesPage::on_refreshVersionBtn_clicked() { return; } - ProgressDialog(this).execWithTask(version->remoteUpdateTask()); + version->load(); } void PackagesPage::on_fileSearchEdit_textChanged(const QString &search) @@ -158,19 +158,7 @@ void PackagesPage::updateCurrentVersionList(const QModelIndex &index) ui->fileName->setText(list->name()); m_versionProxy->setSourceModel(list.get()); ui->refreshFileBtn->setText(tr("Refresh %1").arg(list->humanReadable())); - - if (!list->isLocalLoaded()) - { - std::unique_ptr task = list->localUpdateTask(); - connect(task.get(), &Task::finished, this, [this, list]() - { - if (list->count() == 0 && !list->isRemoteLoaded()) - { - ProgressDialog(this).execWithTask(list->remoteUpdateTask()); - } - }); - ProgressDialog(this).execWithTask(task); - } + list->load(); } else { @@ -227,16 +215,5 @@ void PackagesPage::updateVersion() void PackagesPage::opened() { - if (!ENV.metadataIndex()->isLocalLoaded()) - { - std::unique_ptr task = ENV.metadataIndex()->localUpdateTask(); - connect(task.get(), &Task::finished, this, [this]() - { - if (!ENV.metadataIndex()->isRemoteLoaded()) - { - ProgressDialog(this).execWithTask(ENV.metadataIndex()->remoteUpdateTask()); - } - }); - ProgressDialog(this).execWithTask(task); - } + ENV.metadataIndex()->load(); }