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 servicesData_ = null;
208 var manufacturerData_ = null;
210 Object.defineProperties(this, {
217 includeName_ = Converter.toBoolean(v, true);
228 } else if (T.isArray(v)) {
229 for (var i = 0; i < v.length; ++i) {
230 if (!T.isString(v[i])) {
231 v[i] = Converter.toString(v[i]);
241 return solicitationuuids_;
245 solicitationuuids_ = v;
246 } else if (T.isArray(v)) {
247 for (var i = 0; i < v.length; ++i) {
248 if (!T.isString(v[i])) {
249 v[i] = Converter.toString(v[i]);
252 solicitationuuids_ = v;
262 appearance_ = Converter.toUnsignedLong(v, true);
265 includeTxPowerLevel: {
268 return includeTxPowerLevel_;
271 includeTxPowerLevel_ = Converter.toBoolean(v, true);
280 if (T.isNull(v) || v instanceof tizen.BluetoothLEServiceData) {
288 return servicesData_;
293 } else if (T.isArray(v)) {
295 for (var i = 0; i < v.length; ++i) {
296 if (v[i] instanceof tizen.BluetoothLEServiceData) {
300 servicesData_ = tmpArray;
307 return manufacturerData_;
310 if (T.isNull(v) || v instanceof tizen.BluetoothLEManufacturerData) {
311 manufacturerData_ = v;
317 if (T.isObject(dict)) {
321 if (T.isNull(dict.includeName) || T.isBoolean(dict.includeName)) {
322 o.includeName = dict.includeName;
323 } else if (!T.isUndefined(dict.includeName)) {
328 if (T.isNull(dict.uuids)) {
329 o.uuids = dict.uuids;
330 } else if (T.isArray(dict.uuids)) {
331 for (var i = 0; i < dict.uuids.length; ++i) {
332 if (!T.isString(dict.uuids[i])) {
336 o.uuids = dict.uuids;
337 } else if (!T.isUndefined(dict.uuids)) {
342 if (T.isNull(dict.solicitationuuids)) {
343 o.solicitationuuids = dict.solicitationuuids;
344 } else if (T.isArray(dict.solicitationuuids)) {
345 for (var i = 0; i < dict.solicitationuuids.length; ++i) {
346 if (!T.isString(dict.solicitationuuids[i])) {
350 o.solicitationuuids = dict.solicitationuuids;
351 } else if (!T.isUndefined(dict.solicitationuuids)) {
356 if (T.isNull(dict.appearance) || T.isNumber(dict.appearance)) {
357 o.appearance = dict.appearance;
358 } else if (!T.isUndefined(dict.appearance)) {
362 // includeTxPowerLevel
363 if (T.isNull(dict.includeTxPowerLevel) || T.isBoolean(dict.includeTxPowerLevel)) {
364 o.includeTxPowerLevel = dict.includeTxPowerLevel;
365 } else if (!T.isUndefined(dict.includeTxPowerLevel)) {
371 T.isNull(dict.serviceData) ||
372 dict.serviceData instanceof tizen.BluetoothLEServiceData
374 o.serviceData = dict.serviceData;
375 } else if (!T.isUndefined(dict.serviceData)) {
380 if (T.isNull(dict.servicesData) || T.isArray(dict.servicesData)) {
381 // additional validation is done in setter of BluetoothLEAdvertiseData.servicesData
382 o.servicesData = dict.servicesData;
387 T.isNull(dict.manufacturerData) ||
388 dict.manufacturerData instanceof tizen.BluetoothLEManufacturerData
390 o.manufacturerData = dict.manufacturerData;
391 } else if (!T.isUndefined(dict.manufacturerData)) {
395 for (var prop in o) {
396 if (o.hasOwnProperty(prop) && this.hasOwnProperty(prop)) {
397 this[prop] = o[prop];
403 //class tizen.BluetoothLEManufacturerData ///////////////////////////
404 tizen.BluetoothLEManufacturerData = function(d) {
405 AV.isConstructorCall(this, tizen.BluetoothLEManufacturerData);
409 Object.defineProperties(this, {
416 id_ = Converter.toString(v);
426 data_ = BluetoothManager_toDOMString(v);
428 data_ = Converter.toString(v);
434 if (arguments.length >= 2) {
435 // public constructor
436 this.id = arguments[0];
437 this.data = arguments[1];
438 } else if (d && T.isObject(d)) {
439 // internal constructor
448 // class BluetoothClass ///////////////////////////
449 var BluetoothClass = function(data) {
452 services = data.services;
455 Object.defineProperties(this, {
456 major: { value: data.major, writable: false, enumerable: true },
457 minor: { value: data.minor, writable: false, enumerable: true },
462 return services.slice();
468 var BluetoothClass_hasService = function() {
469 privUtils_.log('Entered BluetoothClass.hasService()');
470 privUtils_.checkPrivilegeAccess4Ver(
473 Privilege.BLUETOOTH_GAP
476 var args = AV.validateArgs(arguments, [
479 type: AV.Types.UNSIGNED_LONG
483 var size = this.services.length;
484 for (var i = 0; i < size; i++) {
485 if (this.services[i] === args.service) {
492 BluetoothClass.prototype.hasService = function() {
493 return BluetoothClass_hasService.apply(this, arguments);
496 // class BluetoothSocket ///////////////////////////
497 var _BLUETOOTH_SOCKET_STATE_CLOSED = 'CLOSED';
499 function BluetoothSocketListeners() {
501 this.socketCallback = function(data) {
503 var socket = that.sockets[event.id];
506 if ('onclose' === event.event) {
508 that.removeListener(event.id);
510 Object.defineProperty(socket, 'state', {
511 value: _BLUETOOTH_SOCKET_STATE_CLOSED
515 var callback = socket[event.event];
516 if (T.isFunction(callback)) {
520 privUtils_.log('Received event for an unknown socket: ' + event.id);
525 BluetoothSocketListeners.prototype.sockets = {};
527 BluetoothSocketListeners.prototype.addListener = function(socket) {
528 if (T.isEmptyObject(this.sockets)) {
529 native.addListener('BLUETOOTH_SOCKET_STATE_CHANGED', this.socketCallback);
532 this.sockets[socket._id] = socket;
535 BluetoothSocketListeners.prototype.removeListener = function(id) {
536 delete this.sockets[id];
538 if (T.isEmptyObject(this.sockets)) {
539 native.removeListener('BLUETOOTH_SOCKET_STATE_CHANGED', this.socketCallback);
543 var _bluetoothSocketListeners = new BluetoothSocketListeners();
545 var BluetoothSocket = function(data) {
546 Object.defineProperties(this, {
547 uuid: { value: data.uuid, writable: false, enumerable: true },
555 value: new BluetoothDevice(data.peer),
559 onmessage: { value: null, writable: true, enumerable: true },
560 onclose: { value: null, writable: true, enumerable: true },
561 _id: { value: data.id, writable: false, enumerable: false }
564 _bluetoothSocketListeners.addListener(this);
567 BluetoothSocket.prototype.writeData = function(data) {
568 privUtils_.log('Entered BluetoothSocket.writeData()');
570 var byteData = BluetoothManager_toByteArray(data);
577 var result = native.callSync('BluetoothSocketWriteData', callArgs);
579 if (native.isFailure(result)) {
580 throw native.getErrorObject(result);
582 return native.getResultObject(result);
586 BluetoothSocket.prototype.readData = function() {
587 privUtils_.log('Entered BluetoothSocket.readData()');
593 var result = native.callSync('BluetoothSocketReadData', callArgs);
595 if (native.isFailure(result)) {
596 throw native.getErrorObject(result);
598 return native.getResultObject(result);
602 BluetoothSocket.prototype.close = function() {
603 privUtils_.log('Entered BluetoothSocket.close()');
605 if (_BLUETOOTH_SOCKET_STATE_CLOSED !== this.state) {
610 var result = native.callSync('BluetoothSocketClose', callArgs);
612 if (native.isFailure(result)) {
613 throw native.getErrorObject(result);
617 Object.defineProperty(this, 'state', { value: _BLUETOOTH_SOCKET_STATE_CLOSED });
621 //class BluetoothLEDevice ///////////////////////////
622 var BluetoothLEDevice = function(data) {
628 solicitationuuids = null,
630 manufacturerData = null,
634 address = data.address;
635 name = data.name || null;
636 txpowerlevel = data.txpowerlevel || null;
637 appearance = data.appearance || null;
638 uuids = data.uuids || null;
639 solicitationuuids = data.solicitationuuids || null;
640 if (data.serviceData) {
642 data.serviceData.forEach(function(d) {
643 serviceData.push(new tizen.BluetoothLEServiceData(d));
646 if (data.manufacturerData) {
647 manufacturerData = new tizen.BluetoothLEManufacturerData(
648 data.manufacturerData
656 Object.defineProperties(this, {
657 address: { value: address, writable: false, enumerable: true },
658 name: { value: name, writable: false, enumerable: true },
659 txpowerlevel: { value: txpowerlevel, writable: false, enumerable: true },
660 appearance: { value: appearance, writable: false, enumerable: true },
665 var service_uuids = uuids ? uuids.slice() : null;
666 return service_uuids;
673 return solicitationuuids ? solicitationuuids.slice() : null;
680 return serviceData ? serviceData.slice() : null;
684 value: manufacturerData,
688 rssi: { value: rssi, writable: false, enumerable: true }
692 BluetoothLEDevice.prototype.connect = function() {
693 privUtils_.log('Entered BluetoothLEDevice.connect()');
694 var args = AV.validateArgs(arguments, [
696 name: 'successCallback',
697 type: AV.Types.FUNCTION,
702 name: 'errorCallback',
703 type: AV.Types.FUNCTION,
709 var callback = function(result) {
710 if (native.isFailure(result)) {
711 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
713 native.callIfPossible(args.successCallback);
716 // Errors are handled by error callback
717 var result = native.call(
718 'BluetoothLEDeviceConnect',
719 { address: this.address },
722 if (native.isFailure(result)) {
723 throw native.getErrorObject(result);
727 BluetoothLEDevice.prototype.disconnect = function() {
728 privUtils_.log('Entered BluetoothLEDevice.disconnect()');
729 var args = AV.validateArgs(arguments, [
731 name: 'successCallback',
732 type: AV.Types.FUNCTION,
737 name: 'errorCallback',
738 type: AV.Types.FUNCTION,
743 var callback = function(result) {
744 if (native.isFailure(result)) {
745 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
747 native.callIfPossible(args.successCallback);
751 var result = native.call(
752 'BluetoothLEDeviceDisconnect',
753 { address: this.address },
756 if (native.isFailure(result)) {
757 throw native.getErrorObject(result);
761 BluetoothLEDevice.prototype.getService = function() {
762 privUtils_.log('Entered BluetoothLEDevice.getService()');
763 var args = AV.validateArgs(arguments, [
766 type: AV.Types.STRING
772 address: this.address
775 var result = native.callSync('BluetoothLEDeviceGetService', callArgs);
776 if (native.isFailure(result)) {
777 throw native.getErrorObject(result);
779 return new BluetoothGATTService(native.getResultObject(result));
783 BluetoothLEDevice.prototype.getServiceAllUuids = function() {
784 privUtils_.log('Entered BluetoothLEDevice.getServiceAllUuids()');
787 address: this.address
790 var result = native.callSync('BluetoothLEDeviceGetServiceAllUuids', callArgs);
791 if (native.isFailure(result)) {
792 throw native.getErrorObject(result);
794 var uuids = native.getResultObject(result);
799 BluetoothLEDevice.prototype.isConnected = function() {
800 privUtils_.log('Entered BluetoothLEDevice.isConnected()');
803 address: this.address
806 var result = native.callSync('BluetoothLEDeviceIsConnected', callArgs);
807 if (native.isFailure(result)) {
808 throw native.getErrorObject(result);
810 return native.getResultObject(result);
813 BluetoothLEDevice.prototype.addConnectStateChangeListener = function() {
814 privUtils_.log('Entered BluetoothLEDevice.addConnectStateChangeListener()');
815 var args = AV.validateArgs(arguments, [
818 type: AV.Types.LISTENER,
819 values: ['onconnected', 'ondisconnected']
825 var func = function(event) {
826 if (event.address === that.address && args.listener[event.action]) {
827 args.listener[event.action](that);
831 var watchId = _bleConnectChangeListener.addListener(func);
836 BluetoothLEDevice.prototype.removeConnectStateChangeListener = function() {
837 privUtils_.log('Entered BluetoothLEDevice.removeConnectStateChangeListener()');
839 var args = AV.validateArgs(arguments, [
846 _bleConnectChangeListener.removeListener(args.watchID);
849 BluetoothLEDevice.prototype.getAttMtu = function() {
850 privUtils_.log('Entered BluetoothLEDevice.getAttMtu()');
853 address: this.address
856 var result = native.callSync('BluetoothLEDeviceGetAttMtu', callArgs);
857 if (native.isFailure(result)) {
858 throw native.getErrorObject(result);
860 return native.getResultObject(result);
863 BluetoothLEDevice.prototype.requestAttMtuChange = function() {
864 privUtils_.log('Entered BluetoothLEDevice.requestAttMtuChange()');
866 var args = AV.validateArgs(arguments, [
874 address: this.address,
878 var result = native.callSync('BluetoothLEDeviceRequestAttMtuChange', callArgs);
879 if (native.isFailure(result)) {
880 throw native.getErrorObject(result);
882 return native.getResultObject(result);
885 BluetoothLEDevice.prototype.addAttMtuChangeListener = function() {
886 privUtils_.log('Entered BluetoothLEDevice.addAttMtuChangeListener()');
887 var args = AV.validateArgs(arguments, [
890 type: AV.Types.FUNCTION
894 var callArgs = { address: this.address };
896 var callback = function(result) {
897 privUtils_.log('Entered BluetoothLEDevice.addAttMtuChangeListener() callback');
898 args.callback(result.attMtuValue);
901 var watchId = _bleAttMtuChangeListener.addListener(callback, callArgs);
906 BluetoothLEDevice.prototype.removeAttMtuChangeListener = function() {
907 privUtils_.log('Entered BluetoothLEDevice.removeAttMtuChangeListener()');
909 var args = AV.validateArgs(arguments, [
916 var callArgs = { address: this.address };
918 _bleAttMtuChangeListener.removeListener(args.watchID, callArgs);
921 // class BluetoothDevice ///////////////////////////
922 var BluetoothDevice = function(data) {
924 function _getter(field) {
927 callArgs.address = self.address;
928 callArgs.field = field;
930 var result = native.callSync('BluetoothDeviceGetBoolValue', callArgs);
932 if (native.isFailure(result)) {
935 return native.getResultObject(result);
939 function isBondedGetter() {
940 return _getter('isBonded');
943 function isTrustedGetter() {
944 return _getter('isTrusted');
947 function isConnectedGetter() {
948 return _getter('isConnected');
956 Object.defineProperties(this, {
957 name: { value: data.name, writable: false, enumerable: true },
958 address: { value: data.address, writable: false, enumerable: true },
960 value: new BluetoothClass(data.deviceClass),
977 get: isConnectedGetter
983 return uuids.slice();
989 BluetoothDevice.prototype.connectToServiceByUUID = function() {
990 privUtils_.log('Entered BluetoothDevice.connectToServiceByUUID()');
992 var args = AV.validateArgs(arguments, [
995 type: AV.Types.STRING
998 name: 'successCallback',
999 type: AV.Types.FUNCTION
1002 name: 'errorCallback',
1003 type: AV.Types.FUNCTION,
1010 address: this.address,
1013 var callback = function(result) {
1014 if (native.isFailure(result)) {
1015 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1017 args.successCallback(new BluetoothSocket(native.getResultObject(result)));
1021 var result = native.call('BluetoothDeviceConnectToServiceByUUID', callArgs, callback);
1022 if (native.isFailure(result)) {
1023 throw native.getErrorObject(result);
1027 // class BluetoothServiceHandler ///////////////////////////
1028 function BluetoothServiceListeners() {
1030 this.serviceCallback = function(data) {
1032 var service = that.services[e.uuid];
1033 var result = new BluetoothSocket(e);
1036 privUtils_.log(service);
1037 service.onconnect(result);
1042 BluetoothServiceListeners.prototype.services = {};
1044 BluetoothServiceListeners.prototype.addListener = function(service) {
1045 if (T.isEmptyObject(this.services)) {
1046 native.addListener('BLUETOOTH_SERVICE_ONCONNECT', this.serviceCallback);
1049 this.services[service.uuid] = service;
1052 BluetoothServiceListeners.prototype.removeListener = function(uuid) {
1053 delete this.services[uuid];
1055 if (T.isEmptyObject(this.services)) {
1056 native.removeListener('BLUETOOTH_SERVICE_ONCONNECT', this.serviceCallback);
1060 var _bluetoothServiceListeners = new BluetoothServiceListeners();
1062 var BluetoothServiceHandler = function(data) {
1063 function isConnectedGetter() {
1068 var result = native.callSync('BluetoothAdapterIsServiceConnected', {
1072 if (native.isFailure(result)) {
1075 return native.getResultObject(result);
1079 Object.defineProperties(this, {
1080 uuid: { value: data.uuid, writable: false, enumerable: true },
1081 name: { value: data.name, writable: false, enumerable: true },
1085 get: isConnectedGetter
1087 onconnect: { value: null, writable: true, enumerable: true }
1090 _bluetoothServiceListeners.addListener(this);
1093 BluetoothServiceHandler.prototype.unregister = function() {
1094 privUtils_.log('Entered BluetoothServiceHandler.unregister()');
1095 var args = AV.validateArgs(arguments, [
1097 name: 'successCallback',
1098 type: AV.Types.FUNCTION,
1103 name: 'errorCallback',
1104 type: AV.Types.FUNCTION,
1114 var callback = function(result) {
1115 if (native.isFailure(result)) {
1116 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1118 native.callIfPossible(args.successCallback);
1122 var result = native.call('BluetoothServiceHandlerUnregister', callArgs, callback);
1123 if (native.isFailure(result)) {
1124 throw native.getErrorObject(result);
1127 _bluetoothServiceListeners.removeListener(this.uuid);
1130 // class BluetoothHealthApplication ///////////////////////////
1131 function BluetoothHealthApplicationListeners() {
1133 this.appCallback = function(data) {
1135 var app = that.apps[event.id];
1138 var callback = app[event.event];
1139 if (T.isFunction(callback)) {
1141 switch (event.event) {
1143 param = new BluetoothHealthChannel(native.getResultObject(event));
1147 privUtils_.log('Unknown event: ' + event.event);
1153 privUtils_.log('Received event for an unknown application: ' + event.id);
1158 BluetoothHealthApplicationListeners.prototype.apps = {};
1160 BluetoothHealthApplicationListeners.prototype.addListener = function(app) {
1161 if (T.isEmptyObject(this.apps)) {
1162 native.addListener('BLUETOOTH_HEALTH_APPLICATION_CHANGED', this.appCallback);
1165 this.apps[app._id] = app;
1168 BluetoothHealthApplicationListeners.prototype.removeListener = function(id) {
1169 delete this.apps[id];
1171 if (T.isEmptyObject(this.apps)) {
1172 native.removeListener('BLUETOOTH_HEALTH_APPLICATION_CHANGED', this.appCallback);
1176 var _bluetoothHealthApplicationListeners = new BluetoothHealthApplicationListeners();
1178 var BluetoothHealthApplication = function(data) {
1179 Object.defineProperties(this, {
1180 dataType: { value: data.dataType, writable: false, enumerable: true },
1181 name: { value: data.name, writable: false, enumerable: true },
1182 onconnect: { value: null, writable: true, enumerable: true },
1183 _id: { value: data._id, writable: false, enumerable: false }
1186 _bluetoothHealthApplicationListeners.addListener(this);
1189 BluetoothHealthApplication.prototype.unregister = function() {
1190 privUtils_.log('Entered BluetoothHealthApplication.unregister()');
1191 privUtils_.printDeprecationWarningFor('BluetoothHealthApplication');
1192 var args = AV.validateArgs(arguments, [
1194 name: 'successCallback',
1195 type: AV.Types.FUNCTION,
1200 name: 'errorCallback',
1201 type: AV.Types.FUNCTION,
1207 var callArgs = { id: this._id };
1209 var callback = function(result) {
1210 if (native.isFailure(result)) {
1211 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1213 native.callIfPossible(args.successCallback);
1217 var result = native.call('BluetoothHealthApplicationUnregister', callArgs, callback);
1218 if (native.isFailure(result)) {
1219 throw native.getErrorObject(result);
1222 _bluetoothHealthApplicationListeners.removeListener(this._id);
1225 // class BluetoothProfileHandler ///////////////////////////
1226 var _BluetoothProfileType = {
1230 var BluetoothProfileHandler = function(data) {
1232 var profileType = data.profileType;
1233 function profileTypeGetter() {
1234 privUtils_.printDeprecationWarningFor('profileType');
1237 Object.defineProperties(this, {
1238 profileType: { enumerable: true, set: function() {}, get: profileTypeGetter }
1243 // class BluetoothHealthProfileHandler ///////////////////////////
1244 var BluetoothHealthProfileHandler = function(data) {
1245 BluetoothProfileHandler.call(this, data);
1248 BluetoothHealthProfileHandler.prototype = new BluetoothProfileHandler();
1250 BluetoothHealthProfileHandler.prototype.constructor = BluetoothProfileHandler;
1252 BluetoothHealthProfileHandler.prototype.registerSinkApplication = function() {
1253 privUtils_.log('Entered BluetoothHealthProfileHandler.registerSinkApplication()');
1254 privUtils_.printDeprecationWarningFor('BluetoothHealthProfileHandler');
1256 var args = AV.validateArgs(arguments, [
1259 type: AV.Types.LONG // there's no short type
1263 type: AV.Types.STRING
1266 name: 'successCallback',
1267 type: AV.Types.FUNCTION
1270 name: 'errorCallback',
1271 type: AV.Types.FUNCTION,
1278 dataType: args.dataType,
1282 var callback = function(result) {
1283 if (native.isFailure(result)) {
1284 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1286 args.successCallback(
1287 new BluetoothHealthApplication(native.getResultObject(result))
1292 var result = native.call(
1293 'BluetoothHealthProfileHandlerRegisterSinkApp',
1297 if (native.isFailure(result)) {
1298 throw native.getErrorObject(result);
1302 BluetoothHealthProfileHandler.prototype.connectToSource = function() {
1303 privUtils_.log('Entered BluetoothHealthProfileHandler.connectToSource()');
1304 privUtils_.printDeprecationWarningFor('BluetoothHealthProfileHandler');
1306 var args = AV.validateArgs(arguments, [
1309 type: AV.Types.PLATFORM_OBJECT,
1310 values: BluetoothDevice
1313 name: 'application',
1314 type: AV.Types.PLATFORM_OBJECT,
1315 values: BluetoothHealthApplication
1318 name: 'successCallback',
1319 type: AV.Types.FUNCTION
1322 name: 'errorCallback',
1323 type: AV.Types.FUNCTION,
1330 address: args.peer.address,
1331 appId: args.application._id
1334 var callback = function(result) {
1335 if (native.isFailure(result)) {
1336 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1338 var channel = native.getResultObject(result);
1339 channel.peer = args.peer;
1340 channel.appId = args.application._id;
1341 args.successCallback(new BluetoothHealthChannel(channel));
1345 var result = native.call(
1346 'BluetoothHealthProfileHandlerConnectToSource',
1350 if (native.isFailure(result)) {
1351 throw native.getErrorObject(result);
1355 // class BluetoothHealthChannel ///////////////////////////
1356 var BluetoothHealthChannel = function(data) {
1357 Object.defineProperties(this, {
1358 peer: { value: data.peer, writable: false, enumerable: true },
1359 channelType: { value: data.channelType, writable: false, enumerable: true },
1361 value: _bluetoothHealthApplicationListeners.apps[data.appId],
1366 value: data.isConnected,
1371 _id: { value: data._id, writable: false, enumerable: false }
1375 BluetoothHealthChannel.prototype.close = function() {
1376 privUtils_.log('Entered BluetoothHealthChannel.close()');
1377 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1379 if (this.isConnected) {
1382 address: this.peer.address
1385 var result = native.callSync('BluetoothHealthChannelClose', callArgs);
1387 if (native.isFailure(result)) {
1388 throw native.getErrorObject(result);
1391 Object.defineProperty(this, 'isConnected', { value: false });
1395 BluetoothHealthChannel.prototype.sendData = function() {
1396 privUtils_.log('Entered BluetoothHealthChannel.sendData()');
1397 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1399 var args = AV.validateArgs(arguments, [
1402 type: AV.Types.ARRAY,
1403 values: AV.Types.BYTE
1412 var result = native.callSync('BluetoothHealthChannelSendData', callArgs);
1414 if (native.isFailure(result)) {
1415 throw native.getErrorObject(result);
1417 return native.getResultObject(result);
1421 var _healthListeners = {};
1423 function _BluetoothHealthChannelChangeCallback(event) {
1425 var callback = _healthListeners[e.id];
1437 privUtils_.log('Unknown mode: ' + e.event);
1441 if (callback[e.event]) {
1442 callback[e.event](d);
1446 var BluetoothHealthChannel_setListener = function() {
1447 privUtils_.log('Entered BluetoothHealthChannel.setListener()');
1448 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1449 privUtils_.checkPrivilegeAccess4Ver(
1451 Privilege.BLUETOOTH,
1452 Privilege.BLUETOOTH_HEALTH
1454 var args = AV.validateArgs(arguments, [
1456 name: 'changeCallback',
1457 type: AV.Types.LISTENER,
1458 values: ['onmessage', 'onclose']
1462 if (T.isEmptyObject(_healthListeners)) {
1464 'BluetoothHealthChannelChangeCallback',
1465 _BluetoothHealthChannelChangeCallback
1468 _healthListeners[this._id] = args.changeCallback;
1471 BluetoothHealthChannel.prototype.setListener = function() {
1472 BluetoothHealthChannel_setListener.apply(this, arguments);
1475 var BluetoothHealthChannel_unsetListener = function() {
1476 privUtils_.log('Entered BluetoothHealthChannel.unsetListener ()');
1477 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1478 if (T.isEmptyObject(_healthListeners)) {
1479 privUtils_.checkPrivilegeAccess4Ver(
1481 Privilege.BLUETOOTH,
1482 Privilege.BLUETOOTH_HEALTH
1486 delete _healthListeners[this._id];
1488 if (T.isEmptyObject(_healthListeners)) {
1489 native.removeListener(
1490 'BluetoothHealthChannelChangeCallback',
1491 _BluetoothHealthChannelChangeCallback
1496 BluetoothHealthChannel.prototype.unsetListener = function() {
1497 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1498 BluetoothHealthChannel_unsetListener.apply(this, arguments);
1502 * Creates a manager for specified listener event.
1504 * @param {string} name - name of the listener this manager handles
1505 * @param {function} callback - function to be invoked when event specified by the name
1507 * This function should return false if the callback
1508 * doesn't want to handle the event anymore, true otherwise.
1509 * This function should have following signature:
1510 * bool callback(event, successCallback, errorCallback);
1512 * @return {object} object which allows to add or remove callbacks for specified listener
1514 function _singleListenerBuilder(name, callback) {
1515 var listenerName = name;
1516 var successCallback;
1518 var callbackFunction = callback;
1519 var listenerRegistered = false;
1521 function innerCallback(event) {
1522 if (!callbackFunction(event, successCallback, errorCallback)) {
1527 function addListener(s, e) {
1528 successCallback = s;
1531 if (!listenerRegistered) {
1532 native.addListener(listenerName, innerCallback);
1533 listenerRegistered = true;
1537 function removeListener() {
1538 if (listenerRegistered) {
1539 native.removeListener(listenerName, innerCallback);
1540 listenerRegistered = false;
1543 successCallback = undefined;
1544 errorCallback = undefined;
1548 addListener: addListener,
1549 removeListener: removeListener
1553 var _bleScanListener = _singleListenerBuilder('BluetoothLEScanCallback', function(
1561 switch (event.action) {
1563 d = new BluetoothLEDevice(event.data);
1567 if (errorCallback) {
1568 errorCallback(native.getErrorObject(event));
1573 privUtils_.log('Unknown mode: ' + event.action);
1576 if (successCallback) {
1583 var _bleAdvertiseListener = _singleListenerBuilder(
1584 'BluetoothLEAdvertiseCallback',
1585 function(event, successCallback, errorCallback) {
1589 switch (event.action) {
1591 if (successCallback) {
1592 successCallback(native.getResultObject(event));
1593 if (native.getResultObject(event) == 'STOPPED') {
1594 _bleAdvertiseListener.removeListener();
1600 if (errorCallback) {
1601 errorCallback(native.getErrorObject(event));
1606 privUtils_.log('Unknown mode: ' + event.action);
1612 //class BluetoothLEAdapter ///////////////////////////
1613 var BluetoothLEAdapter = function() {};
1615 BluetoothLEAdapter.prototype.startScan = function() {
1616 privUtils_.log('Entered BluetoothLEAdapter.startScan()');
1617 var args = AV.validateArgs(arguments, [
1619 name: 'successCallback',
1620 type: AV.Types.FUNCTION
1623 name: 'errorCallback',
1624 type: AV.Types.FUNCTION,
1630 var result = native.callSync('BluetoothLEAdapterStartScan', {});
1631 if (native.isFailure(result)) {
1632 throw native.getErrorObject(result);
1635 _bleScanListener.addListener(args.successCallback, args.errorCallback);
1638 BluetoothLEAdapter.prototype.stopScan = function() {
1639 privUtils_.log('Entered BluetoothLEAdapter.stopScan()');
1641 _bleScanListener.removeListener();
1643 var result = native.callSync('BluetoothLEAdapterStopScan', {});
1644 if (native.isFailure(result)) {
1645 throw native.getErrorObject(result);
1649 BluetoothLEAdapter.prototype.isScanning = function() {
1650 privUtils_.log('Entered BluetoothLEAdapter.isScanning()');
1652 var result = native.callSync('BluetoothLEAdapterIsScanning', {});
1653 if (native.isFailure(result)) {
1654 throw native.getErrorObject(result);
1656 return native.getResultObject(result);
1659 var _BluetoothAdvertisePacketType = {
1660 ADVERTISE: 'ADVERTISE',
1661 SCAN_RESPONSE: 'SCAN_RESPONSE'
1664 var _BluetoothAdvertisingMode = {
1665 BALANCED: 'BALANCED',
1666 LOW_LATENCY: 'LOW_LATENCY',
1667 LOW_ENERGY: 'LOW_ENERGY'
1670 BluetoothLEAdapter.prototype.startAdvertise = function() {
1671 privUtils_.log('Entered BluetoothLEAdapter.startAdvertise()');
1672 var args = AV.validateArgs(arguments, [
1674 name: 'advertiseData',
1675 type: AV.Types.PLATFORM_OBJECT,
1676 values: tizen.BluetoothLEAdvertiseData
1680 type: AV.Types.ENUM,
1681 values: T.getValues(_BluetoothAdvertisePacketType)
1684 name: 'successCallback',
1685 type: AV.Types.FUNCTION
1688 name: 'errorCallback',
1689 type: AV.Types.FUNCTION,
1695 type: AV.Types.ENUM,
1696 values: T.getValues(_BluetoothAdvertisingMode),
1701 name: 'connectable',
1702 type: AV.Types.BOOLEAN,
1709 advertiseData: args.advertiseData,
1710 packetType: args.packetType,
1711 mode: T.isNullOrUndefined(args.mode)
1712 ? _BluetoothAdvertisingMode.BALANCED
1714 connectable: T.isNullOrUndefined(args.connectable) ? true : args.connectable
1717 var result = native.callSync('BluetoothLEAdapterStartAdvertise', callArgs);
1719 if (native.isFailure(result)) {
1720 throw native.getErrorObject(result);
1723 _bleAdvertiseListener.addListener(args.successCallback, args.errorCallback);
1726 BluetoothLEAdapter.prototype.stopAdvertise = function() {
1727 privUtils_.log('Entered BluetoothLEAdapter.stopAdvertise()');
1729 var result = native.callSync('BluetoothLEAdapterStopAdvertise', {});
1731 if (native.isFailure(result)) {
1732 throw native.getErrorObject(result);
1736 BluetoothLEAdapter.prototype.addConnectStateChangeListener = function() {
1737 privUtils_.log('Entered BluetoothLEAdapter.addClientConnectStateChaneListener()');
1738 var args = AV.validateArgs(arguments, [
1741 type: AV.Types.LISTENER,
1742 values: ['onconnected', 'ondisconnected']
1746 var func = function(event) {
1747 if (args.listener[event.action]) {
1748 args.listener[event.action](new BluetoothLEDevice(event.address));
1752 return _bleConnectChangeListener.addListener(func);
1755 BluetoothLEAdapter.prototype.removeConnectStateChangeListener = function() {
1756 privUtils_.log('Entered BluetoothLEAdapter.removeConnectStateChangeListener()');
1758 var args = AV.validateArgs(arguments, [
1765 _bleConnectChangeListener.removeListener(args.watchID);
1768 //class BluetoothGATTService ///////////////////////////
1769 var BluetoothGATTService = function(data, address) {
1770 var handle_ = data.handle;
1771 var uuid_ = data.uuid;
1772 var serviceUuid_ = data.serviceUuid;
1773 //address_ is needed to control if device is still connected
1774 var address_ = address || data.address;
1776 function servicesGetter() {
1778 var result = native.callSync('BluetoothGATTClientServiceGetServices', {
1782 if (native.isSuccess(result)) {
1783 var resultObject = native.getResultObject(result);
1784 resultObject.forEach(function(s) {
1785 services.push(new BluetoothGATTService(s, address_));
1790 function characteristicsGetter() {
1791 var characteristics = [];
1792 var result = native.callSync('BluetoothGATTClientServiceGetCharacteristics', {
1797 if (native.isSuccess(result)) {
1798 var resultObject = native.getResultObject(result);
1799 resultObject.forEach(function(c) {
1800 if (!T.isNullOrUndefined(c)) {
1801 characteristics.push(new BluetoothGATTCharacteristic(c, address_));
1805 return characteristics;
1809 * If this function is called as a constructor of BluetoothGATTServerService's
1810 * base class, some properties have to be left configurable, to enable redefinition.
1811 * Otherwise, if this function is called to create BluetoothGATTService,
1812 * they are left non-configurable.
1814 * If BluetoothGATTService will be a base for any other class in the future,
1815 * the line below may have to be updated to take into account the new class.
1817 var isConfigurable = this instanceof BluetoothGATTServerService;
1819 Object.defineProperties(this, {
1820 uuid: { value: uuid_, writable: false, enumerable: true },
1821 serviceUuid: { value: serviceUuid_, writable: false, enumerable: true },
1824 configurable: isConfigurable,
1830 configurable: isConfigurable,
1832 get: characteristicsGetter
1837 var CurrentGATTServerEntityId = 0;
1838 function NextGattServerEntityID() {
1839 return ++CurrentGATTServerEntityId;
1842 function IsUuidValid(uuid) {
1844 BluetoothManager_UUIDIsValid16Bit(uuid) ||
1845 BluetoothManager_UUIDIsValid32Bit(uuid) ||
1846 BluetoothManager_UUIDIsValid128Bit(uuid)
1850 var ValidateBluetoothGATTServerServiceInit = function(initData) {
1851 initData = AV.validateArgs(
1853 initData['serviceUuid'],
1854 initData['isPrimary'] || true,
1855 initData['includedServices'] || [],
1856 initData['characteristics'] || []
1860 name: 'serviceUuid',
1861 type: AV.Types.STRING,
1862 validator: IsUuidValid
1866 type: AV.Types.BOOLEAN
1869 name: 'includedServices',
1870 type: AV.Types.ARRAY
1873 name: 'characteristics',
1874 type: AV.Types.ARRAY
1879 // "uuid" field is used to construct BluetoothGATTService, but it's not a part
1880 // of BluetoothGATTServerServiceInit dictionary.
1881 // In case of BluetoothGATTServerServices, its value is always the same as
1883 initData.uuid = initData.serviceUuid;
1887 //class BluetoothGATTServerService ///////////////////////////
1888 var BluetoothGATTServerService = function(data) {
1889 data = ValidateBluetoothGATTServerServiceInit(data);
1891 BluetoothGATTService.call(this, data, null);
1893 var services_ = data.includedServices.map(function(serviceData) {
1894 return new BluetoothGATTServerService(serviceData, null);
1896 var characteristics_ = data.characteristics.map(function(characteristicData) {
1897 return new BluetoothGATTServerCharacteristic(characteristicData, null);
1900 Object.defineProperties(this, {
1901 isPrimary: { value: data.isPrimary, writable: false, enumerable: true },
1905 return services_.slice();
1912 return characteristics_.slice();
1916 // This property is "private" and meant not to be used by users
1918 // It has to be enumerable, to be serialized with JSON.stringify()
1920 value: NextGattServerEntityID()
1925 BluetoothGATTServerService.prototype = Object.create(BluetoothGATTService.prototype);
1927 Object.defineProperty(BluetoothGATTServerService.prototype, 'constructor', {
1928 value: BluetoothGATTServerService,
1933 function _getIncludedServicesAndItsComponentsIdsRecursively(service) {
1936 for (var serviceIndex = 0; serviceIndex < service.services.length; ++serviceIndex) {
1937 ids.push(service.services[serviceIndex]._id);
1939 _getIncludedServicesAndItsComponentsIdsRecursively(
1940 service.services[serviceIndex]
1946 var characteristicIndex = 0;
1947 characteristicIndex < service.characteristics.length;
1948 ++characteristicIndex
1950 ids.push(service.characteristics[characteristicIndex]._id);
1953 var descriptorIndex = 0;
1955 service.characteristics[characteristicIndex].descriptors.length;
1959 service.characteristics[characteristicIndex].descriptors[descriptorIndex]
1968 var BluetoothGATTServer_valid_unregisterService_errors = [
1969 'InvalidStateError',
1972 var BluetoothGATTServer_valid_unregisterService_exceptions = [
1973 'TypeMismatchError',
1977 BluetoothGATTServerService.prototype.unregister = function() {
1978 var args = AV.validateArgs(arguments, [
1980 name: 'successCallback',
1981 type: AV.Types.FUNCTION,
1986 name: 'errorCallback',
1987 type: AV.Types.FUNCTION,
1993 var serviceIndex = _BluetoothGATTServerServices.findIndex(
1995 return service._id === this._id;
1999 if (serviceIndex === -1) {
2000 throw new WebAPIException(
2002 'The service is not registered in the local GATT server'
2006 function removeFromJSArrayAndCallSuccessCb() {
2007 _BluetoothGATTServerServices.splice(serviceIndex, 1);
2008 native.callIfPossible(args.successCallback);
2011 if (!_BluetoothGATTServerServicesRegisteredInNativeLayer[this._id]) {
2012 removeFromJSArrayAndCallSuccessCb();
2016 var callback = function(result) {
2017 if (native.isFailure(result)) {
2018 native.callIfPossible(
2020 native.getErrorObjectAndValidate(
2022 BluetoothGATTServer_valid_unregisterService_errors,
2027 delete _BluetoothGATTServerServicesRegisteredInNativeLayer[this._id];
2028 removeFromJSArrayAndCallSuccessCb();
2034 idsToRemoveFromNativeLayer: _getIncludedServicesAndItsComponentsIdsRecursively(
2038 var result = native.call('BluetoothGATTServerUnregisterService', callArgs, callback);
2040 if (native.isFailure(result)) {
2041 throw native.getErrorObjectAndValidate(
2043 BluetoothGATTServer_valid_unregisterService_errors,
2049 var numberArrayToByteArray = function(array) {
2052 array.forEach(function(b) {
2053 d.push(Converter.toOctet(b));
2058 //class BluetoothGATTCharacteristic ///////////////////////////
2059 var BluetoothGATTCharacteristic = function(data, address) {
2060 if (!T.isObject(data)) {
2063 var address_ = address;
2064 var handle_ = data.handle;
2065 var descriptors_ = data.descriptors.map(function(descriptor_data) {
2066 return new BluetoothGATTDescriptor(descriptor_data, address_);
2068 var isBroadcast_ = data.isBroadcast;
2069 var hasExtendedProperties_ = data.hasExtendedProperties;
2070 var isNotify_ = data.isNotify;
2071 var isIndication_ = data.isIndication;
2072 var isReadable_ = data.isReadable;
2073 var isSignedWrite_ = data.isSignedWrite;
2074 var isWritable_ = data.isWritable;
2075 var isWriteNoResponse_ = data.isWriteNoResponse;
2076 var uuid_ = data.uuid;
2079 * If this function is called as a constructor of BluetoothGATTServerCharacteristic's
2080 * base class, some properties have to be left configurable, to enable redefinition.
2081 * Otherwise, if this function is called to create BluetoothGATTCharacteristic,
2082 * they are left non-configurable.
2084 * If BluetoothGATTCharacteristic will be a base for any other class in the future,
2085 * the line below may have to be updated to take into account the new class.
2087 var isConfigurable = this instanceof BluetoothGATTServerCharacteristic;
2089 Object.defineProperties(this, {
2092 configurable: isConfigurable,
2094 return descriptors_.slice();
2101 return isBroadcast_;
2105 hasExtendedProperties: {
2108 return hasExtendedProperties_;
2122 return isIndication_;
2136 return isSignedWrite_;
2147 isWriteNoResponse: {
2150 return isWriteNoResponse_;
2163 this.readValue = function() {
2164 privUtils_.log('Entered BluetoothGATTCharacteristic.readValue()');
2165 var args = AV.validateArgs(arguments, [
2167 name: 'successCallback',
2168 type: AV.Types.FUNCTION
2171 name: 'errorCallback',
2172 type: AV.Types.FUNCTION,
2178 var callback = function(result) {
2179 if (native.isFailure(result)) {
2180 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2182 var d = numberArrayToByteArray(native.getResultObject(result));
2183 args.successCallback(d);
2187 var callArgs = { handle: handle_, address: address_ };
2189 var result = native.call(
2190 'BluetoothGATTClientServiceReadValue',
2195 if (native.isFailure(result)) {
2196 throw native.getErrorObject(result);
2200 this.writeValue = function(value, successCallback, errorCallback) {
2201 privUtils_.log('Entered BluetoothGATTCharacteristic.writeValue()');
2202 var args = AV.validateArgs(Array.prototype.slice.call(arguments, 1), [
2204 name: 'successCallback',
2205 type: AV.Types.FUNCTION,
2210 name: 'errorCallback',
2211 type: AV.Types.FUNCTION,
2217 var callback = function(result) {
2218 if (native.isFailure(result)) {
2219 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2221 native.callIfPossible(args.successCallback);
2227 value: BluetoothManager_toByteArray(value),
2231 var result = native.call(
2232 'BluetoothGATTClientServiceWriteValue',
2237 if (native.isFailure(result)) {
2238 throw native.getErrorObject(result);
2242 var addValueChangeListener = function() {
2243 privUtils_.log('Entered BluetoothGATTCharacteristic.addValueChangeListener()');
2244 privUtils_.checkPrivilegeAccess4Ver(
2246 Privilege.BLUETOOTH,
2247 Privilege.BLUETOOTH_ADMIN
2249 var args = AV.validateArgs(arguments, [
2252 type: AV.Types.FUNCTION
2256 var callArgs = { handle: handle_, address: address_ };
2258 var callback = function(event) {
2259 if (event.handle === handle_) {
2260 args.callback(numberArrayToByteArray(native.getResultObject(event)));
2264 return _bluetoothGATTCharacteristicListener.addListener(callback, callArgs);
2267 this.addValueChangeListener = function() {
2268 return addValueChangeListener.apply(this, arguments);
2271 this.removeValueChangeListener = function() {
2272 privUtils_.log('Entered BluetoothGATTCharacteristic.removeValueChangeListener()');
2274 var args = AV.validateArgs(arguments, [
2281 var callArgs = { handle: handle_, address: address_ };
2283 return _bluetoothGATTCharacteristicListener.removeListener(
2290 var ValidateBluetoothGATTServerCharacteristicInit = function(initData) {
2291 return AV.validateArgs(
2294 initData['descriptors'] || [],
2295 initData['isBroadcast'] || false,
2296 initData['hasExtendedProperties'] || false,
2297 initData['isNotify'] || false,
2298 initData['isIndication'] || false,
2299 initData['isReadable'] || false,
2300 initData['isSignedWrite'] || false,
2301 initData['isWritable'] || false,
2302 initData['isWriteNoResponse'] || false,
2303 initData['readPermission'] || false,
2304 initData['writePermission'] || false,
2305 initData['encryptedReadPermission'] || false,
2306 initData['encryptedWritePermission'] || false,
2307 initData['encryptedSignedReadPermission'] || false,
2308 initData['encryptedSignedWritePermission'] || false,
2309 initData['readValueRequestCallback'] || null,
2310 initData['writeValueRequestCallback'] || null
2315 type: AV.Types.STRING,
2316 validator: IsUuidValid
2319 name: 'descriptors',
2320 type: AV.Types.ARRAY
2323 name: 'isBroadcast',
2324 type: AV.Types.BOOLEAN
2327 name: 'hasExtendedProperties',
2328 type: AV.Types.BOOLEAN
2332 type: AV.Types.BOOLEAN
2335 name: 'isIndication',
2336 type: AV.Types.BOOLEAN
2340 type: AV.Types.BOOLEAN
2343 name: 'isSignedWrite',
2344 type: AV.Types.BOOLEAN
2348 type: AV.Types.BOOLEAN
2351 name: 'isWriteNoResponse',
2352 type: AV.Types.BOOLEAN
2355 name: 'readPermission',
2356 type: AV.Types.BOOLEAN
2359 name: 'writePermission',
2360 type: AV.Types.BOOLEAN
2363 name: 'encryptedReadPermission',
2364 type: AV.Types.BOOLEAN
2367 name: 'encryptedWritePermission',
2368 type: AV.Types.BOOLEAN
2371 name: 'encryptedSignedReadPermission',
2372 type: AV.Types.BOOLEAN
2375 name: 'encryptedSignedWritePermission',
2376 type: AV.Types.BOOLEAN
2379 name: 'readValueRequestCallback',
2380 type: AV.Types.FUNCTION,
2384 name: 'writeValueRequestCallback',
2385 type: AV.Types.FUNCTION,
2392 //class BluetoothGATTServerCharacteristic ///////////////////////////
2393 var BluetoothGATTServerCharacteristic = function(data) {
2394 data = ValidateBluetoothGATTServerCharacteristicInit(data);
2396 BluetoothGATTCharacteristic.call(this, data, null);
2398 var descriptors_ = data.descriptors.map(function(descriptor_data) {
2399 return new BluetoothGATTServerDescriptor(descriptor_data, null);
2402 Object.defineProperties(this, {
2406 return descriptors_.slice();
2413 return data.readPermission;
2420 return data.writePermission;
2424 encryptedReadPermission: {
2427 return data.encryptedReadPermission;
2431 encryptedWritePermission: {
2434 return data.encryptedWritePermission;
2438 encryptedSignedReadPermission: {
2441 return data.encryptedSignedReadPermission;
2445 encryptedSignedWritePermission: {
2448 return data.encryptedSignedWritePermission;
2452 // This property is "private" and meant not to be used by users
2454 // It has to be enumerable, to be serialized with JSON.stringify()
2456 value: NextGattServerEntityID()
2460 this.readValue = function() {
2461 throw new WebAPIException(
2462 'NotSupportedError',
2463 'This method cannot be called on BluetoothGATTServerCharacteristic'
2467 this.writeValue = function() {
2468 throw new WebAPIException(
2469 'NotSupportedError',
2470 'This method cannot be called on BluetoothGATTServerCharacteristic'
2474 this.addValueChangeListener = function() {
2475 throw new WebAPIException(
2476 'NotSupportedError',
2477 'This method cannot be called on BluetoothGATTServerCharacteristic'
2481 this.removeValueChangeListener = function() {
2482 /* Intended no operation */
2486 BluetoothGATTServerCharacteristic.prototype = Object.create(
2487 BluetoothGATTCharacteristic.prototype
2490 Object.defineProperty(BluetoothGATTServerCharacteristic.prototype, 'constructor', {
2491 value: BluetoothGATTServerCharacteristic,
2496 tizen.GATTRequestReply = function(statusCode, data) {
2497 AV.isConstructorCall(this, tizen.GATTRequestReply);
2499 var statusCode_ = Converter.toLong(statusCode);
2500 var data_ = T.isNullOrUndefined(data) ? null : BluetoothManager_toByteArray(data);
2502 Object.defineProperties(this, {
2509 statusCode_ = Converter.toLong(v);
2518 data_ = T.isNullOrUndefined(v) ? null : numberArrayToByteArray(v);
2524 function _createReadValueRequestCallback(
2526 sendResponseSuccessCallback,
2527 sendResponseErrorCallback
2529 return _singleListenerBuilder(
2530 'ReadValueRequestCallback_' + _id,
2532 * _singleListenerBuilder requires 2 callbacks, the second of which
2533 * is an error callback.
2534 * Read value request events coming from the native layer
2536 * Hence, we don't use the second callback here.
2538 function(event, readValueRequestCallback, unusedErrorCallback) {
2539 var clientAddress = event.clientAddress;
2540 var offset = event.offset;
2542 if (readValueRequestCallback) {
2543 var requestReply = readValueRequestCallback(clientAddress, offset);
2546 requestId: event.requestId,
2547 requestType: event.requestType,
2549 statusCode: requestReply.statusCode,
2550 data: requestReply.data
2552 var callback = function(result) {
2553 if (native.isFailure(result)) {
2554 native.callIfPossible(
2555 sendResponseErrorCallback,
2556 native.getErrorObject(result)
2559 native.callIfPossible(sendResponseSuccessCallback);
2562 var result = native.call(
2563 'BluetoothGATTServerSendResponse',
2573 function _createWriteValueRequestCallback(
2575 sendResponseSuccessCallback,
2576 sendResponseErrorCallback
2578 return _singleListenerBuilder(
2579 'WriteValueRequestCallback_' + _id,
2581 * _singleListenerBuilder requires 2 callbacks, the second of which
2582 * is an error callback.
2583 * Write value request events coming from the native layer
2585 * Hence, we don't use the second callback here.
2587 function(event, writeValueRequestCallback, unusedErrorCallback) {
2588 var clientAddress = event.clientAddress;
2589 var value = event.value;
2590 var offset = event.offset;
2591 var replyRequired = event.replyRequired;
2593 if (writeValueRequestCallback) {
2594 var requestReply = writeValueRequestCallback(
2596 BluetoothManager_toByteArray(value),
2602 requestId: event.requestId,
2603 requestType: event.requestType,
2604 value: null, // Responses to write requests don't contain value
2606 statusCode: requestReply.statusCode,
2607 data: requestReply.data
2609 var callback = function(result) {
2610 if (native.isFailure(result)) {
2611 native.callIfPossible(
2612 sendResponseErrorCallback,
2613 native.getErrorObject(result)
2616 native.callIfPossible(sendResponseSuccessCallback);
2619 var result = native.call(
2620 'BluetoothGATTServerSendResponse',
2630 var _BluetoothGATTServerReadWriteValueRequestCallbacks = {};
2632 var _setReadValueRequestCallbackCommon = function() {
2633 var args = AV.validateArgs(arguments, [
2635 name: 'readValueRequestCallback',
2636 type: AV.Types.FUNCTION
2639 name: 'successCallback',
2640 type: AV.Types.FUNCTION,
2645 name: 'errorCallback',
2646 type: AV.Types.FUNCTION,
2651 name: 'sendResponseSuccessCallback',
2652 type: AV.Types.FUNCTION,
2657 name: 'sendResponseErrorCallback',
2658 type: AV.Types.FUNCTION,
2664 var entityId = this._id;
2666 var callback = function(result) {
2667 if (native.isFailure(result)) {
2668 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2670 var readValueRequestCallback = _createReadValueRequestCallback(
2672 args.sendResponseSuccessCallback,
2673 args.sendResponseErrorCallback
2675 readValueRequestCallback.addListener(
2676 args.readValueRequestCallback,
2677 function unusedErrorCallback() {
2678 /* Intentionally no operation */
2681 _BluetoothGATTServerReadWriteValueRequestCallbacks[
2682 "ReadValueCallback" + entityId
2683 ] = readValueRequestCallback;
2684 native.callIfPossible(args.successCallback, native.getErrorObject(result));
2688 var callArgs = { _id: this._id };
2689 var result = native.call(
2690 'BluetoothGATTServerSetReadValueRequestCallback',
2695 if (native.isFailure(result)) {
2696 throw native.getErrorObject(result);
2700 var _setWriteValueRequestCallbackCommon = function() {
2701 var args = AV.validateArgs(arguments, [
2703 name: 'writeValueRequestCallback',
2704 type: AV.Types.FUNCTION
2707 name: 'successCallback',
2708 type: AV.Types.FUNCTION,
2713 name: 'errorCallback',
2714 type: AV.Types.FUNCTION,
2719 name: 'sendResponseSuccessCallback',
2720 type: AV.Types.FUNCTION,
2725 name: 'sendResponseErrorCallback',
2726 type: AV.Types.FUNCTION,
2732 var entityId = this._id;
2734 var callback = function(result) {
2735 if (native.isFailure(result)) {
2736 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2738 var writeValueRequestCallback = _createWriteValueRequestCallback(
2740 args.sendResponseSuccessCallback,
2741 args.sendResponseErrorCallback
2743 writeValueRequestCallback.addListener(
2744 args.writeValueRequestCallback,
2745 function unusedErrorCallback() {
2746 /* Intentionally no operation */
2749 _BluetoothGATTServerReadWriteValueRequestCallbacks[
2750 'WriteValueCallback' + entityId
2751 ] = writeValueRequestCallback;
2752 native.callIfPossible(args.successCallback, native.getErrorObject(result));
2756 var callArgs = { _id: this._id };
2757 var result = native.call(
2758 'BluetoothGATTServerSetWriteValueRequestCallback',
2763 if (native.isFailure(result)) {
2764 throw native.getErrorObject(result);
2768 BluetoothGATTServerCharacteristic.prototype.setReadValueRequestCallback = _setReadValueRequestCallbackCommon;
2769 BluetoothGATTServerCharacteristic.prototype.setWriteValueRequestCallback = _setWriteValueRequestCallbackCommon;
2772 * Creates a manager for specified listener event. Manager handles multiple
2773 * registered listeners
2775 * @param {string} name - name of the listener this manager handles
2776 * @param {function} callback - function to be invoked when event specified by the name
2778 * This function should have following signature:
2779 * void callback(listener, event);
2780 * @param {string} addListenerId - optional parameter. If specified, this native
2781 * method will be called synchronously when
2782 * listener is added.
2783 * @param {string} removeListenerId - optional parameter. If specified, this native
2784 * method will be called synchronously when
2785 * listener is removed.
2786 * @param {bool} repeatNativeCall - optional parameter. If specified, the addListenerId
2787 * and removeListenerId methods will be called
2788 * synchronously each time listener is added/removed.
2789 * Otherwise they are going to be called just once: when
2790 * first listener is added and last listener is removed.
2792 * @return {object} object which allows to add or remove callbacks for specified listener
2794 function _multipleListenerBuilder(
2801 var listenerName = name;
2802 var addId = addListenerId;
2803 var removeId = removeListenerId;
2804 var callbackFunction = callback;
2807 var jsListenerRegistered = false;
2808 var nativeListenerRegistered = false;
2809 var repeatNativeListenerCall = repeatNativeCall;
2811 function innerCallback(event) {
2812 for (var watchId in listeners) {
2813 if (listeners.hasOwnProperty(watchId)) {
2814 callbackFunction(listeners[watchId], event);
2819 function addListener(callback, args) {
2822 if (addId && (!nativeListenerRegistered || repeatNativeListenerCall)) {
2823 var result = native.callSync(addId, args || {});
2824 if (native.isFailure(result)) {
2825 throw native.getErrorObject(result);
2827 nativeListenerRegistered = true;
2830 if (!jsListenerRegistered) {
2831 native.addListener(listenerName, innerCallback);
2832 jsListenerRegistered = true;
2835 listeners[id] = callback;
2839 function removeListener(watchId, args) {
2840 if (listeners.hasOwnProperty(watchId)) {
2841 delete listeners[watchId];
2846 ((nativeListenerRegistered && T.isEmptyObject(listeners)) ||
2847 repeatNativeListenerCall)
2849 var result = native.callSync(removeId, args || {});
2850 if (native.isFailure(result)) {
2851 throw native.getErrorObject(result);
2853 nativeListenerRegistered = false;
2856 if (jsListenerRegistered && T.isEmptyObject(listeners)) {
2857 native.removeListener(listenerName, innerCallback);
2858 jsListenerRegistered = false;
2863 addListener: addListener,
2864 removeListener: removeListener
2868 var _bluetoothGATTCharacteristicListener = _multipleListenerBuilder(
2869 'BluetoothGATTCharacteristicValueChangeListener',
2870 function(listener, event) {
2873 'BluetoothGATTClientServiceAddValueChangeListener',
2874 'BluetoothGATTClientServiceRemoveValueChangeListener',
2879 * This object is used by:
2880 * - BluetoothLEDevice.addConnectStateChangeListener()
2881 * - BluetoothLEAdapter.addConnectStateChangeListener()
2883 var _bleConnectChangeListener = _multipleListenerBuilder(
2884 'BluetoothLEConnectChangeCallback',
2885 function(listener, event) {
2888 'BluetoothLEDeviceAddConnectStateChangeListener',
2889 'BluetoothLEDeviceRemoveConnectStateChangeListener'
2892 var _bleAttMtuChangeListener = _multipleListenerBuilder(
2893 'BluetoothLEAttMtuChangeCallback',
2894 function(listener, event) {
2897 'BluetoothLEDeviceAddAttMtuChangeListener',
2898 'BluetoothLEDeviceRemoveAttMtuChangeListener'
2901 //class BluetoothGATTDescriptor ///////////////////////////
2902 var BluetoothGATTDescriptor = function(data, address) {
2903 var handle_ = data.handle;
2904 //address_ is needed to control if device is still connected
2905 var address_ = address;
2906 var uuid_ = data.uuid;
2908 this.readValue = function() {
2909 privUtils_.log('Entered BluetoothGATTDescriptor.readValue()');
2910 var args = AV.validateArgs(arguments, [
2912 name: 'successCallback',
2913 type: AV.Types.FUNCTION
2916 name: 'errorCallback',
2917 type: AV.Types.FUNCTION,
2923 var callback = function(result) {
2924 if (native.isFailure(result)) {
2925 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2927 var d = numberArrayToByteArray(native.getResultObject(result));
2928 args.successCallback(d);
2932 var callArgs = { handle: handle_, address: address_ };
2934 var result = native.call(
2935 'BluetoothGATTClientServiceReadValue',
2940 if (native.isFailure(result)) {
2941 throw native.getErrorObject(result);
2945 this.writeValue = function(value, successCallback, errorCallback) {
2946 privUtils_.log('Entered BluetoothGATTDescriptor.writeValue()');
2947 var args = AV.validateArgs(Array.prototype.slice.call(arguments, 1), [
2949 name: 'successCallback',
2950 type: AV.Types.FUNCTION,
2955 name: 'errorCallback',
2956 type: AV.Types.FUNCTION,
2962 var callback = function(result) {
2963 if (native.isFailure(result)) {
2964 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2966 native.callIfPossible(args.successCallback);
2972 value: BluetoothManager_toByteArray(value),
2976 var result = native.call(
2977 'BluetoothGATTClientServiceWriteValue',
2982 if (native.isFailure(result)) {
2983 throw native.getErrorObject(result);
2987 Object.defineProperties(this, {
2998 var ValidateBluetoothGATTServerDescriptorInit = function(initData) {
2999 return AV.validateArgs(
3002 initData['readPermission'] || false,
3003 initData['writePermission'] || false,
3004 initData['encryptedReadPermission'] || false,
3005 initData['encryptedWritePermission'] || false,
3006 initData['encryptedSignedReadPermission'] || false,
3007 initData['encryptedSignedWritePermission'] || false,
3008 initData['readValueRequestCallback'] || null,
3009 initData['writeValueRequestCallback'] || null
3014 type: AV.Types.STRING,
3015 validator: IsUuidValid
3018 name: 'readPermission',
3019 type: AV.Types.BOOLEAN
3022 name: 'writePermission',
3023 type: AV.Types.BOOLEAN
3026 name: 'encryptedReadPermission',
3027 type: AV.Types.BOOLEAN
3030 name: 'encryptedWritePermission',
3031 type: AV.Types.BOOLEAN
3034 name: 'encryptedSignedReadPermission',
3035 type: AV.Types.BOOLEAN
3038 name: 'encryptedSignedWritePermission',
3039 type: AV.Types.BOOLEAN
3042 name: 'readValueRequestCallback',
3043 type: AV.Types.FUNCTION,
3047 name: 'writeValueRequestCallback',
3048 type: AV.Types.FUNCTION,
3055 var BluetoothGATTServerDescriptor = function(data, address) {
3056 data = ValidateBluetoothGATTServerDescriptorInit(data);
3058 BluetoothGATTDescriptor.call(this, data, null);
3060 Object.defineProperties(this, {
3064 return data.readPermission;
3071 return data.writePermission;
3075 encryptedReadPermission: {
3078 return data.encryptedReadPermission;
3082 encryptedWritePermission: {
3085 return data.encryptedWritePermission;
3089 encryptedSignedReadPermission: {
3092 return data.encryptedSignedReadPermission;
3096 encryptedSignedWritePermission: {
3099 return data.encryptedSignedWritePermission;
3103 // This property is "private" and meant not to be used by users
3105 // It has to be enumerable, to be serialized with JSON.stringify()
3107 value: NextGattServerEntityID()
3111 this.readValue = function() {
3112 throw new WebAPIException(
3113 'NotSupportedError',
3114 'This method cannot be called on BluetoothGATTServerDescriptor'
3118 this.writeValue = function() {
3119 throw new WebAPIException(
3120 'NotSupportedError',
3121 'This method cannot be called on BluetoothGATTServerDescriptor'
3126 BluetoothGATTServerDescriptor.prototype = Object.create(
3127 BluetoothGATTDescriptor.prototype
3130 Object.defineProperty(BluetoothGATTServerDescriptor.prototype, 'constructor', {
3131 value: BluetoothGATTServerDescriptor,
3136 BluetoothGATTServerDescriptor.prototype.setReadValueRequestCallback = _setReadValueRequestCallbackCommon;
3137 BluetoothGATTServerDescriptor.prototype.setWriteValueRequestCallback = _setWriteValueRequestCallbackCommon;
3139 // class BluetoothAdapter ///////////////////////////
3140 var BluetoothAdapter = function() {
3141 function nameGetter() {
3142 var result = native.callSync('BluetoothAdapterGetName', {});
3144 if (native.isFailure(result)) {
3147 return native.getResultObject(result);
3151 function addressGetter() {
3152 var result = native.callSync('BluetoothAdapterGetAddress', {});
3154 if (native.isFailure(result)) {
3157 return native.getResultObject(result);
3161 function poweredGetter() {
3162 var result = native.callSync('BluetoothAdapterGetPowered', {});
3164 if (native.isFailure(result)) {
3167 return native.getResultObject(result);
3171 function visibleGetter() {
3172 var result = native.callSync('BluetoothAdapterGetVisible', {});
3174 if (native.isFailure(result)) {
3177 return native.getResultObject(result);
3181 Object.defineProperties(this, {
3205 BluetoothAdapter.prototype.setName = function() {
3206 privUtils_.log('Entered BluetoothAdapter.setName()');
3207 var args = AV.validateArgs(arguments, [
3210 type: AV.Types.STRING
3213 name: 'successCallback',
3214 type: AV.Types.FUNCTION,
3219 name: 'errorCallback',
3220 type: AV.Types.FUNCTION,
3230 var callback = function(result) {
3231 if (native.isFailure(result)) {
3232 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3234 native.callIfPossible(args.successCallback);
3238 var result = native.call('BluetoothAdapterSetName', callArgs, callback);
3239 if (native.isFailure(result)) {
3240 throw native.getErrorObject(result);
3244 BluetoothAdapter.prototype.setPowered = function() {
3245 privUtils_.log('Entered BluetoothAdapter.setPowered()');
3246 privUtils_.printDeprecationWarningFor('setPowered()');
3248 'Let the user turn on/off Bluetooth through the Settings application instead.'
3251 var args = AV.validateArgs(arguments, [
3254 type: AV.Types.BOOLEAN
3257 name: 'successCallback',
3258 type: AV.Types.FUNCTION,
3263 name: 'errorCallback',
3264 type: AV.Types.FUNCTION,
3271 powered: args.powered
3274 var callback = function(result) {
3275 if (native.isFailure(result)) {
3276 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3278 native.callIfPossible(args.successCallback);
3282 var result = native.call('BluetoothAdapterSetPowered', callArgs, callback);
3283 if (native.isFailure(result)) {
3284 throw native.getErrorObject(result);
3288 // This method is deprecated since Tizen 2.3.
3289 BluetoothAdapter.prototype.setVisible = function() {
3290 privUtils_.log('Entered BluetoothAdapter.setVisible()');
3291 privUtils_.printDeprecationWarningFor('setVisible()');
3293 'Let the user change the Bluetooth visibility through the Settings ' +
3294 'application instead.'
3297 var args = AV.validateArgs(arguments, [
3300 type: AV.Types.BOOLEAN
3303 name: 'successCallback',
3304 type: AV.Types.FUNCTION,
3309 name: 'errorCallback',
3310 type: AV.Types.FUNCTION,
3316 type: AV.Types.UNSIGNED_LONG,
3323 visible: args.visible
3326 if (args.visible === true) {
3327 if (T.isNullOrUndefined(args.timeout)) {
3328 callArgs.timeout = 0;
3330 callArgs.timeout = args.timeout > 65535 ? 180 : args.timeout;
3334 var callback = function(result) {
3335 if (native.isFailure(result)) {
3336 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3338 native.callIfPossible(args.successCallback);
3342 var result = native.call('BluetoothAdapterSetVisible', callArgs, callback);
3343 if (native.isFailure(result)) {
3344 throw native.getErrorObject(result);
3350 function _BluetoothAdapterChangeCallback(event) {
3351 privUtils_.log('_BluetoothAdapterChangeCallback');
3357 case 'onstatechanged':
3361 case 'onnamechanged':
3365 case 'onvisibilitychanged':
3370 privUtils_.log('Unknown mode: ' + e.action);
3374 if (_listener[e.action]) {
3375 _listener[e.action](d);
3379 BluetoothAdapter.prototype.setChangeListener = function() {
3380 privUtils_.log('Entered BluetoothAdapter.setChangeListener()');
3381 var args = AV.validateArgs(arguments, [
3383 name: 'changeCallback',
3384 type: AV.Types.LISTENER,
3385 values: ['onstatechanged', 'onnamechanged', 'onvisibilitychanged']
3389 if (T.isNullOrUndefined(_listener)) {
3391 'BluetoothAdapterChangeCallback',
3392 _BluetoothAdapterChangeCallback
3394 native.callSync('BluetoothAdapterSetChangeListener', {});
3396 _listener = args.changeCallback;
3399 BluetoothAdapter.prototype.unsetChangeListener = function() {
3400 privUtils_.log('Entered BluetoothAdapter.unsetChangeListener()');
3401 if (!T.isNullOrUndefined(_listener)) {
3402 native.removeListener(
3403 'BluetoothAdapterChangeCallback',
3404 _BluetoothAdapterChangeCallback
3406 native.callSync('BluetoothAdapterUnsetChangeListener', {});
3407 _listener = undefined;
3411 var _discoverDevicesSuccessCallback;
3412 var _discoverDevicesErrorCallback;
3414 function _BluetoothDiscoverDevicesSuccessCallback(event) {
3422 case 'ondevicefound':
3423 d = new BluetoothDevice(e.data);
3426 case 'ondevicedisappeared':
3431 var result = e.data;
3433 result.forEach(function(data) {
3434 d.push(new BluetoothDevice(data));
3437 //remove listeners after discovering
3438 native.removeListener(
3439 'BluetoothDiscoverDevicesSuccessCallback',
3440 _BluetoothDiscoverDevicesSuccessCallback
3442 native.removeListener(
3443 'BluetoothDiscoverDevicesErrorCallback',
3444 _BluetoothDiscoverDevicesErrorCallback
3449 privUtils_.log('Unknown mode: ' + e.action);
3453 if (_discoverDevicesSuccessCallback[e.action]) {
3454 _discoverDevicesSuccessCallback[e.action](d);
3458 function _BluetoothDiscoverDevicesErrorCallback(event) {
3460 setTimeout(function() {
3461 native.callIfPossible(_discoverDevicesErrorCallback, native.getErrorObject(e));
3465 BluetoothAdapter.prototype.discoverDevices = function() {
3466 privUtils_.log('Entered BluetoothAdapter.discoverDevices()');
3467 var args = AV.validateArgs(arguments, [
3469 name: 'successCallback',
3470 type: AV.Types.LISTENER,
3471 values: ['onstarted', 'ondevicefound', 'ondevicedisappeared', 'onfinished']
3474 name: 'errorCallback',
3475 type: AV.Types.FUNCTION,
3481 _discoverDevicesSuccessCallback = args.successCallback;
3482 _discoverDevicesErrorCallback = args.errorCallback;
3484 'BluetoothDiscoverDevicesSuccessCallback',
3485 _BluetoothDiscoverDevicesSuccessCallback
3488 'BluetoothDiscoverDevicesErrorCallback',
3489 _BluetoothDiscoverDevicesErrorCallback
3492 var result = native.callSync('BluetoothAdapterDiscoverDevices', {});
3494 if (native.isFailure(result)) {
3495 native.removeListener(
3496 'BluetoothDiscoverDevicesSuccessCallback',
3497 _BluetoothDiscoverDevicesSuccessCallback
3499 native.removeListener(
3500 'BluetoothDiscoverDevicesErrorCallback',
3501 _BluetoothDiscoverDevicesErrorCallback
3503 throw native.getErrorObject(result);
3507 BluetoothAdapter.prototype.stopDiscovery = function() {
3508 privUtils_.log('Entered BluetoothAdapter.stopDiscovery()');
3509 var args = AV.validateArgs(arguments, [
3511 name: 'successCallback',
3512 type: AV.Types.FUNCTION,
3517 name: 'errorCallback',
3518 type: AV.Types.FUNCTION,
3524 var callback = function(result) {
3525 if (native.isFailure(result)) {
3526 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3528 native.callIfPossible(args.successCallback);
3532 var result = native.call('BluetoothAdapterStopDiscovery', {}, callback);
3533 if (native.isFailure(result)) {
3534 throw native.getErrorObject(result);
3538 BluetoothAdapter.prototype.getKnownDevices = function() {
3539 privUtils_.log('Entered BluetoothAdapter.getKnownDevices()');
3540 var args = AV.validateArgs(arguments, [
3542 name: 'successCallback',
3543 type: AV.Types.FUNCTION
3546 name: 'errorCallback',
3547 type: AV.Types.FUNCTION,
3553 var callback = function(result) {
3554 if (native.isFailure(result)) {
3555 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3557 var r = native.getResultObject(result).devices;
3559 r.forEach(function(data) {
3560 devices.push(new BluetoothDevice(data));
3562 args.successCallback(devices);
3566 var result = native.call('BluetoothAdapterGetKnownDevices', {}, callback);
3567 if (native.isFailure(result)) {
3568 throw native.getErrorObject(result);
3572 BluetoothAdapter.prototype.getDevice = function() {
3573 privUtils_.log('Entered BluetoothAdapter.getDevice()');
3574 var args = AV.validateArgs(arguments, [
3577 type: AV.Types.STRING
3580 name: 'successCallback',
3581 type: AV.Types.FUNCTION
3584 name: 'errorCallback',
3585 type: AV.Types.FUNCTION,
3591 var callback = function(result) {
3592 if (native.isFailure(result)) {
3593 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3595 args.successCallback(new BluetoothDevice(native.getResultObject(result)));
3599 var result = native.call(
3600 'BluetoothAdapterGetDevice',
3601 { address: args.address },
3604 if (native.isFailure(result)) {
3605 throw native.getErrorObject(result);
3609 BluetoothAdapter.prototype.createBonding = function() {
3610 privUtils_.log('Entered BluetoothAdapter.createBonding()');
3611 var args = AV.validateArgs(arguments, [
3614 type: AV.Types.STRING
3617 name: 'successCallback',
3618 type: AV.Types.FUNCTION,
3623 name: 'errorCallback',
3624 type: AV.Types.FUNCTION,
3631 address: args.address
3634 var callback = function(result) {
3635 if (native.isFailure(result)) {
3636 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3638 args.successCallback(new BluetoothDevice(native.getResultObject(result)));
3642 var result = native.call('BluetoothAdapterCreateBonding', callArgs, callback);
3643 if (native.isFailure(result)) {
3644 throw native.getErrorObject(result);
3648 BluetoothAdapter.prototype.destroyBonding = function() {
3649 privUtils_.log('Entered BluetoothAdapter.destroyBonding()');
3650 var args = AV.validateArgs(arguments, [
3653 type: AV.Types.STRING
3656 name: 'successCallback',
3657 type: AV.Types.FUNCTION,
3662 name: 'errorCallback',
3663 type: AV.Types.FUNCTION,
3670 address: args.address
3673 var callback = function(result) {
3674 if (native.isFailure(result)) {
3675 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3677 native.callIfPossible(args.successCallback);
3681 var result = native.call('BluetoothAdapterDestroyBonding', callArgs, callback);
3682 if (native.isFailure(result)) {
3683 throw native.getErrorObject(result);
3687 BluetoothAdapter.prototype.registerRFCOMMServiceByUUID = function() {
3688 privUtils_.log('Entered BluetoothAdapter.registerRFCOMMServiceByUUID()');
3689 var args = AV.validateArgs(arguments, [
3692 type: AV.Types.STRING
3696 type: AV.Types.STRING
3699 name: 'successCallback',
3700 type: AV.Types.FUNCTION
3703 name: 'errorCallback',
3704 type: AV.Types.FUNCTION,
3715 var callback = function(result) {
3716 if (native.isFailure(result)) {
3717 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3719 // if registration was finished with success create BluetoothServiceHandler
3720 // with parameters passed to this function (uuid and name).
3721 args.successCallback(new BluetoothServiceHandler(callArgs));
3725 var result = native.call(
3726 'BluetoothAdapterRegisterRFCOMMServiceByUUID',
3730 if (native.isFailure(result)) {
3731 throw native.getErrorObject(result);
3735 BluetoothAdapter.prototype.getBluetoothProfileHandler = function() {
3736 privUtils_.log('Entered BluetoothAdapter.getBluetoothProfileHandler()');
3737 privUtils_.printDeprecationWarningFor('getBluetoothProfileHandler');
3738 var args = AV.validateArgs(arguments, [
3740 name: 'profileType',
3741 type: AV.Types.ENUM,
3742 values: T.getValues(_BluetoothProfileType)
3746 var callArgs = { profileType: args.profileType };
3748 var result = native.callSync('BluetoothAdapterGetBluetoothProfileHandler', callArgs);
3750 if (native.isFailure(result)) {
3751 throw native.getErrorObject(result);
3753 switch (args.profileType) {
3754 case _BluetoothProfileType.HEALTH:
3755 return new BluetoothHealthProfileHandler(callArgs);
3758 throw new WebAPIException(
3759 'NotSupportedError',
3760 'Profile ' + args.profileType + ' is not supported.'
3766 // class BluetoothGATTServer ////////////////////////
3767 var _BluetoothGATTServerServices = [];
3768 var _isBluetoothGATTServerRunning = false;
3770 function _BluetoothGattServerIsRunningChangeListener(result) {
3771 _isBluetoothGATTServerRunning = result.state;
3775 * This set is used in BluetoothGATTServer::start() to check which services
3776 * from BluetoothGATTServer::services have already been registered in native
3777 * layer and which have to be registered.
3779 var _BluetoothGATTServerServicesRegisteredInNativeLayer = {};
3781 var BluetoothGATTServer = function() {
3782 Object.defineProperties(this, {
3786 return _BluetoothGATTServerServices;
3793 return _isBluetoothGATTServerRunning;
3799 // Register listener for managing GATTServer start / stop
3801 'BluetoothGattServerIsRunningChangeListener',
3802 _BluetoothGattServerIsRunningChangeListener
3806 var AbortError = new WebAPIException('AbortError', 'An unknown error occurred');
3808 var BluetoothGATTServer_valid_registerService_errors = [
3809 'InvalidStateError',
3810 'NotSupportedError',
3811 'InvalidValuesError',
3814 var BluetoothGATTServer_valid_registerService_exceptions = [
3815 'InvalidStateError',
3816 'TypeMismatchError',
3820 BluetoothGATTServer.prototype.registerService = function() {
3821 var args = AV.validateArgs(arguments, [
3824 type: AV.Types.DICTIONARY
3827 name: 'successCallback',
3828 type: AV.Types.FUNCTION,
3833 name: 'errorCallback',
3834 type: AV.Types.FUNCTION,
3840 var service = new BluetoothGATTServerService(args.service);
3842 var callback = function(result) {
3843 if (native.isFailure(result)) {
3844 native.callIfPossible(
3846 native.getErrorObjectAndValidate(
3848 BluetoothGATTServer_valid_registerService_errors,
3853 _BluetoothGATTServerServicesRegisteredInNativeLayer[service._id] = true;
3854 _BluetoothGATTServerServices.push(service);
3855 native.callIfPossible(args.successCallback);
3859 var result = native.call('BluetoothGATTServerRegisterService', service, callback);
3860 if (native.isFailure(result)) {
3861 throw native.getErrorObjectAndValidate(
3863 BluetoothGATTServer_valid_registerService_exceptions,
3870 * Objects of this class are used to wait for multiple callbacks results.
3872 * Its successCallback and errorCallback members should be passed as
3873 * the success and error callbacks, respectively, to the functions we wait for.
3874 * When the functions we wait for are called callbacksNum times, either
3875 * onAllSucceeded or onFailure is called, depending on whether only
3876 * successCallback was called or not.
3878 * For the usage example, take a look at BluetoothGATTServer.prototype.start,
3879 * where it's used to wait for registration of multiple services.
3881 var ResultCallbacksAggregator = function(callbacksNum, onAllSucceeded, onFailure) {
3882 var _callbacksNum = callbacksNum;
3883 var _allSucceeded = true;
3886 this.successCallback = function() {
3889 if (!_callbacksNum) {
3890 if (_allSucceeded) {
3898 this.errorCallback = function(error) {
3900 _allSucceeded = false;
3903 if (!_callbacksNum) {
3909 var BluetoothGATTServer_valid_start_errors = [
3910 'InvalidStateError',
3911 'NotSupportedError',
3914 var BluetoothGATTServer_valid_start_exceptions = [
3915 'InvalidStateError',
3916 'TypeMismatchError',
3920 BluetoothGATTServer.prototype.start = function() {
3921 privUtils_.log('Entered BluetoothGATTServer.start()');
3922 var args = AV.validateArgs(arguments, [
3924 name: 'successCallback',
3925 type: AV.Types.FUNCTION,
3930 name: 'errorCallback',
3931 type: AV.Types.FUNCTION,
3937 var servicesUnregisteredInNativeLayer = [];
3938 for (var i = 0; i < this.services.length; ++i) {
3939 if (this.services[i]) {
3941 !_BluetoothGATTServerServicesRegisteredInNativeLayer[this.services[i]._id]
3943 servicesUnregisteredInNativeLayer.push(this.services[i]);
3948 var startServerCallback = function(result) {
3949 if (native.isFailure(result)) {
3950 native.callIfPossible(
3952 native.getErrorObjectAndValidate(
3954 BluetoothGATTServer_valid_start_errors,
3959 native.callIfPossible(args.successCallback);
3963 if (servicesUnregisteredInNativeLayer.length) {
3964 var registerServiceCallbacksAggregator = new ResultCallbacksAggregator(
3965 servicesUnregisteredInNativeLayer.length,
3966 function onAllSucceeded() {
3967 var result = native.call(
3968 'BluetoothGATTServerStart',
3973 if (native.isFailure(result)) {
3974 throw native.getErrorObjectAndValidate(
3976 BluetoothGATTServer_valid_start_exceptions,
3981 function onFailure(error) {
3982 native.callIfPossible(
3984 native.getErrorObjectAndValidate(
3986 BluetoothGATTServer_valid_start_errors,
3993 var registerServicesCallback = function(result) {
3994 if (native.isFailure(result)) {
3995 registerServiceCallbacksAggregator.errorCallback(
3996 native.getErrorObjectAndValidate(
3998 BluetoothGATTServer_valid_start_errors,
4003 registerServiceCallbacksAggregator.successCallback();
4007 for (var i = 0; i < servicesUnregisteredInNativeLayer.length; ++i) {
4008 var result = native.call(
4009 'BluetoothGATTServerRegisterService',
4010 servicesUnregisteredInNativeLayer[i],
4011 registerServicesCallback
4013 if (native.isFailure(result)) {
4014 throw native.getErrorObjectAndValidate(
4016 BluetoothGATTServer_valid_registerService_exceptions,
4022 var result = native.call('BluetoothGATTServerStart', {}, startServerCallback);
4024 if (native.isFailure(result)) {
4025 throw native.getErrorObjectAndValidate(
4027 BluetoothGATTServer_valid_start_exceptions,
4034 var BluetoothGATTServer_valid_stop_errors = [
4035 'InvalidStateError',
4036 'NotSupportedError',
4039 var BluetoothGATTServer_valid_stop_exceptions = [
4040 'InvalidStateError',
4041 'TypeMismatchError',
4045 BluetoothGATTServer.prototype.stop = function() {
4046 privUtils_.log('Entered BluetoothGATTServer.stop()');
4047 var args = AV.validateArgs(arguments, [
4049 name: 'successCallback',
4050 type: AV.Types.FUNCTION,
4055 name: 'errorCallback',
4056 type: AV.Types.FUNCTION,
4062 var callback = function(result) {
4063 if (native.isFailure(result)) {
4064 native.callIfPossible(
4066 native.getErrorObjectAndValidate(
4068 BluetoothGATTServer_valid_stop_errors,
4073 _BluetoothGATTServerServicesRegisteredInNativeLayer = {};
4074 native.callIfPossible(args.successCallback);
4078 var result = native.call('BluetoothGATTServerStop', {}, callback);
4079 if (native.isFailure(result)) {
4080 throw native.getErrorObjectAndValidate(
4082 BluetoothGATTServer_valid_stop_exceptions,
4088 var BluetoothGATTServer_valid_getConnectionMtu_errors = [
4089 'InvalidStateError',
4090 'NotSupportedError',
4093 var BluetoothGATTServer_valid_getConnectionMtu_exceptions = [
4094 'TypeMismatchError',
4098 BluetoothGATTServer.prototype.getConnectionMtu = function() {
4099 privUtils_.log('Entered BluetoothGATTServer.getConnectionMtu()');
4100 var args = AV.validateArgs(arguments, [
4102 name: 'clientAddress',
4103 type: AV.Types.STRING
4106 name: 'successCallback',
4107 type: AV.Types.FUNCTION
4110 name: 'errorCallback',
4111 type: AV.Types.FUNCTION,
4116 var callback = function(result) {
4117 if (native.isFailure(result)) {
4118 native.callIfPossible(
4120 native.getErrorObjectAndValidate(
4122 BluetoothGATTServer_valid_getConnectionMtu_errors,
4127 args.successCallback(native.getResultObject(result));
4131 var result = native.call(
4132 'BluetoothGATTServerGetConnectionMtu',
4133 { clientAddress: args.clientAddress },
4136 if (native.isFailure(result)) {
4137 throw native.getErrorObjectAndValidate(
4139 BluetoothGATTServer_valid_getConnectionMtu_exceptions,
4145 var GATTServer = new BluetoothGATTServer();
4147 // class BluetoothManager ///////////////////////////
4148 var BluetoothManager = function() {
4149 Object.defineProperties(this, {
4151 value: new BluetoothClassDeviceMajor(),
4156 value: new BluetoothClassDeviceMinor(),
4161 value: new BluetoothClassDeviceService(),
4166 value: '00000000-0000-1000-8000-00805F9B34FB',
4173 var BluetoothManager_getDefaultAdapter = function() {
4174 privUtils_.checkPrivilegeAccess4Ver(
4176 Privilege.BLUETOOTH,
4177 Privilege.BLUETOOTH_GAP
4180 return new BluetoothAdapter();
4183 BluetoothManager.prototype.getDefaultAdapter = function() {
4184 privUtils_.log('Entered BluetoothManager.getDefaultAdapter()');
4185 return BluetoothManager_getDefaultAdapter();
4188 var BluetoothManager_getLEAdapter = function() {
4189 privUtils_.checkPrivilegeAccess4Ver(
4191 Privilege.BLUETOOTH,
4192 Privilege.BLUETOOTH_ADMIN
4195 return new BluetoothLEAdapter();
4198 BluetoothManager.prototype.getLEAdapter = function() {
4199 privUtils_.log('Entered BluetoothManager.getLEAdapter()');
4200 return BluetoothManager_getLEAdapter();
4203 var BluetoothManager_checkAndNormalizeHexString = function(hexString) {
4204 hexString = hexString.toLowerCase();
4205 if (hexString.startsWith('0x')) {
4206 hexString = hexString.substring(2);
4208 if (!/^[0-9a-f]+$/.test(hexString)) {
4209 throw new WebAPIException(
4210 WebAPIException.TYPE_MISMATCH_ERR,
4211 'Given string is not hexadecimal value'
4214 if ('0' === hexString) {
4217 if (1 === hexString.length % 2) {
4218 // to save consistency with BluetoothLEManufacturerData, last character is omitted
4219 hexString = hexString.replace(/.$/, '');
4224 var BluetoothManager_HexStringToUint8Array = function(hexString) {
4225 hexString = BluetoothManager_checkAndNormalizeHexString(hexString);
4226 if (0 === hexString.length) {
4227 return new Uint8Array([]);
4229 var data = hexString.match(/[0-9a-f]{2}/g).map(function(byte) {
4230 return parseInt(byte, 16);
4232 return new Uint8Array(data);
4235 var BluetoothManager_byteArrayToHexString = function(bytes) {
4236 if (0 == bytes.length) {
4242 .call(bytes, function(byte) {
4243 return ('0' + (byte & 0xff).toString(16)).slice(-2);
4249 var BluetoothManager_toByteArray = function(data) {
4250 if (data && String === data.constructor) {
4251 return numberArrayToByteArray(BluetoothManager_HexStringToUint8Array(data));
4254 data = numberArrayToByteArray(data);
4256 throw new WebAPIException(
4257 WebAPIException.TYPE_MISMATCH_ERR,
4258 'argument is not a valid Bytes type'
4265 BluetoothManager.prototype.toByteArray = function(data) {
4266 privUtils_.log('Entered BluetoothManager.toByteArray()');
4267 return BluetoothManager_toByteArray(data);
4270 var BluetoothManager_toDOMString = function(data) {
4271 if (data && String === data.constructor) {
4272 data = BluetoothManager_checkAndNormalizeHexString(data);
4273 if (0 !== data.length) {
4279 data = numberArrayToByteArray(data);
4281 throw new WebAPIException(
4282 WebAPIException.TYPE_MISMATCH_ERR,
4283 'argument is not a valid Bytes type'
4286 return BluetoothManager_byteArrayToHexString(data);
4289 BluetoothManager.prototype.toDOMString = function(data) {
4290 privUtils_.log('Entered BluetoothManager.toDOMString()');
4291 return BluetoothManager_toDOMString(data);
4294 var BluetoothManager_toUint8Array = function(data) {
4295 if (data && String === data.constructor) {
4296 return BluetoothManager_HexStringToUint8Array(data);
4299 data = new Uint8Array(numberArrayToByteArray(data));
4301 throw new WebAPIException(
4302 WebAPIException.TYPE_MISMATCH_ERR,
4303 'argument is not a valid Bytes type'
4310 BluetoothManager.prototype.toUint8Array = function(data) {
4311 privUtils_.log('Entered BluetoothManager.toUint8Array()');
4312 return BluetoothManager_toUint8Array(data);
4315 var BluetoothManager_UUIDIsValid128Bit = function(uuid) {
4316 var re128BitFormat = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
4317 if (re128BitFormat.test(uuid)) {
4323 var BluetoothManager_UUIDIsValid32Bit = function(uuid) {
4324 var re32BitFormat = /^[0-9a-f]{8}$/;
4325 if (re32BitFormat.test(uuid)) {
4331 var BluetoothManager_UUIDIsValid16Bit = function(uuid) {
4332 var re16BitFormat = /^[0-9a-f]{4}$/;
4333 if (re16BitFormat.test(uuid)) {
4339 var BluetoothManager_UUIDIsConvertibleTo16Bit = function(uuid) {
4340 var re128BitFormat = /^0000[0-9a-f]{4}-0000-1000-8000-00805f9b34fb$/;
4341 if (re128BitFormat.test(uuid)) {
4344 var re32BitFormat = /^0000[0-9a-f]{4}$/;
4345 if (re32BitFormat.test(uuid)) {
4351 var BluetoothManager_UUIDIsConvertibleTo32Bit = function(uuid) {
4352 var re = /^[0-9a-f]{8}-0000-1000-8000-00805f9b34fb$/;
4353 if (re.test(uuid)) {
4359 var BluetoothManager_UUIDTo128bit = function(uuid) {
4360 uuid = Converter.toString(uuid).toLowerCase();
4361 if (BluetoothManager_UUIDIsValid128Bit(uuid)) {
4364 var baseUuidLast96Bits = '-0000-1000-8000-00805f9b34fb';
4365 if (BluetoothManager_UUIDIsValid16Bit(uuid)) {
4366 return '0000' + uuid + baseUuidLast96Bits;
4368 if (BluetoothManager_UUIDIsValid32Bit(uuid)) {
4369 return uuid + baseUuidLast96Bits;
4371 throw new WebAPIException(
4372 WebAPIException.INVALID_VALUES_ERR,
4373 'Given parameter is not a supported uuid format: ' + uuid
4377 var BluetoothManager_UUIDToShortestPossible = function(uuid) {
4378 uuid = uuid.toLowerCase();
4379 if (BluetoothManager_UUIDIsValid16Bit(uuid)) {
4382 if (BluetoothManager_UUIDIsValid32Bit(uuid)) {
4383 if (BluetoothManager_UUIDIsConvertibleTo16Bit(uuid)) {
4384 return uuid.substring(4, 8);
4387 if (!BluetoothManager_UUIDIsValid128Bit(uuid)) {
4388 throw new WebAPIException(
4389 WebAPIException.INVALID_VALUES_ERR,
4390 'Given parameter is not a supported uuid format: ' + uuid
4393 if (BluetoothManager_UUIDIsConvertibleTo16Bit(uuid)) {
4394 return uuid.substring(4, 8);
4396 if (BluetoothManager_UUIDIsConvertibleTo32Bit(uuid)) {
4397 return uuid.substring(0, 8);
4402 var BluetoothManager_UUIDsEqual = function(uuid1, uuid2) {
4403 uuid1 = Converter.toString(uuid1).toLowerCase();
4404 uuid1 = BluetoothManager_UUIDTo128bit(uuid1);
4405 uuid2 = Converter.toString(uuid2).toLowerCase();
4406 uuid2 = BluetoothManager_UUIDTo128bit(uuid2);
4407 return uuid1 === uuid2;
4410 BluetoothManager.prototype.uuidTo128bit = function(uuid) {
4411 privUtils_.log('Entered BluetoothManager.uuidTo128bit()');
4412 var args = AV.validateArgs(arguments, [
4415 type: AV.Types.STRING
4418 return BluetoothManager_UUIDTo128bit(args.uuid);
4421 BluetoothManager.prototype.uuidToShortestPossible = function(uuid) {
4422 privUtils_.log('Entered BluetoothManager.uuidToShortestPossible()');
4423 var args = AV.validateArgs(arguments, [
4426 type: AV.Types.STRING
4429 return BluetoothManager_UUIDToShortestPossible(args.uuid);
4432 BluetoothManager.prototype.uuidsEqual = function(uuid1, uuid2) {
4433 privUtils_.log('Entered BluetoothManager.uuidsEqual()');
4434 var args = AV.validateArgs(arguments, [
4437 type: AV.Types.STRING
4441 type: AV.Types.STRING
4444 return BluetoothManager_UUIDsEqual(args.uuid1, args.uuid2);
4446 BluetoothManager.prototype.getGATTServer = function() {
4447 privUtils_.log('Entered BluetoothManager.getGATTServer()');
4448 return BluetoothManager_getGATTServer();
4451 var BluetoothManager_getGATTServer = function() {
4455 // exports //////////////////////////////////////////
4456 exports = new BluetoothManager();