#include "monitor.hpp" namespace phosphor { namespace dbus { namespace monitoring { Monitor::Monitor(sdbusplus::bus::bus& bus) : bus(bus) { // Process thru given events that are type 'signal' for (auto& event : events) { for (auto& pEvent : std::get>>(event)) { if (pEvent->trigger != Event::Trigger::SIGNAL) { continue; } auto signalEvent = static_cast(pEvent.get()); eventArgs.emplace_back(std::make_unique(this, signalEvent, &event)); matches.emplace_back(bus, signalEvent->signature, handleSignal, eventArgs.back().get()); } } } void Monitor::processStart() noexcept { sdbusplus::message::message nullMsg{nullptr}; // Process thru given events that are type 'start' for (auto& event : events) { for (auto& pEvent : std::get>>(event)) { if (pEvent->trigger == Event::Trigger::START) { handleEvent(nullMsg, *pEvent, event); } } } } int Monitor::handleSignal(sd_bus_message* msg, void* data, sd_bus_error* err) { auto sdbpMsg = sdbusplus::message::message(msg); auto& eventArg = *static_cast(data); std::get<0>(eventArg)->handleEvent( sdbpMsg, static_cast(*std::get<1>(eventArg)), *std::get<2>(eventArg)); return 0; } void Monitor::handleEvent(sdbusplus::message::message& msg, const Event& event, const std::tuple>, std::vector>& eventDef) { // Iterate over conditions for (auto& cond : event) { if (!cond(bus, msg, *this)) { continue; } // Perform defined actions for (auto& act : std::get<1>(eventDef)) { act(bus, *this); } return; } } } // namespace monitoring } // namespace dbus } // namespace phosphor