15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this file contains functions that handle the database 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <stdio.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "l2cdefs.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpint.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 41ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L F U N C T I O N P R O T O T Y P E S */ 43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool find_uuid_in_seq(uint8_t* p, uint32_t seq_len, uint8_t* p_his_uuid, 45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t his_len, int nest_level); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 48ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 49ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdp_db_service_search 50ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 51ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function searches for a record that contains the 52ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * specified UIDs. It is passed either NULL to start at the 53ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * beginning, or the previous record found. 54ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record, or NULL if not found. 56ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 58911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontSDP_RECORD* sdp_db_service_search(tSDP_RECORD* p_rec, tSDP_UUID_SEQ* p_seq) { 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx, yy; 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_ATTRIBUTE* p_attr; 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records]; 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If NULL, start at the beginning, else start at the first specified record 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_rec) 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec = &sdp_cb.server_db.record[0]; 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec++; 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Look through the records. The spec says that a match occurs if */ 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the record contains all the passed UUIDs in it. */ 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (; p_rec < p_end; p_rec++) { 73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < p_seq->num_uids; yy++) { 74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr = &p_rec->attribute[0]; 75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) { 76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->type == UUID_DESC_TYPE) { 77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sdpu_compare_uuid_arrays(p_attr->value_ptr, p_attr->len, 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson &p_seq->uuid_entry[yy].value[0], 79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->uuid_entry[yy].len)) 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_attr->type == DATA_ELE_SEQ_DESC_TYPE) { 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (find_uuid_in_seq(p_attr->value_ptr, p_attr->len, 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson &p_seq->uuid_entry[yy].value[0], 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->uuid_entry[yy].len, 0)) 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If any UUID was not found, on to the next record */ 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx == p_rec->num_attributes) break; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If every UUID was found in the record, return the record */ 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (yy == p_seq->num_uids) return (p_rec); 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no more records found */ 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function find_uuid_in_seq 103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function searches a data element sequenct for a UUID. 105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if found, else false 107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool find_uuid_in_seq(uint8_t* p, uint32_t seq_len, uint8_t* p_uuid, 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t uuid_len, int nest_level) { 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_end = p + seq_len; 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t type; 113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t len; 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* A little safety check to avoid excessive recursion */ 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (nest_level > 3) return (false); 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while (p < p_end) { 119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson type = *p++; 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = sdpu_get_len_from_type(p, type, &len); 121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson type = type >> 3; 122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (type == UUID_DESC_TYPE) { 123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sdpu_compare_uuid_arrays(p, len, p_uuid, uuid_len)) return (true); 124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (type == DATA_ELE_SEQ_DESC_TYPE) { 125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (find_uuid_in_seq(p, len, p_uuid, uuid_len, nest_level + 1)) 126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p + len; 129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, failed to match */ 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdp_db_find_record 138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function searches for a record with a specific handle 140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * It is passed the handle of the record. 141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record, or NULL if not found. 143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 144ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 145911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontSDP_RECORD* sdp_db_find_record(uint32_t handle) { 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_rec; 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records]; 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Look through the records for the caller's handle */ 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (p_rec = &sdp_cb.server_db.record[0]; p_rec < p_end; p_rec++) { 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->record_handle == handle) return (p_rec); 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Record with that handle not found. */ 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdp_db_find_attr_in_rec 161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function searches a record for specific attributes. 163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * It is passed a pointer to the record. If the record contains 164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the specified attribute, (the caller may specify be a range 165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * of attributes), the attribute is returned. 166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 167ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the attribute, or NULL if not found. 168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 170911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontSDP_ATTRIBUTE* sdp_db_find_attr_in_rec(tSDP_RECORD* p_rec, uint16_t start_attr, 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t end_attr) { 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_ATTRIBUTE* p_at; 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Note that the attributes in a record are assumed to be in sorted order */ 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p_at = &p_rec->attribute[0]; xx < p_rec->num_attributes; 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx++, p_at++) { 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_at->id >= start_attr) && (p_at->id <= end_attr)) return (p_at); 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* No matching attribute found */ 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 187ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdp_compose_proto_list 188ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 189ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to compose a data sequence from 190ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * protocol element list struct pointer 191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns the length of the data sequence 193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic int sdp_compose_proto_list(uint8_t* p, uint16_t num_elem, 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_PROTOCOL_ELEM* p_elem_list) { 197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx, yy, len; 198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_rfcomm_scn; 199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_head = p; 200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_len; 201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, build the protocol list. This consists of a set of data element 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** sequences, one for each layer. Each layer sequence consists of layer's 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** UUID and optional parameters 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_elem; xx++, p_elem_list++) { 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = 3 + (p_elem_list->num_params * 3); 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_len = p; 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = (uint8_t)len; 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); 214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, p_elem_list->protocol_uuid); 215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_elem_list->protocol_uuid == UUID_PROTOCOL_RFCOMM) 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_rfcomm_scn = true; 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_rfcomm_scn = false; 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < p_elem_list->num_params; yy++) { 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_rfcomm_scn) { 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE); 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, p_elem_list->params[yy]); 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len -= 1; 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, p_elem_list->params[yy]); 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p - p_head); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif /* SDP_SERVER_ENABLED == TRUE */ 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_CreateRecord 241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to create a record in the database. 243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This would be through the SDP database maintenance API. The 244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * record is created empty, teh application should then call 245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * "add_attribute" to add the record's attributes. 246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Record handle if OK, else 0. 248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint32_t SDP_CreateRecord(void) { 251d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t handle; 253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t buf[4]; 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_DB* p_db = &sdp_cb.server_db; 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, check if there is a free record */ 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_db->num_records < SDP_MAX_RECORDS) { 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&p_db->record[p_db->num_records], 0, sizeof(tSDP_RECORD)); 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We will use a handle of the first unreserved handle plus last record 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** number + 1 */ 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_db->num_records) 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle = p_db->record[p_db->num_records - 1].record_handle + 1; 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle = 0x10000; 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_db->record[p_db->num_records].record_handle = handle; 268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_db->num_records++; 270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_DEBUG("SDP_CreateRecord ok, num_records:%d", p_db->num_records); 271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Add the first attribute (the handle) automatically */ 272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_FIELD(buf, handle); 273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_AddAttribute(handle, ATTR_ID_SERVICE_RECORD_HDL, UINT_DESC_TYPE, 4, 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson buf); 275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_db->record[p_db->num_records - 1].record_handle); 277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_ERROR("SDP_CreateRecord fail, exceed maximum records:%d", 279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_MAX_RECORDS); 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (0); 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_DeleteRecord 287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a record (or all records) 289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * from the database. This would be through the SDP database 290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * maintenance API. 291ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 292ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If a record handle of 0 is passed, all records are deleted. 293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 294ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if succeeded, else false 295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_DeleteRecord(uint32_t handle) { 298d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx, yy, zz; 300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_rec = &sdp_cb.server_db.record[0]; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (handle == 0 || sdp_cb.server_db.num_records == 0) { 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Delete all records in the database */ 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sdp_cb.server_db.num_records = 0; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* require new DI record to be created in SDP_SetLocalDiRecord */ 307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sdp_cb.server_db.di_primary_handle = 0; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the record in the database */ 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++) { 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->record_handle == handle) { 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Found it. Shift everything up one */ 3150d892120359af4cd1af7f9c13897c1002eac59f3Jakub Pawlowski for (yy = xx; yy < sdp_cb.server_db.num_records - 1; yy++, p_rec++) { 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_rec = *(p_rec + 1); 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Adjust the attribute value pointer for each attribute */ 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (zz = 0; zz < p_rec->num_attributes; zz++) 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->attribute[zz].value_ptr -= sizeof(tSDP_RECORD); 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sdp_cb.server_db.num_records--; 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_DEBUG("SDP_DeleteRecord ok, num_records:%d", 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sdp_cb.server_db.num_records); 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if we're deleting the primary DI record, clear the */ 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* value in the control block */ 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sdp_cb.server_db.di_primary_handle == handle) { 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sdp_cb.server_db.di_primary_handle = 0; 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddAttribute 344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add an attribute to a record. 346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This would be through the SDP database maintenance API. 3479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * If the attribute already exists in the record, it is 3489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * replaced with the new value. 349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE Attribute values must be passed as a Big Endian stream. 351ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddAttribute(uint32_t handle, uint16_t attr_id, uint8_t attr_type, 356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t attr_len, uint8_t* p_val) { 357d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx, yy, zz; 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_rec = &sdp_cb.server_db.record[0]; 360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) { 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((attr_type == UINT_DESC_TYPE) || 363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (attr_type == TWO_COMP_INT_DESC_TYPE) || 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (attr_type == UUID_DESC_TYPE) || 365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (attr_type == DATA_ELE_SEQ_DESC_TYPE) || 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (attr_type == DATA_ELE_ALT_DESC_TYPE)) { 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_array[400]; 368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t len = (attr_len > 200) ? 200 : attr_len; 369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_array[0] = '\0'; 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (uint32_t i = 0; i < len; i++) { 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson snprintf((char*)&num_array[i * 2], sizeof(num_array) - i * 2, "%02X", 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t)(p_val[i])); 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_DEBUG( 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, " 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "*p_val:%s", 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle, attr_id, attr_type, attr_len, p_val, num_array); 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (attr_type == BOOLEAN_DESC_TYPE) { 380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_DEBUG( 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, " 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "*p_val:%d", 383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle, attr_id, attr_type, attr_len, p_val, *p_val); 384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_DEBUG( 386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, " 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "*p_val:%s", 388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle, attr_id, attr_type, attr_len, p_val, p_val); 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the record in the database */ 393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (zz = 0; zz < sdp_cb.server_db.num_records; zz++, p_rec++) { 394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->record_handle == handle) { 395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_ATTRIBUTE* p_attr = &p_rec->attribute[0]; 396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Found the record. Now, see if the attribute already exists */ 398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) { 399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* The attribute exists. replace it */ 400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->id == attr_id) { 401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_DeleteAttribute(handle, attr_id); 402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->id > attr_id) break; 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->num_attributes == SDP_MAX_REC_ATTR) return (false); 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If not found, see if we can allocate a new entry */ 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx == p_rec->num_attributes) 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr = &p_rec->attribute[p_rec->num_attributes]; 412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Since the attributes are kept in sorted order, insert ours here */ 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = p_rec->num_attributes; yy > xx; yy--) 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->attribute[yy] = p_rec->attribute[yy - 1]; 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr->id = attr_id; 419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr->type = attr_type; 420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr->len = attr_len; 421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->free_pad_ptr + attr_len >= SDP_MAX_PAD_LEN) { 423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do truncate only for text string type descriptor */ 424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (attr_type == TEXT_STR_DESC_TYPE) { 425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_WARNING( 426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "SDP_AddAttribute: attr_len:%d too long. truncate to (%d)", 427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson attr_len, SDP_MAX_PAD_LEN - p_rec->free_pad_ptr); 428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson attr_len = SDP_MAX_PAD_LEN - p_rec->free_pad_ptr; 430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr] = '\0'; 431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr + 1] = '\0'; 432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson attr_len = 0; 434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((attr_len > 0) && (p_val != 0)) { 437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr->len = attr_len; 438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&p_rec->attr_pad[p_rec->free_pad_ptr], p_val, (size_t)attr_len); 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr->value_ptr = &p_rec->attr_pad[p_rec->free_pad_ptr]; 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->free_pad_ptr += attr_len; 441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if ((attr_len == 0 && 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr->len != 443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0) || /* if truncate to 0 length, simply don't add */ 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_val == 0) { 445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_ERROR( 446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ", 447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson attr_id, attr_len); 448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr->id = p_attr->type = p_attr->len = 0; 449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->num_attributes++; 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 461ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddSequence 462ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 463ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a sequence to a record. 464ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This would be through the SDP database maintenance API. 465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the sequence already exists in the record, it is replaced 466ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with the new sequence. 467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE Element values must be passed as a Big Endian stream. 469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddSequence(uint32_t handle, uint16_t attr_id, uint16_t num_elem, 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t type[], uint8_t len[], uint8_t* p_val[]) { 475d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_head; 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool result; 480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buff = 481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN * 2); 482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_buff; 484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, build the sequence */ 486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_elem; xx++) { 487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_head = p; 488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (len[xx]) { 489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 1: 490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (type[xx] << 3) | SIZE_ONE_BYTE); 491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 2: 493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (type[xx] << 3) | SIZE_TWO_BYTES); 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 4: 496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (type[xx] << 3) | SIZE_FOUR_BYTES); 497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 8: 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (type[xx] << 3) | SIZE_EIGHT_BYTES); 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 16: 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (type[xx] << 3) | SIZE_SIXTEEN_BYTES); 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (type[xx] << 3) | SIZE_IN_NEXT_BYTE); 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, len[xx]); 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ARRAY_TO_BE_STREAM(p, p_val[xx], len[xx]); 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p - p_buff > SDP_MAX_ATTR_LEN) { 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* go back to before we add this element */ 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_head; 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_head == p_buff) { 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the first element exceed the max length */ 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_ERROR("SDP_AddSequence - too long(attribute is not added)!!"); 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_ERROR("SDP_AddSequence - too long, add %d elements of %d", xx, 522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_elem); 523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = SDP_AddAttribute(handle, attr_id, DATA_ELE_SEQ_DESC_TYPE, 527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint32_t)(p - p_buff), p_buff); 528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SDP_SERVER_ENABLED == FALSE */ 531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddUuidSequence 538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a UUID sequence to a record. 540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This would be through the SDP database maintenance API. 541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the sequence already exists in the record, it is replaced 542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with the new sequence. 543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 544ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 545ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 546ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddUuidSequence(uint32_t handle, uint16_t attr_id, uint16_t num_uuids, 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_uuids) { 549d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t max_len = SDP_MAX_ATTR_LEN - 3; 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool result; 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buff = 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN * 2); 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_buff; 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, build the sequence */ 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_uuids; xx++, p_uuids++) { 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, *p_uuids); 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p - p_buff) > max_len) { 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_WARNING("SDP_AddUuidSequence - too long, add %d uuids of %d", 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx, num_uuids); 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = SDP_AddAttribute(handle, attr_id, DATA_ELE_SEQ_DESC_TYPE, 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint32_t)(p - p_buff), p_buff); 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SDP_SERVER_ENABLED == FALSE */ 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 581ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 582ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddProtocolList 583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a protocol descriptor list to 5859ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * a record. This would be through the SDP database 5869ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * maintenance API. If the protocol list already exists in the 5879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * record, it is replaced with the new list. 588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddProtocolList(uint32_t handle, uint16_t num_elem, 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_PROTOCOL_ELEM* p_elem_list) { 594d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int offset; 596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool result; 597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buff = 598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN * 2); 599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson offset = sdp_compose_proto_list(p_buff, num_elem, p_elem_list); 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = SDP_AddAttribute(handle, ATTR_ID_PROTOCOL_DESC_LIST, 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DATA_ELE_SEQ_DESC_TYPE, (uint32_t)offset, p_buff); 603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SDP_SERVER_ENABLED == FALSE */ 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddAdditionProtoLists 613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a protocol descriptor list to 6159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * a record. This would be through the SDP database maintenance 6169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * API. If the protocol list already exists in the record, it 6179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * is replaced with the new list. 618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddAdditionProtoLists(uint32_t handle, uint16_t num_elem, 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_PROTO_LIST_ELEM* p_proto_list) { 624d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_len; 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int offset; 629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool result; 630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buff = 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN * 2); 632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_buff; 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* for each ProtocolDescriptorList */ 636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_elem; xx++, p_proto_list++) { 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); 638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_len = p++; 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson offset = sdp_compose_proto_list(p, p_proto_list->num_elems, 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_proto_list->list_elem); 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p += offset; 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = (uint8_t)(p - p_len - 1); 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_AddAttribute(handle, ATTR_ID_ADDITION_PROTO_DESC_LISTS, 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DATA_ELE_SEQ_DESC_TYPE, (uint32_t)(p - p_buff), p_buff); 649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SDP_SERVER_ENABLED == FALSE */ 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddProfileDescriptorList 660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a profile descriptor list to 6629ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * a record. This would be through the SDP database maintenance 6639ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * API. If the version already exists in the record, it is 6649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * replaced with the new one. 665ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddProfileDescriptorList(uint32_t handle, uint16_t profile_uuid, 670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t version) { 671d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool result; 674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buff = (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN); 675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_buff + 2; 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, build the profile descriptor list. This consists of a data element 679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * sequence. */ 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* The sequence consists of profile's UUID and version number */ 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); 682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, profile_uuid); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, version); 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Add in type and length fields */ 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_buff = (uint8_t)((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); 689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *(p_buff + 1) = (uint8_t)(p - (p_buff + 2)); 690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = 692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_AddAttribute(handle, ATTR_ID_BT_PROFILE_DESC_LIST, 693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DATA_ELE_SEQ_DESC_TYPE, (uint32_t)(p - p_buff), p_buff); 694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SDP_SERVER_ENABLED == FALSE */ 698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 703ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 704ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddLanguageBaseAttrIDList 705ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a language base attr list to 7079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * a record. This would be through the SDP database maintenance 7089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * API. If the version already exists in the record, it is 7099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * replaced with the new one. 710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddLanguageBaseAttrIDList(uint32_t handle, uint16_t lang, 715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t char_enc, uint16_t base_id) { 716d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool result; 719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buff = (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN); 720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_buff; 722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, build the language base descriptor list. This consists of a data */ 724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* element sequence. The sequence consists of 9 bytes (3 UINt16 fields) */ 725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, lang); 727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, char_enc); 730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, base_id); 733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = 735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_AddAttribute(handle, ATTR_ID_LANGUAGE_BASE_ATTR_ID_LIST, 736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DATA_ELE_SEQ_DESC_TYPE, (uint32_t)(p - p_buff), p_buff); 737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SDP_SERVER_ENABLED == FALSE */ 740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_AddServiceClassIdList 747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to add a service list to a record. 749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This would be through the SDP database maintenance API. 7509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * If the service list already exists in the record, it is 7519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * replaced with the new list. 752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 753ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 754ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 755ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_AddServiceClassIdList(uint32_t handle, uint16_t num_services, 757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_service_uuids) { 758d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool result; 762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buff = 763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN * 2); 764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_buff; 766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_services; xx++, p_service_uuids++) { 768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p, *p_service_uuids); 770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_AddAttribute(handle, ATTR_ID_SERVICE_CLASS_ID_LIST, 774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DATA_ELE_SEQ_DESC_TYPE, (uint32_t)(p - p_buff), p_buff); 775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SDP_SERVER_ENABLED == FALSE */ 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 783ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_DeleteAttribute 785ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7869ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to delete an attribute from a 7879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * record. This would be through the SDP database maintenance 7889ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * API. 789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if deleted OK, else false if not found 791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SDP_DeleteAttribute(uint32_t handle, uint16_t attr_id) { 794d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx, yy; 796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_rec = &sdp_cb.server_db.record[0]; 797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* pad_ptr; 798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t len; /* Number of bytes in the entry */ 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the record in the database */ 801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++) { 802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->record_handle == handle) { 803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_ATTRIBUTE* p_attr = &p_rec->attribute[0]; 804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_API("Deleting attr_id 0x%04x for handle 0x%x", attr_id, handle); 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Found it. Now, find the attribute */ 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) { 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->id == attr_id) { 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pad_ptr = p_attr->value_ptr; 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = p_attr->len; 811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len) { 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < p_rec->num_attributes; yy++) { 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->attribute[yy].value_ptr > pad_ptr) 815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->attribute[yy].value_ptr -= len; 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Found it. Shift everything up one */ 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->num_attributes--; 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = xx; yy < p_rec->num_attributes; yy++, p_attr++) { 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_attr = *(p_attr + 1); 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* adjust attribute values if needed */ 827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len) { 828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx = 829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_rec->free_pad_ptr - ((pad_ptr + len) - &p_rec->attr_pad[0])); 830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < xx; yy++, pad_ptr++) *pad_ptr = *(pad_ptr + len); 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->free_pad_ptr -= len; 832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, not found */ 840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SDP_ReadRecord 846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to get the raw data of the record 848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with the given handle from the database. 849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns -1, if the record is not found. 851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Otherwise, the offset (0 or 1) to start of data in p_data. 852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The size of data copied into p_data is in *p_data_len. 854ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_RAW_DATA_INCLUDED == TRUE) 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonint32_t SDP_ReadRecord(uint32_t handle, uint8_t* p_data, int32_t* p_data_len) { 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t len = 0; /* Number of bytes in the entry */ 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t offset = -1; /* default to not found */ 860d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_SERVER_ENABLED == TRUE) 861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_rec; 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t start = 0; 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t end = 0xffff; 864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_ATTRIBUTE* p_attr; 865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t rem_len; 866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_rsp; 867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the record in the database */ 869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec = sdp_db_find_record(handle); 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec && p_data && p_data_len) { 871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rsp = &p_data[3]; 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_attr = sdp_db_find_attr_in_rec(p_rec, start, end)) != NULL) { 873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if attribute fits. Assume 3-byte value type/length */ 874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_len = *p_data_len - (uint16_t)(p_rsp - p_data); 875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->len > (uint32_t)(rem_len - 6)) break; 877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rsp = sdpu_build_attrib_entry(p_rsp, p_attr); 879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* next attr id */ 881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson start = p_attr->id + 1; 882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = (int32_t)(p_rsp - p_data); 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Put in the sequence header (2 or 3 bytes) */ 886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len > 255) { 887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson offset = 0; 888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data[0] = (uint8_t)((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); 889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data[1] = (uint8_t)((len - 3) >> 8); 890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data[2] = (uint8_t)(len - 3); 891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson offset = 1; 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data[1] = (uint8_t)((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); 895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data[2] = (uint8_t)(len - 3); 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len--; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_data_len = len; 900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, not found */ 903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (offset); 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 906