1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2010-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains source code for some utility functions to help parse 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * and build NFC Data Exchange Format (NDEF) messages 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ndef_utils.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Static Local Functions 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function shiftdown 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description shift memory down (to make space to insert a record) 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void shiftdown (UINT8 *p_mem, UINT32 len, UINT32 shift_amount) 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project register UINT8 *ps = p_mem + len - 1; 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project register UINT8 *pd = ps + shift_amount; 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project register UINT32 xx; 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < len; xx++) 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pd-- = *ps--; 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function shiftup 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description shift memory up (to delete a record) 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void shiftup (UINT8 *p_dest, UINT8 *p_src, UINT32 len) 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project register UINT8 *ps = p_src; 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project register UINT8 *pd = p_dest; 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project register UINT32 xx; 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < len; xx++) 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pd++ = *ps++; 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgValidate 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function validates an NDEF message. 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if all OK, or FALSE if the message is invalid. 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgValidate (UINT8 *p_msg, UINT32 msg_len, BOOLEAN b_allow_chunks) 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = p_msg; 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_end = p_msg + msg_len; 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr=0, type_len, id_len; 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int count; 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN bInChunk = FALSE; 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_msg == NULL) || (msg_len < 3) ) 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_TOO_SHORT); 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The first record must have the MB bit set */ 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_msg & NDEF_MB_MASK) == 0) 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_NO_MSG_BEGIN); 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The first record cannot be a chunk */ 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_msg & NDEF_TNF_MASK) == NDEF_TNF_UNCHANGED) 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_UNEXPECTED_CHUNK); 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (count = 0; p_rec < p_end; count++) 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if less than short record header */ 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_rec + 3 > p_end) 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_TOO_SHORT); 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The second and all subsequent records must NOT have the MB bit set */ 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (count > 0) && (rec_hdr & NDEF_MB_MASK) ) 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_EXTRA_MSG_BEGIN); 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if less than 4 bytes payload length */ 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_rec + 4 > p_end) 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_TOO_SHORT); 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if less than 1 byte ID field length */ 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_rec + 1 > p_end) 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_TOO_SHORT); 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* A chunk must have type "unchanged", and no type or ID fields */ 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_CF_MASK) 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!b_allow_chunks) 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_UNEXPECTED_CHUNK); 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Inside a chunk, the type must be unchanged and no type or ID field i sallowed */ 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bInChunk) 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (type_len != 0) || (id_len != 0) || ((rec_hdr & NDEF_TNF_MASK) != NDEF_TNF_UNCHANGED) ) 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INVALID_CHUNK); 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First record of a chunk must NOT have type "unchanged" */ 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((rec_hdr & NDEF_TNF_MASK) == NDEF_TNF_UNCHANGED) 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INVALID_CHUNK); 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bInChunk = TRUE; 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* This may be the last guy in a chunk. */ 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bInChunk) 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (type_len != 0) || (id_len != 0) || ((rec_hdr & NDEF_TNF_MASK) != NDEF_TNF_UNCHANGED) ) 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INVALID_CHUNK); 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bInChunk = FALSE; 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If not in a chunk, the record must NOT have type "unchanged" */ 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((rec_hdr & NDEF_TNF_MASK) == NDEF_TNF_UNCHANGED) 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INVALID_CHUNK); 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* An empty record must NOT have a type, ID or payload */ 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((rec_hdr & NDEF_TNF_MASK) == NDEF_TNF_EMPTY) 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (type_len != 0) || (id_len != 0) || (payload_len != 0) ) 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INVALID_EMPTY_REC); 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((rec_hdr & NDEF_TNF_MASK) == NDEF_TNF_UNKNOWN) 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (type_len != 0) 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_LENGTH_MISMATCH); 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (payload_len + type_len + id_len); 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = 0; 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The last record should have the ME bit set */ 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((rec_hdr & NDEF_ME_MASK) == 0) 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_NO_MSG_END); 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* p_rec should equal p_end if all the length fields were correct */ 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_rec != p_end) 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_LENGTH_MISMATCH); 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetNumRecs 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets the number of records in the given NDEF 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** message. 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns The record count, or 0 if the message is invalid. 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectINT32 NDEF_MsgGetNumRecs (UINT8 *p_msg) 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = p_msg; 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int count; 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (count = 0; ; ) 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count++; 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (payload_len + type_len + id_len); 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Return the number of records found */ 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (count); 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetRecLength 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns length of the current record in the given 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NDEF message. 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Length of record 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 NDEF_MsgGetRecLength (UINT8 *p_cur_rec) 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 rec_len = 0; 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get the current record's header */ 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_cur_rec++; 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_len++; 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_cur_rec++; 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_len++; 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_cur_rec++; 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_len++; 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_cur_rec); 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_len += 4; 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_cur_rec++; 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_len++; 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Total length of record */ 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_len += (payload_len + type_len + id_len); 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (rec_len); 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetNextRec 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the next record in the given 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NDEF message. If the current record pointer is NULL, a pointer 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** to the first record is returned. 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to the start of the record, or NULL if no more 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_MsgGetNextRec (UINT8 *p_cur_rec) 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get the current record's header */ 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_cur_rec++; 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is the last record, return NULL */ 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_cur_rec++; 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_cur_rec++; 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_cur_rec); 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_cur_rec++; 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cur_rec += (payload_len + type_len + id_len); 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (p_cur_rec); 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetRecByIndex 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the record with the given 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** index (0-based index) in the given NDEF message. 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to the start of the record, or NULL 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_MsgGetRecByIndex (UINT8 *p_msg, INT32 index) 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = p_msg; 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project INT32 count; 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (count = 0; ; count++) 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (count == index) 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (p_rec); 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (payload_len + type_len + id_len); 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If here, there is no record of that index */ 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetLastRecInMsg 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the last record in the 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** given NDEF message. 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to the start of the last record, or NULL if some problem 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_MsgGetLastRecInMsg (UINT8 *p_msg) 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = p_msg; 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pRecStart; 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for ( ; ; ) 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pRecStart = p_rec; 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (payload_len + type_len + id_len); 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (pRecStart); 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetFirstRecByType 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the first record with the given 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** record type in the given NDEF message. 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to the start of the record, or NULL 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_MsgGetFirstRecByType (UINT8 *p_msg, UINT8 tnf, UINT8 *p_type, UINT8 tlen) 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = p_msg; 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pRecStart; 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for ( ; ; ) 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pRecStart = p_rec; 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, p_rec points to the start of the type field. We need to */ 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* compare the type of the type, the length of the type and the data */ 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ((rec_hdr & NDEF_TNF_MASK) == tnf) 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project && (type_len == tlen) 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project && (!memcmp (p_rec, p_type, tlen)) ) 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (pRecStart); 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this was the last record, return NULL */ 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (payload_len + type_len + id_len); 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If here, there is no record of that type */ 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetNextRecByType 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the next record with the given 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** record type in the given NDEF message. 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to the start of the record, or NULL 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_MsgGetNextRecByType (UINT8 *p_cur_rec, UINT8 tnf, UINT8 *p_type, UINT8 tlen) 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec; 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pRecStart; 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is the last record in the message, return NULL */ 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_rec = NDEF_MsgGetNextRec (p_cur_rec)) == NULL) 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for ( ; ; ) 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pRecStart = p_rec; 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, p_rec points to the start of the type field. We need to */ 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* compare the type of the type, the length of the type and the data */ 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ((rec_hdr & NDEF_TNF_MASK) == tnf) 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project && (type_len == tlen) 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project && (!memcmp (p_rec, p_type, tlen)) ) 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (pRecStart); 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this was the last record, return NULL */ 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (payload_len + type_len + id_len); 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If here, there is no record of that type */ 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetFirstRecById 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the first record with the given 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** record id in the given NDEF message. 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to the start of the record, or NULL 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_MsgGetFirstRecById (UINT8 *p_msg, UINT8 *p_id, UINT8 ilen) 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = p_msg; 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pRecStart; 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for ( ; ; ) 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pRecStart = p_rec; 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, p_rec points to the start of the type field. Skip it */ 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += type_len; 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, p_rec points to the start of the ID field. Compare length and data */ 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (id_len == ilen) && (!memcmp (p_rec, p_id, ilen)) ) 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (pRecStart); 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this was the last record, return NULL */ 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (id_len + payload_len); 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If here, there is no record of that ID */ 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgGetNextRecById 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the next record with the given 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** record id in the given NDEF message. 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to the start of the record, or NULL 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_MsgGetNextRecById (UINT8 *p_cur_rec, UINT8 *p_id, UINT8 ilen) 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec; 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pRecStart; 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is the last record in the message, return NULL */ 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_rec = NDEF_MsgGetNextRec (p_cur_rec)) == NULL) 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for ( ; ; ) 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pRecStart = p_rec; 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type field length */ 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, p_rec points to the start of the type field. Skip it */ 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += type_len; 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, p_rec points to the start of the ID field. Compare length and data */ 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (id_len == ilen) && (!memcmp (p_rec, p_id, ilen)) ) 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (pRecStart); 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this was the last record, return NULL */ 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_ME_MASK) 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to next record */ 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += (id_len + payload_len); 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If here, there is no record of that ID */ 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_RecGetType 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the record type for the given NDEF record. 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to Type (NULL if none). TNF and len are filled in. 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_RecGetType (UINT8 *p_rec, UINT8 *p_tnf, UINT8 *p_type_len) 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len; 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First byte is the record header */ 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next byte is the type field length */ 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip the payload length */ 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += 1; 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += 4; 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip ID field Length, if present */ 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec++; 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, p_rec points to the start of the type field. */ 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_type_len = type_len; 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_tnf = rec_hdr & NDEF_TNF_MASK; 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (type_len == 0) 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (p_rec); 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_RecGetId 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the record id for the given NDEF record. 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Pointer to Id (NULL if none). ID Len is filled in. 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_RecGetId (UINT8 *p_rec, UINT8 *p_id_len) 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len; 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First byte is the record header */ 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next byte is the type field length */ 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip the payload length */ 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec++; 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += 4; 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_id_len = *p_rec++; 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_id_len = 0; 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* p_rec now points to the start of the type field. The ID field follows it */ 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_id_len == 0) 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (p_rec + type_len); 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_RecGetPayload 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function gets a pointer to the payload for the given NDEF record. 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns a pointer to the payload (or NULL none). Payload len filled in. 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 *NDEF_RecGetPayload (UINT8 *p_rec, UINT32 *p_payload_len) 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rec_hdr, type_len, id_len; 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 payload_len; 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First byte is the record header */ 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rec_hdr = *p_rec++; 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next byte is the type field length */ 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *p_rec++; 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next is the payload length (1 or 4 bytes) */ 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_SR_MASK) 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project payload_len = *p_rec++; 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (payload_len, p_rec); 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_payload_len = payload_len; 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rec_hdr & NDEF_IL_MASK) 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *p_rec++; 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* p_rec now points to the start of the type field. The ID field follows it, then the payload */ 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (payload_len == 0) 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NULL); 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (p_rec + type_len + id_len); 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgInit 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes an NDEF message. 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is initialized to 0 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NDEF_MsgInit (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size) 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size = 0; 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (p_msg, 0, max_size); 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgAddRec 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function adds an NDEF record to the end of an NDEF message. 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns OK, or error if the record did not fit 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern tNDEF_STATUS NDEF_MsgAddRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 tnf, UINT8 *p_type, UINT8 type_len, 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_id, UINT8 id_len, 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_payload, UINT32 payload_len) 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = p_msg + *p_cur_size; 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 recSize; 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int plen = (payload_len < 256) ? 1 : 4; 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int ilen = (id_len == 0) ? 0 : 1; 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (tnf > NDEF_TNF_RESERVED) 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tnf = NDEF_TNF_UNKNOWN; 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = 0; 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First, make sure the record will fit. we need at least 2 bytes for header and type length */ 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project recSize = payload_len + 2 + type_len + plen + ilen + id_len; 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cur_size + recSize) > max_size) 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct the record header. For the first record, set both begin and end bits */ 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_cur_size == 0) 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec = tnf | NDEF_MB_MASK | NDEF_ME_MASK; 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Find the previous last and clear his 'Message End' bit */ 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pLast = NDEF_MsgGetLastRecInMsg (p_msg); 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!pLast) 8677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu return (NDEF_MSG_NO_MSG_END); 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pLast &= ~NDEF_ME_MASK; 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec = tnf | NDEF_ME_MASK; 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (plen == 1) 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec |= NDEF_SR_MASK; 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ilen != 0) 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec |= NDEF_IL_MASK; 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec++; 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The next byte is the type field length */ 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec++ = type_len; 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (plen == 1) 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec++ = (UINT8)payload_len; 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32_TO_BE_STREAM (p_rec, payload_len); 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length (optional) */ 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ilen > 0) 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec++ = id_len; 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next comes the type */ 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (type_len) 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_type) 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_rec, p_type, type_len); 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += type_len; 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next comes the ID */ 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (id_len) 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_id) 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_rec, p_id, id_len); 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += id_len; 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* And lastly the payload. If NULL, the app just wants to reserve memory */ 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_payload) 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_rec, p_payload, payload_len); 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += recSize; 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgInsertRec 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function inserts a record at a specific index into the 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** given NDEF message 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns OK, or error if the record did not fit 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern tNDEF_STATUS NDEF_MsgInsertRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, INT32 index, 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 tnf, UINT8 *p_type, UINT8 type_len, 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_id, UINT8 id_len, 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_payload, UINT32 payload_len) 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec; 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 recSize; 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project INT32 plen = (payload_len < 256) ? 1 : 4; 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project INT32 ilen = (id_len == 0) ? 0 : 1; 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First, make sure the record will fit. we need at least 2 bytes for header and type length */ 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project recSize = payload_len + 2 + type_len + plen + ilen + id_len; 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cur_size + recSize) > max_size) 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* See where the new record goes. If at the end, call the 'AddRec' function */ 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (index >= NDEF_MsgGetNumRecs (p_msg)) 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project || ((p_rec = NDEF_MsgGetRecByIndex(p_msg, index)) == NULL) ) 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NDEF_MsgAddRec (p_msg, max_size, p_cur_size, tnf, p_type, type_len, 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_id, id_len, p_payload, payload_len); 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we are inserting at the beginning, remove the MB bit from the current first */ 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (index == 0) 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_msg &= ~NDEF_MB_MASK; 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Make space for the new record */ 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (p_rec, (UINT32)(*p_cur_size - (p_rec - p_msg)), recSize); 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If adding at the beginning, set begin bit */ 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (index == 0) 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec = tnf | NDEF_MB_MASK; 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec = tnf; 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (plen == 1) 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec |= NDEF_SR_MASK; 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ilen != 0) 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec |= NDEF_IL_MASK; 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec++; 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The next byte is the type field length */ 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec++ = type_len; 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Payload length - can be 1 or 4 bytes */ 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (plen == 1) 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec++ = (UINT8)payload_len; 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32_TO_BE_STREAM (p_rec, payload_len); 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length (optional) */ 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ilen != 0) 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec++ = id_len; 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next comes the type */ 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (type_len) 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_type) 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_rec, p_type, type_len); 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += type_len; 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next comes the ID */ 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ilen != 0) 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_id) 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_rec, p_id, id_len); 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec += id_len; 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* And lastly the payload. If NULL, the app just wants to reserve memory */ 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_payload) 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_rec, p_payload, payload_len); 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += recSize; 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgAppendRec 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function adds NDEF records to the end of an NDEF message. 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns OK, or error if the record did not fit 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern tNDEF_STATUS NDEF_MsgAppendRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_new_rec, UINT32 new_rec_len) 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec; 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNDEF_STATUS status; 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First, validate new records */ 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = NDEF_MsgValidate(p_new_rec, new_rec_len, FALSE)) != NDEF_OK) 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First, make sure the record will fit */ 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cur_size + new_rec_len) > max_size) 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Find where to copy new record */ 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_cur_size == 0) 1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec = p_msg; 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Find the previous last and clear his 'Message End' bit */ 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pLast = NDEF_MsgGetLastRecInMsg (p_msg); 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!pLast) 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_NO_MSG_END); 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pLast &= ~NDEF_ME_MASK; 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec = p_msg + *p_cur_size; 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* clear 'Message Begin' bit of new record */ 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_new_rec &= ~NDEF_MB_MASK; 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* append new records */ 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_rec, p_new_rec, new_rec_len); 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += new_rec_len; 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgAppendPayload 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function appends extra payload to a specific record in the 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** given NDEF message 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns OK, or error if the extra payload did not fit 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAppendPayload (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec, UINT8 *p_add_pl, UINT32 add_pl_len) 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 prev_paylen, new_paylen; 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_prev_pl, *pp; 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 incr_lenfld = 0; 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 type_len, id_len; 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip header */ 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_rec + 1; 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next byte is the type field length */ 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *pp++; 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next is the payload length (1 or 4 bytes) */ 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_SR_MASK) 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project prev_paylen = *pp++; 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (prev_paylen, pp); 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_IL_MASK) 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *pp++; 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_pl = pp + type_len + id_len; 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project new_paylen = prev_paylen + add_pl_len; 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Previous payload may be < 256, and this addition may make it larger than 256 */ 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If that were to happen, the payload length field goes from 1 byte to 4 bytes */ 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (prev_paylen < 256) && (new_paylen > 255) ) 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project incr_lenfld = 3; 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check that it all fits */ 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cur_size + add_pl_len + incr_lenfld) > max_size) 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to payload length field */ 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_rec + 2; 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we need to increase the length field from 1 to 4 bytes, do it first */ 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (incr_lenfld) 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (pp + 1, (UINT32)(*p_cur_size - (pp - p_msg) - 1), 3); 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_pl += 3; 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store in the new length */ 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_paylen > 255) 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec &= ~NDEF_SR_MASK; 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32_TO_BE_STREAM (pp, new_paylen); 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pp = (UINT8)new_paylen; 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to the end of the previous payload */ 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_prev_pl + prev_paylen; 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we are not the last record, make space for the extra payload */ 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_rec & NDEF_ME_MASK) == 0) 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (pp, (UINT32)(*p_cur_size - (pp - p_msg)), add_pl_len); 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Now copy in the additional payload data */ 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (pp, p_add_pl, add_pl_len); 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += add_pl_len + incr_lenfld; 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgReplacePayload 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function replaces the payload of a specific record in the 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** given NDEF message 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns OK, or error if the new payload did not fit 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgReplacePayload (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec, UINT8 *p_new_pl, UINT32 new_pl_len) 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 prev_paylen; 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_prev_pl, *pp; 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 paylen_delta; 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 type_len, id_len; 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip header */ 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_rec + 1; 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next byte is the type field length */ 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *pp++; 1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next is the payload length (1 or 4 bytes) */ 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_SR_MASK) 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project prev_paylen = *pp++; 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (prev_paylen, pp); 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ID field Length */ 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_IL_MASK) 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = *pp++; 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project id_len = 0; 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_pl = pp + type_len + id_len; 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to payload length field again */ 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_rec + 2; 1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_pl_len > prev_paylen) 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* New payload is larger than the previous */ 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project paylen_delta = new_pl_len - prev_paylen; 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If the previous payload length was < 256, and new is > 255 */ 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* the payload length field goes from 1 byte to 4 bytes */ 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (prev_paylen < 256) && (new_pl_len > 255) ) 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cur_size + paylen_delta + 3) > max_size) 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (pp + 1, (UINT32)(*p_cur_size - (pp - p_msg) - 1), 3); 1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_pl += 3; 1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += 3; 1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec &= ~NDEF_SR_MASK; 1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ((*p_cur_size + paylen_delta) > max_size) 1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store in the new length */ 1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_pl_len > 255) 1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32_TO_BE_STREAM (pp, new_pl_len); 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pp = (UINT8)new_pl_len; 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to the end of the previous payload */ 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_prev_pl + prev_paylen; 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we are not the last record, make space for the extra payload */ 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_rec & NDEF_ME_MASK) == 0) 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (pp, (UINT32)(*p_cur_size - (pp - p_msg)), paylen_delta); 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += paylen_delta; 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (new_pl_len < prev_paylen) 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* New payload is smaller than the previous */ 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project paylen_delta = prev_paylen - new_pl_len; 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If the previous payload was > 256, and new is less than 256 */ 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* the payload length field goes from 4 bytes to 1 byte */ 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (prev_paylen > 255) && (new_pl_len < 256) ) 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftup (pp + 1, pp + 4, (UINT32)(*p_cur_size - (pp - p_msg) - 3)); 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_pl -= 3; 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size -= 3; 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec |= NDEF_SR_MASK; 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store in the new length */ 1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_pl_len > 255) 1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32_TO_BE_STREAM (pp, new_pl_len); 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pp = (UINT8)new_pl_len; 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to the end of the previous payload */ 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_prev_pl + prev_paylen; 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we are not the last record, remove the extra space from the previous payload */ 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_rec & NDEF_ME_MASK) == 0) 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftup (pp - paylen_delta, pp, (UINT32)(*p_cur_size - (pp - p_msg))); 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size -= paylen_delta; 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Now copy in the new payload data */ 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_new_pl) 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_prev_pl, p_new_pl, new_pl_len); 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgReplaceType 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function replaces the type field of a specific record in the 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** given NDEF message 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns OK, or error if the new type field did not fit 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgReplaceType (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec, UINT8 *p_new_type, UINT8 new_type_len) 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 typelen_delta; 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_prev_type, prev_type_len; 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pp; 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip header */ 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_rec + 1; 1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next byte is the type field length */ 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project prev_type_len = *pp++; 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip the payload length */ 1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_SR_MASK) 1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp += 1; 1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp += 4; 1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_IL_MASK) 1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp++; 1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Save pointer to the start of the type field */ 1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_type = pp; 1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_type_len > prev_type_len) 1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* New type is larger than the previous */ 1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project typelen_delta = new_type_len - prev_type_len; 1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cur_size + typelen_delta) > max_size) 1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to the end of the previous type, and make space for the extra data */ 1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_prev_type + prev_type_len; 1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (pp, (UINT32)(*p_cur_size - (pp - p_msg)), typelen_delta); 1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += typelen_delta; 1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (new_type_len < prev_type_len) 1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* New type field is smaller than the previous */ 1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project typelen_delta = prev_type_len - new_type_len; 1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to the end of the previous type, and shift up to fill the the unused space */ 1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_prev_type + prev_type_len; 1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftup (pp - typelen_delta, pp, (UINT32)(*p_cur_size - (pp - p_msg))); 1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size -= typelen_delta; 1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Save in new type length */ 1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec[1] = new_type_len; 1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Now copy in the new type field data */ 1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_new_type) 1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_prev_type, p_new_type, new_type_len); 1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgReplaceId 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function replaces the ID field of a specific record in the 1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** given NDEF message 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns OK, or error if the new ID field did not fit 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgReplaceId (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec, UINT8 *p_new_id, UINT8 new_id_len) 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 idlen_delta; 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_prev_id, *p_idlen_field; 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 prev_id_len, type_len; 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pp; 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip header */ 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_rec + 1; 1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next byte is the type field length */ 1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type_len = *pp++; 1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip the payload length */ 1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_SR_MASK) 1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp += 1; 1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp += 4; 1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_idlen_field = pp; 1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_IL_MASK) 1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project prev_id_len = *pp++; 1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project prev_id_len = 0; 1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Save pointer to the start of the ID field (right after the type field) */ 1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_id = pp + type_len; 1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_id_len > prev_id_len) 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* New ID field is larger than the previous */ 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project idlen_delta = new_id_len - prev_id_len; 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If the previous ID length was 0, we need to add a 1-byte ID length */ 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (prev_id_len == 0) 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cur_size + idlen_delta + 1) > max_size) 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (p_idlen_field, (UINT32)(*p_cur_size - (p_idlen_field - p_msg)), 1); 1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_id += 1; 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += 1; 1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec |= NDEF_IL_MASK; 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ((*p_cur_size + idlen_delta) > max_size) 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_MSG_INSUFFICIENT_MEM); 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to the end of the previous ID field, and make space for the extra data */ 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_prev_id + prev_id_len; 1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftdown (pp, (UINT32)(*p_cur_size - (pp - p_msg)), idlen_delta); 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size += idlen_delta; 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (new_id_len < prev_id_len) 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* New ID field is smaller than the previous */ 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project idlen_delta = prev_id_len - new_id_len; 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to the end of the previous ID, and shift up to fill the the unused space */ 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = p_prev_id + prev_id_len; 1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftup (pp - idlen_delta, pp, (UINT32)(*p_cur_size - (pp - p_msg))); 1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size -= idlen_delta; 1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If removing the ID, make sure that length field is also removed */ 1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_id_len == 0) 1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftup (p_idlen_field, p_idlen_field + 1, (UINT32)(*p_cur_size - (p_idlen_field - p_msg - (UINT32)1))); 1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_rec &= ~NDEF_IL_MASK; 1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size -= 1; 1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Save in new ID length and data */ 1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_id_len) 1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_idlen_field = new_id_len; 1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_new_id) 1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_prev_id, p_new_id, new_id_len); 1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgRemoveRec 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function removes the record at the given 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** index in the given NDEF message. 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if OK, FALSE if the index was invalid 1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** *p_cur_size is updated 1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgRemoveRec (UINT8 *p_msg, UINT32 *p_cur_size, INT32 index) 1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec = NDEF_MsgGetRecByIndex (p_msg, index); 1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pNext, *pPrev; 1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_rec) 1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_REC_NOT_FOUND); 1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is the first record in the message... */ 1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_MB_MASK) 1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Find the second record (if any) and set his 'Message Begin' bit */ 1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((pNext = NDEF_MsgGetRecByIndex(p_msg, 1)) != NULL) 1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pNext |= NDEF_MB_MASK; 1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size -= (UINT32)(pNext - p_msg); 1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftup (p_msg, pNext, *p_cur_size); 1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size = 0; /* No more records, lenght must be zero */ 1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is the last record in the message... */ 1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_rec & NDEF_ME_MASK) 1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (index > 0) 1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Find the previous record and set his 'Message End' bit */ 1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((pPrev = NDEF_MsgGetRecByIndex(p_msg, index - 1)) == NULL) 1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (FALSE); 1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pPrev |= NDEF_ME_MASK; 1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size = (UINT32)(p_rec - p_msg); 1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Not the first or the last... get the address of the next record */ 1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((pNext = NDEF_MsgGetNextRec (p_rec)) == NULL) 1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (FALSE); 1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* We are removing p_rec, so shift from pNext to the end */ 1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project shiftup (p_rec, pNext, (UINT32)(*p_cur_size - (pNext - p_msg))); 1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_cur_size -= (UINT32)(pNext - p_rec); 1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NDEF_OK); 1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NDEF_MsgCopyAndDechunk 1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function copies and de-chunks an NDEF message. 1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** It is assumed that the destination is at least as large 1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** as the source, since the source may not actually contain 1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** any chunks. 1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns The output byte count 1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgCopyAndDechunk (UINT8 *p_src, UINT32 src_len, UINT8 *p_dest, UINT32 *p_out_len) 1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 out_len, max_out_len; 1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_rec; 1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_prev_rec = p_dest; 1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_type, *p_id, *p_pay; 1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 type_len, id_len, tnf; 1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 pay_len; 1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNDEF_STATUS status; 1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First, validate the source */ 1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = NDEF_MsgValidate(p_src, src_len, TRUE)) != NDEF_OK) 1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The output buffer must be at least as large as the input buffer */ 1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project max_out_len = src_len; 1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Initialize output */ 1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NDEF_MsgInit (p_dest, max_out_len, &out_len); 1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec = p_src; 1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Now, copy record by record */ 15417c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu while ((p_rec != NULL) && (status == NDEF_OK)) 1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_type = NDEF_RecGetType (p_rec, &tnf, &type_len); 1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_id = NDEF_RecGetId (p_rec, &id_len); 1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_pay = NDEF_RecGetPayload (p_rec, &pay_len); 1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is the continuation of a chunk, append the payload to the previous */ 1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (tnf == NDEF_TNF_UNCHANGED) 1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 15507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (p_pay) 15517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 15527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu status = NDEF_MsgAppendPayload (p_dest, max_out_len, &out_len, p_prev_rec, p_pay, pay_len); 15537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_prev_rec = p_dest + out_len; 1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 15597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu status = NDEF_MsgAddRec (p_dest, max_out_len, &out_len, tnf, p_type, type_len, 1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_id, id_len, p_pay, pay_len); 1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rec = NDEF_MsgGetNextRec (p_rec); 1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_out_len = out_len; 1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 15687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu return (status); 1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1571