[bt][gap] Keep hold of discovery/discoverable tokens
Re-adds the notion of a Control session so that tokens
for discovery and discoverable are correctly held as
long as necessary.
NET-1722 #done
Change-Id: I98f5862cd0ef554a2f719aa42f32a9d8672ca3a3
diff --git a/bin/bluetooth/bt-gap/src/services/control.rs b/bin/bluetooth/bt-gap/src/services/control.rs
index abc2717..b6ac495 100644
--- a/bin/bluetooth/bt-gap/src/services/control.rs
+++ b/bin/bluetooth/bt-gap/src/services/control.rs
@@ -11,17 +11,25 @@
use fuchsia_async as fasync;
use fuchsia_bluetooth::bt_fidl_status;
use futures::prelude::*;
+use std::sync::Arc;
+use parking_lot::RwLock;
+
+struct ControlSession {
+ discovery_token: Option<Arc<DiscoveryRequestToken>>,
+ discoverable_token: Option<Arc<DiscoverableRequestToken>>
+}
/// Build the ControlImpl to interact with fidl messages
/// State is stored in the HostDispatcher object
pub async fn start_control_service(mut hd: HostDispatcher, chan: fasync::Channel) -> Result<(), Error> {
let stream = ControlRequestStream::from_channel(chan);
hd.add_event_listener(stream.control_handle());
- await!(stream.try_for_each(move |event| handler(hd.clone(), event))).map_err(|e| e.into())
+ let session = Arc::new(RwLock::new(ControlSession { discovery_token: None, discoverable_token: None }));
+ await!(stream.try_for_each(move |event| handler(hd.clone(), session.clone(), event))).map_err(|e| e.into())
}
async fn handler(
- mut hd: HostDispatcher, event: ControlRequest,
+ mut hd: HostDispatcher, session: Arc<RwLock<ControlSession>>, event: ControlRequest,
) -> Result<(), fidl::Error> {
match event {
ControlRequest::Connect { device_id, responder } => {
@@ -29,11 +37,12 @@
responder.send(&mut status)
}
ControlRequest::SetDiscoverable { discoverable, responder } => {
- let (mut resp, _) = if discoverable {
+ let (mut resp, token) = if discoverable {
await!(hd.set_discoverable())?
} else {
(bt_fidl_status!(), None)
};
+ session.write().discoverable_token = token;
responder.send(&mut resp)
}
ControlRequest::SetIoCapabilities { input, output, control_handle: _ } => {
@@ -79,14 +88,13 @@
Ok(())
}
ControlRequest::RequestDiscovery { discovery, responder } => {
- if discovery {
- if let Ok((mut resp, _)) = await!(hd.start_discovery()) {
- let _ = responder.send(&mut resp);
- }
- Ok(())
+ let (mut resp, token) = if discovery {
+ await!(hd.start_discovery())?
} else {
- responder.send(&mut bt_fidl_status!())
- }
+ (bt_fidl_status!(), None)
+ };
+ session.write().discovery_token = token;
+ responder.send(&mut resp)
}
ControlRequest::SetName { name, responder } => {
let mut resp = await!(hd.set_name(name))?;