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);
179 data_ = Converter.toString(v);
185 if (arguments.length >= 2) {
186 // public constructor
187 this.uuid = arguments[0];
188 this.data = arguments[1];
189 } else if (d && T.isObject(d)) {
190 // internal constructor
199 //class BluetoothLEAdvertiseData ///////////////////////////
200 tizen.BluetoothLEAdvertiseData = function(dict) {
201 AV.isConstructorCall(this, tizen.BluetoothLEAdvertiseData);
202 var includeName_ = false;
204 var solicitationuuids_ = null;
205 var appearance_ = null;
206 var includeTxPowerLevel_ = false;
207 var serviceData_ = 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 manufacturerData_;
291 if (T.isNull(v) || v instanceof tizen.BluetoothLEManufacturerData) {
292 manufacturerData_ = v;
298 if (T.isObject(dict)) {
302 if (T.isNull(dict.includeName) || T.isBoolean(dict.includeName)) {
303 o.includeName = dict.includeName;
304 } else if (!T.isUndefined(dict.includeName)) {
309 if (T.isNull(dict.uuids)) {
310 o.uuids = dict.uuids;
311 } else if (T.isArray(dict.uuids)) {
312 for (var i = 0; i < dict.uuids.length; ++i) {
313 if (!T.isString(dict.uuids[i])) {
317 o.uuids = dict.uuids;
318 } else if (!T.isUndefined(dict.uuids)) {
323 if (T.isNull(dict.solicitationuuids)) {
324 o.solicitationuuids = dict.solicitationuuids;
325 } else if (T.isArray(dict.solicitationuuids)) {
326 for (var i = 0; i < dict.solicitationuuids.length; ++i) {
327 if (!T.isString(dict.solicitationuuids[i])) {
331 o.solicitationuuids = dict.solicitationuuids;
332 } else if (!T.isUndefined(dict.solicitationuuids)) {
337 if (T.isNull(dict.appearance) || T.isNumber(dict.appearance)) {
338 o.appearance = dict.appearance;
339 } else if (!T.isUndefined(dict.appearance)) {
343 // includeTxPowerLevel
344 if (T.isNull(dict.includeTxPowerLevel) || T.isBoolean(dict.includeTxPowerLevel)) {
345 o.includeTxPowerLevel = dict.includeTxPowerLevel;
346 } else if (!T.isUndefined(dict.includeTxPowerLevel)) {
352 T.isNull(dict.serviceData) ||
353 dict.serviceData instanceof tizen.BluetoothLEServiceData
355 o.serviceData = dict.serviceData;
356 } else if (!T.isUndefined(dict.serviceData)) {
362 T.isNull(dict.manufacturerData) ||
363 dict.manufacturerData instanceof tizen.BluetoothLEManufacturerData
365 o.manufacturerData = dict.manufacturerData;
366 } else if (!T.isUndefined(dict.manufacturerData)) {
370 for (var prop in o) {
371 if (o.hasOwnProperty(prop) && this.hasOwnProperty(prop)) {
372 this[prop] = o[prop];
378 //class tizen.BluetoothLEManufacturerData ///////////////////////////
379 tizen.BluetoothLEManufacturerData = function(d) {
380 AV.isConstructorCall(this, tizen.BluetoothLEManufacturerData);
384 Object.defineProperties(this, {
391 id_ = Converter.toString(v);
401 data_ = BluetoothManager_toDOMString(v);
403 data_ = Converter.toString(v);
409 if (arguments.length >= 2) {
410 // public constructor
411 this.id = arguments[0];
412 this.data = arguments[1];
413 } else if (d && T.isObject(d)) {
414 // internal constructor
423 // class BluetoothClass ///////////////////////////
424 var BluetoothClass = function(data) {
427 services = data.services;
430 Object.defineProperties(this, {
431 major: { value: data.major, writable: false, enumerable: true },
432 minor: { value: data.minor, writable: false, enumerable: true },
437 return services.slice();
443 var BluetoothClass_hasService = function() {
444 privUtils_.log('Entered BluetoothClass.hasService()');
445 privUtils_.checkPrivilegeAccess4Ver(
448 Privilege.BLUETOOTH_GAP
451 var args = AV.validateArgs(arguments, [
454 type: AV.Types.UNSIGNED_LONG
458 var size = this.services.length;
459 for (var i = 0; i < size; i++) {
460 if (this.services[i] === args.service) {
467 BluetoothClass.prototype.hasService = function() {
468 return BluetoothClass_hasService.apply(this, arguments);
471 // class BluetoothSocket ///////////////////////////
472 var _BLUETOOTH_SOCKET_STATE_CLOSED = 'CLOSED';
474 function BluetoothSocketListeners() {
476 this.socketCallback = function(data) {
478 var socket = that.sockets[event.id];
481 if ('onclose' === event.event) {
483 that.removeListener(event.id);
485 Object.defineProperty(socket, 'state', {
486 value: _BLUETOOTH_SOCKET_STATE_CLOSED
490 var callback = socket[event.event];
491 if (T.isFunction(callback)) {
495 privUtils_.log('Received event for an unknown socket: ' + event.id);
500 BluetoothSocketListeners.prototype.sockets = {};
502 BluetoothSocketListeners.prototype.addListener = function(socket) {
503 if (T.isEmptyObject(this.sockets)) {
504 native.addListener('BLUETOOTH_SOCKET_STATE_CHANGED', this.socketCallback);
507 this.sockets[socket._id] = socket;
510 BluetoothSocketListeners.prototype.removeListener = function(id) {
511 delete this.sockets[id];
513 if (T.isEmptyObject(this.sockets)) {
514 native.removeListener('BLUETOOTH_SOCKET_STATE_CHANGED', this.socketCallback);
518 var _bluetoothSocketListeners = new BluetoothSocketListeners();
520 var BluetoothSocket = function(data) {
521 Object.defineProperties(this, {
522 uuid: { value: data.uuid, writable: false, enumerable: true },
530 value: new BluetoothDevice(data.peer),
534 onmessage: { value: null, writable: true, enumerable: true },
535 onclose: { value: null, writable: true, enumerable: true },
536 _id: { value: data.id, writable: false, enumerable: false }
539 _bluetoothSocketListeners.addListener(this);
542 BluetoothSocket.prototype.writeData = function(data) {
543 privUtils_.log('Entered BluetoothSocket.writeData()');
545 var byteData = BluetoothManager_toByteArray(data);
552 var result = native.callSync('BluetoothSocketWriteData', callArgs);
554 if (native.isFailure(result)) {
555 throw native.getErrorObject(result);
557 return native.getResultObject(result);
561 BluetoothSocket.prototype.readData = function() {
562 privUtils_.log('Entered BluetoothSocket.readData()');
568 var result = native.callSync('BluetoothSocketReadData', callArgs);
570 if (native.isFailure(result)) {
571 throw native.getErrorObject(result);
573 return native.getResultObject(result);
577 BluetoothSocket.prototype.close = function() {
578 privUtils_.log('Entered BluetoothSocket.close()');
580 if (_BLUETOOTH_SOCKET_STATE_CLOSED !== this.state) {
585 var result = native.callSync('BluetoothSocketClose', callArgs);
587 if (native.isFailure(result)) {
588 throw native.getErrorObject(result);
592 Object.defineProperty(this, 'state', { value: _BLUETOOTH_SOCKET_STATE_CLOSED });
596 //class BluetoothLEDevice ///////////////////////////
597 var BluetoothLEDevice = function(data) {
603 solicitationuuids = null,
605 manufacturerData = null,
609 address = data.address;
610 name = data.name || null;
611 txpowerlevel = data.txpowerlevel || null;
612 appearance = data.appearance || null;
613 uuids = data.uuids || null;
614 solicitationuuids = data.solicitationuuids || null;
615 if (data.serviceData) {
617 data.serviceData.forEach(function(d) {
618 serviceData.push(new tizen.BluetoothLEServiceData(d));
621 if (data.manufacturerData) {
622 manufacturerData = new tizen.BluetoothLEManufacturerData(
623 data.manufacturerData
631 Object.defineProperties(this, {
632 address: { value: address, writable: false, enumerable: true },
633 name: { value: name, writable: false, enumerable: true },
634 txpowerlevel: { value: txpowerlevel, writable: false, enumerable: true },
635 appearance: { value: appearance, writable: false, enumerable: true },
640 var service_uuids = uuids ? uuids.slice() : null;
641 return service_uuids;
648 return solicitationuuids ? solicitationuuids.slice() : null;
655 return serviceData ? serviceData.slice() : null;
659 value: manufacturerData,
663 rssi: { value: rssi, writable: false, enumerable: true }
667 BluetoothLEDevice.prototype.connect = function() {
668 privUtils_.log('Entered BluetoothLEDevice.connect()');
669 var args = AV.validateArgs(arguments, [
671 name: 'successCallback',
672 type: AV.Types.FUNCTION,
677 name: 'errorCallback',
678 type: AV.Types.FUNCTION,
684 var callback = function(result) {
685 if (native.isFailure(result)) {
686 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
688 native.callIfPossible(args.successCallback);
691 // Errors are handled by error callback
692 var result = native.call(
693 'BluetoothLEDeviceConnect',
694 { address: this.address },
697 if (native.isFailure(result)) {
698 throw native.getErrorObject(result);
702 BluetoothLEDevice.prototype.disconnect = function() {
703 privUtils_.log('Entered BluetoothLEDevice.disconnect()');
704 var args = AV.validateArgs(arguments, [
706 name: 'successCallback',
707 type: AV.Types.FUNCTION,
712 name: 'errorCallback',
713 type: AV.Types.FUNCTION,
718 var callback = function(result) {
719 if (native.isFailure(result)) {
720 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
722 native.callIfPossible(args.successCallback);
726 var result = native.call(
727 'BluetoothLEDeviceDisconnect',
728 { address: this.address },
731 if (native.isFailure(result)) {
732 throw native.getErrorObject(result);
736 BluetoothLEDevice.prototype.getService = function() {
737 privUtils_.log('Entered BluetoothLEDevice.getService()');
738 var args = AV.validateArgs(arguments, [
741 type: AV.Types.STRING
747 address: this.address
750 var result = native.callSync('BluetoothLEDeviceGetService', callArgs);
751 if (native.isFailure(result)) {
752 throw native.getErrorObject(result);
754 return new BluetoothGATTService(native.getResultObject(result));
758 BluetoothLEDevice.prototype.getServiceAllUuids = function() {
759 privUtils_.log('Entered BluetoothLEDevice.getServiceAllUuids()');
762 address: this.address
765 var result = native.callSync('BluetoothLEDeviceGetServiceAllUuids', callArgs);
766 if (native.isFailure(result)) {
767 throw native.getErrorObject(result);
769 var uuids = native.getResultObject(result);
774 BluetoothLEDevice.prototype.addConnectStateChangeListener = function() {
775 privUtils_.log('Entered BluetoothLEDevice.addConnectStateChangeListener()');
776 var args = AV.validateArgs(arguments, [
779 type: AV.Types.LISTENER,
780 values: ['onconnected', 'ondisconnected']
786 var func = function(event) {
787 if (event.address === that.address && args.listener[event.action]) {
788 args.listener[event.action](that);
792 var watchId = _bleConnectChangeListener.addListener(func);
797 BluetoothLEDevice.prototype.removeConnectStateChangeListener = function() {
798 privUtils_.log('Entered BluetoothLEDevice.removeConnectStateChangeListener()');
800 var args = AV.validateArgs(arguments, [
807 _bleConnectChangeListener.removeListener(args.watchID);
810 // class BluetoothDevice ///////////////////////////
811 var BluetoothDevice = function(data) {
813 function _getter(field) {
816 callArgs.address = self.address;
817 callArgs.field = field;
819 var result = native.callSync('BluetoothDeviceGetBoolValue', callArgs);
821 if (native.isFailure(result)) {
824 return native.getResultObject(result);
828 function isBondedGetter() {
829 return _getter('isBonded');
832 function isTrustedGetter() {
833 return _getter('isTrusted');
836 function isConnectedGetter() {
837 return _getter('isConnected');
845 Object.defineProperties(this, {
846 name: { value: data.name, writable: false, enumerable: true },
847 address: { value: data.address, writable: false, enumerable: true },
849 value: new BluetoothClass(data.deviceClass),
866 get: isConnectedGetter
872 return uuids.slice();
878 BluetoothDevice.prototype.connectToServiceByUUID = function() {
879 privUtils_.log('Entered BluetoothDevice.connectToServiceByUUID()');
881 var args = AV.validateArgs(arguments, [
884 type: AV.Types.STRING
887 name: 'successCallback',
888 type: AV.Types.FUNCTION
891 name: 'errorCallback',
892 type: AV.Types.FUNCTION,
899 address: this.address,
902 var callback = function(result) {
903 if (native.isFailure(result)) {
904 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
906 args.successCallback(new BluetoothSocket(native.getResultObject(result)));
910 var result = native.call('BluetoothDeviceConnectToServiceByUUID', callArgs, callback);
911 if (native.isFailure(result)) {
912 throw native.getErrorObject(result);
916 // class BluetoothServiceHandler ///////////////////////////
917 function BluetoothServiceListeners() {
919 this.serviceCallback = function(data) {
921 var service = that.services[e.uuid];
922 var result = new BluetoothSocket(e);
925 privUtils_.log(service);
926 service.onconnect(result);
931 BluetoothServiceListeners.prototype.services = {};
933 BluetoothServiceListeners.prototype.addListener = function(service) {
934 if (T.isEmptyObject(this.services)) {
935 native.addListener('BLUETOOTH_SERVICE_ONCONNECT', this.serviceCallback);
938 this.services[service.uuid] = service;
941 BluetoothServiceListeners.prototype.removeListener = function(uuid) {
942 delete this.services[uuid];
944 if (T.isEmptyObject(this.services)) {
945 native.removeListener('BLUETOOTH_SERVICE_ONCONNECT', this.serviceCallback);
949 var _bluetoothServiceListeners = new BluetoothServiceListeners();
951 var BluetoothServiceHandler = function(data) {
952 function isConnectedGetter() {
957 var result = native.callSync('BluetoothAdapterIsServiceConnected', {
961 if (native.isFailure(result)) {
964 return native.getResultObject(result);
968 Object.defineProperties(this, {
969 uuid: { value: data.uuid, writable: false, enumerable: true },
970 name: { value: data.name, writable: false, enumerable: true },
974 get: isConnectedGetter
976 onconnect: { value: null, writable: true, enumerable: true }
979 _bluetoothServiceListeners.addListener(this);
982 BluetoothServiceHandler.prototype.unregister = function() {
983 privUtils_.log('Entered BluetoothServiceHandler.unregister()');
984 var args = AV.validateArgs(arguments, [
986 name: 'successCallback',
987 type: AV.Types.FUNCTION,
992 name: 'errorCallback',
993 type: AV.Types.FUNCTION,
1003 var callback = function(result) {
1004 if (native.isFailure(result)) {
1005 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1007 native.callIfPossible(args.successCallback);
1011 var result = native.call('BluetoothServiceHandlerUnregister', callArgs, callback);
1012 if (native.isFailure(result)) {
1013 throw native.getErrorObject(result);
1016 _bluetoothServiceListeners.removeListener(this.uuid);
1019 // class BluetoothHealthApplication ///////////////////////////
1020 function BluetoothHealthApplicationListeners() {
1022 this.appCallback = function(data) {
1024 var app = that.apps[event.id];
1027 var callback = app[event.event];
1028 if (T.isFunction(callback)) {
1030 switch (event.event) {
1032 param = new BluetoothHealthChannel(native.getResultObject(event));
1036 privUtils_.log('Unknown event: ' + event.event);
1042 privUtils_.log('Received event for an unknown application: ' + event.id);
1047 BluetoothHealthApplicationListeners.prototype.apps = {};
1049 BluetoothHealthApplicationListeners.prototype.addListener = function(app) {
1050 if (T.isEmptyObject(this.apps)) {
1051 native.addListener('BLUETOOTH_HEALTH_APPLICATION_CHANGED', this.appCallback);
1054 this.apps[app._id] = app;
1057 BluetoothHealthApplicationListeners.prototype.removeListener = function(id) {
1058 delete this.apps[id];
1060 if (T.isEmptyObject(this.apps)) {
1061 native.removeListener('BLUETOOTH_HEALTH_APPLICATION_CHANGED', this.appCallback);
1065 var _bluetoothHealthApplicationListeners = new BluetoothHealthApplicationListeners();
1067 var BluetoothHealthApplication = function(data) {
1068 Object.defineProperties(this, {
1069 dataType: { value: data.dataType, writable: false, enumerable: true },
1070 name: { value: data.name, writable: false, enumerable: true },
1071 onconnect: { value: null, writable: true, enumerable: true },
1072 _id: { value: data._id, writable: false, enumerable: false }
1075 _bluetoothHealthApplicationListeners.addListener(this);
1078 BluetoothHealthApplication.prototype.unregister = function() {
1079 privUtils_.log('Entered BluetoothHealthApplication.unregister()');
1080 privUtils_.printDeprecationWarningFor('BluetoothHealthApplication');
1081 var args = AV.validateArgs(arguments, [
1083 name: 'successCallback',
1084 type: AV.Types.FUNCTION,
1089 name: 'errorCallback',
1090 type: AV.Types.FUNCTION,
1096 var callArgs = { id: this._id };
1098 var callback = function(result) {
1099 if (native.isFailure(result)) {
1100 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1102 native.callIfPossible(args.successCallback);
1106 var result = native.call('BluetoothHealthApplicationUnregister', callArgs, callback);
1107 if (native.isFailure(result)) {
1108 throw native.getErrorObject(result);
1111 _bluetoothHealthApplicationListeners.removeListener(this._id);
1114 // class BluetoothProfileHandler ///////////////////////////
1115 var _BluetoothProfileType = {
1119 var BluetoothProfileHandler = function(data) {
1121 var profileType = data.profileType;
1122 function profileTypeGetter() {
1123 privUtils_.printDeprecationWarningFor('profileType');
1126 Object.defineProperties(this, {
1127 profileType: { enumerable: true, set: function() {}, get: profileTypeGetter }
1132 // class BluetoothHealthProfileHandler ///////////////////////////
1133 var BluetoothHealthProfileHandler = function(data) {
1134 BluetoothProfileHandler.call(this, data);
1137 BluetoothHealthProfileHandler.prototype = new BluetoothProfileHandler();
1139 BluetoothHealthProfileHandler.prototype.constructor = BluetoothProfileHandler;
1141 BluetoothHealthProfileHandler.prototype.registerSinkApplication = function() {
1142 privUtils_.log('Entered BluetoothHealthProfileHandler.registerSinkApplication()');
1143 privUtils_.printDeprecationWarningFor('BluetoothHealthProfileHandler');
1145 var args = AV.validateArgs(arguments, [
1148 type: AV.Types.LONG // there's no short type
1152 type: AV.Types.STRING
1155 name: 'successCallback',
1156 type: AV.Types.FUNCTION
1159 name: 'errorCallback',
1160 type: AV.Types.FUNCTION,
1167 dataType: args.dataType,
1171 var callback = function(result) {
1172 if (native.isFailure(result)) {
1173 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1175 args.successCallback(
1176 new BluetoothHealthApplication(native.getResultObject(result))
1181 var result = native.call(
1182 'BluetoothHealthProfileHandlerRegisterSinkApp',
1186 if (native.isFailure(result)) {
1187 throw native.getErrorObject(result);
1191 BluetoothHealthProfileHandler.prototype.connectToSource = function() {
1192 privUtils_.log('Entered BluetoothHealthProfileHandler.connectToSource()');
1193 privUtils_.printDeprecationWarningFor('BluetoothHealthProfileHandler');
1195 var args = AV.validateArgs(arguments, [
1198 type: AV.Types.PLATFORM_OBJECT,
1199 values: BluetoothDevice
1202 name: 'application',
1203 type: AV.Types.PLATFORM_OBJECT,
1204 values: BluetoothHealthApplication
1207 name: 'successCallback',
1208 type: AV.Types.FUNCTION
1211 name: 'errorCallback',
1212 type: AV.Types.FUNCTION,
1219 address: args.peer.address,
1220 appId: args.application._id
1223 var callback = function(result) {
1224 if (native.isFailure(result)) {
1225 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1227 var channel = native.getResultObject(result);
1228 channel.peer = args.peer;
1229 channel.appId = args.application._id;
1230 args.successCallback(new BluetoothHealthChannel(channel));
1234 var result = native.call(
1235 'BluetoothHealthProfileHandlerConnectToSource',
1239 if (native.isFailure(result)) {
1240 throw native.getErrorObject(result);
1244 // class BluetoothHealthChannel ///////////////////////////
1245 var BluetoothHealthChannel = function(data) {
1246 Object.defineProperties(this, {
1247 peer: { value: data.peer, writable: false, enumerable: true },
1248 channelType: { value: data.channelType, writable: false, enumerable: true },
1250 value: _bluetoothHealthApplicationListeners.apps[data.appId],
1255 value: data.isConnected,
1260 _id: { value: data._id, writable: false, enumerable: false }
1264 BluetoothHealthChannel.prototype.close = function() {
1265 privUtils_.log('Entered BluetoothHealthChannel.close()');
1266 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1268 if (this.isConnected) {
1271 address: this.peer.address
1274 var result = native.callSync('BluetoothHealthChannelClose', callArgs);
1276 if (native.isFailure(result)) {
1277 throw native.getErrorObject(result);
1280 Object.defineProperty(this, 'isConnected', { value: false });
1284 BluetoothHealthChannel.prototype.sendData = function() {
1285 privUtils_.log('Entered BluetoothHealthChannel.sendData()');
1286 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1288 var args = AV.validateArgs(arguments, [
1291 type: AV.Types.ARRAY,
1292 values: AV.Types.BYTE
1301 var result = native.callSync('BluetoothHealthChannelSendData', callArgs);
1303 if (native.isFailure(result)) {
1304 throw native.getErrorObject(result);
1306 return native.getResultObject(result);
1310 var _healthListeners = {};
1312 function _BluetoothHealthChannelChangeCallback(event) {
1314 var callback = _healthListeners[e.id];
1326 privUtils_.log('Unknown mode: ' + e.event);
1330 if (callback[e.event]) {
1331 callback[e.event](d);
1335 var BluetoothHealthChannel_setListener = function() {
1336 privUtils_.log('Entered BluetoothHealthChannel.setListener()');
1337 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1338 privUtils_.checkPrivilegeAccess4Ver(
1340 Privilege.BLUETOOTH,
1341 Privilege.BLUETOOTH_HEALTH
1343 var args = AV.validateArgs(arguments, [
1345 name: 'changeCallback',
1346 type: AV.Types.LISTENER,
1347 values: ['onmessage', 'onclose']
1351 if (T.isEmptyObject(_healthListeners)) {
1353 'BluetoothHealthChannelChangeCallback',
1354 _BluetoothHealthChannelChangeCallback
1357 _healthListeners[this._id] = args.changeCallback;
1360 BluetoothHealthChannel.prototype.setListener = function() {
1361 BluetoothHealthChannel_setListener.apply(this, arguments);
1364 var BluetoothHealthChannel_unsetListener = function() {
1365 privUtils_.log('Entered BluetoothHealthChannel.unsetListener ()');
1366 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1367 if (T.isEmptyObject(_healthListeners)) {
1368 privUtils_.checkPrivilegeAccess4Ver(
1370 Privilege.BLUETOOTH,
1371 Privilege.BLUETOOTH_HEALTH
1375 delete _healthListeners[this._id];
1377 if (T.isEmptyObject(_healthListeners)) {
1378 native.removeListener(
1379 'BluetoothHealthChannelChangeCallback',
1380 _BluetoothHealthChannelChangeCallback
1385 BluetoothHealthChannel.prototype.unsetListener = function() {
1386 privUtils_.printDeprecationWarningFor('BluetoothHealthChannel');
1387 BluetoothHealthChannel_unsetListener.apply(this, arguments);
1391 * Creates a manager for specified listener event.
1393 * @param {string} name - name of the listener this manager handles
1394 * @param {function} callback - function to be invoked when event specified by the name
1396 * This function should return false if the callback
1397 * doesn't want to handle the event anymore, true otherwise.
1398 * This function should have following signature:
1399 * bool callback(event, successCallback, errorCallback);
1401 * @return {object} object which allows to add or remove callbacks for specified listener
1403 function _singleListenerBuilder(name, callback) {
1404 var listenerName = name;
1405 var successCallback;
1407 var callbackFunction = callback;
1408 var listenerRegistered = false;
1410 function innerCallback(event) {
1411 if (!callbackFunction(event, successCallback, errorCallback)) {
1416 function addListener(s, e) {
1417 successCallback = s;
1420 if (!listenerRegistered) {
1421 native.addListener(listenerName, innerCallback);
1422 listenerRegistered = true;
1426 function removeListener() {
1427 if (listenerRegistered) {
1428 native.removeListener(listenerName, innerCallback);
1429 listenerRegistered = false;
1432 successCallback = undefined;
1433 errorCallback = undefined;
1437 addListener: addListener,
1438 removeListener: removeListener
1442 var _bleScanListener = _singleListenerBuilder('BluetoothLEScanCallback', function(
1450 switch (event.action) {
1452 d = new BluetoothLEDevice(event.data);
1456 if (errorCallback) {
1457 errorCallback(native.getErrorObject(event));
1462 privUtils_.log('Unknown mode: ' + event.action);
1465 if (successCallback) {
1472 var _bleAdvertiseListener = _singleListenerBuilder(
1473 'BluetoothLEAdvertiseCallback',
1474 function(event, successCallback, errorCallback) {
1478 switch (event.action) {
1480 if (successCallback) {
1481 successCallback(native.getResultObject(event));
1482 if (native.getResultObject(event) == 'STOPPED') {
1483 _bleAdvertiseListener.removeListener();
1489 if (errorCallback) {
1490 errorCallback(native.getErrorObject(event));
1495 privUtils_.log('Unknown mode: ' + event.action);
1501 //class BluetoothLEAdapter ///////////////////////////
1502 var BluetoothLEAdapter = function() {};
1504 BluetoothLEAdapter.prototype.startScan = function() {
1505 privUtils_.log('Entered BluetoothLEAdapter.startScan()');
1506 var args = AV.validateArgs(arguments, [
1508 name: 'successCallback',
1509 type: AV.Types.FUNCTION
1512 name: 'errorCallback',
1513 type: AV.Types.FUNCTION,
1519 var result = native.callSync('BluetoothLEAdapterStartScan', {});
1520 if (native.isFailure(result)) {
1521 throw native.getErrorObject(result);
1524 _bleScanListener.addListener(args.successCallback, args.errorCallback);
1527 BluetoothLEAdapter.prototype.stopScan = function() {
1528 privUtils_.log('Entered BluetoothLEAdapter.stopScan()');
1530 _bleScanListener.removeListener();
1532 var result = native.callSync('BluetoothLEAdapterStopScan', {});
1533 if (native.isFailure(result)) {
1534 throw native.getErrorObject(result);
1538 var _BluetoothAdvertisePacketType = {
1539 ADVERTISE: 'ADVERTISE',
1540 SCAN_RESPONSE: 'SCAN_RESPONSE'
1543 var _BluetoothAdvertisingMode = {
1544 BALANCED: 'BALANCED',
1545 LOW_LATENCY: 'LOW_LATENCY',
1546 LOW_ENERGY: 'LOW_ENERGY'
1549 BluetoothLEAdapter.prototype.startAdvertise = function() {
1550 privUtils_.log('Entered BluetoothLEAdapter.startAdvertise()');
1551 var args = AV.validateArgs(arguments, [
1553 name: 'advertiseData',
1554 type: AV.Types.PLATFORM_OBJECT,
1555 values: tizen.BluetoothLEAdvertiseData
1559 type: AV.Types.ENUM,
1560 values: T.getValues(_BluetoothAdvertisePacketType)
1563 name: 'successCallback',
1564 type: AV.Types.FUNCTION
1567 name: 'errorCallback',
1568 type: AV.Types.FUNCTION,
1574 type: AV.Types.ENUM,
1575 values: T.getValues(_BluetoothAdvertisingMode),
1580 name: 'connectable',
1581 type: AV.Types.BOOLEAN,
1588 advertiseData: args.advertiseData,
1589 packetType: args.packetType,
1590 mode: T.isNullOrUndefined(args.mode)
1591 ? _BluetoothAdvertisingMode.BALANCED
1593 connectable: T.isNullOrUndefined(args.connectable) ? true : args.connectable
1596 var result = native.callSync('BluetoothLEAdapterStartAdvertise', callArgs);
1598 if (native.isFailure(result)) {
1599 throw native.getErrorObject(result);
1602 _bleAdvertiseListener.addListener(args.successCallback, args.errorCallback);
1605 BluetoothLEAdapter.prototype.stopAdvertise = function() {
1606 privUtils_.log('Entered BluetoothLEAdapter.stopAdvertise()');
1608 var result = native.callSync('BluetoothLEAdapterStopAdvertise', {});
1610 if (native.isFailure(result)) {
1611 throw native.getErrorObject(result);
1615 BluetoothLEAdapter.prototype.addConnectStateChangeListener = function() {
1616 privUtils_.log('Entered BluetoothLEAdapter.addClientConnectStateChaneListener()');
1617 var args = AV.validateArgs(arguments, [
1620 type: AV.Types.LISTENER,
1621 values: ['onconnected', 'ondisconnected']
1625 var func = function(event) {
1626 if (args.listener[event.action]) {
1627 args.listener[event.action](new BluetoothLEDevice(event.address));
1631 return _bleConnectChangeListener.addListener(func);
1634 BluetoothLEAdapter.prototype.removeConnectStateChangeListener = function() {
1635 privUtils_.log('Entered BluetoothLEAdapter.removeConnectStateChangeListener()');
1637 var args = AV.validateArgs(arguments, [
1644 _bleConnectChangeListener.removeListener(args.watchID);
1647 //class BluetoothGATTService ///////////////////////////
1648 var BluetoothGATTService = function(data, address) {
1649 var handle_ = data.handle;
1650 var uuid_ = data.uuid;
1651 var serviceUuid_ = data.serviceUuid;
1652 //address_ is needed to control if device is still connected
1653 var address_ = address || data.address;
1655 function servicesGetter() {
1657 var result = native.callSync('BluetoothGATTClientServiceGetServices', {
1661 if (native.isSuccess(result)) {
1662 var resultObject = native.getResultObject(result);
1663 resultObject.forEach(function(s) {
1664 services.push(new BluetoothGATTService(s, address_));
1669 function characteristicsGetter() {
1670 var characteristics = [];
1671 var result = native.callSync('BluetoothGATTClientServiceGetCharacteristics', {
1676 if (native.isSuccess(result)) {
1677 var resultObject = native.getResultObject(result);
1678 resultObject.forEach(function(c) {
1679 if (!T.isNullOrUndefined(c)) {
1680 characteristics.push(new BluetoothGATTCharacteristic(c, address_));
1684 return characteristics;
1688 * If this function is called as a constructor of BluetoothGATTServerService's
1689 * base class, some properties have to be left configurable, to enable redefinition.
1690 * Otherwise, if this function is called to create BluetoothGATTService,
1691 * they are left non-configurable.
1693 * If BluetoothGATTService will be a base for any other class in the future,
1694 * the line below may have to be updated to take into account the new class.
1696 var isConfigurable = this instanceof BluetoothGATTServerService;
1698 Object.defineProperties(this, {
1699 uuid: { value: uuid_, writable: false, enumerable: true },
1700 serviceUuid: { value: serviceUuid_, writable: false, enumerable: true },
1703 configurable: isConfigurable,
1709 configurable: isConfigurable,
1711 get: characteristicsGetter
1716 var CurrentGATTServerEntityId = 0;
1717 function NextGattServerEntityID() {
1718 return ++CurrentGATTServerEntityId;
1721 function IsUuidValid(uuid) {
1723 BluetoothManager_UUIDIsValid16Bit(uuid) ||
1724 BluetoothManager_UUIDIsValid32Bit(uuid) ||
1725 BluetoothManager_UUIDIsValid128Bit(uuid)
1729 var ValidateBluetoothGATTServerServiceInit = function(initData) {
1730 initData = AV.validateArgs(
1732 initData['serviceUuid'],
1733 initData['isPrimary'] || true,
1734 initData['includedServices'] || [],
1735 initData['characteristics'] || []
1739 name: 'serviceUuid',
1740 type: AV.Types.STRING,
1741 validator: IsUuidValid
1745 type: AV.Types.BOOLEAN
1748 name: 'includedServices',
1749 type: AV.Types.ARRAY
1752 name: 'characteristics',
1753 type: AV.Types.ARRAY
1758 // "uuid" field is used to construct BluetoothGATTService, but it's not a part
1759 // of BluetoothGATTServerServiceInit dictionary.
1760 // In case of BluetoothGATTServerServices, its value is always the same as
1762 initData.uuid = initData.serviceUuid;
1766 //class BluetoothGATTServerService ///////////////////////////
1767 var BluetoothGATTServerService = function(data) {
1768 data = ValidateBluetoothGATTServerServiceInit(data);
1770 BluetoothGATTService.call(this, data, null);
1772 var services_ = data.includedServices.map(function(serviceData) {
1773 return new BluetoothGATTServerService(serviceData, null);
1775 var characteristics_ = data.characteristics.map(function(characteristicData) {
1776 return new BluetoothGATTServerCharacteristic(characteristicData, null);
1779 Object.defineProperties(this, {
1780 isPrimary: { value: data.isPrimary, writable: false, enumerable: true },
1784 return services_.slice();
1791 return characteristics_.slice();
1795 // This property is "private" and meant not to be used by users
1797 // It has to be enumerable, to be serialized with JSON.stringify()
1799 value: NextGattServerEntityID()
1804 BluetoothGATTServerService.prototype = Object.create(BluetoothGATTService.prototype);
1806 Object.defineProperty(BluetoothGATTServerService.prototype, 'constructor', {
1807 value: BluetoothGATTServerService,
1812 var numberArrayToByteArray = function(array) {
1815 array.forEach(function(b) {
1816 d.push(Converter.toOctet(b));
1821 //class BluetoothGATTCharacteristic ///////////////////////////
1822 var BluetoothGATTCharacteristic = function(data, address) {
1823 if (!T.isObject(data)) {
1826 var address_ = address;
1827 var handle_ = data.handle;
1828 var descriptors_ = data.descriptors.map(function(descriptor_data) {
1829 return new BluetoothGATTDescriptor(descriptor_data, address_);
1831 var isBroadcast_ = data.isBroadcast;
1832 var hasExtendedProperties_ = data.hasExtendedProperties;
1833 var isNotify_ = data.isNotify;
1834 var isIndication_ = data.isIndication;
1835 var isReadable_ = data.isReadable;
1836 var isSignedWrite_ = data.isSignedWrite;
1837 var isWritable_ = data.isWritable;
1838 var isWriteNoResponse_ = data.isWriteNoResponse;
1839 var uuid_ = data.uuid;
1842 * If this function is called as a constructor of BluetoothGATTServerCharacteristic's
1843 * base class, some properties have to be left configurable, to enable redefinition.
1844 * Otherwise, if this function is called to create BluetoothGATTCharacteristic,
1845 * they are left non-configurable.
1847 * If BluetoothGATTCharacteristic will be a base for any other class in the future,
1848 * the line below may have to be updated to take into account the new class.
1850 var isConfigurable = this instanceof BluetoothGATTServerCharacteristic;
1852 Object.defineProperties(this, {
1855 configurable: isConfigurable,
1857 return descriptors_.slice();
1864 return isBroadcast_;
1868 hasExtendedProperties: {
1871 return hasExtendedProperties_;
1885 return isIndication_;
1899 return isSignedWrite_;
1910 isWriteNoResponse: {
1913 return isWriteNoResponse_;
1926 this.readValue = function() {
1927 privUtils_.log('Entered BluetoothGATTCharacteristic.readValue()');
1928 var args = AV.validateArgs(arguments, [
1930 name: 'successCallback',
1931 type: AV.Types.FUNCTION
1934 name: 'errorCallback',
1935 type: AV.Types.FUNCTION,
1941 var callback = function(result) {
1942 if (native.isFailure(result)) {
1943 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1945 var d = numberArrayToByteArray(native.getResultObject(result));
1946 args.successCallback(d);
1950 var callArgs = { handle: handle_, address: address_ };
1952 var result = native.call('BluetoothGATTClientServiceReadValue', callArgs, callback);
1954 if (native.isFailure(result)) {
1955 throw native.getErrorObject(result);
1959 this.writeValue = function(value, successCallback, errorCallback) {
1960 privUtils_.log('Entered BluetoothGATTCharacteristic.writeValue()');
1961 var args = AV.validateArgs([successCallback, errorCallback], [
1963 name: 'successCallback',
1964 type: AV.Types.FUNCTION,
1969 name: 'errorCallback',
1970 type: AV.Types.FUNCTION,
1976 var callback = function(result) {
1977 if (native.isFailure(result)) {
1978 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1980 native.callIfPossible(args.successCallback);
1986 value: BluetoothManager_toByteArray(value),
1990 var result = native.call('BluetoothGATTClientServiceWriteValue', callArgs, callback);
1992 if (native.isFailure(result)) {
1993 throw native.getErrorObject(result);
1997 var addValueChangeListener = function() {
1998 privUtils_.log('Entered BluetoothGATTCharacteristic.addValueChangeListener()');
1999 privUtils_.checkPrivilegeAccess4Ver(
2001 Privilege.BLUETOOTH,
2002 Privilege.BLUETOOTH_ADMIN
2004 var args = AV.validateArgs(arguments, [
2007 type: AV.Types.FUNCTION
2011 var callArgs = { handle: handle_, address: address_ };
2013 var callback = function(event) {
2014 if (event.handle === handle_) {
2015 args.callback(numberArrayToByteArray(native.getResultObject(event)));
2019 return _bluetoothGATTCharacteristicListener.addListener(callback, callArgs);
2022 this.addValueChangeListener = function() {
2023 return addValueChangeListener.apply(this, arguments);
2026 this.removeValueChangeListener = function() {
2027 privUtils_.log('Entered BluetoothGATTCharacteristic.removeValueChangeListener()');
2029 var args = AV.validateArgs(arguments, [
2036 var callArgs = { handle: handle_, address: address_ };
2038 return _bluetoothGATTCharacteristicListener.removeListener(
2045 var ValidateBluetoothGATTServerCharacteristicInit = function(initData) {
2046 return AV.validateArgs(
2049 initData['descriptors'] || [],
2050 initData['isBroadcast'] || false,
2051 initData['hasExtendedProperties'] || false,
2052 initData['isNotify'] || false,
2053 initData['isIndication'] || false,
2054 initData['isReadable'] || false,
2055 initData['isSignedWrite'] || false,
2056 initData['isWritable'] || false,
2057 initData['isWriteNoResponse'] || false,
2058 initData['readPermission'] || false,
2059 initData['writePermission'] || false,
2060 initData['encryptedReadPermission'] || false,
2061 initData['encryptedWritePermission'] || false,
2062 initData['encryptedSignedReadPermission'] || false,
2063 initData['encryptedSignedWritePermission'] || false,
2064 initData['readValueRequestCallback'] || null,
2065 initData['writeValueRequestCallback'] || null
2070 type: AV.Types.STRING,
2071 validator: IsUuidValid
2074 name: 'descriptors',
2075 type: AV.Types.ARRAY
2078 name: 'isBroadcast',
2079 type: AV.Types.BOOLEAN
2082 name: 'hasExtendedProperties',
2083 type: AV.Types.BOOLEAN
2087 type: AV.Types.BOOLEAN
2090 name: 'isIndication',
2091 type: AV.Types.BOOLEAN
2095 type: AV.Types.BOOLEAN
2098 name: 'isSignedWrite',
2099 type: AV.Types.BOOLEAN
2103 type: AV.Types.BOOLEAN
2106 name: 'isWriteNoResponse',
2107 type: AV.Types.BOOLEAN
2110 name: 'readPermission',
2111 type: AV.Types.BOOLEAN
2114 name: 'writePermission',
2115 type: AV.Types.BOOLEAN
2118 name: 'encryptedReadPermission',
2119 type: AV.Types.BOOLEAN
2122 name: 'encryptedWritePermission',
2123 type: AV.Types.BOOLEAN
2126 name: 'encryptedSignedReadPermission',
2127 type: AV.Types.BOOLEAN
2130 name: 'encryptedSignedWritePermission',
2131 type: AV.Types.BOOLEAN
2134 name: 'readValueRequestCallback',
2135 type: AV.Types.FUNCTION,
2139 name: 'writeValueRequestCallback',
2140 type: AV.Types.FUNCTION,
2147 //class BluetoothGATTServerCharacteristic ///////////////////////////
2148 var BluetoothGATTServerCharacteristic = function(data) {
2149 data = ValidateBluetoothGATTServerCharacteristicInit(data);
2151 BluetoothGATTCharacteristic.call(this, data, null);
2153 var descriptors_ = data.descriptors.map(function(descriptor_data) {
2154 return new BluetoothGATTServerDescriptor(descriptor_data, null);
2157 Object.defineProperties(this, {
2161 return descriptors_.slice();
2168 return data.readPermission;
2175 return data.writePermission;
2179 encryptedReadPermission: {
2182 return data.encryptedReadPermission;
2186 encryptedWritePermission: {
2189 return data.encryptedWritePermission;
2193 encryptedSignedReadPermission: {
2196 return data.encryptedSignedReadPermission;
2200 encryptedSignedWritePermission: {
2203 return data.encryptedSignedWritePermission;
2207 // This property is "private" and meant not to be used by users
2209 // It has to be enumerable, to be serialized with JSON.stringify()
2211 value: NextGattServerEntityID()
2215 this.readValue = function() {
2216 throw new WebAPIException(
2217 'NotSupportedError',
2218 'This method cannot be called on BluetoothGATTServerCharacteristic'
2222 this.writeValue = function() {
2223 throw new WebAPIException(
2224 'NotSupportedError',
2225 'This method cannot be called on BluetoothGATTServerCharacteristic'
2229 this.addValueChangeListener = function() {
2230 throw new WebAPIException(
2231 'NotSupportedError',
2232 'This method cannot be called on BluetoothGATTServerCharacteristic'
2236 this.removeValueChangeListener = function() { /* Intended no operation */ };
2239 BluetoothGATTServerCharacteristic.prototype = Object.create(BluetoothGATTCharacteristic.prototype);
2241 Object.defineProperty(BluetoothGATTServerCharacteristic.prototype, 'constructor', {
2242 value: BluetoothGATTServerCharacteristic,
2248 * Creates a manager for specified listener event. Manager handles multiple
2249 * registered listeners
2251 * @param {string} name - name of the listener this manager handles
2252 * @param {function} callback - function to be invoked when event specified by the name
2254 * This function should have following signature:
2255 * void callback(listener, event);
2256 * @param {string} addListenerId - optional parameter. If specified, this native
2257 * method will be called synchronously when
2258 * listener is added.
2259 * @param {string} removeListenerId - optional parameter. If specified, this native
2260 * method will be called synchronously when
2261 * listener is removed.
2262 * @param {bool} repeatNativeCall - optional parameter. If specified, the addListenerId
2263 * and removeListenerId methods will be called
2264 * synchronously each time listener is added/removed.
2265 * Otherwise they are going to be called just once: when
2266 * first listener is added and last listener is removed.
2268 * @return {object} object which allows to add or remove callbacks for specified listener
2270 function _multipleListenerBuilder(
2277 var listenerName = name;
2278 var addId = addListenerId;
2279 var removeId = removeListenerId;
2280 var callbackFunction = callback;
2283 var jsListenerRegistered = false;
2284 var nativeListenerRegistered = false;
2285 var repeatNativeListenerCall = repeatNativeCall;
2287 function innerCallback(event) {
2288 for (var watchId in listeners) {
2289 if (listeners.hasOwnProperty(watchId)) {
2290 callbackFunction(listeners[watchId], event);
2295 function addListener(callback, args) {
2298 if (addId && (!nativeListenerRegistered || repeatNativeListenerCall)) {
2299 var result = native.callSync(addId, args || {});
2300 if (native.isFailure(result)) {
2301 throw native.getErrorObject(result);
2303 nativeListenerRegistered = true;
2306 if (!jsListenerRegistered) {
2307 native.addListener(listenerName, innerCallback);
2308 jsListenerRegistered = true;
2311 listeners[id] = callback;
2315 function removeListener(watchId, args) {
2316 if (listeners.hasOwnProperty(watchId)) {
2317 delete listeners[watchId];
2322 ((nativeListenerRegistered && T.isEmptyObject(listeners)) ||
2323 repeatNativeListenerCall)
2325 var result = native.callSync(removeId, args || {});
2326 if (native.isFailure(result)) {
2327 throw native.getErrorObject(result);
2329 nativeListenerRegistered = false;
2332 if (jsListenerRegistered && T.isEmptyObject(listeners)) {
2333 native.removeListener(listenerName, innerCallback);
2334 jsListenerRegistered = false;
2339 addListener: addListener,
2340 removeListener: removeListener
2344 var _bluetoothGATTCharacteristicListener = _multipleListenerBuilder(
2345 'BluetoothGATTCharacteristicValueChangeListener',
2346 function(listener, event) {
2349 'BluetoothGATTClientServiceAddValueChangeListener',
2350 'BluetoothGATTClientServiceRemoveValueChangeListener',
2356 * This object is used by:
2357 * - BluetoothLEDevice.addConnectStateChangeListener()
2358 * - BluetoothLEAdapter.addConnectStateChangeListener()
2360 var _bleConnectChangeListener = _multipleListenerBuilder(
2361 'BluetoothLEConnectChangeCallback',
2362 function(listener, event) {
2365 'BluetoothLEDeviceAddConnectStateChangeListener',
2366 'BluetoothLEDeviceRemoveConnectStateChangeListener'
2369 //class BluetoothGATTDescriptor ///////////////////////////
2370 var BluetoothGATTDescriptor = function(data, address) {
2371 var handle_ = data.handle;
2372 //address_ is needed to control if device is still connected
2373 var address_ = address;
2374 var uuid_ = data.uuid;
2376 this.readValue = function() {
2377 privUtils_.log('Entered BluetoothGATTDescriptor.readValue()');
2378 var args = AV.validateArgs(arguments, [
2380 name: 'successCallback',
2381 type: AV.Types.FUNCTION
2384 name: 'errorCallback',
2385 type: AV.Types.FUNCTION,
2391 var callback = function(result) {
2392 if (native.isFailure(result)) {
2393 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2395 var d = numberArrayToByteArray(native.getResultObject(result));
2396 args.successCallback(d);
2400 var callArgs = { handle: handle_, address: address_ };
2402 var result = native.call('BluetoothGATTClientServiceReadValue', callArgs, callback);
2404 if (native.isFailure(result)) {
2405 throw native.getErrorObject(result);
2409 this.writeValue = function(value, successCallback, errorCallback) {
2410 privUtils_.log('Entered BluetoothGATTDescriptor.writeValue()');
2411 var args = AV.validateArgs([successCallback, errorCallback], [
2413 name: 'successCallback',
2414 type: AV.Types.FUNCTION,
2419 name: 'errorCallback',
2420 type: AV.Types.FUNCTION,
2426 var callback = function(result) {
2427 if (native.isFailure(result)) {
2428 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2430 native.callIfPossible(args.successCallback);
2436 value: BluetoothManager_toByteArray(value),
2440 var result = native.call('BluetoothGATTClientServiceWriteValue', callArgs, callback);
2442 if (native.isFailure(result)) {
2443 throw native.getErrorObject(result);
2447 Object.defineProperties(this, {
2458 var ValidateBluetoothGATTServerDescriptorInit = function(initData) {
2459 return AV.validateArgs(
2462 initData['readPermission'] || false,
2463 initData['writePermission'] || false,
2464 initData['encryptedReadPermission'] || false,
2465 initData['encryptedWritePermission'] || false,
2466 initData['encryptedSignedReadPermission'] || false,
2467 initData['encryptedSignedWritePermission'] || false,
2468 initData['readValueRequestCallback'] || null,
2469 initData['writeValueRequestCallback'] || null
2474 type: AV.Types.STRING,
2475 validator: IsUuidValid
2478 name: 'readPermission',
2479 type: AV.Types.BOOLEAN
2482 name: 'writePermission',
2483 type: AV.Types.BOOLEAN
2486 name: 'encryptedReadPermission',
2487 type: AV.Types.BOOLEAN
2490 name: 'encryptedWritePermission',
2491 type: AV.Types.BOOLEAN
2494 name: 'encryptedSignedReadPermission',
2495 type: AV.Types.BOOLEAN
2498 name: 'encryptedSignedWritePermission',
2499 type: AV.Types.BOOLEAN
2502 name: 'readValueRequestCallback',
2503 type: AV.Types.FUNCTION,
2507 name: 'writeValueRequestCallback',
2508 type: AV.Types.FUNCTION,
2515 var BluetoothGATTServerDescriptor = function(data, address) {
2516 data = ValidateBluetoothGATTServerDescriptorInit(data);
2518 BluetoothGATTDescriptor.call(this, data, null);
2520 Object.defineProperties(this, {
2524 return data.readPermission;
2531 return data.writePermission;
2535 encryptedReadPermission: {
2538 return data.encryptedReadPermission;
2542 encryptedWritePermission: {
2545 return data.encryptedWritePermission;
2549 encryptedSignedReadPermission: {
2552 return data.encryptedSignedReadPermission;
2556 encryptedSignedWritePermission: {
2559 return data.encryptedSignedWritePermission;
2563 // This property is "private" and meant not to be used by users
2565 // It has to be enumerable, to be serialized with JSON.stringify()
2567 value: NextGattServerEntityID()
2571 this.readValue = function() {
2572 throw new WebAPIException(
2573 'NotSupportedError',
2574 'This method cannot be called on BluetoothGATTServerDescriptor'
2578 this.writeValue = function() {
2579 throw new WebAPIException(
2580 'NotSupportedError',
2581 'This method cannot be called on BluetoothGATTServerDescriptor'
2586 BluetoothGATTServerDescriptor.prototype = Object.create(BluetoothGATTDescriptor.prototype);
2588 Object.defineProperty(BluetoothGATTServerDescriptor.prototype, 'constructor', {
2589 value: BluetoothGATTServerDescriptor,
2594 // class BluetoothAdapter ///////////////////////////
2595 var BluetoothAdapter = function() {
2596 function nameGetter() {
2597 var result = native.callSync('BluetoothAdapterGetName', {});
2599 if (native.isFailure(result)) {
2602 return native.getResultObject(result);
2606 function addressGetter() {
2607 var result = native.callSync('BluetoothAdapterGetAddress', {});
2609 if (native.isFailure(result)) {
2612 return native.getResultObject(result);
2616 function poweredGetter() {
2617 var result = native.callSync('BluetoothAdapterGetPowered', {});
2619 if (native.isFailure(result)) {
2622 return native.getResultObject(result);
2626 function visibleGetter() {
2627 var result = native.callSync('BluetoothAdapterGetVisible', {});
2629 if (native.isFailure(result)) {
2632 return native.getResultObject(result);
2636 Object.defineProperties(this, {
2660 BluetoothAdapter.prototype.setName = function() {
2661 privUtils_.log('Entered BluetoothAdapter.setName()');
2662 var args = AV.validateArgs(arguments, [
2665 type: AV.Types.STRING
2668 name: 'successCallback',
2669 type: AV.Types.FUNCTION,
2674 name: 'errorCallback',
2675 type: AV.Types.FUNCTION,
2685 var callback = function(result) {
2686 if (native.isFailure(result)) {
2687 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2689 native.callIfPossible(args.successCallback);
2693 var result = native.call('BluetoothAdapterSetName', callArgs, callback);
2694 if (native.isFailure(result)) {
2695 throw native.getErrorObject(result);
2699 BluetoothAdapter.prototype.setPowered = function() {
2700 privUtils_.log('Entered BluetoothAdapter.setPowered()');
2701 privUtils_.printDeprecationWarningFor('setPowered()');
2703 'Let the user turn on/off Bluetooth through the Settings application instead.'
2706 var args = AV.validateArgs(arguments, [
2709 type: AV.Types.BOOLEAN
2712 name: 'successCallback',
2713 type: AV.Types.FUNCTION,
2718 name: 'errorCallback',
2719 type: AV.Types.FUNCTION,
2726 powered: args.powered
2729 var callback = function(result) {
2730 if (native.isFailure(result)) {
2731 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2733 native.callIfPossible(args.successCallback);
2737 var result = native.call('BluetoothAdapterSetPowered', callArgs, callback);
2738 if (native.isFailure(result)) {
2739 throw native.getErrorObject(result);
2743 // This method is deprecated since Tizen 2.3.
2744 BluetoothAdapter.prototype.setVisible = function() {
2745 privUtils_.log('Entered BluetoothAdapter.setVisible()');
2746 privUtils_.printDeprecationWarningFor('setVisible()');
2748 'Let the user change the Bluetooth visibility through the Settings ' +
2749 'application instead.'
2752 var args = AV.validateArgs(arguments, [
2755 type: AV.Types.BOOLEAN
2758 name: 'successCallback',
2759 type: AV.Types.FUNCTION,
2764 name: 'errorCallback',
2765 type: AV.Types.FUNCTION,
2771 type: AV.Types.UNSIGNED_LONG,
2778 visible: args.visible
2781 if (args.visible === true) {
2782 if (T.isNullOrUndefined(args.timeout)) {
2783 callArgs.timeout = 0;
2785 callArgs.timeout = args.timeout > 65535 ? 180 : args.timeout;
2789 var callback = function(result) {
2790 if (native.isFailure(result)) {
2791 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2793 native.callIfPossible(args.successCallback);
2797 var result = native.call('BluetoothAdapterSetVisible', callArgs, callback);
2798 if (native.isFailure(result)) {
2799 throw native.getErrorObject(result);
2805 function _BluetoothAdapterChangeCallback(event) {
2806 privUtils_.log('_BluetoothAdapterChangeCallback');
2812 case 'onstatechanged':
2816 case 'onnamechanged':
2820 case 'onvisibilitychanged':
2825 privUtils_.log('Unknown mode: ' + e.action);
2829 if (_listener[e.action]) {
2830 _listener[e.action](d);
2834 BluetoothAdapter.prototype.setChangeListener = function() {
2835 privUtils_.log('Entered BluetoothAdapter.setChangeListener()');
2836 var args = AV.validateArgs(arguments, [
2838 name: 'changeCallback',
2839 type: AV.Types.LISTENER,
2840 values: ['onstatechanged', 'onnamechanged', 'onvisibilitychanged']
2844 if (T.isNullOrUndefined(_listener)) {
2846 'BluetoothAdapterChangeCallback',
2847 _BluetoothAdapterChangeCallback
2849 native.callSync('BluetoothAdapterSetChangeListener', {});
2851 _listener = args.changeCallback;
2854 BluetoothAdapter.prototype.unsetChangeListener = function() {
2855 privUtils_.log('Entered BluetoothAdapter.unsetChangeListener()');
2856 if (!T.isNullOrUndefined(_listener)) {
2857 native.removeListener(
2858 'BluetoothAdapterChangeCallback',
2859 _BluetoothAdapterChangeCallback
2861 native.callSync('BluetoothAdapterUnsetChangeListener', {});
2862 _listener = undefined;
2866 var _discoverDevicesSuccessCallback;
2867 var _discoverDevicesErrorCallback;
2869 function _BluetoothDiscoverDevicesSuccessCallback(event) {
2877 case 'ondevicefound':
2878 d = new BluetoothDevice(e.data);
2881 case 'ondevicedisappeared':
2886 var result = e.data;
2888 result.forEach(function(data) {
2889 d.push(new BluetoothDevice(data));
2892 //remove listeners after discovering
2893 native.removeListener(
2894 'BluetoothDiscoverDevicesSuccessCallback',
2895 _BluetoothDiscoverDevicesSuccessCallback
2897 native.removeListener(
2898 'BluetoothDiscoverDevicesErrorCallback',
2899 _BluetoothDiscoverDevicesErrorCallback
2904 privUtils_.log('Unknown mode: ' + e.action);
2908 if (_discoverDevicesSuccessCallback[e.action]) {
2909 _discoverDevicesSuccessCallback[e.action](d);
2913 function _BluetoothDiscoverDevicesErrorCallback(event) {
2915 setTimeout(function() {
2916 native.callIfPossible(_discoverDevicesErrorCallback, native.getErrorObject(e));
2920 BluetoothAdapter.prototype.discoverDevices = function() {
2921 privUtils_.log('Entered BluetoothAdapter.discoverDevices()');
2922 var args = AV.validateArgs(arguments, [
2924 name: 'successCallback',
2925 type: AV.Types.LISTENER,
2926 values: ['onstarted', 'ondevicefound', 'ondevicedisappeared', 'onfinished']
2929 name: 'errorCallback',
2930 type: AV.Types.FUNCTION,
2936 _discoverDevicesSuccessCallback = args.successCallback;
2937 _discoverDevicesErrorCallback = args.errorCallback;
2939 'BluetoothDiscoverDevicesSuccessCallback',
2940 _BluetoothDiscoverDevicesSuccessCallback
2943 'BluetoothDiscoverDevicesErrorCallback',
2944 _BluetoothDiscoverDevicesErrorCallback
2947 var result = native.callSync('BluetoothAdapterDiscoverDevices', {});
2949 if (native.isFailure(result)) {
2950 native.removeListener(
2951 'BluetoothDiscoverDevicesSuccessCallback',
2952 _BluetoothDiscoverDevicesSuccessCallback
2954 native.removeListener(
2955 'BluetoothDiscoverDevicesErrorCallback',
2956 _BluetoothDiscoverDevicesErrorCallback
2958 throw native.getErrorObject(result);
2962 BluetoothAdapter.prototype.stopDiscovery = function() {
2963 privUtils_.log('Entered BluetoothAdapter.stopDiscovery()');
2964 var args = AV.validateArgs(arguments, [
2966 name: 'successCallback',
2967 type: AV.Types.FUNCTION,
2972 name: 'errorCallback',
2973 type: AV.Types.FUNCTION,
2979 var callback = function(result) {
2980 if (native.isFailure(result)) {
2981 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
2983 native.callIfPossible(args.successCallback);
2987 var result = native.call('BluetoothAdapterStopDiscovery', {}, callback);
2988 if (native.isFailure(result)) {
2989 throw native.getErrorObject(result);
2993 BluetoothAdapter.prototype.getKnownDevices = function() {
2994 privUtils_.log('Entered BluetoothAdapter.getKnownDevices()');
2995 var args = AV.validateArgs(arguments, [
2997 name: 'successCallback',
2998 type: AV.Types.FUNCTION
3001 name: 'errorCallback',
3002 type: AV.Types.FUNCTION,
3008 var callback = function(result) {
3009 if (native.isFailure(result)) {
3010 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3012 var r = native.getResultObject(result).devices;
3014 r.forEach(function(data) {
3015 devices.push(new BluetoothDevice(data));
3017 args.successCallback(devices);
3021 var result = native.call('BluetoothAdapterGetKnownDevices', {}, callback);
3022 if (native.isFailure(result)) {
3023 throw native.getErrorObject(result);
3027 BluetoothAdapter.prototype.getDevice = function() {
3028 privUtils_.log('Entered BluetoothAdapter.getDevice()');
3029 var args = AV.validateArgs(arguments, [
3032 type: AV.Types.STRING
3035 name: 'successCallback',
3036 type: AV.Types.FUNCTION
3039 name: 'errorCallback',
3040 type: AV.Types.FUNCTION,
3046 var callback = function(result) {
3047 if (native.isFailure(result)) {
3048 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3050 args.successCallback(new BluetoothDevice(native.getResultObject(result)));
3054 var result = native.call(
3055 'BluetoothAdapterGetDevice',
3056 { address: args.address },
3059 if (native.isFailure(result)) {
3060 throw native.getErrorObject(result);
3064 BluetoothAdapter.prototype.createBonding = function() {
3065 privUtils_.log('Entered BluetoothAdapter.createBonding()');
3066 var args = AV.validateArgs(arguments, [
3069 type: AV.Types.STRING
3072 name: 'successCallback',
3073 type: AV.Types.FUNCTION,
3078 name: 'errorCallback',
3079 type: AV.Types.FUNCTION,
3086 address: args.address
3089 var callback = function(result) {
3090 if (native.isFailure(result)) {
3091 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3093 args.successCallback(new BluetoothDevice(native.getResultObject(result)));
3097 var result = native.call('BluetoothAdapterCreateBonding', callArgs, callback);
3098 if (native.isFailure(result)) {
3099 throw native.getErrorObject(result);
3103 BluetoothAdapter.prototype.destroyBonding = function() {
3104 privUtils_.log('Entered BluetoothAdapter.destroyBonding()');
3105 var args = AV.validateArgs(arguments, [
3108 type: AV.Types.STRING
3111 name: 'successCallback',
3112 type: AV.Types.FUNCTION,
3117 name: 'errorCallback',
3118 type: AV.Types.FUNCTION,
3125 address: args.address
3128 var callback = function(result) {
3129 if (native.isFailure(result)) {
3130 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3132 native.callIfPossible(args.successCallback);
3136 var result = native.call('BluetoothAdapterDestroyBonding', callArgs, callback);
3137 if (native.isFailure(result)) {
3138 throw native.getErrorObject(result);
3142 BluetoothAdapter.prototype.registerRFCOMMServiceByUUID = function() {
3143 privUtils_.log('Entered BluetoothAdapter.registerRFCOMMServiceByUUID()');
3144 var args = AV.validateArgs(arguments, [
3147 type: AV.Types.STRING
3151 type: AV.Types.STRING
3154 name: 'successCallback',
3155 type: AV.Types.FUNCTION
3158 name: 'errorCallback',
3159 type: AV.Types.FUNCTION,
3170 var callback = function(result) {
3171 if (native.isFailure(result)) {
3172 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
3174 // if registration was finished with success create BluetoothServiceHandler
3175 // with parameters passed to this function (uuid and name).
3176 args.successCallback(new BluetoothServiceHandler(callArgs));
3180 var result = native.call(
3181 'BluetoothAdapterRegisterRFCOMMServiceByUUID',
3185 if (native.isFailure(result)) {
3186 throw native.getErrorObject(result);
3190 BluetoothAdapter.prototype.getBluetoothProfileHandler = function() {
3191 privUtils_.log('Entered BluetoothAdapter.getBluetoothProfileHandler()');
3192 privUtils_.printDeprecationWarningFor('getBluetoothProfileHandler');
3193 var args = AV.validateArgs(arguments, [
3195 name: 'profileType',
3196 type: AV.Types.ENUM,
3197 values: T.getValues(_BluetoothProfileType)
3201 var callArgs = { profileType: args.profileType };
3203 var result = native.callSync('BluetoothAdapterGetBluetoothProfileHandler', callArgs);
3205 if (native.isFailure(result)) {
3206 throw native.getErrorObject(result);
3208 switch (args.profileType) {
3209 case _BluetoothProfileType.HEALTH:
3210 return new BluetoothHealthProfileHandler(callArgs);
3213 throw new WebAPIException(
3214 'NotSupportedError',
3215 'Profile ' + args.profileType + ' is not supported.'
3221 // class BluetoothGATTServer ////////////////////////
3222 var _BluetoothGATTServerServices = [];
3225 * This set is used in BluetoothGATTServer::start() to check which services
3226 * from BluetoothGATTServer::services have already been registered in native
3227 * layer and which have to be registered.
3229 var _BluetoothGATTServerServicesRegisteredInNativeLayer = {};
3231 var BluetoothGATTServer = function() {
3232 Object.defineProperties(this, {
3236 return _BluetoothGATTServerServices;
3243 var AbortError = new WebAPIException('AbortError', 'An unknown error occurred');
3245 var BluetoothGATTServer_valid_registerService_errors = [
3246 'InvalidStateError',
3247 'NotSupportedError',
3248 'InvalidValuesError',
3251 var BluetoothGATTServer_valid_registerService_exceptions = [
3252 'InvalidStateError',
3253 'TypeMismatchError',
3257 BluetoothGATTServer.prototype.registerService = function() {
3258 var args = AV.validateArgs(arguments, [
3261 type: AV.Types.DICTIONARY
3264 name: 'successCallback',
3265 type: AV.Types.FUNCTION,
3270 name: 'errorCallback',
3271 type: AV.Types.FUNCTION,
3277 var service = new BluetoothGATTServerService(args.service);
3279 var callback = function(result) {
3280 if (native.isFailure(result)) {
3281 native.callIfPossible(
3283 native.getErrorObjectAndValidate(
3285 BluetoothGATTServer_valid_registerService_errors,
3290 _BluetoothGATTServerServicesRegisteredInNativeLayer[service._id] = true;
3291 _BluetoothGATTServerServices.push(service);
3292 native.callIfPossible(args.successCallback);
3296 var result = native.call('BluetoothGATTServerRegisterService', service, callback);
3297 if (native.isFailure(result)) {
3298 throw native.getErrorObjectAndValidate(
3300 BluetoothGATTServer_valid_registerService_exceptions,
3307 * Objects of this class are used to wait for multiple callbacks results.
3309 * Its successCallback and errorCallback members should be passed as
3310 * the success and error callbacks, respectively, to the functions we wait for.
3311 * When the functions we wait for are called callbacksNum times, either
3312 * onAllSucceeded or onFailure is called, depending on whether only
3313 * successCallback was called or not.
3315 * For the usage example, take a look at BluetoothGATTServer.prototype.start,
3316 * where it's used to wait for registration of multiple services.
3318 var ResultCallbacksAggregator = function(callbacksNum, onAllSucceeded, onFailure) {
3319 var _callbacksNum = callbacksNum;
3320 var _allSucceeded = true;
3323 this.successCallback = function (){
3326 if (!_callbacksNum) {
3327 if (_allSucceeded) {
3335 this.errorCallback = function(error) {
3337 _allSucceeded = false;
3340 if (!_callbacksNum) {
3346 var BluetoothGATTServer_valid_start_errors = ['InvalidStateError', 'NotSupportedError', 'AbortError'];
3347 var BluetoothGATTServer_valid_start_exceptions = ['InvalidStateError', 'TypeMismatchError', 'SecurityError'];
3349 BluetoothGATTServer.prototype.start = function() {
3350 privUtils_.log('Entered BluetoothGATTServer.start()');
3351 var args = AV.validateArgs(arguments, [
3353 name: 'successCallback',
3354 type: AV.Types.FUNCTION,
3359 name: 'errorCallback',
3360 type: AV.Types.FUNCTION,
3366 var servicesUnregisteredInNativeLayer = [];
3367 for (var i = 0; i < this.services.length; ++i) {
3368 if(this.services[i]) {
3369 if (!_BluetoothGATTServerServicesRegisteredInNativeLayer[this.services[i]._id]) {
3370 servicesUnregisteredInNativeLayer.push(this.services[i]);
3375 var startServerCallback = function(result) {
3376 if (native.isFailure(result)) {
3377 native.callIfPossible(args.errorCallback,
3378 native.getErrorObjectAndValidate(result,
3379 BluetoothGATTServer_valid_start_errors, AbortError));
3381 native.callIfPossible(args.successCallback);
3385 if (servicesUnregisteredInNativeLayer.length) {
3386 var registerServiceCallbacksAggregator = new ResultCallbacksAggregator(servicesUnregisteredInNativeLayer.length,
3387 function onAllSucceeded() {
3389 var result = native.call('BluetoothGATTServerStart', {}, startServerCallback);
3391 if (native.isFailure(result)) {
3392 throw native.getErrorObjectAndValidate(result, BluetoothGATTServer_valid_start_exceptions, AbortError);
3395 function onFailure(error) {
3396 native.callIfPossible(args.errorCallback,
3397 native.getErrorObjectAndValidate(error,
3398 BluetoothGATTServer_valid_start_errors, AbortError));
3401 var registerServicesCallback = function(result) {
3402 if (native.isFailure(result)) {
3403 registerServiceCallbacksAggregator.errorCallback(
3404 native.getErrorObjectAndValidate(result,
3405 BluetoothGATTServer_valid_start_errors, AbortError));
3407 registerServiceCallbacksAggregator.successCallback();
3411 for (var i = 0; i < servicesUnregisteredInNativeLayer.length; ++i) {
3412 var result = native.call('BluetoothGATTServerRegisterService', servicesUnregisteredInNativeLayer[i], registerServicesCallback);
3413 if (native.isFailure(result)) {
3414 throw native.getErrorObjectAndValidate(
3416 BluetoothGATTServer_valid_registerService_exceptions,
3422 var result = native.call('BluetoothGATTServerStart', {}, startServerCallback);
3424 if (native.isFailure(result)) {
3425 throw native.getErrorObjectAndValidate(result, BluetoothGATTServer_valid_start_exceptions, AbortError);
3430 var BluetoothGATTServer_valid_stop_errors = ['InvalidStateError', 'NotSupportedError', 'AbortError'];
3431 var BluetoothGATTServer_valid_stop_exceptions = ['InvalidStateError', 'TypeMismatchError', 'SecurityError'];
3433 BluetoothGATTServer.prototype.stop = function() {
3434 privUtils_.log('Entered BluetoothGATTServer.stop()');
3435 var args = AV.validateArgs(arguments, [
3437 name: 'successCallback',
3438 type: AV.Types.FUNCTION,
3443 name: 'errorCallback',
3444 type: AV.Types.FUNCTION,
3450 var callback = function(result) {
3451 if (native.isFailure(result)) {
3452 native.callIfPossible(args.errorCallback,
3453 native.getErrorObjectAndValidate(result,
3454 BluetoothGATTServer_valid_stop_errors, AbortError));
3456 _BluetoothGATTServerServicesRegisteredInNativeLayer = {};
3457 native.callIfPossible(args.successCallback);
3461 var result = native.call('BluetoothGATTServerStop', {}, callback);
3462 if (native.isFailure(result)) {
3463 throw native.getErrorObjectAndValidate(result, BluetoothGATTServer_valid_stop_exceptions, AbortError);
3467 var BluetoothGATTServer_valid_getConnectionMtu_errors = ['InvalidStateError', 'NotSupportedError', 'UnknownError'];
3468 var BluetoothGATTServer_valid_getConnectionMtu_exceptions = ['TypeMismatchError', 'SecurityError'];
3470 BluetoothGATTServer.prototype.getConnectionMtu = function() {
3471 privUtils_.log('Entered BluetoothGATTServer.getConnectionMtu()');
3472 var args = AV.validateArgs(arguments, [
3474 name: 'clientAddress',
3475 type: AV.Types.STRING
3478 name: 'successCallback',
3479 type: AV.Types.FUNCTION
3482 name: 'errorCallback',
3483 type: AV.Types.FUNCTION,
3488 var callback = function(result) {
3489 if (native.isFailure(result)) {
3490 native.callIfPossible(args.errorCallback,
3491 native.getErrorObjectAndValidate(result,
3492 BluetoothGATTServer_valid_getConnectionMtu_errors, UnknownError));
3494 args.successCallback(native.getResultObject(result));
3498 var result = native.call('BluetoothGATTServerGetConnectionMtu',
3499 {clientAddress: args.clientAddress}, callback);
3500 if (native.isFailure(result)) {
3501 throw native.getErrorObjectAndValidate(result, BluetoothGATTServer_valid_getConnectionMtu_exceptions,
3506 var GATTServer = new BluetoothGATTServer();
3508 // class BluetoothManager ///////////////////////////
3509 var BluetoothManager = function() {
3510 Object.defineProperties(this, {
3512 value: new BluetoothClassDeviceMajor(),
3517 value: new BluetoothClassDeviceMinor(),
3522 value: new BluetoothClassDeviceService(),
3527 value: '00000000-0000-1000-8000-00805F9B34FB',
3534 var BluetoothManager_getDefaultAdapter = function() {
3535 privUtils_.checkPrivilegeAccess4Ver(
3537 Privilege.BLUETOOTH,
3538 Privilege.BLUETOOTH_GAP
3541 return new BluetoothAdapter();
3544 BluetoothManager.prototype.getDefaultAdapter = function() {
3545 privUtils_.log('Entered BluetoothManager.getDefaultAdapter()');
3546 return BluetoothManager_getDefaultAdapter();
3549 var BluetoothManager_getLEAdapter = function() {
3550 privUtils_.checkPrivilegeAccess4Ver(
3552 Privilege.BLUETOOTH,
3553 Privilege.BLUETOOTH_ADMIN
3556 return new BluetoothLEAdapter();
3559 BluetoothManager.prototype.getLEAdapter = function() {
3560 privUtils_.log('Entered BluetoothManager.getLEAdapter()');
3561 return BluetoothManager_getLEAdapter();
3564 var BluetoothManager_checkAndNormalizeHexString = function(hexString) {
3565 hexString = hexString.toLowerCase();
3566 if (hexString.startsWith('0x')) {
3567 hexString = hexString.substring(2);
3569 if (!(/^[0-9a-f]+$/.test(hexString))) {
3570 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Given string is not hexadecimal value');
3572 if ('0' === hexString) {
3575 if (1 === hexString.length%2) {
3576 // to save consistency with BluetoothLEManufacturerData, last character is omitted
3577 hexString = hexString.replace(/.$/,'');
3582 var BluetoothManager_HexStringToUint8Array = function(hexString) {
3583 hexString = BluetoothManager_checkAndNormalizeHexString(hexString);
3584 if (0 === hexString.length) {
3585 return new Uint8Array([]);
3587 var data = hexString.match(/[0-9a-f]{2}/g).map(function(byte) {return parseInt(byte, 16)});
3588 return new Uint8Array(data);
3591 var BluetoothManager_byteArrayToHexString = function(bytes) {
3592 if (0 == bytes.length) {
3595 return '0x' + Array.prototype.map.call(bytes, function(byte) {
3596 return ('0' + (byte & 0xFF).toString(16)).slice(-2);
3600 var BluetoothManager_toByteArray = function(data) {
3601 if (data && String === data.constructor) {
3602 return numberArrayToByteArray(BluetoothManager_HexStringToUint8Array(data));
3605 data = numberArrayToByteArray(data);
3608 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'argument is not a valid Bytes type');
3614 BluetoothManager.prototype.toByteArray = function(data) {
3615 privUtils_.log('Entered BluetoothManager.toByteArray()');
3616 return BluetoothManager_toByteArray(data);
3619 var BluetoothManager_toDOMString = function(data) {
3620 if (String === data.constructor) {
3621 data = BluetoothManager_checkAndNormalizeHexString(data);
3622 if (0 !== data.length) {
3627 return BluetoothManager_byteArrayToHexString(numberArrayToByteArray(data));
3631 BluetoothManager.prototype.toDOMString = function(data) {
3632 privUtils_.log('Entered BluetoothManager.toDOMString()');
3633 return BluetoothManager_toDOMString(data);
3636 var BluetoothManager_toUint8Array = function(data) {
3637 if (String === data.constructor) {
3638 return BluetoothManager_HexStringToUint8Array(data);
3641 data = new Uint8Array(numberArrayToByteArray(data));
3644 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'argument is not a valid Bytes type');
3650 BluetoothManager.prototype.toUint8Array = function(data) {
3651 privUtils_.log('Entered BluetoothManager.toUint8Array()');
3652 return BluetoothManager_toUint8Array(data);
3655 var BluetoothManager_UUIDIsValid128Bit = function(uuid) {
3656 var re128BitFormat = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
3657 if (re128BitFormat.test(uuid)) {
3663 var BluetoothManager_UUIDIsValid32Bit = function(uuid) {
3664 var re32BitFormat = /^[0-9a-f]{8}$/;
3665 if (re32BitFormat.test(uuid)) {
3671 var BluetoothManager_UUIDIsValid16Bit = function(uuid) {
3672 var re16BitFormat = /^[0-9a-f]{4}$/;
3673 if (re16BitFormat.test(uuid)) {
3679 var BluetoothManager_UUIDIsConvertibleTo16Bit = function(uuid) {
3680 var re128BitFormat = /^0000[0-9a-f]{4}-0000-1000-8000-00805f9b34fb$/;
3681 if (re128BitFormat.test(uuid)) {
3684 var re32BitFormat = /^0000[0-9a-f]{4}$/;
3685 if (re32BitFormat.test(uuid)) {
3691 var BluetoothManager_UUIDIsConvertibleTo32Bit = function(uuid) {
3692 var re = /^[0-9a-f]{8}-0000-1000-8000-00805f9b34fb$/;
3693 if (re.test(uuid)) {
3699 var BluetoothManager_UUIDTo128bit = function(uuid) {
3700 uuid = Converter.toString(uuid).toLowerCase();
3701 if (BluetoothManager_UUIDIsValid128Bit(uuid)) {
3704 var baseUuidLast96Bits = '-0000-1000-8000-00805f9b34fb';
3705 if (BluetoothManager_UUIDIsValid16Bit(uuid)) {
3706 return '0000' + uuid + baseUuidLast96Bits;
3708 if (BluetoothManager_UUIDIsValid32Bit(uuid)) {
3709 return uuid + baseUuidLast96Bits;
3711 throw new WebAPIException(
3712 WebAPIException.INVALID_VALUES_ERR,
3713 'Given parameter is not a supported uuid format: ' + uuid
3717 var BluetoothManager_UUIDToShortestPossible = function(uuid) {
3718 uuid = uuid.toLowerCase();
3719 if (BluetoothManager_UUIDIsValid16Bit(uuid)) {
3722 if (BluetoothManager_UUIDIsValid32Bit(uuid)) {
3723 if (BluetoothManager_UUIDIsConvertibleTo16Bit(uuid)) {
3724 return uuid.substring(4, 8);
3727 if (!BluetoothManager_UUIDIsValid128Bit(uuid)) {
3728 throw new WebAPIException(
3729 WebAPIException.INVALID_VALUES_ERR,
3730 'Given parameter is not a supported uuid format: ' + uuid
3733 if (BluetoothManager_UUIDIsConvertibleTo16Bit(uuid)) {
3734 return uuid.substring(4, 8);
3736 if (BluetoothManager_UUIDIsConvertibleTo32Bit(uuid)) {
3737 return uuid.substring(0, 8);
3742 var BluetoothManager_UUIDsEqual = function(uuid1, uuid2) {
3743 uuid1 = Converter.toString(uuid1).toLowerCase();
3744 uuid1 = BluetoothManager_UUIDTo128bit(uuid1);
3745 uuid2 = Converter.toString(uuid2).toLowerCase();
3746 uuid2 = BluetoothManager_UUIDTo128bit(uuid2);
3747 return uuid1 === uuid2;
3750 BluetoothManager.prototype.uuidTo128bit = function(uuid) {
3751 privUtils_.log('Entered BluetoothManager.uuidTo128bit()');
3752 var args = AV.validateArgs(arguments, [
3755 type: AV.Types.STRING
3758 return BluetoothManager_UUIDTo128bit(args.uuid);
3761 BluetoothManager.prototype.uuidToShortestPossible = function(uuid) {
3762 privUtils_.log('Entered BluetoothManager.uuidToShortestPossible()');
3763 var args = AV.validateArgs(arguments, [
3766 type: AV.Types.STRING
3769 return BluetoothManager_UUIDToShortestPossible(args.uuid);
3772 BluetoothManager.prototype.uuidsEqual = function(uuid1, uuid2) {
3773 privUtils_.log('Entered BluetoothManager.uuidsEqual()');
3774 var args = AV.validateArgs(arguments, [
3777 type: AV.Types.STRING
3781 type: AV.Types.STRING
3784 return BluetoothManager_UUIDsEqual(args.uuid1, args.uuid2);
3786 BluetoothManager.prototype.getGATTServer = function() {
3787 privUtils_.log('Entered BluetoothManager.getGATTServer()');
3788 return BluetoothManager_getGATTServer();
3791 var BluetoothManager_getGATTServer = function() {
3795 // exports //////////////////////////////////////////
3796 exports = new BluetoothManager();