gdbus: Don't automatically attach ObjectManager
authorLucas De Marchi <lucas.de.marchi@gmail.com>
Thu, 29 Nov 2012 13:19:32 +0000 (11:19 -0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 29 Nov 2012 16:40:46 +0000 (17:40 +0100)
Let each project attach the object manager interface instead of
registering it automatically.

gdbus/gdbus.h
gdbus/object.c

index ba49621..6aafc61 100644 (file)
@@ -257,6 +257,9 @@ void g_dbus_emit_property_changed(DBusConnection *connection,
 gboolean g_dbus_get_properties(DBusConnection *connection, const char *path,
                                const char *interface, DBusMessageIter *iter);
 
+gboolean g_dbus_attach_object_manager(DBusConnection *connection);
+gboolean g_dbus_detach_object_manager(DBusConnection *connection);
+
 #ifdef __cplusplus
 }
 #endif
index 47116bd..7cbd612 100644 (file)
@@ -84,6 +84,8 @@ struct property_data {
        DBusMessage *message;
 };
 
+static struct generic_data *root;
+
 static gboolean process_changes(gpointer user_data);
 static void process_properties_from_interface(struct generic_data *data,
                                                struct interface_data *iface);
@@ -569,16 +571,11 @@ static void emit_interfaces_added(struct generic_data *data)
 {
        DBusMessage *signal;
        DBusMessageIter iter, array;
-       struct generic_data *parent = data->parent;
 
-       if (parent == NULL)
+       if (root == NULL || data == root)
                return;
 
-       /* Find root data */
-       while (parent->parent)
-               parent = parent->parent;
-
-       signal = dbus_message_new_signal(parent->path,
+       signal = dbus_message_new_signal(root->path,
                                        DBUS_INTERFACE_OBJECT_MANAGER,
                                        "InterfacesAdded");
        if (signal == NULL)
@@ -943,16 +940,11 @@ static void emit_interfaces_removed(struct generic_data *data)
 {
        DBusMessage *signal;
        DBusMessageIter iter, array;
-       struct generic_data *parent = data->parent;
 
-       if (parent == NULL)
+       if (root == NULL || data == root)
                return;
 
-       /* Find root data */
-       while (parent->parent)
-               parent = parent->parent;
-
-       signal = dbus_message_new_signal(parent->path,
+       signal = dbus_message_new_signal(root->path,
                                        DBUS_INTERFACE_OBJECT_MANAGER,
                                        "InterfacesRemoved");
        if (signal == NULL)
@@ -1207,12 +1199,6 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
        add_interface(data, DBUS_INTERFACE_INTROSPECTABLE, introspect_methods,
                                                NULL, NULL, data, NULL);
 
-       /* Only root path export ObjectManager interface */
-       if (data->parent == NULL)
-               add_interface(data, DBUS_INTERFACE_OBJECT_MANAGER,
-                                       manager_methods, manager_signals,
-                                       NULL, data, NULL);
-
        return data;
 }
 
@@ -1234,7 +1220,6 @@ static void object_path_unref(DBusConnection *connection, const char *path)
 
        remove_interface(data, DBUS_INTERFACE_INTROSPECTABLE);
        remove_interface(data, DBUS_INTERFACE_PROPERTIES);
-       remove_interface(data, DBUS_INTERFACE_OBJECT_MANAGER);
 
        invalidate_parent_data(data->conn, data->path);
 
@@ -1645,3 +1630,30 @@ gboolean g_dbus_get_properties(DBusConnection *connection, const char *path,
 
        return TRUE;
 }
+
+gboolean g_dbus_attach_object_manager(DBusConnection *connection)
+{
+       struct generic_data *data;
+
+       data = object_path_ref(connection, "/");
+       if (data == NULL)
+               return FALSE;
+
+       add_interface(data, DBUS_INTERFACE_OBJECT_MANAGER,
+                                       manager_methods, manager_signals,
+                                       NULL, data, NULL);
+       root = data;
+
+       return TRUE;
+}
+
+gboolean g_dbus_detach_object_manager(DBusConnection *connection)
+{
+       if (!g_dbus_unregister_interface(connection, "/",
+                                       DBUS_INTERFACE_OBJECT_MANAGER))
+               return FALSE;
+
+       root = NULL;
+
+       return TRUE;
+}