vdi-cloud/terminal/kiosk-shell/src/state_machine.cpp

74 lines
2.6 KiB
C++

#include "state_machine.h"
namespace vdi {
const char* stateToString(State s) {
switch (s) {
case State::kBoot: return "BOOT";
case State::kConfig: return "CONFIG";
case State::kAuthenticating: return "AUTHENTICATING";
case State::kDesktopList: return "DESKTOP_LIST";
case State::kConnecting: return "CONNECTING";
case State::kSession: return "SESSION";
case State::kReconnect: return "RECONNECT";
case State::kError: return "ERROR";
}
return "UNKNOWN";
}
StateMachine::StateMachine(StateListener listener) : listener_(std::move(listener)) {}
bool StateMachine::isLegalTransition(State from, State to) {
switch (from) {
case State::kBoot:
return to == State::kConfig || to == State::kError;
case State::kConfig:
return to == State::kAuthenticating || to == State::kConnecting ||
to == State::kError;
case State::kAuthenticating:
return to == State::kDesktopList || to == State::kConfig || to == State::kError;
case State::kDesktopList:
return to == State::kConnecting || to == State::kConfig || to == State::kError;
case State::kConnecting:
return to == State::kSession || to == State::kReconnect ||
to == State::kDesktopList || to == State::kError;
case State::kSession:
return to == State::kReconnect || to == State::kDesktopList ||
to == State::kConfig || to == State::kError;
case State::kReconnect:
return to == State::kConnecting || to == State::kDesktopList ||
to == State::kConfig || to == State::kError;
case State::kError:
return to == State::kConfig || to == State::kDesktopList ||
to == State::kConnecting;
}
return false;
}
bool StateMachine::transitionTo(State next, const QString& detail) {
if (!isLegalTransition(current_, next)) {
return false;
}
State from = current_;
current_ = next;
if (listener_) {
listener_(from, next, detail);
}
return true;
}
bool StateMachine::canConnect() const {
return current_ == State::kDesktopList || current_ == State::kConfig ||
current_ == State::kReconnect || current_ == State::kError;
}
bool StateMachine::canDisconnect() const {
return current_ == State::kSession || current_ == State::kConnecting;
}
bool StateMachine::canRetry() const {
return current_ == State::kReconnect || current_ == State::kError;
}
} // namespace vdi