1 #pragma once
2
3 #include <systemd/sd-bus.h>
4
5 namespace sdbusplus
6 {
7
8 namespace vtable
9 {
10 /** Alias typedef for sd_bus_vtable */
11 using vtable_t = sd_bus_vtable;
12
13 /** Create a SD_BUS_VTABLE_START entry. */
14 constexpr vtable_t start(decltype(vtable_t::flags) flags = 0);
15
16 /** Create a SD_BUS_VTABLE_END entry. */
17 constexpr 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 */
27 constexpr 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 */
40 constexpr vtable_t method_o(const char* member, const char* signature,
41 const char* result,
42 sd_bus_message_handler_t handler, size_t offset,
43 decltype(vtable_t::flags) flags = 0);
44
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 */
51 constexpr 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 */
61 constexpr 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 */
73 constexpr 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] get - Functor to call on property get.
83 * @param[in] offset - Offset within object for property.
84 * @param[in] flags - optional sdbusplus::vtable::property_ value.
85 */
86 constexpr vtable_t property_o(const char* member, const char* signature,
87 sd_bus_property_get_t get, size_t offset,
88 decltype(vtable_t::flags) flags = 0);
89
90 /** Create a SD_BUS_WRITABLE_PROPERTY entry.
91 *
92 * @param[in] member - Name of signal.
93 * @param[in] signature - Signature of signal.
94 * @param[in] get - Functor to call on property get.
95 * @param[in] set - Functor to call on property set.
96 * @param[in] offset - Offset within object for property.
97 * @param[in] flags - optional sdbusplus::vtable::property_ value.
98 */
99 constexpr vtable_t property_o(const char* member, const char* signature,
100 sd_bus_property_get_t get,
101 sd_bus_property_set_t set, size_t offset,
102 decltype(vtable_t::flags) flags = 0);
103
104 namespace common_
105 {
106 constexpr auto deprecated = SD_BUS_VTABLE_DEPRECATED;
107 constexpr auto hidden = SD_BUS_VTABLE_HIDDEN;
108 constexpr auto unprivileged = SD_BUS_VTABLE_UNPRIVILEGED;
109 } // namespace common_
110
111 namespace method_
112 {
113 constexpr auto no_reply = SD_BUS_VTABLE_METHOD_NO_REPLY;
114 } // namespace method_
115
116 namespace property_
117 {
118 constexpr auto const_ = SD_BUS_VTABLE_PROPERTY_CONST;
119 constexpr auto emits_change = SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE;
120 constexpr auto emits_invalidation = SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION;
121 constexpr auto explicit_ = SD_BUS_VTABLE_PROPERTY_EXPLICIT;
122 constexpr auto none = decltype(vtable_t::flags){};
123 } // namespace property_
124
start(decltype(vtable_t::flags)flags)125 constexpr vtable_t start(decltype(vtable_t::flags) flags)
126 {
127 return vtable_t SD_BUS_VTABLE_START(flags);
128 }
129
end()130 constexpr vtable_t end()
131 {
132 return vtable_t SD_BUS_VTABLE_END;
133 }
134
method(const char * member,const char * signature,const char * result,sd_bus_message_handler_t handler,decltype(vtable_t::flags)flags)135 constexpr vtable_t method(const char* member, const char* signature,
136 const char* result, sd_bus_message_handler_t handler,
137 decltype(vtable_t::flags) flags)
138 {
139 return vtable_t SD_BUS_METHOD(member, signature, result, handler, flags);
140 }
141
method_o(const char * member,const char * signature,const char * result,sd_bus_message_handler_t handler,size_t offset,decltype(vtable_t::flags)flags)142 constexpr vtable_t method_o(const char* member, const char* signature,
143 const char* result,
144 sd_bus_message_handler_t handler, size_t offset,
145 decltype(vtable_t::flags) flags)
146 {
147 return vtable_t SD_BUS_METHOD_WITH_OFFSET(member, signature, result,
148 handler, offset, flags);
149 }
150
signal(const char * member,const char * signature,decltype(vtable_t::flags)flags)151 constexpr vtable_t signal(const char* member, const char* signature,
152 decltype(vtable_t::flags) flags)
153 {
154 return vtable_t SD_BUS_SIGNAL(member, signature, flags);
155 }
156
property(const char * member,const char * signature,sd_bus_property_get_t get,decltype(vtable_t::flags)flags)157 constexpr vtable_t property(const char* member, const char* signature,
158 sd_bus_property_get_t get,
159 decltype(vtable_t::flags) flags)
160 {
161 return vtable_t SD_BUS_PROPERTY(member, signature, get, 0, flags);
162 }
163
property(const char * member,const char * signature,sd_bus_property_get_t get,sd_bus_property_set_t set,decltype(vtable_t::flags)flags)164 constexpr vtable_t property(const char* member, const char* signature,
165 sd_bus_property_get_t get,
166 sd_bus_property_set_t set,
167 decltype(vtable_t::flags) flags)
168 {
169 return vtable_t SD_BUS_WRITABLE_PROPERTY(member, signature, get, set, 0,
170 flags);
171 }
172
property_o(const char * member,const char * signature,sd_bus_property_get_t get,size_t offset,decltype(vtable_t::flags)flags)173 constexpr vtable_t property_o(const char* member, const char* signature,
174 sd_bus_property_get_t get, size_t offset,
175 decltype(vtable_t::flags) flags)
176 {
177 return vtable_t SD_BUS_PROPERTY(member, signature, get, offset, flags);
178 }
179
property_o(const char * member,const char * signature,sd_bus_property_get_t get,sd_bus_property_set_t set,size_t offset,decltype(vtable_t::flags)flags)180 constexpr vtable_t property_o(const char* member, const char* signature,
181 sd_bus_property_get_t get,
182 sd_bus_property_set_t set, size_t offset,
183 decltype(vtable_t::flags) flags)
184 {
185 return vtable_t SD_BUS_WRITABLE_PROPERTY(member, signature, get, set,
186 offset, flags);
187 }
188
189 } // namespace vtable
190
191 using vtable_t = vtable::vtable_t;
192
193 } // namespace sdbusplus
194