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 privUtils_ = xwalk.utils;
18 var privilege_ = privUtils_.privilege;
19 var validator_ = privUtils_.validator;
20 var types_ = validator_.Types;
21 var type_ = privUtils_.type;
22 var converter_ = privUtils_.converter;
23 var native_ = new xwalk.utils.NativeManager(extension);
26 var NDEFRecordTextEncoding = {
32 GENERIC_TARGET: 'GENERIC_TARGET',
33 ISO14443_A: 'ISO14443_A',
34 ISO14443_4A: 'ISO14443_4A',
35 ISO14443_3A: 'ISO14443_3A',
36 MIFARE_MINI: 'MIFARE_MINI',
37 MIFARE_1K: 'MIFARE_1K',
38 MIFARE_4K: 'MIFARE_4K',
39 MIFARE_ULTRA: 'MIFARE_ULTRA',
40 MIFARE_DESFIRE: 'MIFARE_DESFIRE',
41 ISO14443_B: 'ISO14443_B',
42 ISO14443_4B: 'ISO14443_4B',
43 ISO14443_BPRIME: 'ISO14443_BPRIME',
47 UNKNOWN_TARGET: 'UNKNOWN_TARGET'
50 var CardEmulationMode = {
51 ALWAYS_ON: 'ALWAYS_ON',
55 var SecureElementType = {
61 var CardEmulationCategoryType = {
67 DEACTIVATED: 'DEACTIVATED',
68 ACTIVATED: 'ACTIVATED',
69 APDU_RECEIVED: 'APDU_RECEIVED'
72 function HCEEventData(data) {
73 Object.defineProperties(this, {
75 value: data.eventType,
80 value: data.apdu || [],
85 value: data.length || 0,
92 function ListenerManager(native, listenerName) {
95 this.nativeSet = false;
97 this.listenerName = listenerName;
100 ListenerManager.prototype.onListenerCalled = function(msg) {
101 for (var key in this.listeners) {
102 if (this.listeners.hasOwnProperty(key)) {
103 if ('CardElement' === msg.type) {
104 this.listeners[key](msg.mode);
105 } else if ('Transaction' === msg.type) {
106 this.listeners[key](msg.aid, msg.data);
107 } else if('HCEEventData' === msg.type) {
108 var hceData = new HCEEventData(msg.result);
109 this.listeners[key](hceData);
115 ListenerManager.prototype.addListener = function(callback) {
116 var id = this.nextId;
117 if (!this.nativeSet) {
118 this.native.addListener(this.listenerName, this.onListenerCalled.bind(this));
119 this.nativeSet = true;
121 this.listeners[id] = callback;
126 ListenerManager.prototype.removeListener = function(watchId) {
127 if (this.listeners.hasOwnProperty(watchId)) {
128 delete this.listeners[watchId];
132 var PEER_LISTENER = 'PeerListener';
133 var RECEIVE_NDEF_LISTENER = 'ReceiveNDEFListener';
134 var CARD_EMULATION_MODE_LISTENER = 'CardEmulationModeChanged';
135 var ACTIVE_SECURE_ELEMENT_LISTENER = 'ActiveSecureElementChanged';
136 var TRANSACTION_EVENT_ESE_LISTENER = 'TransactionEventListener_ESE';
137 var TRANSACTION_EVENT_UICC_LISTENER = 'TransactionEventListener_UICC';
138 var HCE_EVENT_LISTENER = 'HCEEventListener';
139 var TAG_LISTENER = 'TagListener';
140 var cardEmulationModeListener = new ListenerManager(native_, CARD_EMULATION_MODE_LISTENER);
141 var activeSecureElementChangeListener = new ListenerManager(native_, ACTIVE_SECURE_ELEMENT_LISTENER);
142 var transactionEventListenerEse = new ListenerManager(native_, TRANSACTION_EVENT_ESE_LISTENER);
143 var transactionEventListenerUicc = new ListenerManager(native_, TRANSACTION_EVENT_UICC_LISTENER);
144 var HCEEventListener = new ListenerManager(native_, HCE_EVENT_LISTENER);
147 //////////////////NFCManager /////////////////
149 function NFCManager() {
150 Object.defineProperties(this, {
151 NFC_RECORD_TNF_EMPTY: {value: 0, writable: false, enumerable: true},
152 NFC_RECORD_TNF_WELL_KNOWN: {value: 1, writable: false, enumerable: true},
153 NFC_RECORD_TNF_MIME_MEDIA: {value: 2, writable: false, enumerable: true},
154 NFC_RECORD_TNF_URI: {value: 3, writable: false, enumerable: true},
155 NFC_RECORD_TNF_EXTERNAL_RTD: {value: 4, writable: false, enumerable: true},
156 NFC_RECORD_TNF_UNKNOWN: {value: 5, writable: false, enumerable: true},
157 NFC_RECORD_TNF_UNCHANGED: {value: 6, writable: false, enumerable: true}
161 NFCManager.prototype.getDefaultAdapter = function() {
162 // First check NFC suppor on C++ level
163 var result = native_.callSync(
164 'NFCManager_getDefaultAdapter',
167 if (native_.isFailure(result)) {
168 throw native_.getErrorObject(result);
171 // If NFC is supported then return new NFCAdapter instance
172 return new NFCAdapter();
175 NFCManager.prototype.setExclusiveMode = function() {
177 var args = validator_.validateArgs(arguments, [
178 {name: 'exclusiveMode', type: types_.BOOLEAN}
181 var result = native_.callSync('NFCManager_setExclusiveMode', {
182 exclusiveMode: args.exclusiveMode
185 if (native_.isFailure(result)) {
186 throw native_.getErrorObject(result);
190 //////////////////NFCAdapter /////////////////
192 function NFCAdapter() {
193 function poweredGetter() {
194 var ret = native_.callSync('NFCAdapter_getPowered');
196 if (native_.isFailure(ret)) {
200 return native_.getResultObject(ret);
203 function cardEmulationModeGetter() {
204 var result = native_.callSync('NFCAdapter_cardEmulationModeGetter');
206 if (native_.isFailure(result)) {
207 throw native_.getErrorObject(result);
210 return native_.getResultObject(result);
213 function cardEmulationModeSetter(cem) {
215 var args = validator_.validateArgs(arguments, [
216 {name: 'emulationMode', type: types_.STRING}
219 var result = native_.callSync(
220 'NFCAdapter_cardEmulationModeSetter',
221 { 'emulationMode': args.emulationMode}
224 if (native_.isFailure(result)) {
225 throw native_.getErrorObject(result);
230 function activeSecureElementGetter() {
232 var result = native_.callSync('NFCAdapter_activeSecureElementGetter');
234 if (native_.isFailure(result)) {
235 throw native_.getErrorObject(result);
238 return native_.getResultObject(result);
241 function activeSecureElementSetter(ase) {
243 var args = validator_.validateArgs(arguments, [
244 {name: 'secureElement', type: types_.STRING}
247 var result = native_.callSync(
248 'NFCAdapter_activeSecureElementSetter',
249 { 'secureElement': args.secureElement}
252 if (native_.isFailure(result)) {
253 throw native_.getErrorObject(result);
258 Object.defineProperties(this, {
259 powered: {enumerable: true,
263 cardEmulationMode: {enumerable: true,
264 set: cardEmulationModeSetter,
265 get: cardEmulationModeGetter
267 activeSecureElement: {enumerable: true,
268 set: activeSecureElementSetter,
269 get: activeSecureElementGetter
274 NFCAdapter.prototype.setPowered = function() {
275 privUtils_.warn('DEPRECATION WARNING: setPowered() is deprecated and will be removed from next release. Let the user turn NFC on/off '
276 + 'through the Settings application instead.');
278 var args = validator_.validateArgs(arguments, [
284 name: 'successCallback',
285 type: types_.FUNCTION,
290 name: 'errorCallback',
291 type: types_.FUNCTION,
297 var result = native_.call('NFCAdapter_setPowered', {
298 powered: args.powered
299 }, function(result) {
300 if (native_.isFailure(result)) {
301 args.errorCallback(result.error);
303 args.successCallback();
307 if (native_.isFailure(result)) {
308 throw native_.getErrorObject(result);
312 function setTagListener() {
313 var args = validator_.validateArgs(arguments, [
316 type: types_.LISTENER,
317 values: ['onattach', 'ondetach']
322 values: types_.STRING,
328 if (!type_.isNullOrUndefined(args.tagType)) {
329 for (var i = 0; i < args.tagType.length; i++) {
330 if (NFCTagType[args.tagType[i]] === undefined) {
331 throw new WebAPIException(
332 WebAPIException.TYPE_MISMATCH_ERR, 'Invalid tag type.');
337 // Listener object creation
338 var listenerCallback = function(message) {
339 var tagObject = undefined;
341 if ('onattach' === message.action) {
342 tagObject = new NFCTag(message.id);
344 // If filter is set for listener but tag type is not searched one
345 if (!type_.isNullOrUndefined(args.tagType) &&
346 args.tagType.indexOf(tagObject.type) < 0) {
350 args.listener[message.action](tagObject);
353 // Register (acivate) core listener if not done yet
354 if (!native_.isListenerSet(TAG_LISTENER)) {
355 var result = native_.callSync('NFCAdapter_setTagListener');
356 if (native_.isFailure(result)) {
357 throw native_.getErrorObject(result);
361 native_.addListener(TAG_LISTENER, listenerCallback);
365 NFCAdapter.prototype.setTagListener = function() {
366 setTagListener.apply(this, arguments);
369 function setPeerListener() {
370 var args = validator_.validateArgs(arguments, [
373 type: types_.LISTENER,
374 values: ['onattach', 'ondetach']
378 var listener = function(msg) {
379 var data = undefined;
380 if ('onattach' === msg.action) {
381 data = new NFCPeer(msg.id);
383 args.listener[msg.action](data);
386 if (!native_.isListenerSet(PEER_LISTENER)) {
387 var result = native_.callSync('NFCAdapter_setPeerListener');
388 if (native_.isFailure(result)) {
389 throw native_.getErrorObject(result);
393 native_.addListener(PEER_LISTENER, listener);
397 NFCAdapter.prototype.setPeerListener = function() {
398 setPeerListener.apply(this, arguments);
401 NFCAdapter.prototype.unsetTagListener = function() {
403 native_.removeListener(TAG_LISTENER);
405 var result = native_.callSync('NFCAdapter_unsetTagListener');
406 if (native_.isFailure(result)) {
407 throw native_.getErrorObject(result);
413 NFCAdapter.prototype.unsetPeerListener = function() {
414 native_.removeListener(PEER_LISTENER);
416 var result = native_.callSync('NFCAdapter_unsetPeerListener');
417 if (native_.isFailure(result)) {
418 throw native_.getErrorObject(result);
424 function addCardEmulationModeChangeListener() {
425 var args = validator_.validateArgs(arguments, [
428 type: types_.FUNCTION
432 if (type_.isEmptyObject(cardEmulationModeListener.listeners) &&
433 type_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
434 var result = native_.callSync(
435 'NFCAdapter_addCardEmulationModeChangeListener');
436 if (native_.isFailure(result)) {
437 throw native_.getErrorObject(result);
441 return cardEmulationModeListener.addListener(args.callback);
444 NFCAdapter.prototype.addCardEmulationModeChangeListener = function() {
445 return addCardEmulationModeChangeListener.apply(this, arguments);
448 function removeCardEmulationModeChangeListener() {
449 if (type_.isEmptyObject(cardEmulationModeListener.listeners)) {
450 privUtils_.checkPrivilegeAccess(privilege_.NFC_CARDEMULATION);
453 var args = validator_.validateArgs(arguments, [
459 cardEmulationModeListener.removeListener(args.listenerId);
461 if (type_.isEmptyObject(cardEmulationModeListener.listeners) &&
462 type_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
463 var result = native_.callSync('NFCAdapter_removeCardEmulationModeChangeListener');
465 if (native_.isFailure(result)) {
466 throw native_.getErrorObject(result);
471 NFCAdapter.prototype.removeCardEmulationModeChangeListener = function() {
472 removeCardEmulationModeChangeListener.apply(this, arguments);
475 function addTransactionEventListener() {
476 var args = validator_.validateArgs(arguments, [
480 values: type_.getValues(SecureElementType)
484 type: types_.FUNCTION
490 if (SecureElementType.ESE === args.type) {
491 if (type_.isEmptyObject(transactionEventListenerEse.listeners)) {
492 result = native_.callSync('NFCAdapter_addTransactionEventListener', {
494 if (native_.isFailure(result)) {
495 throw native_.getErrorObject(result);
498 return transactionEventListenerEse.addListener(args.callback);
500 if (type_.isEmptyObject(transactionEventListenerUicc.listeners)) {
501 result = native_.callSync('NFCAdapter_addTransactionEventListener', {
503 if (native_.isFailure(result)) {
504 throw native_.getErrorObject(result);
507 return transactionEventListenerUicc.addListener(args.callback);
511 NFCAdapter.prototype.addTransactionEventListener = function() {
512 return addTransactionEventListener.apply(this, arguments);
515 function removeTransactionEventListener() {
516 var ese_empty = type_.isEmptyObject(transactionEventListenerEse.listeners);
517 var uicc_empty = type_.isEmptyObject(transactionEventListenerUicc.listeners);
519 if (!ese_empty || !uicc_empty) {
520 privUtils_.checkPrivilegeAccess(privilege_.NFC_CARDEMULATION);
523 var args = validator_.validateArgs(arguments, [
530 transactionEventListenerEse.removeListener(args.watchId);
531 transactionEventListenerUicc.removeListener(args.watchId);
533 if (type_.isEmptyObject(transactionEventListenerEse.listeners) && !ese_empty) {
534 var result = native_.callSync('NFCAdapter_removeTransactionEventListener', {
535 type: SecureElementType.ESE});
537 if (native_.isFailure(result)) {
538 throw native_.getErrorObject(result);
542 if (type_.isEmptyObject(transactionEventListenerUicc.listeners)
544 var result = native_.callSync('NFCAdapter_removeTransactionEventListener', {
545 type: SecureElementType.UICC});
547 if (native_.isFailure(result)) {
548 throw native_.getErrorObject(result);
554 NFCAdapter.prototype.removeTransactionEventListener = function() {
555 removeTransactionEventListener.apply(this, arguments);
558 function addActiveSecureElementChangeListener() {
559 var args = validator_.validateArgs(arguments, [
562 type: types_.FUNCTION
566 if (type_.isEmptyObject(cardEmulationModeListener.listeners) &&
567 type_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
568 var result = native_.callSync(
569 'NFCAdapter_addActiveSecureElementChangeListener');
570 if (native_.isFailure(result)) {
571 throw native_.getErrorObject(result);
575 return activeSecureElementChangeListener.addListener(args.callback);
578 NFCAdapter.prototype.addActiveSecureElementChangeListener = function() {
579 return addActiveSecureElementChangeListener.apply(this, arguments);
582 function removeActiveSecureElementChangeListener() {
583 if (type_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
584 privUtils_.checkPrivilegeAccess(privilege_.NFC_CARDEMULATION);
587 var args = validator_.validateArgs(arguments, [
593 activeSecureElementChangeListener.removeListener(args.listenerId);
595 if (type_.isEmptyObject(cardEmulationModeListener.listeners) &&
596 type_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
597 var result = native_.callSync('NFCAdapter_removeCardEmulationModeChangeListener');
599 if (native_.isFailure(result)) {
600 throw native_.getErrorObject(result);
605 NFCAdapter.prototype.removeActiveSecureElementChangeListener = function() {
606 removeActiveSecureElementChangeListener.apply(this, arguments);
609 NFCAdapter.prototype.getCachedMessage = function() {
610 var result = native_.callSync('NFCAdapter_getCachedMessage');
612 if (native_.isFailure(result)) {
613 throw native_.getErrorObject(result);
616 if (!result.records) {
617 return new tizen.NDEFMessage();
620 return new tizen.NDEFMessage(toRecordsArray(result.records));
623 NFCAdapter.prototype.setExclusiveModeForTransaction = function() {
625 var args = validator_.validateArgs(arguments, [
627 name: 'transactionMode',
632 var result = native_.callSync(
633 'NFCAdapter_setExclusiveModeForTransaction',
634 { 'transactionMode': args.transactionMode}
637 if (native_.isFailure(result)) {
638 throw native_.getErrorObject(result);
643 function addHCEEventListener() {
644 var args = validator_.validateArgs(arguments, [
645 {name: 'eventCallback', type: types_.FUNCTION}
648 if (!arguments.length || !type_.isFunction(arguments[0])) {
649 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
652 if (type_.isEmptyObject(HCEEventListener.listeners)) {
653 var result = native_.callSync('NFCAdapter_addHCEEventListener');
654 if (native_.isFailure(result)) {
655 throw native_.getErrorObject(result);
659 return HCEEventListener.addListener(args.eventCallback);
662 NFCAdapter.prototype.addHCEEventListener = function() {
663 return addHCEEventListener.apply(this, arguments);
666 function removeHCEEventListener() {
667 if (type_.isEmptyObject(HCEEventListener.listeners)) {
668 privUtils_.checkPrivilegeAccess(privilege_.NFC_CARDEMULATION);
671 var args = validator_.validateArgs(arguments, [
672 {name: 'watchId', type: types_.LONG}
675 if (!arguments.length || !type_.isNumber(arguments[0])) {
676 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
679 HCEEventListener.removeListener(args.watchId);
681 if (type_.isEmptyObject(HCEEventListener.listeners)) {
682 var result = native_.callSync('NFCAdapter_removeHCEEventListener');
683 if (native_.isFailure(result)) {
684 throw native_.getErrorObject(result);
689 NFCAdapter.prototype.removeHCEEventListener = function() {
690 removeHCEEventListener.apply(this, arguments);
693 NFCAdapter.prototype.sendHostAPDUResponse = function(apdu, successCallback, errorCallback) {
694 var args = validator_.validateArgs(arguments, [
695 {name: 'apdu', type: types_.ARRAY, values: types_.OCTET},
696 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
697 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
700 if (!arguments.length || !type_.isArray(arguments[0])) {
701 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
708 var callback = function(result) {
709 if (native_.isFailure(result)) {
710 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
713 native_.callIfPossible(args.successCallback);
716 var result = native_.call('NFCAdapter_sendHostAPDUResponse', data, callback);
718 if (native_.isFailure(result)) {
719 throw native_.getErrorObject(result);
723 NFCAdapter.prototype.isActivatedHandlerForAID = function(type, aid) {
725 var args = validator_.validateArgs(arguments, [
729 values: type_.getValues(SecureElementType)
731 {name: 'aid', type: types_.STRING}
734 if (arguments.length < 2) {
735 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
743 var result = native_.callSync('NFCAdapter_isActivatedHandlerForAID', data);
745 if (native_.isFailure(result)) {
746 throw native_.getErrorObject(result);
748 return native_.getResultObject(result);
751 NFCAdapter.prototype.isActivatedHandlerForCategory = function(type, category) {
753 var args = validator_.validateArgs(arguments, [{
756 values: type_.getValues(SecureElementType)
760 values: Object.keys(CardEmulationCategoryType)
763 if (arguments.length < 2) {
764 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
769 category: args.category
772 var result = native_.callSync('NFCAdapter_isActivatedHandlerForCategory', data);
774 if (native_.isFailure(result)) {
775 throw native_.getErrorObject(result);
777 return native_.getResultObject(result);
780 NFCAdapter.prototype.registerAID = function(type, aid, category) {
782 var args = validator_.validateArgs(arguments, [{
785 values: type_.getValues(SecureElementType)
792 values: Object.keys(CardEmulationCategoryType)
795 if (arguments.length < 3 || !type_.isString(arguments[0])) {
796 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
802 category: args.category
805 var result = native_.callSync('NFCAdapter_registerAID', data);
807 if (native_.isFailure(result)) {
808 throw native_.getErrorObject(result);
812 NFCAdapter.prototype.unregisterAID = function(type, aid, category) {
814 var args = validator_.validateArgs(arguments, [
818 values: type_.getValues(SecureElementType)
820 {name: 'aid', type: types_.STRING},
821 {name: 'category', type: types_.ENUM, values: Object.keys(CardEmulationCategoryType)}
824 if (arguments.length < 3 || !type_.isString(arguments[0])) {
825 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
831 category: args.category
834 var result = native_.callSync('NFCAdapter_unregisterAID', data);
836 if (native_.isFailure(result)) {
837 throw native_.getErrorObject(result);
841 function AIDData(data) {
842 Object.defineProperties(this, {
849 value: data.aid || [],
854 value: data.readOnly || false,
861 NFCAdapter.prototype.getAIDsForCategory = function(type, category, successCallback, errorCallback) {
863 var args = validator_.validateArgs(arguments, [{
866 values: type_.getValues(SecureElementType)
870 values: Object.keys(CardEmulationCategoryType)
872 name: 'successCallback',
873 type: types_.FUNCTION
875 name: 'errorCallback',
876 type: types_.FUNCTION,
881 if (arguments.length < 3) {
882 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
887 category: args.category
890 var callback = function(result) {
891 if (native_.isFailure(result)) {
892 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
896 var r = native_.getResultObject(result);
897 for (var i = 0; i < r.length; i++) {
898 aids.push(new AIDData(r[i]));
900 native_.callIfPossible(args.successCallback, aids);
903 var result = native_.call('NFCAdapter_getAIDsForCategory', data, callback);
905 if (native_.isFailure(result)) {
906 throw native_.getErrorObject(result);
910 function InternalRecordData(tnf, type, payload, id) {
913 this.payload = payload;
917 var toRecordsArray = function(array) {
919 if (type_.isNullOrUndefined(array) || !type_.isArray(array)) {
923 for (var i = 0; i < array.length; i++) {
924 var data = new InternalRecordData(array[i].tnf, array[i].type, array[i].payload, array[i].id);
926 if (array[i].recordType == 'Record') {
927 result.push(new tizen.NDEFRecord(data.tnf_, data.type_, data.payload_, data.id_));
931 if (array[i].recordType == 'RecordText') {
932 result.push(new tizen.NDEFRecordText(array[i].text, array[i].languageCode,
933 array[i].encoding, data));
937 if (array[i].recordType == 'RecordURI') {
938 result.push(new tizen.NDEFRecordURI(array[i].uri, data));
942 if (array[i].recordType == 'RecordMedia') {
943 result.push(new tizen.NDEFRecordMedia(array[i].mimeType, array[i].data, data));
951 //////////////////NFCTag /////////////////
953 function NFCTag(tagid) {
957 function TypeGetter() {
959 var result = native_.callSync('NFCTag_typeGetter', {'id' : _my_id});
961 if (native_.isFailure(result)) {
964 return native_.getResultObject(result);
967 function IsSupportedNDEFGetter() {
969 var result = native_.callSync('NFCTag_isSupportedNDEFGetter', {'id' : _my_id});
971 if (native_.isFailure(result)) {
974 return native_.getResultObject(result);
977 function NDEFSizeGetter() {
979 var result = native_.callSync('NFCTag_NDEFSizeGetter', {'id' : _my_id});
981 if (native_.isFailure(result)) {
984 return native_.getResultObject(result);
987 function PropertiesGetter() {
989 var result = native_.callSync('NFCTag_propertiesGetter', {'id' : _my_id});
991 if (native_.isFailure(result)) {
995 privUtils_.log('Current result: ' + result);
997 var result_array = {};
998 for (var i in result.result) {
999 var current = result.result[i];
1000 var keys = Object.keys(current);
1001 for (var x in keys) {
1002 result_array[keys[x]] = current[keys[x]];
1005 return result_array;
1008 function IsConnectedGetter() {
1010 var result = native_.callSync('NFCTag_isConnectedGetter', {'id' : _my_id});
1012 if (native_.isFailure(result)) {
1015 return native_.getResultObject(result);
1018 // Function defined here (not outside Tag "constructor"
1019 // because access to internal _my_id variable is needed)
1020 NFCTag.prototype.readNDEF = function() {
1021 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_TAG);
1023 var args = validator_.validateArgs(arguments, [
1025 name: 'readCallback',
1026 type: types_.FUNCTION
1029 name: 'errorCallback',
1030 type: types_.FUNCTION,
1036 var result = native_.call('NFCTag_readNDEF', {'id' : _my_id},
1038 if (native_.isFailure(result)) {
1039 if (!type_.isNullOrUndefined(args.errorCallback)) {
1040 args.errorCallback(native_.getErrorObject(result));
1043 var message = new tizen.NDEFMessage(toRecordsArray(result.records));
1044 args.readCallback(message);
1048 if (native_.isFailure(result)) {
1049 throw native_.getErrorObject(result);
1053 NFCTag.prototype.writeNDEF = function() {
1054 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_TAG);
1056 var args = validator_.validateArgs(arguments, [
1059 type: types_.PLATFORM_OBJECT,
1060 values: tizen.NDEFMessage
1063 name: 'successCallback',
1064 type: types_.FUNCTION,
1069 name: 'errorCallback',
1070 type: types_.FUNCTION,
1076 var result = native_.call('NFCTag_writeNDEF',
1079 'records' : args.message.records,
1080 'recordsSize' : args.message.recordCount
1083 if (native_.isFailure(result)) {
1084 if (!type_.isNullOrUndefined(args.errorCallback)) {
1085 args.errorCallback(native_.getErrorObject(result));
1088 if (!type_.isNullOrUndefined(args.successCallback)) {
1089 args.successCallback();
1094 if (native_.isFailure(result)) {
1095 throw native_.getErrorObject(result);
1099 NFCTag.prototype.transceive = function() {
1100 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_TAG);
1102 var args = validator_.validateArgs(arguments, [
1108 name: 'dataCallback',
1109 type: types_.FUNCTION
1112 name: 'errorCallback',
1113 type: types_.FUNCTION,
1119 var result = native_.call('NFCTag_transceive',
1125 if (native_.isFailure(result)) {
1126 if (!type_.isNullOrUndefined(args.errorCallback)) {
1127 args.errorCallback(result.error);
1130 if (!type_.isNullOrUndefined(args.dataCallback)) {
1131 args.dataCallback(result.data);
1136 if (native_.isFailure(result)) {
1137 throw native_.getErrorObject(result);
1141 Object.defineProperties(this, {
1149 get: IsSupportedNDEFGetter,
1154 get: NDEFSizeGetter,
1159 get: PropertiesGetter,
1164 get: IsConnectedGetter,
1171 //////////////////NFCPeer /////////////////
1173 function NFCPeer(peerid) {
1174 var _my_id = peerid;
1176 function isConnectedGetter() {
1177 var ret = native_.callSync('NFCAdapter_PeerIsConnectedGetter', {'id' : _my_id});
1178 if (native_.isFailure(ret)) {
1181 return native_.getResultObject(ret);
1184 NFCPeer.prototype.sendNDEF = function() {
1185 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_P2P);
1187 var args = validator_.validateArgs(arguments, [
1190 type: types_.PLATFORM_OBJECT,
1191 values: tizen.NDEFMessage
1194 name: 'successCallback',
1195 type: types_.FUNCTION,
1200 name: 'errorCallback',
1201 type: types_.FUNCTION,
1207 var result = native_.call('NFCPeer_sendNDEF', {
1209 'records' : args.message.records,
1210 'recordsSize' : args.message.recordCount
1211 }, function(result) {
1212 if (native_.isFailure(result)) {
1213 args.errorCallback(result.error);
1215 args.successCallback();
1219 if (native_.isFailure(result)) {
1220 throw native_.getErrorObject(result);
1224 NFCPeer.prototype.setReceiveNDEFListener = function() {
1225 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_P2P);
1227 var args = validator_.validateArgs(arguments, [
1230 type: types_.FUNCTION
1234 var listener = function(msg) {
1235 var data = undefined;
1236 if ('onsuccess' === msg.action && _my_id === msg.id) {
1237 data = new tizen.NDEFMessage(toRecordsArray(msg.records));
1239 args.listener(data);
1242 var result = native_.callSync('NFCPeer_setReceiveNDEFListener', {'id' : _my_id});
1243 if (native_.isFailure(result)) {
1244 throw native_.getErrorObject(result);
1247 native_.addListener(RECEIVE_NDEF_LISTENER, listener);
1251 NFCPeer.prototype.unsetReceiveNDEFListener = function() {
1252 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_P2P);
1254 native_.removeListener(RECEIVE_NDEF_LISTENER);
1256 var result = native_.callSync('NFCPeer_unsetReceiveNDEFListener', {'id' : _my_id});
1257 if (native_.isFailure(result)) {
1258 throw native_.getErrorObject(result);
1264 Object.defineProperties(this, {
1268 get: isConnectedGetter
1273 var toByteArray = function(array, max_size, nullable) {
1274 var resultArray = [];
1275 if (type_.isNullOrUndefined(array) && nullable === true)
1278 var convertedArray = converter_.toArray(array);
1279 var len = convertedArray.length;
1282 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1283 for (var i = 0; i < len; i++) {
1284 resultArray.push(converter_.toOctet(convertedArray[i]));
1289 var isArrayOfType = function(array, type) {
1290 for (var i = 0; i < array.length; i++) {
1291 if (!(array[i] instanceof type))
1297 //////////////////NDEFMessage /////////////////
1299 // Constructor(NDEFRecord[] ndefRecords),
1300 // Constructor(byte[] rawData)]
1301 //interface NDEFMessage {
1302 // readonly attribute long recordCount;
1304 // attribute NDEFRecord[] records;
1306 // byte[] toByte() raises(WebAPIException);
1309 tizen.NDEFMessage = function(data) {
1310 validator_.isConstructorCall(this, tizen.NDEFMessage);
1313 if (arguments.length >= 1) {
1314 if (type_.isArray(data)) {
1315 if (isArrayOfType(data, tizen.NDEFRecord)) {
1318 var raw_data_ = toByteArray(data);
1319 var result = native_.callSync(
1320 'NDEFMessage_constructor', {
1321 'rawData': raw_data_,
1322 'rawDataSize' : raw_data_.length
1326 if (native_.isFailure(result)) {
1327 throw native_.getErrorObject(result);
1330 var records_array = result.result.records;
1331 for (var i = 0; i < records_array.length; i++) {
1332 records_.push(new tizen.NDEFRecord(records_array[i].tnf,
1333 records_array[i].type, records_array[i].payload,
1334 records_array[i].id));
1338 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1342 //constructor call failed - empty object should be created
1343 records_ = undefined;
1346 var recordsSetter = function(data) {
1347 if (type_.isArray(data)) {
1348 // Do not check type of array elements - allow all arrays
1349 //if ( isArrayOfType(data, tizen.NDEFRecord) ) {
1355 Object.defineProperties(this, {
1356 recordCount: { enumerable: true,
1358 get: function() { return records_ ? records_.length : undefined;}},
1359 records: { enumerable: true,
1361 get: function() {return records_;}}
1365 tizen.NDEFMessage.prototype.toByte = function() {
1366 var result = native_.callSync(
1367 'NDEFMessage_toByte', {
1368 'records' : this.records,
1369 'recordsSize' : this.recordCount
1372 if (native_.isFailure(result)) {
1373 throw native_.getErrorObject(result);
1376 return toByteArray(result.result.bytes);
1379 //helper for inherited object constructors /////////////////////////////////////////////
1380 function InternalData() {
1383 //////////////////NDEFRecord /////////////////
1384 tizen.NDEFRecord = function(first, type, payload, id) {
1385 var tnf_ = undefined;
1386 var typ_ = undefined;
1387 var payload_ = undefined;
1388 var id_ = undefined;
1389 //if it is inherited call, then ignore validation
1390 if (!(first instanceof InternalData)) {
1391 validator_.isConstructorCall(this, tizen.NDEFRecord);
1393 if (arguments.length >= 1) {
1394 if (type_.isArray(first)) {
1395 var raw_data_ = toByteArray(first);
1396 var result = native_.callSync(
1397 'NDEFRecord_constructor', {
1398 'rawData': raw_data_,
1399 'rawDataSize' : raw_data_.length
1402 if (native_.isFailure(result)) {
1403 throw native_.getErrorObject(result);
1405 tnf_ = converter_.toLong(result.result.tnf);
1406 typ_ = toByteArray(result.result.type, 255);
1407 payload_ = toByteArray(result.result.payload, Math.pow(2, 32) - 1);
1408 id_ = toByteArray(result.result.id, 255);
1409 } else if (arguments.length >= 3) {
1410 tnf_ = converter_.toLong(first);
1411 typ_ = toByteArray(type, 255);
1412 payload_ = toByteArray(payload, Math.pow(2, 32) - 1);
1413 id_ = toByteArray(id, 255, true, []);
1416 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1419 //constructor call failed - empty object should be created
1422 payload_ = undefined;
1427 Object.defineProperties(this, {
1428 tnf: {value: tnf_, writable: false, enumerable: true},
1429 type: {value: typ_, writable: false, enumerable: true},
1430 id: {value: id_, writable: false, enumerable: true},
1431 payload: {value: payload_, writable: false, enumerable: true}
1435 //////////////////NDEFRecordText /////////////////
1436 tizen.NDEFRecordText = function(text, languageCode, encoding, internal_) {
1437 var text_ = undefined;
1438 var languageCode_ = undefined;
1439 var encoding_ = NDEFRecordTextEncoding[encoding] ?
1440 NDEFRecordTextEncoding[encoding] : NDEFRecordTextEncoding['UTF8'];
1442 if (arguments.length >= 2) {
1443 text_ = converter_.toString(text);
1444 languageCode_ = converter_.toString(languageCode);
1446 if (!type_.isNullOrUndefined(internal_) && (internal_ instanceof InternalRecordData)) {
1447 tizen.NDEFRecord.call(this, internal_.tnf, internal_.type, internal_.payload, internal_.id);
1449 var result = native_.callSync(
1450 'NDEFRecordText_constructor', {
1452 'languageCode' : languageCode_,
1453 'encoding' : encoding_
1456 if (native_.isFailure(result)) {
1457 throw native_.getErrorObject(result);
1459 tizen.NDEFRecord.call(this, result.result.tnf, result.result.type,
1460 result.result.payload, result.result.id);
1463 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1466 //constructor call failed - empty object should be created
1467 tizen.NDEFRecord.call(this);
1469 languageCode_ = undefined;
1470 encoding_ = undefined;
1473 Object.defineProperties(this, {
1474 text: {value: text_, writable: false, enumerable: true},
1475 languageCode: {value: languageCode_, writable: false, enumerable: true},
1476 encoding: {value: encoding_, writable: false, enumerable: true}
1480 tizen.NDEFRecordText.prototype = new tizen.NDEFRecord(new InternalData());
1482 tizen.NDEFRecordText.prototype.constructor = tizen.NDEFRecordText;
1484 //////////////////NDEFRecordURI /////////////////
1485 tizen.NDEFRecordURI = function(uri, internal_) {
1486 var uri_ = undefined;
1488 if (arguments.length >= 1) {
1489 uri_ = converter_.toString(uri);
1491 if (!type_.isNullOrUndefined(internal_) && (internal_ instanceof InternalRecordData)) {
1492 tizen.NDEFRecord.call(this, internal_.tnf, internal_.type, internal_.payload, internal_.id);
1494 var result = native_.callSync(
1495 'NDEFRecordURI_constructor', {
1499 if (native_.isFailure(result)) {
1500 throw native_.getErrorObject(result);
1502 tizen.NDEFRecord.call(this, result.result.tnf, result.result.type,
1503 result.result.payload, result.result.id);
1506 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1509 //constructor call failed - empty object should be created
1510 tizen.NDEFRecord.call(this);
1514 Object.defineProperties(this, {
1515 uri: {value: uri_, writable: false, enumerable: true}
1519 tizen.NDEFRecordURI.prototype = new tizen.NDEFRecord(new InternalData());
1521 tizen.NDEFRecordURI.prototype.constructor = tizen.NDEFRecordURI;
1523 //////////////////NDEFRecordMedia /////////////////
1524 tizen.NDEFRecordMedia = function(mimeType, data, internal_) {
1525 var mimeType_ = undefined;
1526 var data_ = undefined;
1528 if (arguments.length >= 2) {
1529 mimeType_ = converter_.toString(mimeType);
1530 data_ = toByteArray(data, Math.pow(2, 32) - 1);
1532 if (!type_.isNullOrUndefined(internal_) && (internal_ instanceof InternalRecordData)) {
1533 tizen.NDEFRecord.call(this, internal_.tnf, internal_.type, internal_.payload, internal_.id);
1535 var result = native_.callSync(
1536 'NDEFRecordMedia_constructor', {
1537 'mimeType': mimeType_,
1539 'dataSize': data_.length
1542 if (native_.isFailure(result)) {
1543 throw native_.getErrorObject(result);
1545 tizen.NDEFRecord.call(this, result.result.tnf, result.result.type,
1546 result.result.payload, result.result.id);
1549 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1552 //constructor call failed - empty object should be created
1553 tizen.NDEFRecord.call(this);
1554 mimeType_ = undefined;
1557 Object.defineProperties(this, {
1558 mimeType: {value: mimeType_, writable: false, enumerable: true}
1562 tizen.NDEFRecordMedia.prototype = new tizen.NDEFRecord(new InternalData());
1564 tizen.NDEFRecordMedia.prototype.constructor = tizen.NDEFRecordMedia;
1566 exports = new NFCManager();