summaryrefslogtreecommitdiff
path: root/audio/gateway.c
diff options
context:
space:
mode:
authorFrédéric Dalleau <frederic.dalleau@linux.intel.com>2011-09-06 15:55:51 +0200
committerJohan Hedberg <johan.hedberg@intel.com>2011-09-22 20:10:17 +0900
commitdfea776a9c98791fa584345f48d3ec39e9ef28ad (patch)
treef59769289d4ee1dec81ccbfd0453d490791c1b8c /audio/gateway.c
parentf00fc7ae6d70ca734be3826534ff18faac3ecdc8 (diff)
downloadbluez-dfea776a9c98791fa584345f48d3ec39e9ef28ad.tar.gz
Set state to "connecting" on connection requested
Make sure that state changes to disconnected on errors (authorization refused, disconnect, sdp) This change will become necessary when integrating the Audio interface which rely on state change to confirm that connection has started successfully.
Diffstat (limited to 'audio/gateway.c')
-rw-r--r--audio/gateway.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/audio/gateway.c b/audio/gateway.c
index b788de7b1..945477efe 100644
--- a/audio/gateway.c
+++ b/audio/gateway.c
@@ -323,8 +323,6 @@ static void rfcomm_connect_cb(GIOChannel *chan, GError *err,
goto fail;
}
- change_state(dev, GATEWAY_STATE_CONNECTING);
-
sk = g_io_channel_unix_get_fd(chan);
gw->rfcomm = g_io_channel_ref(chan);
@@ -387,17 +385,23 @@ static void get_incoming_record_cb(sdp_list_t *recs, int err,
if (err < 0) {
error("Unable to get service record: %s (%d)", strerror(-err),
-err);
- return;
+ goto fail;
}
if (!recs || !recs->data) {
error("No records found");
- return;
+ goto fail;
}
gw->version = get_remote_profile_version(recs->data);
- if (gw->version > 0)
- rfcomm_connect_cb(gw->incoming, gerr, dev);
+ if (gw->version == 0)
+ goto fail;
+
+ rfcomm_connect_cb(gw->incoming, gerr, dev);
+ return;
+
+fail:
+ gateway_close(dev);
}
static void unregister_incoming(gpointer user_data)
@@ -423,8 +427,11 @@ static void rfcomm_incoming_cb(GIOChannel *chan, GError *err,
sdp_uuid16_create(&uuid, HANDSFREE_AGW_SVCLASS_ID);
if (bt_search_service(&dev->src, &dev->dst, &uuid,
get_incoming_record_cb, dev,
- unregister_incoming) < 0)
- unregister_incoming(dev);
+ unregister_incoming) == 0)
+ return;
+
+ unregister_incoming(dev);
+ gateway_close(dev);
}
static void get_record_cb(sdp_list_t *recs, int err, gpointer user_data)
@@ -499,8 +506,6 @@ static void get_record_cb(sdp_list_t *recs, int err, gpointer user_data)
}
g_io_channel_unref(io);
-
- change_state(dev, GATEWAY_STATE_CONNECTING);
return;
fail:
@@ -520,6 +525,7 @@ static int get_records(struct audio_device *device)
{
uuid_t uuid;
+ change_state(device, GATEWAY_STATE_CONNECTING);
sdp_uuid16_create(&uuid, HANDSFREE_AGW_SVCLASS_ID);
return bt_search_service(&device->src, &device->dst, &uuid,
get_record_cb, device, NULL);
@@ -764,6 +770,8 @@ int gateway_connect_rfcomm(struct audio_device *dev, GIOChannel *io)
dev->gateway->rfcomm = g_io_channel_ref(io);
+ change_state(dev, GATEWAY_STATE_CONNECTING);
+
return 0;
}
@@ -795,6 +803,7 @@ void gateway_start_service(struct audio_device *dev)
if (!bt_io_accept(gw->rfcomm, rfcomm_incoming_cb, dev, NULL, &err)) {
error("bt_io_accept: %s", err->message);
g_error_free(err);
+ gateway_close(dev);
}
}