• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2010-2012 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 
38 /* NDEF Type Name Format */
39 #define NDEF_TNF_EMPTY          0   /* Empty (type/id/payload len =0) */
40 #define NDEF_TNF_WKT            1   /* NFC Forum well-known type/RTD */
41 #define NDEF_TNF_MEDIA          2   /* Media-type as defined in RFC 2046 */
42 #define NDEF_TNF_URI            3   /* Absolute URI as defined in RFC 3986 */
43 #define NDEF_TNF_EXT            4   /* NFC Forum external type/RTD */
44 #define NDEF_TNF_UNKNOWN        5   /* Unknown (type len =0) */
45 #define NDEF_TNF_UNCHANGED      6   /* Unchanged (type len =0) */
46 #define NDEF_TNF_RESERVED       7   /* Reserved */
47 
48 /* Define the status code returned from the Validate, Parse or Build functions
49 */
50 enum
51 {
52     NDEF_OK,                            /* 0 - OK                                   */
53 
54     NDEF_REC_NOT_FOUND,                 /* 1 - No record matching the find criteria */
55     NDEF_MSG_TOO_SHORT,                 /* 2 - Message was too short (< 3 bytes)    */
56     NDEF_MSG_NO_MSG_BEGIN,              /* 3 - No 'begin' flag at start of message  */
57     NDEF_MSG_NO_MSG_END,                /* 4 - No 'end' flag at end of message      */
58     NDEF_MSG_EXTRA_MSG_BEGIN,           /* 5 - 'begin' flag after start of message  */
59     NDEF_MSG_UNEXPECTED_CHUNK,          /* 6 - Unexpected chunk found               */
60     NDEF_MSG_INVALID_EMPTY_REC,         /* 7 - Empty record with non-zero contents  */
61     NDEF_MSG_INVALID_CHUNK,             /* 8 - Invalid chunk found                  */
62     NDEF_MSG_LENGTH_MISMATCH,           /* 9 - Overall message length doesn't match */
63     NDEF_MSG_INSUFFICIENT_MEM           /* 10 - Insuffiecient memory to add record  */
64 };
65 typedef UINT8 tNDEF_STATUS;
66 
67 
68 #define HR_REC_TYPE_LEN     2       /* Handover Request Record Type     */
69 #define HS_REC_TYPE_LEN     2       /* Handover Select Record Type      */
70 #define HC_REC_TYPE_LEN     2       /* Handover Carrier recrod Type     */
71 #define CR_REC_TYPE_LEN     2       /* Collision Resolution Record Type */
72 #define AC_REC_TYPE_LEN     2       /* Alternative Carrier Record Type  */
73 #define ERR_REC_TYPE_LEN    3       /* Error Record Type                */
74 #define BT_OOB_REC_TYPE_LEN 32      /* Bluetooth OOB Data Type          */
75 
76 
77 #ifdef __cplusplus
78 extern "C" {
79 #endif
80 
81 /* Define prefix for exporting APIs from libraries */
82 #ifdef  NFC_DLL
83 #define EXPORT_NDEF_API __declspec(dllexport)       /* Windows DLL export prefix */
84 #else
85 #define EXPORT_NDEF_API
86 #endif
87 
88 /* Functions to parse a received NDEF Message
89 */
90 /*******************************************************************************
91 **
92 ** Function         NDEF_MsgValidate
93 **
94 ** Description      This function validates an NDEF message.
95 **
96 ** Returns          TRUE if all OK, or FALSE if the message is invalid.
97 **
98 *******************************************************************************/
99 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgValidate (UINT8 *p_msg, UINT32 msg_len, BOOLEAN b_allow_chunks);
100 
101 /*******************************************************************************
102 **
103 ** Function         NDEF_MsgGetNumRecs
104 **
105 ** Description      This function gets the number of records in the given NDEF
106 **                  message.
107 **
108 ** Returns          The record count, or 0 if the message is invalid.
109 **
110 *******************************************************************************/
111 EXPORT_NDEF_API extern INT32 NDEF_MsgGetNumRecs (UINT8 *p_msg);
112 
113 /*******************************************************************************
114 **
115 ** Function         NDEF_MsgGetRecLength
116 **
117 ** Description      This function returns length of the current record in the given
118 **                  NDEF message.
119 **
120 ** Returns          Length of record
121 **
122 *******************************************************************************/
123 EXPORT_NDEF_API extern UINT32 NDEF_MsgGetRecLength (UINT8 *p_cur_rec);
124 
125 /*******************************************************************************
126 **
127 ** Function         NDEF_MsgGetNextRec
128 **
129 ** Description      This function gets a pointer to the next record after the
130 **                  current one.
131 **
132 ** Returns          Pointer to the start of the record, or NULL if no more
133 **
134 *******************************************************************************/
135 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetNextRec (UINT8 *p_cur_rec);
136 
137 /*******************************************************************************
138 **
139 ** Function         NDEF_MsgGetRecByIndex
140 **
141 ** Description      This function gets a pointer to the record with the given
142 **                  index (0-based index) in the given NDEF message.
143 **
144 ** Returns          Pointer to the start of the record, or NULL
145 **
146 *******************************************************************************/
147 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetRecByIndex (UINT8 *p_msg, INT32 index);
148 
149 /*******************************************************************************
150 **
151 ** Function         NDEF_MsgGetLastRecInMsg
152 **
153 ** Description      This function gets a pointer to the last record in the
154 **                  given NDEF message.
155 **
156 ** Returns          Pointer to the start of the last record, or NULL if some problem
157 **
158 *******************************************************************************/
159 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetLastRecInMsg (UINT8 *p_msg);
160 
161 /*******************************************************************************
162 **
163 ** Function         NDEF_MsgGetFirstRecByType
164 **
165 ** Description      This function gets a pointer to the first record with the given
166 **                  record type in the given NDEF message.
167 **
168 ** Returns          Pointer to the start of the record, or NULL
169 **
170 *******************************************************************************/
171 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetFirstRecByType (UINT8 *p_msg, UINT8 tnf, UINT8 *p_type, UINT8 tlen);
172 
173 /*******************************************************************************
174 **
175 ** Function         NDEF_MsgGetNextRecByType
176 **
177 ** Description      This function gets a pointer to the next record with the given
178 **                  record type in the given NDEF message.
179 **
180 ** Returns          Pointer to the start of the record, or NULL
181 **
182 *******************************************************************************/
183 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetNextRecByType (UINT8 *p_cur_rec, UINT8 tnf, UINT8 *p_type, UINT8 tlen);
184 
185 /*******************************************************************************
186 **
187 ** Function         NDEF_MsgGetFirstRecById
188 **
189 ** Description      This function gets a pointer to the first record with the given
190 **                  record id in the given NDEF message.
191 **
192 ** Returns          Pointer to the start of the record, or NULL
193 **
194 *******************************************************************************/
195 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetFirstRecById (UINT8 *p_msg, UINT8 *p_id, UINT8 ilen);
196 
197 /*******************************************************************************
198 **
199 ** Function         NDEF_MsgGetNextRecById
200 **
201 ** Description      This function gets a pointer to the next record with the given
202 **                  record id in the given NDEF message.
203 **
204 ** Returns          Pointer to the start of the record, or NULL
205 **
206 *******************************************************************************/
207 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetNextRecById (UINT8 *p_cur_rec, UINT8 *p_id, UINT8 ilen);
208 
209 /*******************************************************************************
210 **
211 ** Function         NDEF_RecGetType
212 **
213 ** Description      This function gets a pointer to the record type for the given NDEF record.
214 **
215 ** Returns          Pointer to Type (NULL if none). TNF and len are filled in.
216 **
217 *******************************************************************************/
218 EXPORT_NDEF_API extern UINT8 *NDEF_RecGetType (UINT8 *p_rec, UINT8 *p_tnf, UINT8 *p_type_len);
219 
220 /*******************************************************************************
221 **
222 ** Function         NDEF_RecGetId
223 **
224 ** Description      This function gets a pointer to the record id for the given NDEF record.
225 **
226 ** Returns          Pointer to Id (NULL if none). ID Len is filled in.
227 **
228 *******************************************************************************/
229 EXPORT_NDEF_API extern UINT8 *NDEF_RecGetId (UINT8 *p_rec, UINT8 *p_id_len);
230 
231 /*******************************************************************************
232 **
233 ** Function         NDEF_RecGetPayload
234 **
235 ** Description      This function gets a pointer to the payload for the given NDEF record.
236 **
237 ** Returns          a pointer to the payload (NULL if none). Payload len filled in.
238 **
239 *******************************************************************************/
240 EXPORT_NDEF_API extern UINT8 *NDEF_RecGetPayload (UINT8 *p_rec, UINT32 *p_payload_len);
241 
242 
243 /* Functions to build an NDEF Message
244 */
245 /*******************************************************************************
246 **
247 ** Function         NDEF_MsgInit
248 **
249 ** Description      This function initializes an NDEF message.
250 **
251 ** Returns          void
252 **                  *p_cur_size is initialized to 0
253 **
254 *******************************************************************************/
255 EXPORT_NDEF_API extern void NDEF_MsgInit (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size);
256 
257 /*******************************************************************************
258 **
259 ** Function         NDEF_MsgAddRec
260 **
261 ** Description      This function adds an NDEF record to the end of an NDEF message.
262 **
263 ** Returns          OK, or error if the record did not fit
264 **                  *p_cur_size is updated
265 **
266 *******************************************************************************/
267 EXPORT_NDEF_API extern tNDEF_STATUS  NDEF_MsgAddRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
268                                      UINT8 tnf, UINT8 *p_type, UINT8 type_len,
269                                      UINT8 *p_id, UINT8  id_len,
270                                      UINT8 *p_payload, UINT32 payload_len);
271 
272 /*******************************************************************************
273 **
274 ** Function         NDEF_MsgInsertRec
275 **
276 ** Description      This function inserts a record at a specific index into the
277 **                  given NDEF message
278 **
279 ** Returns          OK, or error if the record did not fit
280 **                  *p_cur_size is updated
281 **
282 *******************************************************************************/
283 EXPORT_NDEF_API extern tNDEF_STATUS  NDEF_MsgInsertRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, INT32 index,
284                                         UINT8 tnf, UINT8 *p_type, UINT8 type_len,
285                                         UINT8 *p_id, UINT8  id_len,
286                                         UINT8 *p_payload, UINT32 payload_len);
287 
288 /*******************************************************************************
289 **
290 ** Function         NDEF_MsgAppendRec
291 **
292 ** Description      This function adds NDEF records to the end of an NDEF message.
293 **
294 ** Returns          OK, or error if the record did not fit
295 **                  *p_cur_size is updated
296 **
297 *******************************************************************************/
298 EXPORT_NDEF_API extern tNDEF_STATUS  NDEF_MsgAppendRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
299                                         UINT8 *p_new_rec, UINT32 new_rec_len);
300 
301 /*******************************************************************************
302 **
303 ** Function         NDEF_MsgAppendPayload
304 **
305 ** Description      This function appends extra payload to a specific record in the
306 **                  given NDEF message
307 **
308 ** Returns          OK, or error if the extra payload did not fit
309 **                  *p_cur_size is updated
310 **
311 *******************************************************************************/
312 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendPayload (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
313                                            UINT8 *p_rec, UINT8 *p_add_pl, UINT32 add_pl_len);
314 
315 /*******************************************************************************
316 **
317 ** Function         NDEF_MsgReplacePayload
318 **
319 ** Description      This function replaces the payload of a specific record in the
320 **                  given NDEF message
321 **
322 ** Returns          OK, or error if the new payload did not fit
323 **                  *p_cur_size is updated
324 **
325 *******************************************************************************/
326 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgReplacePayload (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
327                                             UINT8 *p_rec, UINT8 *p_new_pl, UINT32 new_pl_len);
328 
329 /*******************************************************************************
330 **
331 ** Function         NDEF_MsgReplaceType
332 **
333 ** Description      This function replaces the type field of a specific record in the
334 **                  given NDEF message
335 **
336 ** Returns          OK, or error if the new type field did not fit
337 **                  *p_cur_size is updated
338 **
339 *******************************************************************************/
340 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgReplaceType (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
341                                          UINT8 *p_rec, UINT8 *p_new_type, UINT8 new_type_len);
342 
343 /*******************************************************************************
344 **
345 ** Function         NDEF_MsgReplaceId
346 **
347 ** Description      This function replaces the ID field of a specific record in the
348 **                  given NDEF message
349 **
350 ** Returns          OK, or error if the new ID field did not fit
351 **                  *p_cur_size is updated
352 **
353 *******************************************************************************/
354 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgReplaceId (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
355                                        UINT8 *p_rec, UINT8 *p_new_id, UINT8 new_id_len);
356 
357 /*******************************************************************************
358 **
359 ** Function         NDEF_MsgRemoveRec
360 **
361 ** Description      This function removes the record at the given
362 **                  index in the given NDEF message.
363 **
364 ** Returns          OK, or error if the index was invalid
365 **                  *p_cur_size is updated
366 **
367 *******************************************************************************/
368 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgRemoveRec (UINT8 *p_msg, UINT32 *p_cur_size, INT32 index);
369 
370 /*******************************************************************************
371 **
372 ** Function         NDEF_MsgCopyAndDechunk
373 **
374 ** Description      This function copies and de-chunks an NDEF message.
375 **                  It is assumed that the destination is at least as large
376 **                  as the source, since the source may not actually contain
377 **                  any chunks.
378 **
379 ** Returns          The output byte count
380 **
381 *******************************************************************************/
382 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgCopyAndDechunk (UINT8 *p_src, UINT32 src_len, UINT8 *p_dest, UINT32 *p_out_len);
383 
384 /*******************************************************************************
385 **
386 ** Function         NDEF_MsgCreateWktHr
387 **
388 ** Description      This function creates Handover Request Record with version.
389 **
390 ** Returns          NDEF_OK if all OK
391 **
392 *******************************************************************************/
393 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgCreateWktHr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
394                                                  UINT8 version );
395 
396 /*******************************************************************************
397 **
398 ** Function         NDEF_MsgCreateWktHs
399 **
400 ** Description      This function creates Handover Select Record with version.
401 **
402 ** Returns          NDEF_OK if all OK
403 **
404 *******************************************************************************/
405 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgCreateWktHs (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
406                                                  UINT8 version );
407 
408 /*******************************************************************************
409 **
410 ** Function         NDEF_MsgAddWktHc
411 **
412 ** Description      This function adds Handover Carrier Record.
413 **
414 ** Returns          NDEF_OK if all OK
415 **
416 *******************************************************************************/
417 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktHc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
418                                               char  *p_id_str, UINT8 ctf,
419                                               UINT8 carrier_type_len, UINT8 *p_carrier_type,
420                                               UINT8 carrier_data_len, UINT8 *p_carrier_data);
421 
422 /*******************************************************************************
423 **
424 ** Function         NDEF_MsgAddWktAc
425 **
426 ** Description      This function adds Alternative Carrier Record.
427 **
428 ** Returns          NDEF_OK if all OK
429 **
430 *******************************************************************************/
431 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktAc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
432                                               UINT8 cps, char *p_carrier_data_ref_str,
433                                               UINT8 aux_data_ref_count, char *p_aux_data_ref_str[]);
434 
435 /*******************************************************************************
436 **
437 ** Function         NDEF_MsgAddWktCr
438 **
439 ** Description      This function adds Collision Resolution Record.
440 **
441 ** Returns          NDEF_OK if all OK
442 **
443 *******************************************************************************/
444 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktCr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
445                                               UINT16 random_number );
446 
447 /*******************************************************************************
448 **
449 ** Function         NDEF_MsgAddWktErr
450 **
451 ** Description      This function adds Error Record.
452 **
453 ** Returns          NDEF_OK if all OK
454 **
455 *******************************************************************************/
456 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktErr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
457                                                UINT8 error_reason, UINT32 error_data );
458 
459 /*******************************************************************************
460 **
461 ** Function         NDEF_MsgAddMediaBtOob
462 **
463 ** Description      This function adds BT OOB Record.
464 **
465 ** Returns          NDEF_OK if all OK
466 **
467 *******************************************************************************/
468 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddMediaBtOob (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
469                                                    char *p_id_str, BD_ADDR bd_addr);
470 
471 /*******************************************************************************
472 **
473 ** Function         NDEF_MsgAppendMediaBtOobCod
474 **
475 ** Description      This function appends COD EIR data at the end of BT OOB Record.
476 **
477 ** Returns          NDEF_OK if all OK
478 **
479 *******************************************************************************/
480 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobCod (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
481                                                          char *p_id_str, DEV_CLASS cod);
482 
483 /*******************************************************************************
484 **
485 ** Function         NDEF_MsgAppendMediaBtOobName
486 **
487 ** Description      This function appends Bluetooth Local Name EIR data
488 **                  at the end of BT OOB Record.
489 **
490 ** Returns          NDEF_OK if all OK
491 **
492 *******************************************************************************/
493 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobName (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
494                                                           char *p_id_str, BOOLEAN is_complete,
495                                                           UINT8 name_len, UINT8 *p_name);
496 
497 /*******************************************************************************
498 **
499 ** Function         NDEF_MsgAppendMediaBtOobHashCRandR
500 **
501 ** Description      This function appends Hash C and Rand R at the end of BT OOB Record.
502 **
503 ** Returns          NDEF_OK if all OK
504 **
505 *******************************************************************************/
506 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobHashCRandR (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
507                                                                 char *p_id_str, UINT8 *p_hash_c, UINT8 *p_rand_r);
508 
509 /*******************************************************************************
510 **
511 ** Function         NDEF_MsgAppendMediaBtOobEirData
512 **
513 ** Description      This function appends EIR Data at the end of BT OOB Record.
514 **
515 ** Returns          NDEF_OK if all OK
516 **
517 *******************************************************************************/
518 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobEirData (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
519                                                              char *p_id_str,
520                                                              UINT8 eir_type, UINT8 data_len, UINT8 *p_data);
521 
522 #ifdef __cplusplus
523 }
524 #endif
525 
526 #endif /* NDEF_UTILS_H */
527