/******************************************************************************* ** ** Function NDEF_MsgAddWktErr ** ** Description This function adds Error Record. ** ** Returns NDEF_OK if all OK ** *******************************************************************************/ tNDEF_STATUS NDEF_MsgAddWktErr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, UINT8 error_reason, UINT32 error_data ) { tNDEF_STATUS status; UINT8 payload[5], *p; UINT32 payload_len; p = payload; UINT8_TO_BE_STREAM (p, error_reason); if (error_reason == 0x02) { UINT32_TO_BE_STREAM (p, error_data); payload_len = 5; } else { UINT8_TO_BE_STREAM (p, error_data); payload_len = 2; } status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size, NDEF_TNF_WKT, err_rec_type, ERR_REC_TYPE_LEN, NULL, 0, payload, payload_len); return (status); }
INT32 nativeNdef_createMime(char *mimeType, UINT8 *mimeData, UINT32 mimeDataLength, UINT8*outNdefBuff, UINT32 outBufferLen) { tNFA_STATUS status = NFA_STATUS_FAILED; UINT32 current_size = 0; UINT32 mimeTypeLength = strlen(mimeType); NXPLOG_API_D ("%s: enter, mime = %s", __FUNCTION__, mimeType); if (mimeTypeLength + mimeDataLength >= (INT32)outBufferLen) { NXPLOG_API_E ("%s: data too large.", __FUNCTION__); return 0; } status = NDEF_MsgAddRec(outNdefBuff, 1024, ¤t_size, NDEF_TNF_MEDIA, (UINT8 *)mimeType, mimeTypeLength, NULL, 0, (UINT8*)mimeData, (UINT32)mimeDataLength); if (status != NFA_STATUS_OK ) { NXPLOG_API_E ("%s: couldn't create Ndef record", __FUNCTION__); current_size = 0; goto END; } END: NXPLOG_API_D ("%s: exit", __FUNCTION__); return current_size; }
/******************************************************************************* ** ** Function NDEF_MsgAddWktHc ** ** Description This function adds Handover Carrier Record. ** ** Returns NDEF_OK if all OK ** *******************************************************************************/ tNDEF_STATUS NDEF_MsgAddWktHc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, char *p_id_str, UINT8 ctf, UINT8 carrier_type_len, UINT8 *p_carrier_type, UINT8 carrier_data_len, UINT8 *p_carrier_data) { tNDEF_STATUS status; UINT8 payload[256], *p, id_len; UINT32 payload_len; if (carrier_type_len + carrier_data_len + 2 > 256) { return (NDEF_MSG_INSUFFICIENT_MEM); } p = payload; UINT8_TO_STREAM (p, (ctf & 0x07)); UINT8_TO_STREAM (p, carrier_type_len); ARRAY_TO_STREAM (p, p_carrier_type, carrier_type_len); ARRAY_TO_STREAM (p, p_carrier_data, carrier_data_len); payload_len = (UINT32)carrier_type_len + carrier_data_len + 2; id_len = (UINT8)strlen (p_id_str); status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size, NDEF_TNF_WKT, hc_rec_type, HC_REC_TYPE_LEN, (UINT8*)p_id_str, id_len, payload, payload_len); return (status); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** Function NDEF_MsgAddMediaWifiWsc ** ** Description This function adds Wifi Wsc Record header. ** ** Returns NDEF_OK if all OK ** *******************************************************************************/ tNDEF_STATUS NDEF_MsgAddMediaWifiWsc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, char *p_id_str, UINT8 *p_payload, UINT32 payload_len) { tNDEF_STATUS status; UINT8 id_len = 0; if (p_id_str) id_len = (UINT8)strlen (p_id_str); status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size, NDEF_TNF_MEDIA, p_wifi_wsc_rec_type, WIFI_WSC_REC_TYPE_LEN, (UINT8*)p_id_str, id_len, p_payload, payload_len); return (status); }
/******************************************************************************* ** ** Function NDEF_MsgAddWktCr ** ** Description This function adds Collision Resolution Record. ** ** Returns NDEF_OK if all OK ** *******************************************************************************/ tNDEF_STATUS NDEF_MsgAddWktCr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, UINT16 random_number ) { tNDEF_STATUS status; UINT8 data[2], *p; p = data; UINT16_TO_BE_STREAM (p, random_number); status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size, NDEF_TNF_WKT, cr_rec_type, CR_REC_TYPE_LEN, NULL, 0, data, 2); return (status); }
INT32 nativeNdef_createText(char *languageCode, char *text, UINT8*outNdefBuff, UINT32 outBufferLen) { static char * DEFAULT_LANGUAGE_CODE = "En"; tNFA_STATUS status = NFA_STATUS_FAILED; UINT32 textLength = strlen(text); UINT32 langCodeLength = 0; UINT32 current_size = 0; char *langCode = (char *)languageCode; NXPLOG_API_D ("%s: enter, text = %s", __FUNCTION__, text); if (langCode != NULL) { langCodeLength = strlen(langCode); } if (langCodeLength > 64) { NXPLOG_API_E ("%s: language code is too long, must be <64 bytes.", __FUNCTION__); return 0; } if (langCodeLength == 0) { //set default language to 'EN' langCode = DEFAULT_LANGUAGE_CODE; langCodeLength = 2; } memset (outNdefBuff, 0, outBufferLen); status = NDEF_MsgAddRec(outNdefBuff, outBufferLen, ¤t_size, NDEF_TNF_WKT, (UINT8*)RTD_TEXT, 1, NULL, 0, (UINT8*)(&langCodeLength), 1); status |= NDEF_MsgAppendPayload(outNdefBuff, outBufferLen, ¤t_size, outNdefBuff, (UINT8*)langCode, langCodeLength); status |= NDEF_MsgAppendPayload(outNdefBuff, outBufferLen, ¤t_size, outNdefBuff, (UINT8*)text, textLength); if (status != NFA_STATUS_OK ) { NXPLOG_API_E ("%s: couldn't create Ndef record", __FUNCTION__); current_size =0; goto END; } END: NXPLOG_API_D ("%s: exit", __FUNCTION__); return current_size; }
INT32 nativeNdef_createUri(char *uri, UINT8*outNdefBuff, UINT32 outBufferLen) { tNFA_STATUS status = NFA_STATUS_FAILED; INT32 uriLength = strlen(uri); UINT32 current_size = 0; INT32 i, prefixLength; NXPLOG_API_D ("%s: enter, uri = %s", __FUNCTION__, uri); for (i = 1; i < URI_PREFIX_MAP_LENGTH; i++) { if (memcmp(URI_PREFIX_MAP[i], uri, strlen(URI_PREFIX_MAP[i])) == 0) { break; } } if (i == URI_PREFIX_MAP_LENGTH) { i = 0; } prefixLength = strlen(URI_PREFIX_MAP[i]); status = NDEF_MsgAddRec(outNdefBuff, outBufferLen, ¤t_size, NDEF_TNF_WKT, (UINT8*)RTD_URL, 1, NULL, 0, (UINT8*)&i, 1); status |= NDEF_MsgAppendPayload(outNdefBuff, outBufferLen, ¤t_size, outNdefBuff, (UINT8*)(uri + prefixLength), (UINT32)(uriLength - prefixLength)); if (status != NFA_STATUS_OK ) { NXPLOG_API_E ("%s: couldn't create Ndef record", __FUNCTION__); current_size = 0; goto END; } END: NXPLOG_API_D ("%s: exit", __FUNCTION__); return current_size; }
/******************************************************************************* ** ** Function NDEF_MsgAddMediaBtOob ** ** Description This function adds BT OOB Record. ** ** Returns NDEF_OK if all OK ** *******************************************************************************/ tNDEF_STATUS NDEF_MsgAddMediaBtOob (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, char *p_id_str, BD_ADDR bd_addr) { tNDEF_STATUS status; UINT8 payload[BD_ADDR_LEN + 2]; UINT8 *p; UINT8 payload_len, id_len; p = payload; /* length including itself */ UINT16_TO_STREAM (p, BD_ADDR_LEN + 2); /* BD Addr */ BDADDR_TO_STREAM (p, bd_addr); payload_len = BD_ADDR_LEN + 2; id_len = (UINT8)strlen (p_id_str); status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size, NDEF_TNF_MEDIA, p_bt_oob_rec_type, BT_OOB_REC_TYPE_LEN, (UINT8*)p_id_str, id_len, payload, payload_len); return (status); }
/******************************************************************************* ** ** 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; }
/******************************************************************************* ** ** Function NDEF_MsgAddWktAc ** ** Description This function adds Alternative Carrier Record. ** ** Returns NDEF_OK if all OK ** *******************************************************************************/ tNDEF_STATUS NDEF_MsgAddWktAc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, UINT8 cps, char *p_carrier_data_ref_str, UINT8 aux_data_ref_count, char *p_aux_data_ref_str[]) { tNDEF_STATUS status; UINT32 payload_len; UINT8 ref_str_len, xx; UINT8 *p_rec, *p; /* get payload length first */ /* CPS, length of carrier data ref, carrier data ref, Aux data reference count */ payload_len = 3 + (UINT8)strlen (p_carrier_data_ref_str); for (xx = 0; xx < aux_data_ref_count; xx++) { /* Aux Data Reference length (1 byte) */ payload_len += 1 + (UINT8)strlen (p_aux_data_ref_str[xx]); } /* reserve memory for payload */ status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size, NDEF_TNF_WKT, ac_rec_type, AC_REC_TYPE_LEN, NULL, 0, NULL, payload_len); if (status == NDEF_OK) { /* get AC record added at the end */ p_rec = NDEF_MsgGetLastRecInMsg (p_msg); /* get start pointer of reserved payload */ p = NDEF_RecGetPayload (p_rec, &payload_len); /* Get a pointer to the payload or NULL (for none) which is valid */ if (p) { /* Add Carrier Power State */ UINT8_TO_BE_STREAM (p, cps); /* Carrier Data Reference length */ ref_str_len = (UINT8)strlen (p_carrier_data_ref_str); UINT8_TO_BE_STREAM (p, ref_str_len); /* Carrier Data Reference */ ARRAY_TO_BE_STREAM (p, p_carrier_data_ref_str, ref_str_len); /* Aux Data Reference Count */ UINT8_TO_BE_STREAM (p, aux_data_ref_count); for (xx = 0; xx < aux_data_ref_count; xx++) { /* Aux Data Reference length (1 byte) */ ref_str_len = (UINT8)strlen (p_aux_data_ref_str[xx]); UINT8_TO_BE_STREAM (p, ref_str_len); /* Aux Data Reference */ ARRAY_TO_BE_STREAM (p, p_aux_data_ref_str[xx], ref_str_len); } } } return (status); }