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