sdbusplus:: dbus-interfaces generated use inteface
The generated dbus-interface server objects now pass their
sd-bus library calls through whatever interface was provided
in the sdbusplus::bus::bus they received.
Change-Id: Ib57a0f7c87c3cad9920cb4427b833cc66932afa2
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/sdbusplus/sdbus.hpp b/sdbusplus/sdbus.hpp
index 5d553a2..2b77271 100644
--- a/sdbusplus/sdbus.hpp
+++ b/sdbusplus/sdbus.hpp
@@ -42,6 +42,9 @@
const char *interface,
char **names) = 0;
+ virtual int sd_bus_error_set_const(sd_bus_error *e, const char *name,
+ const char *message) = 0;
+
virtual sd_event *sd_bus_get_event(sd_bus *bus) = 0;
virtual int sd_bus_get_unique_name(sd_bus *bus, const char **unique) = 0;
@@ -194,6 +197,12 @@
names);
}
+ int sd_bus_error_set_const(sd_bus_error *e, const char *name,
+ const char *message) override
+ {
+ return ::sd_bus_error_set_const(e, name, message);
+ }
+
sd_event *sd_bus_get_event(sd_bus *bus) override
{
return ::sd_bus_get_event(bus);
diff --git a/sdbusplus/test/sdbus_mock.hpp b/sdbusplus/test/sdbus_mock.hpp
index e22de18..fe01797 100644
--- a/sdbusplus/test/sdbus_mock.hpp
+++ b/sdbusplus/test/sdbus_mock.hpp
@@ -31,6 +31,9 @@
MOCK_METHOD4(sd_bus_emit_properties_changed_strv,
int(sd_bus *, const char *, const char *, char **));
+ MOCK_METHOD3(sd_bus_error_set_const,
+ int(sd_bus_error *, const char *, const char *));
+
MOCK_METHOD1(sd_bus_get_event, sd_event *(sd_bus *));
MOCK_METHOD2(sd_bus_get_unique_name, int(sd_bus *, const char **));
diff --git a/tools/sdbusplus/templates/interface.mako.server.cpp.in b/tools/sdbusplus/templates/interface.mako.server.cpp.in
index 7a2a798..d519c26 100644
--- a/tools/sdbusplus/templates/interface.mako.server.cpp.in
+++ b/tools/sdbusplus/templates/interface.mako.server.cpp.in
@@ -1,4 +1,5 @@
#include <algorithm>
+#include <sdbusplus/sdbus.hpp>
#include <sdbusplus/server.hpp>
#include <sdbusplus/exception.hpp>
#include <${"/".join(interface.name.split('.') + [ 'server.hpp' ])}>
@@ -23,7 +24,7 @@
${classname}::${classname}(bus::bus& bus, const char* path)
: _${interface_instance()}(
- bus, path, _interface, _vtable, this)
+ bus, path, _interface, _vtable, this), _intf(bus.getInterface())
{
}
@@ -61,9 +62,13 @@
{
using sdbusplus::server::binding::details::convertForMessage;
+ // TODO(venture): Can this except? I wouldn't think so.
+ auto o = static_cast<${classname}*>(context);
+
try
{
- auto m = message::message(reply);
+ auto m = message::message(reply, o->_intf);
+
#if @WANT_TRANSACTION@
{
auto tbus = m.get_bus();
@@ -73,12 +78,11 @@
}
#endif
- auto o = static_cast<${classname}*>(context);
m.append(convertForMessage(o->${p.camelCase}()));
}
catch(sdbusplus::internal_exception_t& e)
{
- sd_bus_error_set_const(error, e.name(), e.description());
+ o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
return -EINVAL;
}
@@ -102,9 +106,12 @@
const char* property, sd_bus_message* value, void* context,
sd_bus_error* error)
{
+ auto o = static_cast<${classname}*>(context);
+
try
{
- auto m = message::message(value);
+ auto m = message::message(value, o->_intf);
+
#if @WANT_TRANSACTION@
{
auto tbus = m.get_bus();
@@ -114,8 +121,6 @@
}
#endif
- auto o = static_cast<${classname}*>(context);
-
${p.cppTypeMessage(interface.name)} v{};
m.read(v);
% if p.is_enum():
@@ -127,7 +132,7 @@
}
catch(sdbusplus::internal_exception_t& e)
{
- sd_bus_error_set_const(error, e.name(), e.description());
+ o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
return -EINVAL;
}
diff --git a/tools/sdbusplus/templates/interface.mako.server.hpp b/tools/sdbusplus/templates/interface.mako.server.hpp
index 9ca67e0..ec02c57 100644
--- a/tools/sdbusplus/templates/interface.mako.server.hpp
+++ b/tools/sdbusplus/templates/interface.mako.server.hpp
@@ -1,6 +1,7 @@
#pragma once
#include <tuple>
#include <systemd/sd-bus.h>
+#include <sdbusplus/sdbus.hpp>
#include <sdbusplus/server.hpp>
<%
namespaces = interface.name.split('.')
@@ -129,6 +130,7 @@
static const vtable::vtable_t _vtable[];
sdbusplus::server::interface::interface
_${"_".join(interface.name.split('.'))}_interface;
+ sdbusplus::SdBusInterface *_intf;
% for p in interface.properties:
% if p.defaultValue: