From 4b0c23204d08d76298e11f6634081496bbaaaf5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Angelovi=C4=8D?= Date: Mon, 27 May 2019 20:51:42 +0200 Subject: [PATCH] Add object manager support to IConnection interface (#54) --- include/sdbus-c++/IConnection.h | 11 +++++++++++ src/Connection.cpp | 9 +++++++++ src/Connection.h | 1 + src/ISdBus.h | 1 + src/SdBus.cpp | 7 +++++++ src/SdBus.h | 1 + 6 files changed, 30 insertions(+) diff --git a/include/sdbus-c++/IConnection.h b/include/sdbus-c++/IConnection.h index 23a8497..9eab0ab 100644 --- a/include/sdbus-c++/IConnection.h +++ b/include/sdbus-c++/IConnection.h @@ -90,6 +90,17 @@ namespace sdbus { */ virtual void leaveProcessingLoop() = 0; + /*! + * @brief Add an ObjectManager at the specified D-Bus object path + * + * Creates an ObjectManager interface at the specified object path on + * the connection. This is a convenient way to interrogate a connection + * to see what objects it has. + * + * @throws sdbus::Error in case of failure + */ + virtual void addObjectManager( const std::string& objectPath ) = 0; + inline virtual ~IConnection() = 0; }; diff --git a/src/Connection.cpp b/src/Connection.cpp index b24264b..3892567 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -103,6 +103,15 @@ ISdBus& Connection::getSdBusInterface() return *iface_.get(); } +void Connection::addObjectManager( const std::string& objectPath ) +{ + auto r = iface_->sd_bus_add_object_manager( bus_.get() + , NULL + , objectPath.c_str() ); + + SDBUS_THROW_ERROR_IF(r < 0, "Failed to add object manager", -r); +} + sd_bus_slot* Connection::addObjectVTable( const std::string& objectPath , const std::string& interfaceName , const sd_bus_vtable* vtable diff --git a/src/Connection.h b/src/Connection.h index 94d2153..4ede286 100644 --- a/src/Connection.h +++ b/src/Connection.h @@ -56,6 +56,7 @@ namespace sdbus { namespace internal { void enterProcessingLoop() override; void enterProcessingLoopAsync() override; void leaveProcessingLoop() override; + void addObjectManager( const std::string& objectPath ) override; const ISdBus& getSdBusInterface() const override; ISdBus& getSdBusInterface() override; diff --git a/src/ISdBus.h b/src/ISdBus.h index e1b11ba..3961614 100644 --- a/src/ISdBus.h +++ b/src/ISdBus.h @@ -58,6 +58,7 @@ namespace sdbus { namespace internal { virtual int sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) = 0; virtual int sd_bus_release_name(sd_bus *bus, const char *name) = 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_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) = 0; virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) = 0; virtual sd_bus_slot* sd_bus_slot_unref(sd_bus_slot *slot) = 0; diff --git a/src/SdBus.cpp b/src/SdBus.cpp index 310e77c..ab7409f 100644 --- a/src/SdBus.cpp +++ b/src/SdBus.cpp @@ -122,6 +122,13 @@ int SdBus::sd_bus_add_object_vtable(sd_bus *bus, sd_bus_slot **slot, const char return ::sd_bus_add_object_vtable(bus, slot, path, interface, vtable, userdata); } +int SdBus::sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) +{ + std::unique_lock lock(sdbusMutex_); + + return ::sd_bus_add_object_manager(bus, slot, path); +} + int SdBus::sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) { std::unique_lock lock(sdbusMutex_); diff --git a/src/SdBus.h b/src/SdBus.h index c6f5c2f..e5c7f78 100644 --- a/src/SdBus.h +++ b/src/SdBus.h @@ -52,6 +52,7 @@ public: virtual int sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) override; virtual int sd_bus_release_name(sd_bus *bus, const char *name) override; 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) override; + virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) override; virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) override; virtual sd_bus_slot* sd_bus_slot_unref(sd_bus_slot *slot) override;