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 for Connection
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Handover
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ndef_utils.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Static Local Functions
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 *ndef_get_bt_oob_record (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      char *p_id_str);
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Static data
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Handover Request Record Type */
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 hr_rec_type[HR_REC_TYPE_LEN] = { 0x48, 0x72 }; /* "Hr" */
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Handover Select Record Type */
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 hs_rec_type[HS_REC_TYPE_LEN] = { 0x48, 0x73 }; /* "Hs" */
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Handover Carrier recrod Type */
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 hc_rec_type[HC_REC_TYPE_LEN] = { 0x48, 0x63 }; /* "Hc" */
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Collision Resolution Record Type */
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 cr_rec_type[CR_REC_TYPE_LEN] = { 0x63, 0x72 }; /* "cr" */
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Alternative Carrier Record Type */
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 ac_rec_type[AC_REC_TYPE_LEN] = { 0x61, 0x63 }; /* "ac" */
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Error Record Type */
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 err_rec_type[ERR_REC_TYPE_LEN] = { 0x65, 0x72, 0x72 }; /* "err" */
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Bluetooth OOB Data Type */
625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic UINT8 *p_bt_oob_rec_type = (UINT8 *)"application/vnd.bluetooth.ep.oob";
635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Wifi WSC Data Type */
655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic UINT8 *p_wifi_wsc_rec_type = (UINT8 *)"application/vnd.wfa.wsc";
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgCreateWktHr
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function creates Handover Request Record with version.
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgCreateWktHr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8 version )
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NDEF_MsgInit (p_msg, max_size, p_cur_size);
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Add record with version */
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NDEF_TNF_WKT, hr_rec_type, HR_REC_TYPE_LEN,
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NULL, 0, &version, 1);
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgCreateWktHs
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function creates Handover Select Record with version.
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgCreateWktHs (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8 version )
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NDEF_MsgInit (p_msg, max_size, p_cur_size);
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Add record with version */
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NDEF_TNF_WKT, hs_rec_type, HS_REC_TYPE_LEN,
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NULL, 0, &version, 1);
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAddWktHc
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function adds Handover Carrier Record.
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAddWktHc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               char  *p_id_str, UINT8 ctf,
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT8 carrier_type_len, UINT8 *p_carrier_type,
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT8 carrier_data_len, UINT8 *p_carrier_data)
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           payload[256], *p, id_len;
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32          payload_len;
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (carrier_type_len + carrier_data_len + 2 > 256)
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NDEF_MSG_INSUFFICIENT_MEM);
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = payload;
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, (ctf & 0x07));
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, carrier_type_len);
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ARRAY_TO_STREAM (p, p_carrier_type, carrier_type_len);
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ARRAY_TO_STREAM (p, p_carrier_data, carrier_data_len);
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    payload_len = (UINT32)carrier_type_len + carrier_data_len + 2;
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    id_len = (UINT8)strlen (p_id_str);
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NDEF_TNF_WKT, hc_rec_type, HC_REC_TYPE_LEN,
1515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                             (UINT8*)p_id_str, id_len, payload, payload_len);
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAddWktAc
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function adds Alternative Carrier Record.
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAddWktAc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT8 cps, char *p_carrier_data_ref_str,
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT8 aux_data_ref_count, char *p_aux_data_ref_str[])
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32          payload_len;
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           ref_str_len, xx;
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p_rec, *p;
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* get payload length first */
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* CPS, length of carrier data ref, carrier data ref, Aux data reference count */
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    payload_len = 3 + (UINT8)strlen (p_carrier_data_ref_str);
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < aux_data_ref_count; xx++)
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Aux Data Reference length (1 byte) */
1805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        payload_len += 1 + (UINT8)strlen (p_aux_data_ref_str[xx]);
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* reserve memory for payload */
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NDEF_TNF_WKT, ac_rec_type, AC_REC_TYPE_LEN,
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NULL, 0, NULL, payload_len);
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NDEF_OK)
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* get AC record added at the end */
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_rec = NDEF_MsgGetLastRecInMsg (p_msg);
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* get start pointer of reserved payload */
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = NDEF_RecGetPayload (p_rec, &payload_len);
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Add Carrier Power State */
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, cps);
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Carrier Data Reference length */
2005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ref_str_len = (UINT8)strlen (p_carrier_data_ref_str);
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, ref_str_len);
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Carrier Data Reference */
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ARRAY_TO_BE_STREAM (p, p_carrier_data_ref_str, ref_str_len);
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Aux Data Reference Count */
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, aux_data_ref_count);
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (xx = 0; xx < aux_data_ref_count; xx++)
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Aux Data Reference length (1 byte) */
2135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ref_str_len = (UINT8)strlen (p_aux_data_ref_str[xx]);
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT8_TO_BE_STREAM (p, ref_str_len);
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Aux Data Reference */
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ARRAY_TO_BE_STREAM (p, p_aux_data_ref_str[xx], ref_str_len);
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAddWktCr
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function adds Collision Resolution Record.
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAddWktCr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT16 random_number )
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           data[2], *p;
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = data;
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, random_number);
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NDEF_TNF_WKT, cr_rec_type, CR_REC_TYPE_LEN,
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NULL, 0, data, 2);
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAddWktErr
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function adds Error Record.
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAddWktErr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                UINT8 error_reason, UINT32 error_data )
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           payload[5], *p;
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32          payload_len;
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = payload;
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, error_reason);
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (error_reason == 0x02)
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT32_TO_BE_STREAM (p, error_data);
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        payload_len = 5;
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, error_data);
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        payload_len = 2;
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NDEF_TNF_WKT, err_rec_type, ERR_REC_TYPE_LEN,
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NULL, 0, payload, payload_len);
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAddMediaBtOob
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function adds BT OOB Record.
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAddMediaBtOob (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    char *p_id_str, BD_ADDR bd_addr)
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           payload[BD_ADDR_LEN + 2];
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p;
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           payload_len, id_len;
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = payload;
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* length including itself */
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_STREAM (p, BD_ADDR_LEN + 2);
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* BD Addr */
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BDADDR_TO_STREAM (p, bd_addr);
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    payload_len = BD_ADDR_LEN + 2;
3125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    id_len = (UINT8)strlen (p_id_str);
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             NDEF_TNF_MEDIA, p_bt_oob_rec_type, BT_OOB_REC_TYPE_LEN,
3165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                             (UINT8*)p_id_str, id_len, payload, payload_len);
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAppendMediaBtOobCod
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function appends COD EIR data at the end of BT OOB Record.
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAppendMediaBtOobCod (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                          char *p_id_str, DEV_CLASS cod)
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p_rec;
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data[BT_OOB_COD_SIZE + 2];
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p;
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data_len;
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32          oob_data_len;
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* find record by Payload ID */
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_rec)
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NDEF_REC_NOT_FOUND);
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* create EIR data format for COD */
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = eir_data;
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, BT_OOB_COD_SIZE + 1);
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, BT_EIR_OOB_COD_TYPE);
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DEVCLASS_TO_STREAM (p, cod);
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    eir_data_len = BT_OOB_COD_SIZE + 2;
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* append EIR data at the end of record */
3535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
3545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                   p_rec, eir_data, eir_data_len);
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update BT OOB data length, if success */
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NDEF_OK)
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* payload length is the same as BT OOB data length */
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = NDEF_RecGetPayload (p_rec, &oob_data_len);
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_STREAM (p, oob_data_len);
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAppendMediaBtOobName
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function appends Bluetooth Local Name EIR data
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  at the end of BT OOB Record.
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAppendMediaBtOobName (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                           char *p_id_str, BOOLEAN is_complete,
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                           UINT8 name_len, UINT8 *p_name)
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p_rec;
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data[256];
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p;
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data_len;
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32          oob_data_len;
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* find record by Payload ID */
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_rec)
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NDEF_REC_NOT_FOUND);
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* create EIR data format for COD */
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = eir_data;
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, name_len + 1);
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (is_complete)
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, BT_EIR_COMPLETE_LOCAL_NAME_TYPE);
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, BT_EIR_SHORTENED_LOCAL_NAME_TYPE);
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ARRAY_TO_STREAM (p, p_name, name_len);
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    eir_data_len = name_len + 2;
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* append EIR data at the end of record */
4115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
4125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                   p_rec, eir_data, eir_data_len);
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update BT OOB data length, if success */
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NDEF_OK)
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* payload length is the same as BT OOB data length */
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = NDEF_RecGetPayload (p_rec, &oob_data_len);
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_STREAM (p, oob_data_len);
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAppendMediaBtOobHashCRandR
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function appends Hash C and Rand R at the end of BT OOB Record.
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAppendMediaBtOobHashCRandR (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                 char *p_id_str, UINT8 *p_hash_c, UINT8 *p_rand_r)
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p_rec;
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data[BT_OOB_HASH_C_SIZE + BT_OOB_RAND_R_SIZE + 4];
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p;
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data_len;
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32          oob_data_len;
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* find record by Payload ID */
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_rec)
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NDEF_REC_NOT_FOUND);
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* create EIR data format */
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = eir_data;
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_STREAM   (p, BT_OOB_HASH_C_SIZE + 1);
4545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_STREAM   (p, BT_EIR_OOB_SSP_HASH_C_TYPE);
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ARRAY16_TO_STREAM (p, p_hash_c);
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_STREAM   (p, BT_OOB_RAND_R_SIZE + 1);
4585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_STREAM   (p, BT_EIR_OOB_SSP_RAND_R_TYPE);
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ARRAY16_TO_STREAM (p, p_rand_r);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    eir_data_len = BT_OOB_HASH_C_SIZE + BT_OOB_RAND_R_SIZE + 4;
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* append EIR data at the end of record */
4645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
4655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                   p_rec, eir_data, eir_data_len);
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update BT OOB data length, if success */
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NDEF_OK)
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* payload length is the same as BT OOB data length */
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = NDEF_RecGetPayload (p_rec, &oob_data_len);
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_STREAM (p, oob_data_len);
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         NDEF_MsgAppendMediaBtOobEirData
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function appends EIR Data at the end of BT OOB Record.
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF_OK if all OK
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNDEF_STATUS NDEF_MsgAppendMediaBtOobEirData (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                              char *p_id_str,
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                              UINT8 eir_type, UINT8 data_len, UINT8 *p_data)
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNDEF_STATUS    status;
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p_rec;
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data[256];
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8          *p;
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           eir_data_len;
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32          oob_data_len;
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* find record by Payload ID */
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_rec)
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NDEF_REC_NOT_FOUND);
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* create EIR data format */
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = eir_data;
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, data_len + 1);
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, eir_type);
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ARRAY_TO_STREAM (p, p_data, data_len);
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    eir_data_len = data_len + 2;
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* append EIR data at the end of record */
5125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
5135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                   p_rec, eir_data, eir_data_len);
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update BT OOB data length, if success */
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NDEF_OK)
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* payload length is the same as BT OOB data length */
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = NDEF_RecGetPayload (p_rec, &oob_data_len);
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_STREAM (p, oob_data_len);
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         NDEF_MsgAddMediaWifiWsc
5295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
5305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function adds Wifi Wsc Record header.
5315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
5325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          NDEF_OK if all OK
5335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
5345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
5355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNDEF_STATUS NDEF_MsgAddMediaWifiWsc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
5365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                    char *p_id_str, UINT8 *p_payload, UINT32 payload_len)
5375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
5385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNDEF_STATUS    status;
5395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8           id_len = 0;
5405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (p_id_str)
5425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        id_len = (UINT8)strlen (p_id_str);
5435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
5455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                             NDEF_TNF_MEDIA, p_wifi_wsc_rec_type, WIFI_WSC_REC_TYPE_LEN,
5465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                             (UINT8*)p_id_str, id_len, p_payload, payload_len);
5475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    return (status);
5485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
5495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
5515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**              Static Local Functions
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ndef_get_bt_oob_record
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns BT OOB record which has matched payload ID
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer of record if found, otherwise NULL
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 *ndef_get_bt_oob_record (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      char *p_id_str)
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  *p_rec, *p_type;
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   id_len, tnf, type_len;
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* find record by Payload ID */
5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    id_len = (UINT8)strlen (p_id_str);
5725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_rec = NDEF_MsgGetFirstRecById (p_msg, (UINT8*)p_id_str, id_len);
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_rec)
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NULL);
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_type = NDEF_RecGetType (p_rec, &tnf, &type_len);
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* check type if this is BT OOB record */
5805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ((!p_rec)
5815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen      ||(tnf != NDEF_TNF_MEDIA)
5825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen      ||(type_len != BT_OOB_REC_TYPE_LEN)
5835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen      ||(memcmp (p_type, p_bt_oob_rec_type, BT_OOB_REC_TYPE_LEN)))
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NULL);
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (p_rec);
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
591