[NFC] add and remove TransactionEventListener implementation
authorLukasz Bardeli <l.bardeli@samsung.com>
Sun, 21 Dec 2014 13:31:39 +0000 (14:31 +0100)
committerLukasz Bardeli <l.bardeli@samsung.com>
Sun, 21 Dec 2014 13:31:46 +0000 (14:31 +0100)
[Verification] Code compiles without errors.

Change-Id: I739ff828eb6c81a2c48142f3002e13b564db9f24
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
src/nfc/nfc_adapter.cc
src/nfc/nfc_adapter.h
src/nfc/nfc_api.js
src/nfc/nfc_instance.cc

index 7a434ba648189e585ff76189ea4f94d92c34c5b8..77c139e6edfbb0f33f308092466cdf1af195db9f 100644 (file)
@@ -17,8 +17,25 @@ using namespace std;
 namespace extension {
 namespace nfc {
 
+namespace {
+const std::string CALLBACK_ID = "callbackId";
+const std::string LISTENER_ID = "listenerId";
+const std::string TYPE = "type";
+const std::string MODE = "mode";
+
+const std::string CARD_ELEMENT = "CardElement";
+const std::string TRANSACTION = "Transaction";
+
+const std::string ACTIVE_SECURE_ELEMENT_CHANGED = "ActiveSecureElementChanged";
+const std::string CARD_EMULATION_MODE_CHANGED = "CardEmulationModeChanged";
+const std::string TRANSACTION_EVENT_LISTENER_ESE = "TransactionEventListener_ESE";
+const std::string TRANSACTION_EVENT_LISTENER_UICC = "TransactionEventListener_UICC";
+}
+
 NFCAdapter::NFCAdapter():
-        m_is_listener_set(false)
+        m_is_listener_set(false),
+        m_is_transaction_ese_listener_set(false),
+        m_is_transaction_uicc_listener_set(false)
 {
 }
 
@@ -26,6 +43,12 @@ NFCAdapter::~NFCAdapter() {
     if (m_is_listener_set) {
         nfc_manager_unset_se_event_cb();
     }
+    if (m_is_transaction_ese_listener_set) {
+        nfc_manager_unset_se_transaction_event_cb(NFC_SE_TYPE_ESE);
+    }
+    if (m_is_transaction_uicc_listener_set) {
+        nfc_manager_unset_se_transaction_event_cb(NFC_SE_TYPE_UICC);
+    }
 }
 
 static picojson::value createEventError(double callbackId, PlatformException ex) {
@@ -33,7 +56,7 @@ static picojson::value createEventError(double callbackId, PlatformException ex)
     picojson::value event = picojson::value(picojson::object());
     picojson::object& obj = event.get<picojson::object>();
     NFCInstance::getInstance().InstanceReportError(ex, obj);
-    obj.insert(std::make_pair("callbackId", callbackId));
+    obj.insert(std::make_pair(CALLBACK_ID, callbackId));
 
     return event;
 }
@@ -42,7 +65,7 @@ static picojson::value createEventSuccess(double callbackId) {
     picojson::value event = picojson::value(picojson::object());
     picojson::object& obj = event.get<picojson::object>();
     NFCInstance::getInstance().InstanceReportSuccess(obj);
-    obj.insert(std::make_pair("callbackId", callbackId));
+    obj.insert(std::make_pair(CALLBACK_ID, callbackId));
 
     return event;
 }
@@ -101,24 +124,58 @@ static void se_event_callback(nfc_se_event_e se_event, void *user_data) {
     switch (se_event) {
         case NFC_SE_EVENT_SE_TYPE_CHANGED:
             result = NFCAdapter::GetInstance()->GetActiveSecureElement();
-            obj.insert(make_pair("listenerId", "ActiveSecureElementChanged"));
+            obj.insert(make_pair(LISTENER_ID, ACTIVE_SECURE_ELEMENT_CHANGED));
             break;
         case NFC_SE_EVENT_CARD_EMULATION_CHANGED:
             result = NFCAdapter::GetInstance()->GetCardEmulationMode();
-            obj.insert(make_pair("listenerId", "CardEmulationModeChanged"));
+            obj.insert(make_pair(LISTENER_ID, CARD_EMULATION_MODE_CHANGED));
             break;
         default:
             LOGD("se_event_occured: %d", se_event);
             return;
     }
 
-    obj.insert(make_pair("mode", result));
+    obj.insert(make_pair(TYPE, CARD_ELEMENT));
+    obj.insert(make_pair(MODE, result));
     NFCInstance::getInstance().PostMessage(event.serialize().c_str());
 }
 
+static void transaction_event_callback(nfc_se_type_e type,
+                                       unsigned char *_aid,
+                                       int aid_size,
+                                       unsigned char *param,
+                                       int param_size,
+                                       void *user_data)
+{
+    picojson::value response = picojson::value(picojson::object());
+    picojson::object& response_obj = response.get<picojson::object>();
+    NFCInstance::getInstance().InstanceReportSuccess(response_obj);
+    picojson::array& aid_array = response_obj.insert(std::make_pair("aid",
+            picojson::value(picojson::array()))).first->second.get<picojson::array>();
+    picojson::array& data_array = response_obj.insert(std::make_pair("data",
+            picojson::value(picojson::array()))).first->second.get<picojson::array>();
+
+    for (unsigned int i = 0; i < aid_size; i++) {
+        aid_array.push_back(picojson::value(static_cast<double>(_aid[i])));
+    }
+
+    for (unsigned int i = 0; i < param_size; i++) {
+        aid_array.push_back(picojson::value(static_cast<double>(param[i])));
+    }
+
+    if (NFC_SE_TYPE_ESE == type) {
+        response_obj.insert(make_pair(LISTENER_ID, TRANSACTION_EVENT_LISTENER_ESE));
+    } else {
+        response_obj.insert(make_pair(LISTENER_ID, TRANSACTION_EVENT_LISTENER_UICC));
+    }
+
+    response_obj.insert(make_pair(TYPE, TRANSACTION));
+    NFCInstance::getInstance().PostMessage(response.serialize().c_str());
+}
+
 void NFCAdapter::SetPowered(const picojson::value& args) {
 
-    double* callbackId = new double(args.get("callbackId").get<double>());
+    double* callbackId = new double(args.get(CALLBACK_ID).get<double>());
     bool powered = args.get("powered").get<bool>();
 
     if (nfc_manager_is_activated() == powered) {
@@ -347,6 +404,47 @@ void NFCAdapter::RemoveCardEmulationModeChangeListener() {
     m_is_listener_set = false;
 }
 
+void NFCAdapter::AddTransactionEventListener(const picojson::value& args) {
+
+    nfc_se_type_e se_type = NFCUtil::toSecureElementType(
+            args.get("type").get<string>());
+    int ret = NFC_ERROR_NONE;
+
+    if (NFC_SE_TYPE_ESE == se_type) {
+        if (m_is_transaction_ese_listener_set) {
+            ret = nfc_manager_set_se_transaction_event_cb(se_type,
+                transaction_event_callback, NULL);
+        }
+        m_is_transaction_ese_listener_set = true;
+    } else {
+        if (m_is_transaction_uicc_listener_set) {
+            ret = nfc_manager_set_se_transaction_event_cb(se_type,
+                transaction_event_callback, NULL);
+        }
+        m_is_transaction_uicc_listener_set = true;
+    }
+
+    if (NFC_ERROR_NONE != ret) {
+        LOGE("AddTransactionEventListener failed: %d", ret);
+        NFCUtil::throwNFCException(ret,
+            NFCUtil::getNFCErrorMessage(ret).c_str());
+    }
+}
+
+void NFCAdapter::RemoveTransactionEventListener(const picojson::value& args) {
+
+    nfc_se_type_e se_type = NFCUtil::toSecureElementType(
+                args.get("type").get<string>());
+
+    nfc_manager_unset_se_transaction_event_cb(se_type);
+
+    if (se_type == NFC_SE_TYPE_ESE) {
+        m_is_transaction_ese_listener_set = false;
+    } else {
+        m_is_transaction_uicc_listener_set = false;
+    }
+}
+
 void NFCAdapter::AddActiveSecureElementChangeListener() {
     if (!m_is_listener_set) {
         int ret = nfc_manager_set_se_event_cb(se_event_callback, NULL);
index 1524d247ecade205cb0c73336f2cde407f139455..c9bd20b908077cf7915464c7b45e9e9ffeeadb48 100644 (file)
@@ -36,6 +36,8 @@ public:
 
     void AddCardEmulationModeChangeListener();
     void RemoveCardEmulationModeChangeListener();
+    void AddTransactionEventListener(const picojson::value& args);
+    void RemoveTransactionEventListener(const picojson::value& args);
     void AddActiveSecureElementChangeListener();
     void RemoveActiveSecureElementChangeListener();
 
@@ -45,6 +47,8 @@ private:
     virtual ~NFCAdapter();
 
     bool m_is_listener_set;
+    bool m_is_transaction_ese_listener_set;
+    bool m_is_transaction_uicc_listener_set;
 };
 
 } // nfc
index b6619d9b397c8dce0cd714dfe8c6101faab3fe0c..ffdd320e2b047e2a6183cb535bda39d92b456904 100644 (file)
@@ -18,7 +18,11 @@ function ListenerManager(native, listenerName) {
 ListenerManager.prototype.onListenerCalled = function(msg) {
     for (var key in this.listeners) {
         if (this.listeners.hasOwnProperty(key)) {
-            this.listeners[key](msg.mode);
+            if ('CardElement' == msg.type) {
+                this.listeners[key](msg.mode);
+            } else if ('Transaction' == msg.type) {
+                this.listeners[key](msg.aid, msg.data);
+            }
       }
     }
 };
@@ -42,8 +46,12 @@ ListenerManager.prototype.removeListener = function(watchId) {
 
 var CARD_EMULATION_MODE_LISTENER = 'CardEmulationModeChanged';
 var ACTIVE_SECURE_ELEMENT_LISTENER = 'ActiveSecureElementChanged';
+var TRANSACTION_EVENT_ESE_LISTENER = 'TransactionEventListener_ESE';
+var TRANSACTION_EVENT_UICC_LISTENER = 'TransactionEventListener_UICC';
 var cardEmulationModeListener = new ListenerManager(native_, CARD_EMULATION_MODE_LISTENER);
 var activeSecureElementChangeListener = new ListenerManager(native_, ACTIVE_SECURE_ELEMENT_LISTENER);
+var transactionEventListenerEse = new ListenerManager(native_, TRANSACTION_EVENT_ESE_LISTENER);
+var transactionEventListenerUicc = new ListenerManager(native_, TRANSACTION_EVENT_UICC_LISTENER);
 
 //enumeration NDEFRecordTextEncoding ////////////////////////////////////////////////////
 var NDEFRecordTextEncoding = {
@@ -278,7 +286,12 @@ NFCAdapter.prototype.addCardEmulationModeChangeListener = function() {
 
     if (T_.isEmptyObject(cardEmulationModeListener.listeners) &&
             T_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
-        native_.callSync('NFCAdapter_addCardEmulationModeChangeListener');
+        var result = native_.callSync(
+                'NFCAdapter_addCardEmulationModeChangeListener');
+        if (native_.isFailure(result)) {
+            throw new tizen.WebAPIException(0, result.error.message,
+                    result.error.name);
+        }
     }
 
     return cardEmulationModeListener.addListener(args.callback);
@@ -300,10 +313,68 @@ NFCAdapter.prototype.removeCardEmulationModeChangeListener = function() {
 };
 
 NFCAdapter.prototype.addTransactionEventListener = function() {
+    var args = validator_.validateArgs(arguments, [
+        {
+            name: 'type',
+            type: types_.ENUM,
+            values: T_.getValues(SecureElementType)
+        },
+        {
+            name: 'callback',
+            type: types_.LISTENER,
+            values: ['ondetected']
+        }
+    ]);
+
+    var result;
 
+    if (SecureElementType.ESE == args.type) {
+        if (T_.isEmptyObject(transactionEventListenerEse.listeners)) {
+            result = native_.callSync('NFCAdapter_addTransactionEventListener',{
+                type: args.type});
+            if (native_.isFailure(result)) {
+                throw new tizen.WebAPIException(0, result.error.message,
+                        result.error.name);
+            }
+        }
+        return transactionEventListenerEse.addListener(args.callback);
+    } else {
+        if (T_.isEmptyObject(transactionEventListenerUicc.listeners)) {
+            result = native_.callSync('NFCAdapter_addTransactionEventListener',{
+                type: args.type});
+            if (native_.isFailure(result)) {
+                throw new tizen.WebAPIException(0, result.error.message,
+                        result.error.name);
+            }
+        }
+        return transactionEventListenerUicc.addListener(args.callback);
+    }
 };
 
 NFCAdapter.prototype.removeTransactionEventListener = function() {
+    var args = validator_.validateArgs(arguments, [
+        {
+            name: 'watchId',
+            type: types_.LONG
+        }
+    ]);
+
+    var ese_empty = T_.isEmptyObject(transactionEventListenerEse.listeners)
+    var uicc_empty = T_.isEmptyObject(transactionEventListenerUicc.listeners)
+
+    transactionEventListenerEse.removeListener(args.watchId);
+    transactionEventListenerUicc.removeListener(args.watchId);
+
+    if (T_.isEmptyObject(transactionEventListenerEse.listeners) && !ese_empty) {
+        native_.callSync('NFCAdapter_removeTransactionEventListener',{
+            type: SecureElementType.ESE});
+    }
+
+    if (T_.isEmptyObject(transactionEventListenerUicc.listeners)
+            && !uicc_empty) {
+        native_.callSync('NFCAdapter_removeTransactionEventListener',{
+            type: SecureElementType.UICC});
+    }
 
 };
 
@@ -318,7 +389,12 @@ NFCAdapter.prototype.addActiveSecureElementChangeListener = function() {
 
     if (T_.isEmptyObject(cardEmulationModeListener.listeners) &&
             T_.isEmptyObject(activeSecureElementChangeListener.listeners)) {
-        native_.callSync('NFCAdapter_addActiveSecureElementChangeListener ');
+        var result = native_.callSync(
+                'NFCAdapter_addActiveSecureElementChangeListener ');
+        if (native_.isFailure(result)) {
+            throw new tizen.WebAPIException(0, result.error.message,
+                    result.error.name);
+        }
     }
 
    return activeSecureElementChangeListener.addListener(args.callback);
index 17a50e2f19ea5ac24bf6395e2944a48229121b3b..97b7c98abea17fb1a5c6276ac56c71c347f1f543 100644 (file)
@@ -46,6 +46,8 @@ NFCInstance::NFCInstance() {
             RemoveCardEmulationModeChangeListener);
     REGISTER_SYNC("NFCAdapter_addTransactionEventListener",
             AddTransactionEventListener);
+    REGISTER_SYNC("NFCAdapter_removeTransactionEventListener",
+            RemoveTransactionEventListener);
     REGISTER_SYNC("NFCAdapter_addActiveSecureElementChangeListener",
             AddActiveSecureElementChangeListener);
     REGISTER_SYNC("NFCAdapter_removeActiveSecureElementChangeListener",
@@ -214,7 +216,12 @@ void NFCInstance::UnsetPeerListener(
 
 void NFCInstance::AddCardEmulationModeChangeListener(
         const picojson::value& args, picojson::object& out) {
-    NFCAdapter::GetInstance()->AddCardEmulationModeChangeListener();
+    try {
+        NFCAdapter::GetInstance()->AddCardEmulationModeChangeListener();
+        ReportSuccess(out);
+    } catch(const common::PlatformException& ex) {
+        ReportError(ex, out);
+    }
 }
 
 void NFCInstance::RemoveCardEmulationModeChangeListener(
@@ -224,12 +231,27 @@ void NFCInstance::RemoveCardEmulationModeChangeListener(
 
 void NFCInstance::AddTransactionEventListener(
         const picojson::value& args, picojson::object& out) {
+    try {
+        NFCAdapter::GetInstance()->AddTransactionEventListener(args);
+        ReportSuccess(out);
+    } catch(const common::PlatformException& ex) {
+        ReportError(ex, out);
+    }
+}
 
+void NFCInstance::RemoveTransactionEventListener(
+        const picojson::value& args, picojson::object& out) {
+    NFCAdapter::GetInstance()->RemoveTransactionEventListener(args);
 }
 
 void NFCInstance::AddActiveSecureElementChangeListener(
         const picojson::value& args, picojson::object& out) {
-    NFCAdapter::GetInstance()->AddActiveSecureElementChangeListener();
+    try {
+        NFCAdapter::GetInstance()->AddActiveSecureElementChangeListener();
+        ReportSuccess(out);
+    } catch(const common::PlatformException& ex) {
+        ReportError(ex, out);
+    }
 }
 
 void NFCInstance::RemoveActiveSecureElementChangeListener(