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
|
#include "startrecoveryoperation.h"
#include "flipperzero/devicestate.h"
#include "flipperzero/protobufsession.h"
#include "flipperzero/rpc/systemrebootoperation.h"
using namespace Flipper;
using namespace Zero;
StartRecoveryOperation::StartRecoveryOperation(ProtobufSession *rpc, DeviceState *deviceState, QObject *parent):
AbstractUtilityOperation(rpc, deviceState, parent)
{
// Workaround for Windows taking too long to install the driver
#ifdef Q_OS_WINDOWS
setTimeout(120000);
#endif
}
const QString StartRecoveryOperation::description() const
{
return QStringLiteral("Start Recovery Mode @%1").arg(deviceState()->name());
}
void StartRecoveryOperation::nextStateLogic()
{
if(operationState() == AbstractOperation::Ready) {
setOperationState(StartRecoveryOperation::WaitingForRecovery);
startRecoveryMode();
} else if(operationState() == StartRecoveryOperation::WaitingForRecovery) {
disconnect(deviceState(), &DeviceState::isOnlineChanged, this, &StartRecoveryOperation::onDeviceOnlineChanged);
finish();
} else {}
}
void StartRecoveryOperation::onOperationTimeout()
{
finishWithError(BackendError::RecoveryAccessError, QStringLiteral("Failed to start recovery mode: operation timeout"));
}
void StartRecoveryOperation::onDeviceOnlineChanged()
{
if(deviceState()->isOnline()) {
advanceOperationState();
} else {
startTimeout();
}
}
void StartRecoveryOperation::startRecoveryMode()
{
if(deviceState()->isRecoveryMode()) {
nextStateLogic();
return;
}
deviceState()->setStatusString(QStringLiteral("Starting Recovery mode..."));
connect(deviceState(), &DeviceState::isOnlineChanged, this, &StartRecoveryOperation::onDeviceOnlineChanged);
auto *operation = rpc()->rebootToRecovery();
connect(operation, &AbstractOperation::finished, this, [=]() {
if(operation->isError()) {
finishWithError(operation->error(), operation->errorString());
} else {
startTimeout();
}
});
}
|