#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