diff options
author | zakorgyula <gyula.zakor@gmail.com> | 2016-10-07 16:17:11 +0200 |
---|---|---|
committer | zakorgyula <gyula.zakor@gmail.com> | 2016-11-04 15:36:57 +0100 |
commit | e8c1c98a77dd64a902a4941a8889b9bd5603ce2d (patch) | |
tree | e65e36e8d1a67182795d4f8a79fcf322b27b18ba /components/script/dom/bluetoothremotegattserver.rs | |
parent | d30bcbd33948f41fc3389f8105885060fd7541a5 (diff) | |
download | servo-e8c1c98a77dd64a902a4941a8889b9bd5603ce2d.tar.gz servo-e8c1c98a77dd64a902a4941a8889b9bd5603ce2d.zip |
Return the same JS object for the same Bluetooth item.
Diffstat (limited to 'components/script/dom/bluetoothremotegattserver.rs')
-rw-r--r-- | components/script/dom/bluetoothremotegattserver.rs | 44 |
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)) |