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);
{
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)
{
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)
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;
}
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);
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;
+}