summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2009-04-11 20:01:00 +0300
committerJohan Hedberg <johan.hedberg@nokia.com>2009-04-11 20:01:00 +0300
commite5ae3e24c592099984a4fab8c80ea51b6071c7e7 (patch)
treeda3e34b30bd30e1c2b87cc2de5c18c426b000f01
parent4cdb509ca202e0b7233da970fdc0b338a2fea3e1 (diff)
downloadbluez-e5ae3e24c592099984a4fab8c80ea51b6071c7e7.tar.gz
Fix manager_get_device to not always create a new device object
In the case that someone calls Adapter.RemoveDevice while we're connected to an audio profile some function calls could be triggered to manager_get_device. This patch makes sure these calls don't recreate the device object that was just removed.
-rw-r--r--audio/avdtp.c8
-rw-r--r--audio/control.c2
-rw-r--r--audio/manager.c12
-rw-r--r--audio/manager.h3
4 files changed, 15 insertions, 10 deletions
diff --git a/audio/avdtp.c b/audio/avdtp.c
index 2d0ee8e78..1db7bcfba 100644
--- a/audio/avdtp.c
+++ b/audio/avdtp.c
@@ -614,7 +614,7 @@ static gboolean disconnect_timeout(gpointer user_data)
stream_setup = session->stream_setup;
session->stream_setup = FALSE;
- dev = manager_get_device(&session->server->src, &session->dst);
+ dev = manager_get_device(&session->server->src, &session->dst, FALSE);
if (dev && dev->sink && stream_setup)
sink_setup_stream(dev->sink, session);
@@ -711,7 +711,7 @@ static void avdtp_set_state(struct avdtp *session,
session->state = new_state;
avdtp_get_peers(session, &src, &dst);
- dev = manager_get_device(&src, &dst);
+ dev = manager_get_device(&src, &dst, FALSE);
if (dev == NULL) {
error("avdtp_set_state(): no matching audio device");
return;
@@ -1223,7 +1223,7 @@ static gboolean avdtp_setconf_cmd(struct avdtp *session, uint8_t transaction,
}
avdtp_get_peers(session, &src, &dst);
- dev = manager_get_device(&src, &dst);
+ dev = manager_get_device(&src, &dst, FALSE);
if (!dev) {
error("Unable to get a audio device object");
goto failed;
@@ -2080,7 +2080,7 @@ static void avdtp_confirm_cb(GIOChannel *chan, gpointer data)
goto drop;
}
- dev = manager_get_device(&src, &dst);
+ dev = manager_get_device(&src, &dst, TRUE);
if (!dev) {
error("Unable to get audio device object for %s", address);
goto drop;
diff --git a/audio/control.c b/audio/control.c
index dae759af1..c0db17327 100644
--- a/audio/control.c
+++ b/audio/control.c
@@ -736,7 +736,7 @@ static void avctp_confirm_cb(GIOChannel *chan, gpointer data)
goto drop;
}
- dev = manager_get_device(&src, &dst);
+ dev = manager_get_device(&src, &dst, TRUE);
if (!dev) {
error("Unable to get audio device object for %s", address);
goto drop;
diff --git a/audio/manager.c b/audio/manager.c
index 4514e636b..473b576e4 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -455,7 +455,7 @@ static void ag_confirm(GIOChannel *chan, gpointer data)
remote_uuid = HFP_HS_UUID;
}
- device = manager_get_device(&src, &dst);
+ device = manager_get_device(&src, &dst, TRUE);
if (!device)
goto drop;
@@ -543,7 +543,7 @@ static void hf_io_cb(GIOChannel *chan, gpointer data)
remote_uuid = HFP_AG_UUID;
svclass = HANDSFREE_AGW_SVCLASS_ID;
- device = manager_get_device(&src, &dst);
+ device = manager_get_device(&src, &dst, TRUE);
if (!device)
goto drop;
@@ -735,7 +735,7 @@ static int audio_probe(struct btd_device *device, GSList *uuids)
adapter_get_address(adapter, &src);
device_get_address(device, &dst);
- audio_dev = manager_get_device(&src, &dst);
+ audio_dev = manager_get_device(&src, &dst, TRUE);
if (!audio_dev) {
debug("audio_probe: unable to get a device object");
return -1;
@@ -1133,7 +1133,8 @@ struct audio_device *manager_find_device(const char *path,
}
struct audio_device *manager_get_device(const bdaddr_t *src,
- const bdaddr_t *dst)
+ const bdaddr_t *dst,
+ gboolean create)
{
struct audio_device *dev;
struct btd_adapter *adapter;
@@ -1145,6 +1146,9 @@ struct audio_device *manager_get_device(const bdaddr_t *src,
if (dev)
return dev;
+ if (!create)
+ return NULL;
+
ba2str(src, addr);
adapter = manager_find_adapter(src);
diff --git a/audio/manager.h b/audio/manager.h
index ff6bc10fa..f0e676dd6 100644
--- a/audio/manager.h
+++ b/audio/manager.h
@@ -43,6 +43,7 @@ struct audio_device *manager_find_device(const char *path,
gboolean connected);
struct audio_device *manager_get_device(const bdaddr_t *src,
- const bdaddr_t *dst);
+ const bdaddr_t *dst,
+ gboolean create);
gboolean manager_allow_headset_connection(bdaddr_t *src);