diff options
author | fokinv <fokin.valentin@stud.u-szeged.hu> | 2016-03-17 11:57:20 +0100 |
---|---|---|
committer | Attila Dusnoki <dati91@gmail.com> | 2016-05-03 10:17:41 +0200 |
commit | 9825ea41b49e4cff5ccccaef0dbeef9a982d7010 (patch) | |
tree | 965ee08b6168e0657106b58b79f092813dc8a3f4 /components/script/dom/bluetooth.rs | |
parent | 9d55748de24fc140302ef4dffefe43acb998c269 (diff) | |
download | servo-9825ea41b49e4cff5ccccaef0dbeef9a982d7010.tar.gz servo-9825ea41b49e4cff5ccccaef0dbeef9a982d7010.zip |
Add Bluetooth IPC support
Diffstat (limited to 'components/script/dom/bluetooth.rs')
-rw-r--r-- | components/script/dom/bluetooth.rs | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/components/script/dom/bluetooth.rs b/components/script/dom/bluetooth.rs index 58d506dec45..36ac2a1f7e4 100644 --- a/components/script/dom/bluetooth.rs +++ b/components/script/dom/bluetooth.rs @@ -4,10 +4,15 @@ use dom::bindings::codegen::Bindings::BluetoothBinding; use dom::bindings::codegen::Bindings::BluetoothBinding::BluetoothMethods; +use dom::bindings::codegen::Bindings::BluetoothDeviceBinding::VendorIDSource; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; -use dom::bindings::reflector::{Reflector, reflect_dom_object}; +use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object}; +use dom::bluetoothadvertisingdata::BluetoothAdvertisingData; use dom::bluetoothdevice::BluetoothDevice; +use ipc_channel::ipc::{self, IpcSender}; +use net_traits::bluetooth_thread::{BluetoothMethodMsg, BluetoothObjectMsg}; +use util::str::DOMString; // https://webbluetoothcg.github.io/web-bluetooth/#bluetooth #[dom_struct] @@ -27,13 +32,67 @@ impl Bluetooth { global, BluetoothBinding::Wrap) } + + fn get_bluetooth_thread(&self) -> IpcSender<BluetoothMethodMsg> { + let global_root = self.global(); + let global_ref = global_root.r(); + global_ref.as_window().bluetooth_thread() + } } impl BluetoothMethods for Bluetooth { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetooth-requestdevice fn RequestDevice(&self) -> Option<Root<BluetoothDevice>> { - //UNIMPLEMENTED - None + let (sender, receiver) = ipc::channel().unwrap(); + self.get_bluetooth_thread().send(BluetoothMethodMsg::RequestDevice(sender)).unwrap(); + let device = receiver.recv().unwrap(); + match device { + BluetoothObjectMsg::BluetoothDevice { + id, + name, + device_class, + vendor_id_source, + vendor_id, + product_id, + product_version, + appearance, + tx_power, + rssi, + } => { + let ad_data = &BluetoothAdvertisingData::new(self.global().r(), + appearance, + tx_power, + rssi); + let vendor_id_source = match vendor_id_source { + Some(vid) => match vid.as_ref() { + "bluetooth" => Some(VendorIDSource::Bluetooth), + "usb" => Some(VendorIDSource::Usb), + _ => Some(VendorIDSource::Unknown), + }, + None => None, + }; + let name = match name { + Some(n) => Some(DOMString::from(n)), + None => None, + }; + Some(BluetoothDevice::new(self.global().r(), + DOMString::from(id), + name, + ad_data, + device_class, + vendor_id_source, + vendor_id, + product_id, + product_version)) + }, + BluetoothObjectMsg::Error { + error + } => { + println!("{}", error); + None + }, + _ => unreachable!() + } } } |