summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2007-01-18 23:39:27 +0000
committerMarcel Holtmann <marcel@holtmann.org>2007-01-18 23:39:27 +0000
commitf7c027662d2066b3862f41dbae3b68e5c1bafce7 (patch)
treed6c0f424489c1dda2a6470d89fbb1eccca32fd30 /common
parentd71d1b8aac88cc66455016e38ebdc1f79c19f36b (diff)
Add support for multiple interfaces at a path
Diffstat (limited to 'common')
-rw-r--r--common/dbus-helper.c61
-rw-r--r--common/dbus-helper.h3
2 files changed, 55 insertions, 9 deletions
diff --git a/common/dbus-helper.c b/common/dbus-helper.c
index bb6e7102..71d1eeb7 100644
--- a/common/dbus-helper.c
+++ b/common/dbus-helper.c
@@ -30,6 +30,7 @@
#include <dbus/dbus.h>
+#include "glib-ectomy.h"
#include "logging.h"
#include "dbus-helper.h"
@@ -37,9 +38,13 @@
struct generic_data {
void *user_data;
DBusObjectPathUnregisterFunction unregister_function;
+ GSList *interfaces;
+ char *introspect;
+};
+
+struct interface_data {
const char *interface;
DBusMethodVTable *methods;
- char *introspect;
};
DBusHandlerResult dbus_connection_send_and_unref(DBusConnection *connection,
@@ -87,20 +92,42 @@ static void generic_unregister(DBusConnection *connection, void *user_data)
free(data);
}
+static struct interface_data *find_interface(GSList *interfaces,
+ const char *interface)
+{
+ GSList *list;
+
+ for (list = interfaces; list; list = list->next) {
+ struct interface_data *iface = list->data;
+ if (!strcmp(interface, iface->interface))
+ return iface;
+ }
+
+ return NULL;
+}
+
static DBusHandlerResult generic_message(DBusConnection *connection,
DBusMessage *message, void *user_data)
{
struct generic_data *data = user_data;
+ struct interface_data *iface;
DBusMethodVTable *current;
+ const char *interface;
if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE,
"Introspect") == TRUE)
return introspect(connection, message, data);
- for (current = data->methods;
+ interface = dbus_message_get_interface(message);
+
+ iface = find_interface(data->interfaces, interface);
+ if (!iface)
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ for (current = iface->methods;
current->name && current->message_function; current++) {
if (dbus_message_is_method_call(message,
- data->interface, current->name) == FALSE)
+ iface->interface, current->name) == FALSE)
continue;
if (dbus_message_has_signature(message,
@@ -117,6 +144,8 @@ static DBusObjectPathVTable generic_table = {
.message_function = generic_message,
};
+static char simple_xml[] = DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<node></node>";
+
dbus_bool_t dbus_connection_create_object_path(DBusConnection *connection,
const char *path, void *user_data,
DBusObjectPathUnregisterFunction function)
@@ -132,6 +161,9 @@ dbus_bool_t dbus_connection_create_object_path(DBusConnection *connection,
data->user_data = user_data;
data->unregister_function = function;
+ data->interfaces = NULL;
+ data->introspect = simple_xml;
+
if (dbus_connection_register_object_path(connection, path,
&generic_table, data) == FALSE) {
free(data);
@@ -147,29 +179,40 @@ dbus_bool_t dbus_connection_destroy_object_path(DBusConnection *connection,
return dbus_connection_unregister_object_path(connection, path);
}
-static char simple_xml[] = DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<node></node>";
-
dbus_bool_t dbus_connection_register_interface(DBusConnection *connection,
const char *path, const char *interface,
DBusMethodVTable *methods,
DBusPropertyVTable *properties)
{
struct generic_data *data;
+ struct interface_data *iface;
DBusMethodVTable *current;
if (dbus_connection_get_object_path_data(connection, path,
(void *) &data) == FALSE)
return FALSE;
- data->interface = interface;
- data->methods = methods;
+ iface = malloc(sizeof(*iface));
+ if (!iface)
+ return FALSE;
+
+ memset(iface, 0, sizeof(*iface));
+
+ iface->interface = interface;
+ iface->methods = methods;
- for (current = data->methods; current->name; current++) {
+ for (current = iface->methods; current->name; current++) {
debug("Adding introspection data for %s.%s",
interface, current->name);
}
- data->introspect = simple_xml;
+ data->interfaces = g_slist_append(data->interfaces, iface);
return TRUE;
}
+
+dbus_bool_t dbus_connection_unregister_interface(DBusConnection *connection,
+ const char *path, const char *interface)
+{
+ return TRUE;
+}
diff --git a/common/dbus-helper.h b/common/dbus-helper.h
index a4e405ff..0e7162f2 100644
--- a/common/dbus-helper.h
+++ b/common/dbus-helper.h
@@ -49,3 +49,6 @@ dbus_bool_t dbus_connection_register_interface(DBusConnection *connection,
const char *path, const char *interface,
DBusMethodVTable *methods,
DBusPropertyVTable *properties);
+
+dbus_bool_t dbus_connection_unregister_interface(DBusConnection *connection,
+ const char *path, const char *interface);