/******************************************************************************* ** ** Function NDEF_MsgCreateWktHr ** ** Description This function creates Handover Request Record with version. ** ** Returns NDEF_OK if all OK ** *******************************************************************************/ tNDEF_STATUS NDEF_MsgCreateWktHr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, UINT8 version ) { tNDEF_STATUS status; NDEF_MsgInit (p_msg, max_size, p_cur_size); /* Add record with version */ status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size, NDEF_TNF_WKT, hr_rec_type, HR_REC_TYPE_LEN, NULL, 0, &version, 1); return (status); }
INT32 nativeNdef_createHs(nfc_handover_cps_t cps, char *carrier_data_ref, UINT8 *ndefBuff, UINT32 ndefBuffLen, UINT8 *outBuff, UINT32 outBuffLen) { UINT8 *p_msg_ac = NULL; UINT32 cur_size_ac = 0, max_size, cur_ndef_size = 0; if (ndefBuff == NULL || ndefBuffLen == 0 || outBuff == NULL || outBuffLen == 0 || carrier_data_ref == NULL) { return -1; } max_size = outBuffLen - ndefBuffLen; p_msg_ac = (UINT8 *) malloc (max_size); if (!p_msg_ac) { NXPLOG_API_E ("%s: Failed to allocate buffer", __FUNCTION__); return 0; } NDEF_MsgInit (p_msg_ac, max_size, &cur_size_ac); if (NDEF_OK != NDEF_MsgAddWktAc (p_msg_ac, max_size, &cur_size_ac, cps, carrier_data_ref, 0, NULL)) { NXPLOG_API_E ("%s: Failed to create ac message", __FUNCTION__); cur_ndef_size = 0; goto end_and_return; } /* Creare Handover Select Record */ if (NDEF_OK != NDEF_MsgCreateWktHs (outBuff, outBuffLen, &cur_ndef_size, NFC_FORUM_HANDOVER_VERSION)) { NXPLOG_API_E ("%s: Failed to create Hs message", __FUNCTION__); cur_ndef_size = 0; goto end_and_return; } /* Append Alternative Carrier Records */ if (NDEF_OK != NDEF_MsgAppendPayload (outBuff, outBuffLen, &cur_ndef_size, outBuff, p_msg_ac, cur_size_ac)) { NXPLOG_API_E ("%s: Failed to append Alternative Carrier Record", __FUNCTION__); cur_ndef_size = 0; goto end_and_return; } /* Append Alternative Carrier Reference Data */ if (NDEF_OK != NDEF_MsgAppendRec (outBuff, outBuffLen, &cur_ndef_size, ndefBuff, ndefBuffLen)) { NXPLOG_API_E ("%s: Failed to append Alternative Carrier Reference Data", __FUNCTION__); cur_ndef_size = 0; goto end_and_return; } end_and_return: if (p_msg_ac) { free(p_msg_ac); } return cur_ndef_size; }
/******************************************************************************* ** ** Function: nativeNfcTag_doWrite ** ** Description: Write a NDEF message to the tag. ** e: JVM environment. ** o: Java object. ** buf: Contains a NDEF message. ** ** Returns: True if ok. ** *******************************************************************************/ static jboolean nativeNfcTag_doWrite (JNIEnv* e, jobject, jbyteArray buf) { jboolean result = JNI_FALSE; tNFA_STATUS status = 0; const int maxBufferSize = 1024; UINT8 buffer[maxBufferSize] = { 0 }; UINT32 curDataSize = 0; ScopedByteArrayRO bytes(e, buf); UINT8* p_data = const_cast<UINT8*>(reinterpret_cast<const UINT8*>(&bytes[0])); // TODO: const-ness API bug in NFA_RwWriteNDef! ALOGD ("%s: enter; len = %zu", __FUNCTION__, bytes.size()); /* Create the write semaphore */ if (sem_init (&sWriteSem, 0, 0) == -1) { ALOGE ("%s: semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno); return JNI_FALSE; } sWriteWaitingForComplete = JNI_TRUE; if (sCheckNdefStatus == NFA_STATUS_FAILED) { //if tag does not contain a NDEF message //and tag is capable of storing NDEF message if (sCheckNdefCapable) { ALOGD ("%s: try format", __FUNCTION__); sem_init (&sFormatSem, 0, 0); sFormatOk = false; status = NFA_RwFormatTag (); sem_wait (&sFormatSem); sem_destroy (&sFormatSem); if (sFormatOk == false) //if format operation failed goto TheEnd; } ALOGD ("%s: try write", __FUNCTION__); status = NFA_RwWriteNDef (p_data, bytes.size()); } else if (bytes.size() == 0) { //if (NXP TagWriter wants to erase tag) then create and write an empty ndef message NDEF_MsgInit (buffer, maxBufferSize, &curDataSize); status = NDEF_MsgAddRec (buffer, maxBufferSize, &curDataSize, NDEF_TNF_EMPTY, NULL, 0, NULL, 0, NULL, 0); ALOGD ("%s: create empty ndef msg; status=%u; size=%lu", __FUNCTION__, status, curDataSize); status = NFA_RwWriteNDef (buffer, curDataSize); } else { ALOGD ("%s: NFA_RwWriteNDef", __FUNCTION__); status = NFA_RwWriteNDef (p_data, bytes.size()); } if (status != NFA_STATUS_OK) { ALOGE ("%s: write/format error=%d", __FUNCTION__, status); goto TheEnd; } /* Wait for write completion status */ sWriteOk = false; if (sem_wait (&sWriteSem)) { ALOGE ("%s: wait semaphore (errno=0x%08x)", __FUNCTION__, errno); goto TheEnd; } result = sWriteOk; TheEnd: /* Destroy semaphore */ if (sem_destroy (&sWriteSem)) { ALOGE ("%s: failed destroy semaphore (errno=0x%08x)", __FUNCTION__, errno); } sWriteWaitingForComplete = JNI_FALSE; ALOGD ("%s: exit; result=%d", __FUNCTION__, result); return result; }