1#pragma once 2#include <sdbusplus/async/client.hpp> 3#include <type_traits> 4 5% for h in interface.cpp_includes(): 6#include <${h}> 7% endfor 8#include <${interface.headerFile("common")}> 9 10#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE 11namespace sdbusplus::${interface.old_cppNamespacedClass("client")} 12{ 13 14constexpr auto interface = 15 sdbusplus::common::${interface.cppNamespacedClass()}::interface; 16 17} // namespace sdbusplus::${interface.old_cppNamespacedClass("client")} 18#endif 19 20namespace sdbusplus::client::${interface.cppNamespace()} 21{ 22 23namespace details 24{ 25// forward declaration 26template <typename Proxy> 27class ${interface.classname}; 28} // namespace details 29 30/** Alias class so we can use the client in both a client_t aggregation 31 * and individually. 32 * 33 * sdbusplus::async::client_t<${interface.classname}>() or 34 * ${interface.classname}() both construct an equivalent instance. 35 */ 36template <typename Proxy = void> 37struct ${interface.classname} : 38 public std::conditional_t<std::is_void_v<Proxy>, 39 sdbusplus::async::client_t<details::${interface.classname}>, 40 details::${interface.classname}<Proxy>> 41{ 42 template <typename... Args> 43 ${interface.classname}(Args&&... args) : 44 std::conditional_t<std::is_void_v<Proxy>, 45 sdbusplus::async::client_t<details::${interface.classname}>, 46 details::${interface.classname}<Proxy>>( 47 std::forward<Args>(args)...) 48 {} 49}; 50 51namespace details 52{ 53 54template <typename Proxy> 55class ${interface.classname} : public sdbusplus::common::${interface.cppNamespacedClass()} 56{ 57 public: 58 template <bool, bool, bool, template <typename> typename...> 59 friend class sdbusplus::async::client::client; 60 template <typename> 61 friend struct sdbusplus::client::${interface.cppNamespacedClass()}; 62 63 // Delete default constructor as these should only be constructed 64 // indirectly through sdbusplus::async::client_t. 65 ${interface.classname}() = delete; 66 67 % for m in interface.methods: 68${m.render(loader, "method.client.hpp.mako", method=m, interface=interface)} 69 % endfor 70 % for p in interface.properties: 71${p.render(loader, "property.client.hpp.mako", property=p, interface=interface)} 72 % endfor 73 private: 74 // Conversion constructor from proxy used by client_t. 75 constexpr ${interface.classname}(sdbusplus::async::context& ctx, Proxy p) : 76 ctx(ctx), proxy(p.interface(interface)) 77 {} 78 79 sdbusplus::async::context& ctx{}; 80 decltype(std::declval<Proxy>().interface(interface)) proxy = {}; 81}; 82 83} // namespace details 84 85} // namespace sdbusplus::client::${interface.cppNamespace()} 86