aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bluetoothremotegattserver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bluetoothremotegattserver.rs')
-rw-r--r--components/script/dom/bluetoothremotegattserver.rs44
1 files changed, 32 insertions, 12 deletions
diff --git a/components/script/dom/bluetoothremotegattserver.rs b/components/script/dom/bluetoothremotegattserver.rs
index 3499e431f1c..9ac1ca4c4f4 100644
--- a/components/script/dom/bluetoothremotegattserver.rs
+++ b/components/script/dom/bluetoothremotegattserver.rs
@@ -81,11 +81,18 @@ impl BluetoothRemoteGATTServer {
let service = receiver.recv().unwrap();
match service {
Ok(service) => {
- Ok(BluetoothRemoteGATTService::new(&self.global(),
- &self.device.get(),
- DOMString::from(service.uuid),
- service.is_primary,
- service.instance_id))
+ let context = self.device.get().get_context();
+ let mut service_map = context.get_service_map().borrow_mut();
+ if let Some(existing_service) = service_map.get(&service.instance_id) {
+ return Ok(existing_service.get());
+ }
+ let bt_service = BluetoothRemoteGATTService::new(&self.global(),
+ &self.device.get(),
+ DOMString::from(service.uuid),
+ service.is_primary,
+ service.instance_id.clone());
+ service_map.insert(service.instance_id, MutHeap::new(&bt_service));
+ Ok(bt_service)
},
Err(error) => {
Err(Error::from(error))
@@ -109,19 +116,32 @@ impl BluetoothRemoteGATTServer {
if !self.Device().Gatt().Connected() {
return Err(Network)
}
+ let mut services = vec!();
let (sender, receiver) = ipc::channel().unwrap();
self.get_bluetooth_thread().send(
BluetoothMethodMsg::GetPrimaryServices(String::from(self.Device().Id()), uuid, sender)).unwrap();
let services_vec = receiver.recv().unwrap();
match services_vec {
Ok(service_vec) => {
- Ok(service_vec.into_iter()
- .map(|service| BluetoothRemoteGATTService::new(&self.global(),
- &self.device.get(),
- DOMString::from(service.uuid),
- service.is_primary,
- service.instance_id))
- .collect())
+ let context = self.device.get().get_context();
+ let mut service_map = context.get_service_map().borrow_mut();
+ for service in service_vec {
+ let bt_service = match service_map.get(&service.instance_id) {
+ Some(existing_service) => existing_service.get(),
+ None => {
+ BluetoothRemoteGATTService::new(&self.global(),
+ &self.device.get(),
+ DOMString::from(service.uuid),
+ service.is_primary,
+ service.instance_id.clone())
+ },
+ };
+ if !service_map.contains_key(&service.instance_id) {
+ service_map.insert(service.instance_id, MutHeap::new(&bt_service));
+ }
+ services.push(bt_service);
+ }
+ Ok(services)
},
Err(error) => {
Err(Error::from(error))