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.rs64
1 files changed, 60 insertions, 4 deletions
diff --git a/components/script/dom/bluetoothremotegattserver.rs b/components/script/dom/bluetoothremotegattserver.rs
index 2eec908d4c5..e3b0e5bd8c9 100644
--- a/components/script/dom/bluetoothremotegattserver.rs
+++ b/components/script/dom/bluetoothremotegattserver.rs
@@ -5,11 +5,13 @@
use dom::bindings::codegen::Bindings::BluetoothDeviceBinding::BluetoothDeviceMethods;
use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding;
use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods;
+use dom::bindings::codegen::UnionTypes::StringOrUnsignedLong;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, MutHeap, Root};
use dom::bindings::reflector::{Reflectable, Reflector, reflect_dom_object};
use dom::bluetoothdevice::BluetoothDevice;
use dom::bluetoothremotegattservice::BluetoothRemoteGATTService;
+use dom::bluetoothuuid::BluetoothUUID;
use ipc_channel::ipc::{self, IpcSender};
use net_traits::bluetooth_thread::{BluetoothMethodMsg, BluetoothObjectMsg};
use std::cell::Cell;
@@ -101,16 +103,23 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer {
}
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-getprimaryservice
- fn GetPrimaryService(&self) -> Option<Root<BluetoothRemoteGATTService>> {
+ fn GetPrimaryService(&self, service: StringOrUnsignedLong) -> Option<Root<BluetoothRemoteGATTService>> {
+ let uuid: String = match BluetoothUUID::GetService(self.global().r(), service.clone()) {
+ Ok(domstring) => domstring.to_string(),
+ Err(_) => {
+ println!("No UUID provided!");
+ return None;
+ },
+ };
let (sender, receiver) = ipc::channel().unwrap();
self.get_bluetooth_thread().send(
- BluetoothMethodMsg::GetPrimaryService(String::from(self.Device().Id()), sender)).unwrap();
+ BluetoothMethodMsg::GetPrimaryService(String::from(self.Device().Id()), uuid, sender)).unwrap();
let service = receiver.recv().unwrap();
match service {
BluetoothObjectMsg::BluetoothService {
uuid,
is_primary,
- instance_id
+ instance_id,
} => {
Some(BluetoothRemoteGATTService::new(self.global().r(),
&self.device.get(),
@@ -124,7 +133,54 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer {
println!("{}", error);
None
},
- _ => unreachable!()
+ _ => unreachable!(),
+ }
+ }
+
+ // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-getprimaryservices
+ fn GetPrimaryServices(&self, service: Option<StringOrUnsignedLong>)
+ -> Option<Vec<Root<BluetoothRemoteGATTService>>> {
+ let uuid: Option<String> = match service {
+ Some(s) => match BluetoothUUID::GetService(self.global().r(), s.clone()) {
+ Ok(domstring) => Some(domstring.to_string()),
+ Err(_) => None,
+ },
+ None => None,
+ };
+ let mut services: Vec<Root<BluetoothRemoteGATTService>> = 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 {
+ BluetoothObjectMsg::BluetoothServices {
+ services_vec
+ } => {
+ for s in services_vec {
+ match s {
+ BluetoothObjectMsg::BluetoothService {
+ uuid,
+ is_primary,
+ instance_id,
+ } => {
+ services.push(BluetoothRemoteGATTService::new(self.global().r(),
+ &self.device.get(),
+ DOMString::from(uuid),
+ is_primary,
+ instance_id))
+ },
+ _ => unreachable!(),
+ }
+ }
+ Some(services)
+ },
+ BluetoothObjectMsg::Error {
+ error
+ } => {
+ println!("{}", error);
+ None
+ },
+ _ => unreachable!(),
}
}
}