From c70ab4046b8410e466a1d96bb920232c65b70df4 Mon Sep 17 00:00:00 2001 From: Marcin Kaminski Date: Mon, 29 Dec 2014 15:18:00 +0100 Subject: [PATCH] [NFC] NFCTag::writeNDEF implementation Exception throwing from function will be added soon after necessary fixes merged into repository. Change-Id: I9affbd232919e560edd5f60cd40632ba606a3135 Signed-off-by: Marcin Kaminski --- src/nfc/nfc_adapter.cc | 73 +++++++++++++++++++++++++++++++++++++---- src/nfc/nfc_adapter.h | 1 + src/nfc/nfc_api.js | 47 +++++++++++++++++++++++--- src/nfc/nfc_instance.cc | 12 ++++++- 4 files changed, 121 insertions(+), 12 deletions(-) diff --git a/src/nfc/nfc_adapter.cc b/src/nfc/nfc_adapter.cc index 444b6669..dbae20e7 100644 --- a/src/nfc/nfc_adapter.cc +++ b/src/nfc/nfc_adapter.cc @@ -10,6 +10,7 @@ #include "common/logger.h" #include "common/platform_exception.h" +#include "common/converter.h" using namespace common; using namespace std; @@ -654,7 +655,7 @@ std::string NFCAdapter::TagTypeGetter(int tag_id) { int err = nfc_tag_get_type(m_last_tag_handle, &type); if(NFC_ERROR_NONE != err) { - LOGE("Failed to get tag type: %d", err); + LoggerE("Failed to get tag type: %d", err); NFCUtil::throwNFCException(err, "Failed to get tag type"); } @@ -669,7 +670,7 @@ bool NFCAdapter::TagIsSupportedNDEFGetter(int tag_id) { int err = nfc_tag_is_support_ndef(m_last_tag_handle, &result); if(NFC_ERROR_NONE != err) { - LOGE("Failed to check if NDEF is supported %d", err); + LoggerE("Failed to check if NDEF is supported %d", err); NFCUtil::throwNFCException(err, "Failed to check if NDEF is supported"); } @@ -685,7 +686,7 @@ unsigned int NFCAdapter::TagNDEFSizeGetter(int tag_id) { int err = nfc_tag_get_ndef_size(m_last_tag_handle, &result); if(NFC_ERROR_NONE != err) { - LOGE("Failed to get tag NDEF size: %d, %s", err); + LoggerE("Failed to get tag NDEF size: %d, %s", err); NFCUtil::throwNFCException(err, "Failed to get tag NDEF size"); } @@ -737,7 +738,7 @@ bool NFCAdapter::TagIsConnectedGetter(int tag_id) { nfc_tag_h handle = NULL; int result = nfc_manager_get_connected_tag(&handle); if(NFC_ERROR_NONE != result) { - LOGE("Failed to get connected tag: %s", + LoggerE("Failed to get connected tag: %s", NFCUtil::getNFCErrorMessage(result).c_str()); // exception is thrown here to return undefined in JS layer // instead of false @@ -891,7 +892,7 @@ void NFCAdapter::TagReadNDEF(int tag_id, const picojson::value& args) { LoggerD("Received callback id: %f", callbackId); if(!TagIsConnectedGetter(tag_id)) { - auto ex = UnknownException("Tag is no more connected"); + UnknownException ex("Tag is no more connected"); picojson::value event = createEventError(callbackId, ex); NFCInstance::getInstance().PostMessage(event.serialize().c_str()); @@ -916,7 +917,7 @@ void NFCAdapter::TagReadNDEF(int tag_id, const picojson::value& args) { // ... otherwise call error callback std::string errName = NFCUtil::getNFCErrorString(result); std::string errMessage = NFCUtil::getNFCErrorMessage(result); - auto ex = PlatformException(errName, errMessage); + PlatformException ex(errName, errMessage); picojson::value event = createEventError(callbackId, ex); NFCInstance::getInstance().PostMessage(event.serialize().c_str()); @@ -924,5 +925,65 @@ void NFCAdapter::TagReadNDEF(int tag_id, const picojson::value& args) { } +void NFCAdapter::TagWriteNDEF(int tag_id, const picojson::value& args) { + + LoggerD("Entered"); + + double callbackId = args.get(CALLBACK_ID).get(); + LoggerD("Received callback id: %f", callbackId); + + if(!TagIsConnectedGetter(tag_id)) { + UnknownException ex("Tag is no more connected"); + + picojson::value event = createEventError(callbackId, ex); + NFCInstance::getInstance().PostMessage(event.serialize().c_str()); + return; + } + + const picojson::array& records_array = FromJson( + args.get(), "records"); + + const int size = static_cast(args.get("recordsSize").get()); + + nfc_ndef_message_h message = NFCMessageUtils::NDEFMessageToStruct(records_array, size); + + if(message){ + int result = nfc_tag_write_ndef(m_last_tag_handle, message, NULL, NULL); + + // Message is no more needed - can be removed + // TODO: uncomment line below after merging commit + // that adds this function + //NFCMessageUtils::removeMessageHandle(message) + if (NFC_ERROR_NONE != result){ + + // for permission related error throw exception + if(NFC_ERROR_SECURITY_RESTRICTED == result || + NFC_ERROR_PERMISSION_DENIED == result) { + throw SecurityException("Failed to read NDEF - permission denied"); + } + + LoggerE("Error occured when sending message: %d", result); + std::string errName = NFCUtil::getNFCErrorString(result); + std::string errMessage = NFCUtil::getNFCErrorMessage(result); + LoggerE("%s: %s", errName.c_str(), errMessage.c_str()); + + // create and post error message + PlatformException ex(errName, errMessage); + picojson::value event = createEventError(callbackId, ex); + NFCInstance::getInstance().PostMessage(event.serialize().c_str()); + } + else { + // create and post success message + picojson::value event = createEventSuccess(callbackId); + NFCInstance::getInstance().PostMessage(event.serialize().c_str()); + } + } else { + LoggerE("Invalid message handle"); + InvalidValuesException ex("Message is not valid"); + picojson::value event = createEventError(callbackId, ex); + NFCInstance::getInstance().PostMessage(event.serialize().c_str()); + } +} + }// nfc }// extension diff --git a/src/nfc/nfc_adapter.h b/src/nfc/nfc_adapter.h index 5293309e..32d7afe3 100644 --- a/src/nfc/nfc_adapter.h +++ b/src/nfc/nfc_adapter.h @@ -65,6 +65,7 @@ public: bool TagIsConnectedGetter(int tag_id); // methods void TagReadNDEF(int tag_id, const picojson::value& args); + void TagWriteNDEF(int tag_id, const picojson::value& args); // listeners void SetTagListener(); void UnsetTagListener(); diff --git a/src/nfc/nfc_api.js b/src/nfc/nfc_api.js index 298293cb..bb1b0219 100644 --- a/src/nfc/nfc_api.js +++ b/src/nfc/nfc_api.js @@ -614,7 +614,7 @@ function NFCTag(tagid) { function(result) { if (native_.isFailure(result)) { if(!T_.isNullOrUndefined(args.errorCallback)) { - args.errorCallback(result.error); + args.errorCallback(native_.getErrorObject(result)); } } else { var message = new tizen.NDEFMessage(result.records); @@ -624,6 +624,47 @@ function NFCTag(tagid) { }; + NFCTag.prototype.writeNDEF = function() { + var args = validator_.validateArgs(arguments, [ + { + name: 'message', + type : types_.PLATFORM_OBJECT, + values : tizen.NDEFMessage + }, + { + name : 'successCallback', + type : types_.FUNCTION, + optional : true, + nullable : true + }, + { + name : 'errorCallback', + type : types_.FUNCTION, + optional : true, + nullable : true + } + ]); + + native_.call('NFCTag_writeNDEF', + { + 'id' : _my_id, + 'records' : args.message.records, + 'recordsSize' : args.message.recordCount + }, + function(result) { + if (native_.isFailure(result)) { + if(!T_.isNullOrUndefined(args.errorCallback)) { + args.errorCallback(native_.getErrorObject(result)); + } + } else { + if(!T_.isNullOrUndefined(args.successCallback)) { + args.successCallback(); + } + } + }); + + }; + Object.defineProperties(this, { type: { set: function() {}, @@ -653,10 +694,6 @@ function NFCTag(tagid) { }); } -NFCTag.prototype.writeNDEF = function() { - -}; - NFCTag.prototype.transceive = function() { }; diff --git a/src/nfc/nfc_instance.cc b/src/nfc/nfc_instance.cc index bd45c99f..aa493ca6 100644 --- a/src/nfc/nfc_instance.cc +++ b/src/nfc/nfc_instance.cc @@ -334,7 +334,7 @@ void NFCInstance::SetExclusiveModeForTransaction( void NFCInstance::ReadNDEF( const picojson::value& args, picojson::object& out) { - int tag_id = (int)args.get("id").get(); + int tag_id = static_cast(args.get("id").get()); LoggerD("Tag id: %d", tag_id); try { @@ -349,6 +349,16 @@ void NFCInstance::ReadNDEF( void NFCInstance::WriteNDEF( const picojson::value& args, picojson::object& out) { + int tag_id = static_cast(args.get("id").get()); + LoggerD("Tag id: %d", tag_id); + + try { + NFCAdapter::GetInstance()->TagWriteNDEF(tag_id, args); + ReportSuccess(out); + } + catch(const common::PlatformException& ex) { + ReportError(ex, out); + } } void NFCInstance::Transceive( -- 2.34.1