control: Setup to subscribe and handle signals

Create the signal object, actions, and handler framework to store
subscribed to signals and the callback to handle the signal.

Change-Id: I2ae94c2216c2a99fa2d5aa2028ef09b473c3c76a
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index 1a05a3b..7cc72a9 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -69,6 +69,39 @@
 /* Dbus event timer */
 using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
 
+/* Dbus signal object */
+constexpr auto Path = 0;
+constexpr auto Intf = 1;
+constexpr auto Prop = 2;
+using SignalObject = std::tuple<std::string, std::string, std::string>;
+/* Dbus signal actions */
+using SignalActions =
+    std::vector<std::reference_wrapper<std::unique_ptr<ActionBase>>>;
+/**
+ * Signal handler function that handles parsing a signal's message for a
+ * particular signal object and stores the results in the manager
+ */
+using SignalHandler = std::function<bool(sdbusplus::message::message&,
+                                         const SignalObject&, Manager&)>;
+/**
+ * Package of data required when a signal is received
+ * Tuple constructed of:
+ *     SignalHandler = Signal handler function
+ *     SignalObject = Dbus signal object
+ *     SignalActions = List of actions that are run when the signal is received
+ */
+using SignalPkg = std::tuple<SignalHandler, SignalObject, SignalActions>;
+/**
+ * Data associated to a subscribed signal
+ * Tuple constructed of:
+ *     std::unique_ptr<std::vector<SignalPkg>> =
+ *         Pointer to the signal's packages
+ *     std::unique_ptr<sdbusplus::server::match::match> =
+ *         Pointer to match holding the subscription to a signal
+ */
+using SignalData = std::tuple<std::unique_ptr<std::vector<SignalPkg>>,
+                              std::unique_ptr<sdbusplus::server::match::match>>;
+
 /**
  * @class Manager - Represents the fan control manager's configuration
  *
@@ -261,6 +294,27 @@
     void timerExpired(TimerData& data);
 
     /**
+     * @brief Get the signal data for a given match string
+     *
+     * @param[in] sigMatch - Signal match string
+     *
+     * @return - Reference to the signal data for the given match string
+     */
+    std::vector<SignalData>& getSignal(const std::string& sigMatch)
+    {
+        return _signals[sigMatch];
+    }
+
+    /**
+     * @brief Handle receiving signals
+     *
+     * @param[in] msg - Signal message containing the signal's data
+     * @param[in] pkgs - Signal packages associated to the signal being handled
+     */
+    void handleSignal(sdbusplus::message::message& msg,
+                      const std::vector<SignalPkg>* pkgs);
+
+    /**
      * @brief Get the sdbusplus bus object
      */
     inline auto& getBus()
@@ -314,6 +368,9 @@
     /* List of timers and their data to be processed when expired */
     std::vector<std::pair<std::unique_ptr<TimerData>, Timer>> _timers;
 
+    /* Map of signal match strings to a list of signal handler data */
+    std::unordered_map<std::string, std::vector<SignalData>> _signals;
+
     /* List of zones configured */
     std::map<configKey, std::unique_ptr<Zone>> _zones;