From: Lukasz Bardeli Date: Mon, 5 Jan 2015 13:55:09 +0000 (+0100) Subject: [NFC] implementation sendNDEF X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~682 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=77220d3640977d619f6376278094b9c54499c35f;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [NFC] implementation sendNDEF [Verification] Code compiles without error Change-Id: I465536d0ec30ca8ea83f20033275825628277645 Signed-off-by: Lukasz Bardeli --- diff --git a/src/nfc/nfc_adapter.cc b/src/nfc/nfc_adapter.cc index 8cbe3c99..77644b15 100644 --- a/src/nfc/nfc_adapter.cc +++ b/src/nfc/nfc_adapter.cc @@ -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(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()); + + 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(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 ret = nfc_p2p_send(m_peer_handle, message, + peerSentCallback, static_cast(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(callbackId))) { + LOGE("g_idle addition failed"); + delete callbackId; + callbackId = NULL; + } + } +} }// nfc }// extension diff --git a/src/nfc/nfc_adapter.h b/src/nfc/nfc_adapter.h index e56b4154..15a5830d 100644 --- a/src/nfc/nfc_adapter.h +++ b/src/nfc/nfc_adapter.h @@ -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 diff --git a/src/nfc/nfc_api.js b/src/nfc/nfc_api.js index de2fd62f..599416ca 100644 --- a/src/nfc/nfc_api.js +++ b/src/nfc/nfc_api.js @@ -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) diff --git a/src/nfc/nfc_instance.cc b/src/nfc/nfc_instance.cc index a1854234..8e43eb2c 100644 --- a/src/nfc/nfc_instance.cc +++ b/src/nfc/nfc_instance.cc @@ -226,7 +226,7 @@ void NFCInstance::PeerIsConnectedGetter( try { int peer_id = (int)args.get("id").get(); - 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(args.get("id").get()); + 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( diff --git a/src/nfc/nfc_message_utils.cc b/src/nfc/nfc_message_utils.cc index dc69b711..4347de1f 100644 --- a/src/nfc/nfc_message_utils.cc +++ b/src/nfc/nfc_message_utils.cc @@ -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"); } diff --git a/src/nfc/nfc_message_utils.h b/src/nfc/nfc_message_utils.h index ecc15b03..89d38d7f 100644 --- a/src/nfc/nfc_message_utils.h +++ b/src/nfc/nfc_message_utils.h @@ -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