diff options
Diffstat (limited to 'audio/manager.c')
| -rw-r--r-- | audio/manager.c | 125 | 
1 files changed, 75 insertions, 50 deletions
| diff --git a/audio/manager.c b/audio/manager.c index 6eebce94..4d8d424d 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -1383,10 +1383,11 @@ int remove_service_record(DBusConnection *conn, uint32_t rec_id)  	return 0;  } -static void send_cancel_auth(struct device *device) +static void auth_cb(DBusPendingCall *call, void *data)  { -	DBusMessage *cancel; -	char addr[18], *address = addr; +	struct device *device = data; +	DBusMessage *reply = dbus_pending_call_steal_reply(call); +	DBusError err;  	const char *uuid;  	if (headset_get_type(device) == SVC_HEADSET) @@ -1394,35 +1395,12 @@ static void send_cancel_auth(struct device *device)  	else  		uuid = HFP_AG_UUID; -	cancel = dbus_message_new_method_call("org.bluez", "/org/bluez", -						"org.bluez.Database", -						"CancelAuthorizationRequest"); -	if (!cancel) { -		error("Unable to allocate new method call"); -		return; -	} - -	ba2str(&device->dst, addr); - -	dbus_message_append_args(cancel, DBUS_TYPE_STRING, &address, -						DBUS_TYPE_STRING, &uuid, -							DBUS_TYPE_INVALID); - -	send_message_and_unref(connection, cancel); -} - -static void auth_cb(DBusPendingCall *call, void *data) -{ -	struct device *device = data; -	DBusMessage *reply = dbus_pending_call_steal_reply(call); -	DBusError err; -  	dbus_error_init(&err);  	if (dbus_set_error_from_message(&err, reply)) {  		error("Access denied: %s", err.message);  		if (dbus_error_has_name(&err, DBUS_ERROR_NO_REPLY)) {  			debug("Canceling authorization request"); -			send_cancel_auth(device); +			manager_cancel_authorize(&device->dst, uuid, NULL);  		}  		dbus_error_free(&err); @@ -1446,11 +1424,8 @@ static gboolean ag_io_cb(GIOChannel *chan, GIOCondition cond, void *data)  	int srv_sk, cli_sk;  	struct sockaddr_rc addr;  	socklen_t size; -	char hs_address[18], *address = hs_address;  	const char *uuid;  	struct device *device; -	DBusMessage *auth; -	DBusPendingCall *pending;  	headset_type_t type;  	if (cond & G_IO_NVAL) @@ -1500,28 +1475,9 @@ static gboolean ag_io_cb(GIOChannel *chan, GIOCondition cond, void *data)  	headset_set_type(device, type); -	auth = dbus_message_new_method_call("org.bluez", "/org/bluez", -						"org.bluez.Database", -						"RequestAuthorization"); -	if (!auth) { -		error("Unable to allocate RequestAuthorization method call"); +	if (!manager_authorize(&device->dst, uuid, auth_cb, device, NULL))  		goto failed; -	} -	ba2str(&device->dst, hs_address); - -	dbus_message_append_args(auth, DBUS_TYPE_STRING, &address, -						DBUS_TYPE_STRING, &uuid, -							DBUS_TYPE_INVALID); - -	if (!dbus_connection_send_with_reply(connection, auth, &pending, -1)) { -		error("Sending of authorization request failed"); -		goto failed; -	} - -	dbus_pending_call_set_notify(pending, auth_cb, device, NULL); -	dbus_pending_call_unref(pending); -	dbus_message_unref(auth);  	headset_set_state(device, HEADSET_STATE_CONNECT_IN_PROGRESS);  	return TRUE; @@ -1734,3 +1690,72 @@ struct device *manager_get_connected_device(void)  	return NULL;  } + +void manager_cancel_authorize(bdaddr_t *dba, const char *uuid, +				DBusPendingCall *pending) +{ +	DBusMessage *cancel; +	char addr[18], *address = addr; + +	if (pending) +		dbus_pending_call_cancel(pending); + +	cancel = dbus_message_new_method_call("org.bluez", "/org/bluez", +						"org.bluez.Database", +						"CancelAuthorizationRequest"); +	if (!cancel) { +		error("Unable to allocate new method call"); +		return; +	} + +	ba2str(dba, addr); + +	dbus_message_append_args(cancel, DBUS_TYPE_STRING, &address, +					DBUS_TYPE_STRING, &uuid, +					DBUS_TYPE_INVALID); + +	send_message_and_unref(connection, cancel); +} + +gboolean manager_authorize(bdaddr_t *dba, const char *uuid, +				DBusPendingCallNotifyFunction cb, +				void *user_data, +				DBusPendingCall **pending) +{ +	DBusMessage *auth; +	char address[18], *addr_ptr = address; +	DBusPendingCall *p; + +	ba2str(dba, address); + +	debug("Requesting authorization for device %s, UUID %s", +			address, uuid); + +	auth = dbus_message_new_method_call("org.bluez", "/org/bluez", +						"org.bluez.Database", +						"RequestAuthorization"); +	if (!auth) { +		error("Unable to allocate RequestAuthorization method call"); +		return FALSE; +	} + +	dbus_message_append_args(auth, DBUS_TYPE_STRING, &addr_ptr, +					DBUS_TYPE_STRING, &uuid, +					DBUS_TYPE_INVALID); + +	if (!dbus_connection_send_with_reply(connection, auth, &p, -1)) { +		error("Sending of authorization request failed"); +		dbus_message_unref(auth); +		return FALSE; +	} + +	dbus_pending_call_set_notify(p, cb, user_data, NULL); +	if (pending) +		*pending = p; +	else +		dbus_pending_call_unref(p); + +	dbus_message_unref(auth); + +	return TRUE; +} | 
