manager: add binding for sd_bus_add_object_manager
Change-Id: I9548b7fd7ce12beab10283b29a05ea31a335b03f
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/sdbusplus/bus.hpp b/sdbusplus/bus.hpp
index 0156705..119ae52 100644
--- a/sdbusplus/bus.hpp
+++ b/sdbusplus/bus.hpp
@@ -10,6 +10,7 @@
// Forward declare.
namespace server { namespace interface { struct interface; } }
+namespace server { namespace manager { struct manager; } }
namespace bus
{
@@ -166,6 +167,7 @@
}
friend struct server::interface::interface;
+ friend struct server::manager::manager;
private:
busp_t get() { return _bus.get(); }
diff --git a/sdbusplus/manager.hpp b/sdbusplus/manager.hpp
new file mode 100644
index 0000000..3513f2a
--- /dev/null
+++ b/sdbusplus/manager.hpp
@@ -0,0 +1,58 @@
+#pragma once
+
+#include <sdbusplus/slot.hpp>
+#include <sdbusplus/bus.hpp>
+
+namespace sdbusplus
+{
+
+namespace server
+{
+
+namespace manager
+{
+
+/** @class manager
+ * @brief Provide a C++ holder for a sd-bus object manager.
+ *
+ * Wraps sd_bus_add_object_manager so that an sd-bus owned object manager
+ * can be installed at a path and automatically removed when destructed.
+ */
+struct manager
+{
+ /* Define all of the basic class operations:
+ * Not allowed:
+ * - Default constructor to avoid nullptrs.
+ * - Copy operations due to internal unique_ptr.
+ * Allowed:
+ * - Move operations.
+ * - Destructor.
+ */
+ manager() = delete;
+ manager(const manager&) = delete;
+ manager& operator=(const manager&) = delete;
+ manager(manager&&) = default;
+ manager& operator=(manager&&) = default;
+ ~manager() = default;
+
+ /** @brief Register an object manager at a path.
+ *
+ * @param[in] bus - The bus to register on.
+ * @param[in] path - The path to register.
+ */
+ manager(sdbusplus::bus::bus& bus, const char* path) : _slot(nullptr)
+ {
+ sd_bus_slot* slot = nullptr;
+ sd_bus_add_object_manager(bus.get(), &slot, path);
+
+ _slot = decltype(_slot){slot};
+ }
+
+ private:
+ slot::slot _slot;
+
+};
+
+} // namespace manager
+} // namespace server
+} // namespace sdbusplus