diff options
Diffstat (limited to 'components/script/dom/bluetooth/bluetoothremotegattservice.rs')
-rw-r--r-- | components/script/dom/bluetooth/bluetoothremotegattservice.rs | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/components/script/dom/bluetooth/bluetoothremotegattservice.rs b/components/script/dom/bluetooth/bluetoothremotegattservice.rs new file mode 100644 index 00000000000..014f78d2669 --- /dev/null +++ b/components/script/dom/bluetooth/bluetoothremotegattservice.rs @@ -0,0 +1,205 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use std::rc::Rc; + +use bluetooth_traits::{BluetoothResponse, GATTType}; +use dom_struct::dom_struct; + +use crate::dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods; +use crate::dom::bindings::codegen::Bindings::BluetoothRemoteGATTServiceBinding::BluetoothRemoteGATTServiceMethods; +use crate::dom::bindings::error::Error; +use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::str::DOMString; +use crate::dom::bluetooth::{get_gatt_children, AsyncBluetoothListener}; +use crate::dom::bluetoothdevice::BluetoothDevice; +use crate::dom::bluetoothuuid::{BluetoothCharacteristicUUID, BluetoothServiceUUID, BluetoothUUID}; +use crate::dom::eventtarget::EventTarget; +use crate::dom::globalscope::GlobalScope; +use crate::dom::promise::Promise; +use crate::script_runtime::CanGc; + +// https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattservice +#[dom_struct] +pub(crate) struct BluetoothRemoteGATTService { + eventtarget: EventTarget, + device: Dom<BluetoothDevice>, + uuid: DOMString, + is_primary: bool, + instance_id: String, +} + +impl BluetoothRemoteGATTService { + pub(crate) fn new_inherited( + device: &BluetoothDevice, + uuid: DOMString, + is_primary: bool, + instance_id: String, + ) -> BluetoothRemoteGATTService { + BluetoothRemoteGATTService { + eventtarget: EventTarget::new_inherited(), + device: Dom::from_ref(device), + uuid, + is_primary, + instance_id, + } + } + + #[allow(non_snake_case)] + pub(crate) fn new( + global: &GlobalScope, + device: &BluetoothDevice, + uuid: DOMString, + isPrimary: bool, + instanceID: String, + ) -> DomRoot<BluetoothRemoteGATTService> { + reflect_dom_object( + Box::new(BluetoothRemoteGATTService::new_inherited( + device, uuid, isPrimary, instanceID, + )), + global, + CanGc::note(), + ) + } + + fn get_instance_id(&self) -> String { + self.instance_id.clone() + } +} + +impl BluetoothRemoteGATTServiceMethods<crate::DomTypeHolder> for BluetoothRemoteGATTService { + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-device + fn Device(&self) -> DomRoot<BluetoothDevice> { + DomRoot::from_ref(&self.device) + } + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-isprimary + fn IsPrimary(&self) -> bool { + self.is_primary + } + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-uuid + fn Uuid(&self) -> DOMString { + self.uuid.clone() + } + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getcharacteristic + fn GetCharacteristic( + &self, + characteristic: BluetoothCharacteristicUUID, + can_gc: CanGc, + ) -> Rc<Promise> { + get_gatt_children( + self, + true, + BluetoothUUID::characteristic, + Some(characteristic), + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::Characteristic, + can_gc, + ) + } + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getcharacteristics + fn GetCharacteristics( + &self, + characteristic: Option<BluetoothCharacteristicUUID>, + can_gc: CanGc, + ) -> Rc<Promise> { + get_gatt_children( + self, + false, + BluetoothUUID::characteristic, + characteristic, + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::Characteristic, + can_gc, + ) + } + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getincludedservice + fn GetIncludedService(&self, service: BluetoothServiceUUID, can_gc: CanGc) -> Rc<Promise> { + get_gatt_children( + self, + false, + BluetoothUUID::service, + Some(service), + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::IncludedService, + can_gc, + ) + } + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getincludedservices + fn GetIncludedServices( + &self, + service: Option<BluetoothServiceUUID>, + can_gc: CanGc, + ) -> Rc<Promise> { + get_gatt_children( + self, + false, + BluetoothUUID::service, + service, + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::IncludedService, + can_gc, + ) + } + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-serviceeventhandlers-onserviceadded + event_handler!(serviceadded, GetOnserviceadded, SetOnserviceadded); + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-serviceeventhandlers-onservicechanged + event_handler!(servicechanged, GetOnservicechanged, SetOnservicechanged); + + // https://webbluetoothcg.github.io/web-bluetooth/#dom-serviceeventhandlers-onserviceremoved + event_handler!(serviceremoved, GetOnserviceremoved, SetOnserviceremoved); +} + +impl AsyncBluetoothListener for BluetoothRemoteGATTService { + fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>, _can_gc: CanGc) { + let device = self.Device(); + match response { + // https://webbluetoothcg.github.io/web-bluetooth/#getgattchildren + // Step 7. + BluetoothResponse::GetCharacteristics(characteristics_vec, single) => { + if single { + promise.resolve_native( + &device.get_or_create_characteristic(&characteristics_vec[0], self), + ); + return; + } + let mut characteristics = vec![]; + for characteristic in characteristics_vec { + let bt_characteristic = + device.get_or_create_characteristic(&characteristic, self); + characteristics.push(bt_characteristic); + } + promise.resolve_native(&characteristics); + }, + // https://webbluetoothcg.github.io/web-bluetooth/#getgattchildren + // Step 7. + BluetoothResponse::GetIncludedServices(services_vec, single) => { + if single { + return promise.resolve_native( + &device.get_or_create_service(&services_vec[0], &device.get_gatt()), + ); + } + let mut services = vec![]; + for service in services_vec { + let bt_service = device.get_or_create_service(&service, &device.get_gatt()); + services.push(bt_service); + } + promise.resolve_native(&services); + }, + _ => promise.reject_error(Error::Type("Something went wrong...".to_owned())), + } + } +} |