summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Bishop <bradleyb@fuzziesquirrel.com>2016-11-29 16:41:32 -0500
committerBrad Bishop <bradleyb@fuzziesquirrel.com>2017-01-12 16:53:29 -0500
commit68c8083969a59270d6e2f855f9bcee21784a530c (patch)
tree3aa02c1b70859ebc1c645ed080b6e626744fa756
parent4f20a3e3ccbfb8b08de0bdac96c037d81546c573 (diff)
downloadphosphor-inventory-manager-68c8083969a59270d6e2f855f9bcee21784a530c.tar.gz
phosphor-inventory-manager-68c8083969a59270d6e2f855f9bcee21784a530c.zip
Allow arrays of dbus events
The current event <-> action relationship is one to many. Allow a many to many relationship to be expressed. Change-Id: Ibfb995cbf677b21757864dc62d9a3818af6c2aa3 Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
-rw-r--r--generated.mako.cpp7
-rw-r--r--manager.cpp70
-rw-r--r--manager.hpp11
3 files changed, 54 insertions, 34 deletions
diff --git a/generated.mako.cpp b/generated.mako.cpp
index 2dccf82..8534674 100644
--- a/generated.mako.cpp
+++ b/generated.mako.cpp
@@ -38,7 +38,8 @@ const Manager::Events Manager::_events{
// ${e['description']}
% endif
std::make_tuple(
- std::make_shared<details::DbusSignal>(
+ std::vector<details::EventBasePtr>({
+ std::make_shared<details::DbusSignal>(
% for i, s in enumerate(e['signature'].items()):
% if i + 1 == len(e['signature']):
${'"{0}=\'{1}\'"'.format(*s)},
@@ -50,13 +51,13 @@ const Manager::Events Manager::_events{
details::make_filter(filters::${e['filter']['type']}(
% for i, a in enumerate(e['filter']['args']):
% if i + 1 == len(e['filter']['args']):
- "${a['value']}"))),
+ "${a['value']}")))}),
% else:
"${a['value']}",
% endif
% endfor
% else:
- details::make_filter(filters::${e['filter']['type']})),
+ details::make_filter(filters::${e['filter']['type']}))}),
% endif
% if e['action'].get('args'):
std::vector<details::ActionBasePtr>({details::make_action(actions::${e['action']['type']}(
diff --git a/manager.cpp b/manager.cpp
index 07d3d31..b9e8ace 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -38,7 +38,11 @@ auto _signal(sd_bus_message *m, void *data, sd_bus_error *e) noexcept
auto &args = *static_cast<Manager::SigArg*>(data);
sd_bus_message_ref(m);
auto &mgr = *std::get<0>(args);
- mgr.signal(msg, *std::get<1>(args));
+ mgr.signal(
+ msg,
+ static_cast<const details::DbusSignal &>(
+ *std::get<1>(args)),
+ *std::get<2>(args));
}
catch (const std::exception &e) {
std::cerr << e.what() << std::endl;
@@ -60,28 +64,38 @@ Manager::Manager(
_bus(std::move(bus)),
_manager(sdbusplus::server::manager::manager(_bus, root))
{
- for (auto &x: _events) {
- auto pEvent = std::get<0>(x);
- if (pEvent->type !=
- details::Event::Type::DBUS_SIGNAL)
- continue;
-
- // Create a callback context for each event.
- _sigargs.emplace_back(
- std::make_unique<SigArg>(
- std::make_tuple(
- this,
- &x)));
- // Register our callback and the context for
- // each event.
- auto &dbusEvent = static_cast<details::DbusSignal &>(
- *pEvent);
- _matches.emplace_back(
- sdbusplus::server::match::match(
- _bus,
- std::get<0>(dbusEvent),
- details::_signal,
- _sigargs.back().get()));
+ for (auto &group: _events)
+ {
+ for (auto pEvent: std::get<0>(group))
+ {
+ if (pEvent->type !=
+ details::Event::Type::DBUS_SIGNAL)
+ continue;
+
+ // Create a callback context for this event group.
+ auto dbusEvent = static_cast<details::DbusSignal *>(
+ pEvent.get());
+
+ // Go ahead and store an iterator pointing at
+ // the event data to avoid lookups later since
+ // additional signal callbacks aren't added
+ // after the manager is constructed.
+ _sigargs.emplace_back(
+ std::make_unique<SigArg>(
+ std::make_tuple(
+ this,
+ dbusEvent,
+ &group)));
+
+ // Register our callback and the context for
+ // each signal event.
+ _matches.emplace_back(
+ sdbusplus::server::match::match(
+ _bus,
+ std::get<0>(*dbusEvent),
+ details::_signal,
+ _sigargs.back().get()));
+ }
}
_bus.request_name(busname);
@@ -149,11 +163,13 @@ void Manager::notify(std::string path, Object object)
}
}
-void Manager::signal(sdbusplus::message::message &msg, auto &args)
+void Manager::signal(
+ sdbusplus::message::message &msg,
+ const details::DbusSignal &event,
+ const EventInfo &info)
{
- auto &event = std::get<0>(args);
- auto &actions = std::get<1>(args);
- auto &filter = *std::get<1>(static_cast<details::DbusSignal &>(*event));
+ auto &filter = *std::get<1>(event);
+ auto &actions = std::get<1>(info);
if(filter(msg, *this)) {
for (auto &action: actions)
diff --git a/manager.hpp b/manager.hpp
index c905b8b..92afd9f 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -78,6 +78,9 @@ class Manager final :
using Object = std::map<
std::string, std::map<
std::string, sdbusplus::message::variant<std::string>>>;
+ using EventInfo = std::tuple<
+ std::vector<details::EventBasePtr>,
+ std::vector<details::ActionBasePtr>>;
/** @brief Start processing DBus messages. */
void run() noexcept;
@@ -89,18 +92,18 @@ class Manager final :
void notify(std::string path, Object) override;
/** @brief sd_bus signal callback. */
- void signal(sdbusplus::message::message &, auto &);
+ void signal(sdbusplus::message::message&,
+ const details::DbusSignal &event,
+ const EventInfo &info);
/** @brief Drop an object from DBus. */
void destroyObject(const char *);
- using EventInfo = std::tuple<
- details::EventBasePtr,
- std::vector<details::ActionBasePtr>>;
using SigArgs = std::vector<
std::unique_ptr<
std::tuple<
Manager *,
+ const details::DbusSignal *,
const EventInfo *>>>;
using SigArg = SigArgs::value_type::element_type;
OpenPOWER on IntegriCloud