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)
{
}
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) {
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;
}
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;
}
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) {
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);
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);
+ }
}
}
};
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 = {
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);
};
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});
+ }
};
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);
RemoveCardEmulationModeChangeListener);
REGISTER_SYNC("NFCAdapter_addTransactionEventListener",
AddTransactionEventListener);
+ REGISTER_SYNC("NFCAdapter_removeTransactionEventListener",
+ RemoveTransactionEventListener);
REGISTER_SYNC("NFCAdapter_addActiveSecureElementChangeListener",
AddActiveSecureElementChangeListener);
REGISTER_SYNC("NFCAdapter_removeActiveSecureElementChangeListener",
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(
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(