aboutsummaryrefslogtreecommitdiff
path: root/launcher/tasks/MultipleOptionsTask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/tasks/MultipleOptionsTask.cpp')
-rw-r--r--launcher/tasks/MultipleOptionsTask.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/launcher/tasks/MultipleOptionsTask.cpp b/launcher/tasks/MultipleOptionsTask.cpp
new file mode 100644
index 00000000..6e853568
--- /dev/null
+++ b/launcher/tasks/MultipleOptionsTask.cpp
@@ -0,0 +1,48 @@
+#include "MultipleOptionsTask.h"
+
+#include <QDebug>
+
+MultipleOptionsTask::MultipleOptionsTask(QObject* parent, const QString& task_name) : SequentialTask(parent, task_name) {}
+
+void MultipleOptionsTask::startNext()
+{
+ Task* previous = nullptr;
+ if (m_currentIndex != -1) {
+ previous = m_queue[m_currentIndex].get();
+ disconnect(previous, 0, this, 0);
+ }
+
+ m_currentIndex++;
+ if ((previous && previous->wasSuccessful())) {
+ emitSucceeded();
+ return;
+ }
+
+ Task::Ptr next = m_queue[m_currentIndex];
+
+ connect(next.get(), &Task::failed, this, &MultipleOptionsTask::subTaskFailed);
+ connect(next.get(), &Task::succeeded, this, &MultipleOptionsTask::startNext);
+
+ connect(next.get(), &Task::status, this, &MultipleOptionsTask::subTaskStatus);
+ connect(next.get(), &Task::stepStatus, this, &MultipleOptionsTask::subTaskStatus);
+
+ connect(next.get(), &Task::progress, this, &MultipleOptionsTask::subTaskProgress);
+
+ qDebug() << QString("Making attemp %1 out of %2").arg(m_currentIndex + 1).arg(m_queue.size());
+ setStatus(tr("Making attempt #%1 out of %2").arg(m_currentIndex + 1).arg(m_queue.size()));
+ setStepStatus(next->isMultiStep() ? next->getStepStatus() : next->getStatus());
+
+ next->start();
+}
+
+void MultipleOptionsTask::subTaskFailed(QString const& reason)
+{
+ qDebug() << QString("Failed attempt #%1 of %2. Reason: %3").arg(m_currentIndex + 1).arg(m_queue.size()).arg(reason);
+ if(m_currentIndex < m_queue.size() - 1) {
+ startNext();
+ return;
+ }
+
+ qWarning() << QString("All attempts have failed!");
+ emitFailed();
+}