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
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.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#include "wbt_api.h"
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN find_uuid_in_seq (UINT8 *p , UINT32 seq_len, UINT8 *p_his_uuid,
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 UINT16 his_len, int nest_level);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_db_service_search
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches for a record that contains the
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  specified UIDs. It is passed either NULL to start at the
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  beginning, or the previous record found.
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record, or NULL if not found.
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_RECORD *sdp_db_service_search (tSDP_RECORD *p_rec, tSDP_UUID_SEQ *p_seq)
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy;
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_ATTRIBUTE *p_attr;
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records];
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If NULL, start at the beginning, else start at the first specified record */
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_rec)
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec = &sdp_cb.server_db.record[0];
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec++;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through the records. The spec says that a match occurs if */
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the record contains all the passed UUIDs in it.                */
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; p_rec < p_end; p_rec++)
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (yy = 0; yy < p_seq->num_uids; yy++)
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr = &p_rec->attribute[0];
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->type == UUID_DESC_TYPE)
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (sdpu_compare_uuid_arrays (p_attr->value_ptr, p_attr->len,
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  &p_seq->uuid_entry[yy].value[0],
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_seq->uuid_entry[yy].len))
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (p_attr->type == DATA_ELE_SEQ_DESC_TYPE)
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (find_uuid_in_seq (p_attr->value_ptr, p_attr->len,
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_seq->uuid_entry[yy].value[0],
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_seq->uuid_entry[yy].len, 0))
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If any UUID was not found,  on to the next record */
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (xx == p_rec->num_attributes)
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If every UUID was found in the record, return the record */
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (yy == p_seq->num_uids)
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_rec);
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, no more records found */
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         find_uuid_in_seq
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches a data element sequenct for a UUID.
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if found, else FALSE
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN find_uuid_in_seq (UINT8 *p , UINT32 seq_len, UINT8 *p_uuid,
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 UINT16 uuid_len, int nest_level)
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_end = p + seq_len;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   type;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  len;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* A little safety check to avoid excessive recursion */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (nest_level > 3)
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p < p_end)
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = *p++;
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = sdpu_get_len_from_type (p, type, &len);
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = type >> 3;
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (type == UUID_DESC_TYPE)
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sdpu_compare_uuid_arrays (p, len, p_uuid, uuid_len))
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (TRUE);
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (type == DATA_ELE_SEQ_DESC_TYPE)
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (find_uuid_in_seq (p, len, p_uuid, uuid_len, nest_level + 1))
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (TRUE);
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p + len;
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, failed to match */
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_db_find_record
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches for a record with a specific handle
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is passed the handle of the record.
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record, or NULL if not found.
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_RECORD *sdp_db_find_record (UINT32 handle)
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec;
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records];
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through the records for the caller's handle */
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (p_rec = &sdp_cb.server_db.record[0]; p_rec < p_end; p_rec++)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rec->record_handle == handle)
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_rec);
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Record with that handle not found. */
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_db_find_attr_in_rec
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches a record for specific attributes.
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is passed a pointer to the record. If the record contains
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the specified attribute, (the caller may specify be a range
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  of attributes), the attribute is returned.
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the attribute, or NULL if not found.
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_ATTRIBUTE *sdp_db_find_attr_in_rec (tSDP_RECORD *p_rec, UINT16 start_attr,
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         UINT16 end_attr)
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_ATTRIBUTE  *p_at;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Note that the attributes in a record are assumed to be in sorted order */
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0, p_at = &p_rec->attribute[0]; xx < p_rec->num_attributes;
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         xx++, p_at++)
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_at->id >= start_attr) && (p_at->id <= end_attr))
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_at);
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* No matching attribute found */
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_compose_proto_list
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to compose a data sequence from
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  protocol element list struct pointer
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the length of the data sequence
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int sdp_compose_proto_list( UINT8 *p, UINT16 num_elem,
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  tSDP_PROTOCOL_ELEM *p_elem_list)
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy, len;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN            is_rfcomm_scn;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_head = p;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            *p_len;
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the protocol list. This consists of a set of data element
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** sequences, one for each layer. Each layer sequence consists of layer's
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** UUID and optional parameters
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_elem; xx++, p_elem_list++)
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = 3 + (p_elem_list->num_params * 3);
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_len = p;
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = (UINT8) len;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_elem_list->protocol_uuid);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_elem_list->protocol_uuid == UUID_PROTOCOL_RFCOMM)
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_rfcomm_scn = TRUE;
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_rfcomm_scn = FALSE;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (yy = 0; yy < p_elem_list->num_params; yy++)
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_rfcomm_scn)
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE);
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT8_TO_BE_STREAM (p, p_elem_list->params[yy]);
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p_len -= 1;
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT16_TO_BE_STREAM (p, p_elem_list->params[yy]);
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p - p_head);
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* SDP_SERVER_ENABLED == TRUE */
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_CreateRecord
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to create a record in the database.
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API. The
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  record is created empty, teh application should then call
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  "add_attribute" to add the record's attributes.
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Record handle if OK, else 0.
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 SDP_CreateRecord (void)
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32    handle;
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8     buf[4];
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DB  *p_db = &sdp_cb.server_db;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, check if there is a free record */
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_db->num_records < SDP_MAX_RECORDS)
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (&p_db->record[p_db->num_records], 0,
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sizeof (tSDP_RECORD));
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We will use a handle of the first unreserved handle plus last record
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** number + 1 */
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_db->num_records)
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle = p_db->record[p_db->num_records - 1].record_handle + 1;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle = 0x10000;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->record[p_db->num_records].record_handle = handle;
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->num_records++;
303a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_DEBUG("SDP_CreateRecord ok, num_records:%d", p_db->num_records);
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Add the first attribute (the handle) automatically */
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT32_TO_BE_FIELD (buf, handle);
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SDP_AddAttribute (handle, ATTR_ID_SERVICE_RECORD_HDL, UINT_DESC_TYPE,
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          4, buf);
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p_db->record[p_db->num_records - 1].record_handle);
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
311a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    else SDP_TRACE_ERROR("SDP_CreateRecord fail, exceed maximum records:%d", SDP_MAX_RECORDS);
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (0);
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_DeleteRecord
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a record (or all records)
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the database. This would be through the SDP database
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  maintenance API.
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If a record handle of 0 is passed, all records are deleted.
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if succeeded, else FALSE
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_DeleteRecord (UINT32 handle)
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy, zz;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec = &sdp_cb.server_db.record[0];
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (handle == 0 || sdp_cb.server_db.num_records == 0)
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete all records in the database */
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_cb.server_db.num_records = 0;
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* require new DI record to be created in SDP_SetLocalDiRecord */
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_cb.server_db.di_primary_handle = 0;
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_cb.server_db.brcm_di_registered = 0;
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Find the record in the database */
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++)
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rec->record_handle == handle)
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Found it. Shift everything up one */
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                for (yy = xx; yy < sdp_cb.server_db.num_records; yy++, p_rec++)
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p_rec = *(p_rec + 1);
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Adjust the attribute value pointer for each attribute */
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (zz = 0; zz < p_rec->num_attributes; zz++)
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_rec->attribute[zz].value_ptr -= sizeof(tSDP_RECORD);
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_cb.server_db.num_records--;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
366a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_DEBUG("SDP_DeleteRecord ok, num_records:%d", sdp_cb.server_db.num_records);
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we're deleting the primary DI record, clear the */
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* value in the control block */
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if( sdp_cb.server_db.di_primary_handle == handle )
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    sdp_cb.server_db.di_primary_handle = 0;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    sdp_cb.server_db.brcm_di_registered = 0;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (TRUE);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddAttribute
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add an attribute to a record.
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the attribute already exists in the record, it is replaced
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new value.
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             Attribute values must be passed as a Big Endian stream.
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddAttribute (UINT32 handle, UINT16 attr_id, UINT8 attr_type,
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          UINT32 attr_len, UINT8 *p_val)
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy, zz;
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec = &sdp_cb.server_db.record[0];
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((attr_type == UINT_DESC_TYPE) ||
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == TWO_COMP_INT_DESC_TYPE) ||
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == UUID_DESC_TYPE) ||
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == DATA_ELE_SEQ_DESC_TYPE) ||
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == DATA_ELE_ALT_DESC_TYPE))
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8 num_array[400];
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32 i;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32 len = (attr_len > 200) ? 200 : attr_len;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_array[0] ='\0';
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < len; i++)
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sprintf((char *)&num_array[i*2],"%02X",(UINT8)(p_val[i]));
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
423a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            handle,attr_id,attr_type,attr_len,p_val,num_array);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (attr_type == BOOLEAN_DESC_TYPE)
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
428a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%d",
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             handle,attr_id,attr_type,attr_len,p_val,*p_val);
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
433a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                handle,attr_id,attr_type,attr_len,p_val,p_val);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the record in the database */
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (zz = 0; zz < sdp_cb.server_db.num_records; zz++, p_rec++)
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rec->record_handle == handle)
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tSDP_ATTRIBUTE  *p_attr = &p_rec->attribute[0];
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Found the record. Now, see if the attribute already exists */
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* The attribute exists. replace it */
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->id == attr_id)
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    SDP_DeleteAttribute (handle, attr_id);
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->id > attr_id)
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rec->num_attributes == SDP_MAX_REC_ATTR)
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (FALSE);
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If not found, see if we can allocate a new entry */
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (xx == p_rec->num_attributes)
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr = &p_rec->attribute[p_rec->num_attributes];
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Since the attributes are kept in sorted order, insert ours here */
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                for (yy = p_rec->num_attributes; yy > xx; yy--)
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->attribute[yy] = p_rec->attribute[yy - 1];
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->id   = attr_id;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->type = attr_type;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->len  = attr_len;
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rec->free_pad_ptr + attr_len >= SDP_MAX_PAD_LEN)
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* do truncate only for text string type descriptor */
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (attr_type == TEXT_STR_DESC_TYPE)
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
481a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                    SDP_TRACE_WARNING("SDP_AddAttribute: attr_len:%d too long. truncate to (%d)",
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        attr_len, SDP_MAX_PAD_LEN - p_rec->free_pad_ptr );
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    attr_len = SDP_MAX_PAD_LEN - p_rec->free_pad_ptr;
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr] = '\0';
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr+1] = '\0';
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    attr_len = 0;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((attr_len > 0) && (p_val != 0))
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr->len  = attr_len;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (&p_rec->attr_pad[p_rec->free_pad_ptr], p_val, (size_t)attr_len);
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr->value_ptr = &p_rec->attr_pad[p_rec->free_pad_ptr];
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->free_pad_ptr += attr_len;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if ((attr_len == 0 && p_attr->len != 0) || /* if truncate to 0 length, simply don't add */
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_val == 0)
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
502a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_ERROR("SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ",
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    attr_id, attr_len );
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr->id   = p_attr->type = p_attr->len  = 0;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (FALSE);
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rec->num_attributes++;
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*** Mark DI record as used by Broadcom ***/
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (handle == sdp_cb.server_db.di_primary_handle &&
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                attr_id == ATTR_ID_EXT_BRCM_VERSION)
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_cb.server_db.brcm_di_registered = TRUE;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (TRUE);
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddSequence
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a sequence to a record.
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the sequence already exists in the record, it is replaced
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new sequence.
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             Element values must be passed as a Big Endian stream.
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddSequence (UINT32 handle,  UINT16 attr_id, UINT16 num_elem,
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         UINT8 type[], UINT8 len[], UINT8 *p_val[])
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
541ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_head;
544ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
547ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
548a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddSequence cannot get a buffer!");
549ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the sequence */
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_elem; xx++)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_head = p;
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (len[xx])
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 1:
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, (type[xx] << 3) | SIZE_ONE_BYTE);
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 2:
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_TWO_BYTES);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 4:
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_FOUR_BYTES);
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 8:
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_EIGHT_BYTES);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 16:
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_SIXTEEN_BYTES);
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, (type[xx] << 3) | SIZE_IN_NEXT_BYTE);
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, len[xx]);
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_BE_STREAM (p, p_val[xx], len[xx]);
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p - p_buff > SDP_MAX_ATTR_LEN)
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* go back to before we add this element */
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = p_head;
586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if(p_head == p_buff)
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* the first element exceed the max length */
589a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_ERROR ("SDP_AddSequence - too long(attribute is not added)!!");
590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                GKI_freebuf(p_buff);
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return FALSE;
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
594a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_ERROR ("SDP_AddSequence - too long, add %d elements of %d", xx, num_elem);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE,(UINT32) (p - p_buff), p_buff);
599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_buff);
600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddUuidSequence
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a UUID sequence to a record.
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the sequence already exists in the record, it is replaced
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new sequence.
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddUuidSequence (UINT32 handle,  UINT16 attr_id, UINT16 num_uuids,
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             UINT16 *p_uuids)
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32           max_len = SDP_MAX_ATTR_LEN -3;
627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
631a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddUuidSequence cannot get a buffer!");
632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the sequence */
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_uuids ; xx++, p_uuids++)
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, *p_uuids);
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if((p - p_buff) > max_len)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
644a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING ("SDP_AddUuidSequence - too long, add %d uuids of %d", xx, num_uuids);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
649ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE,(UINT32) (p - p_buff), p_buff);
650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_buff);
651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddProtocolList
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a protocol descriptor list to
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the protocol list already exists in the record, it is replaced
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new list.
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddProtocolList (UINT32 handle, UINT16 num_elem,
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             tSDP_PROTOCOL_ELEM *p_elem_list)
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    int             offset;
675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
678ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
679a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddProtocolList cannot get a buffer!");
680ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
681ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
683ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    offset = sdp_compose_proto_list(p_buff, num_elem, p_elem_list);
684ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_PROTOCOL_DESC_LIST,DATA_ELE_SEQ_DESC_TYPE, (UINT32) offset, p_buff);
685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_buff);
686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddAdditionProtoLists
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a protocol descriptor list to
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the protocol list already exists in the record, it is replaced
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new list.
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddAdditionProtoLists (UINT32 handle, UINT16 num_elem,
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   tSDP_PROTO_LIST_ELEM *p_proto_list)
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
710ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
712ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_len;
713ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    int             offset;
714ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
715ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
716ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
717ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
718a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddAdditionProtoLists cannot get a buffer!");
719ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
721ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for each ProtocolDescriptorList */
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_elem; xx++, p_proto_list++)
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_len = p++;
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        offset = sdp_compose_proto_list(p, p_proto_list->num_elems,
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_proto_list->list_elem);
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += offset;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len  = (UINT8)(p - p_len - 1);
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
735ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_ADDITION_PROTO_DESC_LISTS,DATA_ELE_SEQ_DESC_TYPE,
736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta	                           (UINT32) (p - p_buff), p_buff);
737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_buff);
738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddProfileDescriptorList
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a profile descriptor list to
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the version already exists in the record, it is replaced
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new one.
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddProfileDescriptorList (UINT32 handle, UINT16 profile_uuid,
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      UINT16 version)
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta     BOOLEAN        result;
764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
765ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
766ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
767a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddProfileDescriptorList cannot get a buffer!");
768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff+2;
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the profile descriptor list. This consists of a data element sequence. */
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The sequence consists of profile's UUID and version number  */
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, profile_uuid);
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, version);
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Add in type and length fields */
781ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    *p_buff = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    *(p_buff+1) = (UINT8) (p - (p_buff+2));
783ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
784ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_BT_PROFILE_DESC_LIST,DATA_ELE_SEQ_DESC_TYPE, (UINT32) (p - p_buff), p_buff);
785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_buff);
786ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddLanguageBaseAttrIDList
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a language base attr list to
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the version already exists in the record, it is replaced
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new one.
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddLanguageBaseAttrIDList (UINT32 handle, UINT16 lang,
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT16 char_enc, UINT16 base_id)
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
816a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddLanguageBaseAttrIDList cannot get a buffer!");
817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the language base descriptor list. This consists of a data */
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* element sequence. The sequence consists of 9 bytes (3 UINt16 fields)    */
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, lang);
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, char_enc);
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, base_id);
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
832ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_LANGUAGE_BASE_ATTR_ID_LIST,DATA_ELE_SEQ_DESC_TYPE,
833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta	                           (UINT32) (p - p_buff), p_buff);
834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_buff);
835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddServiceClassIdList
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a service list to a record.
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the service list already exists in the record, it is replaced
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new list.
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddServiceClassIdList (UINT32 handle, UINT16 num_services,
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   UINT16 *p_service_uuids)
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
860ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
861ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
862ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
863ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
864ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
865a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddServiceClassIdList cannot get a buffer!");
866ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
867ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
868ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_services; xx++, p_service_uuids++)
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, *p_service_uuids);
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
876ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_SERVICE_CLASS_ID_LIST,DATA_ELE_SEQ_DESC_TYPE,
877ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta	                           (UINT32) (p - p_buff), p_buff);
878ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_buff);
879ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_DeleteAttribute
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to delete an attribute from a record.
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if deleted OK, else FALSE if not found
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_DeleteAttribute (UINT32 handle, UINT16 attr_id)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy;
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec = &sdp_cb.server_db.record[0];
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *pad_ptr;
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  len;                        /* Number of bytes in the entry */
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the record in the database */
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++)
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rec->record_handle == handle)
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tSDP_ATTRIBUTE  *p_attr = &p_rec->attribute[0];
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
911a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_API("Deleting attr_id 0x%04x for handle 0x%x", attr_id, handle);
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Found it. Now, find the attribute */
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->id == attr_id)
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pad_ptr = p_attr->value_ptr;
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len = p_attr->len;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (len)
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        for (yy = 0; yy < p_rec->num_attributes; yy++)
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            if( p_rec->attribute[yy].value_ptr > pad_ptr )
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                p_rec->attribute[yy].value_ptr -= len;
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Found it. Shift everything up one */
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->num_attributes--;
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (yy = xx; yy < p_rec->num_attributes; yy++, p_attr++)
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        *p_attr = *(p_attr + 1);
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* adjust attribute values if needed */
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (len)
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        xx = (p_rec->free_pad_ptr - ((pad_ptr+len) -
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  &p_rec->attr_pad[0]));
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        for( yy=0; yy<xx; yy++, pad_ptr++)
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            *pad_ptr = *(pad_ptr+len);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_rec->free_pad_ptr -= len;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return (TRUE);
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_ReadRecord
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to get the raw data of the record
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the given handle from the database.
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          -1, if the record is not found.
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Otherwise, the offset (0 or 1) to start of data in p_data.
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The size of data copied into p_data is in *p_data_len.
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_RAW_DATA_INCLUDED == TRUE)
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectINT32 SDP_ReadRecord(UINT32 handle, UINT8 *p_data, INT32 *p_data_len)
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32           len = 0;                        /* Number of bytes in the entry */
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32           offset = -1; /* default to not found */
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec;
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          start = 0;
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          end = 0xffff;
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_ATTRIBUTE  *p_attr;
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          rem_len;
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_rsp;
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the record in the database */
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rec = sdp_db_find_record(handle);
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_rec && p_data && p_data_len)
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rsp = &p_data[3];
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while ( (p_attr = sdp_db_find_attr_in_rec (p_rec, start, end)) != NULL)
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check if attribute fits. Assume 3-byte value type/length */
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_len = *p_data_len - (UINT16) (p_rsp - p_data);
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_attr->len > (UINT32)(rem_len - 6))
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rsp = sdpu_build_attrib_entry (p_rsp, p_attr);
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* next attr id */
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            start = p_attr->id + 1;
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = (INT32) (p_rsp - p_data);
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Put in the sequence header (2 or 3 bytes) */
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len > 255)
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            offset = 0;
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[0] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD);
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[1] = (UINT8) ((len - 3) >> 8);
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[2] = (UINT8) (len - 3);
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            offset = 1;
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[1] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[2] = (UINT8) (len - 3);
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len--;
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_data_len = len;
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (offset);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1029