blob: 2d4d649f6a9095765a3b8ce3c167cb7fe32101bd [file] [log] [blame]
/**
* Copyright © 2017 IBM Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#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<std::vector<std::shared_ptr<Event>>>(event))
{
if (pEvent->trigger != Event::Trigger::SIGNAL)
{
continue;
}
auto signalEvent = static_cast<SignalEvent*>(pEvent.get());
eventArgs.emplace_back(std::make_unique<eventArg>(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<std::vector<std::shared_ptr<Event>>>(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<Monitor::eventArg*>(data);
std::get<0>(eventArg)->handleEvent(
sdbpMsg,
static_cast<const SignalEvent&>(*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<std::shared_ptr<Event>>,
std::vector<Action>>& 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;
}
}
const std::vector<
std::tuple<
std::vector<std::shared_ptr<Event>>,
std::vector<Action>>> Monitor::events;
} // namespace monitoring
} // namespace dbus
} // namespace phosphor