sdbus-c++ 2.3.0
High-level C++ D-Bus library based on systemd D-Bus implementation
Loading...
Searching...
No Matches
ConvenienceApiClasses.h
Go to the documentation of this file.
1
26
27#ifndef SDBUS_CXX_CONVENIENCEAPICLASSES_H_
28#define SDBUS_CXX_CONVENIENCEAPICLASSES_H_
29
30#include <sdbus-c++/Awaitable.h>
31#include <sdbus-c++/Message.h>
33#include <sdbus-c++/Types.h>
35
36#include <chrono>
37#include <cstdint>
38#include <future>
39#include <map>
40#include <string>
41#include <string_view>
42#include <vector>
43
44// Forward declarations
45namespace sdbus {
46 class IObject;
47 class IProxy;
48 class Error;
49 class PendingAsyncCall;
50} // namespace sdbus
51
52namespace sdbus {
53
54 class VTableAdder
55 {
56 public:
57 void forInterface(InterfaceName interfaceName);
58 void forInterface(std::string interfaceName);
59 [[nodiscard]] Slot forInterface(InterfaceName interfaceName, return_slot_t);
60 [[nodiscard]] Slot forInterface(std::string interfaceName, return_slot_t);
61
62 private:
63 friend IObject;
64 VTableAdder(IObject& object, std::vector<VTableItem> vtable);
65
66 IObject& object_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
67 std::vector<VTableItem> vtable_;
68 };
69
70 class SignalEmitter
71 {
72 public:
73 SignalEmitter& onInterface(const InterfaceName& interfaceName);
74 SignalEmitter& onInterface(const std::string& interfaceName);
75 SignalEmitter& onInterface(const char* interfaceName);
76 template <typename... Args> void withArguments(Args&&... args);
77
78 SignalEmitter(const SignalEmitter&) = delete;
79 SignalEmitter& operator=(const SignalEmitter&) = delete;
80 SignalEmitter(SignalEmitter&& other) = default;
81 SignalEmitter& operator=(SignalEmitter&&) = delete;
82 ~SignalEmitter() noexcept(false);
83
84 private:
85 friend IObject;
86 SignalEmitter(IObject& object, const SignalName& signalName);
87 SignalEmitter(IObject& object, const char* signalName);
88
89 IObject& object_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
90 const char* signalName_;
91 Signal signal_;
92 int exceptions_{}; // Number of active exceptions when SignalEmitter is constructed
93 };
94
95 class MethodInvoker
96 {
97 public:
98 MethodInvoker& onInterface(const InterfaceName& interfaceName);
99 MethodInvoker& onInterface(const std::string& interfaceName);
100 MethodInvoker& onInterface(const char* interfaceName);
101 MethodInvoker& withTimeout(uint64_t usec);
102 template <typename Rep, typename Period>
103 MethodInvoker& withTimeout(const std::chrono::duration<Rep, Period>& timeout);
104 template <typename... Args> MethodInvoker& withArguments(Args&&... args);
105 template <typename... Args> void storeResultsTo(Args&... args);
106 void dontExpectReply();
107
108 MethodInvoker(const MethodInvoker&) = delete;
109 MethodInvoker& operator=(const MethodInvoker&) = delete;
110 MethodInvoker(MethodInvoker&& other) = default;
111 MethodInvoker& operator=(MethodInvoker&&) = delete;
112 ~MethodInvoker() noexcept(false);
113
114 private:
115 friend IProxy;
116 MethodInvoker(IProxy& proxy, const MethodName& methodName);
117 MethodInvoker(IProxy& proxy, const char* methodName);
118
119 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
120 const char* methodName_;
121 uint64_t timeout_{};
122 MethodCall method_;
123 int exceptions_{}; // Number of active exceptions when MethodInvoker is constructed
124 bool methodCalled_{};
125 };
126
127 class AsyncMethodInvoker
128 {
129 public:
130 AsyncMethodInvoker& onInterface(const InterfaceName& interfaceName);
131 AsyncMethodInvoker& onInterface(const std::string& interfaceName);
132 AsyncMethodInvoker& onInterface(const char* interfaceName);
133 AsyncMethodInvoker& withTimeout(uint64_t usec);
134 template <typename Rep, typename Period>
135 AsyncMethodInvoker& withTimeout(const std::chrono::duration<Rep, Period>& timeout);
136 template <typename... Args> AsyncMethodInvoker& withArguments(Args&&... args);
137 template <typename Function> PendingAsyncCall uponReplyInvoke(Function&& callback);
138 template <typename Function> [[nodiscard]] Slot uponReplyInvoke(Function&& callback, return_slot_t);
139 // Returned future will be std::future<void> for no (void) D-Bus method return value
140 // or std::future<T> for single D-Bus method return value
141 // or std::future<std::tuple<...>> for multiple method return values
142 template <typename... Args> std::future<future_return_t<Args...>> getResultAsFuture();
143 template <typename... Args> Awaitable<awaitable_return_t<Args...>> getResultAsAwaitable();
144
145 private:
146 friend IProxy;
147 AsyncMethodInvoker(IProxy& proxy, const MethodName& methodName);
148 AsyncMethodInvoker(IProxy& proxy, const char* methodName);
149 template <typename Function> async_reply_handler makeAsyncReplyHandler(Function&& callback);
150
151 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
152 const char* methodName_;
153 uint64_t timeout_{};
154 MethodCall method_;
155 };
156
157 class SignalSubscriber
158 {
159 public:
160 SignalSubscriber& onInterface(const InterfaceName& interfaceName);
161 SignalSubscriber& onInterface(const std::string& interfaceName);
162 SignalSubscriber& onInterface(const char* interfaceName);
163 template <typename Function> void call(Function&& callback);
164 template <typename Function> [[nodiscard]] Slot call(Function&& callback, return_slot_t);
165
166 private:
167 friend IProxy;
168 SignalSubscriber(IProxy& proxy, const SignalName& signalName);
169 SignalSubscriber(IProxy& proxy, const char* signalName);
170 template <typename Function> signal_handler makeSignalHandler(Function&& callback);
171
172 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
173 const char* signalName_;
174 const char* interfaceName_{};
175 };
176
177 class PropertyGetter
178 {
179 public:
180 Variant onInterface(std::string_view interfaceName);
181
182 private:
183 friend IProxy;
184 PropertyGetter(IProxy& proxy, std::string_view propertyName);
185
186 static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";
187
188 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
189 std::string_view propertyName_;
190 };
191
192 class AsyncPropertyGetter
193 {
194 public:
195 AsyncPropertyGetter& onInterface(std::string_view interfaceName);
196 template <typename Function> PendingAsyncCall uponReplyInvoke(Function&& callback);
197 template <typename Function> [[nodiscard]] Slot uponReplyInvoke(Function&& callback, return_slot_t);
198 std::future<Variant> getResultAsFuture();
199 Awaitable<Variant> getResultAsAwaitable();
200
201 private:
202 friend IProxy;
203 AsyncPropertyGetter(IProxy& proxy, std::string_view propertyName);
204
205 static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";
206
207 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
208 std::string_view propertyName_;
209 std::string_view interfaceName_;
210 };
211
212 class PropertySetter
213 {
214 public:
215 PropertySetter& onInterface(std::string_view interfaceName);
216 template <typename Value> void toValue(const Value& value);
217 template <typename Value> void toValue(const Value& value, dont_expect_reply_t);
218 void toValue(const Variant& value);
219 void toValue(const Variant& value, dont_expect_reply_t);
220
221 private:
222 friend IProxy;
223 PropertySetter(IProxy& proxy, std::string_view propertyName);
224
225 static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";
226
227 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
228 std::string_view propertyName_;
229 std::string_view interfaceName_;
230 };
231
232 class AsyncPropertySetter
233 {
234 public:
235 AsyncPropertySetter& onInterface(std::string_view interfaceName);
236 template <typename Value> AsyncPropertySetter& toValue(Value&& value);
237 AsyncPropertySetter& toValue(Variant value);
238 template <typename Function> PendingAsyncCall uponReplyInvoke(Function&& callback);
239 template <typename Function> [[nodiscard]] Slot uponReplyInvoke(Function&& callback, return_slot_t);
240 std::future<void> getResultAsFuture();
241 Awaitable<void> getResultAsAwaitable();
242
243 private:
244 friend IProxy;
245 AsyncPropertySetter(IProxy& proxy, std::string_view propertyName);
246
247 static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";
248
249 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
250 std::string_view propertyName_;
251 std::string_view interfaceName_;
252 Variant value_;
253 };
254
255 class AllPropertiesGetter
256 {
257 public:
258 std::map<PropertyName, Variant> onInterface(std::string_view interfaceName);
259
260 private:
261 friend IProxy;
262 explicit AllPropertiesGetter(IProxy& proxy);
263
264 static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";
265
266 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
267 };
268
269 class AsyncAllPropertiesGetter
270 {
271 public:
272 AsyncAllPropertiesGetter& onInterface(std::string_view interfaceName);
273 template <typename Function> PendingAsyncCall uponReplyInvoke(Function&& callback);
274 template <typename Function> [[nodiscard]] Slot uponReplyInvoke(Function&& callback, return_slot_t);
275 std::future<std::map<PropertyName, Variant>> getResultAsFuture();
276 Awaitable<std::map<PropertyName, Variant>> getResultAsAwaitable();
277
278 private:
279 friend IProxy;
280 explicit AsyncAllPropertiesGetter(IProxy& proxy);
281
282 static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";
283
284 IProxy& proxy_; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
285 std::string_view interfaceName_;
286 };
287
288} // namespace sdbus
289
290#endif /* SDBUS_CXX_CONVENIENCEAPICLASSES_H_ */
Definition Awaitable.h:110
Definition Error.h:44
Definition IObject.h:63
Definition IProxy.h:70
Definition Types.h:251
Definition Message.h:278
Definition IProxy.h:721
Definition Message.h:314
Definition Types.h:56
Definition TypeTraits.h:107
Definition TypeTraits.h:88