From bc02f46407902c8373a80b6daa6cfdb836232a0d Mon Sep 17 00:00:00 2001 From: Marcin Kaminski Date: Tue, 16 Dec 2014 19:09:29 +0100 Subject: [PATCH] [NFC] Adapter::cardEmulationMode implementation Support for cardEmulationMode attribute of NFCAdaper added. Change-Id: Ifc700942695702326387b662a596ed96bcf1d0d7 Signed-off-by: Marcin Kaminski --- src/nfc/nfc_adapter.cc | 51 +++++++++++++++++++++++++++++++++++ src/nfc/nfc_adapter.h | 5 ++++ src/nfc/nfc_api.js | 32 ++++++++++++++++++++-- src/nfc/nfc_instance.cc | 59 ++++++++++++++++++++++++----------------- src/nfc/nfc_instance.h | 2 ++ src/nfc/nfc_util.cc | 1 + 6 files changed, 123 insertions(+), 27 deletions(-) diff --git a/src/nfc/nfc_adapter.cc b/src/nfc/nfc_adapter.cc index 1e0670c3..31c5111a 100644 --- a/src/nfc/nfc_adapter.cc +++ b/src/nfc/nfc_adapter.cc @@ -188,5 +188,56 @@ void NFCAdapter::SetPowered(const picojson::value& args) { } +std::string NFCAdapter::GetCardEmulationMode() { + + LoggerD("Entered"); + + nfc_se_card_emulation_mode_type_e mode; + int ret = nfc_se_get_card_emulation_mode(&mode); + + if (NFC_ERROR_NONE != ret) { + LoggerE("Failed to get card emulation mode %d", ret); + NFCUtil::throwNFCException(ret, "Failed to get card emulation mode"); + } + + return NFCUtil::toStringCardEmulationMode(mode); +} + +void NFCAdapter::SetCardEmulationMode(std::string mode) { + + LoggerD("Entered"); + + nfc_se_card_emulation_mode_type_e newmode = + NFCUtil::toCardEmulationMode(mode); + std::string current_mode = GetCardEmulationMode(); + + if (mode.compare(current_mode) == 0) { + LoggerD("Card emulation mode already set to given value (%s)", + mode.c_str()); + return; + } + + int ret = NFC_ERROR_NONE; + switch (newmode) { + case NFC_SE_CARD_EMULATION_MODE_OFF: + ret = nfc_se_disable_card_emulation(); + break; + case NFC_SE_CARD_EMULATION_MODE_ON: + ret = nfc_se_enable_card_emulation(); + break; + default: + // Should never go here - in case of invalid mode + // exception is thrown from convertert few lines above + LoggerE("Invalid card emulation mode: %s", mode.c_str()); + throw InvalidValuesException("Invalid card emulation mode given"); + } + + if (NFC_ERROR_NONE != ret) { + LoggerE("Failed to set card emulation mode %d", ret); + NFCUtil::throwNFCException(ret, "Failed to set card emulation mode"); + } +} + + }// nfc }// extension diff --git a/src/nfc/nfc_adapter.h b/src/nfc/nfc_adapter.h index e4294e43..11e9dbf6 100644 --- a/src/nfc/nfc_adapter.h +++ b/src/nfc/nfc_adapter.h @@ -24,6 +24,11 @@ public: bool GetPowered(); void SetPowered(const picojson::value& args); +// cardEmulationModer getter and setter + std::string GetCardEmulationMode(); + void SetCardEmulationMode(std::string mode); + + static NFCAdapter* GetInstance(); NFCInstance *xwalk_instance; private: diff --git a/src/nfc/nfc_api.js b/src/nfc/nfc_api.js index ed6401f6..37f8c64a 100644 --- a/src/nfc/nfc_api.js +++ b/src/nfc/nfc_api.js @@ -98,14 +98,42 @@ function NFCAdapter() { return native_.getResultObject(ret); } + function cardEmulationModeGetter() { + var result = native_.callSync('NFCAdapter_cardEmulationModeGetter'); + + if (native_.isFailure(result)) { + throw new tizen.WebAPIException(0, result.error.message, result.error.name); + } + + return native_.getResultObject(result); + } + + function cardEmulationModeSetter(cem) { + // "NFCAdapter_cardEmulationModeSetter" + + var args = validator_.validateArgs(arguments, [ + {name: 'emulationMode', type: types_.STRING} + ]); + + var result = native_.callSync( + 'NFCAdapter_cardEmulationModeSetter', + { 'emulationMode': args.emulationMode} + ); + + if(native_.isFailure(result)) { + throw new tizen.WebAPIException(0, result.error.message, result.error.name); + } + return; + } + Object.defineProperties(this, { powered: {enumerable: true, set : function(){}, get : poweredGetter }, cardEmulationMode: {enumerable: true, - set : function(){}, - get : function(){} + set : cardEmulationModeSetter, + get : cardEmulationModeGetter }, activeSecureElement: {enumerable: true, set : function(){}, diff --git a/src/nfc/nfc_instance.cc b/src/nfc/nfc_instance.cc index a526af06..b78a96c9 100644 --- a/src/nfc/nfc_instance.cc +++ b/src/nfc/nfc_instance.cc @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "nfc/nfc_instance.h" +#include "nfc_instance.h" +#include "nfc_util.h" #include "common/picojson.h" #include "common/logger.h" @@ -30,6 +31,8 @@ NFCInstance::NFCInstance() { REGISTER_SYNC("NFCManager_getDefaultAdapter", GetDefaultAdapter); REGISTER_SYNC("NFCManager_setExclusiveMode", SetExclusiveMode); REGISTER_SYNC("NFCAdapter_getPowered", GetPowered); + REGISTER_SYNC("NFCAdapter_cardEmulationModeSetter", CardEmulationModeSetter); + REGISTER_SYNC("NFCAdapter_cardEmulationModeGetter", CardEmulationModeGetter); REGISTER_SYNC("NFCAdapter_setPeerListener", SetPeerListener); REGISTER_SYNC("NFCAdapter_setTagListener", SetTagListener); REGISTER_SYNC("NFCAdapter_setPeerListener", SetPeerListener); @@ -112,31 +115,11 @@ void NFCInstance::SetExclusiveMode( } if (NFC_ERROR_NONE != ret) { - LoggerE("setExclusiveModeForTransaction failed: %d", ret); - switch(ret) { - case NFC_ERROR_SECURITY_RESTRICTED: - { - auto ex = common::SecurityException("Not allowed to set exclusive mode"); - ReportError(ex, out); - break; - } - case NFC_ERROR_OPERATION_FAILED: - { - auto ex = common::UnknownException("Setting exclusive mode failed (IPC fail)"); - ReportError(ex, out); - break; - } - default: - { - auto ex = common::UnknownException("Unkown error"); - ReportError(ex, out); - break; - } - } - } - else { - ReportSuccess(out); + LoggerE("setExclusiveMode() failed: %d", ret); + NFCUtil::throwNFCException(ret, "Failed to set exclusie mode"); } + ReportSuccess(out); + } void NFCInstance::SetPowered( @@ -150,6 +133,32 @@ void NFCInstance::GetPowered( ReportSuccess(picojson::value(ret), out); } +void NFCInstance::CardEmulationModeSetter( + const picojson::value& args, picojson::object& out) { + + std::string mode = args.get("emulationMode").get(); + try { + NFCAdapter::GetInstance()->SetCardEmulationMode(mode); + } + catch(const common::PlatformException& ex) { + ReportError(ex, out); + } + ReportSuccess(out); +} + +void NFCInstance::CardEmulationModeGetter( + const picojson::value& args, picojson::object& out) { + + std::string mode; + try { + mode = NFCAdapter::GetInstance()->GetCardEmulationMode(); + } + catch(const common::PlatformException& ex) { + ReportError(ex, out); + } + ReportSuccess(picojson::value(mode), out); +} + void NFCInstance::SetTagListener( const picojson::value& args, picojson::object& out) { diff --git a/src/nfc/nfc_instance.h b/src/nfc/nfc_instance.h index 9481fdce..5c560742 100644 --- a/src/nfc/nfc_instance.h +++ b/src/nfc/nfc_instance.h @@ -28,6 +28,8 @@ private: void SetExclusiveMode(const picojson::value& args, picojson::object& out); void SetPowered(const picojson::value& args, picojson::object& out); void GetPowered(const picojson::value& args, picojson::object& out); + void CardEmulationModeSetter(const picojson::value& args, picojson::object& out); + void CardEmulationModeGetter(const picojson::value& args, picojson::object& out); void SetTagListener(const picojson::value& args, picojson::object& out); void SetPeerListener(const picojson::value& args, picojson::object& out); void UnsetTagListener(const picojson::value& args, picojson::object& out); diff --git a/src/nfc/nfc_util.cc b/src/nfc/nfc_util.cc index 290a7409..ed7f6a7f 100644 --- a/src/nfc/nfc_util.cc +++ b/src/nfc/nfc_util.cc @@ -30,6 +30,7 @@ void NFCUtil::throwNFCException(const int errorCode, const char* message) throw InvalidValuesException(message); break; case NFC_ERROR_SECURITY_RESTRICTED: + case NFC_ERROR_PERMISSION_DENIED: throw SecurityException(message); break; case NFC_ERROR_NOT_ACTIVATED: -- 2.34.1