diff options
| -rw-r--r-- | common/dbus.c | 29 | ||||
| -rw-r--r-- | common/dbus.h | 17 | 
2 files changed, 43 insertions, 3 deletions
diff --git a/common/dbus.c b/common/dbus.c index 730dfb67..63e5e38f 100644 --- a/common/dbus.c +++ b/common/dbus.c @@ -611,7 +611,8 @@ DBusConnection *init_dbus(const char *name, void (*disconnect_cb)(void *), void  static char simple_xml[] = DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<node></node>"; -DBusHandlerResult simple_introspect(DBusConnection *conn, DBusMessage *msg, void *data) +DBusHandlerResult simple_introspect(DBusConnection *conn, +					DBusMessage *msg, void *user_data)  {  	DBusMessage *reply;  	const char *path, *ptr = simple_xml; @@ -634,3 +635,29 @@ DBusHandlerResult simple_introspect(DBusConnection *conn, DBusMessage *msg, void  	return send_message_and_unref(conn, reply);  } + +static DBusHandlerResult generic_message_function(DBusConnection *conn, +					DBusMessage *msg, void *user_data) +{ +	struct message_table *table = user_data; +	struct message_table *current; +	const char *member; + +	if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, +							"Introspect") == TRUE) +		return simple_introspect(conn, msg, user_data); + +	member = dbus_message_get_member(msg); + +	for (current = table; current->handler; current++) { +		if (dbus_message_is_method_call(msg, current->interface, current->member) == TRUE && +				dbus_message_has_signature(msg, current->signature) == TRUE) +			return current->handler(conn, msg, user_data); +	} + +	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +DBusObjectPathVTable generic_object_path = { +	.message_function = generic_message_function, +}; diff --git a/common/dbus.h b/common/dbus.h index 51049391..d050237d 100644 --- a/common/dbus.h +++ b/common/dbus.h @@ -28,6 +28,21 @@  DBusConnection *init_dbus(const char *name, void (*disconnect_cb)(void *), void *user_data); +typedef DBusHandlerResult (*message_func_t) (DBusConnection *conn, +					DBusMessage *msg, void *user_data); + +struct message_table { +	const char *interface; +	const char *member; +	const char *signature; +	message_func_t handler; +}; + +extern DBusObjectPathVTable generic_object_path; + +DBusHandlerResult simple_introspect(DBusConnection *conn, +					DBusMessage *msg, void *user_data); +  typedef void (*name_cb_t)(const char *name, void *user_data);  int name_listener_add(DBusConnection *connection, const char *name, @@ -38,8 +53,6 @@ int name_listener_remove(DBusConnection *connection, const char *name,  dbus_bool_t dbus_bus_get_unix_process_id(DBusConnection *conn, const char *name,  						unsigned long *pid); -DBusHandlerResult simple_introspect(DBusConnection *conn, DBusMessage *msg, void *data); -  static inline DBusHandlerResult send_message_and_unref(DBusConnection *conn, DBusMessage *msg)  {  	if (msg) {  | 
