Enable support to handle InternalFailure type dump, during elog restore

Resolves openbmc/openbmc#2078

Change-Id: Iea47b9b7c0cd6cae21642057b21c4e99d85be1e8
Signed-off-by: Jayanth Othayoth <ojayanth@in.ibm.com>
diff --git a/elog_watch.hpp b/elog_watch.hpp
index cfdf41a..588ac34 100644
--- a/elog_watch.hpp
+++ b/elog_watch.hpp
@@ -1,9 +1,12 @@
 #pragma once
 
+#include <set>
+#include <cereal/access.hpp>
+
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server.hpp>
-#include "config.h"
 
+#include "config.h"
 #include "dump_manager.hpp"
 
 namespace phosphor
@@ -14,9 +17,11 @@
 {
 
 using IMgr = phosphor::dump::internal::Manager;
+using EId = uint32_t;
+using ElogList = std::set<EId>;
 
 /** @class Watch
- *  @brief Adds d-bus signal based watch for elog commit.
+ *  @brief Adds d-bus signal based watch for elog add and delete.
  *  @details This implements methods for watching for InternalFailure
  *  type error message and call appropriate function to initiate dump
  */
@@ -30,36 +35,58 @@
         Watch(Watch&&) = default;
         Watch& operator=(Watch&&) = default;
 
-        /** @brief constructs watch for elog commits.
+        /** @brief constructs watch for elog add and delete signals.
          *  @param[in] bus -  The Dbus bus object
          *  @param[in] intMgr - Dump internal Manager object
          */
-        Watch(sdbusplus::bus::bus& bus, IMgr& iMgr):
-            iMgr(iMgr),
-            elogMatch(
-                bus,
-                sdbusplus::bus::match::rules::interfacesAdded() +
-                sdbusplus::bus::match::rules::path_namespace(
-                                              OBJ_LOGGING),
-                std::bind(std::mem_fn(&Watch::callback),
-                          this, std::placeholders::_1))
-        {
-            //Do nothing
-        }
+        Watch(sdbusplus::bus::bus& bus, IMgr& iMgr);
     private:
 
-        /** @brief Callback function for error log commit.
+        friend class cereal::access;
+
+        /** @brief Function required by Cereal to perform serialization.
+         *  @tparam Archive - Cereal archive type (binary in our case).
+         *  @param[in] a - reference to Cereal archive.
+         */
+        template<class Archive>
+        void serialize(Archive& a)
+        {
+            a(elogList);
+        }
+
+        /** @brief Callback function for error log add.
          *  @details InternalError type error message initiates
          *           Internal error type dump request.
          *  @param[in] msg  - Data associated with subscribed signal
          */
-        void callback(sdbusplus::message::message& msg);
+        void addCallback(sdbusplus::message::message& msg);
+
+        /** @brief Callback function for error log delete.
+         *  @param[in] msg  - Data associated with subscribed signal
+         */
+        void delCallback(sdbusplus::message::message& msg);
+
+        /** @brief get elog ID from elog entry object string.
+         *  @param[in] objectPath  - elog entry object path.
+         *  @return - elog id.
+         */
+        inline EId getEid(const std::string& objectPath)
+        {
+            fs::path path(objectPath);
+            return std::stoul(path.filename());
+        }
 
         /**  @brief Dump internal Manager object. */
         IMgr& iMgr;
 
-        /** @brief sdbusplus signal match for elog commit */
-        sdbusplus::bus::match_t elogMatch;
+        /** @brief sdbusplus signal match for elog add */
+        sdbusplus::bus::match_t addMatch;
+
+        /** @brief sdbusplus signal match for elog delete */
+        sdbusplus::bus::match_t delMatch;
+
+        /** @brief List of elog ids, which have associated dumps created */
+        ElogList elogList;
 };
 
 }//namespace elog