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