1 #pragma once
2 
3 #include <set>
4 #include <cereal/access.hpp>
5 
6 #include <sdbusplus/bus.hpp>
7 #include <sdbusplus/server.hpp>
8 
9 #include "config.h"
10 #include "dump_manager.hpp"
11 
12 namespace phosphor
13 {
14 namespace dump
15 {
16 namespace elog
17 {
18 
19 using IMgr = phosphor::dump::internal::Manager;
20 using EId = uint32_t;
21 using ElogList = std::set<EId>;
22 
23 /** @class Watch
24  *  @brief Adds d-bus signal based watch for elog add and delete.
25  *  @details This implements methods for watching for InternalFailure
26  *  type error message and call appropriate function to initiate dump
27  */
28 class Watch
29 {
30     public:
31         Watch() = delete;
32         ~Watch() = default;
33         Watch(const Watch&) = delete;
34         Watch& operator=(const Watch&) = delete;
35         Watch(Watch&&) = default;
36         Watch& operator=(Watch&&) = default;
37 
38         /** @brief constructs watch for elog add and delete signals.
39          *  @param[in] bus -  The Dbus bus object
40          *  @param[in] intMgr - Dump internal Manager object
41          */
42         Watch(sdbusplus::bus::bus& bus, IMgr& iMgr);
43     private:
44 
45         friend class cereal::access;
46 
47         /** @brief Function required by Cereal to perform serialization.
48          *  @tparam Archive - Cereal archive type (binary in our case).
49          *  @param[in] a - reference to Cereal archive.
50          */
51         template<class Archive>
52         void serialize(Archive& a)
53         {
54             a(elogList);
55         }
56 
57         /** @brief Callback function for error log add.
58          *  @details InternalError type error message initiates
59          *           Internal error type dump request.
60          *  @param[in] msg  - Data associated with subscribed signal
61          */
62         void addCallback(sdbusplus::message::message& msg);
63 
64         /** @brief Callback function for error log delete.
65          *  @param[in] msg  - Data associated with subscribed signal
66          */
67         void delCallback(sdbusplus::message::message& msg);
68 
69         /** @brief get elog ID from elog entry object string.
70          *  @param[in] objectPath  - elog entry object path.
71          *  @return - elog id.
72          */
73         inline EId getEid(const std::string& objectPath)
74         {
75             fs::path path(objectPath);
76             return std::stoul(path.filename());
77         }
78 
79         /**  @brief Dump internal Manager object. */
80         IMgr& iMgr;
81 
82         /** @brief sdbusplus signal match for elog add */
83         sdbusplus::bus::match_t addMatch;
84 
85         /** @brief sdbusplus signal match for elog delete */
86         sdbusplus::bus::match_t delMatch;
87 
88         /** @brief List of elog ids, which have associated dumps created */
89         ElogList elogList;
90 };
91 
92 }//namespace elog
93 }//namespace dump
94 }//namespace phosphor
95