From 32b3ed0a1362a4b0798ad71fac3450fb77cb7e41 Mon Sep 17 00:00:00 2001 From: Thomas Groman Date: Thu, 19 Sep 2019 00:41:48 -0700 Subject: merged from 0.6.7 codebase --- api/logic/tasks/Task.cpp | 168 +++++++++++++++++++++++++++-------------------- 1 file changed, 95 insertions(+), 73 deletions(-) (limited to 'api/logic/tasks/Task.cpp') diff --git a/api/logic/tasks/Task.cpp b/api/logic/tasks/Task.cpp index 2523aeb2..accb39b6 100644 --- a/api/logic/tasks/Task.cpp +++ b/api/logic/tasks/Task.cpp @@ -1,4 +1,4 @@ -/* Copyright 2013-2018 MultiMC Contributors +/* Copyright 2013-2019 MultiMC Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,124 +23,146 @@ Task::Task(QObject *parent) : QObject(parent) void Task::setStatus(const QString &new_status) { - if(m_status != new_status) - { - m_status = new_status; - emit status(m_status); - } + if(m_status != new_status) + { + m_status = new_status; + emit status(m_status); + } } void Task::setProgress(qint64 current, qint64 total) { - m_progress = current; - m_progressTotal = total; - emit progress(m_progress, m_progressTotal); + m_progress = current; + m_progressTotal = total; + emit progress(m_progress, m_progressTotal); } void Task::start() { - m_running = true; - emit started(); - qDebug() << "Task" << describe() << "started"; - executeTask(); + switch(m_state) + { + case State::Inactive: + { + qDebug() << "Task" << describe() << "starting for the first time"; + break; + } + case State::AbortedByUser: + { + qDebug() << "Task" << describe() << "restarting for after being aborted by user"; + break; + } + case State::Failed: + { + qDebug() << "Task" << describe() << "restarting for after failing at first"; + break; + } + case State::Succeeded: + { + qDebug() << "Task" << describe() << "restarting for after succeeding at first"; + break; + } + case State::Running: + { + qWarning() << "MultiMC tried to start task" << describe() << "while it was already running!"; + return; + } + } + // NOTE: only fall thorugh to here in end states + m_state = State::Running; + emit 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" << describe() << "failed: " << reason; - emit failed(reason); - emit finished(); + // Don't fail twice. + if (!isRunning()) + { + qCritical() << "Task" << describe() << "failed while not running!!!!: " << reason; + return; + } + m_state = State::Failed; + m_failReason = 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(); + // Don't abort twice. + if (!isRunning()) + { + qCritical() << "Task" << describe() << "aborted while not running!!!!"; + return; + } + m_state = State::AbortedByUser; + m_failReason = "Aborted."; + qDebug() << "Task" << describe() << "aborted."; + emit failed(m_failReason); + emit finished(); } void Task::emitSucceeded() { - // 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" << describe() << "succeeded"; - emit succeeded(); - emit finished(); + // Don't succeed twice. + if (!isRunning()) + { + qCritical() << "Task" << describe() << "succeeded while not running!!!!"; + return; + } + m_state = State::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; + 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; + return m_state == State::Running; } bool Task::isFinished() const { - return m_finished; + return m_state != State::Running && m_state != State::Inactive; } bool Task::wasSuccessful() const { - return m_succeeded; + return m_state == State::Succeeded; } QString Task::failReason() const { - return m_failReason; + return m_failReason; } void Task::logWarning(const QString& line) { - qWarning() << line; - m_Warnings.append(line); + qWarning() << line; + m_Warnings.append(line); } QStringList Task::warnings() const { - return m_Warnings; + return m_Warnings; } -- cgit v1.2.3