diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2009-04-11 20:01:00 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-04-11 20:01:00 +0300 |
commit | e5ae3e24c592099984a4fab8c80ea51b6071c7e7 (patch) | |
tree | da3e34b30bd30e1c2b87cc2de5c18c426b000f01 | |
parent | 4cdb509ca202e0b7233da970fdc0b338a2fea3e1 (diff) | |
download | bluez-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.c | 8 | ||||
-rw-r--r-- | audio/control.c | 2 | ||||
-rw-r--r-- | audio/manager.c | 12 | ||||
-rw-r--r-- | audio/manager.h | 3 |
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); |