blob: 8a3c07b41fff350573e3dd3eb98a0d6d04ed4612 [file] [log] [blame]
Brad Bishop4b916f12017-05-23 18:06:38 -04001/**
2 * @file propertywatch.hpp
3 * @brief PropertyWatch class declarations.
4 *
5 * In general class users should include propertywatchimpl.hpp instead to avoid
6 * link failures.
7 */
8#pragma once
9
10#include "data_types.hpp"
Matthew Barthefe01582019-09-09 15:22:37 -050011#include "filters.hpp"
Brad Bishop4b916f12017-05-23 18:06:38 -040012#include "watch.hpp"
13
Andrew Geisslerae4c95c2020-05-16 13:58:53 -050014#include <string>
15
Brad Bishop4b916f12017-05-23 18:06:38 -040016namespace phosphor
17{
18namespace dbus
19{
20namespace monitoring
21{
22
Brad Bishopfccdc392017-05-22 21:11:09 -040023class Callback;
24
Brad Bishop4b916f12017-05-23 18:06:38 -040025/** @class PropertyWatch
26 * @brief Type agnostic, factored out logic for property watches.
27 *
28 * A property watch maintains the state of one or more DBus properties
29 * as specified by the supplied index.
30 */
Patrick Venture3d6d3182018-08-31 09:33:09 -070031template <typename DBusInterfaceType>
32class PropertyWatch : public Watch
Brad Bishop4b916f12017-05-23 18:06:38 -040033{
Brad Bishopd1eac882018-03-29 10:34:05 -040034 public:
35 PropertyWatch() = delete;
36 PropertyWatch(const PropertyWatch&) = delete;
37 PropertyWatch(PropertyWatch&&) = default;
38 PropertyWatch& operator=(const PropertyWatch&) = delete;
39 PropertyWatch& operator=(PropertyWatch&&) = default;
40 virtual ~PropertyWatch() = default;
41 PropertyWatch(const PropertyIndex& watchIndex,
Lei YU98d64622022-05-24 19:11:23 +080042 bool ignoreStartCallback = false,
Brad Bishopd1eac882018-03-29 10:34:05 -040043 Callback* callback = nullptr) :
44 Watch(),
Lei YU98d64622022-05-24 19:11:23 +080045 index(watchIndex), cb(callback), alreadyRan(false),
46 ignoreStartCallback(ignoreStartCallback)
Brad Bishopd1eac882018-03-29 10:34:05 -040047 {
48 }
Brad Bishop4b916f12017-05-23 18:06:38 -040049
Brad Bishopd1eac882018-03-29 10:34:05 -040050 /** @brief Start the watch.
51 *
52 * Watch start interface implementation for PropertyWatch.
53 */
54 void start() override;
Brad Bishop4b916f12017-05-23 18:06:38 -040055
Brad Bishopd1eac882018-03-29 10:34:05 -040056 /** @brief Run the watch callback method.
57 *
58 * Watch callback interface implementation for PropertyWatch.
59 */
60 void callback(Context ctx) override;
Brad Bishopce4fbe12017-06-06 23:58:09 -040061
Brad Bishopd1eac882018-03-29 10:34:05 -040062 /** @brief Update properties.
63 *
64 * Subclasses to query the properties specified by the index
65 * and update the cache.
66 *
67 * @param[in] busName - The busname hosting the interface to query.
68 * @param[in] path - The path of the interface to query.
69 * @param[in] interface - The interface to query.
70 */
71 virtual void updateProperties(const std::string& busName,
72 const std::string& path,
73 const std::string& interface) = 0;
Brad Bishop4b916f12017-05-23 18:06:38 -040074
Brad Bishopd1eac882018-03-29 10:34:05 -040075 /** @brief Dbus signal callback for PropertiesChanged.
76 *
77 * Subclasses to update the cache.
78 *
79 * @param[in] message - The org.freedesktop.DBus.PropertiesChanged
80 * message.
81 * @param[in] path - The path associated with the message.
82 * @param[in] interface - The interface associated with the message.
83 */
84 virtual void propertiesChanged(sdbusplus::message::message&,
85 const std::string& path,
86 const std::string& interface) = 0;
Brad Bishop4b916f12017-05-23 18:06:38 -040087
Brad Bishopd1eac882018-03-29 10:34:05 -040088 /** @brief Dbus signal callback for InterfacesAdded.
89 *
90 * Subclasses to update the cache.
91 *
92 * @param[in] msg - The org.freedesktop.DBus.PropertiesChanged
93 * message.
94 */
95 virtual void interfacesAdded(sdbusplus::message::message& msg) = 0;
Brad Bishop4b916f12017-05-23 18:06:38 -040096
Brad Bishopd1eac882018-03-29 10:34:05 -040097 protected:
98 /** @brief Property names and their associated storage. */
99 const PropertyIndex& index;
Brad Bishop4b916f12017-05-23 18:06:38 -0400100
Brad Bishopd1eac882018-03-29 10:34:05 -0400101 /** @brief Optional callback method. */
102 Callback* const cb;
Brad Bishop4b916f12017-05-23 18:06:38 -0400103
Brad Bishopd1eac882018-03-29 10:34:05 -0400104 /** @brief The start method should only be invoked once. */
105 bool alreadyRan;
Lei YU98d64622022-05-24 19:11:23 +0800106
107 /** @brief Ignore callback on start */
108 bool ignoreStartCallback;
Brad Bishop4b916f12017-05-23 18:06:38 -0400109};
110
111/** @class PropertyWatchOfType
112 * @brief Type specific logic for PropertyWatch.
113 *
114 * @tparam DBusInterfaceType - DBus access delegate.
115 * @tparam T - The type of the properties being watched.
116 */
117template <typename T, typename DBusInterfaceType>
118class PropertyWatchOfType : public PropertyWatch<DBusInterfaceType>
119{
Brad Bishopd1eac882018-03-29 10:34:05 -0400120 public:
121 PropertyWatchOfType() = default;
122 PropertyWatchOfType(const PropertyWatchOfType&) = delete;
123 PropertyWatchOfType(PropertyWatchOfType&&) = default;
124 PropertyWatchOfType& operator=(const PropertyWatchOfType&) = delete;
125 PropertyWatchOfType& operator=(PropertyWatchOfType&&) = default;
126 ~PropertyWatchOfType() = default;
Matthew Barthefe01582019-09-09 15:22:37 -0500127 PropertyWatchOfType(const PropertyIndex& watchIndex, Callback& callback,
Lei YU98d64622022-05-24 19:11:23 +0800128 bool ignoreStartCallback = false,
Matthew Barthefe01582019-09-09 15:22:37 -0500129 Filters* filterOps = nullptr) :
Lei YU98d64622022-05-24 19:11:23 +0800130 PropertyWatch<DBusInterfaceType>(watchIndex, ignoreStartCallback,
131 &callback),
Matthew Barthae786ef2019-09-04 15:46:13 -0500132 filterOps(filterOps)
Brad Bishopd1eac882018-03-29 10:34:05 -0400133 {
134 }
Matthew Barthefe01582019-09-09 15:22:37 -0500135 PropertyWatchOfType(const PropertyIndex& watchIndex,
Lei YU98d64622022-05-24 19:11:23 +0800136 bool ignoreStartCallback = false,
Matthew Barthefe01582019-09-09 15:22:37 -0500137 Filters* filterOps = nullptr) :
Lei YU98d64622022-05-24 19:11:23 +0800138 PropertyWatch<DBusInterfaceType>(watchIndex, ignoreStartCallback,
139 nullptr),
Matthew Barthae786ef2019-09-04 15:46:13 -0500140 filterOps(filterOps)
Brad Bishopd1eac882018-03-29 10:34:05 -0400141 {
142 }
Brad Bishopfccdc392017-05-22 21:11:09 -0400143
Brad Bishopd1eac882018-03-29 10:34:05 -0400144 /** @brief PropertyMatch implementation for PropertyWatchOfType.
145 *
146 * @param[in] busName - The busname hosting the interface to query.
147 * @param[in] path - The path of the interface to query.
148 * @param[in] interface - The interface to query.
149 */
150 void updateProperties(const std::string& busName, const std::string& path,
151 const std::string& interface) override;
Brad Bishop4b916f12017-05-23 18:06:38 -0400152
Brad Bishopd1eac882018-03-29 10:34:05 -0400153 /** @brief PropertyMatch implementation for PropertyWatchOfType.
154 *
155 * @param[in] msg - The org.freedesktop.DBus.PropertiesChanged
156 * message.
157 * @param[in] path - The path associated with the message.
158 * @param[in] interface - The interface associated with the message.
159 */
160 void propertiesChanged(sdbusplus::message::message& msg,
161 const std::string& path,
162 const std::string& interface) override;
Brad Bishop4b916f12017-05-23 18:06:38 -0400163
Brad Bishopd1eac882018-03-29 10:34:05 -0400164 /** @brief DBus agnostic implementation of interfacesAdded.
165 *
166 * @param[in] path - The path of the properties that changed.
167 * @param[in] interface - The interface of the properties that
168 * changed.
169 * @param[in] properites - The properties that changed.
170 */
171 void propertiesChanged(const std::string& path,
172 const std::string& interface,
173 const PropertiesChanged<T>& properties);
Brad Bishop4b916f12017-05-23 18:06:38 -0400174
Brad Bishopd1eac882018-03-29 10:34:05 -0400175 /** @brief PropertyMatch implementation for PropertyWatchOfType.
176 *
177 * @param[in] msg - The org.freedesktop.DBus.PropertiesChanged
178 * message.
179 */
180 void interfacesAdded(sdbusplus::message::message& msg) override;
Brad Bishop4b916f12017-05-23 18:06:38 -0400181
Brad Bishopd1eac882018-03-29 10:34:05 -0400182 /** @brief DBus agnostic implementation of interfacesAdded.
183 *
184 * @param[in] path - The path of the added interfaces.
185 * @param[in] interfaces - The added interfaces.
186 */
187 void interfacesAdded(const std::string& path,
188 const InterfacesAdded<T>& interfaces);
Matthew Barthae786ef2019-09-04 15:46:13 -0500189
190 private:
Matthew Barthefe01582019-09-09 15:22:37 -0500191 /** @brief Optional filter operations to perform on property changes. */
192 Filters* const filterOps;
Brad Bishop4b916f12017-05-23 18:06:38 -0400193};
194
195} // namespace monitoring
196} // namespace dbus
197} // namespace phosphor