1 // Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var validator_ = xwalk.utils.validator;
6 var types_ = validator_.Types;
7 var T_ = xwalk.utils.type;
8 var Converter_ = xwalk.utils.converter;
9 var native_ = new xwalk.utils.NativeManager(extension);
11 function ListenerManager(native, listenerName) {
14 this.nativeSet = false;
16 this.listenerName = listenerName;
19 ListenerManager.prototype.onListenerCalled = function(msg) {
20 for (var key in this.listeners) {
21 if (this.listeners.hasOwnProperty(key)) {
22 if ('CardElement' == msg.type) {
23 this.listeners[key](msg.mode);
24 } else if ('Transaction' == msg.type) {
25 this.listeners[key](msg.aid, msg.data);
31 ListenerManager.prototype.addListener = function(callback) {
33 if (!this.nativeSet) {
34 this.native.addListener(this.listenerName, this.onListenerCalled.bind(this));
35 this.nativeSet = true;
37 this.listeners[id] = callback;
42 ListenerManager.prototype.removeListener = function(watchId) {
43 if (this.listeners.hasOwnProperty(watchId)) {
44 delete this.listeners[watchId];
48 var CARD_EMULATION_MODE_LISTENER = 'CardEmulationModeChanged';
49 var ACTIVE_SECURE_ELEMENT_LISTENER = 'ActiveSecureElementChanged';
50 var TRANSACTION_EVENT_ESE_LISTENER = 'TransactionEventListener_ESE';
51 var TRANSACTION_EVENT_UICC_LISTENER = 'TransactionEventListener_UICC';
52 var cardEmulationModeListener = new ListenerManager(native_, CARD_EMULATION_MODE_LISTENER);
53 var activeSecureElementChangeListener = new ListenerManager(native_, ACTIVE_SECURE_ELEMENT_LISTENER);
54 var transactionEventListenerEse = new ListenerManager(native_, TRANSACTION_EVENT_ESE_LISTENER);
55 var transactionEventListenerUicc = new ListenerManager(native_, TRANSACTION_EVENT_UICC_LISTENER);
57 //enumeration NDEFRecordTextEncoding ////////////////////////////////////////////////////
58 var NDEFRecordTextEncoding = {
63 //enumeration NFCTagType ////////////////////////////////////////////////////
65 GENERIC_TARGET : 'GENERIC_TARGET',
66 ISO14443_A : 'ISO14443_A',
67 ISO14443_4A : 'ISO14443_4A',
68 ISO14443_3A : 'ISO14443_3A',
69 MIFARE_MINI : 'MIFARE_MINI',
70 MIFARE_1K : 'MIFARE_1K',
71 MIFARE_4K : 'MIFARE_4K',
72 MIFARE_ULTRA : 'MIFARE_ULTRA',
73 MIFARE_DESFIRE : 'MIFARE_DESFIRE',
74 ISO14443_B : 'ISO14443_B',
75 ISO14443_4B : 'ISO14443_4B',
76 ISO14443_BPRIME : 'ISO14443_BPRIME',
79 ISO15693 : 'ISO15693',
80 UNKNOWN_TARGET : 'UNKNOWN_TARGET'
83 ////enumeration CardEmulationMode ////////////////////////////////////////////////////
84 var CardEmulationMode = {
85 ALWAYS_ON : 'ALWAYS_ON',
89 ////enumeration SecureElementType ////////////////////////////////////////////////////
90 var SecureElementType = {
95 //////////////////NFCManager /////////////////
97 function NFCManager() {
98 Object.defineProperties(this, {
99 NFC_RECORD_TNF_EMPTY: {value: 0, writable: false, enumerable: true},
100 NFC_RECORD_TNF_WELL_KNOWN: {value: 1, writable: false, enumerable: true},
101 NFC_RECORD_TNF_MIME_MEDIA: {value: 2, writable: false, enumerable: true},
102 NFC_RECORD_TNF_URI: {value: 3, writable: false, enumerable: true},
103 NFC_RECORD_TNF_EXTERNAL_RTD: {value: 4, writable: false, enumerable: true},
104 NFC_RECORD_TNF_UNKNOWN: {value: 5, writable: false, enumerable: true},
105 NFC_RECORD_TNF_UNCHANGED: {value: 6, writable: false, enumerable: true}
109 NFCManager.prototype.getDefaultAdapter = function() {
110 // First check NFC suppor on C++ level
111 var result = native_.callSync(
112 'NFCManager_getDefaultAdapter',
115 if(native_.isFailure(result)) {
116 throw new tizen.WebAPIException(0, result.error.message,
120 // If NFC is supported then return new NFCAdapter instance
121 return new NFCAdapter();
124 NFCManager.prototype.setExclusiveMode = function() {
126 var args = validator_.validateArgs(arguments, [
127 {name: 'exclusiveMode', type: types_.BOOLEAN}
130 var result = native_.callSync(
131 'NFCManager_setExclusiveMode',
132 { 'exclusiveMode': args.exclusiveMode}
135 // If failed then exception should be thrown.
136 if(native_.isFailure(result)) {
137 throw new tizen.WebAPIException(0, result.error.message,
139 // Uncoment line below (and remove line above) when problem
140 // with error conversion is fixed:
142 //throw native_.getErrorObject(result);
144 // Otherwise just return
148 //////////////////NFCAdapter /////////////////
150 function NFCAdapter() {
151 function poweredGetter() {
152 var ret = native_.callSync('NFCAdapter_getPowered');
154 if (native_.isFailure(ret)) {
158 return native_.getResultObject(ret);
161 function cardEmulationModeGetter() {
162 var result = native_.callSync('NFCAdapter_cardEmulationModeGetter');
164 if (native_.isFailure(result)) {
165 throw new tizen.WebAPIException(0, result.error.message, result.error.name);
168 return native_.getResultObject(result);
171 function cardEmulationModeSetter(cem) {
173 var args = validator_.validateArgs(arguments, [
174 {name: 'emulationMode', type: types_.STRING}
177 var result = native_.callSync(
178 'NFCAdapter_cardEmulationModeSetter',
179 { 'emulationMode': args.emulationMode}
182 if(native_.isFailure(result)) {
183 throw new tizen.WebAPIException(0, result.error.message, result.error.name);
188 function activeSecureElementGetter() {
190 var result = native_.callSync('NFCAdapter_activeSecureElementGetter');
192 if (native_.isFailure(result)) {
193 throw new tizen.WebAPIException(0, result.error.message, result.error.name);
196 return native_.getResultObject(result);
199 function activeSecureElementSetter(ase) {
201 var args = validator_.validateArgs(arguments, [
202 {name: 'secureElement', type: types_.STRING}
205 var result = native_.callSync(
206 'NFCAdapter_activeSecureElementSetter',
207 { 'secureElement': args.secureElement}
210 if(native_.isFailure(result)) {
211 throw new tizen.WebAPIException(0, result.error.message, result.error.name);
216 Object.defineProperties(this, {
217 powered: {enumerable: true,
221 cardEmulationMode: {enumerable: true,
222 set : cardEmulationModeSetter,
223 get : cardEmulationModeGetter
225 activeSecureElement: {enumerable: true,
226 set : activeSecureElementSetter,
227 get : activeSecureElementGetter
232 NFCAdapter.prototype.setPowered = function() {
233 var args = validator_.validateArgs(arguments, [
236 type : types_.BOOLEAN
239 name : 'successCallback',
240 type : types_.FUNCTION,
245 name : 'errorCallback',
246 type : types_.FUNCTION,
252 native_.call('NFCAdapter_setPowered', {
253 powered: args.powered
254 }, function(result) {
255 if (native_.isFailure(result)) {
256 args.errorCallback(result.error);
258 args.successCallback();
263 NFCAdapter.prototype.setTagListener = function() {
267 NFCAdapter.prototype.setPeerListener = function() {
271 NFCAdapter.prototype.unsetTagListener = function() {
275 NFCAdapter.prototype.unsetPeerListener = function() {
279 NFCAdapter.prototype.addCardEmulationModeChangeListener = function() {
280 var args = validator_.validateArgs(arguments, [
283 type: types_.LISTENER,
284 values: ['onchanged']
288 if (T_.isEmptyObject(cardEmulationModeListener.listeners) &&
289 T_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
290 var result = native_.callSync(
291 'NFCAdapter_addCardEmulationModeChangeListener');
292 if (native_.isFailure(result)) {
293 throw new tizen.WebAPIException(0, result.error.message,
298 return cardEmulationModeListener.addListener(args.callback);
301 NFCAdapter.prototype.removeCardEmulationModeChangeListener = function() {
302 var args = validator_.validateArgs(arguments, [
308 cardEmulationModeListener.removeListener(args.listenerId);
310 if (T_.isEmptyObject(cardEmulationModeListener.listeners) &&
311 T_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
312 native_.callSync('NFCAdapter_removeCardEmulationModeChangeListener');
316 NFCAdapter.prototype.addTransactionEventListener = function() {
317 var args = validator_.validateArgs(arguments, [
321 values: T_.getValues(SecureElementType)
325 type: types_.LISTENER,
326 values: ['ondetected']
332 if (SecureElementType.ESE == args.type) {
333 if (T_.isEmptyObject(transactionEventListenerEse.listeners)) {
334 result = native_.callSync('NFCAdapter_addTransactionEventListener',{
336 if (native_.isFailure(result)) {
337 throw new tizen.WebAPIException(0, result.error.message,
341 return transactionEventListenerEse.addListener(args.callback);
343 if (T_.isEmptyObject(transactionEventListenerUicc.listeners)) {
344 result = native_.callSync('NFCAdapter_addTransactionEventListener',{
346 if (native_.isFailure(result)) {
347 throw new tizen.WebAPIException(0, result.error.message,
351 return transactionEventListenerUicc.addListener(args.callback);
355 NFCAdapter.prototype.removeTransactionEventListener = function() {
356 var args = validator_.validateArgs(arguments, [
363 var ese_empty = T_.isEmptyObject(transactionEventListenerEse.listeners)
364 var uicc_empty = T_.isEmptyObject(transactionEventListenerUicc.listeners)
366 transactionEventListenerEse.removeListener(args.watchId);
367 transactionEventListenerUicc.removeListener(args.watchId);
369 if (T_.isEmptyObject(transactionEventListenerEse.listeners) && !ese_empty) {
370 native_.callSync('NFCAdapter_removeTransactionEventListener',{
371 type: SecureElementType.ESE});
374 if (T_.isEmptyObject(transactionEventListenerUicc.listeners)
376 native_.callSync('NFCAdapter_removeTransactionEventListener',{
377 type: SecureElementType.UICC});
382 NFCAdapter.prototype.addActiveSecureElementChangeListener = function() {
383 var args = validator_.validateArgs(arguments, [
386 type: types_.LISTENER,
387 values: ['onchanged']
391 if (T_.isEmptyObject(cardEmulationModeListener.listeners) &&
392 T_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
393 var result = native_.callSync(
394 'NFCAdapter_addActiveSecureElementChangeListener');
395 if (native_.isFailure(result)) {
396 throw new tizen.WebAPIException(0, result.error.message,
401 return activeSecureElementChangeListener.addListener(args.callback);
404 NFCAdapter.prototype.removeActiveSecureElementChangeListener = function() {
405 var args = validator_.validateArgs(arguments, [
411 activeSecureElementChangeListener.removeListener(args.listenerId);
413 if (T_.isEmptyObject(cardEmulationModeListener.listeners) &&
414 T_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
415 native_.callSync('NFCAdapter_removeCardEmulationModeChangeListener');
419 NFCAdapter.prototype.getCachedMessage = function() {
423 NFCAdapter.prototype.setExclusiveModeForTransaction = function() {
425 var args = validator_.validateArgs(arguments, [
427 name : 'transactionMode',
428 type : types_.BOOLEAN
432 var result = native_.callSync(
433 'NFCAdapter_setExclusiveModeForTransaction',
434 { 'transactionMode': args.transactionMode}
437 if(native_.isFailure(result)) {
438 throw new tizen.WebAPIException(0, result.error.message, result.error.name);
439 // throw native_.getErrorObject(result);
444 //////////////////NFCTag /////////////////
446 function NFCTag(data) {
447 Object.defineProperties(this, {
448 type: {value: data.type, writable: false, enumerable: true},
449 isSupportedNDEF: {value: data.isSupportedNDEF,
450 writable: true, enumerable: true},
451 ndefSize: {value: data.ndefSize,
452 writable: true, enumerable: true},
453 properties: {value: data.properties, writable: true, enumerable: true},
454 isConnected: {value: data.isConnected,
455 writable: true, enumerable: true}
459 NFCTag.prototype.readNDEF = function() {
463 NFCTag.prototype.writeNDEF = function() {
467 NFCTag.prototype.transceive = function() {
471 //////////////////NFCPeer /////////////////
473 function NFCPeer(data) {
474 Object.defineProperties(this, {
475 isConnected: {value: data.isConnected,
476 writable: true, enumerable: true}
480 NFCPeer.prototype.setReceiveNDEFListener = function() {
484 NFCPeer.prototype.unsetReceiveNDEFListener = function() {
488 NFCPeer.prototype.sendNDEF = function() {
493 var toByteArray = function(array, max_size, nullable) {
494 var resultArray = [];
495 if (T_.isNullOrUndefined(array) && nullable === true)
498 var convertedArray = Converter_.toArray(array);
499 var len = convertedArray.length;
502 throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR);
503 for (var i = 0; i < len; i++){
504 resultArray.push(Converter_.toByte(convertedArray[i]));
509 var isArrayOfType = function(array, type) {
510 for (var i = 0; i < array.length; i++) {
511 if (!(array[i] instanceof type))
517 //////////////////NDEFMessage /////////////////
519 // Constructor(NDEFRecord[] ndefRecords),
520 // Constructor(byte[] rawData)]
521 //interface NDEFMessage {
522 // readonly attribute long recordCount;
524 // attribute NDEFRecord[] records;
526 // byte[] toByte() raises(WebAPIException);
529 tizen.NDEFMessage = function(data) {
531 var recordCount_ = 0;
534 if (arguments.length >= 1) {
535 if (T_.isArray(data)) {
536 if ( isArrayOfType(data, tizen.NDEFRecord) ) {
538 recordCount_ = data.length;
540 var raw_data_ = toByteArray(data);
541 // var result = native_.callSync(
542 // 'NDEFMessage_constructor', {
543 // 'rawData': raw_data_,
544 // 'rawDataSize' : raw_data_.length
547 // //set all needed fields here basing on result object
550 throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR);
554 //constructor call failed - empty object should be created
555 records_ = undefined;
556 recordCount_ = undefined;
559 var recordsSetter = function(data){
560 if (T_.isArray(data)) {
561 if ( isArrayOfType(data, tizen.NDEFRecord) ) {
562 recordCount_ = data.length;
568 Object.defineProperties(this, {
569 recordCount: { enumerable: true,
571 get : function(){return recordCount_;}},
572 records: { enumerable: true,
574 get : function(){return records_;}}
578 tizen.NDEFMessage.prototype.toByte = function() {
582 //helper for inherited object constructors /////////////////////////////////////////////
583 function InternalData() {
586 //////////////////NDEFRecord /////////////////
587 tizen.NDEFRecord = function(first, type, payload, id) {
588 var tnf_ = undefined;
589 var type_ = undefined;
590 var payload_ = undefined;
592 //if it is inherited call, then ignore validation
593 if ( !(first instanceof InternalData) ){
595 if (arguments.length >= 1) {
596 if (T_.isArray(first)) {
597 var raw_data_ = toByteArray(first);
598 // var result = native_.callSync(
599 // 'NDEFRecord_constructor', {
600 // 'rawData': raw_data_,
601 // 'rawDataSize' : raw_data_.length
604 // //set all needed fields here basing on result object
605 } else if (arguments.length >= 3){
606 tnf_ = Converter_.toLong(first);
607 type_ = toByteArray(type, 255);
608 payload_ = toByteArray(payload, Math.pow(2, 32)-1);
609 id_ = toByteArray(id, 255, true, []);
612 throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR);
615 //constructor call failed - empty object should be created
618 payload_ = undefined;
623 Object.defineProperties(this, {
624 tnf: {value: tnf_, writable: false, enumerable: true},
625 type: {value: type_, writable: false, enumerable: true},
626 id: {value: id_, writable: false, enumerable: true},
627 payload: {value: payload_, writable: false, enumerable: true},
631 //////////////////NDEFRecordText /////////////////
632 var ENCODING = ["UTF8", "UTF16"];
634 tizen.NDEFRecordText = function(text, languageCode, encoding) {
635 var text_ = undefined;
636 var languageCode_ = undefined;
637 var encoding_ = ENCODING[0];
639 if (arguments.length >= 2) {
640 text_ = Converter_.toString(text);
641 languageCode_ = Converter_.toString(languageCode);
643 if (!T_.isNullOrUndefined(encoding)) {
644 encoding_ = Converter_.toEnum(encoding, ENCODING, true);
647 // call parent constructor
648 // var result = native_.callSync(
649 // 'NDEFRecordText_constructor', {
651 // 'languageCode' : languageCode_,
652 // 'encoding' : encoding_,
655 // //set all needed fields here basing on result object
656 tizen.NDEFRecord.call(this, 1, [1,2,3], [1,2,3], [1,2,3]);
658 throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR);
661 //constructor call failed - empty object should be created
662 tizen.NDEFRecord.call(this);
664 languageCode_ = undefined;
665 encoding_ = undefined;
668 Object.defineProperties(this, {
669 text: {value: text_, writable: false, enumerable: true},
670 languageCode: {value: languageCode_, writable: false, enumerable: true},
671 encoding: {value: encoding_, writable: false, enumerable: true},
675 tizen.NDEFRecordText.prototype = new tizen.NDEFRecord(new InternalData());
677 tizen.NDEFRecordText.prototype.constructor = tizen.NDEFRecordText;
679 //////////////////NDEFRecordURI /////////////////
680 tizen.NDEFRecordURI = function(uri) {
681 var uri_ = undefined;
683 if (arguments.length >= 1) {
684 uri_ = Converter_.toString(uri);
686 // call parent constructor
687 // var result = native_.callSync(
688 // 'NDEFRecordURI_constructor', {
692 // //set all needed fields here basing on result object
693 tizen.NDEFRecord.call(this, 1, [1,2,3], [1,2,3], [1,2,3]);
695 throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR);
698 //constructor call failed - empty object should be created
699 tizen.NDEFRecord.call(this);
703 Object.defineProperties(this, {
704 uri: {value: uri_, writable: false, enumerable: true}
708 tizen.NDEFRecordURI.prototype = new tizen.NDEFRecord(new InternalData());
710 tizen.NDEFRecordURI.prototype.constructor = tizen.NDEFRecordURI;
712 //////////////////NDEFRecordMedia /////////////////
713 tizen.NDEFRecordMedia = function(mimeType, data) {
714 var mimeType_ = undefined;
715 var data_ = undefined;
717 if (arguments.length >= 2) {
718 miemType_ = Converter_.toString(mimeType);
719 data_ = toByteArray(data, Math.pow(2, 32)-1);
721 // call parent constructor
722 // var result = native_.callSync(
723 // 'NDEFRecordMedia_constructor', {
724 // 'mimeType': mimeType_,
728 // //set all needed fields here basing on result object
729 tizen.NDEFRecord.call(this, 1, [1,2,3], [1,2,3], [1,2,3]);
731 throw new tizen.WebAPIException(tizen.WebAPIException.INVALID_VALUES_ERR);
734 //constructor call failed - empty object should be created
735 tizen.NDEFRecord.call(this);
736 mimeType_ = undefined;
739 Object.defineProperties(this, {
740 mimeType: {value: mimeType_, writable: false, enumerable: true}
744 tizen.NDEFRecordMedia.prototype = new tizen.NDEFRecord(new InternalData());
746 tizen.NDEFRecordMedia.prototype.constructor = tizen.NDEFRecordMedia;
748 exports = new NFCManager();