74 lines
2.6 KiB
C++
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
|