Patrick Williams | 386e8d2 | 2016-11-16 16:13:57 -0600 | [diff] [blame] | 1 | #include <algorithm> |
William A. Kennington III | 4274c11 | 2018-11-26 09:50:13 -0800 | [diff] [blame] | 2 | #include <map> |
Patrick Venture | 263712f | 2018-04-16 14:19:08 -0700 | [diff] [blame] | 3 | #include <sdbusplus/sdbus.hpp> |
Patrick Williams | 0966ce8 | 2016-10-17 21:54:09 -0500 | [diff] [blame] | 4 | #include <sdbusplus/server.hpp> |
Patrick Williams | 31691cf | 2016-11-13 19:07:09 -0600 | [diff] [blame] | 5 | #include <sdbusplus/exception.hpp> |
William A. Kennington III | 4274c11 | 2018-11-26 09:50:13 -0800 | [diff] [blame] | 6 | #include <string> |
| 7 | #include <tuple> |
| 8 | #include <variant> |
| 9 | |
Patrick Williams | 831839a | 2016-10-16 18:09:00 -0500 | [diff] [blame] | 10 | #include <${"/".join(interface.name.split('.') + [ 'server.hpp' ])}> |
William A. Kennington III | 3cf374e | 2019-04-03 20:40:16 -0700 | [diff] [blame] | 11 | % for m in interface.methods + interface.properties + interface.signals: |
Patrick Williams | 31691cf | 2016-11-13 19:07:09 -0600 | [diff] [blame] | 12 | ${ m.cpp_prototype(loader, interface=interface, ptype='callback-cpp-includes') } |
| 13 | % endfor |
Abhishek Pandit | aa71a3e | 2016-11-10 13:33:17 -0800 | [diff] [blame] | 14 | <% |
| 15 | namespaces = interface.name.split('.') |
| 16 | classname = namespaces.pop() |
Patrick Williams | a475c03 | 2016-10-18 22:03:41 -0500 | [diff] [blame] | 17 | |
Abhishek Pandit | aa71a3e | 2016-11-10 13:33:17 -0800 | [diff] [blame] | 18 | def interface_instance(): |
| 19 | return "_".join(interface.name.split('.') + ['interface']) |
| 20 | %> |
Patrick Williams | 831839a | 2016-10-16 18:09:00 -0500 | [diff] [blame] | 21 | namespace sdbusplus |
| 22 | { |
Patrick Williams | 831839a | 2016-10-16 18:09:00 -0500 | [diff] [blame] | 23 | % for s in namespaces: |
| 24 | namespace ${s} |
| 25 | { |
| 26 | % endfor |
Patrick Williams | 7aa8a1e | 2016-11-11 13:30:33 -0600 | [diff] [blame] | 27 | namespace server |
| 28 | { |
Patrick Williams | adc1682 | 2016-10-17 14:43:54 -0500 | [diff] [blame] | 29 | |
| 30 | ${classname}::${classname}(bus::bus& bus, const char* path) |
Patrick Williams | a475c03 | 2016-10-18 22:03:41 -0500 | [diff] [blame] | 31 | : _${interface_instance()}( |
Lei YU | 14db20f | 2020-02-03 14:13:16 +0800 | [diff] [blame] | 32 | bus, path, interface, _vtable, this), _intf(bus.getInterface()) |
Patrick Williams | adc1682 | 2016-10-17 14:43:54 -0500 | [diff] [blame] | 33 | { |
| 34 | } |
| 35 | |
Patrick Williams | 4d47bf0 | 2017-02-01 23:16:23 -0600 | [diff] [blame] | 36 | % if interface.properties: |
| 37 | ${classname}::${classname}(bus::bus& bus, const char* path, |
Richard Marian Thomaiyar | 261fe75 | 2018-06-18 13:53:56 +0530 | [diff] [blame] | 38 | const std::map<std::string, PropertiesVariant>& vals, |
| 39 | bool skipSignal) |
Patrick Williams | 4d47bf0 | 2017-02-01 23:16:23 -0600 | [diff] [blame] | 40 | : ${classname}(bus, path) |
| 41 | { |
| 42 | for (const auto& v : vals) |
| 43 | { |
Richard Marian Thomaiyar | 261fe75 | 2018-06-18 13:53:56 +0530 | [diff] [blame] | 44 | setPropertyByName(v.first, v.second, skipSignal); |
Patrick Williams | 4d47bf0 | 2017-02-01 23:16:23 -0600 | [diff] [blame] | 45 | } |
| 46 | } |
| 47 | |
| 48 | % endif |
Patrick Williams | 831839a | 2016-10-16 18:09:00 -0500 | [diff] [blame] | 49 | % for m in interface.methods: |
| 50 | ${ m.cpp_prototype(loader, interface=interface, ptype='callback-cpp') } |
| 51 | % endfor |
| 52 | |
Patrick Williams | 5302a46 | 2016-10-18 11:11:51 -0500 | [diff] [blame] | 53 | % for s in interface.signals: |
| 54 | ${ s.cpp_prototype(loader, interface=interface, ptype='callback-cpp') } |
| 55 | % endfor |
| 56 | |
Patrick Williams | b2cca01 | 2016-10-18 14:13:39 -0500 | [diff] [blame] | 57 | % for p in interface.properties: |
Adriana Kobylak | ee6ac69 | 2018-06-06 09:36:51 -0500 | [diff] [blame] | 58 | ${ p.cpp_prototype(loader, interface=interface, ptype='callback-cpp') } |
Patrick Williams | b2cca01 | 2016-10-18 14:13:39 -0500 | [diff] [blame] | 59 | % endfor |
| 60 | |
Patrick Williams | 9fa8552 | 2017-02-01 23:06:33 -0600 | [diff] [blame] | 61 | % if interface.properties: |
James Feist | f750906 | 2018-03-23 14:15:56 -0700 | [diff] [blame] | 62 | void ${classname}::setPropertyByName(const std::string& _name, |
Richard Marian Thomaiyar | 261fe75 | 2018-06-18 13:53:56 +0530 | [diff] [blame] | 63 | const PropertiesVariant& val, |
| 64 | bool skipSignal) |
Patrick Williams | 9fa8552 | 2017-02-01 23:06:33 -0600 | [diff] [blame] | 65 | { |
| 66 | % for p in interface.properties: |
James Feist | f750906 | 2018-03-23 14:15:56 -0700 | [diff] [blame] | 67 | if (_name == "${p.name}") |
Patrick Williams | 9fa8552 | 2017-02-01 23:06:33 -0600 | [diff] [blame] | 68 | { |
William A. Kennington III | 4274c11 | 2018-11-26 09:50:13 -0800 | [diff] [blame] | 69 | auto& v = std::get<${p.cppTypeParam(interface.name)}>(\ |
Patrick Williams | 9fa8552 | 2017-02-01 23:06:33 -0600 | [diff] [blame] | 70 | val); |
Richard Marian Thomaiyar | 261fe75 | 2018-06-18 13:53:56 +0530 | [diff] [blame] | 71 | ${p.camelCase}(v, skipSignal); |
Patrick Williams | 9fa8552 | 2017-02-01 23:06:33 -0600 | [diff] [blame] | 72 | return; |
| 73 | } |
| 74 | % endfor |
| 75 | } |
| 76 | |
James Feist | f750906 | 2018-03-23 14:15:56 -0700 | [diff] [blame] | 77 | auto ${classname}::getPropertyByName(const std::string& _name) -> |
Patrick Williams | dfa1909 | 2017-02-02 09:24:56 -0600 | [diff] [blame] | 78 | PropertiesVariant |
| 79 | { |
| 80 | % for p in interface.properties: |
James Feist | f750906 | 2018-03-23 14:15:56 -0700 | [diff] [blame] | 81 | if (_name == "${p.name}") |
Patrick Williams | dfa1909 | 2017-02-02 09:24:56 -0600 | [diff] [blame] | 82 | { |
| 83 | return ${p.camelCase}(); |
| 84 | } |
| 85 | % endfor |
| 86 | |
| 87 | return PropertiesVariant(); |
| 88 | } |
| 89 | |
Patrick Williams | 9fa8552 | 2017-02-01 23:06:33 -0600 | [diff] [blame] | 90 | % endif |
Patrick Williams | 386e8d2 | 2016-11-16 16:13:57 -0600 | [diff] [blame] | 91 | % for e in interface.enums: |
| 92 | |
| 93 | namespace |
| 94 | { |
| 95 | /** String to enum mapping for ${classname}::${e.name} */ |
| 96 | static const std::tuple<const char*, ${classname}::${e.name}> \ |
| 97 | mapping${classname}${e.name}[] = |
| 98 | { |
| 99 | % for v in e.values: |
| 100 | std::make_tuple( "${interface.name}.${e.name}.${v.name}", \ |
| 101 | ${classname}::${e.name}::${v.name} ), |
| 102 | % endfor |
| 103 | }; |
| 104 | |
| 105 | } // anonymous namespace |
| 106 | |
Patrick Williams | 93c246c | 2017-06-16 05:04:01 -0500 | [diff] [blame] | 107 | auto ${classname}::convert${e.name}FromString(const std::string& s) -> |
Patrick Williams | 386e8d2 | 2016-11-16 16:13:57 -0600 | [diff] [blame] | 108 | ${e.name} |
| 109 | { |
| 110 | auto i = std::find_if( |
| 111 | std::begin(mapping${classname}${e.name}), |
| 112 | std::end(mapping${classname}${e.name}), |
| 113 | [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } ); |
| 114 | if (std::end(mapping${classname}${e.name}) == i) |
| 115 | { |
| 116 | throw sdbusplus::exception::InvalidEnumString(); |
| 117 | } |
| 118 | else |
| 119 | { |
| 120 | return std::get<1>(*i); |
| 121 | } |
| 122 | } |
| 123 | |
Patrick Williams | 978f77d | 2020-01-28 17:27:34 -0800 | [diff] [blame] | 124 | std::string ${classname}::convert${e.name}ToString(${classname}::${e.name} v) |
Patrick Williams | 386e8d2 | 2016-11-16 16:13:57 -0600 | [diff] [blame] | 125 | { |
| 126 | auto i = std::find_if( |
| 127 | std::begin(mapping${classname}${e.name}), |
| 128 | std::end(mapping${classname}${e.name}), |
| 129 | [v](auto& e){ return v == std::get<1>(e); }); |
Lei YU | b641d10 | 2018-09-05 17:17:47 +0800 | [diff] [blame] | 130 | if (i == std::end(mapping${classname}${e.name})) |
| 131 | { |
| 132 | throw std::invalid_argument(std::to_string(static_cast<int>(v))); |
| 133 | } |
Patrick Williams | 386e8d2 | 2016-11-16 16:13:57 -0600 | [diff] [blame] | 134 | return std::get<0>(*i); |
| 135 | } |
| 136 | % endfor |
| 137 | |
Patrick Williams | 178e8fc | 2016-10-17 16:37:24 -0500 | [diff] [blame] | 138 | const vtable::vtable_t ${classname}::_vtable[] = { |
| 139 | vtable::start(), |
| 140 | % for m in interface.methods: |
| 141 | ${ m.cpp_prototype(loader, interface=interface, ptype='vtable') } |
| 142 | % endfor |
Patrick Williams | 5302a46 | 2016-10-18 11:11:51 -0500 | [diff] [blame] | 143 | % for s in interface.signals: |
| 144 | ${ s.cpp_prototype(loader, interface=interface, ptype='vtable') } |
| 145 | % endfor |
Patrick Williams | b2cca01 | 2016-10-18 14:13:39 -0500 | [diff] [blame] | 146 | % for p in interface.properties: |
| 147 | vtable::property("${p.name}", |
| 148 | details::${classname}::_property_${p.name} |
| 149 | .data(), |
| 150 | _callback_get_${p.name}, |
Patrick Williams | e1c73d3 | 2020-07-10 16:02:27 -0500 | [diff] [blame] | 151 | % if 'const' not in p.flags and 'readonly' not in p.flags: |
Patrick Williams | a475c03 | 2016-10-18 22:03:41 -0500 | [diff] [blame] | 152 | _callback_set_${p.name}, |
Waqar Hameed | 20255a5 | 2020-06-04 12:38:48 +0200 | [diff] [blame] | 153 | % endif |
| 154 | % if not p.cpp_flags: |
Patrick Williams | a475c03 | 2016-10-18 22:03:41 -0500 | [diff] [blame] | 155 | vtable::property_::emits_change), |
Waqar Hameed | 20255a5 | 2020-06-04 12:38:48 +0200 | [diff] [blame] | 156 | % else: |
| 157 | ${p.cpp_flags}), |
| 158 | % endif |
Patrick Williams | b2cca01 | 2016-10-18 14:13:39 -0500 | [diff] [blame] | 159 | % endfor |
Patrick Williams | 178e8fc | 2016-10-17 16:37:24 -0500 | [diff] [blame] | 160 | vtable::end() |
| 161 | }; |
| 162 | |
Patrick Williams | 7aa8a1e | 2016-11-11 13:30:33 -0600 | [diff] [blame] | 163 | } // namespace server |
Patrick Williams | 0e9ad0d | 2016-10-18 14:24:44 -0500 | [diff] [blame] | 164 | % for s in reversed(namespaces): |
Patrick Williams | 831839a | 2016-10-16 18:09:00 -0500 | [diff] [blame] | 165 | } // namespace ${s} |
| 166 | % endfor |
Patrick Williams | 831839a | 2016-10-16 18:09:00 -0500 | [diff] [blame] | 167 | } // namespace sdbusplus |