Delay registering DBus.Properties interface until the moment there are
properties on that path. This is needed for objects that currently don't
expose any property to not export the interface.
---
gdbus/object.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/gdbus/object.c b/gdbus/object.c
index 3101ca6..47116bd 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -1213,9 +1213,6 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
manager_methods, manager_signals,
NULL, data, NULL);
- add_interface(data, DBUS_INTERFACE_PROPERTIES, properties_methods,
- properties_signals, NULL, data, NULL);
-
return data;
}
@@ -1336,6 +1333,12 @@ gboolean g_dbus_register_interface(DBusConnection *connection,
return FALSE;
}
+ if (properties != NULL && !find_interface(data->interfaces,
+ DBUS_INTERFACE_PROPERTIES))
+ add_interface(data, DBUS_INTERFACE_PROPERTIES,
+ properties_methods, properties_signals, NULL,
+ data, NULL);
+
add_interface(data, name, methods, signals, properties, user_data,
destroy);
--
1.8.0.1
Hi Lucas,
On Thu, Nov 29, 2012 at 3:33 PM, Luiz Augusto von Dentz
<[email protected]> wrote:
> Hi Lucas,
>
> On Thu, Nov 29, 2012 at 3:19 PM, Lucas De Marchi
> <[email protected]> wrote:
>> Delay registering DBus.Properties interface until the moment there are
>> properties on that path. This is needed for objects that currently don't
>> expose any property to not export the interface.
>> ---
>> gdbus/object.c | 9 ++++++---
>> 1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/gdbus/object.c b/gdbus/object.c
>> index 3101ca6..47116bd 100644
>> --- a/gdbus/object.c
>> +++ b/gdbus/object.c
>> @@ -1213,9 +1213,6 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
>> manager_methods, manager_signals,
>> NULL, data, NULL);
>>
>> - add_interface(data, DBUS_INTERFACE_PROPERTIES, properties_methods,
>> - properties_signals, NULL, data, NULL);
>> -
>> return data;
>> }
>>
>> @@ -1336,6 +1333,12 @@ gboolean g_dbus_register_interface(DBusConnection *connection,
>> return FALSE;
>> }
>>
>> + if (properties != NULL && !find_interface(data->interfaces,
>> + DBUS_INTERFACE_PROPERTIES))
>> + add_interface(data, DBUS_INTERFACE_PROPERTIES,
>> + properties_methods, properties_signals, NULL,
>> + data, NULL);
>> +
>> add_interface(data, name, methods, signals, properties, user_data,
>> destroy);
>>
>> --
>> 1.8.0.1
>
> Ack
Patches pushed to BlueZ and obexd. Thanks.
--
Luiz Augusto von Dentz
Hi Lucas,
On Thu, Nov 29, 2012 at 3:19 PM, Lucas De Marchi
<[email protected]> wrote:
> From: Lucas De Marchi <[email protected]>
>
> ---
> src/main.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/src/main.c b/src/main.c
> index 414849a..ccb5fa5 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -381,6 +381,7 @@ static void disconnect_dbus(void)
> if (!conn || !dbus_connection_get_is_connected(conn))
> return;
>
> + g_dbus_detach_object_manager(conn);
> set_dbus_connection(NULL);
>
> dbus_connection_unref(conn);
> @@ -412,6 +413,7 @@ static int connect_dbus(void)
> set_dbus_connection(conn);
>
> g_dbus_set_disconnect_function(conn, disconnected_dbus, NULL, NULL);
> + g_dbus_attach_object_manager(conn);
>
> return 0;
> }
> --
> 1.8.0.1
Ack.
--
Luiz Augusto von Dentz
Hi Lucas,
On Thu, Nov 29, 2012 at 3:19 PM, Lucas De Marchi
<[email protected]> wrote:
> From: Lucas De Marchi <[email protected]>
>
> Let each project attach the object manager interface instead of
> registering it automatically.
> ---
> gdbus/gdbus.h | 3 +++
> gdbus/object.c | 54 +++++++++++++++++++++++++++++++++---------------------
> 2 files changed, 36 insertions(+), 21 deletions(-)
>
> diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
> index ba49621..6aafc61 100644
> --- a/gdbus/gdbus.h
> +++ b/gdbus/gdbus.h
> @@ -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
> diff --git a/gdbus/object.c b/gdbus/object.c
> index 47116bd..7cbd612 100644
> --- a/gdbus/object.c
> +++ b/gdbus/object.c
> @@ -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;
> +}
> --
> 1.8.0.1
Looks good, ack.
--
Luiz Augusto von Dentz
Hi Lucas,
On Thu, Nov 29, 2012 at 3:19 PM, Lucas De Marchi
<[email protected]> wrote:
> Delay registering DBus.Properties interface until the moment there are
> properties on that path. This is needed for objects that currently don't
> expose any property to not export the interface.
> ---
> gdbus/object.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/gdbus/object.c b/gdbus/object.c
> index 3101ca6..47116bd 100644
> --- a/gdbus/object.c
> +++ b/gdbus/object.c
> @@ -1213,9 +1213,6 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
> manager_methods, manager_signals,
> NULL, data, NULL);
>
> - add_interface(data, DBUS_INTERFACE_PROPERTIES, properties_methods,
> - properties_signals, NULL, data, NULL);
> -
> return data;
> }
>
> @@ -1336,6 +1333,12 @@ gboolean g_dbus_register_interface(DBusConnection *connection,
> return FALSE;
> }
>
> + if (properties != NULL && !find_interface(data->interfaces,
> + DBUS_INTERFACE_PROPERTIES))
> + add_interface(data, DBUS_INTERFACE_PROPERTIES,
> + properties_methods, properties_signals, NULL,
> + data, NULL);
> +
> add_interface(data, name, methods, signals, properties, user_data,
> destroy);
>
> --
> 1.8.0.1
Ack
--
Luiz Augusto von Dentz
From: Lucas De Marchi <[email protected]>
---
src/main.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/main.c b/src/main.c
index 414849a..ccb5fa5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -381,6 +381,7 @@ static void disconnect_dbus(void)
if (!conn || !dbus_connection_get_is_connected(conn))
return;
+ g_dbus_detach_object_manager(conn);
set_dbus_connection(NULL);
dbus_connection_unref(conn);
@@ -412,6 +413,7 @@ static int connect_dbus(void)
set_dbus_connection(conn);
g_dbus_set_disconnect_function(conn, disconnected_dbus, NULL, NULL);
+ g_dbus_attach_object_manager(conn);
return 0;
}
--
1.8.0.1
From: Lucas De Marchi <[email protected]>
Let each project attach the object manager interface instead of
registering it automatically.
---
gdbus/gdbus.h | 3 +++
gdbus/object.c | 54 +++++++++++++++++++++++++++++++++---------------------
2 files changed, 36 insertions(+), 21 deletions(-)
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
index ba49621..6aafc61 100644
--- a/gdbus/gdbus.h
+++ b/gdbus/gdbus.h
@@ -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
diff --git a/gdbus/object.c b/gdbus/object.c
index 47116bd..7cbd612 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -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;
+}
--
1.8.0.1