#pragma once #include namespace sdbusplus { namespace vtable { /** Alias typedef for sd_bus_vtable */ using vtable_t = sd_bus_vtable; /** Create a SD_BUS_VTABLE_START entry. */ constexpr vtable_t start(decltype(vtable_t::flags) flags = 0); /** Create a SD_BUS_VTABLE_END entry. */ constexpr vtable_t end(); /** Create a SD_BUS_VTABLE_METHOD entry. * * @param[in] member - Name of method. * @param[in] signature - Signature of method. * @param[in] result - Signature of result. * @param[in] handler - Functor to call on method invocation. * @param[in] flags - optional sdbusplus::vtable::method_ value. */ constexpr vtable_t method(const char* member, const char* signature, const char* result, sd_bus_message_handler_t handler, decltype(vtable_t::flags) flags = 0); /** Create a SD_BUS_VTABLE_METHOD_WITH_OFFSET entry. * * @param[in] member - Name of method. * @param[in] signature - Signature of method. * @param[in] result - Signature of result. * @param[in] handler - Functor to call on method invocation. * @param[in] offset - Offset. * @param[in] flags - optional sdbusplus::vtable::method_ value. */ constexpr vtable_t 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 = 0); /** Create a SD_BUS_SIGNAL entry. * * @param[in] member - Name of signal. * @param[in] signature - Signature of signal. * @param[in] flags - None supported. */ constexpr vtable_t signal(const char* member, const char* signature, decltype(vtable_t::flags) flags = 0); /** Create a SD_BUS_PROPERTY entry. * * @param[in] member - Name of signal. * @param[in] signature - Signature of signal. * @param[in] get - Functor to call on property get. * @param[in] flags - optional sdbusplus::vtable::property_ value. */ constexpr vtable_t property(const char* member, const char* signature, sd_bus_property_get_t get, decltype(vtable_t::flags) flags = 0); /** Create a SD_BUS_WRITABLE_PROPERTY entry. * * @param[in] member - Name of signal. * @param[in] signature - Signature of signal. * @param[in] get - Functor to call on property get. * @param[in] set - Functor to call on property set. * @param[in] flags - optional sdbusplus::vtable::property_ value. */ constexpr vtable_t property(const char* member, const char* signature, sd_bus_property_get_t get, sd_bus_property_set_t set, decltype(vtable_t::flags) flags = 0); /** Create a SD_BUS_PROPERTY entry. * * @param[in] member - Name of signal. * @param[in] signature - Signature of signal. * @param[in] offset - Offset within object for property. * @param[in] flags - optional sdbusplus::vtable::property_ value. */ constexpr vtable_t property_o(const char* member, const char* signature, size_t offset, decltype(vtable_t::flags) flags = 0); /** Create a SD_BUS_WRITABLE_PROPERTY entry. * * @param[in] member - Name of signal. * @param[in] signature - Signature of signal. * @param[in] set - Functor to call on property set. * @param[in] offset - Offset within object for property. * @param[in] flags - optional sdbusplus::vtable::property_ value. */ constexpr vtable_t property_o(const char* member, const char* signature, sd_bus_property_set_t set, size_t offset, decltype(vtable_t::flags) flags = 0); namespace method_ { constexpr auto no_reply = SD_BUS_VTABLE_METHOD_NO_REPLY; } // namespace method_ namespace property_ { constexpr auto const_ = SD_BUS_VTABLE_PROPERTY_CONST; constexpr auto emits_change = SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE; constexpr auto emits_invalidation = SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION; constexpr auto explicit_ = SD_BUS_VTABLE_PROPERTY_EXPLICIT; } // namespace property_ constexpr vtable_t start(decltype(vtable_t::flags) flags) { vtable_t v{}; v.type = _SD_BUS_VTABLE_START; v.flags = flags; v.x.start = decltype(v.x.start){sizeof(vtable_t)}; return v; } constexpr vtable_t end() { vtable_t v{}; v.type = _SD_BUS_VTABLE_END; return v; } constexpr vtable_t method(const char* member, const char* signature, const char* result, sd_bus_message_handler_t handler, decltype(vtable_t::flags) flags) { return method_o(member, signature, result, handler, 0, flags); } constexpr vtable_t 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) { vtable_t v{}; v.type = _SD_BUS_VTABLE_METHOD; v.flags = flags; v.x.method = decltype(v.x.method){member, signature, result, handler, offset}; return v; } constexpr vtable_t signal(const char* member, const char* signature, decltype(vtable_t::flags) flags) { vtable_t v{}; v.type = _SD_BUS_VTABLE_SIGNAL; v.flags = flags; v.x.signal = decltype(v.x.signal){member, signature}; return v; } constexpr vtable_t property(const char* member, const char* signature, sd_bus_property_get_t get, decltype(vtable_t::flags) flags) { vtable_t v{}; v.type = _SD_BUS_VTABLE_PROPERTY; v.flags = flags; v.x.property = decltype(v.x.property){member, signature, get, nullptr, 0}; return v; } constexpr vtable_t property(const char* member, const char* signature, sd_bus_property_get_t get, sd_bus_property_set_t set, decltype(vtable_t::flags) flags) { vtable_t v{}; v.type = _SD_BUS_VTABLE_WRITABLE_PROPERTY; v.flags = flags; v.x.property = decltype(v.x.property){member, signature, get, set, 0}; return v; } constexpr vtable_t property_o(const char* member, const char* signature, size_t offset, decltype(vtable_t::flags) flags) { vtable_t v{}; v.type = _SD_BUS_VTABLE_PROPERTY; v.flags = flags; v.x.property = decltype(v.x.property){member, signature, nullptr, nullptr, offset}; return v; } constexpr vtable_t property_o(const char* member, const char* signature, sd_bus_property_set_t set, size_t offset, decltype(vtable_t::flags) flags) { vtable_t v{}; v.type = _SD_BUS_VTABLE_WRITABLE_PROPERTY; v.flags = flags; v.x.property = decltype(v.x.property){member, signature, nullptr, set, offset}; return v; } } // namespace vtable } // namespace sdbusplus