sdbusplus::server::interface:: Add sdbus interface

Adds the SdBusInterface without requiring a new injection point,
by leveraging that the bus carries that information with it.

Change-Id: I55eb6bb8343791ac11980a5669a8a4726f16d591
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/sdbusplus/sdbus.hpp b/sdbusplus/sdbus.hpp
index 0f2772f..5d553a2 100644
--- a/sdbusplus/sdbus.hpp
+++ b/sdbusplus/sdbus.hpp
@@ -16,6 +16,12 @@
     virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot,
                                           const char *path) = 0;
 
+    virtual int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot,
+                                         const char *path,
+                                         const char *interface,
+                                         const sd_bus_vtable *vtable,
+                                         void *userdata) = 0;
+
     virtual int sd_bus_attach_event(sd_bus *bus, sd_event *e, int priority) = 0;
 
     virtual int sd_bus_call(sd_bus *bus, sd_bus_message *m, uint64_t usec,
@@ -31,6 +37,10 @@
                                                     char **interfaces) = 0;
     virtual int sd_bus_emit_object_added(sd_bus *bus, const char *path) = 0;
     virtual int sd_bus_emit_object_removed(sd_bus *bus, const char *path) = 0;
+    virtual int sd_bus_emit_properties_changed_strv(sd_bus *bus,
+                                                    const char *path,
+                                                    const char *interface,
+                                                    char **names) = 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;
@@ -129,6 +139,15 @@
         return ::sd_bus_add_object_manager(bus, slot, path);
     }
 
+    int sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot,
+                                 const char *path, const char *interface,
+                                 const sd_bus_vtable *vtable,
+                                 void *userdata) override
+    {
+        return ::sd_bus_add_object_vtable(bus, slot, path, interface, vtable,
+                                          userdata);
+    }
+
     int sd_bus_attach_event(sd_bus *bus, sd_event *e, int priority) override
     {
         return ::sd_bus_attach_event(bus, e, priority);
@@ -167,6 +186,14 @@
         return ::sd_bus_emit_object_removed(bus, path);
     }
 
+    int sd_bus_emit_properties_changed_strv(sd_bus *bus, const char *path,
+                                            const char *interface,
+                                            char **names) override
+    {
+        return ::sd_bus_emit_properties_changed_strv(bus, path, interface,
+                                                     names);
+    }
+
     sd_event *sd_bus_get_event(sd_bus *bus) override
     {
         return ::sd_bus_get_event(bus);
diff --git a/sdbusplus/server/interface.hpp b/sdbusplus/server/interface.hpp
index 1e743f9..35c1fe0 100644
--- a/sdbusplus/server/interface.hpp
+++ b/sdbusplus/server/interface.hpp
@@ -5,6 +5,7 @@
 #include <sdbusplus/slot.hpp>
 #include <sdbusplus/vtable.hpp>
 #include <sdbusplus/bus.hpp>
+#include <sdbusplus/sdbus.hpp>
 
 namespace sdbusplus
 {
@@ -57,12 +58,12 @@
      */
     interface(sdbusplus::bus::bus& bus, const char* path, const char* interf,
               const sdbusplus::vtable::vtable_t* vtable, void* context) :
-        _bus(bus.get()),
-        _path(path), _interf(interf), _slot(nullptr)
+        _bus(bus.get(), bus.getInterface()),
+        _path(path), _interf(interf), _slot(nullptr), _intf(bus.getInterface())
     {
         sd_bus_slot* slot = nullptr;
-        sd_bus_add_object_vtable(_bus.get(), &slot, _path.c_str(),
-                                 _interf.c_str(), vtable, context);
+        _intf->sd_bus_add_object_vtable(_bus.get(), &slot, _path.c_str(),
+                                        _interf.c_str(), vtable, context);
 
         _slot = decltype(_slot){slot};
     }
@@ -82,8 +83,13 @@
      */
     void property_changed(const char* property)
     {
-        sd_bus_emit_properties_changed(_bus.get(), _path.c_str(),
-                                       _interf.c_str(), property, nullptr);
+        std::vector<std::string> values{property};
+        sdbusplus::bus::details::Strv p(values);
+
+        // Note: Converting to use _strv version, could also mock two pointer
+        // use-case explicitly.
+        _intf->sd_bus_emit_properties_changed_strv(
+            _bus.get(), _path.c_str(), _interf.c_str(), static_cast<char**>(p));
     }
 
     bus::bus& bus()
@@ -100,6 +106,7 @@
     std::string _path;
     std::string _interf;
     slot::slot _slot;
+    SdBusInterface* _intf;
 };
 
 } // namespace interface
diff --git a/sdbusplus/test/sdbus_mock.hpp b/sdbusplus/test/sdbus_mock.hpp
index 059eae6..e22de18 100644
--- a/sdbusplus/test/sdbus_mock.hpp
+++ b/sdbusplus/test/sdbus_mock.hpp
@@ -14,6 +14,9 @@
 
     MOCK_METHOD3(sd_bus_add_object_manager,
                  int(sd_bus *, sd_bus_slot **, const char *));
+    MOCK_METHOD6(sd_bus_add_object_vtable,
+                 int(sd_bus *, sd_bus_slot **, const char *, const char *,
+                     const sd_bus_vtable *, void *));
     MOCK_METHOD3(sd_bus_attach_event, int(sd_bus *, sd_event *, int));
     MOCK_METHOD5(sd_bus_call, int(sd_bus *, sd_bus_message *, uint64_t,
                                   sd_bus_error *, sd_bus_message **));
@@ -25,6 +28,8 @@
                  int(sd_bus *, const char *, char **));
     MOCK_METHOD2(sd_bus_emit_object_added, int(sd_bus *, const char *));
     MOCK_METHOD2(sd_bus_emit_object_removed, int(sd_bus *, const char *));
+    MOCK_METHOD4(sd_bus_emit_properties_changed_strv,
+                 int(sd_bus *, const char *, const char *, char **));
 
     MOCK_METHOD1(sd_bus_get_event, sd_event *(sd_bus *));
     MOCK_METHOD2(sd_bus_get_unique_name, int(sd_bus *, const char **));