From b81374ec8001e307507cd98bf3902fc594f4d428 Mon Sep 17 00:00:00 2001 From: Andrei Emeltchenko Date: Thu, 19 Dec 2013 10:49:18 +0200 Subject: [PATCH] android/socket: Refactor connect to allow directly connect to rfcomm Since Socket HAL allows us to specify RFCOMM channel number and directly connect refactor send function to allow connect directly is uuid is zero and channel number is specified. --- android/socket.c | 71 ++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/android/socket.c b/android/socket.c index cee4b6eda..656222ea7 100644 --- a/android/socket.c +++ b/android/socket.c @@ -838,13 +838,47 @@ fail: cleanup_rfsock(rfsock); } -static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data) +static bool do_connect(struct rfcomm_sock *rfsock, int chan) { - struct rfcomm_sock *rfsock = data; BtIOSecLevel sec_level = BT_IO_SEC_MEDIUM; + GIOChannel *io; GError *gerr = NULL; + + if (rfsock->profile) + sec_level = rfsock->profile->sec_level; + + io = bt_io_connect(connect_cb, rfsock, NULL, &gerr, + BT_IO_OPT_SOURCE_BDADDR, &adapter_addr, + BT_IO_OPT_DEST_BDADDR, &rfsock->dst, + BT_IO_OPT_CHANNEL, chan, + BT_IO_OPT_SEC_LEVEL, sec_level, + BT_IO_OPT_INVALID); + if (!io) { + error("Failed connect: %s", gerr->message); + g_error_free(gerr); + return false; + } + + g_io_channel_set_close_on_unref(io, FALSE); + g_io_channel_unref(io); + + if (write(rfsock->fd, &chan, sizeof(chan)) != sizeof(chan)) { + error("Error sending RFCOMM channel"); + return false; + } + + rfsock->real_sock = g_io_channel_unix_get_fd(io); + rfsock_set_buffer(rfsock); + rfsock->channel = chan; + connections = g_list_append(connections, rfsock); + + return true; +} + +static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data) +{ + struct rfcomm_sock *rfsock = data; sdp_list_t *list; - GIOChannel *io; int chan; DBG(""); @@ -885,36 +919,9 @@ static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data) DBG("Got RFCOMM channel %d", chan); - if (rfsock->profile) - sec_level = rfsock->profile->sec_level; - - io = bt_io_connect(connect_cb, rfsock, NULL, &gerr, - BT_IO_OPT_SOURCE_BDADDR, &adapter_addr, - BT_IO_OPT_DEST_BDADDR, &rfsock->dst, - BT_IO_OPT_CHANNEL, chan, - BT_IO_OPT_SEC_LEVEL, sec_level, - BT_IO_OPT_INVALID); - if (!io) { - error("Failed connect: %s", gerr->message); - g_error_free(gerr); - goto fail; - } - - if (write(rfsock->fd, &chan, sizeof(chan)) != sizeof(chan)) { - error("Error sending RFCOMM channel"); - goto fail; - } - - rfsock->real_sock = g_io_channel_unix_get_fd(io); - rfsock_set_buffer(rfsock); - rfsock->channel = chan; - connections = g_list_append(connections, rfsock); - - g_io_channel_unref(io); - - return; + if (do_connect(rfsock, chan)) + return; fail: - connections = g_list_remove(connections, rfsock); cleanup_rfsock(rfsock); } -- 2.47.3