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();
}
|