blob: 7d9dfe88ead9b431d0f83dfe2f8f880a7626d698 [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{
10 /** Alias typedef for sd_bus_vtable */
11using vtable_t = sd_bus_vtable;
12
13 /** Create a SD_BUS_VTABLE_START entry. */
14constexpr vtable_t start(decltype(vtable_t::flags) flags = 0);
15
16 /** Create a SD_BUS_VTABLE_END entry. */
17constexpr 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,
42 sd_bus_message_handler_t handler,
43 size_t offset, 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{
103 constexpr auto no_reply = SD_BUS_VTABLE_METHOD_NO_REPLY;
104} // namespace method_
105
106namespace property_
107{
108 constexpr auto const_ = SD_BUS_VTABLE_PROPERTY_CONST;
109 constexpr auto emits_change = SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE;
110 constexpr auto emits_invalidation =
111 SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION;
112 constexpr auto explicit_ = SD_BUS_VTABLE_PROPERTY_EXPLICIT;
113} // namespace property_
114
115constexpr vtable_t start(decltype(vtable_t::flags) flags)
116{
117 vtable_t v{};
118 v.type = _SD_BUS_VTABLE_START;
119 v.flags = flags;
120 v.x.start = decltype(v.x.start){ sizeof(vtable_t) };
121
122 return v;
123}
124
125constexpr vtable_t end()
126{
127 vtable_t v{};
128 v.type = _SD_BUS_VTABLE_END;
129
130 return v;
131}
132
133constexpr vtable_t method(const char* member, const char* signature,
134 const char* result, sd_bus_message_handler_t handler,
135 decltype(vtable_t::flags) flags)
136{
Patrick Williamscb922df2016-10-17 14:55:20 -0500137 return method_o(member, signature, result, handler, 0, flags);
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500138}
139
Patrick Williamscb922df2016-10-17 14:55:20 -0500140constexpr vtable_t method_o(const char* member, const char* signature,
141 const char* result,
142 sd_bus_message_handler_t handler,
143 size_t offset, decltype(vtable_t::flags) flags)
Patrick Williams9d3ec7f2016-09-27 20:30:58 -0500144{
145 vtable_t v{};
146 v.type = _SD_BUS_VTABLE_METHOD;
147 v.flags = flags;
148 v.x.method =
149 decltype(v.x.method){ member, signature, result, handler, offset };
150
151 return v;
152}
153
154constexpr vtable_t signal(const char* member, const char* signature,
155 decltype(vtable_t::flags) flags)
156{
157 vtable_t v{};
158 v.type = _SD_BUS_VTABLE_SIGNAL;
159 v.flags = flags;
160 v.x.signal = decltype(v.x.signal){ member, signature };
161
162 return v;
163}
164
165constexpr vtable_t property(const char* member, const char* signature,
166 sd_bus_property_get_t get,
167 decltype(vtable_t::flags) flags)
168{
169 vtable_t v{};
170 v.type = _SD_BUS_VTABLE_PROPERTY;
171 v.flags = flags;
172 v.x.property = decltype(v.x.property){ member, signature, get, nullptr, 0 };
173
174 return v;
175}
176
177constexpr vtable_t property(const char* member, const char* signature,
178 sd_bus_property_get_t get,
179 sd_bus_property_set_t set,
180 decltype(vtable_t::flags) flags)
181{
182 vtable_t v{};
183 v.type = _SD_BUS_VTABLE_WRITABLE_PROPERTY;
184 v.flags = flags;
185 v.x.property = decltype(v.x.property){ member, signature, get, set, 0 };
186
187 return v;
188}
189
190constexpr vtable_t property_o(const char* member, const char* signature,
191 size_t offset,
192 decltype(vtable_t::flags) flags)
193{
194 vtable_t v{};
195 v.type = _SD_BUS_VTABLE_PROPERTY;
196 v.flags = flags;
197 v.x.property = decltype(v.x.property)
198 { member, signature, nullptr, nullptr, offset };
199
200 return v;
201}
202
203constexpr vtable_t property_o(const char* member, const char* signature,
204 sd_bus_property_set_t set, size_t offset,
205 decltype(vtable_t::flags) flags)
206{
207 vtable_t v{};
208 v.type = _SD_BUS_VTABLE_WRITABLE_PROPERTY;
209 v.flags = flags;
210 v.x.property = decltype(v.x.property)
211 { member, signature, nullptr, set, offset };
212
213 return v;
214
215}
216
217} // namespace vtable
218
219} // namespace sdbusplus