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: