diff options
Diffstat (limited to 'api/logic/tasks')
-rw-r--r-- | api/logic/tasks/Task.cpp | 68 | ||||
-rw-r--r-- | api/logic/tasks/Task.h | 32 | ||||
-rw-r--r-- | api/logic/tasks/ThreadTask.cpp | 41 | ||||
-rw-r--r-- | api/logic/tasks/ThreadTask.h | 26 |
4 files changed, 81 insertions, 86 deletions
diff --git a/api/logic/tasks/Task.cpp b/api/logic/tasks/Task.cpp index 23ee08e4..2523aeb2 100644 --- a/api/logic/tasks/Task.cpp +++ b/api/logic/tasks/Task.cpp @@ -1,4 +1,4 @@ -/* Copyright 2013-2017 MultiMC Contributors +/* Copyright 2013-2018 MultiMC Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,31 +41,79 @@ void Task::start() { m_running = true; emit started(); + qDebug() << "Task" << describe() << "started"; executeTask(); } void Task::emitFailed(QString reason) { + // Don't fail twice. + if (!m_running) + { + qCritical() << "Task" << describe() << "failed while not running!!!!: " << reason; + return; + } m_running = false; m_finished = true; m_succeeded = false; m_failReason = reason; - qCritical() << "Task failed: " << reason; + qCritical() << "Task" << describe() << "failed: " << reason; emit failed(reason); emit finished(); } +void Task::emitAborted() +{ + // Don't abort twice. + if (!m_running) + { + qCritical() << "Task" << describe() << "aborted while not running!!!!"; + return; + } + m_running = false; + m_finished = true; + m_succeeded = false; + m_failReason = "Aborted."; + qDebug() << "Task" << describe() << "aborted."; + emit failed(m_failReason); + emit finished(); +} + void Task::emitSucceeded() { - if (!m_running) { return; } // Don't succeed twice. + // Don't succeed twice. + if (!m_running) + { + qCritical() << "Task" << describe() << "succeeded while not running!!!!"; + return; + } m_running = false; m_finished = true; m_succeeded = true; - qDebug() << "Task succeeded"; + qDebug() << "Task" << describe() << "succeeded"; emit succeeded(); emit finished(); } +QString Task::describe() +{ + QString outStr; + QTextStream out(&outStr); + out << metaObject()->className() << QChar('('); + auto name = objectName(); + if(name.isEmpty()) + { + out << QString("0x%1").arg((quintptr)this, 0, 16); + } + else + { + out << name; + } + out << QChar(')'); + out.flush(); + return outStr; +} + bool Task::isRunning() const { return m_running; @@ -76,7 +124,7 @@ bool Task::isFinished() const return m_finished; } -bool Task::successful() const +bool Task::wasSuccessful() const { return m_succeeded; } @@ -86,3 +134,13 @@ QString Task::failReason() const return m_failReason; } +void Task::logWarning(const QString& line) +{ + qWarning() << line; + m_Warnings.append(line); +} + +QStringList Task::warnings() const +{ + return m_Warnings; +} diff --git a/api/logic/tasks/Task.h b/api/logic/tasks/Task.h index 47c4a13e..643f8510 100644 --- a/api/logic/tasks/Task.h +++ b/api/logic/tasks/Task.h @@ -1,4 +1,4 @@ -/* Copyright 2013-2017 MultiMC Contributors +/* Copyright 2013-2018 MultiMC Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ #include <QObject> #include <QString> +#include <QStringList> #include "multimc_logic_export.h" @@ -27,21 +28,17 @@ public: explicit Task(QObject *parent = 0); virtual ~Task() {}; - virtual bool isRunning() const; - - virtual bool isFinished() const; - - /*! - * True if this task was successful. - * If the task failed or is still running, returns false. - */ - virtual bool successful() const; + bool isRunning() const; + bool isFinished() const; + bool wasSuccessful() const; /*! * Returns the string that was passed to emitFailed as the error message when the task failed. * If the task hasn't failed, returns an empty string. */ - virtual QString failReason() const; + QString failReason() const; + + virtual QStringList warnings() const; virtual bool canAbort() const { return false; } @@ -60,6 +57,12 @@ public: return m_progressTotal; } +protected: + void logWarning(const QString & line); + +private: + QString describe(); + signals: void started(); void progress(qint64 current, qint64 total); @@ -68,8 +71,7 @@ signals: void failed(QString reason); void status(QString status); -public -slots: +public slots: virtual void start(); virtual bool abort() { return false; }; @@ -78,16 +80,18 @@ protected: protected slots: virtual void emitSucceeded(); + virtual void emitAborted(); virtual void emitFailed(QString reason); public slots: void setStatus(const QString &status); void setProgress(qint64 current, qint64 total); -protected: +private: bool m_running = false; bool m_finished = false; bool m_succeeded = false; + QStringList m_Warnings; QString m_failReason = ""; QString m_status; int m_progress = 0; diff --git a/api/logic/tasks/ThreadTask.cpp b/api/logic/tasks/ThreadTask.cpp deleted file mode 100644 index ddd1dee5..00000000 --- a/api/logic/tasks/ThreadTask.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "ThreadTask.h" -#include <QtConcurrentRun> -ThreadTask::ThreadTask(Task * internal, QObject *parent) : Task(parent), m_internal(internal) -{ -} - -void ThreadTask::start() -{ - connect(m_internal, SIGNAL(failed(QString)), SLOT(iternal_failed(QString))); - connect(m_internal, SIGNAL(progress(qint64,qint64)), SLOT(iternal_progress(qint64,qint64))); - connect(m_internal, SIGNAL(started()), SLOT(iternal_started())); - connect(m_internal, SIGNAL(status(QString)), SLOT(iternal_status(QString))); - connect(m_internal, SIGNAL(succeeded()), SLOT(iternal_succeeded())); - m_running = true; - QtConcurrent::run(m_internal, &Task::start); -} - -void ThreadTask::iternal_failed(QString reason) -{ - emitFailed(reason); -} - -void ThreadTask::iternal_progress(qint64 current, qint64 total) -{ - progress(current, total); -} - -void ThreadTask::iternal_started() -{ - emit started(); -} - -void ThreadTask::iternal_status(QString status) -{ - setStatus(status); -} - -void ThreadTask::iternal_succeeded() -{ - emitSucceeded(); -} diff --git a/api/logic/tasks/ThreadTask.h b/api/logic/tasks/ThreadTask.h deleted file mode 100644 index 46ce3a36..00000000 --- a/api/logic/tasks/ThreadTask.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "Task.h" -#include "multimc_logic_export.h" - -class MULTIMC_LOGIC_EXPORT ThreadTask : public Task -{ - Q_OBJECT -public: - explicit ThreadTask(Task * internal, QObject * parent = nullptr); - -protected: - void executeTask() {}; - -public slots: - virtual void start(); - -private slots: - void iternal_started(); - void iternal_progress(qint64 current, qint64 total); - void iternal_succeeded(); - void iternal_failed(QString reason); - void iternal_status(QString status); -private: - Task * m_internal; -};
\ No newline at end of file |