summaryrefslogtreecommitdiff
path: root/src/state/deactivating_state.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/deactivating_state.hpp')
-rw-r--r--src/state/deactivating_state.hpp83
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;
+};