[NFC] NFCTag::writeNDEF implementation
authorMarcin Kaminski <marcin.ka@samsung.com>
Mon, 29 Dec 2014 14:18:00 +0000 (15:18 +0100)
committerMarcin Kaminski <marcin.ka@samsung.com>
Fri, 2 Jan 2015 15:16:24 +0000 (16:16 +0100)
Exception throwing from function will be added
soon after necessary fixes merged into repository.

Change-Id: I9affbd232919e560edd5f60cd40632ba606a3135
Signed-off-by: Marcin Kaminski <marcin.ka@samsung.com>
src/nfc/nfc_adapter.cc
src/nfc/nfc_adapter.h
src/nfc/nfc_api.js
src/nfc/nfc_instance.cc

index 444b666994c56e3d2aa9767b0f127f35a652ba82..dbae20e74d6d4887de00c978e9ed8e7e0babfc00 100644 (file)
@@ -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<double>();
+    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<picojson::array>(
+            args.get<picojson::object>(), "records");
+
+    const int size = static_cast<int>(args.get("recordsSize").get<double>());
+
+    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
index 5293309e23a9acd69b3312dffa4db9498dbdf62e..32d7afe34a946928e37b8f6f33af86a598e83a98 100644 (file)
@@ -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();
index 298293cb406984952d881ffc41c5c79cdb35ee6c..bb1b02197d3256afc489d02e0dbe068ce5b0c92a 100644 (file)
@@ -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() {
 
 };
index bd45c99f135b005f549a836ace88f72e84a0e2ab..aa493ca6ea36c154924f05a707608d043cbd866e 100644 (file)
@@ -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<double>();
+    int tag_id = static_cast<int>(args.get("id").get<double>());
     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<int>(args.get("id").get<double>());
+    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(