blob: 939346ea111e80d685b958ea3b902bbd24057821 [file] [log] [blame]
Patrick Williams9d3ec7f2016-09-27 20:30:58 -05001#pragma once
2
3#include <systemd/sd-bus.h>
4
5namespace sdbusplus
6{
7
8namespace vtable
9{
Andrew Geissler072da3e2018-01-18 07:21:42 -080010/** Alias typedef for sd_bus_vtable */
Patrick Williams9d3ec7f2016-09-27 20:30:58 -050011using vtable_t = sd_bus_vtable;
12
Andrew Geissler072da3e2018-01-18 07:21:42 -080013/** Create a SD_BUS_VTABLE_START entry. */
Patrick Williams9d3ec7f2016-09-27 20:30:58 -050014constexpr vtable_t start(decltype(vtable_t::flags) flags = 0);
15
Andrew Geissler072da3e2018-01-18 07:21:42 -080016/** Create a SD_BUS_VTABLE_END entry. */
Patrick Williams9d3ec7f2016-09-27 20:30:58 -050017constexpr vtable_t end();
18
19/** Create a SD_BUS_VTABLE_METHOD entry.
20 *
21 * @param[in] member - Name of method.
22 * @param[in] signature - Signature of method.
23 * @param[in] result - Signature of result.
24 * @param[in] handler - Functor to call on method invocation.
25 * @param[in] flags - optional sdbusplus::vtable::method_ value.
26 */
27constexpr vtable_t method(const char* member, const char* signature,
28 const char* result, sd_bus_message_handler_t handler,
29 decltype(vtable_t::flags) flags = 0);
30
31/** Create a SD_BUS_VTABLE_METHOD_WITH_OFFSET entry.
32 *
33 * @param[in] member - Name of method.
34 * @param[in] signature - Signature of method.
35 * @param[in] result - Signature of result.
36 * @param[in] handler - Functor to call on method invocation.
37 * @param[in] offset - Offset.
38 * @param[in] flags - optional sdbusplus::vtable::method_ value.
39 */
Patrick Williamscb922df2016-10-17 14:55:20 -050040constexpr vtable_t method_o(const char* member, const char* signature,
41 const char* result,
Andrew Geissler072da3e2018-01-18 07:21:42 -080042 sd_bus_message_handler_t handler, size_t offset,
43 decltype(vtable_t::flags) flags = 0);
Patrick Williams9d3ec7f2016-09-27 20:30:58 -050044
45/** Create a SD_BUS_SIGNAL entry.
46 *
47 * @param[in] member - Name of signal.
48 * @param[in] signature - Signature of signal.
49 * @param[in] flags - None supported.
50 */
51constexpr vtable_t signal(const char* member, const char* signature,
52 decltype(vtable_t::flags) flags = 0);
53
54/** Create a SD_BUS_PROPERTY entry.
55 *
56 * @param[in] member - Name of signal.
57 * @param[in] signature - Signature of signal.
58 * @param[in] get - Functor to call on property get.
59 * @param[in] flags - optional sdbusplus::vtable::property_ value.
60 */
61constexpr vtable_t property(const char* member, const char* signature,
62 sd_bus_property_get_t get,
63 decltype(vtable_t::flags) flags = 0);
64
65/** Create a SD_BUS_WRITABLE_PROPERTY entry.
66 *
67 * @param[in] member - Name of signal.
68 * @param[in] signature - Signature of signal.
69 * @param[in] get - Functor to call on property get.
70 * @param[in] set - Functor to call on property set.
71 * @param[in] flags - optional sdbusplus::vtable::property_ value.
72 */
73constexpr vtable_t property(const char* member, const char* signature,
74 sd_bus_property_get_t get,
75 sd_bus_property_set_t set,
76 decltype(vtable_t::flags) flags = 0);
77
78/** Create a SD_BUS_PROPERTY entry.
79 *
80 * @param[in] member - Name of signal.
81 * @param[in] signature - Signature of signal.
82 * @param[in] offset - Offset within object for property.
83 * @param[in] flags - optional sdbusplus::vtable::property_ value.
84 */
85constexpr vtable_t property_o(const char* member, const char* signature,
86 size_t offset,
87 decltype(vtable_t::flags) flags = 0);
88
89/** Create a SD_BUS_WRITABLE_PROPERTY entry.
90 *
91 * @param[in] member - Name of signal.
92 * @param[in] signature - Signature of signal.
93 * @param[in] set - Functor to call on property set.
94 * @param[in] offset - Offset within object for property.
95 * @param[in] flags - optional sdbusplus::vtable::property_ value.
96 */
97constexpr vtable_t property_o(const char* member, const char* signature,
98 sd_bus_property_set_t set, size_t offset,
99 decltype(vtable_t::flags) flags = 0);
100
101namespace method_
102{
Andrew Geissler072da3e2018-01-18 07:21:42 -0800103constexpr auto no_reply = SD_BUS_VTABLE_METHOD_NO_REPLY;
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500104} // namespace method_
105
106namespace property_
107{
Andrew Geissler072da3e2018-01-18 07:21:42 -0800108constexpr auto const_ = SD_BUS_VTABLE_PROPERTY_CONST;
109constexpr auto emits_change = SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE;
110constexpr auto emits_invalidation = SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION;
111constexpr auto explicit_ = SD_BUS_VTABLE_PROPERTY_EXPLICIT;
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500112} // namespace property_
113
114constexpr vtable_t start(decltype(vtable_t::flags) flags)
115{
116 vtable_t v{};
117 v.type = _SD_BUS_VTABLE_START;
118 v.flags = flags;
Andrew Geissler072da3e2018-01-18 07:21:42 -0800119 v.x.start = decltype(v.x.start){sizeof(vtable_t)};
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500120
121 return v;
122}
123
124constexpr vtable_t end()
125{
126 vtable_t v{};
127 v.type = _SD_BUS_VTABLE_END;
128
129 return v;
130}
131
132constexpr vtable_t method(const char* member, const char* signature,
133 const char* result, sd_bus_message_handler_t handler,
134 decltype(vtable_t::flags) flags)
135{
Patrick Williamscb922df2016-10-17 14:55:20 -0500136 return method_o(member, signature, result, handler, 0, flags);
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500137}
138
Patrick Williamscb922df2016-10-17 14:55:20 -0500139constexpr vtable_t method_o(const char* member, const char* signature,
140 const char* result,
Andrew Geissler072da3e2018-01-18 07:21:42 -0800141 sd_bus_message_handler_t handler, size_t offset,
142 decltype(vtable_t::flags) flags)
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500143{
144 vtable_t v{};
145 v.type = _SD_BUS_VTABLE_METHOD;
146 v.flags = flags;
147 v.x.method =
Andrew Geissler072da3e2018-01-18 07:21:42 -0800148 decltype(v.x.method){member, signature, result, handler, offset};
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500149
150 return v;
151}
152
153constexpr vtable_t signal(const char* member, const char* signature,
154 decltype(vtable_t::flags) flags)
155{
156 vtable_t v{};
157 v.type = _SD_BUS_VTABLE_SIGNAL;
158 v.flags = flags;
Andrew Geissler072da3e2018-01-18 07:21:42 -0800159 v.x.signal = decltype(v.x.signal){member, signature};
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500160
161 return v;
162}
163
164constexpr vtable_t property(const char* member, const char* signature,
165 sd_bus_property_get_t get,
166 decltype(vtable_t::flags) flags)
167{
168 vtable_t v{};
169 v.type = _SD_BUS_VTABLE_PROPERTY;
170 v.flags = flags;
Andrew Geissler072da3e2018-01-18 07:21:42 -0800171 v.x.property = decltype(v.x.property){member, signature, get, nullptr, 0};
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500172
173 return v;
174}
175
176constexpr vtable_t property(const char* member, const char* signature,
177 sd_bus_property_get_t get,
178 sd_bus_property_set_t set,
179 decltype(vtable_t::flags) flags)
180{
181 vtable_t v{};
182 v.type = _SD_BUS_VTABLE_WRITABLE_PROPERTY;
183 v.flags = flags;
Andrew Geissler072da3e2018-01-18 07:21:42 -0800184 v.x.property = decltype(v.x.property){member, signature, get, set, 0};
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500185
186 return v;
187}
188
189constexpr vtable_t property_o(const char* member, const char* signature,
Andrew Geissler072da3e2018-01-18 07:21:42 -0800190 size_t offset, decltype(vtable_t::flags) flags)
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500191{
192 vtable_t v{};
193 v.type = _SD_BUS_VTABLE_PROPERTY;
194 v.flags = flags;
Andrew Geissler072da3e2018-01-18 07:21:42 -0800195 v.x.property =
196 decltype(v.x.property){member, signature, nullptr, nullptr, offset};
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500197
198 return v;
199}
200
201constexpr vtable_t property_o(const char* member, const char* signature,
202 sd_bus_property_set_t set, size_t offset,
203 decltype(vtable_t::flags) flags)
204{
205 vtable_t v{};
206 v.type = _SD_BUS_VTABLE_WRITABLE_PROPERTY;
207 v.flags = flags;
Andrew Geissler072da3e2018-01-18 07:21:42 -0800208 v.x.property =
209 decltype(v.x.property){member, signature, nullptr, set, offset};
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500210
211 return v;
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500212}
213
214} // namespace vtable
215
216} // namespace sdbusplus