• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2010-2014 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  This file contains definitions for some utility functions to help parse
22  *  and build NFC Data Exchange Format (NDEF) messages
23  *
24  ******************************************************************************/
25 
26 #ifndef NDEF_UTILS_H
27 #define NDEF_UTILS_H
28 
29 #include "bt_types.h"
30 
31 #define NDEF_MB_MASK 0x80  /* Message Begin */
32 #define NDEF_ME_MASK 0x40  /* Message End */
33 #define NDEF_CF_MASK 0x20  /* Chunk Flag */
34 #define NDEF_SR_MASK 0x10  /* Short Record */
35 #define NDEF_IL_MASK 0x08  /* ID Length */
36 #define NDEF_TNF_MASK 0x07 /* Type Name Format */
37 /* First valid ASCII as per RTD specification */
38 #define NDEF_RTD_VALID_START 0x20
39 /* Last valid ASCII as per RTD specification */
40 #define NDEF_RTD_VALID_END 0x7E
41 
42 /* NDEF Type Name Format */
43 #define NDEF_TNF_EMPTY 0     /* Empty (type/id/payload len =0) */
44 #define NDEF_TNF_WKT 1       /* NFC Forum well-known type/RTD */
45 #define NDEF_TNF_MEDIA 2     /* Media-type as defined in RFC 2046 */
46 #define NDEF_TNF_URI 3       /* Absolute URI as defined in RFC 3986 */
47 #define NDEF_TNF_EXT 4       /* NFC Forum external type/RTD */
48 #define NDEF_TNF_UNKNOWN 5   /* Unknown (type len =0) */
49 #define NDEF_TNF_UNCHANGED 6 /* Unchanged (type len =0) */
50 #define NDEF_TNF_RESERVED 7  /* Reserved */
51 
52 /* Define the status code returned from the Validate, Parse or Build functions
53 */
54 enum {
55   NDEF_OK, /* 0 - OK                                   */
56 
57   NDEF_REC_NOT_FOUND,         /* 1 - No record matching the find criteria */
58   NDEF_MSG_TOO_SHORT,         /* 2 - Message was too short (< 3 bytes)    */
59   NDEF_MSG_NO_MSG_BEGIN,      /* 3 - No 'begin' flag at start of message  */
60   NDEF_MSG_NO_MSG_END,        /* 4 - No 'end' flag at end of message      */
61   NDEF_MSG_EXTRA_MSG_BEGIN,   /* 5 - 'begin' flag after start of message  */
62   NDEF_MSG_UNEXPECTED_CHUNK,  /* 6 - Unexpected chunk found               */
63   NDEF_MSG_INVALID_EMPTY_REC, /* 7 - Empty record with non-zero contents  */
64   NDEF_MSG_INVALID_CHUNK,     /* 8 - Invalid chunk found                  */
65   NDEF_MSG_LENGTH_MISMATCH,   /* 9 - Overall message length doesn't match */
66   NDEF_MSG_INSUFFICIENT_MEM,  /* 10 - Insuffiecient memory to add record  */
67   NDEF_MSG_INVALID_TYPE       /* 11 - TYPE field contains invalid characters  */
68 };
69 typedef uint8_t tNDEF_STATUS;
70 
71 #define HR_REC_TYPE_LEN 2        /* Handover Request Record Type     */
72 #define HS_REC_TYPE_LEN 2        /* Handover Select Record Type      */
73 #define HC_REC_TYPE_LEN 2        /* Handover Carrier recrod Type     */
74 #define CR_REC_TYPE_LEN 2        /* Collision Resolution Record Type */
75 #define AC_REC_TYPE_LEN 2        /* Alternative Carrier Record Type  */
76 #define ERR_REC_TYPE_LEN 3       /* Error Record Type                */
77 #define BT_OOB_REC_TYPE_LEN 32   /* Bluetooth OOB Data Type          */
78 #define WIFI_WSC_REC_TYPE_LEN 23 /* Wifi WSC Data Type               */
79 
80 #ifdef __cplusplus
81 extern "C" {
82 #endif
83 
84 /* Functions to parse a received NDEF Message
85 */
86 /*******************************************************************************
87 **
88 ** Function         NDEF_MsgValidate
89 **
90 ** Description      This function validates an NDEF message.
91 **
92 ** Returns          TRUE if all OK, or FALSE if the message is invalid.
93 **
94 *******************************************************************************/
95 extern tNDEF_STATUS NDEF_MsgValidate(uint8_t* p_msg, uint32_t msg_len,
96                                      bool b_allow_chunks);
97 
98 /*******************************************************************************
99 **
100 ** Function         NDEF_MsgGetNumRecs
101 **
102 ** Description      This function gets the number of records in the given NDEF
103 **                  message.
104 **
105 ** Returns          The record count, or 0 if the message is invalid.
106 **
107 *******************************************************************************/
108 extern int32_t NDEF_MsgGetNumRecs(uint8_t* p_msg);
109 
110 /*******************************************************************************
111 **
112 ** Function         NDEF_MsgGetRecLength
113 **
114 ** Description      This function returns length of the current record in the
115 **                  given NDEF message.
116 **
117 ** Returns          Length of record
118 **
119 *******************************************************************************/
120 extern uint32_t NDEF_MsgGetRecLength(uint8_t* p_cur_rec);
121 
122 /*******************************************************************************
123 **
124 ** Function         NDEF_MsgGetNextRec
125 **
126 ** Description      This function gets a pointer to the next record after the
127 **                  current one.
128 **
129 ** Returns          Pointer to the start of the record, or NULL if no more
130 **
131 *******************************************************************************/
132 extern uint8_t* NDEF_MsgGetNextRec(uint8_t* p_cur_rec);
133 
134 /*******************************************************************************
135 **
136 ** Function         NDEF_MsgGetRecByIndex
137 **
138 ** Description      This function gets a pointer to the record with the given
139 **                  index (0-based index) in the given NDEF message.
140 **
141 ** Returns          Pointer to the start of the record, or NULL
142 **
143 *******************************************************************************/
144 extern uint8_t* NDEF_MsgGetRecByIndex(uint8_t* p_msg, int32_t index);
145 
146 /*******************************************************************************
147 **
148 ** Function         NDEF_MsgGetLastRecInMsg
149 **
150 ** Description      This function gets a pointer to the last record in the
151 **                  given NDEF message.
152 **
153 ** Returns          Pointer to the start of the last record, or NULL if some
154 **                  problem
155 **
156 *******************************************************************************/
157 extern uint8_t* NDEF_MsgGetLastRecInMsg(uint8_t* p_msg);
158 
159 /*******************************************************************************
160 **
161 ** Function         NDEF_MsgGetFirstRecByType
162 **
163 ** Description      This function gets a pointer to the first record with the
164 **                  given record type in the given NDEF message.
165 **
166 ** Returns          Pointer to the start of the record, or NULL
167 **
168 *******************************************************************************/
169 extern uint8_t* NDEF_MsgGetFirstRecByType(uint8_t* p_msg, uint8_t tnf,
170                                           uint8_t* p_type, uint8_t tlen);
171 
172 /*******************************************************************************
173 **
174 ** Function         NDEF_MsgGetNextRecByType
175 **
176 ** Description      This function gets a pointer to the next record with the
177 **                  given record type in the given NDEF message.
178 **
179 ** Returns          Pointer to the start of the record, or NULL
180 **
181 *******************************************************************************/
182 extern uint8_t* NDEF_MsgGetNextRecByType(uint8_t* p_cur_rec, uint8_t tnf,
183                                          uint8_t* p_type, uint8_t tlen);
184 
185 /*******************************************************************************
186 **
187 ** Function         NDEF_MsgGetFirstRecById
188 **
189 ** Description      This function gets a pointer to the first record with the
190 **                  given record id in the given NDEF message.
191 **
192 ** Returns          Pointer to the start of the record, or NULL
193 **
194 *******************************************************************************/
195 extern uint8_t* NDEF_MsgGetFirstRecById(uint8_t* p_msg, uint8_t* p_id,
196                                         uint8_t ilen);
197 
198 /*******************************************************************************
199 **
200 ** Function         NDEF_MsgGetNextRecById
201 **
202 ** Description      This function gets a pointer to the next record with the
203 **                  given record id in the given NDEF message.
204 **
205 ** Returns          Pointer to the start of the record, or NULL
206 **
207 *******************************************************************************/
208 extern uint8_t* NDEF_MsgGetNextRecById(uint8_t* p_cur_rec, uint8_t* p_id,
209                                        uint8_t ilen);
210 
211 /*******************************************************************************
212 **
213 ** Function         NDEF_RecGetType
214 **
215 ** Description      This function gets a pointer to the record type for the
216 **                  given NDEF record.
217 **
218 ** Returns          Pointer to Type (NULL if none). TNF and len are filled in.
219 **
220 *******************************************************************************/
221 extern uint8_t* NDEF_RecGetType(uint8_t* p_rec, uint8_t* p_tnf,
222                                 uint8_t* p_type_len);
223 
224 /*******************************************************************************
225 **
226 ** Function         NDEF_RecGetId
227 **
228 ** Description      This function gets a pointer to the record id for the given
229 **                  NDEF record.
230 **
231 ** Returns          Pointer to Id (NULL if none). ID Len is filled in.
232 **
233 *******************************************************************************/
234 extern uint8_t* NDEF_RecGetId(uint8_t* p_rec, uint8_t* p_id_len);
235 
236 /*******************************************************************************
237 **
238 ** Function         NDEF_RecGetPayload
239 **
240 ** Description      This function gets a pointer to the payload for the given
241 **                  NDEF record.
242 **
243 ** Returns          a pointer to the payload (NULL if none). Payload len filled
244 **                  in.
245 **
246 *******************************************************************************/
247 extern uint8_t* NDEF_RecGetPayload(uint8_t* p_rec, uint32_t* p_payload_len);
248 
249 /* Functions to build an NDEF Message
250 */
251 /*******************************************************************************
252 **
253 ** Function         NDEF_MsgInit
254 **
255 ** Description      This function initializes an NDEF message.
256 **
257 ** Returns          void
258 **                  *p_cur_size is initialized to 0
259 **
260 *******************************************************************************/
261 extern void NDEF_MsgInit(uint8_t* p_msg, uint32_t max_size,
262                          uint32_t* p_cur_size);
263 
264 /*******************************************************************************
265 **
266 ** Function         NDEF_MsgAddRec
267 **
268 ** Description      This function adds an NDEF record to the end of an NDEF
269 **                  message.
270 **
271 ** Returns          OK, or error if the record did not fit
272 **                  *p_cur_size is updated
273 **
274 *******************************************************************************/
275 extern tNDEF_STATUS NDEF_MsgAddRec(uint8_t* p_msg, uint32_t max_size,
276                                    uint32_t* p_cur_size, uint8_t tnf,
277                                    uint8_t* p_type, uint8_t type_len,
278                                    uint8_t* p_id, uint8_t id_len,
279                                    uint8_t* p_payload, uint32_t payload_len);
280 
281 /*******************************************************************************
282 **
283 ** Function         NDEF_MsgInsertRec
284 **
285 ** Description      This function inserts a record at a specific index into the
286 **                  given NDEF message
287 **
288 ** Returns          OK, or error if the record did not fit
289 **                  *p_cur_size is updated
290 **
291 *******************************************************************************/
292 extern tNDEF_STATUS NDEF_MsgInsertRec(uint8_t* p_msg, uint32_t max_size,
293                                       uint32_t* p_cur_size, int32_t index,
294                                       uint8_t tnf, uint8_t* p_type,
295                                       uint8_t type_len, uint8_t* p_id,
296                                       uint8_t id_len, uint8_t* p_payload,
297                                       uint32_t payload_len);
298 
299 /*******************************************************************************
300 **
301 ** Function         NDEF_MsgAppendRec
302 **
303 ** Description      This function adds NDEF records to the end of an NDEF
304 **                  message.
305 **
306 ** Returns          OK, or error if the record did not fit
307 **                  *p_cur_size is updated
308 **
309 *******************************************************************************/
310 extern tNDEF_STATUS NDEF_MsgAppendRec(uint8_t* p_msg, uint32_t max_size,
311                                       uint32_t* p_cur_size, uint8_t* p_new_rec,
312                                       uint32_t new_rec_len);
313 
314 /*******************************************************************************
315 **
316 ** Function         NDEF_MsgAppendPayload
317 **
318 ** Description      This function appends extra payload to a specific record in
319 **                  the given NDEF message
320 **
321 ** Returns          OK, or error if the extra payload did not fit
322 **                  *p_cur_size is updated
323 **
324 *******************************************************************************/
325 extern tNDEF_STATUS NDEF_MsgAppendPayload(uint8_t* p_msg, uint32_t max_size,
326                                           uint32_t* p_cur_size, uint8_t* p_rec,
327                                           uint8_t* p_add_pl,
328                                           uint32_t add_pl_len);
329 
330 /*******************************************************************************
331 **
332 ** Function         NDEF_MsgReplacePayload
333 **
334 ** Description      This function replaces the payload of a specific record in
335 **                  the given NDEF message
336 **
337 ** Returns          OK, or error if the new payload did not fit
338 **                  *p_cur_size is updated
339 **
340 *******************************************************************************/
341 extern tNDEF_STATUS NDEF_MsgReplacePayload(uint8_t* p_msg, uint32_t max_size,
342                                            uint32_t* p_cur_size, uint8_t* p_rec,
343                                            uint8_t* p_new_pl,
344                                            uint32_t new_pl_len);
345 
346 /*******************************************************************************
347 **
348 ** Function         NDEF_MsgReplaceType
349 **
350 ** Description      This function replaces the type field of a specific record
351 **                  in the given NDEF message
352 **
353 ** Returns          OK, or error if the new type field did not fit
354 **                  *p_cur_size is updated
355 **
356 *******************************************************************************/
357 extern tNDEF_STATUS NDEF_MsgReplaceType(uint8_t* p_msg, uint32_t max_size,
358                                         uint32_t* p_cur_size, uint8_t* p_rec,
359                                         uint8_t* p_new_type,
360                                         uint8_t new_type_len);
361 
362 /*******************************************************************************
363 **
364 ** Function         NDEF_MsgReplaceId
365 **
366 ** Description      This function replaces the ID field of a specific record in
367 **                  the given NDEF message
368 **
369 ** Returns          OK, or error if the new ID field did not fit
370 **                  *p_cur_size is updated
371 **
372 *******************************************************************************/
373 extern tNDEF_STATUS NDEF_MsgReplaceId(uint8_t* p_msg, uint32_t max_size,
374                                       uint32_t* p_cur_size, uint8_t* p_rec,
375                                       uint8_t* p_new_id, uint8_t new_id_len);
376 
377 /*******************************************************************************
378 **
379 ** Function         NDEF_MsgRemoveRec
380 **
381 ** Description      This function removes the record at the given
382 **                  index in the given NDEF message.
383 **
384 ** Returns          OK, or error if the index was invalid
385 **                  *p_cur_size is updated
386 **
387 *******************************************************************************/
388 extern tNDEF_STATUS NDEF_MsgRemoveRec(uint8_t* p_msg, uint32_t* p_cur_size,
389                                       int32_t index);
390 
391 /*******************************************************************************
392 **
393 ** Function         NDEF_MsgCopyAndDechunk
394 **
395 ** Description      This function copies and de-chunks an NDEF message.
396 **                  It is assumed that the destination is at least as large
397 **                  as the source, since the source may not actually contain
398 **                  any chunks.
399 **
400 ** Returns          The output byte count
401 **
402 *******************************************************************************/
403 extern tNDEF_STATUS NDEF_MsgCopyAndDechunk(uint8_t* p_src, uint32_t src_len,
404                                            uint8_t* p_dest,
405                                            uint32_t* p_out_len);
406 
407 #ifdef __cplusplus
408 }
409 #endif
410 
411 #endif /* NDEF_UTILS_H */
412