1 /**
2  * @file PathWatch.hpp
3  * @brief Add watch for the object path for interfaces added/removed signal
4  *
5  * In general class users should include pathwatchimpl.hpp instead to avoid
6  * link failures.
7  */
8 #pragma once
9 
10 #include "data_types.hpp"
11 #include "watch.hpp"
12 
13 #include <string>
14 
15 namespace phosphor
16 {
17 namespace dbus
18 {
19 namespace monitoring
20 {
21 
22 class Callback;
23 
24 /** @class PathWatch
25  *  @brief Watch on object path for interfaceadded/interfaceremoved signals
26  */
27 template <typename DBusInterfaceType>
28 class PathWatch : public Watch
29 {
30   public:
31     PathWatch() = delete;
32     PathWatch(const PathWatch&) = delete;
33     PathWatch(PathWatch&&) = default;
34     PathWatch& operator=(const PathWatch&) = delete;
35     PathWatch& operator=(PathWatch&&) = default;
36     virtual ~PathWatch() = default;
PathWatch(const std::string & path,Callback & callback)37     PathWatch(const std::string& path, Callback& callback) :
38         Watch(), objectPath(path), cb(callback), alreadyRan(false)
39     {}
40 
41     /** @brief Start the watch.
42      *
43      *  Watch start interface implementation for PathWatch.
44      */
45     void start() override;
46 
47     /** @brief Run the watch callback method.
48      *
49      *  Watch callback interface implementation for PathWatch.
50      */
51     void callback(Context ctx) override;
52 
53     /** @brief Run the watch callback method.
54      *
55      *  Watch callback interface implementation for PathWatch.
56      */
57     void callback(Context ctx, sdbusplus::message_t& msg) override;
58 
59   protected:
60     /** @brief Path of the D-Bus object to watch for. */
61     const std::string& objectPath;
62 
63     /** @brief Optional callback method. */
64     Callback& cb;
65 
66     /** @brief The start method should only be invoked once. */
67     bool alreadyRan;
68 };
69 
70 } // namespace monitoring
71 } // namespace dbus
72 } // namespace phosphor
73