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