diff options
| -rw-r--r-- | audio/audio-api.txt | 6 | ||||
| -rw-r--r-- | audio/manager.c | 46 | ||||
| -rw-r--r-- | audio/manager.h | 1 | 
3 files changed, 53 insertions, 0 deletions
| diff --git a/audio/audio-api.txt b/audio/audio-api.txt index f391415f..19cefc69 100644 --- a/audio/audio-api.txt +++ b/audio/audio-api.txt @@ -39,6 +39,12 @@ Methods  			Returns list of headset objects that are configured. +		array{string} FindDeviceByAddress(string address) + +			Searches the list of available devices and returns the +			first device which matchess address. If no device is +			found returns a DoesNotExist error. +  		string DefaultHeadset()  			Returns the object path for the default headset device. diff --git a/audio/manager.c b/audio/manager.c index 748f2b71..1b727f7a 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -137,6 +137,12 @@ DBusHandlerResult err_connect_failed(DBusConnection *conn,  				strerror(err));  } +DBusHandlerResult err_does_not_exist(DBusConnection *conn, DBusMessage *msg) +{ +	return error_reply(conn, msg, "org.bluez.audio.Error.DoesNotExist", +				"Does not exist"); +} +  DBusHandlerResult err_failed(DBusConnection *conn, DBusMessage *msg,  				const char *dsc)  { @@ -1110,6 +1116,44 @@ static DBusHandlerResult am_list_headsets(DBusConnection *conn, DBusMessage *msg  	return send_message_and_unref(connection, reply);  } +static DBusHandlerResult am_find_by_addr(DBusConnection *conn, DBusMessage *msg, +						void *data) +{ +	const char *path, *address; +	DBusMessage *reply; +	DBusError derr; +	audio_device_t *device; +	bdaddr_t bda; + +	dbus_error_init(&derr); +	dbus_message_get_args(msg, &derr, +				DBUS_TYPE_STRING, &address, +				DBUS_TYPE_INVALID); +	if (dbus_error_is_set(&derr)) { +		err_invalid_args(connection, msg, derr.message); +		dbus_error_free(&derr); +		return DBUS_HANDLER_RESULT_HANDLED; +	} + +	str2ba(address, &bda); + +	device = find_device(&bda); + +	if (!device) +		return err_does_not_exist(conn, msg); + +	reply = dbus_message_new_method_return(msg); +	if (!reply) +		return DBUS_HANDLER_RESULT_NEED_MEMORY; + +	path = device->object_path; + +	dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, +					DBUS_TYPE_INVALID); + +	return send_message_and_unref(conn, reply); +} +  static DBusHandlerResult am_get_default_headset(DBusConnection *conn, DBusMessage *msg,  						void *data)  { @@ -1190,6 +1234,8 @@ static DBusMethodVTable manager_methods[] = {  		"s",	""		},  	{ "ListHeadsets",		am_list_headsets,  		"",	"as"		}, +	{ "FindDeviceByAddress",	am_find_by_addr, +		"s",	"s"		},  	{ "DefaultHeadset",		am_get_default_headset,  		"",	"s"		},  	{ "ChangeDefaultHeadset",	am_change_default_headset, diff --git a/audio/manager.h b/audio/manager.h index 78ec63ab..45d93d7f 100644 --- a/audio/manager.h +++ b/audio/manager.h @@ -90,6 +90,7 @@ DBusHandlerResult err_not_connected(DBusConnection *conn, DBusMessage *msg);  DBusHandlerResult err_not_supported(DBusConnection *conn, DBusMessage *msg);  DBusHandlerResult err_connect_failed(DBusConnection *conn,  					DBusMessage *msg, int err); +DBusHandlerResult err_does_not_exist(DBusConnection *conn, DBusMessage *msg);  DBusHandlerResult err_failed(DBusConnection *conn, DBusMessage *msg,  				const char *dsc); | 
