sdp_db.cc revision 258c2538e3b62a8cdb403f2730c45d721e5292b4
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
31258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.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
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The 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            */
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN find_uuid_in_seq (UINT8 *p , UINT32 seq_len, UINT8 *p_his_uuid,
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 UINT16 his_len, int nest_level);
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_db_service_search
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches for a record that contains the
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  specified UIDs. It is passed either NULL to start at the
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  beginning, or the previous record found.
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record, or NULL if not found.
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_RECORD *sdp_db_service_search (tSDP_RECORD *p_rec, tSDP_UUID_SEQ *p_seq)
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy;
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_ATTRIBUTE *p_attr;
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records];
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If NULL, start at the beginning, else start at the first specified record */
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_rec)
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec = &sdp_cb.server_db.record[0];
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec++;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through the records. The spec says that a match occurs if */
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the record contains all the passed UUIDs in it.                */
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; p_rec < p_end; p_rec++)
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (yy = 0; yy < p_seq->num_uids; yy++)
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr = &p_rec->attribute[0];
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->type == UUID_DESC_TYPE)
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (sdpu_compare_uuid_arrays (p_attr->value_ptr, p_attr->len,
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  &p_seq->uuid_entry[yy].value[0],
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_seq->uuid_entry[yy].len))
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (p_attr->type == DATA_ELE_SEQ_DESC_TYPE)
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (find_uuid_in_seq (p_attr->value_ptr, p_attr->len,
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_seq->uuid_entry[yy].value[0],
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_seq->uuid_entry[yy].len, 0))
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If any UUID was not found,  on to the next record */
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (xx == p_rec->num_attributes)
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If every UUID was found in the record, return the record */
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (yy == p_seq->num_uids)
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_rec);
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, no more records found */
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         find_uuid_in_seq
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches a data element sequenct for a UUID.
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if found, else FALSE
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN find_uuid_in_seq (UINT8 *p , UINT32 seq_len, UINT8 *p_uuid,
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 UINT16 uuid_len, int nest_level)
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_end = p + seq_len;
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   type;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  len;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* A little safety check to avoid excessive recursion */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (nest_level > 3)
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p < p_end)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = *p++;
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = sdpu_get_len_from_type (p, type, &len);
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = type >> 3;
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (type == UUID_DESC_TYPE)
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sdpu_compare_uuid_arrays (p, len, p_uuid, uuid_len))
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (TRUE);
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (type == DATA_ELE_SEQ_DESC_TYPE)
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (find_uuid_in_seq (p, len, p_uuid, uuid_len, nest_level + 1))
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (TRUE);
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p + len;
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, failed to match */
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_db_find_record
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches for a record with a specific handle
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is passed the handle of the record.
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record, or NULL if not found.
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_RECORD *sdp_db_find_record (UINT32 handle)
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec;
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records];
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through the records for the caller's handle */
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (p_rec = &sdp_cb.server_db.record[0]; p_rec < p_end; p_rec++)
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rec->record_handle == handle)
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_rec);
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Record with that handle not found. */
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_db_find_attr_in_rec
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches a record for specific attributes.
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is passed a pointer to the record. If the record contains
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the specified attribute, (the caller may specify be a range
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  of attributes), the attribute is returned.
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the attribute, or NULL if not found.
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_ATTRIBUTE *sdp_db_find_attr_in_rec (tSDP_RECORD *p_rec, UINT16 start_attr,
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         UINT16 end_attr)
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_ATTRIBUTE  *p_at;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Note that the attributes in a record are assumed to be in sorted order */
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0, p_at = &p_rec->attribute[0]; xx < p_rec->num_attributes;
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         xx++, p_at++)
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_at->id >= start_attr) && (p_at->id <= end_attr))
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_at);
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* No matching attribute found */
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
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** Function         sdp_compose_proto_list
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to compose a data sequence from
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  protocol element list struct pointer
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the length of the data sequence
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int sdp_compose_proto_list( UINT8 *p, UINT16 num_elem,
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  tSDP_PROTOCOL_ELEM *p_elem_list)
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy, len;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN            is_rfcomm_scn;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_head = p;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            *p_len;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the protocol list. This consists of a set of data element
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** sequences, one for each layer. Each layer sequence consists of layer's
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** UUID and optional parameters
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_elem; xx++, p_elem_list++)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = 3 + (p_elem_list->num_params * 3);
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_len = p;
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = (UINT8) len;
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_elem_list->protocol_uuid);
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_elem_list->protocol_uuid == UUID_PROTOCOL_RFCOMM)
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_rfcomm_scn = TRUE;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_rfcomm_scn = FALSE;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (yy = 0; yy < p_elem_list->num_params; yy++)
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_rfcomm_scn)
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE);
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT8_TO_BE_STREAM (p, p_elem_list->params[yy]);
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p_len -= 1;
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT16_TO_BE_STREAM (p, p_elem_list->params[yy]);
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p - p_head);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* SDP_SERVER_ENABLED == TRUE */
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_CreateRecord
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to create a record in the database.
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API. The
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  record is created empty, teh application should then call
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  "add_attribute" to add the record's attributes.
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Record handle if OK, else 0.
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 SDP_CreateRecord (void)
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32    handle;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8     buf[4];
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DB  *p_db = &sdp_cb.server_db;
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, check if there is a free record */
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_db->num_records < SDP_MAX_RECORDS)
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (&p_db->record[p_db->num_records], 0,
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sizeof (tSDP_RECORD));
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We will use a handle of the first unreserved handle plus last record
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** number + 1 */
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_db->num_records)
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle = p_db->record[p_db->num_records - 1].record_handle + 1;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle = 0x10000;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->record[p_db->num_records].record_handle = handle;
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->num_records++;
302a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_DEBUG("SDP_CreateRecord ok, num_records:%d", p_db->num_records);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Add the first attribute (the handle) automatically */
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT32_TO_BE_FIELD (buf, handle);
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SDP_AddAttribute (handle, ATTR_ID_SERVICE_RECORD_HDL, UINT_DESC_TYPE,
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          4, buf);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p_db->record[p_db->num_records - 1].record_handle);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
310a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    else SDP_TRACE_ERROR("SDP_CreateRecord fail, exceed maximum records:%d", SDP_MAX_RECORDS);
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (0);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
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** Function         SDP_DeleteRecord
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a record (or all records)
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the database. This would be through the SDP database
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  maintenance API.
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If a record handle of 0 is passed, all records are deleted.
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if succeeded, else FALSE
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_DeleteRecord (UINT32 handle)
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy, zz;
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec = &sdp_cb.server_db.record[0];
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (handle == 0 || sdp_cb.server_db.num_records == 0)
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete all records in the database */
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_cb.server_db.num_records = 0;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* require new DI record to be created in SDP_SetLocalDiRecord */
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_cb.server_db.di_primary_handle = 0;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Find the record in the database */
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++)
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rec->record_handle == handle)
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Found it. Shift everything up one */
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                for (yy = xx; yy < sdp_cb.server_db.num_records; yy++, p_rec++)
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p_rec = *(p_rec + 1);
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Adjust the attribute value pointer for each attribute */
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (zz = 0; zz < p_rec->num_attributes; zz++)
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_rec->attribute[zz].value_ptr -= sizeof(tSDP_RECORD);
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_cb.server_db.num_records--;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
364a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_DEBUG("SDP_DeleteRecord ok, num_records:%d", sdp_cb.server_db.num_records);
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we're deleting the primary DI record, clear the */
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* value in the control block */
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if( sdp_cb.server_db.di_primary_handle == handle )
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    sdp_cb.server_db.di_primary_handle = 0;
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (TRUE);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddAttribute
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add an attribute to a record.
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the attribute already exists in the record, it is replaced
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new value.
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             Attribute values must be passed as a Big Endian stream.
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddAttribute (UINT32 handle, UINT16 attr_id, UINT8 attr_type,
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          UINT32 attr_len, UINT8 *p_val)
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy, zz;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec = &sdp_cb.server_db.record[0];
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((attr_type == UINT_DESC_TYPE) ||
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == TWO_COMP_INT_DESC_TYPE) ||
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == UUID_DESC_TYPE) ||
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == DATA_ELE_SEQ_DESC_TYPE) ||
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (attr_type == DATA_ELE_ALT_DESC_TYPE))
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8 num_array[400];
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32 i;
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32 len = (attr_len > 200) ? 200 : attr_len;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_array[0] ='\0';
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < len; i++)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sprintf((char *)&num_array[i*2],"%02X",(UINT8)(p_val[i]));
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
420a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            handle,attr_id,attr_type,attr_len,p_val,num_array);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (attr_type == BOOLEAN_DESC_TYPE)
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
425a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%d",
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             handle,attr_id,attr_type,attr_len,p_val,*p_val);
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
430a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                handle,attr_id,attr_type,attr_len,p_val,p_val);
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the record in the database */
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (zz = 0; zz < sdp_cb.server_db.num_records; zz++, p_rec++)
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rec->record_handle == handle)
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tSDP_ATTRIBUTE  *p_attr = &p_rec->attribute[0];
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Found the record. Now, see if the attribute already exists */
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* The attribute exists. replace it */
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->id == attr_id)
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    SDP_DeleteAttribute (handle, attr_id);
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->id > attr_id)
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rec->num_attributes == SDP_MAX_REC_ATTR)
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (FALSE);
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If not found, see if we can allocate a new entry */
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (xx == p_rec->num_attributes)
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr = &p_rec->attribute[p_rec->num_attributes];
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Since the attributes are kept in sorted order, insert ours here */
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                for (yy = p_rec->num_attributes; yy > xx; yy--)
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->attribute[yy] = p_rec->attribute[yy - 1];
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->id   = attr_id;
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->type = attr_type;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->len  = attr_len;
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rec->free_pad_ptr + attr_len >= SDP_MAX_PAD_LEN)
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* do truncate only for text string type descriptor */
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (attr_type == TEXT_STR_DESC_TYPE)
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
478a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                    SDP_TRACE_WARNING("SDP_AddAttribute: attr_len:%d too long. truncate to (%d)",
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        attr_len, SDP_MAX_PAD_LEN - p_rec->free_pad_ptr );
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    attr_len = SDP_MAX_PAD_LEN - p_rec->free_pad_ptr;
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr] = '\0';
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr+1] = '\0';
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    attr_len = 0;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((attr_len > 0) && (p_val != 0))
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr->len  = attr_len;
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (&p_rec->attr_pad[p_rec->free_pad_ptr], p_val, (size_t)attr_len);
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr->value_ptr = &p_rec->attr_pad[p_rec->free_pad_ptr];
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->free_pad_ptr += attr_len;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if ((attr_len == 0 && p_attr->len != 0) || /* if truncate to 0 length, simply don't add */
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_val == 0)
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
499a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_ERROR("SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ",
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    attr_id, attr_len );
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr->id   = p_attr->type = p_attr->len  = 0;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (FALSE);
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rec->num_attributes++;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (TRUE);
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddSequence
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a sequence to a record.
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the sequence already exists in the record, it is replaced
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new sequence.
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             Element values must be passed as a Big Endian stream.
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddSequence (UINT32 handle,  UINT16 attr_id, UINT16 num_elem,
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         UINT8 type[], UINT8 len[], UINT8 *p_val[])
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
532ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_head;
535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
537258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    if ((p_buff = (UINT8 *) osi_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
538ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
539a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddSequence cannot get a buffer!");
540ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
541ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
542ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the sequence */
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_elem; xx++)
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_head = p;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (len[xx])
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 1:
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, (type[xx] << 3) | SIZE_ONE_BYTE);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 2:
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_TWO_BYTES);
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 4:
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_FOUR_BYTES);
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 8:
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_EIGHT_BYTES);
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 16:
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p, (type[xx] << 3) | SIZE_SIXTEEN_BYTES);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, (type[xx] << 3) | SIZE_IN_NEXT_BYTE);
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, len[xx]);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_BE_STREAM (p, p_val[xx], len[xx]);
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p - p_buff > SDP_MAX_ATTR_LEN)
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* go back to before we add this element */
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = p_head;
577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if(p_head == p_buff)
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* the first element exceed the max length */
580a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_ERROR ("SDP_AddSequence - too long(attribute is not added)!!");
581258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov                osi_freebuf(p_buff);
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return FALSE;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
585a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_ERROR ("SDP_AddSequence - too long, add %d elements of %d", xx, num_elem);
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE,(UINT32) (p - p_buff), p_buff);
590258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    osi_freebuf(p_buff);
591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddUuidSequence
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a UUID sequence to a record.
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the sequence already exists in the record, it is replaced
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new sequence.
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddUuidSequence (UINT32 handle,  UINT16 attr_id, UINT16 num_uuids,
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             UINT16 *p_uuids)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32           max_len = SDP_MAX_ATTR_LEN -3;
618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
620258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    if ((p_buff = (UINT8 *) osi_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
622a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddUuidSequence cannot get a buffer!");
623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the sequence */
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_uuids ; xx++, p_uuids++)
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, *p_uuids);
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if((p - p_buff) > max_len)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
635a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING ("SDP_AddUuidSequence - too long, add %d uuids of %d", xx, num_uuids);
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE,(UINT32) (p - p_buff), p_buff);
641258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    osi_freebuf(p_buff);
642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddProtocolList
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a protocol descriptor list to
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the protocol list already exists in the record, it is replaced
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new list.
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddProtocolList (UINT32 handle, UINT16 num_elem,
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             tSDP_PROTOCOL_ELEM *p_elem_list)
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    int             offset;
666ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
668258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    if ((p_buff = (UINT8 *) osi_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
669ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
670a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddProtocolList cannot get a buffer!");
671ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
672ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    offset = sdp_compose_proto_list(p_buff, num_elem, p_elem_list);
675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_PROTOCOL_DESC_LIST,DATA_ELE_SEQ_DESC_TYPE, (UINT32) offset, p_buff);
676258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    osi_freebuf(p_buff);
677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddAdditionProtoLists
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a protocol descriptor list to
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the protocol list already exists in the record, it is replaced
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new list.
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddAdditionProtoLists (UINT32 handle, UINT16 num_elem,
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   tSDP_PROTO_LIST_ELEM *p_proto_list)
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
703ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_len;
704ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    int             offset;
705ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
707258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    if ((p_buff = (UINT8 *) osi_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
709a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddAdditionProtoLists cannot get a buffer!");
710ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
712ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for each ProtocolDescriptorList */
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_elem; xx++, p_proto_list++)
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_len = p++;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        offset = sdp_compose_proto_list(p, p_proto_list->num_elems,
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_proto_list->list_elem);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += offset;
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len  = (UINT8)(p - p_len - 1);
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_ADDITION_PROTO_DESC_LISTS,DATA_ELE_SEQ_DESC_TYPE,
727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta	                           (UINT32) (p - p_buff), p_buff);
728258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    osi_freebuf(p_buff);
729ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddProfileDescriptorList
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a profile descriptor list to
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the version already exists in the record, it is replaced
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new one.
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddProfileDescriptorList (UINT32 handle, UINT16 profile_uuid,
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      UINT16 version)
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
754ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta     BOOLEAN        result;
755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
756258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    if ((p_buff = (UINT8 *) osi_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
758a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddProfileDescriptorList cannot get a buffer!");
759ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
760ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff+2;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the profile descriptor list. This consists of a data element sequence. */
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The sequence consists of profile's UUID and version number  */
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, profile_uuid);
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, version);
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Add in type and length fields */
772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    *p_buff = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    *(p_buff+1) = (UINT8) (p - (p_buff+2));
774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
775ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_BT_PROFILE_DESC_LIST,DATA_ELE_SEQ_DESC_TYPE, (UINT32) (p - p_buff), p_buff);
776258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    osi_freebuf(p_buff);
777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddLanguageBaseAttrIDList
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a language base attr list to
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a record. This would be through the SDP database maintenance API.
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the version already exists in the record, it is replaced
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new one.
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddLanguageBaseAttrIDList (UINT32 handle, UINT16 lang,
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT16 char_enc, UINT16 base_id)
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
805258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    if ((p_buff = (UINT8 *) osi_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
807a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddLanguageBaseAttrIDList cannot get a buffer!");
808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, build the language base descriptor list. This consists of a data */
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* element sequence. The sequence consists of 9 bytes (3 UINt16 fields)    */
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, lang);
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, char_enc);
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, base_id);
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_LANGUAGE_BASE_ATTR_ID_LIST,DATA_ELE_SEQ_DESC_TYPE,
824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta	                           (UINT32) (p - p_buff), p_buff);
825258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    osi_freebuf(p_buff);
826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_AddServiceClassIdList
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a service list to a record.
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the service list already exists in the record, it is replaced
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the new list.
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_AddServiceClassIdList (UINT32 handle, UINT16 num_services,
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   UINT16 *p_service_uuids)
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
850ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p_buff;
851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           *p;
852ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         result;
853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
854258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    if ((p_buff = (UINT8 *) osi_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
855ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
856a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("SDP_AddServiceClassIdList cannot get a buffer!");
857ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
858ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p = p_buff;
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_services; xx++, p_service_uuids++)
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, *p_service_uuids);
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
867ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result = SDP_AddAttribute (handle, ATTR_ID_SERVICE_CLASS_ID_LIST,DATA_ELE_SEQ_DESC_TYPE,
868ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta	                           (UINT32) (p - p_buff), p_buff);
869258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov    osi_freebuf(p_buff);
870ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return result;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* SDP_SERVER_ENABLED == FALSE */
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_DeleteAttribute
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to delete an attribute from a record.
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This would be through the SDP database maintenance API.
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if deleted OK, else FALSE if not found
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SDP_DeleteAttribute (UINT32 handle, UINT16 attr_id)
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx, yy;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec = &sdp_cb.server_db.record[0];
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *pad_ptr;
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  len;                        /* Number of bytes in the entry */
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the record in the database */
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rec->record_handle == handle)
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tSDP_ATTRIBUTE  *p_attr = &p_rec->attribute[0];
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
902a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_API("Deleting attr_id 0x%04x for handle 0x%x", attr_id, handle);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Found it. Now, find the attribute */
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_attr->id == attr_id)
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pad_ptr = p_attr->value_ptr;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len = p_attr->len;
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (len)
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        for (yy = 0; yy < p_rec->num_attributes; yy++)
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            if( p_rec->attribute[yy].value_ptr > pad_ptr )
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                p_rec->attribute[yy].value_ptr -= len;
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Found it. Shift everything up one */
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->num_attributes--;
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (yy = xx; yy < p_rec->num_attributes; yy++, p_attr++)
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        *p_attr = *(p_attr + 1);
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* adjust attribute values if needed */
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (len)
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        xx = (p_rec->free_pad_ptr - ((pad_ptr+len) -
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  &p_rec->attr_pad[0]));
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        for( yy=0; yy<xx; yy++, pad_ptr++)
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            *pad_ptr = *(pad_ptr+len);
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_rec->free_pad_ptr -= len;
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return (TRUE);
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SDP_ReadRecord
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to get the raw data of the record
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with the given handle from the database.
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          -1, if the record is not found.
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Otherwise, the offset (0 or 1) to start of data in p_data.
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The size of data copied into p_data is in *p_data_len.
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_RAW_DATA_INCLUDED == TRUE)
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectINT32 SDP_ReadRecord(UINT32 handle, UINT8 *p_data, INT32 *p_data_len)
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32           len = 0;                        /* Number of bytes in the entry */
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32           offset = -1; /* default to not found */
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD     *p_rec;
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          start = 0;
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          end = 0xffff;
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_ATTRIBUTE  *p_attr;
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          rem_len;
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_rsp;
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the record in the database */
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rec = sdp_db_find_record(handle);
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_rec && p_data && p_data_len)
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rsp = &p_data[3];
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while ( (p_attr = sdp_db_find_attr_in_rec (p_rec, start, end)) != NULL)
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check if attribute fits. Assume 3-byte value type/length */
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_len = *p_data_len - (UINT16) (p_rsp - p_data);
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_attr->len > (UINT32)(rem_len - 6))
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rsp = sdpu_build_attrib_entry (p_rsp, p_attr);
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* next attr id */
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            start = p_attr->id + 1;
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = (INT32) (p_rsp - p_data);
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Put in the sequence header (2 or 3 bytes) */
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len > 255)
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            offset = 0;
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[0] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD);
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[1] = (UINT8) ((len - 3) >> 8);
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[2] = (UINT8) (len - 3);
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            offset = 1;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[1] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data[2] = (UINT8) (len - 3);
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len--;
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_data_len = len;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (offset);
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1017