/*******************************************************************************
**
** 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);
}
예제 #2
0
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;
}