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>
diff --git a/manager.cpp b/manager.cpp
index 07d3d31..b9e8ace 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -38,7 +38,11 @@
         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 @@
     _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;
+    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 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()));
+            // 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::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)