diff options
Diffstat (limited to 'components/script/dom/bluetoothdevice.rs')
-rw-r--r-- | components/script/dom/bluetoothdevice.rs | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/components/script/dom/bluetoothdevice.rs b/components/script/dom/bluetoothdevice.rs index d3d66b66440..d56970c0d98 100644 --- a/components/script/dom/bluetoothdevice.rs +++ b/components/script/dom/bluetoothdevice.rs @@ -10,6 +10,8 @@ use dom::bindings::codegen::Bindings::BluetoothDeviceBinding::BluetoothDeviceMet use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::error::Error; +use dom::bindings::error::ErrorResult; +use dom::bindings::inheritance::Castable; use dom::bindings::js::{MutJS, MutNullableJS, Root}; use dom::bindings::reflector::{DomObject, reflect_dom_object}; use dom::bindings::str::DOMString; @@ -22,7 +24,7 @@ use dom::bluetoothremotegattservice::BluetoothRemoteGATTService; use dom::eventtarget::EventTarget; use dom::globalscope::GlobalScope; use dom::promise::Promise; -use ipc_channel::ipc::IpcSender; +use ipc_channel::ipc::{self, IpcSender}; use js::jsapi::JSContext; use std::cell::Cell; use std::collections::HashMap; @@ -72,6 +74,10 @@ impl BluetoothDevice { BluetoothDeviceBinding::Wrap) } + fn get_context(&self) -> Root<Bluetooth> { + self.context.get() + } + pub fn get_or_create_service(&self, service: &BluetoothServiceMsg, server: &BluetoothRemoteGATTServer) @@ -119,6 +125,13 @@ impl BluetoothDevice { return bt_characteristic; } + pub fn is_represented_device_null(&self) -> bool { + let (sender, receiver) = ipc::channel().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) @@ -139,6 +152,60 @@ impl BluetoothDevice { fn get_bluetooth_thread(&self) -> IpcSender<BluetoothRequest> { self.global().as_window().bluetooth_thread() } + + // https://webbluetoothcg.github.io/web-bluetooth/#clean-up-the-disconnected-device + #[allow(unrooted_must_root)] + pub fn clean_up_disconnected_device(&self) { + // Step 1. + self.Gatt().set_connected(false); + + // TODO: Step 2: Implement activeAlgorithms internal slot for BluetoothRemoteGATTServer. + + // Step 3: We don't need `context`, we get the attributeInstanceMap from the device. + // https://github.com/WebBluetoothCG/web-bluetooth/issues/330 + + // Step 4. + let mut service_map = self.attribute_instance_map.0.borrow_mut(); + let service_ids = service_map.drain().map(|(id, _)| id).collect(); + + let mut characteristic_map = self.attribute_instance_map.1.borrow_mut(); + let characteristic_ids = characteristic_map.drain().map(|(id, _)| id).collect(); + + let mut descriptor_map = self.attribute_instance_map.2.borrow_mut(); + let descriptor_ids = descriptor_map.drain().map(|(id, _)| id).collect(); + + // 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)); + + // Step 8. + self.upcast::<EventTarget>().fire_bubbling_event(atom!("gattserverdisconnected")); + } + + // https://webbluetoothcg.github.io/web-bluetooth/#garbage-collect-the-connection + #[allow(unrooted_must_root)] + pub fn garbage_collect_the_connection(&self) -> ErrorResult { + // Step 1: TODO: Check if other systems using this device. + + // Step 2. + let context = self.get_context(); + for (id, device) in context.get_device_map().borrow().iter() { + // Step 2.1 - 2.2. + if id == &self.Id().to_string() { + if device.get().Gatt().Connected() { + return Ok(()); + } + // TODO: Step 2.3: Implement activeAlgorithms internal slot for BluetoothRemoteGATTServer. + } + } + + // Step 3. + let (sender, receiver) = ipc::channel().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 { |