From: "RISKÓ Gergely" <gergely@risko.hu>
To: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Cc: linux-bluetooth@vger.kernel.org,
Context Devel mailing list <context-devel@projects.maemo.org>
Subject: Re: [PATCH] Add introspection interface to the output of introspection calls.
Date: Wed, 16 Sep 2009 14:07:22 +0300 [thread overview]
Message-ID: <87eiq7du6t.fsf@bubble.risko.hu> (raw)
In-Reply-To: <20090915152240.GA4378@jh-x301> (Johan Hedberg's message of "Tue, 15 Sep 2009 18:22:40 +0300")
Hi,
Thanks for all the comments again, here is the next round.
Diffstat says 58 insertions, 43 deletions, I think the extra 15 lines
really worth that bluez no longer treats the introspection as a very
specific interface.
BR,
Gergely
>From de18b546d3773e33c65616680a6608457804d894 Mon Sep 17 00:00:00 2001
From: Gergely Risko <gergely@risko.hu>
Date: Tue, 15 Sep 2009 15:23:24 +0300
Subject: [PATCH] gdbus: handle introspection generally in generic_message.
Previously it was a specific case, now introspection is just another
interface, which is always implemented. It is registered/unregistered
when an object path is referenced first/last.
---
gdbus/object.c | 101 ++++++++++++++++++++++++++++++++------------------------
1 files changed, 58 insertions(+), 43 deletions(-)
diff --git a/gdbus/object.c b/gdbus/object.c
index 811c2e1..09e9af7 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -155,13 +155,7 @@ static void generate_introspection_xml(DBusConnection *conn,
gstr = g_string_new(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE);
- g_string_append_printf(gstr,
- "<node name=\"%s\">\n"
- "\t<interface name=\"org.freedesktop.DBus.Introspectable\">\n"
- "\t\t<method name=\"Introspect\">\n"
- "\t\t\t<arg name=\"xml_data\" type=\"s\" direction=\"out\"/>\n"
- "\t\t</method>\n"
- "\t</interface>\n", path);
+ g_string_append_printf(gstr, "<node name=\"%s\">\n", path);
for (list = data->interfaces; list; list = list->next) {
struct interface_data *iface = list->data;
@@ -189,14 +183,15 @@ done:
data->introspect = g_string_free(gstr, FALSE);
}
-static DBusHandlerResult introspect(DBusConnection *connection,
- DBusMessage *message, struct generic_data *data)
+static DBusMessage *introspect(DBusConnection *connection,
+ DBusMessage *message, void *user_data)
{
+ struct generic_data *data = user_data;
DBusMessage *reply;
if (!dbus_message_has_signature(message, DBUS_TYPE_INVALID_AS_STRING)) {
error("Unexpected signature to introspect call");
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ return NULL;
}
if (!data->introspect)
@@ -205,16 +200,12 @@ static DBusHandlerResult introspect(DBusConnection *connection,
reply = dbus_message_new_method_return(message);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
dbus_message_append_args(reply, DBUS_TYPE_STRING, &data->introspect,
DBUS_TYPE_INVALID);
- dbus_connection_send(connection, reply, NULL);
-
- dbus_message_unref(reply);
-
- return DBUS_HANDLER_RESULT_HANDLED;
+ return reply;
}
static void generic_unregister(DBusConnection *connection, void *user_data)
@@ -250,11 +241,6 @@ static DBusHandlerResult generic_message(DBusConnection *connection,
GDBusMethodTable *method;
const char *interface;
- if (dbus_message_is_method_call(message,
- DBUS_INTERFACE_INTROSPECTABLE,
- "Introspect"))
- return introspect(connection, message, data);
-
interface = dbus_message_get_interface(message);
iface = find_interface(data->interfaces, interface);
@@ -335,6 +321,31 @@ done:
g_free(parent_path);
}
+static GDBusMethodTable introspect_methods[] = {
+ { "Introspect", "", "s", introspect },
+ { }
+};
+
+static void add_interface(struct generic_data *data, const char *name,
+ GDBusMethodTable *methods,
+ GDBusSignalTable *signals,
+ GDBusPropertyTable *properties,
+ void *user_data,
+ GDBusDestroyFunction destroy)
+{
+ struct interface_data *iface;
+
+ iface = g_new0(struct interface_data, 1);
+ iface->name = g_strdup(name);
+ iface->methods = methods;
+ iface->signals = signals;
+ iface->properties = properties;
+ iface->user_data = user_data;
+ iface->destroy = destroy;
+
+ data->interfaces = g_slist_append(data->interfaces, iface);
+}
+
static struct generic_data *object_path_ref(DBusConnection *connection,
const char *path)
{
@@ -363,9 +374,30 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
invalidate_parent_data(connection, path);
+ add_interface(data, DBUS_INTERFACE_INTROSPECTABLE,
+ introspect_methods, NULL, NULL, data, NULL);
+
return data;
}
+static gboolean remove_interface(struct generic_data *data, const char *name)
+{
+ struct interface_data *iface;
+
+ iface = find_interface(data->interfaces, name);
+ if (iface) {
+ data->interfaces = g_slist_remove(data->interfaces, iface);
+
+ if (iface->destroy)
+ iface->destroy(iface->user_data);
+
+ g_free(iface->name);
+ g_free(iface);
+ return TRUE;
+ } else
+ return FALSE;
+}
+
static void object_path_unref(DBusConnection *connection, const char *path)
{
struct generic_data *data = NULL;
@@ -382,6 +414,8 @@ static void object_path_unref(DBusConnection *connection, const char *path)
if (data->refcount > 0)
return;
+ remove_interface(data, DBUS_INTERFACE_INTROSPECTABLE);
+
invalidate_parent_data(connection, path);
dbus_connection_unregister_object_path(connection, path);
@@ -474,7 +508,6 @@ gboolean g_dbus_register_interface(DBusConnection *connection,
GDBusDestroyFunction destroy)
{
struct generic_data *data;
- struct interface_data *iface;
data = object_path_ref(connection, path);
if (data == NULL)
@@ -483,16 +516,8 @@ gboolean g_dbus_register_interface(DBusConnection *connection,
if (find_interface(data->interfaces, name))
return FALSE;
- iface = g_new0(struct interface_data, 1);
-
- iface->name = g_strdup(name);
- iface->methods = methods;
- iface->signals = signals;
- iface->properties = properties;
- iface->user_data = user_data;
- iface->destroy = destroy;
-
- data->interfaces = g_slist_append(data->interfaces, iface);
+ add_interface(data, name, methods, signals,
+ properties, user_data, destroy);
g_free(data->introspect);
data->introspect = NULL;
@@ -504,7 +529,6 @@ gboolean g_dbus_unregister_interface(DBusConnection *connection,
const char *path, const char *name)
{
struct generic_data *data = NULL;
- struct interface_data *iface;
if (!path)
return FALSE;
@@ -516,18 +540,9 @@ gboolean g_dbus_unregister_interface(DBusConnection *connection,
if (data == NULL)
return FALSE;
- iface = find_interface(data->interfaces, name);
- if (!iface)
+ if (remove_interface(data, name) == FALSE)
return FALSE;
- data->interfaces = g_slist_remove(data->interfaces, iface);
-
- if (iface->destroy)
- iface->destroy(iface->user_data);
-
- g_free(iface->name);
- g_free(iface);
-
g_free(data->introspect);
data->introspect = NULL;
--
1.6.0.4
next prev parent reply other threads:[~2009-09-16 11:07 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-01 14:10 [PATCH] bluez git HEAD doesn't put introspection methods into the introspection output RISKÓ Gergely
2009-09-02 10:00 ` [PATCH] Add introspection interface to the output of introspection calls RISKÓ Gergely
2009-09-02 14:46 ` Luiz Augusto von Dentz
2009-09-02 17:48 ` RISKÓ Gergely
2009-09-14 14:18 ` Johan Hedberg
2009-09-14 14:52 ` RISKÓ Gergely
2009-09-14 21:11 ` Johan Hedberg
2009-09-15 10:50 ` Luiz Augusto von Dentz
2009-09-15 12:28 ` RISKÓ Gergely
2009-09-15 15:22 ` Johan Hedberg
2009-09-15 17:27 ` Marcel Holtmann
2009-09-15 17:55 ` Johan Hedberg
2009-09-15 19:25 ` RISKÓ Gergely
2009-09-16 11:07 ` RISKÓ Gergely [this message]
2009-09-16 11:39 ` Johan Hedberg
2009-09-16 12:03 ` RISKÓ Gergely
2009-09-24 17:22 ` Johan Hedberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87eiq7du6t.fsf@bubble.risko.hu \
--to=gergely@risko.hu \
--cc=context-devel@projects.maemo.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox