File: abstractoperationrunner.cpp

package info (click to toggle)
qflipper 1.3.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 12,320 kB
  • sloc: cpp: 18,500; sh: 247; ansic: 191; xml: 38; python: 14; makefile: 5
file content (65 lines) | stat: -rw-r--r-- 1,589 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "abstractoperationrunner.h"

#include <QTimer>
#include <QDebug>
#include <QLoggingCategory>

#include "abstractoperation.h"

Q_LOGGING_CATEGORY(CATEGORY_DEFAULT, "DEF")

AbstractOperationRunner::AbstractOperationRunner(QObject *parent):
    QObject(parent),
    m_state(Idle)
{}

const QLoggingCategory &AbstractOperationRunner::loggingCategory() const
{
    return CATEGORY_DEFAULT();
}

void AbstractOperationRunner::enqueueOperation(AbstractOperation *operation)
{
    if(m_state == Idle) {
        m_state = Running;
        QTimer::singleShot(0, this, &AbstractOperationRunner::processQueue);
    }

    connect(operation, &AbstractOperation::finished, this, [=]() {
        if(operation->isError()) {
            qCCritical(loggingCategory()).noquote() << operation->description() << "ERROR:" << operation->errorString();

            clearQueue();
            processQueue();

        } else {
            qCInfo(loggingCategory()).noquote() << operation->description() << "SUCCESS";
            QTimer::singleShot(0, this, &AbstractOperationRunner::processQueue);
        }

        operation->deleteLater();
    });

    m_queue.enqueue(operation);
}

void AbstractOperationRunner::processQueue()
{
    if(m_queue.isEmpty()) {
        m_state = Idle;
        return;
    }

    auto *operation = m_queue.dequeue();
    qCInfo(loggingCategory()).noquote() << operation->description() << "START";
    operation->start();
}

void AbstractOperationRunner::clearQueue()
{
    while(!m_queue.isEmpty()) {
        m_queue.dequeue()->deleteLater();
    }

    m_state = Idle;
}