2012-11-29 13:19:31

by Lucas De Marchi

[permalink] [raw]
Subject: [PATCH BlueZ 1/3] gdbus: Don't register DBus.Properties with no properties

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



2012-11-29 14:37:37

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH BlueZ 1/3] gdbus: Don't register DBus.Properties with no properties

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

2012-11-29 13:39:57

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH BlueZ 3/3] core: Attach and detach object manager

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

2012-11-29 13:39:29

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH BlueZ 2/3] gdbus: Don't automatically attach ObjectManager

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

2012-11-29 13:33:03

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH BlueZ 1/3] gdbus: Don't register DBus.Properties with no properties

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

2012-11-29 13:19:33

by Lucas De Marchi

[permalink] [raw]
Subject: [PATCH BlueZ 3/3] core: Attach and detach object manager

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


2012-11-29 13:19:32

by Lucas De Marchi

[permalink] [raw]
Subject: [PATCH BlueZ 2/3] gdbus: Don't automatically attach ObjectManager

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