blob: 4ed3375ad0b0ef6cb40d7a287045c7c6da0abecf [file] [log] [blame]
#pragma once
#include <sdbusplus/async/client.hpp>
#include <type_traits>
% for h in interface.cpp_includes():
#include <${h}>
% endfor
#include <${interface.headerFile()}>
namespace sdbusplus::client::${interface.cppNamespace()}
{
namespace details
{
// forward declaration
template <typename Client, typename Proxy>
class ${interface.classname};
} // namespace details
/** Alias class so we can use the client in both a client_t aggregation
* and individually.
*
* sdbusplus::async::client_t<${interface.classname}>() or
* ${interface.classname}() both construct an equivalent instance.
*/
template <typename Client = void, typename Proxy = void>
struct ${interface.classname} :
public std::conditional_t<std::is_void_v<Client>,
sdbusplus::async::client_t<details::${interface.classname}>,
details::${interface.classname}<Client, Proxy>>
{
template <typename... Args>
${interface.classname}(Args&&... args) :
std::conditional_t<std::is_void_v<Client>,
sdbusplus::async::client_t<details::${interface.classname}>,
details::${interface.classname}<Client, Proxy>>(
std::forward<Args>(args)...)
{}
};
namespace details
{
template <typename Client, typename Proxy>
class ${interface.classname} :
public sdbusplus::common::${interface.cppNamespacedClass()},
private sdbusplus::async::client::details::client_context_friend
{
public:
friend Client;
template <typename, typename>
friend struct sdbusplus::client::${interface.cppNamespacedClass()};
// Delete default constructor as these should only be constructed
// indirectly through sdbusplus::async::client_t.
${interface.classname}() = delete;
% for m in interface.methods:
${m.render(loader, "method.client.hpp.mako", method=m, interface=interface)}
% endfor
% for p in interface.properties:
${p.render(loader, "property.client.hpp.mako", property=p, interface=interface)}
% endfor
private:
// Conversion constructor from proxy used by client_t.
explicit constexpr ${interface.classname}(Proxy p) :
proxy(p.interface(interface))
{}
sdbusplus::async::context& context()
{
return sdbusplus::async::client::details::client_context_friend::
context<Client, ${interface.classname}>(this);
}
decltype(std::declval<Proxy>().interface(interface)) proxy = {};
};
} // namespace details
} // namespace sdbusplus::client::${interface.cppNamespace()}