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