blob: 939346ea111e80d685b958ea3b902bbd24057821 [file] [log] [blame]
#pragma once
#include <systemd/sd-bus.h>
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