diff options
Diffstat (limited to 'hcid')
| -rw-r--r-- | hcid/dbus-manager.c | 7 | ||||
| -rw-r--r-- | hcid/dbus-service.c | 50 | ||||
| -rw-r--r-- | hcid/dbus.h | 3 | 
3 files changed, 42 insertions, 18 deletions
diff --git a/hcid/dbus-manager.c b/hcid/dbus-manager.c index 518a0d35..87799309 100644 --- a/hcid/dbus-manager.c +++ b/hcid/dbus-manager.c @@ -218,14 +218,16 @@ static DBusHandlerResult list_services(DBusConnection *conn,  static DBusHandlerResult register_service(DBusConnection *conn,  						DBusMessage *msg, void *data)  { +	const char *path, *name, *description;  	DBusMessage *message; -	const char *path;  	DBusError err;  	int reg_err;  	dbus_error_init(&err);  	dbus_message_get_args(msg, &err,  				DBUS_TYPE_STRING, &path, +				DBUS_TYPE_STRING, &name, +				DBUS_TYPE_STRING, &description,  				DBUS_TYPE_INVALID);  	if (dbus_error_is_set(&err)) { @@ -235,7 +237,8 @@ static DBusHandlerResult register_service(DBusConnection *conn,  	}  	reg_err = register_service_agent(conn, dbus_message_get_sender(msg), -						path); +					path, name, description); +  	if (reg_err < 0)  		return error_failed(conn, msg, -reg_err); diff --git a/hcid/dbus-service.c b/hcid/dbus-service.c index 626062e5..dac91746 100644 --- a/hcid/dbus-service.c +++ b/hcid/dbus-service.c @@ -174,7 +174,29 @@ static void forward_reply(DBusPendingCall *call, void *udata)  static DBusHandlerResult get_interface_names(DBusConnection *conn,  						DBusMessage *msg, void *data)  { -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +	DBusPendingCall *pending; +	struct service_call *call_data; +	struct service_agent *agent  = data; +	DBusMessage *forward = dbus_message_copy(msg); +	const char *path = dbus_message_get_path(msg); + +	dbus_message_set_destination(forward, agent->id); +	dbus_message_set_interface(forward, "org.bluez.ServiceAgent"); +	dbus_message_set_path(forward, path); +	dbus_message_set_member(forward, "Interfaces"); + +	call_data = malloc(sizeof(struct service_call)); +	call_data->conn = dbus_connection_ref(conn); +	call_data->msg = dbus_message_ref(msg); + +	if (dbus_connection_send_with_reply(conn, forward, &pending, -1) == FALSE) { +		dbus_message_unref(forward); +		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +	} + +	dbus_pending_call_set_notify(pending, forward_reply, call_data, service_call_free); +	dbus_message_unref(forward); +	return DBUS_HANDLER_RESULT_HANDLED;  }  static DBusHandlerResult get_connection_name(DBusConnection *conn, @@ -199,16 +221,15 @@ static DBusHandlerResult get_connection_name(DBusConnection *conn,  static DBusHandlerResult get_name(DBusConnection *conn,  					DBusMessage *msg, void *data)  { + +	struct service_agent *agent = data;  	DBusMessage *reply; -	struct service_agent *agent;  	const char *name = "";  	reply = dbus_message_new_method_return(msg);  	if (!reply)  		return DBUS_HANDLER_RESULT_NEED_MEMORY; -	agent = data; -  	if (agent->name)  		name = agent->name; @@ -292,10 +313,10 @@ static DBusHandlerResult remove_trust(DBusConnection *conn,  }  static struct service_data services_methods[] = { -	{ "GetInterfaceNames",	get_interface_names	}, -	{ "GetConnectionName",	get_connection_name	},  	{ "GetName",		get_name		},  	{ "GetDescription",	get_description		}, +	{ "GetInterfaceNames",  get_interface_names	}, +	{ "GetConnectionName",	get_connection_name	},  	{ "Start",		start			},  	{ "Stop",		stop			},  	{ "IsRunning",		is_running		}, @@ -307,7 +328,6 @@ static struct service_data services_methods[] = {  	{ NULL, NULL }  }; -  static DBusHandlerResult msg_func_services(DBusConnection *conn,  					DBusMessage *msg, void *data)  { @@ -337,14 +357,13 @@ static DBusHandlerResult msg_func_services(DBusConnection *conn,  	call_data->msg = dbus_message_ref(msg);  	if (dbus_connection_send_with_reply(conn, forward, &pending, -1) == FALSE) { -		/* FIXME: How handle this? */ -		error("Can't foward the message.");  		dbus_message_unref(forward);  		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;  	}  	dbus_pending_call_set_notify(pending, forward_reply, call_data, service_call_free);  	dbus_message_unref(forward); +  	return DBUS_HANDLER_RESULT_HANDLED;  } @@ -353,21 +372,22 @@ static const DBusObjectPathVTable services_vtable = {  	.unregister_function	= NULL  }; -int register_service_agent(DBusConnection *conn, const char *sender ,const char *path) +int register_service_agent(DBusConnection *conn, const char *sender, +				const char *path, const char *name, const char *description)  {  	struct service_agent *agent;  	debug("Registering service object: %s", path); -	 -	/* FIXME: the manager fallback '/org/bluez' should not return no such adapter */  	/* Check if the name is already used? */ -	agent = service_agent_new(sender, NULL, NULL); +	agent = service_agent_new(sender, name, description);  	if (!agent)  		return -ENOMEM; -	if (!dbus_connection_register_object_path(conn, path, &services_vtable, agent)) +	if (!dbus_connection_register_object_path(conn, path, &services_vtable, agent)) { +		free(agent);  		return -1; +	}  	services = slist_append(services, strdup(path)); @@ -392,7 +412,7 @@ int unregister_service_agent(DBusConnection *conn, const char *sender, const cha  	if (!dbus_connection_unregister_object_path (conn, path))  		return -1; -	l = slist_find(services, path, strcmp); +	l = slist_find(services, path, (cmp_func_t) strcmp);  	if (l)  		services = slist_remove(services, l->data); diff --git a/hcid/dbus.h b/hcid/dbus.h index a36e4c21..6d8b80b0 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -158,7 +158,8 @@ typedef int unregister_function_t(DBusConnection *conn, uint16_t id);  DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *data);  DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void *data); -int register_service_agent(DBusConnection *conn, const char *sender, const char *path); +int register_service_agent(DBusConnection *conn, const char *sender, const char *path, +				const char *name, const char *description);  int unregister_service_agent(DBusConnection *conn, const char *sender, const char *path);  void append_available_services(DBusMessageIter *iter);  | 
