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 **));