diff options
Diffstat (limited to 'components/script/dom/bluetoothdevice.rs')
-rw-r--r-- | components/script/dom/bluetoothdevice.rs | 195 |
1 files changed, 121 insertions, 74 deletions
diff --git a/components/script/dom/bluetoothdevice.rs b/components/script/dom/bluetoothdevice.rs index b8e08618960..ae97626b60e 100644 --- a/components/script/dom/bluetoothdevice.rs +++ b/components/script/dom/bluetoothdevice.rs @@ -38,118 +38,144 @@ pub struct BluetoothDevice { name: Option<DOMString>, gatt: MutNullableDom<BluetoothRemoteGATTServer>, context: Dom<Bluetooth>, - attribute_instance_map: (DomRefCell<HashMap<String, Dom<BluetoothRemoteGATTService>>>, - DomRefCell<HashMap<String, Dom<BluetoothRemoteGATTCharacteristic>>>, - DomRefCell<HashMap<String, Dom<BluetoothRemoteGATTDescriptor>>>), + attribute_instance_map: ( + DomRefCell<HashMap<String, Dom<BluetoothRemoteGATTService>>>, + DomRefCell<HashMap<String, Dom<BluetoothRemoteGATTCharacteristic>>>, + DomRefCell<HashMap<String, Dom<BluetoothRemoteGATTDescriptor>>>, + ), watching_advertisements: Cell<bool>, } impl BluetoothDevice { - pub fn new_inherited(id: DOMString, - name: Option<DOMString>, - context: &Bluetooth) - -> BluetoothDevice { + pub fn new_inherited( + id: DOMString, + name: Option<DOMString>, + context: &Bluetooth, + ) -> BluetoothDevice { BluetoothDevice { eventtarget: EventTarget::new_inherited(), id: id, name: name, gatt: Default::default(), context: Dom::from_ref(context), - attribute_instance_map: (DomRefCell::new(HashMap::new()), - DomRefCell::new(HashMap::new()), - DomRefCell::new(HashMap::new())), + attribute_instance_map: ( + DomRefCell::new(HashMap::new()), + DomRefCell::new(HashMap::new()), + DomRefCell::new(HashMap::new()), + ), watching_advertisements: Cell::new(false), } } - pub fn new(global: &GlobalScope, - id: DOMString, - name: Option<DOMString>, - context: &Bluetooth) - -> DomRoot<BluetoothDevice> { - reflect_dom_object(Box::new(BluetoothDevice::new_inherited(id, name, context)), - global, - BluetoothDeviceBinding::Wrap) + pub fn new( + global: &GlobalScope, + id: DOMString, + name: Option<DOMString>, + context: &Bluetooth, + ) -> DomRoot<BluetoothDevice> { + reflect_dom_object( + Box::new(BluetoothDevice::new_inherited(id, name, context)), + global, + BluetoothDeviceBinding::Wrap, + ) } pub fn get_gatt(&self) -> DomRoot<BluetoothRemoteGATTServer> { - self.gatt.or_init(|| { - BluetoothRemoteGATTServer::new(&self.global(), self) - }) + self.gatt + .or_init(|| BluetoothRemoteGATTServer::new(&self.global(), self)) } fn get_context(&self) -> DomRoot<Bluetooth> { DomRoot::from_ref(&self.context) } - pub fn get_or_create_service(&self, - service: &BluetoothServiceMsg, - server: &BluetoothRemoteGATTServer) - -> DomRoot<BluetoothRemoteGATTService> { + pub fn get_or_create_service( + &self, + service: &BluetoothServiceMsg, + server: &BluetoothRemoteGATTServer, + ) -> DomRoot<BluetoothRemoteGATTService> { let (ref service_map_ref, _, _) = self.attribute_instance_map; let mut service_map = service_map_ref.borrow_mut(); if let Some(existing_service) = service_map.get(&service.instance_id) { return DomRoot::from_ref(&existing_service); } - let bt_service = BluetoothRemoteGATTService::new(&server.global(), - &server.Device(), - DOMString::from(service.uuid.clone()), - service.is_primary, - service.instance_id.clone()); + let bt_service = BluetoothRemoteGATTService::new( + &server.global(), + &server.Device(), + DOMString::from(service.uuid.clone()), + service.is_primary, + service.instance_id.clone(), + ); service_map.insert(service.instance_id.clone(), Dom::from_ref(&bt_service)); return bt_service; } - pub fn get_or_create_characteristic(&self, - characteristic: &BluetoothCharacteristicMsg, - service: &BluetoothRemoteGATTService) - -> DomRoot<BluetoothRemoteGATTCharacteristic> { + pub fn get_or_create_characteristic( + &self, + characteristic: &BluetoothCharacteristicMsg, + service: &BluetoothRemoteGATTService, + ) -> DomRoot<BluetoothRemoteGATTCharacteristic> { let (_, ref characteristic_map_ref, _) = self.attribute_instance_map; let mut characteristic_map = characteristic_map_ref.borrow_mut(); if let Some(existing_characteristic) = characteristic_map.get(&characteristic.instance_id) { return DomRoot::from_ref(&existing_characteristic); } - let properties = - BluetoothCharacteristicProperties::new(&service.global(), - characteristic.broadcast, - characteristic.read, - characteristic.write_without_response, - characteristic.write, - characteristic.notify, - characteristic.indicate, - characteristic.authenticated_signed_writes, - characteristic.reliable_write, - characteristic.writable_auxiliaries); - let bt_characteristic = BluetoothRemoteGATTCharacteristic::new(&service.global(), - service, - DOMString::from(characteristic.uuid.clone()), - &properties, - characteristic.instance_id.clone()); - characteristic_map.insert(characteristic.instance_id.clone(), Dom::from_ref(&bt_characteristic)); + let properties = BluetoothCharacteristicProperties::new( + &service.global(), + characteristic.broadcast, + characteristic.read, + characteristic.write_without_response, + characteristic.write, + characteristic.notify, + characteristic.indicate, + characteristic.authenticated_signed_writes, + characteristic.reliable_write, + characteristic.writable_auxiliaries, + ); + let bt_characteristic = BluetoothRemoteGATTCharacteristic::new( + &service.global(), + service, + DOMString::from(characteristic.uuid.clone()), + &properties, + characteristic.instance_id.clone(), + ); + characteristic_map.insert( + characteristic.instance_id.clone(), + Dom::from_ref(&bt_characteristic), + ); return bt_characteristic; } pub fn is_represented_device_null(&self) -> bool { let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.get_bluetooth_thread().send( - BluetoothRequest::IsRepresentedDeviceNull(self.Id().to_string(), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::IsRepresentedDeviceNull( + self.Id().to_string(), + sender, + )).unwrap(); receiver.recv().unwrap() } - pub fn get_or_create_descriptor(&self, - descriptor: &BluetoothDescriptorMsg, - characteristic: &BluetoothRemoteGATTCharacteristic) - -> DomRoot<BluetoothRemoteGATTDescriptor> { + pub fn get_or_create_descriptor( + &self, + descriptor: &BluetoothDescriptorMsg, + characteristic: &BluetoothRemoteGATTCharacteristic, + ) -> DomRoot<BluetoothRemoteGATTDescriptor> { let (_, _, ref descriptor_map_ref) = self.attribute_instance_map; let mut descriptor_map = descriptor_map_ref.borrow_mut(); if let Some(existing_descriptor) = descriptor_map.get(&descriptor.instance_id) { return DomRoot::from_ref(&existing_descriptor); } - let bt_descriptor = BluetoothRemoteGATTDescriptor::new(&characteristic.global(), - characteristic, - DOMString::from(descriptor.uuid.clone()), - descriptor.instance_id.clone()); - descriptor_map.insert(descriptor.instance_id.clone(), Dom::from_ref(&bt_descriptor)); + let bt_descriptor = BluetoothRemoteGATTDescriptor::new( + &characteristic.global(), + characteristic, + DOMString::from(descriptor.uuid.clone()), + descriptor.instance_id.clone(), + ); + descriptor_map.insert( + descriptor.instance_id.clone(), + Dom::from_ref(&bt_descriptor), + ); return bt_descriptor; } @@ -180,11 +206,17 @@ impl BluetoothDevice { // Step 5, 6.4, 7. // TODO: Step 6: Implement `active notification context set` for BluetoothRemoteGATTCharacteristic. - let _ = self.get_bluetooth_thread().send( - BluetoothRequest::SetRepresentedToNull(service_ids, characteristic_ids, descriptor_ids)); + let _ = self + .get_bluetooth_thread() + .send(BluetoothRequest::SetRepresentedToNull( + service_ids, + characteristic_ids, + descriptor_ids, + )); // Step 8. - self.upcast::<EventTarget>().fire_bubbling_event(atom!("gattserverdisconnected")); + self.upcast::<EventTarget>() + .fire_bubbling_event(atom!("gattserverdisconnected")); } // https://webbluetoothcg.github.io/web-bluetooth/#garbage-collect-the-connection @@ -206,14 +238,17 @@ impl BluetoothDevice { // Step 3. let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.get_bluetooth_thread().send( - BluetoothRequest::GATTServerDisconnect(String::from(self.Id()), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::GATTServerDisconnect( + String::from(self.Id()), + sender, + )).unwrap(); receiver.recv().unwrap().map_err(Error::from) } } impl BluetoothDeviceMethods for BluetoothDevice { - // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdevice-id + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdevice-id fn Id(&self) -> DOMString { self.id.clone() } @@ -226,9 +261,14 @@ impl BluetoothDeviceMethods for BluetoothDevice { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdevice-gatt fn GetGatt(&self) -> Option<DomRoot<BluetoothRemoteGATTServer>> { // Step 1. - if self.global().as_window().bluetooth_extra_permission_data() - .allowed_devices_contains_id(self.id.clone()) && !self.is_represented_device_null() { - return Some(self.get_gatt()) + if self + .global() + .as_window() + .bluetooth_extra_permission_data() + .allowed_devices_contains_id(self.id.clone()) && + !self.is_represented_device_null() + { + return Some(self.get_gatt()); } // Step 2. None @@ -242,8 +282,11 @@ impl BluetoothDeviceMethods for BluetoothDevice { // TODO: Step 1. // Note: Steps 2 - 3 are implemented in components/bluetooth/lib.rs in watch_advertisements function // and in handle_response function. - self.get_bluetooth_thread().send( - BluetoothRequest::WatchAdvertisements(String::from(self.Id()), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::WatchAdvertisements( + String::from(self.Id()), + sender, + )).unwrap(); return p; } @@ -260,7 +303,11 @@ impl BluetoothDeviceMethods for BluetoothDevice { } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdeviceeventhandlers-ongattserverdisconnected - event_handler!(gattserverdisconnected, GetOngattserverdisconnected, SetOngattserverdisconnected); + event_handler!( + gattserverdisconnected, + GetOngattserverdisconnected, + SetOngattserverdisconnected + ); } impl AsyncBluetoothListener for BluetoothDevice { |