diff options
author | Patrick Williams <patrick@stwcx.xyz> | 2016-11-13 19:07:09 -0600 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2016-11-17 15:36:21 -0600 |
commit | 31691cf17e93fc2b16372c290da75d2f264cc5b0 (patch) | |
tree | 25b4f7b79b77e0adc91f5b5e67e5b19970d16613 /tools | |
parent | 1a28306d2d28612dae73caab7386831e93a2ee7d (diff) | |
download | sdbusplus-31691cf17e93fc2b16372c290da75d2f264cc5b0.tar.gz sdbusplus-31691cf17e93fc2b16372c290da75d2f264cc5b0.zip |
sdbus++: add exception handling to server bindings
Change-Id: Id313bb05c7cb910b7669046cffac668bf04af11d
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/sdbusplus/templates/interface.mako.server.cpp | 4 | ||||
-rw-r--r-- | tools/sdbusplus/templates/method.mako.prototype.hpp | 60 |
2 files changed, 52 insertions, 12 deletions
diff --git a/tools/sdbusplus/templates/interface.mako.server.cpp b/tools/sdbusplus/templates/interface.mako.server.cpp index c18a727..cc0d900 100644 --- a/tools/sdbusplus/templates/interface.mako.server.cpp +++ b/tools/sdbusplus/templates/interface.mako.server.cpp @@ -1,5 +1,9 @@ #include <sdbusplus/server.hpp> +#include <sdbusplus/exception.hpp> #include <${"/".join(interface.name.split('.') + [ 'server.hpp' ])}> +% for m in interface.methods: +${ m.cpp_prototype(loader, interface=interface, ptype='callback-cpp-includes') } +% endfor <% namespaces = interface.name.split('.') classname = namespaces.pop() diff --git a/tools/sdbusplus/templates/method.mako.prototype.hpp b/tools/sdbusplus/templates/method.mako.prototype.hpp index d8155c7..db056ff 100644 --- a/tools/sdbusplus/templates/method.mako.prototype.hpp +++ b/tools/sdbusplus/templates/method.mako.prototype.hpp @@ -43,6 +43,20 @@ def interface_name(): return interface.name.split('.').pop() + + def error_namespace(e): + n = e.split('.'); + n.pop(); # Remove error name. + + n = map((lambda x: interface.name if x == "self" else x), n); + return '::'.join('.'.join(n).split('.')); + + def error_name(e): + return e.split('.').pop(); + + def error_include(e): + return '/'.join(error_namespace(e).split('::')) + '/error.hpp'; + %> ### ### Emit 'header' @@ -90,31 +104,49 @@ int ${interface_name()}::_callback_${ method.CamelCase }( sd_bus_message* msg, void* context, sd_bus_error* error) { - ### Need to add a ref to msg since we attached it to an sdbusplus::message. - auto m = message::message(sd_bus_message_ref(msg)); + try + { + ### Need to add a ref to msg since we attached it to an + ### sdbusplus::message. + auto m = message::message(sd_bus_message_ref(msg)); % if len(method.parameters) != 0: - ${parameters_as_local()}{}; + ${parameters_as_local()}{}; - m.read(${parameters_as_list()}); + m.read(${parameters_as_list()}); % endif - auto o = static_cast<${interface_name()}*>(context); + auto o = static_cast<${interface_name()}*>(context); % if len(method.returns) != 0: - auto r = \ + auto r = \ %endif - o->${ method.camelCase }(${parameters_as_list()}); + o->${ method.camelCase }(${parameters_as_list()}); - auto reply = m.new_method_return(); + auto reply = m.new_method_return(); % if len(method.returns) == 0: - // No data to append on reply. + // No data to append on reply. % elif len(method.returns) == 1: - reply.append(std::move(r)); + reply.append(std::move(r)); % else: - reply.append(${returns_as_tuple_index("r")}); + reply.append(${returns_as_tuple_index("r")}); % endif - reply.method_return(); + reply.method_return(); + } + catch(sdbusplus::internal_exception_t& e) + { + auto name = e.what(); + sd_bus_error_set_const(error, name, name); + return -EINVAL; + } + % for e in method.errors: + catch(sdbusplus::${error_namespace(e)}::common::${error_name(e)}& e) + { + auto name = e.what(); + sd_bus_error_set_const(error, name, name); + return -EINVAL; + } + % endfor return 0; } @@ -139,4 +171,8 @@ static const auto _return_${ method.CamelCase } = % endif } } + % elif ptype == 'callback-cpp-includes': + % for e in method.errors: +#include <${error_include(e)}> + % endfor % endif |