aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bluetoothuuid.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bluetoothuuid.rs')
-rw-r--r--components/script/dom/bluetoothuuid.rs116
1 files changed, 116 insertions, 0 deletions
diff --git a/components/script/dom/bluetoothuuid.rs b/components/script/dom/bluetoothuuid.rs
new file mode 100644
index 00000000000..33aa6d944d5
--- /dev/null
+++ b/components/script/dom/bluetoothuuid.rs
@@ -0,0 +1,116 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+use dom::bindings::codegen::UnionTypes::StringOrUnsignedLong;
+use dom::bindings::error::Error::Syntax;
+use dom::bindings::error::Fallible;
+use dom::bindings::global::GlobalRef;
+use dom::bindings::reflector::Reflector;
+use regex::Regex;
+use util::str::DOMString;
+
+pub type UUID = DOMString;
+
+// https://webbluetoothcg.github.io/web-bluetooth/#bluetoothuuid
+ #[dom_struct]
+pub struct BluetoothUUID {
+ reflector_: Reflector,
+}
+
+const BLUETOOTH_ASSIGNED_SERVICES: &'static [(&'static str, u32)] = &[
+//TODO(zakorgy) create all the services
+//https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
+ ("org.bluetooth.service.alert_notification", 0x1811_u32),
+ ("org.bluetooth.service.automation_io", 0x1815_u32),
+ ("org.bluetooth.service.battery_service", 0x180f_u32)
+];
+
+const BLUETOOTH_ASSIGNED_CHARCTERISTICS: &'static [(&'static str, u32)] = &[
+//TODO(zakorgy) create all the characteristics
+//https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
+ ("org.bluetooth.characteristic.aerobic_heart_rate_lower_limit", 0x2a7e_u32),
+ ("org.bluetooth.characteristic.aerobic_heart_rate_upper_limit", 0x2a84_u32),
+ ("org.bluetooth.characteristic.battery_level", 0x2a19_u32)
+];
+
+const BLUETOOTH_ASSIGNED_DESCRIPTORS: &'static [(&'static str, u32)] = &[
+//TODO(zakorgy) create all the descriptors
+//https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
+ ("org.bluetooth.descriptor.gatt.characteristic_extended_properties", 0x2900_u32),
+ ("org.bluetooth.descriptor.gatt.characteristic_user_description", 0x2901_u32)
+];
+
+const BASE_UUID: &'static str = "-0000-1000-8000-00805f9b34fb";
+const SERVICE_PREFIX: &'static str = "org.bluetooth.service";
+const CHARACTERISTIC_PREFIX: &'static str = "org.bluetooth.characteristic";
+const DESCRIPTOR_PREFIX: &'static str = "org.bluetooth.descriptor";
+const VALID_UUID_REGEX: &'static str = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
+
+impl BluetoothUUID {
+
+ // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-canonicaluuid
+ pub fn CanonicalUUID(_: GlobalRef, alias: u32) -> UUID {
+ DOMString::from(format!("{:08x}", &alias) + BASE_UUID)
+ }
+
+ // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-getservice
+ pub fn GetService(globalref: GlobalRef,
+ name: StringOrUnsignedLong)
+ -> Fallible<UUID> {
+ BluetoothUUID::resolve_uuid_name(globalref,
+ name,
+ BLUETOOTH_ASSIGNED_SERVICES,
+ DOMString::from(SERVICE_PREFIX))
+ }
+
+ // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-getcharacteristic
+ pub fn GetCharacteristic(globalref: GlobalRef,
+ name: StringOrUnsignedLong)
+ -> Fallible<UUID> {
+ BluetoothUUID::resolve_uuid_name(globalref,
+ name,
+ BLUETOOTH_ASSIGNED_CHARCTERISTICS,
+ DOMString::from(CHARACTERISTIC_PREFIX))
+ }
+
+ // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-getdescriptor
+ pub fn GetDescriptor(globalref: GlobalRef,
+ name: StringOrUnsignedLong)
+ -> Fallible<UUID> {
+ BluetoothUUID::resolve_uuid_name(globalref,
+ name,
+ BLUETOOTH_ASSIGNED_DESCRIPTORS,
+ DOMString::from(DESCRIPTOR_PREFIX))
+ }
+
+ // https://webbluetoothcg.github.io/web-bluetooth/#resolveuuidname
+ pub fn resolve_uuid_name(globalref: GlobalRef,
+ name: StringOrUnsignedLong,
+ assigned_numbers_table: &'static [(&'static str, u32)],
+ prefix: DOMString)
+ -> Fallible<DOMString> {
+ match name {
+ // Step 1
+ StringOrUnsignedLong::UnsignedLong(unsigned32) =>{
+ Ok(BluetoothUUID::CanonicalUUID(globalref, unsigned32))
+ },
+ StringOrUnsignedLong::String(dstring) => {
+ // Step 2
+ let regex = Regex::new(VALID_UUID_REGEX).unwrap();
+ if regex.is_match(&*dstring) {
+ Ok(dstring)
+ } else {
+ // Step 3
+ let concatenated = format!("{}.{}", prefix, dstring);
+ let is_in_table = assigned_numbers_table.iter()
+ .find(|p| p.0 == concatenated);
+ match is_in_table {
+ Some(&(_, alias)) => Ok(BluetoothUUID::CanonicalUUID(globalref, alias)),
+ None => Err(Syntax),
+ }
+ }
+ },
+ }
+ }
+}