From: Lukasz Bardeli Date: Sun, 21 Dec 2014 13:31:39 +0000 (+0100) Subject: [NFC] add and remove TransactionEventListener implementation X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~766 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=341f3cc118974e5bec12cf82ccab86722a80fb71;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [NFC] add and remove TransactionEventListener implementation [Verification] Code compiles without errors. Change-Id: I739ff828eb6c81a2c48142f3002e13b564db9f24 Signed-off-by: Lukasz Bardeli --- diff --git a/src/nfc/nfc_adapter.cc b/src/nfc/nfc_adapter.cc index 7a434ba6..77c139e6 100644 --- a/src/nfc/nfc_adapter.cc +++ b/src/nfc/nfc_adapter.cc @@ -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(); 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(); 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(); + 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& data_array = response_obj.insert(std::make_pair("data", + picojson::value(picojson::array()))).first->second.get(); + + for (unsigned int i = 0; i < aid_size; i++) { + aid_array.push_back(picojson::value(static_cast(_aid[i]))); + } + + for (unsigned int i = 0; i < param_size; i++) { + aid_array.push_back(picojson::value(static_cast(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* callbackId = new double(args.get(CALLBACK_ID).get()); bool powered = args.get("powered").get(); 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()); + 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()); + + 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); diff --git a/src/nfc/nfc_adapter.h b/src/nfc/nfc_adapter.h index 1524d247..c9bd20b9 100644 --- a/src/nfc/nfc_adapter.h +++ b/src/nfc/nfc_adapter.h @@ -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 diff --git a/src/nfc/nfc_api.js b/src/nfc/nfc_api.js index b6619d9b..ffdd320e 100644 --- a/src/nfc/nfc_api.js +++ b/src/nfc/nfc_api.js @@ -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); diff --git a/src/nfc/nfc_instance.cc b/src/nfc/nfc_instance.cc index 17a50e2f..97b7c98a 100644 --- a/src/nfc/nfc_instance.cc +++ b/src/nfc/nfc_instance.cc @@ -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(