File: startupdateroperation.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 (96 lines) | stat: -rw-r--r-- 3,035 bytes parent folder | download | duplicates (2)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "startupdateroperation.h"

#include "flipperzero/devicestate.h"
#include "flipperzero/protobufsession.h"
#include "flipperzero/rpc/systemrebootoperation.h"
#include "flipperzero/rpc/systemupdateoperation.h"

using namespace Flipper;
using namespace Zero;

StartUpdaterOperation::StartUpdaterOperation(ProtobufSession *rpc, DeviceState *deviceState, const QByteArray &manifestPath, QObject *parent):
    AbstractUtilityOperation(rpc, deviceState, parent),
    m_manifestPath(manifestPath)
{
    // Waiting for the whole update process with no feedback
    setTimeout(1000*60*10);
}

const QString StartUpdaterOperation::description() const
{
    return QStringLiteral("Start Update @%1").arg(deviceState()->deviceInfo().name);
}

void StartUpdaterOperation::onOperationTimeout()
{
    finishWithError(BackendError::UnknownError, QStringLiteral("Failed to update: timeout exceeded"));
}

void StartUpdaterOperation::onDeviceOnlineChanged()
{
    if(deviceState()->isOnline()) {
        advanceOperationState();
    } else {
        startTimeout();
    }
}

void StartUpdaterOperation::nextStateLogic()
{
    if(operationState() == AbstractOperation::Ready) {
        setOperationState(StartUpdaterOperation::StartingUpdate);
        startUpdate();

    } else if(operationState() == StartUpdaterOperation::StartingUpdate) {
        setOperationState(StartUpdaterOperation::RebootingToUpdater);
        rebootToUpdater();

    } else if(operationState() == StartUpdaterOperation::RebootingToUpdater) {
        setOperationState(StartUpdaterOperation::WaitingForUpdate);
        waitForUpdate();

    } else if(operationState() == StartUpdaterOperation::WaitingForUpdate) {
        finish();
    }
}

void StartUpdaterOperation::startUpdate()
{
    deviceState()->setProgress(-1.0);
    deviceState()->setStatusString(QStringLiteral("Initiating update procedure ..."));

    auto *operation = rpc()->systemUpdate(m_manifestPath);

    connect(operation, &AbstractOperation::finished, this, [=]() {
        if(operation->isError()) {
            finishWithError(operation->error(), operation->errorString());
        } else if(!operation->isResultOk()) {
            finishWithError(BackendError::UpdaterError, operation->resultString());
        } else {
            advanceOperationState();
        }
    });
}

void StartUpdaterOperation::rebootToUpdater()
{
    deviceState()->setStatusString(QStringLiteral("Rebooting to updater ..."));

    auto *operation = rpc()->rebootToUpdater();

    connect(operation, &AbstractOperation::finished, this, [=]() {
        if(operation->isError()) {
            finishWithError(operation->error(), operation->errorString());
        } else {
            advanceOperationState();
        }
    });
}

void StartUpdaterOperation::waitForUpdate()
{
    deviceState()->setStatusString(QStringLiteral("Updating, follow the progress on your Flipper Zero"));

    connect(deviceState(), &DeviceState::isOnlineChanged, this, &StartUpdaterOperation::onDeviceOnlineChanged);
    startTimeout();
}