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);
145 var isWebkitVisibilityChangeListenerSet = false;
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 native_.callIfPossible(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 native_.callIfPossible(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_.BYTE},
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 WebkitVisibilityChangeListener() {
912 if (true === privUtils_.global.document.hidden) {
913 result = native_.call('NFCAdapter_unsetPreferredApp');
914 } else if (false === privUtils_.global.document.hidden) {
915 result = native_.call('NFCAdapter_setPreferredApp');
918 if (native_.isFailure(result)) {
919 privUtils_.log('Failed to (un)set: ' + result.error.message);
923 NFCAdapter.prototype.setPreferredApp = function() {
924 var result = native_.call('NFCAdapter_setPreferredApp');
926 if (native_.isFailure(result)) {
927 throw native_.getErrorObject(result);
929 if (false === isWebkitVisibilityChangeListenerSet) {
930 privUtils_.global.document.addEventListener("webkitvisibilitychange", WebkitVisibilityChangeListener);
931 isWebkitVisibilityChangeListenerSet = true;
936 NFCAdapter.prototype.unsetPreferredApp = function() {
937 var result = native_.call('NFCAdapter_unsetPreferredApp');
939 if (native_.isFailure(result)) {
940 throw native_.getErrorObject(result);
942 if (true === isWebkitVisibilityChangeListenerSet) {
943 privUtils_.global.document.removeEventListener("webkitvisibilitychange", WebkitVisibilityChangeListener);
944 isWebkitVisibilityChangeListenerSet = false;
949 function InternalRecordData(tnf, type, payload, id) {
952 this.payload = payload;
956 var toRecordsArray = function(array) {
958 if (type_.isNullOrUndefined(array) || !type_.isArray(array)) {
962 for (var i = 0; i < array.length; i++) {
963 var data = new InternalRecordData(array[i].tnf, array[i].type, array[i].payload, array[i].id);
965 if (array[i].recordType == 'Record') {
966 result.push(new tizen.NDEFRecord(data.tnf, data.type, data.payload, data.id));
970 if (array[i].recordType == 'RecordText') {
971 result.push(new tizen.NDEFRecordText(array[i].text, array[i].languageCode,
972 array[i].encoding, data));
976 if (array[i].recordType == 'RecordURI') {
977 result.push(new tizen.NDEFRecordURI(array[i].uri, data));
981 if (array[i].recordType == 'RecordMedia') {
982 result.push(new tizen.NDEFRecordMedia(array[i].mimeType, null, data));
990 //////////////////NFCTag /////////////////
992 function NFCTag(tagid) {
996 function TypeGetter() {
998 var result = native_.callSync('NFCTag_typeGetter', {'id' : _my_id});
1000 if (native_.isFailure(result)) {
1003 return native_.getResultObject(result);
1006 function IsSupportedNDEFGetter() {
1008 var result = native_.callSync('NFCTag_isSupportedNDEFGetter', {'id' : _my_id});
1010 if (native_.isFailure(result)) {
1013 return native_.getResultObject(result);
1016 function NDEFSizeGetter() {
1018 var result = native_.callSync('NFCTag_NDEFSizeGetter', {'id' : _my_id});
1020 if (native_.isFailure(result)) {
1023 return native_.getResultObject(result);
1026 function PropertiesGetter() {
1028 var result = native_.callSync('NFCTag_propertiesGetter', {'id' : _my_id});
1030 if (native_.isFailure(result)) {
1034 privUtils_.log('Current result: ' + result);
1036 var result_array = {};
1037 for (var i in result.result) {
1038 var current = result.result[i];
1039 var keys = Object.keys(current);
1040 for (var x in keys) {
1041 result_array[keys[x]] = current[keys[x]];
1044 return result_array;
1047 function IsConnectedGetter() {
1049 var result = native_.callSync('NFCTag_isConnectedGetter', {'id' : _my_id});
1051 if (native_.isFailure(result)) {
1054 return native_.getResultObject(result);
1057 // Function defined here (not outside Tag "constructor"
1058 // because access to internal _my_id variable is needed)
1059 NFCTag.prototype.readNDEF = function() {
1060 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_TAG);
1062 var args = validator_.validateArgs(arguments, [
1064 name: 'readCallback',
1065 type: types_.FUNCTION
1068 name: 'errorCallback',
1069 type: types_.FUNCTION,
1075 var result = native_.call('NFCTag_readNDEF', {'id' : _my_id},
1077 if (native_.isFailure(result)) {
1078 if (!type_.isNullOrUndefined(args.errorCallback)) {
1079 args.errorCallback(native_.getErrorObject(result));
1082 var message = new tizen.NDEFMessage(toRecordsArray(result.records));
1083 args.readCallback(message);
1087 if (native_.isFailure(result)) {
1088 throw native_.getErrorObject(result);
1092 NFCTag.prototype.writeNDEF = function() {
1093 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_TAG);
1095 var args = validator_.validateArgs(arguments, [
1098 type: types_.PLATFORM_OBJECT,
1099 values: tizen.NDEFMessage
1102 name: 'successCallback',
1103 type: types_.FUNCTION,
1108 name: 'errorCallback',
1109 type: types_.FUNCTION,
1115 var result = native_.call('NFCTag_writeNDEF',
1118 'records' : args.message.records,
1119 'recordsSize' : args.message.recordCount
1122 if (native_.isFailure(result)) {
1123 if (!type_.isNullOrUndefined(args.errorCallback)) {
1124 args.errorCallback(native_.getErrorObject(result));
1127 if (!type_.isNullOrUndefined(args.successCallback)) {
1128 args.successCallback();
1133 if (native_.isFailure(result)) {
1134 throw native_.getErrorObject(result);
1138 NFCTag.prototype.transceive = function() {
1139 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_TAG);
1141 var args = validator_.validateArgs(arguments, [
1148 name: 'dataCallback',
1149 type: types_.FUNCTION
1152 name: 'errorCallback',
1153 type: types_.FUNCTION,
1159 var result = native_.call('NFCTag_transceive',
1165 if (native_.isFailure(result)) {
1166 if (!type_.isNullOrUndefined(args.errorCallback)) {
1167 args.errorCallback(result.error);
1170 if (!type_.isNullOrUndefined(args.dataCallback)) {
1171 args.dataCallback(result.data);
1176 if (native_.isFailure(result)) {
1177 throw native_.getErrorObject(result);
1181 Object.defineProperties(this, {
1189 get: IsSupportedNDEFGetter,
1194 get: NDEFSizeGetter,
1199 get: PropertiesGetter,
1204 get: IsConnectedGetter,
1211 //////////////////NFCPeer /////////////////
1213 function NFCPeer(peerid) {
1214 var _my_id = peerid;
1216 function isConnectedGetter() {
1217 var ret = native_.callSync('NFCAdapter_PeerIsConnectedGetter', {'id' : _my_id});
1218 if (native_.isFailure(ret)) {
1221 return native_.getResultObject(ret);
1224 NFCPeer.prototype.sendNDEF = function() {
1225 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_P2P);
1227 var args = validator_.validateArgs(arguments, [
1230 type: types_.PLATFORM_OBJECT,
1231 values: tizen.NDEFMessage
1234 name: 'successCallback',
1235 type: types_.FUNCTION,
1240 name: 'errorCallback',
1241 type: types_.FUNCTION,
1247 var result = native_.call('NFCPeer_sendNDEF', {
1249 'records' : args.message.records,
1250 'recordsSize' : args.message.recordCount
1251 }, function(result) {
1252 if (native_.isFailure(result)) {
1253 args.errorCallback(result.error);
1255 args.successCallback();
1259 if (native_.isFailure(result)) {
1260 throw native_.getErrorObject(result);
1264 NFCPeer.prototype.setReceiveNDEFListener = function() {
1265 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_P2P);
1267 var args = validator_.validateArgs(arguments, [
1270 type: types_.FUNCTION
1274 var listener = function(msg) {
1275 var data = undefined;
1276 if ('onsuccess' === msg.action && _my_id === msg.id) {
1277 data = new tizen.NDEFMessage(toRecordsArray(msg.records));
1279 args.listener(data);
1282 var result = native_.callSync('NFCPeer_setReceiveNDEFListener', {'id' : _my_id});
1283 if (native_.isFailure(result)) {
1284 throw native_.getErrorObject(result);
1287 native_.addListener(RECEIVE_NDEF_LISTENER, listener);
1291 NFCPeer.prototype.unsetReceiveNDEFListener = function() {
1292 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.NFC_P2P);
1294 native_.removeListener(RECEIVE_NDEF_LISTENER);
1296 var result = native_.callSync('NFCPeer_unsetReceiveNDEFListener', {'id' : _my_id});
1297 if (native_.isFailure(result)) {
1298 throw native_.getErrorObject(result);
1304 Object.defineProperties(this, {
1308 get: isConnectedGetter
1313 var toByteArray = function(array, max_size, nullable) {
1314 var resultArray = [];
1315 if (type_.isNullOrUndefined(array) && nullable === true)
1318 var convertedArray = converter_.toArray(array);
1319 var len = convertedArray.length;
1322 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1323 for (var i = 0; i < len; i++) {
1324 resultArray.push(converter_.toOctet(convertedArray[i]));
1329 var isArrayOfType = function(array, type) {
1330 for (var i = 0; i < array.length; i++) {
1331 if (!(array[i] instanceof type))
1337 //////////////////NDEFMessage /////////////////
1339 // Constructor(NDEFRecord[] ndefRecords),
1340 // Constructor(byte[] rawData)]
1341 //interface NDEFMessage {
1342 // readonly attribute long recordCount;
1344 // attribute NDEFRecord[] records;
1346 // byte[] toByte() raises(WebAPIException);
1349 tizen.NDEFMessage = function(data) {
1350 validator_.isConstructorCall(this, tizen.NDEFMessage);
1353 if (arguments.length >= 1) {
1354 if (type_.isArray(data)) {
1355 if (isArrayOfType(data, tizen.NDEFRecord)) {
1358 var raw_data_ = toByteArray(data);
1359 var result = native_.callSync(
1360 'NDEFMessage_constructor', {
1361 'rawData': raw_data_,
1362 'rawDataSize' : raw_data_.length
1366 if (native_.isFailure(result)) {
1367 throw native_.getErrorObject(result);
1370 var records_array = result.result.records;
1371 for (var i = 0; i < records_array.length; i++) {
1372 records_.push(new tizen.NDEFRecord(records_array[i].tnf,
1373 records_array[i].type, records_array[i].payload,
1374 records_array[i].id));
1378 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1382 //constructor call failed - empty object should be created
1383 records_ = undefined;
1386 var recordsSetter = function(data) {
1387 if (type_.isArray(data)) {
1388 // Do not check type of array elements - allow all arrays
1389 //if ( isArrayOfType(data, tizen.NDEFRecord) ) {
1395 Object.defineProperties(this, {
1396 recordCount: { enumerable: true,
1398 get: function() { return records_ ? records_.length : undefined;}},
1399 records: { enumerable: true,
1401 get: function() {return records_;}}
1405 tizen.NDEFMessage.prototype.toByte = function() {
1406 var result = native_.callSync(
1407 'NDEFMessage_toByte', {
1408 'records' : this.records,
1409 'recordsSize' : this.recordCount
1412 if (native_.isFailure(result)) {
1413 throw native_.getErrorObject(result);
1416 return toByteArray(result.result.bytes);
1419 //helper for inherited object constructors /////////////////////////////////////////////
1420 function InternalData() {
1423 //////////////////NDEFRecord /////////////////
1424 tizen.NDEFRecord = function(first, type, payload, id) {
1425 var tnf_ = undefined;
1426 var typ_ = undefined;
1427 var payload_ = undefined;
1428 var id_ = undefined;
1429 //if it is inherited call, then ignore validation
1430 if (!(first instanceof InternalData)) {
1431 validator_.isConstructorCall(this, tizen.NDEFRecord);
1433 if (arguments.length >= 1) {
1434 if (type_.isArray(first)) {
1435 var raw_data_ = toByteArray(first);
1436 var result = native_.callSync(
1437 'NDEFRecord_constructor', {
1438 'rawData': raw_data_,
1439 'rawDataSize' : raw_data_.length
1442 if (native_.isFailure(result)) {
1443 throw native_.getErrorObject(result);
1445 tnf_ = converter_.toLong(result.result.tnf);
1446 typ_ = toByteArray(result.result.type, 255);
1447 payload_ = toByteArray(result.result.payload, Math.pow(2, 32) - 1);
1448 id_ = toByteArray(result.result.id, 255);
1449 } else if (arguments.length >= 3) {
1450 tnf_ = converter_.toLong(first);
1451 typ_ = toByteArray(type, 255);
1452 payload_ = toByteArray(payload, Math.pow(2, 32) - 1);
1453 id_ = toByteArray(id, 255, true, []);
1456 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1459 //constructor call failed - empty object should be created
1462 payload_ = undefined;
1467 Object.defineProperties(this, {
1468 tnf: {value: tnf_, writable: false, enumerable: true},
1469 type: {value: typ_, writable: false, enumerable: true},
1470 id: {value: id_, writable: false, enumerable: true},
1471 payload: {value: payload_, writable: false, enumerable: true}
1475 //////////////////NDEFRecordText /////////////////
1476 tizen.NDEFRecordText = function(text, languageCode, encoding, internal_) {
1477 var text_ = undefined;
1478 var languageCode_ = undefined;
1479 var encoding_ = NDEFRecordTextEncoding[encoding] ?
1480 NDEFRecordTextEncoding[encoding] : NDEFRecordTextEncoding['UTF8'];
1482 if (arguments.length >= 2) {
1483 text_ = converter_.toString(text);
1484 languageCode_ = converter_.toString(languageCode);
1486 if (!type_.isNullOrUndefined(internal_) && (internal_ instanceof InternalRecordData)) {
1487 tizen.NDEFRecord.call(this, internal_.tnf, internal_.type, internal_.payload, internal_.id);
1489 var result = native_.callSync(
1490 'NDEFRecordText_constructor', {
1492 'languageCode' : languageCode_,
1493 'encoding' : encoding_
1496 if (native_.isFailure(result)) {
1497 throw native_.getErrorObject(result);
1499 tizen.NDEFRecord.call(this, result.result.tnf, result.result.type,
1500 result.result.payload, result.result.id);
1503 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1506 //constructor call failed - empty object should be created
1507 tizen.NDEFRecord.call(this);
1509 languageCode_ = undefined;
1510 encoding_ = undefined;
1513 Object.defineProperties(this, {
1514 text: {value: text_, writable: false, enumerable: true},
1515 languageCode: {value: languageCode_, writable: false, enumerable: true},
1516 encoding: {value: encoding_, writable: false, enumerable: true}
1520 tizen.NDEFRecordText.prototype = new tizen.NDEFRecord(new InternalData());
1522 tizen.NDEFRecordText.prototype.constructor = tizen.NDEFRecordText;
1524 //////////////////NDEFRecordURI /////////////////
1525 tizen.NDEFRecordURI = function(uri, internal_) {
1526 var uri_ = undefined;
1528 if (arguments.length >= 1) {
1529 uri_ = converter_.toString(uri);
1531 if (!type_.isNullOrUndefined(internal_) && (internal_ instanceof InternalRecordData)) {
1532 tizen.NDEFRecord.call(this, internal_.tnf, internal_.type, internal_.payload, internal_.id);
1534 var result = native_.callSync(
1535 'NDEFRecordURI_constructor', {
1539 if (native_.isFailure(result)) {
1540 throw native_.getErrorObject(result);
1542 tizen.NDEFRecord.call(this, result.result.tnf, result.result.type,
1543 result.result.payload, result.result.id);
1546 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1549 //constructor call failed - empty object should be created
1550 tizen.NDEFRecord.call(this);
1554 Object.defineProperties(this, {
1555 uri: {value: uri_, writable: false, enumerable: true}
1559 tizen.NDEFRecordURI.prototype = new tizen.NDEFRecord(new InternalData());
1561 tizen.NDEFRecordURI.prototype.constructor = tizen.NDEFRecordURI;
1563 //////////////////NDEFRecordMedia /////////////////
1564 tizen.NDEFRecordMedia = function(mimeType, data, internal_) {
1565 var mimeType_ = undefined;
1566 var data_ = undefined;
1568 if (arguments.length >= 2) {
1569 mimeType_ = converter_.toString(mimeType);
1571 if (!type_.isNullOrUndefined(internal_) && (internal_ instanceof InternalRecordData)) {
1572 tizen.NDEFRecord.call(this, internal_.tnf, internal_.type, internal_.payload, internal_.id);
1574 data_ = toByteArray(data, Math.pow(2, 32) - 1);
1575 var result = native_.callSync(
1576 'NDEFRecordMedia_constructor', {
1577 'mimeType': mimeType_,
1579 'dataSize': data_.length
1582 if (native_.isFailure(result)) {
1583 throw native_.getErrorObject(result);
1585 tizen.NDEFRecord.call(this, result.result.tnf, result.result.type,
1586 result.result.payload, result.result.id);
1589 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1592 //constructor call failed - empty object should be created
1593 tizen.NDEFRecord.call(this);
1594 mimeType_ = undefined;
1597 Object.defineProperties(this, {
1598 mimeType: {value: mimeType_, writable: false, enumerable: true}
1602 tizen.NDEFRecordMedia.prototype = new tizen.NDEFRecord(new InternalData());
1604 tizen.NDEFRecordMedia.prototype.constructor = tizen.NDEFRecordMedia;
1606 exports = new NFCManager();