2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 var T = xwalk.utils.type;
18 var Converter = xwalk.utils.converter;
19 var AV = xwalk.utils.validator;
20 var Privilege = xwalk.utils.privilege;
21 var privUtils_ = xwalk.utils;
22 var native = new xwalk.utils.NativeManager(extension);
24 // class BluetoothClassDeviceMajor /////////////////////////////////////////
25 var BluetoothClassDeviceMajor = function() {
26 Object.defineProperties(this, {
27 MISC: { value: 0x00, writable: false, enumerable: true },
28 COMPUTER: { value: 0x01, writable: false, enumerable: true },
29 PHONE: { value: 0x02, writable: false, enumerable: true },
30 NETWORK: { value: 0x03, writable: false, enumerable: true },
31 AUDIO_VIDEO: { value: 0x04, writable: false, enumerable: true },
32 PERIPHERAL: { value: 0x05, writable: false, enumerable: true },
33 IMAGING: { value: 0x06, writable: false, enumerable: true },
34 WEARABLE: { value: 0x07, writable: false, enumerable: true },
35 TOY: { value: 0x08, writable: false, enumerable: true },
36 HEALTH: { value: 0x09, writable: false, enumerable: true },
37 UNCATEGORIZED: { value: 0x1f, writable: false, enumerable: true }
41 // class BluetoothClassDeviceMinor /////////////////////////////////////////
42 var BluetoothClassDeviceMinor = function() {
43 Object.defineProperties(this, {
44 COMPUTER_UNCATEGORIZED: { value: 0x00, writable: false, enumerable: true },
45 COMPUTER_DESKTOP: { value: 0x01, writable: false, enumerable: true },
46 COMPUTER_SERVER: { value: 0x02, writable: false, enumerable: true },
47 COMPUTER_LAPTOP: { value: 0x03, writable: false, enumerable: true },
48 COMPUTER_HANDHELD_PC_OR_PDA: { value: 0x04, writable: false, enumerable: true },
49 COMPUTER_PALM_PC_OR_PDA: { value: 0x05, writable: false, enumerable: true },
50 COMPUTER_WEARABLE: { value: 0x06, writable: false, enumerable: true },
52 PHONE_UNCATEGORIZED: { value: 0x00, writable: false, enumerable: true },
53 PHONE_CELLULAR: { value: 0x01, writable: false, enumerable: true },
54 PHONE_CORDLESS: { value: 0x02, writable: false, enumerable: true },
55 PHONE_SMARTPHONE: { value: 0x03, writable: false, enumerable: true },
56 PHONE_MODEM_OR_GATEWAY: { value: 0x04, writable: false, enumerable: true },
57 PHONE_ISDN: { value: 0x05, writable: false, enumerable: true },
59 AV_UNRECOGNIZED: { value: 0x00, writable: false, enumerable: true },
60 AV_WEARABLE_HEADSET: { value: 0x01, writable: false, enumerable: true },
61 AV_HANDSFREE: { value: 0x02, writable: false, enumerable: true },
62 AV_MICROPHONE: { value: 0x04, writable: false, enumerable: true },
63 AV_LOUDSPEAKER: { value: 0x05, writable: false, enumerable: true },
64 AV_HEADPHONES: { value: 0x06, writable: false, enumerable: true },
65 AV_PORTABLE_AUDIO: { value: 0x07, writable: false, enumerable: true },
66 AV_CAR_AUDIO: { value: 0x08, writable: false, enumerable: true },
67 AV_SETTOP_BOX: { value: 0x09, writable: false, enumerable: true },
68 AV_HIFI: { value: 0x0a, writable: false, enumerable: true },
69 AV_VCR: { value: 0x0b, writable: false, enumerable: true },
70 AV_VIDEO_CAMERA: { value: 0x0c, writable: false, enumerable: true },
71 AV_CAMCORDER: { value: 0x0d, writable: false, enumerable: true },
72 AV_MONITOR: { value: 0x0e, writable: false, enumerable: true },
73 AV_DISPLAY_AND_LOUDSPEAKER: { value: 0x0f, writable: false, enumerable: true },
74 AV_VIDEO_CONFERENCING: { value: 0x10, writable: false, enumerable: true },
75 AV_GAMING_TOY: { value: 0x12, writable: false, enumerable: true },
77 PERIPHERAL_UNCATEGORIZED: { value: 0x00, writable: false, enumerable: true },
78 PERIPHERAL_KEYBOARD: { value: 0x10, writable: false, enumerable: true },
79 PERIPHERAL_POINTING_DEVICE: { value: 0x20, writable: false, enumerable: true },
80 PERIPHERAL_KEYBOARD_AND_POINTING_DEVICE: {
85 PERIPHERAL_JOYSTICK: { value: 0x01, writable: false, enumerable: true },
86 PERIPHERAL_GAMEPAD: { value: 0x02, writable: false, enumerable: true },
87 PERIPHERAL_REMOTE_CONTROL: { value: 0x03, writable: false, enumerable: true },
88 PERIPHERAL_SENSING_DEVICE: { value: 0x04, writable: false, enumerable: true },
89 PERIPHERAL_DEGITIZER_TABLET: { value: 0x05, writable: false, enumerable: true },
90 PERIPHERAL_CARD_READER: { value: 0x06, writable: false, enumerable: true },
91 PERIPHERAL_DIGITAL_PEN: { value: 0x07, writable: false, enumerable: true },
92 PERIPHERAL_HANDHELD_SCANNER: { value: 0x08, writable: false, enumerable: true },
93 PERIPHERAL_HANDHELD_INPUT_DEVICE: {
99 IMAGING_UNCATEGORIZED: { value: 0x00, writable: false, enumerable: true },
100 IMAGING_DISPLAY: { value: 0x04, writable: false, enumerable: true },
101 IMAGING_CAMERA: { value: 0x08, writable: false, enumerable: true },
102 IMAGING_SCANNER: { value: 0x10, writable: false, enumerable: true },
103 IMAGING_PRINTER: { value: 0x20, writable: false, enumerable: true },
105 WEARABLE_WRITST_WATCH: { value: 0x01, writable: false, enumerable: true },
106 WEARABLE_PAGER: { value: 0x02, writable: false, enumerable: true },
107 WEARABLE_JACKET: { value: 0x03, writable: false, enumerable: true },
108 WEARABLE_HELMET: { value: 0x04, writable: false, enumerable: true },
109 WEARABLE_GLASSES: { value: 0x05, writable: false, enumerable: true },
111 TOY_ROBOT: { value: 0x01, writable: false, enumerable: true },
112 TOY_VEHICLE: { value: 0x02, writable: false, enumerable: true },
113 TOY_DOLL: { value: 0x03, writable: false, enumerable: true },
114 TOY_CONTROLLER: { value: 0x04, writable: false, enumerable: true },
115 TOY_GAME: { value: 0x05, writable: false, enumerable: true },
117 HEALTH_UNDEFINED: { value: 0x00, writable: false, enumerable: true },
118 HEALTH_BLOOD_PRESSURE_MONITOR: { value: 0x01, writable: false, enumerable: true },
119 HEALTH_THERMOMETER: { value: 0x02, writable: false, enumerable: true },
120 HEALTH_WEIGHING_SCALE: { value: 0x03, writable: false, enumerable: true },
121 HEALTH_GLUCOSE_METER: { value: 0x04, writable: false, enumerable: true },
122 HEALTH_PULSE_OXIMETER: { value: 0x05, writable: false, enumerable: true },
123 HEALTH_PULSE_RATE_MONITOR: { value: 0x06, writable: false, enumerable: true },
124 HEALTH_DATA_DISPLAY: { value: 0x07, writable: false, enumerable: true },
125 HEALTH_STEP_COUNTER: { value: 0x08, writable: false, enumerable: true },
126 HEALTH_BODY_COMPOSITION_ANALYZER: {
131 HEALTH_PEAK_FLOW_MONITOR: { value: 0x0a, writable: false, enumerable: true },
132 HEALTH_MEDICATION_MONITOR: { value: 0x0b, writable: false, enumerable: true },
133 HEALTH_KNEE_PROSTHESIS: { value: 0x0c, writable: false, enumerable: true },
134 HEALTH_ANKLE_PROSTHESIS: { value: 0x0d, writable: false, enumerable: true }
138 // class BluetoothClassDeviceService ///////////////////////////////////////
139 var BluetoothClassDeviceService = function() {
140 Object.defineProperties(this, {
141 LIMITED_DISCOVERABILITY: { value: 0x0001, writable: false, enumerable: true },
142 POSITIONING: { value: 0x0008, writable: false, enumerable: true },
143 NETWORKING: { value: 0x0010, writable: false, enumerable: true },
144 RENDERING: { value: 0x0020, writable: false, enumerable: true },
145 CAPTURING: { value: 0x0040, writable: false, enumerable: true },
146 OBJECT_TRANSFER: { value: 0x0080, writable: false, enumerable: true },
147 AUDIO: { value: 0x0100, writable: false, enumerable: true },
148 TELEPHONY: { value: 0x0200, writable: false, enumerable: true },
149 INFORMATION: { value: 0x0400, writable: false, enumerable: true }
153 //class tizen.BluetoothLEServiceData ///////////////////////////
154 tizen.BluetoothLEServiceData = function(d) {
155 AV.isConstructorCall(this, tizen.BluetoothLEServiceData);
159 Object.defineProperties(this, {
166 uuid_ = Converter.toString(v);
176 data_ = BluetoothManager_toDOMString(v);
178 data_ = Converter.toString(v);
184 if (arguments.length >= 2) {
185 // public constructor
186 this.uuid = arguments[0];
187 this.data = arguments[1];
188 } else if (d && T.isObject(d)) {
189 // internal constructor
198 //class BluetoothLEAdvertiseData ///////////////////////////
199 tizen.BluetoothLEAdvertiseData = function(dict) {
200 AV.isConstructorCall(this, tizen.BluetoothLEAdvertiseData);
201 var includeName_ = false;
203 var solicitationuuids_ = null;
204 var appearance_ = null;
205 var includeTxPowerLevel_ = false;
206 var serviceData_ = null;
207 var manufacturerData_ = null;
209 Object.defineProperties(this, {
216 includeName_ = Converter.toBoolean(v, true);
227 } else if (T.isArray(v)) {
228 for (var i = 0; i < v.length; ++i) {
229 if (!T.isString(v[i])) {
230 v[i] = Converter.toString(v[i]);
240 return solicitationuuids_;
244 solicitationuuids_ = v;
245 } else if (T.isArray(v)) {
246 for (var i = 0; i < v.length; ++i) {
247 if (!T.isString(v[i])) {
248 v[i] = Converter.toString(v[i]);
251 solicitationuuids_ = v;
261 appearance_ = Converter.toUnsignedLong(v, true);
264 includeTxPowerLevel: {
267 return includeTxPowerLevel_;
270 includeTxPowerLevel_ = Converter.toBoolean(v, true);
279 if (T.isNull(v) || v instanceof tizen.BluetoothLEServiceData) {
287 return manufacturerData_;
290 if (T.isNull(v) || v instanceof tizen.BluetoothLEManufacturerData) {
291 manufacturerData_ = v;
297 if (T.isObject(dict)) {
301 if (T.isNull(dict.includeName) || T.isBoolean(dict.includeName)) {
302 o.includeName = dict.includeName;
303 } else if (!T.isUndefined(dict.includeName)) {
308 if (T.isNull(dict.uuids)) {
309 o.uuids = dict.uuids;
310 } else if (T.isArray(dict.uuids)) {
311 for (var i = 0; i < dict.uuids.length; ++i) {
312 if (!T.isString(dict.uuids[i])) {
316 o.uuids = dict.uuids;
317 } else if (!T.isUndefined(dict.uuids)) {
322 if (T.isNull(dict.solicitationuuids)) {
323 o.solicitationuuids = dict.solicitationuuids;
324 } else if (T.isArray(dict.solicitationuuids)) {
325 for (var i = 0; i < dict.solicitationuuids.length; ++i) {
326 if (!T.isString(dict.solicitationuuids[i])) {
330 o.solicitationuuids = dict.solicitationuuids;
331 } else if (!T.isUndefined(dict.solicitationuuids)) {
336 if (T.isNull(dict.appearance) || T.isNumber(dict.appearance)) {
337 o.appearance = dict.appearance;
338 } else if (!T.isUndefined(dict.appearance)) {
342 // includeTxPowerLevel
343 if (T.isNull(dict.includeTxPowerLevel) || T.isBoolean(dict.includeTxPowerLevel)) {
344 o.includeTxPowerLevel = dict.includeTxPowerLevel;
345 } else if (!T.isUndefined(dict.includeTxPowerLevel)) {
351 T.isNull(dict.serviceData) ||
352 dict.serviceData instanceof tizen.BluetoothLEServiceData
354 o.serviceData = dict.serviceData;
355 } else if (!T.isUndefined(dict.serviceData)) {
361 T.isNull(dict.manufacturerData) ||
362 dict.manufacturerData instanceof tizen.BluetoothLEManufacturerData
364 o.manufacturerData = dict.manufacturerData;
365 } else if (!T.isUndefined(dict.manufacturerData)) {
369 for (var prop in o) {
370 if (o.hasOwnProperty(prop) && this.hasOwnProperty(prop)) {
371 this[prop] = o[prop];
377 //class tizen.BluetoothLEManufacturerData ///////////////////////////
378 tizen.BluetoothLEManufacturerData = function(d) {
379 AV.isConstructorCall(this, tizen.BluetoothLEManufacturerData);
383 Object.defineProperties(this, {
390 id_ = Converter.toString(v);
400 data_ = BluetoothManager_toDOMString(v);
402 data_ = Converter.toString(v);
408 if (arguments.length >= 2) {
409 // public constructor
410 this.id = arguments[0];
411 this.data = arguments[1];
412 } else if (d && T.isObject(d)) {
413 // internal constructor
422 // class BluetoothClass ///////////////////////////
423 var BluetoothClass = function(data) {
426 services = data.services;
429 Object.defineProperties(this, {
430 major: { value: data.major, writable: false, enumerable: true },
431 minor: { value: data.minor, writable: false, enumerable: true },
436 return services.slice();
442 var BluetoothClass_hasService = function() {
443 privUtils_.log('Entered BluetoothClass.hasService()');
444 privUtils_.checkPrivilegeAccess4Ver(
447 Privilege.BLUETOOTH_GAP
450 var args = AV.validateArgs(arguments, [
453 type: AV.Types.UNSIGNED_LONG
457 var size = this.services.length;
458 for (var i = 0; i < size; i++) {
459 if (this.services[i] === args.service) {
466 BluetoothClass.prototype.hasService = function() {
467 return BluetoothClass_hasService.apply(this, arguments);
470 // class BluetoothSocket ///////////////////////////
471 var _BLUETOOTH_SOCKET_STATE_CLOSED = 'CLOSED';
473 function BluetoothSocketListeners() {
475 this.socketCallback = function(data) {
477 var socket = that.sockets[event.id];
480 if ('onclose' === event.event) {
482 that.removeListener(event.id);
484 Object.defineProperty(socket, 'state', {
485 value: _BLUETOOTH_SOCKET_STATE_CLOSED
489 var callback = socket[event.event];
490 if (T.isFunction(callback)) {
494 privUtils_.log('Received event for an unknown socket: ' + event.id);
499 BluetoothSocketListeners.prototype.sockets = {};
501 BluetoothSocketListeners.prototype.addListener = function(socket) {
502 if (T.isEmptyObject(this.sockets)) {
503 native.addListener('BLUETOOTH_SOCKET_STATE_CHANGED', this.socketCallback);
506 this.sockets[socket._id] = socket;
509 BluetoothSocketListeners.prototype.removeListener = function(id) {
510 delete this.sockets[id];
512 if (T.isEmptyObject(this.sockets)) {
513 native.removeListener('BLUETOOTH_SOCKET_STATE_CHANGED', this.socketCallback);
517 var _bluetoothSocketListeners = new BluetoothSocketListeners();
519 var BluetoothSocket = function(data) {
520 Object.defineProperties(this, {
521 uuid: { value: data.uuid, writable: false, enumerable: true },
529 value: new BluetoothDevice(data.peer),
533 onmessage: { value: null, writable: true, enumerable: true },
534 onclose: { value: null, writable: true, enumerable: true },
535 _id: { value: data.id, writable: false, enumerable: false }
538 _bluetoothSocketListeners.addListener(this);
541 BluetoothSocket.prototype.writeData = function(data) {
542 privUtils_.log('Entered BluetoothSocket.writeData()');
544 var byteData = BluetoothManager_toByteArray(data);
551 var result = native.callSync('BluetoothSocketWriteData', callArgs);
553 if (native.isFailure(result)) {
554 throw native.getErrorObject(result);
556 return native.getResultObject(result);
560 BluetoothSocket.prototype.readData = function() {
561 privUtils_.log('Entered BluetoothSocket.readData()');
567 var result = native.callSync('BluetoothSocketReadData', callArgs);
569 if (native.isFailure(result)) {
570 throw native.getErrorObject(result);
572 return native.getResultObject(result);
576 BluetoothSocket.prototype.close = function() {
577 privUtils_.log('Entered BluetoothSocket.close()');
579 if (_BLUETOOTH_SOCKET_STATE_CLOSED !== this.state) {
584 var result = native.callSync('BluetoothSocketClose', callArgs);
586 if (native.isFailure(result)) {
587 throw native.getErrorObject(result);
591 Object.defineProperty(this, 'state', { value: _BLUETOOTH_SOCKET_STATE_CLOSED });
595 //class BluetoothLEDevice ///////////////////////////
596 var BluetoothLEDevice = function(data) {
602 solicitationuuids = null,
604 manufacturerData = null,
608 address = data.address;
609 name = data.name || null;
610 txpowerlevel = data.txpowerlevel || null;
611 appearance = data.appearance || null;
612 uuids = data.uuids || null;
613 solicitationuuids = data.solicitationuuids || null;
614 if (data.serviceData) {
616 data.serviceData.forEach(function(d) {
617 serviceData.push(new tizen.BluetoothLEServiceData(d));
620 if (data.manufacturerData) {
621 manufacturerData = new tizen.BluetoothLEManufacturerData(
622 data.manufacturerData
630 Object.defineProperties(this, {
631 address: { value: address, writable: false, enumerable: true },
632 name: { value: name, writable: false, enumerable: true },
633 txpowerlevel: { value: txpowerlevel, writable: false, enumerable: true },
634 appearance: { value: appearance, writable: false, enumerable: true },
639 var service_uuids = uuids ? uuids.slice() : null;
640 return service_uuids;
647 return solicitationuuids ? solicitationuuids.slice() : null;
654 return serviceData ? serviceData.slice() : null;
658 value: manufacturerData,
662 rssi: { value: rssi, writable: false, enumerable: true }
666 BluetoothLEDevice.prototype.connect = function() {
667 privUtils_.log('Entered BluetoothLEDevice.connect()');
668 var args = AV.validateArgs(arguments, [
670 name: 'successCallback',
671 type: AV.Types.FUNCTION,
676 name: 'errorCallback',
677 type: AV.Types.FUNCTION,
683 var callback = function(result) {
684 if (native.isFailure(result)) {
685 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
687 native.callIfPossible(args.successCallback);
690 // Errors are handled by error callback
691 var result = native.call(
692 'BluetoothLEDeviceConnect',
693 { address: this.address },
696 if (native.isFailure(result)) {
697 throw native.getErrorObject(result);
701 BluetoothLEDevice.prototype.disconnect = function() {
702 privUtils_.log('Entered BluetoothLEDevice.disconnect()');
703 var args = AV.validateArgs(arguments, [
705 name: 'successCallback',
706 type: AV.Types.FUNCTION,
711 name: 'errorCallback',
712 type: AV.Types.FUNCTION,
717 var callback = function(result) {
718 if (native.isFailure(result)) {
719 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
721 native.callIfPossible(args.successCallback);
725 var result = native.call(
726 'BluetoothLEDeviceDisconnect',
727 { address: this.address },
730 if (native.isFailure(result)) {
731 throw native.getErrorObject(result);
735 BluetoothLEDevice.prototype.getService = function() {
736 privUtils_.log('Entered BluetoothLEDevice.getService()');
737 var args = AV.validateArgs(arguments, [
740 type: AV.Types.STRING
746 address: this.address
749 var result = native.callSync('BluetoothLEDeviceGetService', callArgs);
750 if (native.isFailure(result)) {
751 throw native.getErrorObject(result);
753 return new BluetoothGATTService(native.getResultObject(result));
757 BluetoothLEDevice.prototype.getServiceAllUuids = function() {
758 privUtils_.log('Entered BluetoothLEDevice.getServiceAllUuids()');
761 address: this.address
764 var result = native.callSync('BluetoothLEDeviceGetServiceAllUuids', callArgs);
765 if (native.isFailure(result)) {
766 throw native.getErrorObject(result);
768 var uuids = native.getResultObject(result);
773 BluetoothLEDevice.prototype.isConnected = function() {
774 privUtils_.log('Entered BluetoothLEDevice.isConnected()');
777 address: this.address
780 var result = native.callSync('BluetoothLEDeviceIsConnected', callArgs);
781 if (native.isFailure(result)) {
782 throw native.getErrorObject(result);
784 return native.getResultObject(result);
787 BluetoothLEDevice.prototype.addConnectStateChangeListener = function() {
788 privUtils_.log('Entered BluetoothLEDevice.addConnectStateChangeListener()');
789 var args = AV.validateArgs(arguments, [
792 type: AV.Types.LISTENER,
793 values: ['onconnected', 'ondisconnected']
799 var func = function(event) {
800 if (event.address === that.address && args.listener[event.action]) {
801 args.listener[event.action](that);
805 var watchId = _bleConnectChangeListener.addListener(func);
810 BluetoothLEDevice.prototype.removeConnectStateChangeListener = function() {
811 privUtils_.log('Entered BluetoothLEDevice.removeConnectStateChangeListener()');
813 var args = AV.validateArgs(arguments, [
820 _bleConnectChangeListener.removeListener(args.watchID);
823 BluetoothLEDevice.prototype.getAttMtu = function() {
824 privUtils_.log('Entered BluetoothLEDevice.getAttMtu()');
827 address: this.address
830 var result = native.callSync('BluetoothLEDeviceGetAttMtu', callArgs);
831 if (native.isFailure(result)) {
832 throw native.getErrorObject(result);
834 return native.getResultObject(result);
837 BluetoothLEDevice.prototype.requestAttMtuChange = function() {
838 privUtils_.log('Entered BluetoothLEDevice.requestAttMtuChange()');
840 var args = AV.validateArgs(arguments, [
848 address: this.address,
852 var result = native.callSync('BluetoothLEDeviceRequestAttMtuChange', callArgs);
853 if (native.isFailure(result)) {
854 throw native.getErrorObject(result);
856 return native.getResultObject(result);
859 BluetoothLEDevice.prototype.addAttMtuChangeListener = function() {
860 privUtils_.log('Entered BluetoothLEDevice.addAttMtuChangeListener()');
861 var args = AV.validateArgs(arguments, [
864 type: AV.Types.FUNCTION
868 var callArgs = { address: this.address };
870 var callback = function(result) {
871 privUtils_.log('Entered BluetoothLEDevice.addAttMtuChangeListener() callback');
872 args.callback(result.attMtuValue);
875 var watchId = _bleAttMtuChangeListener.addListener(callback, callArgs);
880 BluetoothLEDevice.prototype.removeAttMtuChangeListener = function() {
881 privUtils_.log('Entered BluetoothLEDevice.removeAttMtuChangeListener()');
883 var args = AV.validateArgs(arguments, [
890 var callArgs = { address: this.address };
892 _bleAttMtuChangeListener.removeListener(args.watchID, callArgs);
895 // class BluetoothDevice ///////////////////////////
896 var BluetoothDevice = function(data) {
898 function _getter(field) {
901 callArgs.address = self.address;
902 callArgs.field = field;
904 var result = native.callSync('BluetoothDeviceGetBoolValue', callArgs);
906 if (native.isFailure(result)) {
909 return native.getResultObject(result);
913 function isBondedGetter() {
914 return _getter('isBonded');
917 function isTrustedGetter() {
918 return _getter('isTrusted');
921 function isConnectedGetter() {
922 return _getter('isConnected');
930 Object.defineProperties(this, {
931 name: { value: data.name, writable: false, enumerable: true },
932 address: { value: data.address, writable: false, enumerable: true },
934 value: new BluetoothClass(data.deviceClass),
951 get: isConnectedGetter
957 return uuids.slice();
963 BluetoothDevice.prototype.connectToServiceByUUID = function() {
964 privUtils_.log('Entered BluetoothDevice.connectToServiceByUUID()');
966 var args = AV.validateArgs(arguments, [
969 type: AV.Types.STRING
972 name: 'successCallback',
973 type: AV.Types.FUNCTION
976 name: 'errorCallback',
977 type: AV.Types.FUNCTION,
984 address: this.address,
987 var callback = function(result) {
988 if (native.isFailure(result)) {
989 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
991 args.successCallback(new BluetoothSocket(native.getResultObject(result)));
995 var result = native.call('BluetoothDeviceConnectToServiceByUUID', callArgs, callback);
996 if (native.isFailure(result)) {
997 throw native.getErrorObject(result);
1001 // class BluetoothServiceHandler ///////////////////////////
1002 function BluetoothServiceListeners() {
1004 this.serviceCallback = function(data) {
1006 var service = that.services[e.uuid];
1007 var result = new BluetoothSocket(e);
1010 privUtils_.log(service);
1011 service.onconnect(result);
1016 BluetoothServiceListeners.prototype.services = {};
1018 BluetoothServiceListeners.prototype.addListener = function(service) {
1019 if (T.isEmptyObject(this.services)) {
1020 native.addListener('BLUETOOTH_SERVICE_ONCONNECT', this.serviceCallback);
1023 this.services[service.uuid] = service;
1026 BluetoothServiceListeners.prototype.removeListener = function(uuid) {
1027 delete this.services[uuid];
1029 if (T.isEmptyObject(this.services)) {
1030 native.removeListener('BLUETOOTH_SERVICE_ONCONNECT', this.serviceCallback);
1034 var _bluetoothServiceListeners = new BluetoothServiceListeners();
1036 var BluetoothServiceHandler = function(data) {
1037 function isConnectedGetter() {
1042 var result = native.callSync('BluetoothAdapterIsServiceConnected', {
1046 if (native.isFailure(result)) {
1049 return native.getResultObject(result);
1053 Object.defineProperties(this, {
1054 uuid: { value: data.uuid, writable: false, enumerable: true },
1055 name: { value: data.name, writable: false, enumerable: true },
1059 get: isConnectedGetter
1061 onconnect: { value: null, writable: true, enumerable: true }
1064 _bluetoothServiceListeners.addListener(this);
1067 BluetoothServiceHandler.prototype.unregister = function() {
1068 privUtils_.log('Entered BluetoothServiceHandler.unregister()');
1069 var args = AV.validateArgs(arguments, [
1071 name: 'successCallback',
1072 type: AV.Types.FUNCTION,
1077 name: 'errorCallback',
1078 type: AV.Types.FUNCTION,
1088 var callback = function(result) {
1089 if (native.isFailure(result)) {
1090 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1092 native.callIfPossible(args.successCallback);
1096 var result = native.call('BluetoothServiceHandlerUnregister', callArgs, callback);
1097 if (native.isFailure(result)) {
1098 throw native.getErrorObject(result);
1101 _bluetoothServiceListeners.removeListener(this.uuid);
1104 // class BluetoothHealthApplication ///////////////////////////
1105 function BluetoothHealthApplicationListeners() {
1107 this.appCallback = function(data) {
1109 var app = that.apps[event.id];
1112 var callback = app[event.event];
1113 if (T.isFunction(callback)) {
1115 switch (event.event) {
1117 param = new BluetoothHealthChannel(native.getResultObject(event));
1121 privUtils_.log('Unknown event: ' + event.event);
1127 privUtils_.log('Received event for an unknown application: ' + event.id);
1132 BluetoothHealthApplicationListeners.prototype.apps = {};
1134 BluetoothHealthApplicationListeners.prototype.addListener = function(app) {
1135 if (T.isEmptyObject(this.apps)) {
1136 native.addListener('BLUETOOTH_HEALTH_APPLICATION_CHANGED', this.appCallback);
1139 this.apps[app._id] = app;
1142 BluetoothHealthApplicationListeners.prototype.removeListener = function(id) {
1143 delete this.apps[id];
1145 if (T.isEmptyObject(this.apps)) {
1146 native.removeListener('BLUETOOTH_HEALTH_APPLICATION_CHANGED', this.appCallback);
1150 var _bluetoothHealthApplicationListeners = new BluetoothHealthApplicationListeners();
1152 var BluetoothHealthApplication = function(data) {
1153 Object.defineProperties(this, {
1154 dataType: { value: data.dataType, writable: false, enumerable: true },
1155 name: { value: data.name, writable: false, enumerable: true },
1156 onconnect: { value: null, writable: true, enumerable: true },
1157 _id: { value: data._id, writable: false, enumerable: false }
1160 _bluetoothHealthApplicationListeners.addListener(this);
1163 BluetoothHealthApplication.prototype.unregister = function() {
1164 privUtils_.log('Entered BluetoothHealthApplication.unregister()');
1165 privUtils_.printDeprecationWarningFor('BluetoothHealthApplication');
1166 var args = AV.validateArgs(arguments, [
1168 name: 'successCallback',
1169 type: AV.Types.FUNCTION,
1174 name: 'errorCallback',
1175 type: AV.Types.FUNCTION,
1181 var callArgs = { id: this._id };
1183 var callback = function(result) {
1184 if (native.isFailure(result)) {
1185 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1187 native.callIfPossible(args.successCallback);
1191 var result = native.call('BluetoothHealthApplicationUnregister', callArgs, callback);
1192 if (native.isFailure(result)) {
1193 throw native.getErrorObject(result);
1196 _bluetoothHealthApplicationListeners.removeListener(this._id);
1199 // class BluetoothProfileHandler ///////////////////////////
1200 var _BluetoothProfileType = {
1204 var BluetoothProfileHandler = function(data) {
1206 var profileType = data.profileType;
1207 function profileTypeGetter() {
1208 privUtils_.printDeprecationWarningFor('profileType');
1211 Object.defineProperties(this, {
1212 profileType: { enumerable: true, set: function() {}, get: profileTypeGetter }
1217 // class BluetoothHealthProfileHandler ///////////////////////////
1218 var BluetoothHealthProfileHandler = function(data) {
1219 BluetoothProfileHandler.call(this, data);
1222 BluetoothHealthProfileHandler.prototype = new BluetoothProfileHandler();
1224 BluetoothHealthProfileHandler.prototype.constructor = BluetoothProfileHandler;
1226 BluetoothHealthProfileHandler.prototype.registerSinkApplication = function() {
1227 privUtils_.log('Entered BluetoothHealthProfileHandler.registerSinkApplication()');
1228 privUtils_.printDeprecationWarningFor('BluetoothHealthProfileHandler');
1230 var args = AV.validateArgs(arguments, [
1233 type: AV.Types.LONG // there's no short type
1237 type: AV.Types.STRING
1240 name: 'successCallback',
1241 type: AV.Types.FUNCTION
1244 name: 'errorCallback',
1245 type: AV.Types.FUNCTION,
1252 dataType: args.dataType,
1256 var callback = function(result) {
1257 if (native.isFailure(result)) {
1258 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1260 args.successCallback(
1261 new BluetoothHealthApplication(native.getResultObject(result))
1266 var result = native.call(
1267 'BluetoothHealthProfileHandlerRegisterSinkApp',
1271 if (native.isFailure(result)) {
1272 throw native.getErrorObject(result);
1276 BluetoothHealthProfileHandler.prototype.connectToSource = function() {
1277 privUtils_.log('Entered BluetoothHealthProfileHandler.connectToSource()');
1278 privUtils_.printDeprecationWarningFor('BluetoothHealthProfileHandler');
1280 var args = AV.validateArgs(arguments, [
1283 type: AV.Types.PLATFORM_OBJECT,
1284 values: BluetoothDevice
1287 name: 'application',
1288 type: AV.Types.PLATFORM_OBJECT,
1289 values: BluetoothHealthApplication
1292 name: 'successCallback',
1293 type: AV.Types.FUNCTION
1296 name: 'errorCallback',
1297 type: AV.Types.FUNCTION,
1304 address: args.peer.address,
1305 appId: args.application._id
1308 var callback = function(result) {
1309 if (native.isFailure(result)) {
1310 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1312 var channel = native.getResultObject(result);
1313 channel.peer = args.peer;
1314 channel.appId = args.application._id;
1315 args.successCallback(new BluetoothHealthChannel(channel));
1319 var result = native.call(
1320 'BluetoothHealthProfileHandlerConnectToSource',
1324 if (native.isFailure(result)) {
1325 throw native.getErrorObject(result);
1329 // class BluetoothHealthChannel ///////////////////////////
1330 var BluetoothHealthChannel = function(data) {
1331 Object.defineProperties(this, {
1332 peer: { value: data.peer, writable: false, enumerable: true },
1333 channelType: { value: data.channelType, writable: false, enumerable: true },
1335 value: _bluetoothHealthApplicationListeners.apps[data.appId],
1340 value: data.isConnected,
1345 _id: { value: data._id, writable: false, enumerable: false }
1349 BluetoothHealthChannel.prototype.close = function() {
1350 privUtils_.log('Entered BluetoothHealthChannel.close()');
1351 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1353 if (this.isConnected) {
1356 address: this.peer.address
1359 var result = native.callSync('BluetoothHealthChannelClose', callArgs);
1361 if (native.isFailure(result)) {
1362 throw native.getErrorObject(result);
1365 Object.defineProperty(this, 'isConnected', { value: false });
1369 BluetoothHealthChannel.prototype.sendData = function() {
1370 privUtils_.log('Entered BluetoothHealthChannel.sendData()');
1371 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1373 var args = AV.validateArgs(arguments, [
1376 type: AV.Types.ARRAY,
1377 values: AV.Types.BYTE
1386 var result = native.callSync('BluetoothHealthChannelSendData', callArgs);
1388 if (native.isFailure(result)) {
1389 throw native.getErrorObject(result);
1391 return native.getResultObject(result);
1395 var _healthListeners = {};
1397 function _BluetoothHealthChannelChangeCallback(event) {
1399 var callback = _healthListeners[e.id];
1411 privUtils_.log('Unknown mode: ' + e.event);
1415 if (callback[e.event]) {
1416 callback[e.event](d);
1420 var BluetoothHealthChannel_setListener = function() {
1421 privUtils_.log('Entered BluetoothHealthChannel.setListener()');
1422 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1423 privUtils_.checkPrivilegeAccess4Ver(
1425 Privilege.BLUETOOTH,
1426 Privilege.BLUETOOTH_HEALTH
1428 var args = AV.validateArgs(arguments, [
1430 name: 'changeCallback',
1431 type: AV.Types.LISTENER,
1432 values: ['onmessage', 'onclose']
1436 if (T.isEmptyObject(_healthListeners)) {
1438 'BluetoothHealthChannelChangeCallback',
1439 _BluetoothHealthChannelChangeCallback
1442 _healthListeners[this._id] = args.changeCallback;
1445 BluetoothHealthChannel.prototype.setListener = function() {
1446 BluetoothHealthChannel_setListener.apply(this, arguments);
1449 var BluetoothHealthChannel_unsetListener = function() {
1450 privUtils_.log('Entered BluetoothHealthChannel.unsetListener ()');
1451 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1452 if (T.isEmptyObject(_healthListeners)) {
1453 privUtils_.checkPrivilegeAccess4Ver(
1455 Privilege.BLUETOOTH,
1456 Privilege.BLUETOOTH_HEALTH
1460 delete _healthListeners[this._id];
1462 if (T.isEmptyObject(_healthListeners)) {
1463 native.removeListener(
1464 'BluetoothHealthChannelChangeCallback',
1465 _BluetoothHealthChannelChangeCallback
1470 BluetoothHealthChannel.prototype.unsetListener = function() {
1471 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1472 BluetoothHealthChannel_unsetListener.apply(this, arguments);
1476 * Creates a manager for specified listener event.
1478 * @param {string} name - name of the listener this manager handles
1479 * @param {function} callback - function to be invoked when event specified by the name
1481 * This function should return false if the callback
1482 * doesn't want to handle the event anymore, true otherwise.
1483 * This function should have following signature:
1484 * bool callback(event, successCallback, errorCallback);
1486 * @return {object} object which allows to add or remove callbacks for specified listener
1488 function _singleListenerBuilder(name, callback) {
1489 var listenerName = name;
1490 var successCallback;
1492 var callbackFunction = callback;
1493 var listenerRegistered = false;
1495 function innerCallback(event) {
1496 if (!callbackFunction(event, successCallback, errorCallback)) {
1501 function addListener(s, e) {
1502 successCallback = s;
1505 if (!listenerRegistered) {
1506 native.addListener(listenerName, innerCallback);
1507 listenerRegistered = true;
1511 function removeListener() {
1512 if (listenerRegistered) {
1513 native.removeListener(listenerName, innerCallback);
1514 listenerRegistered = false;
1517 successCallback = undefined;
1518 errorCallback = undefined;
1522 addListener: addListener,
1523 removeListener: removeListener
1527 var _bleScanListener = _singleListenerBuilder('BluetoothLEScanCallback', function(
1535 switch (event.action) {
1537 d = new BluetoothLEDevice(event.data);
1541 if (errorCallback) {
1542 errorCallback(native.getErrorObject(event));
1547 privUtils_.log('Unknown mode: ' + event.action);
1550 if (successCallback) {
1557 var _bleAdvertiseListener = _singleListenerBuilder(
1558 'BluetoothLEAdvertiseCallback',
1559 function(event, successCallback, errorCallback) {
1563 switch (event.action) {
1565 if (successCallback) {
1566 successCallback(native.getResultObject(event));
1567 if (native.getResultObject(event) == 'STOPPED') {
1568 _bleAdvertiseListener.removeListener();
1574 if (errorCallback) {
1575 errorCallback(native.getErrorObject(event));
1580 privUtils_.log('Unknown mode: ' + event.action);
1586 //class BluetoothLEAdapter ///////////////////////////
1587 var BluetoothLEAdapter = function() {};
1589 BluetoothLEAdapter.prototype.startScan = function() {
1590 privUtils_.log('Entered BluetoothLEAdapter.startScan()');
1591 var args = AV.validateArgs(arguments, [
1593 name: 'successCallback',
1594 type: AV.Types.FUNCTION
1597 name: 'errorCallback',
1598 type: AV.Types.FUNCTION,
1604 var result = native.callSync('BluetoothLEAdapterStartScan', {});
1605 if (native.isFailure(result)) {
1606 throw native.getErrorObject(result);
1609 _bleScanListener.addListener(args.successCallback, args.errorCallback);
1612 BluetoothLEAdapter.prototype.stopScan = function() {
1613 privUtils_.log('Entered BluetoothLEAdapter.stopScan()');
1615 _bleScanListener.removeListener();
1617 var result = native.callSync('BluetoothLEAdapterStopScan', {});
1618 if (native.isFailure(result)) {
1619 throw native.getErrorObject(result);
1623 BluetoothLEAdapter.prototype.isScanning = function() {
1624 privUtils_.log('Entered BluetoothLEAdapter.isScanning()');
1626 var result = native.callSync('BluetoothLEAdapterIsScanning', {});
1627 if (native.isFailure(result)) {
1628 throw native.getErrorObject(result);
1630 return native.getResultObject(result);
1633 var _BluetoothAdvertisePacketType = {
1634 ADVERTISE: 'ADVERTISE',
1635 SCAN_RESPONSE: 'SCAN_RESPONSE'
1638 var _BluetoothAdvertisingMode = {
1639 BALANCED: 'BALANCED',
1640 LOW_LATENCY: 'LOW_LATENCY',
1641 LOW_ENERGY: 'LOW_ENERGY'
1644 BluetoothLEAdapter.prototype.startAdvertise = function() {
1645 privUtils_.log('Entered BluetoothLEAdapter.startAdvertise()');
1646 var args = AV.validateArgs(arguments, [
1648 name: 'advertiseData',
1649 type: AV.Types.PLATFORM_OBJECT,
1650 values: tizen.BluetoothLEAdvertiseData
1654 type: AV.Types.ENUM,
1655 values: T.getValues(_BluetoothAdvertisePacketType)
1658 name: 'successCallback',
1659 type: AV.Types.FUNCTION
1662 name: 'errorCallback',
1663 type: AV.Types.FUNCTION,
1669 type: AV.Types.ENUM,
1670 values: T.getValues(_BluetoothAdvertisingMode),
1675 name: 'connectable',
1676 type: AV.Types.BOOLEAN,
1683 advertiseData: args.advertiseData,
1684 packetType: args.packetType,
1685 mode: T.isNullOrUndefined(args.mode)
1686 ? _BluetoothAdvertisingMode.BALANCED
1688 connectable: T.isNullOrUndefined(args.connectable) ? true : args.connectable
1691 var result = native.callSync('BluetoothLEAdapterStartAdvertise', callArgs);
1693 if (native.isFailure(result)) {
1694 throw native.getErrorObject(result);
1697 _bleAdvertiseListener.addListener(args.successCallback, args.errorCallback);
1700 BluetoothLEAdapter.prototype.stopAdvertise = function() {
1701 privUtils_.log('Entered BluetoothLEAdapter.stopAdvertise()');
1703 var result = native.callSync('BluetoothLEAdapterStopAdvertise', {});
1705 if (native.isFailure(result)) {
1706 throw native.getErrorObject(result);
1710 BluetoothLEAdapter.prototype.addConnectStateChangeListener = function() {
1711 privUtils_.log('Entered BluetoothLEAdapter.addClientConnectStateChaneListener()');
1712 var args = AV.validateArgs(arguments, [
1715 type: AV.Types.LISTENER,
1716 values: ['onconnected', 'ondisconnected']
1720 var func = function(event) {
1721 if (args.listener[event.action]) {
1722 args.listener[event.action](new BluetoothLEDevice(event.address));
1726 return _bleConnectChangeListener.addListener(func);
1729 BluetoothLEAdapter.prototype.removeConnectStateChangeListener = function() {
1730 privUtils_.log('Entered BluetoothLEAdapter.removeConnectStateChangeListener()');
1732 var args = AV.validateArgs(arguments, [
1739 _bleConnectChangeListener.removeListener(args.watchID);
1742 //class BluetoothGATTService ///////////////////////////
1743 var BluetoothGATTService = function(data, address) {
1744 var handle_ = data.handle;
1745 var uuid_ = data.uuid;
1746 var serviceUuid_ = data.serviceUuid;
1747 //address_ is needed to control if device is still connected
1748 var address_ = address || data.address;
1750 function servicesGetter() {
1752 var result = native.callSync('BluetoothGATTClientServiceGetServices', {
1756 if (native.isSuccess(result)) {
1757 var resultObject = native.getResultObject(result);
1758 resultObject.forEach(function(s) {
1759 services.push(new BluetoothGATTService(s, address_));
1764 function characteristicsGetter() {
1765 var characteristics = [];
1766 var result = native.callSync('BluetoothGATTClientServiceGetCharacteristics', {
1771 if (native.isSuccess(result)) {
1772 var resultObject = native.getResultObject(result);
1773 resultObject.forEach(function(c) {
1774 if (!T.isNullOrUndefined(c)) {
1775 characteristics.push(new BluetoothGATTCharacteristic(c, address_));
1779 return characteristics;
1783 * If this function is called as a constructor of BluetoothGATTServerService's
1784 * base class, some properties have to be left configurable, to enable redefinition.
1785 * Otherwise, if this function is called to create BluetoothGATTService,
1786 * they are left non-configurable.
1788 * If BluetoothGATTService will be a base for any other class in the future,
1789 * the line below may have to be updated to take into account the new class.
1791 var isConfigurable = this instanceof BluetoothGATTServerService;
1793 Object.defineProperties(this, {
1794 uuid: { value: uuid_, writable: false, enumerable: true },
1795 serviceUuid: { value: serviceUuid_, writable: false, enumerable: true },
1798 configurable: isConfigurable,
1804 configurable: isConfigurable,
1806 get: characteristicsGetter
1811 var CurrentGATTServerEntityId = 0;
1812 function NextGattServerEntityID() {
1813 return ++CurrentGATTServerEntityId;
1816 function IsUuidValid(uuid) {
1818 BluetoothManager_UUIDIsValid16Bit(uuid) ||
1819 BluetoothManager_UUIDIsValid32Bit(uuid) ||
1820 BluetoothManager_UUIDIsValid128Bit(uuid)
1824 var ValidateBluetoothGATTServerServiceInit = function(initData) {
1825 initData = AV.validateArgs(
1827 initData['serviceUuid'],
1828 initData['isPrimary'] || true,
1829 initData['includedServices'] || [],
1830 initData['characteristics'] || []
1834 name: 'serviceUuid',
1835 type: AV.Types.STRING,
1836 validator: IsUuidValid
1840 type: AV.Types.BOOLEAN
1843 name: 'includedServices',
1844 type: AV.Types.ARRAY
1847 name: 'characteristics',
1848 type: AV.Types.ARRAY
1853 // "uuid" field is used to construct BluetoothGATTService, but it's not a part
1854 // of BluetoothGATTServerServiceInit dictionary.
1855 // In case of BluetoothGATTServerServices, its value is always the same as
1857 initData.uuid = initData.serviceUuid;
1861 //class BluetoothGATTServerService ///////////////////////////
1862 var BluetoothGATTServerService = function(data) {
1863 data = ValidateBluetoothGATTServerServiceInit(data);
1865 BluetoothGATTService.call(this, data, null);
1867 var services_ = data.includedServices.map(function(serviceData) {
1868 return new BluetoothGATTServerService(serviceData, null);
1870 var characteristics_ = data.characteristics.map(function(characteristicData) {
1871 return new BluetoothGATTServerCharacteristic(characteristicData, null);
1874 Object.defineProperties(this, {
1875 isPrimary: { value: data.isPrimary, writable: false, enumerable: true },
1879 return services_.slice();
1886 return characteristics_.slice();
1890 // This property is "private" and meant not to be used by users
1892 // It has to be enumerable, to be serialized with JSON.stringify()
1894 value: NextGattServerEntityID()
1899 BluetoothGATTServerService.prototype = Object.create(BluetoothGATTService.prototype);
1901 Object.defineProperty(BluetoothGATTServerService.prototype, 'constructor', {
1902 value: BluetoothGATTServerService,
1907 function _getIncludedServicesAndItsComponentsIdsRecursively(service) {
1910 for (var serviceIndex = 0; serviceIndex < service.services.length; ++serviceIndex) {
1911 ids.push(service.services[serviceIndex]._id);
1913 _getIncludedServicesAndItsComponentsIdsRecursively(
1914 service.services[serviceIndex]
1920 var characteristicIndex = 0;
1921 characteristicIndex < service.characteristics.length;
1922 ++characteristicIndex
1924 ids.push(service.characteristics[characteristicIndex]._id);
1927 var descriptorIndex = 0;
1929 service.characteristics[characteristicIndex].descriptors.length;
1933 service.characteristics[characteristicIndex].descriptors[descriptorIndex]
1942 var BluetoothGATTServer_valid_unregisterService_errors = [
1943 'InvalidStateError',
1946 var BluetoothGATTServer_valid_unregisterService_exceptions = [
1947 'TypeMismatchError',
1951 BluetoothGATTServerService.prototype.unregister = function() {
1952 var args = AV.validateArgs(arguments, [
1954 name: 'successCallback',
1955 type: AV.Types.FUNCTION,
1960 name: 'errorCallback',
1961 type: AV.Types.FUNCTION,
1967 var serviceIndex = _BluetoothGATTServerServices.findIndex(
1969 return service._id === this._id;
1973 if (serviceIndex === -1) {
1974 throw new WebAPIException(
1976 'The service is not registered in the local GATT server'
1980 function removeFromJSArrayAndCallSuccessCb() {
1981 _BluetoothGATTServerServices.splice(serviceIndex, 1);
1982 native.callIfPossible(args.successCallback);
1985 if (!_BluetoothGATTServerServicesRegisteredInNativeLayer[this._id]) {
1986 removeFromJSArrayAndCallSuccessCb();
1990 var callback = function(result) {
1991 if (native.isFailure(result)) {
1992 native.callIfPossible(
1994 native.getErrorObjectAndValidate(
1996 BluetoothGATTServer_valid_unregisterService_errors,
2001 delete _BluetoothGATTServerServicesRegisteredInNativeLayer[this._id];
2002 removeFromJSArrayAndCallSuccessCb();
2008 idsToRemoveFromNativeLayer: _getIncludedServicesAndItsComponentsIdsRecursively(
2012 var result = native.call('BluetoothGATTServerUnregisterService', callArgs, callback);
2014 if (native.isFailure(result)) {
2015 throw native.getErrorObjectAndValidate(
2017 BluetoothGATTServer_valid_unregisterService_errors,
2023 var numberArrayToByteArray = function(array) {
2026 array.forEach(function(b) {
2027 d.push(Converter.toOctet(b));
2032 //class BluetoothGATTCharacteristic ///////////////////////////
2033 var BluetoothGATTCharacteristic = function(data, address) {
2034 if (!T.isObject(data)) {
2037 var address_ = address;
2038 var handle_ = data.handle;
2039 var descriptors_ = data.descriptors.map(function(descriptor_data) {
2040 return new BluetoothGATTDescriptor(descriptor_data, address_);
2042 var isBroadcast_ = data.isBroadcast;
2043 var hasExtendedProperties_ = data.hasExtendedProperties;
2044 var isNotify_ = data.isNotify;
2045 var isIndication_ = data.isIndication;
2046 var isReadable_ = data.isReadable;
2047 var isSignedWrite_ = data.isSignedWrite;
2048 var isWritable_ = data.isWritable;
2049 var isWriteNoResponse_ = data.isWriteNoResponse;
2050 var uuid_ = data.uuid;
2053 * If this function is called as a constructor of BluetoothGATTServerCharacteristic's
2054 * base class, some properties have to be left configurable, to enable redefinition.
2055 * Otherwise, if this function is called to create BluetoothGATTCharacteristic,
2056 * they are left non-configurable.
2058 * If BluetoothGATTCharacteristic will be a base for any other class in the future,
2059 * the line below may have to be updated to take into account the new class.
2061 var isConfigurable = this instanceof BluetoothGATTServerCharacteristic;
2063 Object.defineProperties(this, {
2066 configurable: isConfigurable,
2068 return descriptors_.slice();
2075 return isBroadcast_;
2079 hasExtendedProperties: {
2082 return hasExtendedProperties_;
2096 return isIndication_;
2110 return isSignedWrite_;
2121 isWriteNoResponse: {
2124 return isWriteNoResponse_;
2137 this.readValue = function() {
2138 privUtils_.log('Entered BluetoothGATTCharacteristic.readValue()');
2139 var args = AV.validateArgs(arguments, [
2141 name: 'successCallback',
2142 type: AV.Types.FUNCTION
2145 name: 'errorCallback',
2146 type: AV.Types.FUNCTION,
2152 var callback = function(result) {
2153 if (native.isFailure(result)) {
2154 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2156 var d = numberArrayToByteArray(native.getResultObject(result));
2157 args.successCallback(d);
2161 var callArgs = { handle: handle_, address: address_ };
2163 var result = native.call(
2164 'BluetoothGATTClientServiceReadValue',
2169 if (native.isFailure(result)) {
2170 throw native.getErrorObject(result);
2174 this.writeValue = function(value, successCallback, errorCallback) {
2175 privUtils_.log('Entered BluetoothGATTCharacteristic.writeValue()');
2176 var args = AV.validateArgs(Array.prototype.slice.call(arguments, 1), [
2178 name: 'successCallback',
2179 type: AV.Types.FUNCTION,
2184 name: 'errorCallback',
2185 type: AV.Types.FUNCTION,
2191 var callback = function(result) {
2192 if (native.isFailure(result)) {
2193 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2195 native.callIfPossible(args.successCallback);
2201 value: BluetoothManager_toByteArray(value),
2205 var result = native.call(
2206 'BluetoothGATTClientServiceWriteValue',
2211 if (native.isFailure(result)) {
2212 throw native.getErrorObject(result);
2216 var addValueChangeListener = function() {
2217 privUtils_.log('Entered BluetoothGATTCharacteristic.addValueChangeListener()');
2218 privUtils_.checkPrivilegeAccess4Ver(
2220 Privilege.BLUETOOTH,
2221 Privilege.BLUETOOTH_ADMIN
2223 var args = AV.validateArgs(arguments, [
2226 type: AV.Types.FUNCTION
2230 var callArgs = { handle: handle_, address: address_ };
2232 var callback = function(event) {
2233 if (event.handle === handle_) {
2234 args.callback(numberArrayToByteArray(native.getResultObject(event)));
2238 return _bluetoothGATTCharacteristicListener.addListener(callback, callArgs);
2241 this.addValueChangeListener = function() {
2242 return addValueChangeListener.apply(this, arguments);
2245 this.removeValueChangeListener = function() {
2246 privUtils_.log('Entered BluetoothGATTCharacteristic.removeValueChangeListener()');
2248 var args = AV.validateArgs(arguments, [
2255 var callArgs = { handle: handle_, address: address_ };
2257 return _bluetoothGATTCharacteristicListener.removeListener(
2264 var ValidateBluetoothGATTServerCharacteristicInit = function(initData) {
2265 return AV.validateArgs(
2268 initData['descriptors'] || [],
2269 initData['isBroadcast'] || false,
2270 initData['hasExtendedProperties'] || false,
2271 initData['isNotify'] || false,
2272 initData['isIndication'] || false,
2273 initData['isReadable'] || false,
2274 initData['isSignedWrite'] || false,
2275 initData['isWritable'] || false,
2276 initData['isWriteNoResponse'] || false,
2277 initData['readPermission'] || false,
2278 initData['writePermission'] || false,
2279 initData['encryptedReadPermission'] || false,
2280 initData['encryptedWritePermission'] || false,
2281 initData['encryptedSignedReadPermission'] || false,
2282 initData['encryptedSignedWritePermission'] || false,
2283 initData['readValueRequestCallback'] || null,
2284 initData['writeValueRequestCallback'] || null
2289 type: AV.Types.STRING,
2290 validator: IsUuidValid
2293 name: 'descriptors',
2294 type: AV.Types.ARRAY
2297 name: 'isBroadcast',
2298 type: AV.Types.BOOLEAN
2301 name: 'hasExtendedProperties',
2302 type: AV.Types.BOOLEAN
2306 type: AV.Types.BOOLEAN
2309 name: 'isIndication',
2310 type: AV.Types.BOOLEAN
2314 type: AV.Types.BOOLEAN
2317 name: 'isSignedWrite',
2318 type: AV.Types.BOOLEAN
2322 type: AV.Types.BOOLEAN
2325 name: 'isWriteNoResponse',
2326 type: AV.Types.BOOLEAN
2329 name: 'readPermission',
2330 type: AV.Types.BOOLEAN
2333 name: 'writePermission',
2334 type: AV.Types.BOOLEAN
2337 name: 'encryptedReadPermission',
2338 type: AV.Types.BOOLEAN
2341 name: 'encryptedWritePermission',
2342 type: AV.Types.BOOLEAN
2345 name: 'encryptedSignedReadPermission',
2346 type: AV.Types.BOOLEAN
2349 name: 'encryptedSignedWritePermission',
2350 type: AV.Types.BOOLEAN
2353 name: 'readValueRequestCallback',
2354 type: AV.Types.FUNCTION,
2358 name: 'writeValueRequestCallback',
2359 type: AV.Types.FUNCTION,
2366 //class BluetoothGATTServerCharacteristic ///////////////////////////
2367 var BluetoothGATTServerCharacteristic = function(data) {
2368 data = ValidateBluetoothGATTServerCharacteristicInit(data);
2370 BluetoothGATTCharacteristic.call(this, data, null);
2372 var descriptors_ = data.descriptors.map(function(descriptor_data) {
2373 return new BluetoothGATTServerDescriptor(descriptor_data, null);
2376 Object.defineProperties(this, {
2380 return descriptors_.slice();
2387 return data.readPermission;
2394 return data.writePermission;
2398 encryptedReadPermission: {
2401 return data.encryptedReadPermission;
2405 encryptedWritePermission: {
2408 return data.encryptedWritePermission;
2412 encryptedSignedReadPermission: {
2415 return data.encryptedSignedReadPermission;
2419 encryptedSignedWritePermission: {
2422 return data.encryptedSignedWritePermission;
2426 // This property is "private" and meant not to be used by users
2428 // It has to be enumerable, to be serialized with JSON.stringify()
2430 value: NextGattServerEntityID()
2434 this.readValue = function() {
2435 throw new WebAPIException(
2436 'NotSupportedError',
2437 'This method cannot be called on BluetoothGATTServerCharacteristic'
2441 this.writeValue = function() {
2442 throw new WebAPIException(
2443 'NotSupportedError',
2444 'This method cannot be called on BluetoothGATTServerCharacteristic'
2448 this.addValueChangeListener = function() {
2449 throw new WebAPIException(
2450 'NotSupportedError',
2451 'This method cannot be called on BluetoothGATTServerCharacteristic'
2455 this.removeValueChangeListener = function() {
2456 /* Intended no operation */
2460 BluetoothGATTServerCharacteristic.prototype = Object.create(
2461 BluetoothGATTCharacteristic.prototype
2464 Object.defineProperty(BluetoothGATTServerCharacteristic.prototype, 'constructor', {
2465 value: BluetoothGATTServerCharacteristic,
2470 tizen.GATTRequestReply = function(statusCode, data) {
2471 AV.isConstructorCall(this, tizen.GATTRequestReply);
2473 var statusCode_ = Converter.toLong(statusCode);
2474 var data_ = T.isNullOrUndefined(data) ? null : BluetoothManager_toByteArray(data);
2476 Object.defineProperties(this, {
2483 statusCode_ = Converter.toLong(v);
2492 data_ = T.isNullOrUndefined(v) ? null : numberArrayToByteArray(v);
2498 function _createReadValueRequestCallback(
2500 sendResponseSuccessCallback,
2501 sendResponseErrorCallback
2503 return _singleListenerBuilder(
2504 'ReadValueRequestCallback_' + _id,
2506 * _singleListenerBuilder requires 2 callbacks, the second of which
2507 * is an error callback.
2508 * Read value request events coming from the native layer
2510 * Hence, we don't use the second callback here.
2512 function(event, readValueRequestCallback, unusedErrorCallback) {
2513 var clientAddress = event.clientAddress;
2514 var offset = event.offset;
2516 if (readValueRequestCallback) {
2517 var requestReply = readValueRequestCallback(clientAddress, offset);
2520 requestId: event.requestId,
2521 requestType: event.requestType,
2523 statusCode: requestReply.statusCode,
2524 data: requestReply.data
2526 var callback = function(result) {
2527 if (native.isFailure(result)) {
2528 native.callIfPossible(
2529 sendResponseErrorCallback,
2530 native.getErrorObject(result)
2533 native.callIfPossible(sendResponseSuccessCallback);
2536 var result = native.call(
2537 'BluetoothGATTServerSendResponse',
2547 var _BluetoothGATTServerReadWriteValueRequestCallbacks = {};
2549 var _setReadValueRequestCallbackCommon = function() {
2550 var args = AV.validateArgs(arguments, [
2552 name: 'readValueRequestCallback',
2553 type: AV.Types.FUNCTION
2556 name: 'successCallback',
2557 type: AV.Types.FUNCTION,
2562 name: 'errorCallback',
2563 type: AV.Types.FUNCTION,
2568 name: 'sendResponseSuccessCallback',
2569 type: AV.Types.FUNCTION,
2574 name: 'sendResponseErrorCallback',
2575 type: AV.Types.FUNCTION,
2581 var entityId = this._id;
2583 var callback = function(result) {
2584 if (native.isFailure(result)) {
2585 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2587 var readValueRequestCallback = _createReadValueRequestCallback(
2589 args.sendResponseSuccessCallback,
2590 args.sendResponseErrorCallback
2592 readValueRequestCallback.addListener(
2593 args.readValueRequestCallback,
2594 function unusedErrorCallback() {
2595 /* Intentionally no operation */
2598 _BluetoothGATTServerReadWriteValueRequestCallbacks[
2599 "ReadValueCallback" + entityId
2600 ] = readValueRequestCallback;
2601 native.callIfPossible(args.successCallback, native.getErrorObject(result));
2605 var callArgs = { _id: this._id };
2606 var result = native.call(
2607 'BluetoothGATTServerSetReadValueRequestCallback',
2612 if (native.isFailure(result)) {
2613 throw native.getErrorObject(result);
2617 BluetoothGATTServerCharacteristic.prototype.setReadValueRequestCallback = _setReadValueRequestCallbackCommon;
2620 * Creates a manager for specified listener event. Manager handles multiple
2621 * registered listeners
2623 * @param {string} name - name of the listener this manager handles
2624 * @param {function} callback - function to be invoked when event specified by the name
2626 * This function should have following signature:
2627 * void callback(listener, event);
2628 * @param {string} addListenerId - optional parameter. If specified, this native
2629 * method will be called synchronously when
2630 * listener is added.
2631 * @param {string} removeListenerId - optional parameter. If specified, this native
2632 * method will be called synchronously when
2633 * listener is removed.
2634 * @param {bool} repeatNativeCall - optional parameter. If specified, the addListenerId
2635 * and removeListenerId methods will be called
2636 * synchronously each time listener is added/removed.
2637 * Otherwise they are going to be called just once: when
2638 * first listener is added and last listener is removed.
2640 * @return {object} object which allows to add or remove callbacks for specified listener
2642 function _multipleListenerBuilder(
2649 var listenerName = name;
2650 var addId = addListenerId;
2651 var removeId = removeListenerId;
2652 var callbackFunction = callback;
2655 var jsListenerRegistered = false;
2656 var nativeListenerRegistered = false;
2657 var repeatNativeListenerCall = repeatNativeCall;
2659 function innerCallback(event) {
2660 for (var watchId in listeners) {
2661 if (listeners.hasOwnProperty(watchId)) {
2662 callbackFunction(listeners[watchId], event);
2667 function addListener(callback, args) {
2670 if (addId && (!nativeListenerRegistered || repeatNativeListenerCall)) {
2671 var result = native.callSync(addId, args || {});
2672 if (native.isFailure(result)) {
2673 throw native.getErrorObject(result);
2675 nativeListenerRegistered = true;
2678 if (!jsListenerRegistered) {
2679 native.addListener(listenerName, innerCallback);
2680 jsListenerRegistered = true;
2683 listeners[id] = callback;
2687 function removeListener(watchId, args) {
2688 if (listeners.hasOwnProperty(watchId)) {
2689 delete listeners[watchId];
2694 ((nativeListenerRegistered && T.isEmptyObject(listeners)) ||
2695 repeatNativeListenerCall)
2697 var result = native.callSync(removeId, args || {});
2698 if (native.isFailure(result)) {
2699 throw native.getErrorObject(result);
2701 nativeListenerRegistered = false;
2704 if (jsListenerRegistered && T.isEmptyObject(listeners)) {
2705 native.removeListener(listenerName, innerCallback);
2706 jsListenerRegistered = false;
2711 addListener: addListener,
2712 removeListener: removeListener
2716 var _bluetoothGATTCharacteristicListener = _multipleListenerBuilder(
2717 'BluetoothGATTCharacteristicValueChangeListener',
2718 function(listener, event) {
2721 'BluetoothGATTClientServiceAddValueChangeListener',
2722 'BluetoothGATTClientServiceRemoveValueChangeListener',
2727 * This object is used by:
2728 * - BluetoothLEDevice.addConnectStateChangeListener()
2729 * - BluetoothLEAdapter.addConnectStateChangeListener()
2731 var _bleConnectChangeListener = _multipleListenerBuilder(
2732 'BluetoothLEConnectChangeCallback',
2733 function(listener, event) {
2736 'BluetoothLEDeviceAddConnectStateChangeListener',
2737 'BluetoothLEDeviceRemoveConnectStateChangeListener'
2740 var _bleAttMtuChangeListener = _multipleListenerBuilder(
2741 'BluetoothLEAttMtuChangeCallback',
2742 function(listener, event) {
2745 'BluetoothLEDeviceAddAttMtuChangeListener',
2746 'BluetoothLEDeviceRemoveAttMtuChangeListener'
2749 //class BluetoothGATTDescriptor ///////////////////////////
2750 var BluetoothGATTDescriptor = function(data, address) {
2751 var handle_ = data.handle;
2752 //address_ is needed to control if device is still connected
2753 var address_ = address;
2754 var uuid_ = data.uuid;
2756 this.readValue = function() {
2757 privUtils_.log('Entered BluetoothGATTDescriptor.readValue()');
2758 var args = AV.validateArgs(arguments, [
2760 name: 'successCallback',
2761 type: AV.Types.FUNCTION
2764 name: 'errorCallback',
2765 type: AV.Types.FUNCTION,
2771 var callback = function(result) {
2772 if (native.isFailure(result)) {
2773 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2775 var d = numberArrayToByteArray(native.getResultObject(result));
2776 args.successCallback(d);
2780 var callArgs = { handle: handle_, address: address_ };
2782 var result = native.call(
2783 'BluetoothGATTClientServiceReadValue',
2788 if (native.isFailure(result)) {
2789 throw native.getErrorObject(result);
2793 this.writeValue = function(value, successCallback, errorCallback) {
2794 privUtils_.log('Entered BluetoothGATTDescriptor.writeValue()');
2795 var args = AV.validateArgs(Array.prototype.slice.call(arguments, 1), [
2797 name: 'successCallback',
2798 type: AV.Types.FUNCTION,
2803 name: 'errorCallback',
2804 type: AV.Types.FUNCTION,
2810 var callback = function(result) {
2811 if (native.isFailure(result)) {
2812 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2814 native.callIfPossible(args.successCallback);
2820 value: BluetoothManager_toByteArray(value),
2824 var result = native.call(
2825 'BluetoothGATTClientServiceWriteValue',
2830 if (native.isFailure(result)) {
2831 throw native.getErrorObject(result);
2835 Object.defineProperties(this, {
2846 var ValidateBluetoothGATTServerDescriptorInit = function(initData) {
2847 return AV.validateArgs(
2850 initData['readPermission'] || false,
2851 initData['writePermission'] || false,
2852 initData['encryptedReadPermission'] || false,
2853 initData['encryptedWritePermission'] || false,
2854 initData['encryptedSignedReadPermission'] || false,
2855 initData['encryptedSignedWritePermission'] || false,
2856 initData['readValueRequestCallback'] || null,
2857 initData['writeValueRequestCallback'] || null
2862 type: AV.Types.STRING,
2863 validator: IsUuidValid
2866 name: 'readPermission',
2867 type: AV.Types.BOOLEAN
2870 name: 'writePermission',
2871 type: AV.Types.BOOLEAN
2874 name: 'encryptedReadPermission',
2875 type: AV.Types.BOOLEAN
2878 name: 'encryptedWritePermission',
2879 type: AV.Types.BOOLEAN
2882 name: 'encryptedSignedReadPermission',
2883 type: AV.Types.BOOLEAN
2886 name: 'encryptedSignedWritePermission',
2887 type: AV.Types.BOOLEAN
2890 name: 'readValueRequestCallback',
2891 type: AV.Types.FUNCTION,
2895 name: 'writeValueRequestCallback',
2896 type: AV.Types.FUNCTION,
2903 var BluetoothGATTServerDescriptor = function(data, address) {
2904 data = ValidateBluetoothGATTServerDescriptorInit(data);
2906 BluetoothGATTDescriptor.call(this, data, null);
2908 Object.defineProperties(this, {
2912 return data.readPermission;
2919 return data.writePermission;
2923 encryptedReadPermission: {
2926 return data.encryptedReadPermission;
2930 encryptedWritePermission: {
2933 return data.encryptedWritePermission;
2937 encryptedSignedReadPermission: {
2940 return data.encryptedSignedReadPermission;
2944 encryptedSignedWritePermission: {
2947 return data.encryptedSignedWritePermission;
2951 // This property is "private" and meant not to be used by users
2953 // It has to be enumerable, to be serialized with JSON.stringify()
2955 value: NextGattServerEntityID()
2959 this.readValue = function() {
2960 throw new WebAPIException(
2961 'NotSupportedError',
2962 'This method cannot be called on BluetoothGATTServerDescriptor'
2966 this.writeValue = function() {
2967 throw new WebAPIException(
2968 'NotSupportedError',
2969 'This method cannot be called on BluetoothGATTServerDescriptor'
2974 BluetoothGATTServerDescriptor.prototype = Object.create(
2975 BluetoothGATTDescriptor.prototype
2978 Object.defineProperty(BluetoothGATTServerDescriptor.prototype, 'constructor', {
2979 value: BluetoothGATTServerDescriptor,
2984 BluetoothGATTServerDescriptor.prototype.setReadValueRequestCallback = _setReadValueRequestCallbackCommon;
2986 // class BluetoothAdapter ///////////////////////////
2987 var BluetoothAdapter = function() {
2988 function nameGetter() {
2989 var result = native.callSync('BluetoothAdapterGetName', {});
2991 if (native.isFailure(result)) {
2994 return native.getResultObject(result);
2998 function addressGetter() {
2999 var result = native.callSync('BluetoothAdapterGetAddress', {});
3001 if (native.isFailure(result)) {
3004 return native.getResultObject(result);
3008 function poweredGetter() {
3009 var result = native.callSync('BluetoothAdapterGetPowered', {});
3011 if (native.isFailure(result)) {
3014 return native.getResultObject(result);
3018 function visibleGetter() {
3019 var result = native.callSync('BluetoothAdapterGetVisible', {});
3021 if (native.isFailure(result)) {
3024 return native.getResultObject(result);
3028 Object.defineProperties(this, {
3052 BluetoothAdapter.prototype.setName = function() {
3053 privUtils_.log('Entered BluetoothAdapter.setName()');
3054 var args = AV.validateArgs(arguments, [
3057 type: AV.Types.STRING
3060 name: 'successCallback',
3061 type: AV.Types.FUNCTION,
3066 name: 'errorCallback',
3067 type: AV.Types.FUNCTION,
3077 var callback = function(result) {
3078 if (native.isFailure(result)) {
3079 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3081 native.callIfPossible(args.successCallback);
3085 var result = native.call('BluetoothAdapterSetName', callArgs, callback);
3086 if (native.isFailure(result)) {
3087 throw native.getErrorObject(result);
3091 BluetoothAdapter.prototype.setPowered = function() {
3092 privUtils_.log('Entered BluetoothAdapter.setPowered()');
3093 privUtils_.printDeprecationWarningFor('setPowered()');
3095 'Let the user turn on/off Bluetooth through the Settings application instead.'
3098 var args = AV.validateArgs(arguments, [
3101 type: AV.Types.BOOLEAN
3104 name: 'successCallback',
3105 type: AV.Types.FUNCTION,
3110 name: 'errorCallback',
3111 type: AV.Types.FUNCTION,
3118 powered: args.powered
3121 var callback = function(result) {
3122 if (native.isFailure(result)) {
3123 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3125 native.callIfPossible(args.successCallback);
3129 var result = native.call('BluetoothAdapterSetPowered', callArgs, callback);
3130 if (native.isFailure(result)) {
3131 throw native.getErrorObject(result);
3135 // This method is deprecated since Tizen 2.3.
3136 BluetoothAdapter.prototype.setVisible = function() {
3137 privUtils_.log('Entered BluetoothAdapter.setVisible()');
3138 privUtils_.printDeprecationWarningFor('setVisible()');
3140 'Let the user change the Bluetooth visibility through the Settings ' +
3141 'application instead.'
3144 var args = AV.validateArgs(arguments, [
3147 type: AV.Types.BOOLEAN
3150 name: 'successCallback',
3151 type: AV.Types.FUNCTION,
3156 name: 'errorCallback',
3157 type: AV.Types.FUNCTION,
3163 type: AV.Types.UNSIGNED_LONG,
3170 visible: args.visible
3173 if (args.visible === true) {
3174 if (T.isNullOrUndefined(args.timeout)) {
3175 callArgs.timeout = 0;
3177 callArgs.timeout = args.timeout > 65535 ? 180 : args.timeout;
3181 var callback = function(result) {
3182 if (native.isFailure(result)) {
3183 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3185 native.callIfPossible(args.successCallback);
3189 var result = native.call('BluetoothAdapterSetVisible', callArgs, callback);
3190 if (native.isFailure(result)) {
3191 throw native.getErrorObject(result);
3197 function _BluetoothAdapterChangeCallback(event) {
3198 privUtils_.log('_BluetoothAdapterChangeCallback');
3204 case 'onstatechanged':
3208 case 'onnamechanged':
3212 case 'onvisibilitychanged':
3217 privUtils_.log('Unknown mode: ' + e.action);
3221 if (_listener[e.action]) {
3222 _listener[e.action](d);
3226 BluetoothAdapter.prototype.setChangeListener = function() {
3227 privUtils_.log('Entered BluetoothAdapter.setChangeListener()');
3228 var args = AV.validateArgs(arguments, [
3230 name: 'changeCallback',
3231 type: AV.Types.LISTENER,
3232 values: ['onstatechanged', 'onnamechanged', 'onvisibilitychanged']
3236 if (T.isNullOrUndefined(_listener)) {
3238 'BluetoothAdapterChangeCallback',
3239 _BluetoothAdapterChangeCallback
3241 native.callSync('BluetoothAdapterSetChangeListener', {});
3243 _listener = args.changeCallback;
3246 BluetoothAdapter.prototype.unsetChangeListener = function() {
3247 privUtils_.log('Entered BluetoothAdapter.unsetChangeListener()');
3248 if (!T.isNullOrUndefined(_listener)) {
3249 native.removeListener(
3250 'BluetoothAdapterChangeCallback',
3251 _BluetoothAdapterChangeCallback
3253 native.callSync('BluetoothAdapterUnsetChangeListener', {});
3254 _listener = undefined;
3258 var _discoverDevicesSuccessCallback;
3259 var _discoverDevicesErrorCallback;
3261 function _BluetoothDiscoverDevicesSuccessCallback(event) {
3269 case 'ondevicefound':
3270 d = new BluetoothDevice(e.data);
3273 case 'ondevicedisappeared':
3278 var result = e.data;
3280 result.forEach(function(data) {
3281 d.push(new BluetoothDevice(data));
3284 //remove listeners after discovering
3285 native.removeListener(
3286 'BluetoothDiscoverDevicesSuccessCallback',
3287 _BluetoothDiscoverDevicesSuccessCallback
3289 native.removeListener(
3290 'BluetoothDiscoverDevicesErrorCallback',
3291 _BluetoothDiscoverDevicesErrorCallback
3296 privUtils_.log('Unknown mode: ' + e.action);
3300 if (_discoverDevicesSuccessCallback[e.action]) {
3301 _discoverDevicesSuccessCallback[e.action](d);
3305 function _BluetoothDiscoverDevicesErrorCallback(event) {
3307 setTimeout(function() {
3308 native.callIfPossible(_discoverDevicesErrorCallback, native.getErrorObject(e));
3312 BluetoothAdapter.prototype.discoverDevices = function() {
3313 privUtils_.log('Entered BluetoothAdapter.discoverDevices()');
3314 var args = AV.validateArgs(arguments, [
3316 name: 'successCallback',
3317 type: AV.Types.LISTENER,
3318 values: ['onstarted', 'ondevicefound', 'ondevicedisappeared', 'onfinished']
3321 name: 'errorCallback',
3322 type: AV.Types.FUNCTION,
3328 _discoverDevicesSuccessCallback = args.successCallback;
3329 _discoverDevicesErrorCallback = args.errorCallback;
3331 'BluetoothDiscoverDevicesSuccessCallback',
3332 _BluetoothDiscoverDevicesSuccessCallback
3335 'BluetoothDiscoverDevicesErrorCallback',
3336 _BluetoothDiscoverDevicesErrorCallback
3339 var result = native.callSync('BluetoothAdapterDiscoverDevices', {});
3341 if (native.isFailure(result)) {
3342 native.removeListener(
3343 'BluetoothDiscoverDevicesSuccessCallback',
3344 _BluetoothDiscoverDevicesSuccessCallback
3346 native.removeListener(
3347 'BluetoothDiscoverDevicesErrorCallback',
3348 _BluetoothDiscoverDevicesErrorCallback
3350 throw native.getErrorObject(result);
3354 BluetoothAdapter.prototype.stopDiscovery = function() {
3355 privUtils_.log('Entered BluetoothAdapter.stopDiscovery()');
3356 var args = AV.validateArgs(arguments, [
3358 name: 'successCallback',
3359 type: AV.Types.FUNCTION,
3364 name: 'errorCallback',
3365 type: AV.Types.FUNCTION,
3371 var callback = function(result) {
3372 if (native.isFailure(result)) {
3373 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3375 native.callIfPossible(args.successCallback);
3379 var result = native.call('BluetoothAdapterStopDiscovery', {}, callback);
3380 if (native.isFailure(result)) {
3381 throw native.getErrorObject(result);
3385 BluetoothAdapter.prototype.getKnownDevices = function() {
3386 privUtils_.log('Entered BluetoothAdapter.getKnownDevices()');
3387 var args = AV.validateArgs(arguments, [
3389 name: 'successCallback',
3390 type: AV.Types.FUNCTION
3393 name: 'errorCallback',
3394 type: AV.Types.FUNCTION,
3400 var callback = function(result) {
3401 if (native.isFailure(result)) {
3402 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3404 var r = native.getResultObject(result).devices;
3406 r.forEach(function(data) {
3407 devices.push(new BluetoothDevice(data));
3409 args.successCallback(devices);
3413 var result = native.call('BluetoothAdapterGetKnownDevices', {}, callback);
3414 if (native.isFailure(result)) {
3415 throw native.getErrorObject(result);
3419 BluetoothAdapter.prototype.getDevice = function() {
3420 privUtils_.log('Entered BluetoothAdapter.getDevice()');
3421 var args = AV.validateArgs(arguments, [
3424 type: AV.Types.STRING
3427 name: 'successCallback',
3428 type: AV.Types.FUNCTION
3431 name: 'errorCallback',
3432 type: AV.Types.FUNCTION,
3438 var callback = function(result) {
3439 if (native.isFailure(result)) {
3440 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3442 args.successCallback(new BluetoothDevice(native.getResultObject(result)));
3446 var result = native.call(
3447 'BluetoothAdapterGetDevice',
3448 { address: args.address },
3451 if (native.isFailure(result)) {
3452 throw native.getErrorObject(result);
3456 BluetoothAdapter.prototype.createBonding = function() {
3457 privUtils_.log('Entered BluetoothAdapter.createBonding()');
3458 var args = AV.validateArgs(arguments, [
3461 type: AV.Types.STRING
3464 name: 'successCallback',
3465 type: AV.Types.FUNCTION,
3470 name: 'errorCallback',
3471 type: AV.Types.FUNCTION,
3478 address: args.address
3481 var callback = function(result) {
3482 if (native.isFailure(result)) {
3483 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3485 args.successCallback(new BluetoothDevice(native.getResultObject(result)));
3489 var result = native.call('BluetoothAdapterCreateBonding', callArgs, callback);
3490 if (native.isFailure(result)) {
3491 throw native.getErrorObject(result);
3495 BluetoothAdapter.prototype.destroyBonding = function() {
3496 privUtils_.log('Entered BluetoothAdapter.destroyBonding()');
3497 var args = AV.validateArgs(arguments, [
3500 type: AV.Types.STRING
3503 name: 'successCallback',
3504 type: AV.Types.FUNCTION,
3509 name: 'errorCallback',
3510 type: AV.Types.FUNCTION,
3517 address: args.address
3520 var callback = function(result) {
3521 if (native.isFailure(result)) {
3522 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3524 native.callIfPossible(args.successCallback);
3528 var result = native.call('BluetoothAdapterDestroyBonding', callArgs, callback);
3529 if (native.isFailure(result)) {
3530 throw native.getErrorObject(result);
3534 BluetoothAdapter.prototype.registerRFCOMMServiceByUUID = function() {
3535 privUtils_.log('Entered BluetoothAdapter.registerRFCOMMServiceByUUID()');
3536 var args = AV.validateArgs(arguments, [
3539 type: AV.Types.STRING
3543 type: AV.Types.STRING
3546 name: 'successCallback',
3547 type: AV.Types.FUNCTION
3550 name: 'errorCallback',
3551 type: AV.Types.FUNCTION,
3562 var callback = function(result) {
3563 if (native.isFailure(result)) {
3564 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3566 // if registration was finished with success create BluetoothServiceHandler
3567 // with parameters passed to this function (uuid and name).
3568 args.successCallback(new BluetoothServiceHandler(callArgs));
3572 var result = native.call(
3573 'BluetoothAdapterRegisterRFCOMMServiceByUUID',
3577 if (native.isFailure(result)) {
3578 throw native.getErrorObject(result);
3582 BluetoothAdapter.prototype.getBluetoothProfileHandler = function() {
3583 privUtils_.log('Entered BluetoothAdapter.getBluetoothProfileHandler()');
3584 privUtils_.printDeprecationWarningFor('getBluetoothProfileHandler');
3585 var args = AV.validateArgs(arguments, [
3587 name: 'profileType',
3588 type: AV.Types.ENUM,
3589 values: T.getValues(_BluetoothProfileType)
3593 var callArgs = { profileType: args.profileType };
3595 var result = native.callSync('BluetoothAdapterGetBluetoothProfileHandler', callArgs);
3597 if (native.isFailure(result)) {
3598 throw native.getErrorObject(result);
3600 switch (args.profileType) {
3601 case _BluetoothProfileType.HEALTH:
3602 return new BluetoothHealthProfileHandler(callArgs);
3605 throw new WebAPIException(
3606 'NotSupportedError',
3607 'Profile ' + args.profileType + ' is not supported.'
3613 // class BluetoothGATTServer ////////////////////////
3614 var _BluetoothGATTServerServices = [];
3617 * This set is used in BluetoothGATTServer::start() to check which services
3618 * from BluetoothGATTServer::services have already been registered in native
3619 * layer and which have to be registered.
3621 var _BluetoothGATTServerServicesRegisteredInNativeLayer = {};
3623 var BluetoothGATTServer = function() {
3624 Object.defineProperties(this, {
3628 return _BluetoothGATTServerServices;
3635 var AbortError = new WebAPIException('AbortError', 'An unknown error occurred');
3637 var BluetoothGATTServer_valid_registerService_errors = [
3638 'InvalidStateError',
3639 'NotSupportedError',
3640 'InvalidValuesError',
3643 var BluetoothGATTServer_valid_registerService_exceptions = [
3644 'InvalidStateError',
3645 'TypeMismatchError',
3649 BluetoothGATTServer.prototype.registerService = function() {
3650 var args = AV.validateArgs(arguments, [
3653 type: AV.Types.DICTIONARY
3656 name: 'successCallback',
3657 type: AV.Types.FUNCTION,
3662 name: 'errorCallback',
3663 type: AV.Types.FUNCTION,
3669 var service = new BluetoothGATTServerService(args.service);
3671 var callback = function(result) {
3672 if (native.isFailure(result)) {
3673 native.callIfPossible(
3675 native.getErrorObjectAndValidate(
3677 BluetoothGATTServer_valid_registerService_errors,
3682 _BluetoothGATTServerServicesRegisteredInNativeLayer[service._id] = true;
3683 _BluetoothGATTServerServices.push(service);
3684 native.callIfPossible(args.successCallback);
3688 var result = native.call('BluetoothGATTServerRegisterService', service, callback);
3689 if (native.isFailure(result)) {
3690 throw native.getErrorObjectAndValidate(
3692 BluetoothGATTServer_valid_registerService_exceptions,
3699 * Objects of this class are used to wait for multiple callbacks results.
3701 * Its successCallback and errorCallback members should be passed as
3702 * the success and error callbacks, respectively, to the functions we wait for.
3703 * When the functions we wait for are called callbacksNum times, either
3704 * onAllSucceeded or onFailure is called, depending on whether only
3705 * successCallback was called or not.
3707 * For the usage example, take a look at BluetoothGATTServer.prototype.start,
3708 * where it's used to wait for registration of multiple services.
3710 var ResultCallbacksAggregator = function(callbacksNum, onAllSucceeded, onFailure) {
3711 var _callbacksNum = callbacksNum;
3712 var _allSucceeded = true;
3715 this.successCallback = function() {
3718 if (!_callbacksNum) {
3719 if (_allSucceeded) {
3727 this.errorCallback = function(error) {
3729 _allSucceeded = false;
3732 if (!_callbacksNum) {
3738 var BluetoothGATTServer_valid_start_errors = [
3739 'InvalidStateError',
3740 'NotSupportedError',
3743 var BluetoothGATTServer_valid_start_exceptions = [
3744 'InvalidStateError',
3745 'TypeMismatchError',
3749 BluetoothGATTServer.prototype.start = function() {
3750 privUtils_.log('Entered BluetoothGATTServer.start()');
3751 var args = AV.validateArgs(arguments, [
3753 name: 'successCallback',
3754 type: AV.Types.FUNCTION,
3759 name: 'errorCallback',
3760 type: AV.Types.FUNCTION,
3766 var servicesUnregisteredInNativeLayer = [];
3767 for (var i = 0; i < this.services.length; ++i) {
3768 if (this.services[i]) {
3770 !_BluetoothGATTServerServicesRegisteredInNativeLayer[this.services[i]._id]
3772 servicesUnregisteredInNativeLayer.push(this.services[i]);
3777 var startServerCallback = function(result) {
3778 if (native.isFailure(result)) {
3779 native.callIfPossible(
3781 native.getErrorObjectAndValidate(
3783 BluetoothGATTServer_valid_start_errors,
3788 native.callIfPossible(args.successCallback);
3792 if (servicesUnregisteredInNativeLayer.length) {
3793 var registerServiceCallbacksAggregator = new ResultCallbacksAggregator(
3794 servicesUnregisteredInNativeLayer.length,
3795 function onAllSucceeded() {
3796 var result = native.call(
3797 'BluetoothGATTServerStart',
3802 if (native.isFailure(result)) {
3803 throw native.getErrorObjectAndValidate(
3805 BluetoothGATTServer_valid_start_exceptions,
3810 function onFailure(error) {
3811 native.callIfPossible(
3813 native.getErrorObjectAndValidate(
3815 BluetoothGATTServer_valid_start_errors,
3822 var registerServicesCallback = function(result) {
3823 if (native.isFailure(result)) {
3824 registerServiceCallbacksAggregator.errorCallback(
3825 native.getErrorObjectAndValidate(
3827 BluetoothGATTServer_valid_start_errors,
3832 registerServiceCallbacksAggregator.successCallback();
3836 for (var i = 0; i < servicesUnregisteredInNativeLayer.length; ++i) {
3837 var result = native.call(
3838 'BluetoothGATTServerRegisterService',
3839 servicesUnregisteredInNativeLayer[i],
3840 registerServicesCallback
3842 if (native.isFailure(result)) {
3843 throw native.getErrorObjectAndValidate(
3845 BluetoothGATTServer_valid_registerService_exceptions,
3851 var result = native.call('BluetoothGATTServerStart', {}, startServerCallback);
3853 if (native.isFailure(result)) {
3854 throw native.getErrorObjectAndValidate(
3856 BluetoothGATTServer_valid_start_exceptions,
3863 var BluetoothGATTServer_valid_stop_errors = [
3864 'InvalidStateError',
3865 'NotSupportedError',
3868 var BluetoothGATTServer_valid_stop_exceptions = [
3869 'InvalidStateError',
3870 'TypeMismatchError',
3874 BluetoothGATTServer.prototype.stop = function() {
3875 privUtils_.log('Entered BluetoothGATTServer.stop()');
3876 var args = AV.validateArgs(arguments, [
3878 name: 'successCallback',
3879 type: AV.Types.FUNCTION,
3884 name: 'errorCallback',
3885 type: AV.Types.FUNCTION,
3891 var callback = function(result) {
3892 if (native.isFailure(result)) {
3893 native.callIfPossible(
3895 native.getErrorObjectAndValidate(
3897 BluetoothGATTServer_valid_stop_errors,
3902 _BluetoothGATTServerServicesRegisteredInNativeLayer = {};
3903 native.callIfPossible(args.successCallback);
3907 var result = native.call('BluetoothGATTServerStop', {}, callback);
3908 if (native.isFailure(result)) {
3909 throw native.getErrorObjectAndValidate(
3911 BluetoothGATTServer_valid_stop_exceptions,
3917 var BluetoothGATTServer_valid_getConnectionMtu_errors = [
3918 'InvalidStateError',
3919 'NotSupportedError',
3922 var BluetoothGATTServer_valid_getConnectionMtu_exceptions = [
3923 'TypeMismatchError',
3927 BluetoothGATTServer.prototype.getConnectionMtu = function() {
3928 privUtils_.log('Entered BluetoothGATTServer.getConnectionMtu()');
3929 var args = AV.validateArgs(arguments, [
3931 name: 'clientAddress',
3932 type: AV.Types.STRING
3935 name: 'successCallback',
3936 type: AV.Types.FUNCTION
3939 name: 'errorCallback',
3940 type: AV.Types.FUNCTION,
3945 var callback = function(result) {
3946 if (native.isFailure(result)) {
3947 native.callIfPossible(
3949 native.getErrorObjectAndValidate(
3951 BluetoothGATTServer_valid_getConnectionMtu_errors,
3956 args.successCallback(native.getResultObject(result));
3960 var result = native.call(
3961 'BluetoothGATTServerGetConnectionMtu',
3962 { clientAddress: args.clientAddress },
3965 if (native.isFailure(result)) {
3966 throw native.getErrorObjectAndValidate(
3968 BluetoothGATTServer_valid_getConnectionMtu_exceptions,
3974 var GATTServer = new BluetoothGATTServer();
3976 // class BluetoothManager ///////////////////////////
3977 var BluetoothManager = function() {
3978 Object.defineProperties(this, {
3980 value: new BluetoothClassDeviceMajor(),
3985 value: new BluetoothClassDeviceMinor(),
3990 value: new BluetoothClassDeviceService(),
3995 value: '00000000-0000-1000-8000-00805F9B34FB',
4002 var BluetoothManager_getDefaultAdapter = function() {
4003 privUtils_.checkPrivilegeAccess4Ver(
4005 Privilege.BLUETOOTH,
4006 Privilege.BLUETOOTH_GAP
4009 return new BluetoothAdapter();
4012 BluetoothManager.prototype.getDefaultAdapter = function() {
4013 privUtils_.log('Entered BluetoothManager.getDefaultAdapter()');
4014 return BluetoothManager_getDefaultAdapter();
4017 var BluetoothManager_getLEAdapter = function() {
4018 privUtils_.checkPrivilegeAccess4Ver(
4020 Privilege.BLUETOOTH,
4021 Privilege.BLUETOOTH_ADMIN
4024 return new BluetoothLEAdapter();
4027 BluetoothManager.prototype.getLEAdapter = function() {
4028 privUtils_.log('Entered BluetoothManager.getLEAdapter()');
4029 return BluetoothManager_getLEAdapter();
4032 var BluetoothManager_checkAndNormalizeHexString = function(hexString) {
4033 hexString = hexString.toLowerCase();
4034 if (hexString.startsWith('0x')) {
4035 hexString = hexString.substring(2);
4037 if (!/^[0-9a-f]+$/.test(hexString)) {
4038 throw new WebAPIException(
4039 WebAPIException.TYPE_MISMATCH_ERR,
4040 'Given string is not hexadecimal value'
4043 if ('0' === hexString) {
4046 if (1 === hexString.length % 2) {
4047 // to save consistency with BluetoothLEManufacturerData, last character is omitted
4048 hexString = hexString.replace(/.$/, '');
4053 var BluetoothManager_HexStringToUint8Array = function(hexString) {
4054 hexString = BluetoothManager_checkAndNormalizeHexString(hexString);
4055 if (0 === hexString.length) {
4056 return new Uint8Array([]);
4058 var data = hexString.match(/[0-9a-f]{2}/g).map(function(byte) {
4059 return parseInt(byte, 16);
4061 return new Uint8Array(data);
4064 var BluetoothManager_byteArrayToHexString = function(bytes) {
4065 if (0 == bytes.length) {
4071 .call(bytes, function(byte) {
4072 return ('0' + (byte & 0xff).toString(16)).slice(-2);
4078 var BluetoothManager_toByteArray = function(data) {
4079 if (data && String === data.constructor) {
4080 return numberArrayToByteArray(BluetoothManager_HexStringToUint8Array(data));
4083 data = numberArrayToByteArray(data);
4085 throw new WebAPIException(
4086 WebAPIException.TYPE_MISMATCH_ERR,
4087 'argument is not a valid Bytes type'
4094 BluetoothManager.prototype.toByteArray = function(data) {
4095 privUtils_.log('Entered BluetoothManager.toByteArray()');
4096 return BluetoothManager_toByteArray(data);
4099 var BluetoothManager_toDOMString = function(data) {
4100 if (data && String === data.constructor) {
4101 data = BluetoothManager_checkAndNormalizeHexString(data);
4102 if (0 !== data.length) {
4108 data = numberArrayToByteArray(data);
4110 throw new WebAPIException(
4111 WebAPIException.TYPE_MISMATCH_ERR,
4112 'argument is not a valid Bytes type'
4115 return BluetoothManager_byteArrayToHexString(data);
4118 BluetoothManager.prototype.toDOMString = function(data) {
4119 privUtils_.log('Entered BluetoothManager.toDOMString()');
4120 return BluetoothManager_toDOMString(data);
4123 var BluetoothManager_toUint8Array = function(data) {
4124 if (data && String === data.constructor) {
4125 return BluetoothManager_HexStringToUint8Array(data);
4128 data = new Uint8Array(numberArrayToByteArray(data));
4130 throw new WebAPIException(
4131 WebAPIException.TYPE_MISMATCH_ERR,
4132 'argument is not a valid Bytes type'
4139 BluetoothManager.prototype.toUint8Array = function(data) {
4140 privUtils_.log('Entered BluetoothManager.toUint8Array()');
4141 return BluetoothManager_toUint8Array(data);
4144 var BluetoothManager_UUIDIsValid128Bit = function(uuid) {
4145 var re128BitFormat = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
4146 if (re128BitFormat.test(uuid)) {
4152 var BluetoothManager_UUIDIsValid32Bit = function(uuid) {
4153 var re32BitFormat = /^[0-9a-f]{8}$/;
4154 if (re32BitFormat.test(uuid)) {
4160 var BluetoothManager_UUIDIsValid16Bit = function(uuid) {
4161 var re16BitFormat = /^[0-9a-f]{4}$/;
4162 if (re16BitFormat.test(uuid)) {
4168 var BluetoothManager_UUIDIsConvertibleTo16Bit = function(uuid) {
4169 var re128BitFormat = /^0000[0-9a-f]{4}-0000-1000-8000-00805f9b34fb$/;
4170 if (re128BitFormat.test(uuid)) {
4173 var re32BitFormat = /^0000[0-9a-f]{4}$/;
4174 if (re32BitFormat.test(uuid)) {
4180 var BluetoothManager_UUIDIsConvertibleTo32Bit = function(uuid) {
4181 var re = /^[0-9a-f]{8}-0000-1000-8000-00805f9b34fb$/;
4182 if (re.test(uuid)) {
4188 var BluetoothManager_UUIDTo128bit = function(uuid) {
4189 uuid = Converter.toString(uuid).toLowerCase();
4190 if (BluetoothManager_UUIDIsValid128Bit(uuid)) {
4193 var baseUuidLast96Bits = '-0000-1000-8000-00805f9b34fb';
4194 if (BluetoothManager_UUIDIsValid16Bit(uuid)) {
4195 return '0000' + uuid + baseUuidLast96Bits;
4197 if (BluetoothManager_UUIDIsValid32Bit(uuid)) {
4198 return uuid + baseUuidLast96Bits;
4200 throw new WebAPIException(
4201 WebAPIException.INVALID_VALUES_ERR,
4202 'Given parameter is not a supported uuid format: ' + uuid
4206 var BluetoothManager_UUIDToShortestPossible = function(uuid) {
4207 uuid = uuid.toLowerCase();
4208 if (BluetoothManager_UUIDIsValid16Bit(uuid)) {
4211 if (BluetoothManager_UUIDIsValid32Bit(uuid)) {
4212 if (BluetoothManager_UUIDIsConvertibleTo16Bit(uuid)) {
4213 return uuid.substring(4, 8);
4216 if (!BluetoothManager_UUIDIsValid128Bit(uuid)) {
4217 throw new WebAPIException(
4218 WebAPIException.INVALID_VALUES_ERR,
4219 'Given parameter is not a supported uuid format: ' + uuid
4222 if (BluetoothManager_UUIDIsConvertibleTo16Bit(uuid)) {
4223 return uuid.substring(4, 8);
4225 if (BluetoothManager_UUIDIsConvertibleTo32Bit(uuid)) {
4226 return uuid.substring(0, 8);
4231 var BluetoothManager_UUIDsEqual = function(uuid1, uuid2) {
4232 uuid1 = Converter.toString(uuid1).toLowerCase();
4233 uuid1 = BluetoothManager_UUIDTo128bit(uuid1);
4234 uuid2 = Converter.toString(uuid2).toLowerCase();
4235 uuid2 = BluetoothManager_UUIDTo128bit(uuid2);
4236 return uuid1 === uuid2;
4239 BluetoothManager.prototype.uuidTo128bit = function(uuid) {
4240 privUtils_.log('Entered BluetoothManager.uuidTo128bit()');
4241 var args = AV.validateArgs(arguments, [
4244 type: AV.Types.STRING
4247 return BluetoothManager_UUIDTo128bit(args.uuid);
4250 BluetoothManager.prototype.uuidToShortestPossible = function(uuid) {
4251 privUtils_.log('Entered BluetoothManager.uuidToShortestPossible()');
4252 var args = AV.validateArgs(arguments, [
4255 type: AV.Types.STRING
4258 return BluetoothManager_UUIDToShortestPossible(args.uuid);
4261 BluetoothManager.prototype.uuidsEqual = function(uuid1, uuid2) {
4262 privUtils_.log('Entered BluetoothManager.uuidsEqual()');
4263 var args = AV.validateArgs(arguments, [
4266 type: AV.Types.STRING
4270 type: AV.Types.STRING
4273 return BluetoothManager_UUIDsEqual(args.uuid1, args.uuid2);
4275 BluetoothManager.prototype.getGATTServer = function() {
4276 privUtils_.log('Entered BluetoothManager.getGATTServer()');
4277 return BluetoothManager_getGATTServer();
4280 var BluetoothManager_getGATTServer = function() {
4284 // exports //////////////////////////////////////////
4285 exports = new BluetoothManager();