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;
}
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");
}
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;
}
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
}
/* -------------------------------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);
removeRecordHandle(handle);
}
else {
- removeMessageHandle(message_handle);
+ RemoveMessageHandle(message_handle);
}
NFCUtil::throwNFCException(result, "Can't get record's tnf");
}
removeRecordHandle(handle);
}
else {
- removeMessageHandle(message_handle);
+ RemoveMessageHandle(message_handle);
}
NFCUtil::throwNFCException(result, "Can't get record's type");
}
removeRecordHandle(handle);
}
else {
- removeMessageHandle(message_handle);
+ RemoveMessageHandle(message_handle);
}
NFCUtil::throwNFCException(result, "Can't get record's id");
}
removeRecordHandle(handle);
}
else {
- removeMessageHandle(message_handle);
+ RemoveMessageHandle(message_handle);
}
NFCUtil::throwNFCException(result, "Can't get record's payload");
}
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) {
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);
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){
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");
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");
}
}
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) {
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");
}
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------------------------------------ */
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");
}
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");
}
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");
}
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");
}
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");
}
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");
}
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");
}
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");
}