From 729824372e5d7fd1231c73afea1bea061dd85cc1 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 4 Jun 2007 10:30:45 +0000 Subject: Implement Manager.FindDeviceByAddress method --- audio/audio-api.txt | 6 ++++++ audio/manager.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ audio/manager.h | 1 + 3 files changed, 53 insertions(+) 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); -- cgit