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()}> 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 Client, 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 Client = void, typename Proxy = void> 37struct ${interface.classname} : 38 public std::conditional_t<std::is_void_v<Client>, 39 sdbusplus::async::client_t<details::${interface.classname}>, 40 details::${interface.classname}<Client, Proxy>> 41{ 42 template <typename... Args> 43 ${interface.classname}(Args&&... args) : 44 std::conditional_t<std::is_void_v<Client>, 45 sdbusplus::async::client_t<details::${interface.classname}>, 46 details::${interface.classname}<Client, Proxy>>( 47 std::forward<Args>(args)...) 48 {} 49}; 50 51namespace details 52{ 53 54template <typename Client, typename Proxy> 55class ${interface.classname} : 56 public sdbusplus::common::${interface.cppNamespacedClass()}, 57 public sdbusplus::async::client::details::client_context_friend 58{ 59 public: 60 friend Client; 61 template <typename> 62 friend struct sdbusplus::client::${interface.cppNamespacedClass()}; 63 64 // Delete default constructor as these should only be constructed 65 // indirectly through sdbusplus::async::client_t. 66 ${interface.classname}() = delete; 67 68 % for m in interface.methods: 69${m.render(loader, "method.client.hpp.mako", method=m, interface=interface)} 70 % endfor 71 % for p in interface.properties: 72${p.render(loader, "property.client.hpp.mako", property=p, interface=interface)} 73 % endfor 74 private: 75 // Conversion constructor from proxy used by client_t. 76 explicit constexpr ${interface.classname}(Proxy p) : 77 proxy(p.interface(interface)) 78 {} 79 80 sdbusplus::async::context& context() 81 { 82 return sdbusplus::async::client::details::client_context_friend:: 83 context<Client>(); 84 } 85 86 decltype(std::declval<Proxy>().interface(interface)) proxy = {}; 87}; 88 89} // namespace details 90 91} // namespace sdbusplus::client::${interface.cppNamespace()} 92