[NFC] implementation sendNDEF
authorLukasz Bardeli <l.bardeli@samsung.com>
Mon, 5 Jan 2015 13:55:09 +0000 (14:55 +0100)
committerLukasz Bardeli <l.bardeli@samsung.com>
Wed, 7 Jan 2015 10:05:17 +0000 (11:05 +0100)
[Verification] Code compiles without error

Change-Id: I465536d0ec30ca8ea83f20033275825628277645
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
src/nfc/nfc_adapter.cc
src/nfc/nfc_adapter.h
src/nfc/nfc_api.js
src/nfc/nfc_instance.cc
src/nfc/nfc_message_utils.cc
src/nfc/nfc_message_utils.h

index 8cbe3c9..77644b1 100644 (file)
@@ -531,7 +531,7 @@ void NFCAdapter::IncreasePeerId() {
     m_latest_peer_id++;
 }
 
-bool NFCAdapter::IsPeerConnected(int peer_id) {
+bool NFCAdapter::PeerIsConnectedGetter(int peer_id) {
     if (m_latest_peer_id != peer_id || !m_peer_handle) {
         return false;
     }
@@ -628,7 +628,7 @@ void NFCAdapter::SetReceiveNDEFListener(int peer_id) {
 void NFCAdapter::UnsetReceiveNDEFListener(int peer_id) {
     if (m_is_ndef_listener_set) {
         //check if peer object is still connected
-        if (!IsPeerConnected(peer_id)) {
+        if (!PeerIsConnectedGetter(peer_id)) {
             LOGE("Target is not connected");
         }
 
@@ -1092,12 +1092,7 @@ void NFCAdapter::GetCachedMessage(picojson::object& out) {
     int result = nfc_manager_get_cached_message(&message_handle);
     if (NFC_ERROR_INVALID_NDEF_MESSAGE == result ||
             NFC_ERROR_NO_NDEF_MESSAGE == result) {
-        if (NULL != message_handle) {
-            int err = nfc_ndef_message_destroy(message_handle);
-            if (NFC_ERROR_NONE != err) {
-                LOGE("Failed to free cached message: %d", err);
-            }
-        }
+        NFCMessageUtils::RemoveMessageHandle(message_handle);
 
         return;
     }
@@ -1114,13 +1109,70 @@ void NFCAdapter::GetCachedMessage(picojson::object& out) {
         return;
     }
     NFCMessageUtils::ReportNdefMessageFromData(raw_data, size, out);
-    result = nfc_ndef_message_destroy(message_handle);
-    if (NFC_ERROR_NONE != result) {
-        LOGE("Failed to destroy message: %d", result);
-    }
+    NFCMessageUtils::RemoveMessageHandle(message_handle);
     free(raw_data);
 }
 
+static void peerSentCallback(nfc_error_e result, void *user_data) {
+    double* callbackId = static_cast<double*>(user_data);
+
+    if (NFC_ERROR_NONE != result){
+        auto ex = PlatformException(NFCUtil::getNFCErrorString(result),
+                NFCUtil::getNFCErrorMessage(result));
+
+        picojson::value event = createEventError(*callbackId, ex);
+
+        NFCInstance::getInstance().PostMessage(event.serialize().c_str());
+    } else {
+        picojson::value event = createEventSuccess(*callbackId);
+
+        NFCInstance::getInstance().PostMessage(event.serialize().c_str());
+    }
+
+    delete callbackId;
+    callbackId = NULL;
+}
+
+static gboolean sendNDEFErrorCB(void * user_data) {
+    peerSentCallback(NFC_ERROR_INVALID_NDEF_MESSAGE, user_data);
+    return false;
+}
+
+void NFCAdapter::sendNDEF(int peer_id, const picojson::value& args) {
+    double* callbackId = new double(args.get(CALLBACK_ID).get<double>());
+
+    if(!PeerIsConnectedGetter(peer_id)) {
+        UnknownException ex("Peer is no more connected");
+        picojson::value event = createEventError(*callbackId, ex);
+        NFCInstance::getInstance().PostMessage(event.serialize().c_str());
+        delete callbackId;
+        callbackId = NULL;
+        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 ret = nfc_p2p_send(m_peer_handle, message,
+                peerSentCallback, static_cast<void *>(callbackId));
+        NFCMessageUtils::RemoveMessageHandle(message);
+        if (NFC_ERROR_NONE != ret) {
+            LOGE("sendNDEF failed %d",ret);
+            delete callbackId;
+            callbackId = NULL;
+            NFCUtil::throwNFCException(ret, "sendNDEF failed.");
+        }
+    } else {
+        if (!g_idle_add(sendNDEFErrorCB, static_cast<void*>(callbackId))) {
+            LOGE("g_idle addition failed");
+            delete callbackId;
+            callbackId = NULL;
+        }
+    }
+}
 }// nfc
 }// extension
index e56b415..15a5830 100644 (file)
@@ -51,11 +51,12 @@ public:
     nfc_p2p_target_h GetPeerHandle();
     int GetPeerId();
     void IncreasePeerId();
-    bool IsPeerConnected(int peer_id);
+    bool PeerIsConnectedGetter(int peer_id);
     void SetPeerListener();
     void UnsetPeerListener();
     void SetReceiveNDEFListener(int peer_id);
     void UnsetReceiveNDEFListener(int peer_id);
+    void sendNDEF(int peer_id, const picojson::value& args);
     bool IsNDEFListenerSet();
 
 // NFCTag related methods
index de2fd62..599416c 100644 (file)
@@ -755,6 +755,40 @@ function NFCPeer(peerid) {
         return native_.getResultObject(ret);
     }
 
+    NFCPeer.prototype.sendNDEF = 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('NFCPeer_sendNDEF', {
+            'id' : _my_id,
+            'records' : args.message.records,
+            'recordsSize' : args.message.recordCount
+        }, function(result) {
+            if (native_.isFailure(result)) {
+                args.errorCallback(result.error);
+            } else {
+                args.successCallback();
+            }
+        });
+    };
+
     Object.defineProperties(this, {
         isConnected: {
             enumerable: true,
@@ -801,11 +835,6 @@ NFCPeer.prototype.unsetReceiveNDEFListener = function() {
     return;
 };
 
-NFCPeer.prototype.sendNDEF = function() {
-
-};
-
-
 var toByteArray = function(array, max_size, nullable) {
     var resultArray = [];
     if (T_.isNullOrUndefined(array) && nullable === true)
index a185423..8e43eb2 100644 (file)
@@ -226,7 +226,7 @@ void NFCInstance::PeerIsConnectedGetter(
 
     try {
         int peer_id = (int)args.get("id").get<double>();
-        bool ret = NFCAdapter::GetInstance()->IsPeerConnected(peer_id);
+        bool ret = NFCAdapter::GetInstance()->PeerIsConnectedGetter(peer_id);
         ReportSuccess(picojson::value(ret), out);
     }
     catch(const common::PlatformException& ex) {
@@ -415,7 +415,16 @@ void NFCInstance::UnsetReceiveNDEFListener(
 
 void NFCInstance::SendNDEF(
         const picojson::value& args, picojson::object& out) {
+    int peer_id = static_cast<int>(args.get("id").get<double>());
+    LoggerD("Peer id: %d", peer_id);
 
+    try {
+        NFCAdapter::GetInstance()->sendNDEF(peer_id, args);
+        ReportSuccess(out);
+    }
+    catch(const common::PlatformException& ex) {
+        ReportError(ex, out);
+    }
 }
 
 void NFCInstance::ToByte(
index dc69b71..4347de1 100644 (file)
@@ -40,7 +40,7 @@ namespace {
 }
 
 /* -------------------------------COMMON FUNCTIONS------------------------------------ */
-static void removeMessageHandle(nfc_ndef_message_h message_handle)
+void RemoveMessageHandle(nfc_ndef_message_h message_handle)
 {
     if (message_handle) {
         int result = nfc_ndef_message_destroy(message_handle);
@@ -78,7 +78,7 @@ static short getTnfFromHandle(nfc_ndef_record_h handle,
             removeRecordHandle(handle);
         }
         else {
-            removeMessageHandle(message_handle);
+            RemoveMessageHandle(message_handle);
         }
         NFCUtil::throwNFCException(result, "Can't get record's tnf");
     }
@@ -102,7 +102,7 @@ static UCharVector getTypeNameFromHandle(nfc_ndef_record_h handle,
             removeRecordHandle(handle);
         }
         else {
-            removeMessageHandle(message_handle);
+            RemoveMessageHandle(message_handle);
         }
         NFCUtil::throwNFCException(result, "Can't get record's type");
     }
@@ -125,7 +125,7 @@ static UCharVector getIdFromHandle(nfc_ndef_record_h handle,
             removeRecordHandle(handle);
         }
         else {
-            removeMessageHandle(message_handle);
+            RemoveMessageHandle(message_handle);
         }
         NFCUtil::throwNFCException(result, "Can't get record's id");
     }
@@ -150,7 +150,7 @@ static UCharVector getPayloadFromHandle(nfc_ndef_record_h handle,
             removeRecordHandle(handle);
         }
         else {
-            removeMessageHandle(message_handle);
+            RemoveMessageHandle(message_handle);
         }
         NFCUtil::throwNFCException(result, "Can't get record's payload");
     }
@@ -187,7 +187,7 @@ void NFCMessageUtils::ToNdefRecords(const nfc_ndef_message_h message, picojson::
         if (NFC_ERROR_NONE != result) {
             LoggerE("Can't get record count: %d, %s", result,
                 NFCUtil::getNFCErrorMessage(result).c_str());
-            removeMessageHandle(message);
+            RemoveMessageHandle(message);
             NFCUtil::throwNFCException(result, "Can't get record count");
         }
         for (int i = 0; i < count; ++i) {
@@ -199,7 +199,7 @@ void NFCMessageUtils::ToNdefRecords(const nfc_ndef_message_h message, picojson::
             if (NFC_ERROR_NONE != result) {
                 LoggerE("Can't get Ndef Record: %d, %s", result,
                         NFCUtil::getNFCErrorMessage(result).c_str());
-                removeMessageHandle(message);
+                RemoveMessageHandle(message);
                 NFCUtil::throwNFCException(result, "Can't get Ndef Record");
             }
             short tnf = getTnfFromHandle(record_handle, message);
@@ -241,7 +241,7 @@ void NFCMessageUtils::ReportNdefMessageFromData(unsigned char* data, unsigned lo
     ToNdefRecords(message, records_array_obj);
     out.insert(std::make_pair("records", records_array));
 
-    removeMessageHandle(message);
+    RemoveMessageHandle(message);
 }
 
 void NFCMessageUtils::ReportNDEFMessage(const picojson::value& args, picojson::object& out){
@@ -326,7 +326,7 @@ nfc_ndef_message_h NFCMessageUtils::NDEFMessageToStruct(const picojson::array& r
     int result = nfc_ndef_message_create(&message);
 
     if (NFC_ERROR_NONE != result) {
-        removeMessageHandle(message);
+        RemoveMessageHandle(message);
         LoggerE("Can't create Ndef Message: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
         NFCUtil::throwNFCException(result, "Can't create Ndef Message");
@@ -340,7 +340,7 @@ nfc_ndef_message_h NFCMessageUtils::NDEFMessageToStruct(const picojson::array& r
             LoggerE("record can't be inserted: %d, %s", result,
                 NFCUtil::getNFCErrorMessage(result).c_str());
             removeRecordHandle(record_handle);
-            removeMessageHandle(message);
+            RemoveMessageHandle(message);
             NFCUtil::throwNFCException(result, "Invalid NDEF Message");
         }
     }
@@ -369,7 +369,7 @@ void NFCMessageUtils::NDEFMessageToByte(const picojson::value& args, picojson::o
     unsigned int raw_data_size = 0;
     int result = nfc_ndef_message_get_rawdata(message, &raw_data, &raw_data_size);
 
-    removeMessageHandle(message);
+    RemoveMessageHandle(message);
     message = NULL;
 
     if (NFC_ERROR_NONE != result) {
@@ -438,7 +438,7 @@ void NFCMessageUtils::ReportNdefRecordFromMessage(nfc_ndef_message_h message_han
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get NdefRecord: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get NdefRecord");
     }
 
@@ -470,13 +470,13 @@ void NFCMessageUtils::ReportNDEFRecord(const picojson::value& args, picojson::ob
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get record count: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get record count");
     }
 
     ReportNdefRecordFromMessage(message_handle, 0, out);
 
-    removeMessageHandle(message_handle);
+    RemoveMessageHandle(message_handle);
 }
 
 /* -------------------------------RECORD TEXT FUNCTIONS------------------------------------ */
@@ -488,7 +488,7 @@ static std::string getTextFromHandle(nfc_ndef_record_h handle,
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get record's text: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get record's text");
     }
 
@@ -506,7 +506,7 @@ static std::string getLanguageCodeFromHandle(nfc_ndef_record_h handle,
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get record's languageCode: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get record's languageCode");
     }
 
@@ -524,7 +524,7 @@ static nfc_encode_type_e getEncodingFromHandle(nfc_ndef_record_h handle,
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get record's encoding: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get record's encoding");
     }
 
@@ -565,7 +565,7 @@ void NFCMessageUtils::ReportNdefRecordTextFromMessage(nfc_ndef_message_h message
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get Ndef Record: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get Ndef Record");
     }
 
@@ -598,7 +598,7 @@ static std::string getURIFromHandle(nfc_ndef_record_h handle,
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get record's uri: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get record's uri");
     }
 
@@ -639,7 +639,7 @@ void NFCMessageUtils::ReportNdefRecordURIFromMessage(nfc_ndef_message_h message_
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get Ndef Record: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get Ndef Record");
     }
 
@@ -664,7 +664,7 @@ static std::string getMimeTypeFromHandle(nfc_ndef_record_h handle,
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get record's mime_type: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get record's mime_type");
     }
 
@@ -683,7 +683,7 @@ void NFCMessageUtils::ReportNdefRecordMediaFromMessage(nfc_ndef_message_h messag
     if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get Ndef Record: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-        removeMessageHandle(message_handle);
+        RemoveMessageHandle(message_handle);
         NFCUtil::throwNFCException(result, "Can't get Ndef Record");
     }
 
index ecc15b0..89d38d7 100644 (file)
@@ -41,6 +41,7 @@ public:
     static void ReportNdefRecordMediaFromMessage(nfc_ndef_message_h message_handle,
                 const int index, picojson::object& out);
     static void ReportNDEFRecordMedia(const picojson::value& args, picojson::object& out);
+    static void RemoveMessageHandle(nfc_ndef_message_h message_handle);
 };
 
 } // nfc