* [PATCH BlueZ 3/5] gdbus: Fix having multiple path exporting ObjectManager
2012-11-15 14:05 [PATCH BlueZ 1/5] core: Fix registering '/org/bluez' path before '/' Luiz Augusto von Dentz
2012-11-15 14:05 ` [PATCH BlueZ 2/5] core: Make exit sequence consistent with init Luiz Augusto von Dentz
@ 2012-11-15 14:05 ` Luiz Augusto von Dentz
2012-11-15 14:05 ` [PATCH BlueZ 4/5] gdbus: Automatically register '/' path Luiz Augusto von Dentz
2012-11-15 14:05 ` [PATCH BlueZ 5/5] core: Make use of g_dbus_disconnect Luiz Augusto von Dentz
3 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-15 14:05 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
ObjectManager should only be available on the root path so if the
current is a child of the object being registered the root should be
changed.
---
gdbus/object.c | 35 ++++++++++++++++++++++-------------
1 file changed, 22 insertions(+), 13 deletions(-)
diff --git a/gdbus/object.c b/gdbus/object.c
index 214fd84..1f0ea39 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -84,6 +84,8 @@ struct property_data {
DBusMessage *message;
};
+static struct generic_data *root = NULL;
+
static gboolean process_changes(gpointer user_data);
static void process_properties_from_interface(struct generic_data *data,
struct interface_data *iface);
@@ -574,11 +576,7 @@ static void emit_interfaces_added(struct generic_data *data)
if (parent == NULL)
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)
@@ -948,11 +946,7 @@ static void emit_interfaces_removed(struct generic_data *data)
if (parent == NULL)
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)
@@ -1008,6 +1002,9 @@ static void generic_unregister(DBusConnection *connection, void *user_data)
g_slist_foreach(data->objects, reset_parent, data->parent);
g_slist_free(data->objects);
+ if (root == data)
+ root = NULL;
+
dbus_connection_unref(data->conn);
g_free(data->introspect);
g_free(data->path);
@@ -1175,6 +1172,20 @@ static void add_interface(struct generic_data *data,
data->process_id = g_idle_add(process_changes, data);
}
+static void set_root(struct generic_data *data)
+{
+ if (root != NULL) {
+ data->objects = g_slist_prepend(data->objects, root);
+ root->parent = data;
+ remove_interface(root, DBUS_INTERFACE_OBJECT_MANAGER);
+ }
+
+ add_interface(data, DBUS_INTERFACE_OBJECT_MANAGER,
+ manager_methods, manager_signals,
+ NULL, data, NULL);
+ root = data;
+}
+
static struct generic_data *object_path_ref(DBusConnection *connection,
const char *path)
{
@@ -1209,9 +1220,7 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
/* Only root path export ObjectManager interface */
if (data->parent == NULL)
- add_interface(data, DBUS_INTERFACE_OBJECT_MANAGER,
- manager_methods, manager_signals,
- NULL, data, NULL);
+ set_root(data);
add_interface(data, DBUS_INTERFACE_PROPERTIES, properties_methods,
properties_signals, NULL, data, NULL);
--
1.7.11.7
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH BlueZ 4/5] gdbus: Automatically register '/' path
2012-11-15 14:05 [PATCH BlueZ 1/5] core: Fix registering '/org/bluez' path before '/' Luiz Augusto von Dentz
2012-11-15 14:05 ` [PATCH BlueZ 2/5] core: Make exit sequence consistent with init Luiz Augusto von Dentz
2012-11-15 14:05 ` [PATCH BlueZ 3/5] gdbus: Fix having multiple path exporting ObjectManager Luiz Augusto von Dentz
@ 2012-11-15 14:05 ` Luiz Augusto von Dentz
2012-11-15 14:05 ` [PATCH BlueZ 5/5] core: Make use of g_dbus_disconnect Luiz Augusto von Dentz
3 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-15 14:05 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This makes g_dbus_setup_bus to automatically register '/' path so
user application that don't export any interface on '/' will have it
registered for ObjectManager.
Note that it is now required to call g_dbus_disconnect before exit.
---
gdbus/gdbus.h | 1 +
gdbus/mainloop.c | 21 +++++++++++++++++----
gdbus/object.c | 2 +-
3 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
index ba49621..3fbe3bc 100644
--- a/gdbus/gdbus.h
+++ b/gdbus/gdbus.h
@@ -53,6 +53,7 @@ DBusConnection *g_dbus_setup_bus(DBusBusType type, const char *name,
DBusConnection *g_dbus_setup_private(DBusBusType type, const char *name,
DBusError *error);
+void g_dbus_disconnect(DBusConnection *connection);
gboolean g_dbus_request_name(DBusConnection *connection, const char *name,
DBusError *error);
diff --git a/gdbus/mainloop.c b/gdbus/mainloop.c
index 099b67f..acea308 100644
--- a/gdbus/mainloop.c
+++ b/gdbus/mainloop.c
@@ -301,12 +301,25 @@ DBusConnection *g_dbus_setup_bus(DBusBusType type, const char *name,
if (conn == NULL)
return NULL;
- if (setup_bus(conn, name, error) == FALSE) {
- dbus_connection_unref(conn);
- return NULL;
- }
+ if (setup_bus(conn, name, error) == FALSE)
+ goto fail;
+
+ if (!g_dbus_register_interface(conn, "/", NULL, NULL, NULL, NULL, NULL,
+ NULL))
+ goto fail;
return conn;
+
+fail:
+ dbus_connection_unref(conn);
+ return NULL;
+
+}
+
+void g_dbus_disconnect(DBusConnection *connection)
+{
+ g_dbus_unregister_interface(connection, "/", NULL);
+ dbus_connection_unref(connection);
}
DBusConnection *g_dbus_setup_private(DBusBusType type, const char *name,
diff --git a/gdbus/object.c b/gdbus/object.c
index 1f0ea39..04941c7 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -615,7 +615,7 @@ static struct interface_data *find_interface(GSList *interfaces,
for (list = interfaces; list; list = list->next) {
struct interface_data *iface = list->data;
- if (!strcmp(name, iface->name))
+ if (g_strcmp0(name, iface->name) == 0)
return iface;
}
--
1.7.11.7
^ permalink raw reply related [flat|nested] 6+ messages in thread