diff options
Diffstat (limited to 'src/state/deactivating_state.hpp')
-rw-r--r-- | src/state/deactivating_state.hpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/state/deactivating_state.hpp b/src/state/deactivating_state.hpp new file mode 100644 index 0000000..7f3010a --- /dev/null +++ b/src/state/deactivating_state.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include "basic_state.hpp" +#include "ready_state.hpp" + +struct DeactivatingState : public BasicStateT<DeactivatingState> +{ + static std::string_view stateName() + { + return "DeactivatingState"; + } + + template <class EventT> + DeactivatingState(interfaces::MountPointStateMachine& machine, + std::unique_ptr<resource::Process> process, + std::unique_ptr<resource::Gadget> gadget, EventT event) : + BasicStateT(machine), + process(std::move(process)), gadget(std::move(gadget)) + { + handleEvent(std::move(event)); + } + + DeactivatingState(interfaces::MountPointStateMachine& machine, + std::unique_ptr<resource::Process> process, + std::unique_ptr<resource::Gadget> gadget) : + BasicStateT(machine), + process(std::move(process)), gadget(std::move(gadget)) + { + } + + std::unique_ptr<BasicState> onEnter() override + { + gadget = nullptr; + process = nullptr; + + return nullptr; + } + + std::unique_ptr<BasicState> handleEvent(UdevStateChangeEvent event) + { + udevStateChangeEvent = std::move(event); + return evaluate(); + } + + std::unique_ptr<BasicState> handleEvent(SubprocessStoppedEvent event) + { + subprocessStoppedEvent = std::move(event); + return evaluate(); + } + + template <class AnyEvent> + std::unique_ptr<BasicState> handleEvent(AnyEvent event) + { + LogMsg(Logger::Error, "Invalid event: ", event.eventName); + return nullptr; + } + + private: + std::unique_ptr<BasicState> evaluate() + { + if (udevStateChangeEvent && subprocessStoppedEvent) + { + if (udevStateChangeEvent->devState == StateChange::removed) + { + LogMsg(Logger::Debug, machine.getName(), + " udev StateChange::removed"); + } + else + { + LogMsg(Logger::Error, machine.getName(), " udev StateChange::", + static_cast<std::underlying_type_t<StateChange>>( + udevStateChangeEvent->devState)); + } + return std::make_unique<ReadyState>(machine); + } + return nullptr; + } + + std::unique_ptr<resource::Process> process; + std::unique_ptr<resource::Gadget> gadget; + std::optional<UdevStateChangeEvent> udevStateChangeEvent; + std::optional<SubprocessStoppedEvent> subprocessStoppedEvent; +}; |