15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2003-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 the GATT client discovery procedures and cache
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  related functions.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2649120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_bta_gattc"
2749120dc867c7818511b5afec461dfc97d17eef58Marie Janssen
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski#include <errno.h>
3356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski#include <stdio.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
35db554581079863974af8e1289646f5deea6fc044Marie Janssen
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gattc_int.h"
37db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_sys.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
39bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#include "btm_ble_api.h"
4056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski#include "btm_int.h"
41258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
42f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#include "osi/include/log.h"
43db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "sdp_api.h"
44db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "sdpdefs.h"
45db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "utl.h"
46f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton
4756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskistatic void bta_gattc_cache_write(BD_ADDR server_bda, UINT16 num_attr, tBTA_GATTC_NV_ATTR *attr);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_char_dscpt_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_sdp_service_disc(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb);
5096b9707fd07ce3596b5200dd64b2ebf1aed9efeaAndre Eisenbachextern void bta_to_btif_uuid(bt_uuid_t *p_dest, tBT_UUID *p_src);
5136b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_SERVICE*  bta_gattc_find_matching_service(const list_t *services, UINT16 handle);
5236b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_DESCRIPTOR*  bta_gattc_get_descriptor_srcb(tBTA_GATTC_SERV *p_srcb, UINT16 handle);
5336b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_CHARACTERISTIC*  bta_gattc_get_characteristic_srcb(tBTA_GATTC_SERV *p_srcb, UINT16 handle);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55c78665ffc09be2adf3ba5478911a3f35f1163e81Prerepa Viswanadham#define BTA_GATT_SDP_DB_SIZE 4096
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski#define GATT_CACHE_PREFIX "/data/misc/bluetooth/gatt_cache_"
5836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski#define GATT_CACHE_VERSION 2
5956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
6056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskistatic void bta_gattc_generate_cache_file_name(char *buffer, BD_ADDR bda)
6156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski{
6256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    sprintf(buffer, "%s%02x%02x%02x%02x%02x%02x", GATT_CACHE_PREFIX,
6356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski            bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
6456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski}
6556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
671b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski**  Constants and data types
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
701b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowskitypedef struct
711b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski{
721b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    tSDP_DISCOVERY_DB   *p_sdp_db;
731b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    UINT16              sdp_conn_id;
741b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski} tBTA_GATTC_CB_DATA;
751b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_gattc_attr_type[] =
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "I", /* Included Service */
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "C", /* Characteristic */
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "D" /* Characteristic Descriptor */
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* utility functions */
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
859df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowskibool display_cache_attribute(void *data, void *context) {
86390749a4346248314b6b4d20aaea355c78e444efJakub Pawlowski    tBTA_GATTC_CACHE_ATTR *p_attr = data;
8729feba05f64b8f3bd9897ef6ed1cadc837ee0f77Jakub Pawlowski    APPL_TRACE_ERROR("\t Attr handle[%d] uuid[0x%04x] type[%s] prop[0x%1x]",
8836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                      p_attr->handle, p_attr->uuid.uu.uuid16,
899df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski                      bta_gattc_attr_type[p_attr->attr_type], p_attr->property);
909df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    return true;
919df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski}
929df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
939df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowskibool display_cache_service(void *data, void *context) {
9436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_SERVICE    *p_cur_srvc = data;
959df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    APPL_TRACE_ERROR("Service: handle[%d ~ %d] %s[0x%04x] inst[%d]",
969df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski                      p_cur_srvc->s_handle, p_cur_srvc->e_handle,
9726f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                      ((p_cur_srvc->uuid.len == 2) ? "uuid16" : "uuid128"),
9826f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                      p_cur_srvc->uuid.uu.uuid16,
9926f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                      p_cur_srvc->handle);
1009df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
10136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (p_cur_srvc->characteristics != NULL) {
10236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        list_foreach(p_cur_srvc->characteristics, display_cache_attribute, NULL);
1039df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    }
1049df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
1059df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    return true;
1069df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski}
1079df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_display_cache_server
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      debug function to display the server cache.
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1179df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowskistatic void bta_gattc_display_cache_server(list_t *p_cache)
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
119e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("<================Start Server Cache =============>");
1209df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    list_foreach(p_cache, display_cache_service, NULL);
121e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("<================End Server Cache =============>");
122e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR(" ");
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_display_explore_record
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      debug function to display the exploration list
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_display_explore_record(tBTA_GATTC_ATTR_REC *p_rec, UINT8 num_rec)
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *pp = p_rec;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
139e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("<================Start Explore Queue =============>");
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < num_rec; i ++, pp ++)
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
142e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("\t rec[%d] uuid[0x%04x] s_handle[%d] e_handle[%d] is_primary[%d]",
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          i + 1, pp->uuid.uu.uuid16, pp->s_handle, pp->e_handle, pp->is_primary);
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
145e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("<================ End Explore Queue =============>");
146e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR(" ");
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BTA_GATT_DEBUG == TRUE */
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_init_cache
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Initialize the database cache and discovery related resources.
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATT_STATUS bta_gattc_init_cache(tBTA_GATTC_SERV *p_srvc_cb)
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1629df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    if (p_srvc_cb->p_srvc_cache != NULL) {
1639df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        list_free(p_srvc_cb->p_srvc_cache);
1649df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        p_srvc_cb->p_srvc_cache = NULL;
1651a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    }
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
167abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free(p_srvc_cb->p_srvc_list);
16820524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    p_srvc_cb->p_srvc_list =
169abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        (tBTA_GATTC_ATTR_REC *)osi_malloc(BTA_GATTC_ATTR_LIST_SIZE);
17020524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    p_srvc_cb->total_srvc = 0;
17120524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    p_srvc_cb->cur_srvc_idx = 0;
17220524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    p_srvc_cb->cur_char_idx = 0;
17320524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    p_srvc_cb->next_avail_idx = 0;
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1759df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    return BTA_GATT_OK;
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowskistatic void characteristic_free(void *ptr) {
17936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski  tBTA_GATTC_CHARACTERISTIC *p_char = ptr;
18036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski  list_free(p_char->descriptors);
18136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski  osi_free(p_char);
18236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
1839df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
18436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowskistatic void service_free(void *ptr) {
18536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski  tBTA_GATTC_SERVICE *srvc = ptr;
18636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski  list_free(srvc->characteristics);
18736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski  list_free(srvc->included_svc);
1889df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski  osi_free(srvc);
1899df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski}
1909df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_add_srvc_to_cache
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Add a service into database cache.
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_srvc_to_cache(tBTA_GATTC_SERV *p_srvc_cb,
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    UINT16 s_handle, UINT16 e_handle,
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    tBT_UUID *p_uuid,
20329feba05f64b8f3bd9897ef6ed1cadc837ee0f77Jakub Pawlowski                                                    BOOLEAN is_primary)
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
206e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Add a service into Service");
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_SERVICE *p_new_srvc = osi_malloc(sizeof(tBTA_GATTC_SERVICE));
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update service information */
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_new_srvc->s_handle = s_handle;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_new_srvc->e_handle = e_handle;
21426f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski    p_new_srvc->is_primary = is_primary;
21526f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski    memcpy(&p_new_srvc->uuid, p_uuid, sizeof(tBT_UUID));
21626f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski    p_new_srvc->handle = s_handle;
21736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    p_new_srvc->characteristics = list_new(characteristic_free);
21836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    p_new_srvc->included_svc = list_new(osi_free);
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2209df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    if (p_srvc_cb->p_srvc_cache == NULL) {
2219df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        p_srvc_cb->p_srvc_cache = list_new(service_free);
2229df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    }
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2249df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    list_append(p_srvc_cb->p_srvc_cache, p_new_srvc);
2259df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    return BTA_GATT_OK;
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
227552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
228552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowskistatic tBTA_GATT_STATUS bta_gattc_add_char_to_cache(tBTA_GATTC_SERV *p_srvc_cb,
229552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                                    UINT16 attr_handle,
230552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                                    UINT16 value_handle,
231552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                                    tBT_UUID *p_uuid,
232552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                                    UINT8 property)
233552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski{
234552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
235552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    APPL_TRACE_DEBUG("%s: Add a characteristic into Service", __func__);
236552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    APPL_TRACE_DEBUG("handle=%d uuid16=0x%x property=0x%x",
237552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                      value_handle, p_uuid->uu.uuid16, property);
238552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski#endif
239552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
240552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    tBTA_GATTC_SERVICE *service = bta_gattc_find_matching_service(p_srvc_cb->p_srvc_cache, attr_handle);
241552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    if (!service) {
242552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski        APPL_TRACE_ERROR("Illegal action to add char/descr/incl srvc for non-existing service!");
243552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski        return GATT_WRONG_STATE;
244552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    }
245552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
246552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    /* TODO(jpawlowski): We should use attribute handle, not value handle to refer to characteristic.
247552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski       This is just a temporary workaround.
248552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    */
249552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    if (service->e_handle < value_handle)
250552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski        service->e_handle = value_handle;
251552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
252552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    tBTA_GATTC_CHARACTERISTIC *characteristic = osi_malloc(sizeof(tBTA_GATTC_CHARACTERISTIC));
253552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
254552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    characteristic->handle = value_handle;
255552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    characteristic->properties = property;
256552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    characteristic->descriptors = list_new(osi_free);
257552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    memcpy(&characteristic->uuid, p_uuid, sizeof(tBT_UUID));
258552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
259552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    characteristic->service = service;
260552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    list_append(service->characteristics, characteristic);
261552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
262552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    return BTA_GATT_OK;
263552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski}
264552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_add_attr_to_cache
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Add an attribute into database cache buffer.
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_attr_to_cache(tBTA_GATTC_SERV *p_srvc_cb,
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    UINT16 handle,
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    tBT_UUID *p_uuid,
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    UINT8 property,
27836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                                    UINT16 incl_srvc_s_handle,
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    tBTA_GATTC_ATTR_TYPE type)
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
2829df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    APPL_TRACE_DEBUG("%s: Add a [%s] into Service", __func__, bta_gattc_attr_type[type]);
28336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    APPL_TRACE_DEBUG("handle=%d uuid16=0x%x property=0x%x type=%d",
28436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                      handle, p_uuid->uu.uuid16, property, type);
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_SERVICE *service = bta_gattc_find_matching_service(p_srvc_cb->p_srvc_cache, handle);
28836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (!service) {
28936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        APPL_TRACE_ERROR("Illegal action to add char/descr/incl srvc for non-existing service!");
290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return GATT_WRONG_STATE;
291ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
292ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
293552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    if (type == BTA_GATTC_ATTR_TYPE_INCL_SRVC) {
29436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_INCLUDED_SVC *isvc =
29536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            osi_malloc(sizeof(tBTA_GATTC_INCLUDED_SVC));
29636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
29736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        isvc->handle = handle;
29836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        memcpy(&isvc->uuid, p_uuid, sizeof(tBT_UUID));
29936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
30036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        isvc->owning_service = service;
30136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        isvc->included_service = bta_gattc_find_matching_service(
30236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                    p_srvc_cb->p_srvc_cache, incl_srvc_s_handle);
30336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (!isvc->included_service) {
30436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            APPL_TRACE_ERROR("%s: Illegal action to add non-existing included service!", __func__);
30536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            osi_free(isvc);
30636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            return GATT_WRONG_STATE;
30736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        }
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        list_append(service->included_svc, isvc);
31036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    } else if (type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) {
31136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_DESCRIPTOR *descriptor =
31236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            osi_malloc(sizeof(tBTA_GATTC_DESCRIPTOR));
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        descriptor->handle = handle;
31536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        memcpy(&descriptor->uuid, p_uuid, sizeof(tBT_UUID));
3168a01f77a46186e04123b78ace6f79f57041a2e5cJakub Pawlowski
31736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (service->characteristics == NULL) {
31836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            APPL_TRACE_ERROR("%s: Illegal action to add descriptor before adding a characteristic!",
31936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                             __func__);
32036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            osi_free(descriptor);
32136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            return GATT_WRONG_STATE;
32236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        }
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_CHARACTERISTIC *char_node = list_back(service->characteristics);
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        descriptor->characteristic = char_node;
32736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        list_append(char_node->descriptors, descriptor);
32836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    }
3299df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    return BTA_GATT_OK;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_get_disc_range
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      get discovery stating and ending handle range.
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_get_disc_range(tBTA_GATTC_SERV *p_srvc_cb, UINT16 *p_s_hdl, UINT16 *p_e_hdl, BOOLEAN is_srvc)
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *p_rec = NULL;
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_srvc)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_s_hdl = p_rec->s_handle;
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_char_idx;
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_s_hdl = p_rec->s_handle + 1;
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_e_hdl = p_rec->e_handle;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
358e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("discover range [%d ~ %d]",p_rec->s_handle, p_rec->e_handle);
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_discover_pri_service
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start primary service discovery
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status of the operation.
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3718fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb,
3728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                                                    UINT8 disc_type)
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3748fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    tBTA_GATTC_CLCB     *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
3758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    tBTA_GATT_STATUS    status =  BTA_GATT_ERROR;
3768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
3778fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (p_clcb)
3788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
3798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        if (p_clcb->transport == BTA_TRANSPORT_LE)
3808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            status = bta_gattc_discover_procedure(conn_id, p_server_cb, disc_type);
3818fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        else
3828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            status = bta_gattc_sdp_service_disc(conn_id, p_server_cb);
3838fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
3848fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
3858fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    return status;
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_discover_procedure
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start a particular type of discovery procedure on server.
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status of the operation.
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3968fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb,
3978fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                                                   UINT8 disc_type)
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_DISC_PARAM param;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_service = TRUE;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&param, 0, sizeof(tGATT_DISC_PARAM));
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (disc_type == GATT_DISC_SRVC_ALL || disc_type == GATT_DISC_SRVC_BY_UUID)
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        param.s_handle = 1;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        param.e_handle = 0xFFFF;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disc_type == GATT_DISC_CHAR_DSCPT)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_service = FALSE;
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_get_disc_range(p_server_cb, &param.s_handle, &param.e_handle, is_service);
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (param.s_handle > param.e_handle)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return GATT_ERROR;
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return GATTC_Discover (conn_id, disc_type, &param);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_start_disc_include_srvc
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start discovery for included service
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status of the operation.
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATT_STATUS bta_gattc_start_disc_include_srvc(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_INC_SRVC);
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_start_disc_char
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start discovery for characteristic
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status of the operation.
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATT_STATUS bta_gattc_start_disc_char(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb->total_char = 0;
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_start_disc_char_dscp
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start discovery for characteristic descriptor
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_start_disc_char_dscp(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
463e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("starting discover characteristics descriptor");
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR_DSCPT) != 0)
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_explore_srvc
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process the service discovery complete event
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_explore_srvc(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
483e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Start service discovery: srvc_idx = %d", p_srvc_cb->cur_srvc_idx);
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb->cur_char_idx = p_srvc_cb->next_avail_idx = p_srvc_cb->total_srvc;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb == NULL)
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
489e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("unknown connection ID");
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start expore a service if there is service not been explored */
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_srvc_cb->cur_srvc_idx < p_srvc_cb->total_srvc)
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add the first service into cache */
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_gattc_add_srvc_to_cache (p_srvc_cb,
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_rec->s_handle,
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_rec->e_handle,
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         &p_rec->uuid,
50029feba05f64b8f3bd9897ef6ed1cadc837ee0f77Jakub Pawlowski                                         p_rec->is_primary) == 0)
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start discovering included services */
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_start_disc_include_srvc(conn_id, p_srvc_cb);
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* no service found at all, the end of server discovery*/
508db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_WARN(LOG_TAG, "%s no more services found", __func__);
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_display_cache_server(p_srvc_cb->p_srvc_cache);
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save cache to NV */
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb->p_srcb->state = BTA_GATTC_SERV_SAVE;
51556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
51656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (btm_sec_is_a_bonded_dev(p_srvc_cb->server_bda)) {
51756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id);
51856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
51956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
52056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_incl_srvc_disc_cmpl
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process the relationship discovery complete event
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_incl_srvc_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb->cur_char_idx = p_srvc_cb->total_srvc;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start discoverying characteristic */
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_start_disc_char(conn_id, p_srvc_cb);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_char_disc_cmpl
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process the characteristic discovery complete event
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_char_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_char_idx;
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if there are characteristic needs to be explored */
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_srvc_cb->total_char > 0)
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add the first characteristic into cache */
555552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski        bta_gattc_add_char_to_cache (p_srvc_cb,
556552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                     p_rec->char_decl_handle,
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_rec->s_handle,
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     &p_rec->uuid,
559552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                     p_rec->property);
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start discoverying characteristic descriptor , if failed, disc for next char*/
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_start_disc_char_dscp(conn_id, p_srvc_cb);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* otherwise start with next service */
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srvc_cb->cur_srvc_idx ++;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_explore_srvc (conn_id, p_srvc_cb);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_char_dscpt_disc_cmpl
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process the char descriptor discovery complete event
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_char_dscpt_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *p_rec = NULL;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (-- p_srvc_cb->total_char > 0)
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec = p_srvc_cb->p_srvc_list + (++ p_srvc_cb->cur_char_idx);
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add the next characteristic into cache */
588552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski        bta_gattc_add_char_to_cache (p_srvc_cb,
589552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                     p_rec->char_decl_handle,
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_rec->s_handle,
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     &p_rec->uuid,
592552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                     p_rec->property);
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start discoverying next characteristic for char descriptor */
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_start_disc_char_dscp(conn_id, p_srvc_cb);
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* all characteristic has been explored, start with next service if any */
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
601e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("all char has been explored");
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srvc_cb->cur_srvc_idx ++;
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_explore_srvc (conn_id, p_srvc_cb);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_gattc_srvc_in_list(tBTA_GATTC_SERV *p_srvc_cb, UINT16 s_handle,
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      UINT16 e_handle, tBT_UUID uuid)
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *p_rec = NULL;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN exist_srvc = FALSE;
6145cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(uuid);
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!GATT_HANDLE_IS_VALID(s_handle) || !GATT_HANDLE_IS_VALID(e_handle))
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
618e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("invalid included service handle: [0x%04x ~ 0x%04x]", s_handle, e_handle);
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        exist_srvc = TRUE;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < p_srvc_cb->next_avail_idx; i ++)
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rec = p_srvc_cb->p_srvc_list + i;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* a new service should not have any overlap with other service handle range */
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rec->s_handle == s_handle || p_rec->e_handle == e_handle)
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                exist_srvc = TRUE;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return exist_srvc;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_add_srvc_to_list
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Add a service into explore pending list
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_srvc_to_list(tBTA_GATTC_SERV *p_srvc_cb,
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                   UINT16 s_handle, UINT16 e_handle,
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                   tBT_UUID uuid, BOOLEAN is_primary)
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *p_rec = NULL;
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = BTA_GATT_OK;
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
65348db2d254997a69f8709e94c55607732e7772436Andre Eisenbach    if (p_srvc_cb->p_srvc_list && p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR)
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->next_avail_idx;
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6572f199b12dd1ae256973cd419ff2315beb8dd4546Nitin Arora        APPL_TRACE_DEBUG("%s handle=%d, service type=0x%04x",
6582f199b12dd1ae256973cd419ff2315beb8dd4546Nitin Arora                            __func__, s_handle, uuid.uu.uuid16);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->s_handle     = s_handle;
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->e_handle     = e_handle;
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->is_primary   = is_primary;
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&p_rec->uuid, &uuid, sizeof(tBT_UUID));
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6652f199b12dd1ae256973cd419ff2315beb8dd4546Nitin Arora        p_srvc_cb->total_srvc ++;
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srvc_cb->next_avail_idx ++;
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {   /* allocate bigger buffer ?? */
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = GATT_DB_FULL;
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
672e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("service not added, no resources or wrong state");
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_add_char_to_list
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Add a characteristic into explore pending list
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_char_to_list(tBTA_GATTC_SERV *p_srvc_cb,
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                   UINT16 decl_handle, UINT16 value_handle,
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                   tBT_UUID uuid, UINT8 property)
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_REC *p_rec = NULL;
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = BTA_GATT_OK;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_srvc_cb->p_srvc_list == NULL)
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
694e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("No service available, unexpected char discovery result");
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_GATT_INTERNAL_ERROR;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR)
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->next_avail_idx;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srvc_cb->total_char ++;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->s_handle = value_handle;
705552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski        p_rec->char_decl_handle = decl_handle;
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->property = property;
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->e_handle = (p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx)->e_handle;
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&p_rec->uuid, &uuid, sizeof(tBT_UUID));
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update the endind handle of pervious characteristic if available */
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_srvc_cb->total_char > 1)
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rec -= 1;
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rec->e_handle = decl_handle - 1;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srvc_cb->next_avail_idx ++;
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
720e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("char not added, no resources");
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* allocate bigger buffer ?? */
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_GATT_DB_FULL;
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7271b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_sdp_callback
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process the discovery result from sdp
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7371b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowskivoid bta_gattc_sdp_callback(UINT16 sdp_status, void* user_data)
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_REC       *p_sdp_rec = NULL;
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID            service_uuid;
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_PROTOCOL_ELEM  pe;
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              start_handle = 0, end_handle = 0;
7431b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    tBTA_GATTC_CB_DATA  *cb_data = user_data;
7441b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    tBTA_GATTC_SERV     *p_srvc_cb = bta_gattc_find_scb_by_cid(cb_data->sdp_conn_id);
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7461b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    if (((sdp_status == SDP_SUCCESS) || (sdp_status == SDP_DB_FULL)) && p_srvc_cb != NULL)
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        do
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* find a service record, report it */
7511b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski            p_sdp_rec = SDP_FindServiceInDb(cb_data->p_sdp_db, 0, p_sdp_rec);
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_sdp_rec)
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid))
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_ATT, &pe))
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        start_handle    = (UINT16) pe.params[0];
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        end_handle      = (UINT16) pe.params[1];
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
763e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                        APPL_TRACE_EVENT("Found ATT service [0x%04x] handle[0x%04x ~ 0x%04x]",
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        service_uuid.uu.uuid16, start_handle, end_handle);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7678fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                        if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle)&&
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_srvc_cb != NULL)
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            /* discover services result, add services into a service list */
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_gattc_add_srvc_to_list(p_srvc_cb,
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                       start_handle,
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                       end_handle,
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                       service_uuid,
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                       TRUE);
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        else
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
779e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                            APPL_TRACE_ERROR("invalid start_handle = %d end_handle = %d",
7808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                                                start_handle, end_handle);
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
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        } while (p_sdp_rec);
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_srvc_cb != NULL)
7911b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    {
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start discover primary service */
7931b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski        bta_gattc_explore_srvc(cb_data->sdp_conn_id, p_srvc_cb);
7941b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    }
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
797e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("GATT service discovery is done on unknown connection");
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8001b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    /* both were allocated in bta_gattc_sdp_service_disc */
801abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free(cb_data->p_sdp_db);
802abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free(cb_data);
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_sdp_service_disc
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start DSP Service Discovert
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_sdp_service_disc(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb)
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_UUID       uuid;
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          num_attrs = 2;
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_list[2];
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&uuid, 0, sizeof(tSDP_UUID));
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid.len = LEN_UUID_16;
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid.uu.uuid16 = UUID_PROTOCOL_ATT;
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8245fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    /*
8255fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov     * On success, cb_data will be freed inside bta_gattc_sdp_callback,
8265fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov     * otherwise it will be freed within this function.
8275fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov     */
8285fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTA_GATTC_CB_DATA *cb_data =
8295fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        (tBTA_GATTC_CB_DATA *)osi_malloc(sizeof(tBTA_GATTC_CB_DATA));
8301b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski
831abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    cb_data->p_sdp_db = (tSDP_DISCOVERY_DB *)osi_malloc(BTA_GATT_SDP_DB_SIZE);
8321b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
8331b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8351b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    SDP_InitDiscoveryDb(cb_data->p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1,
8361b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski                         &uuid, num_attrs, attr_list);
8371b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski
8381b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    if (!SDP_ServiceSearchAttributeRequest2(p_server_cb->server_bda,
8391b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski                                          cb_data->p_sdp_db, &bta_gattc_sdp_callback, cb_data))
8401b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    {
841abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(cb_data->p_sdp_db);
842abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(cb_data);
8431b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski        return BTA_GATT_ERROR;
8441b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    }
8451b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski
8461b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    cb_data->sdp_conn_id = conn_id;
8471b3ac367492750439ebecd393af1799242767ef3Jakub Pawlowski    return BTA_GATT_OK;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_disc_res_cback
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bta_gattc_disc_cmpl_cback
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      callback functions to GATT client stack.
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_disc_res_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES *p_data)
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_SERV * p_srvc_cb = NULL;
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          pri_srvc;
86348db2d254997a69f8709e94c55607732e7772436Andre Eisenbach    tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb = bta_gattc_find_scb_by_cid(conn_id);
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
86748db2d254997a69f8709e94c55607732e7772436Andre Eisenbach    if (p_srvc_cb != NULL && p_clcb != NULL && p_clcb->state == BTA_GATTC_DISCOVER_ST)
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (disc_type)
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_SRVC_ALL:
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* discover services result, add services into a service list */
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_add_srvc_to_list(p_srvc_cb,
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->handle,
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->value.group_value.e_handle,
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->value.group_value.service_type,
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           TRUE);
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_SRVC_BY_UUID:
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_add_srvc_to_list(p_srvc_cb,
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->handle,
883ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                           p_data->value.group_value.e_handle,
884ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                           p_data->value.group_value.service_type,
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           TRUE);
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_INC_SRVC:
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* add included service into service list if it's secondary or it never showed up
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   in the primary service search */
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pri_srvc = bta_gattc_srvc_in_list(p_srvc_cb,
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_data->value.incl_service.s_handle,
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_data->value.incl_service.e_handle,
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_data->value.incl_service.service_type);
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!pri_srvc)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_gattc_add_srvc_to_list(p_srvc_cb,
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                               p_data->value.incl_service.s_handle,
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                               p_data->value.incl_service.e_handle,
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                               p_data->value.incl_service.service_type,
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                               FALSE);
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* add into database */
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_add_attr_to_cache(p_srvc_cb,
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_data->handle,
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            &p_data->value.incl_service.service_type,
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            pri_srvc,
90736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                            p_data->value.incl_service.s_handle,
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            BTA_GATTC_ATTR_TYPE_INCL_SRVC);
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_CHAR:
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* add char value into database */
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_add_char_to_list(p_srvc_cb,
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->handle,
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->value.dclr_value.val_handle,
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->value.dclr_value.char_uuid,
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_data->value.dclr_value.char_prop);
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_CHAR_DSCPT:
9218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0,
92236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                            0 /* incl_srvc_handle */,
9238fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                                            BTA_GATTC_ATTR_TYPE_CHAR_DESCR);
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_disc_cmpl_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status)
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_SERV * p_srvc_cb;
931ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
933ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ( p_clcb && (status != GATT_SUCCESS || p_clcb->status != GATT_SUCCESS) )
934ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
9350e36a4d1617da1c5ec713c85a5bef4f6af89148eJakub Pawlowski        if (status == GATT_SUCCESS)
93648db2d254997a69f8709e94c55607732e7772436Andre Eisenbach            p_clcb->status = status;
937ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_gattc_sm_execute(p_clcb, BTA_GATTC_DISCOVER_CMPL_EVT, NULL);
938ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
939ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb = bta_gattc_find_scb_by_cid(conn_id);
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_srvc_cb != NULL)
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (disc_type)
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_SRVC_ALL:
947ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case GATT_DISC_SRVC_BY_UUID:
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx);
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_explore_srvc(conn_id, p_srvc_cb);
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_INC_SRVC:
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_incl_srvc_disc_cmpl(conn_id, p_srvc_cb);
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_CHAR:
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx);
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_char_disc_cmpl(conn_id, p_srvc_cb);
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case GATT_DISC_CHAR_DSCPT:
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb);
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_search_service
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      search local cache for matching service record.
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          FALSE if map can not be found.
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9826975b4d711142b885af479721cada448952c6b41Andre Eisenbachvoid bta_gattc_search_service(tBTA_GATTC_CLCB *p_clcb, tBT_UUID *p_uuid)
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC          cb_data;
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9869df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    if (!p_clcb->p_srcb->p_srvc_cache || list_is_empty(p_clcb->p_srcb->p_srvc_cache))
9879df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        return;
9889df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
9899df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    for (list_node_t *sn = list_begin(p_clcb->p_srcb->p_srvc_cache);
9909df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski         sn != list_end(p_clcb->p_srcb->p_srvc_cache); sn = list_next(sn)) {
99136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_SERVICE *p_cache = list_node(sn);
9929df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
99326f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski        if (!bta_gattc_uuid_compare(p_uuid, &p_cache->uuid, FALSE))
9949df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski            continue;
9959df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
996ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
9979df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        APPL_TRACE_DEBUG("found service [0x%04x], inst[%d] handle [%d]",
99826f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                          p_cache->uuid.uu.uuid16,
99926f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                          p_cache->handle,
100026f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                          p_cache->s_handle);
1001ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
10029df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        if (!p_clcb->p_rcb->p_cback)
10039df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski            continue;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10059df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        memset(&cb_data, 0, sizeof(tBTA_GATTC));
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10079df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        cb_data.srvc_res.conn_id = p_clcb->bta_conn_id;
100826f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski        cb_data.srvc_res.service_uuid.inst_id = p_cache->handle;
100926f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski        memcpy(&cb_data.srvc_res.service_uuid.uuid, &p_cache->uuid, sizeof(tBTA_GATT_ID));
10109df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
10119df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        (* p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_RES_EVT, &cb_data);
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
101536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowskilist_t* bta_gattc_get_services_srcb(tBTA_GATTC_SERV *p_srcb) {
101636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (!p_srcb || !p_srcb->p_srvc_cache || list_is_empty(p_srcb->p_srvc_cache))
101736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        return NULL;
10189df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
101936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return p_srcb->p_srvc_cache;
102036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
10219df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
102236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowskiconst list_t* bta_gattc_get_services(UINT16 conn_id) {
102336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
10249df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
102536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (p_clcb == NULL )
102636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        return NULL;
10279df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
102836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_SERV *p_srcb = p_clcb->p_srcb;
10299df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
103036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return bta_gattc_get_services_srcb(p_srcb);
103136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
103336b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_SERVICE*  bta_gattc_find_matching_service(const list_t *services, UINT16 handle) {
103436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (!services || list_is_empty(services))
103536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        return NULL;
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
103736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    for (list_node_t *sn = list_begin(services);
103836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski         sn != list_end(services); sn = list_next(sn)) {
103936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_SERVICE *service = list_node(sn);
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
104136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (handle >= service->s_handle && handle <= service->e_handle)
104236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            return service;
104336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    }
10449df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
104536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return NULL;
104636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
104736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
104836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowskiconst tBTA_GATTC_SERVICE*  bta_gattc_get_service_for_handle_srcb(tBTA_GATTC_SERV *p_srcb, UINT16 handle) {
104936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    const list_t *services = bta_gattc_get_services_srcb(p_srcb);
105036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
105136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return bta_gattc_find_matching_service(services, handle);
105236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
105336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
105436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowskiconst tBTA_GATTC_SERVICE*  bta_gattc_get_service_for_handle(UINT16 conn_id, UINT16 handle) {
105536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    const list_t *services = bta_gattc_get_services(conn_id);
105636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
105736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return bta_gattc_find_matching_service(services, handle);
105836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
105936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
106036b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_CHARACTERISTIC*  bta_gattc_get_characteristic_srcb(tBTA_GATTC_SERV *p_srcb, UINT16 handle) {
106136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    const tBTA_GATTC_SERVICE* service = bta_gattc_get_service_for_handle_srcb(p_srcb, handle);
106236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
106336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (!service)
106436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        return NULL;
106536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
106636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    for (list_node_t *cn = list_begin(service->characteristics);
106736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski         cn != list_end(service->characteristics); cn = list_next(cn)) {
106836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_CHARACTERISTIC *p_char = list_node(cn);
106936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (handle == p_char->handle)
107036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            return p_char;
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
107236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
107336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return NULL;
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
107636b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_CHARACTERISTIC*  bta_gattc_get_characteristic(UINT16 conn_id, UINT16 handle) {
107736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski   tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
107936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (p_clcb == NULL )
108036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        return NULL;
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
108236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_SERV *p_srcb = p_clcb->p_srcb;
108336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return bta_gattc_get_characteristic_srcb(p_srcb, handle);
108436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
108536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
108636b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_DESCRIPTOR*  bta_gattc_get_descriptor_srcb(tBTA_GATTC_SERV *p_srcb, UINT16 handle) {
108736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    const tBTA_GATTC_SERVICE* service = bta_gattc_get_service_for_handle_srcb(p_srcb, handle);
108836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
108936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (!service) {
109036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        return NULL;
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
109236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
109336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    for (list_node_t *cn = list_begin(service->characteristics);
109436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski         cn != list_end(service->characteristics); cn = list_next(cn)) {
109536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_CHARACTERISTIC *p_char = list_node(cn);
109636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        for (list_node_t *dn = list_begin(p_char->descriptors);
109736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski             dn != list_end(p_char->descriptors); dn = list_next(dn)) {
109836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            tBTA_GATTC_DESCRIPTOR *p_desc = list_node(dn);
109936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            if (handle == p_desc->handle)
110036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                return p_desc;
110136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        }
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
110436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return NULL;
110536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski}
110636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
110736b67072266468e4b4becc76c0ddbff6154bb12cJakub PawlowskitBTA_GATTC_DESCRIPTOR*  bta_gattc_get_descriptor(UINT16 conn_id, UINT16 handle) {
110836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
110936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
111036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    if (p_clcb == NULL )
111136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        return NULL;
111236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
111336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    tBTA_GATTC_SERV *p_srcb = p_clcb->p_srcb;
111436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    return bta_gattc_get_descriptor_srcb(p_srcb, handle);
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1119533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Function         bta_gattc_fill_gatt_db_el
1120533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1121533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Description      fill a btgatt_db_element_t value
1122533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1123533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Returns          None.
1124533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1125533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski*******************************************************************************/
1126533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowskivoid bta_gattc_fill_gatt_db_el(btgatt_db_element_t *p_attr,
1127533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                               bt_gatt_db_attribute_type_t type,
1128533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                               UINT16 att_handle,
1129533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                               UINT16 s_handle, UINT16 e_handle,
1130e6b1cb43525e27f95de85dc43150d7368b9d4c35Jakub Pawlowski                               UINT16 id, tBT_UUID uuid, UINT8 prop)
1131533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski{
1132533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    p_attr->type             = type;
1133533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    p_attr->attribute_handle = att_handle;
1134533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    p_attr->start_handle     = s_handle;
1135533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    p_attr->end_handle       = e_handle;
1136533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    p_attr->id               = id;
1137533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    p_attr->properties       = prop;
1138533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    bta_to_btif_uuid(&p_attr->uuid, &uuid);
1139533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski}
1140533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1141533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski/*******************************************************************************
114256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Returns          number of elements inside db from start_handle to end_handle
114356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski*******************************************************************************/
114456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskistatic size_t bta_gattc_get_db_size(list_t *services,
114556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                                 UINT16 start_handle, UINT16 end_handle) {
114656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (!services || list_is_empty(services))
114756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        return 0;
114856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
114956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    size_t db_size = 0;
115056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
115156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    for (list_node_t *sn = list_begin(services);
115256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski         sn != list_end(services); sn = list_next(sn)) {
115336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_SERVICE *p_cur_srvc = list_node(sn);
115456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
115556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        if (p_cur_srvc->s_handle < start_handle)
115656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski            continue;
115756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
115856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        if (p_cur_srvc->e_handle > end_handle)
115956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski            break;
116056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
116156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        db_size++;
116236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (!p_cur_srvc->characteristics || list_is_empty(p_cur_srvc->characteristics))
116336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            continue;
116436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
116536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        for (list_node_t *cn = list_begin(p_cur_srvc->characteristics);
116636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski             cn != list_end(p_cur_srvc->characteristics); cn = list_next(cn)) {
116736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            tBTA_GATTC_CHARACTERISTIC *p_char = list_node(cn);
116836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            db_size++;
116936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
117036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            if (p_char->descriptors)
117136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                db_size += list_length(p_char->descriptors);
117236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        }
117336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
117436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (p_cur_srvc->included_svc) {
117536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            db_size += list_length(p_cur_srvc->included_svc);
117636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        }
117756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
117856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
117956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    return db_size;
118056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski}
118156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
118256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski/*******************************************************************************
1183533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1184533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Function         bta_gattc_get_gatt_db_impl
1185533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1186533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Description      copy the server GATT database into db parameter.
1187533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1188533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Parameters       p_srvc_cb: server.
1189533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**                  db: output parameter which will contain GATT database copy.
1190533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**                      Caller is responsible for freeing it.
1191533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**                  count: output parameter which will contain number of
1192533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**                  elements in database.
1193533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1194533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Returns          None.
1195533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1196533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski*******************************************************************************/
1197533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowskistatic void bta_gattc_get_gatt_db_impl(tBTA_GATTC_SERV *p_srvc_cb,
119812339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski                                       UINT16 start_handle, UINT16 end_handle,
1199533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                       btgatt_db_element_t **db,
1200533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                       int *count)
1201533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski{
1202552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski    APPL_TRACE_DEBUG("%s: start_handle 0x%04x, end_handle 0x%04x",
120336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                     __func__, start_handle, end_handle);
1204533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
12059df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    if (!p_srvc_cb->p_srvc_cache || list_is_empty(p_srvc_cb->p_srvc_cache)) {
12069df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        *count = 0;
12079df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        *db = NULL;
12089df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski        return;
12099df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    }
12109df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
121156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    size_t db_size = bta_gattc_get_db_size(p_srvc_cb->p_srvc_cache, start_handle, end_handle);
1212533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1213533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    void* buffer = osi_malloc(db_size * sizeof(btgatt_db_element_t));
1214533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    btgatt_db_element_t *curr_db_attr = buffer;
1215533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
12169df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    for (list_node_t *sn = list_begin(p_srvc_cb->p_srvc_cache);
12179df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski         sn != list_end(p_srvc_cb->p_srvc_cache); sn = list_next(sn)) {
121836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_SERVICE *p_cur_srvc = list_node(sn);
12199df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
122012339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski        if (p_cur_srvc->s_handle < start_handle)
122112339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski            continue;
122212339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski
122312339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski        if (p_cur_srvc->e_handle > end_handle)
122412339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski            break;
122512339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski
1226533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        bta_gattc_fill_gatt_db_el(curr_db_attr,
122726f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                                  p_cur_srvc->is_primary ?
1228533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                      BTGATT_DB_PRIMARY_SERVICE :
1229533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                      BTGATT_DB_SECONDARY_SERVICE,
1230533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                  0 /* att_handle */,
1231533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                  p_cur_srvc->s_handle,
1232533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                  p_cur_srvc->e_handle,
123329feba05f64b8f3bd9897ef6ed1cadc837ee0f77Jakub Pawlowski                                  p_cur_srvc->s_handle,
123426f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                                  p_cur_srvc->uuid,
1235533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                  0 /* prop */);
1236533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        curr_db_attr++;
1237533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
123836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (!p_cur_srvc->characteristics || list_is_empty(p_cur_srvc->characteristics))
12399df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski            continue;
12409df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
124136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        for (list_node_t *cn = list_begin(p_cur_srvc->characteristics);
124236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski             cn != list_end(p_cur_srvc->characteristics); cn = list_next(cn)) {
124336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            tBTA_GATTC_CHARACTERISTIC *p_char = list_node(cn);
1244533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
124536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            bta_gattc_fill_gatt_db_el(curr_db_attr,
124636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      BTGATT_DB_CHARACTERISTIC,
124736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      p_char->handle,
124836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      0 /* s_handle */,
124936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      0 /* e_handle */,
125036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      p_char->handle,
125136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      p_char->uuid,
125236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      p_char->properties);
125336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            curr_db_attr++;
125436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
125536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            if (!p_char->descriptors || list_is_empty(p_char->descriptors))
125636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                continue;
125736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
125836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            for (list_node_t *dn = list_begin(p_char->descriptors);
125936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                 dn != list_end(p_char->descriptors); dn = list_next(dn)) {
126036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                tBTA_GATTC_DESCRIPTOR *p_desc = list_node(dn);
126136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
126236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                bta_gattc_fill_gatt_db_el(curr_db_attr,
126336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                          BTGATT_DB_DESCRIPTOR,
126436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                          p_desc->handle,
126536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                          0 /* s_handle */,
126636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                          0 /* e_handle */,
126736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                          p_desc->handle,
126836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                          p_desc->uuid,
126936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                          0 /* property */);
127036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                curr_db_attr++;
1271533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski            }
127236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        }
127336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
127436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (!p_cur_srvc->included_svc || list_is_empty(p_cur_srvc->included_svc))
127536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            continue;
127636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
127736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        for (list_node_t *isn = list_begin(p_cur_srvc->included_svc);
127836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski             isn != list_end(p_cur_srvc->included_svc); isn = list_next(isn)) {
127936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            tBTA_GATTC_INCLUDED_SVC *p_isvc = list_node(isn);
1280533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1281533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski            bta_gattc_fill_gatt_db_el(curr_db_attr,
128236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      BTGATT_DB_INCLUDED_SERVICE,
128336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      p_isvc->handle,
1284533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                      0 /* s_handle */,
1285533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                                      0 /* e_handle */,
128636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      p_isvc->handle,
128736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      p_isvc->uuid,
128836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                      0 /* property */);
1289533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski            curr_db_attr++;
1290533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        }
1291533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    }
1292533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1293533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    *db = buffer;
1294533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    *count = db_size;
1295533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski}
1296533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1297533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski/*******************************************************************************
1298533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1299533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Function         bta_gattc_get_gatt_db
1300533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1301533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Description      copy the server GATT database into db parameter.
1302533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1303533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Parameters       conn_id: connection ID which identify the server.
1304533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**                  db: output parameter which will contain GATT database copy.
1305533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**                      Caller is responsible for freeing it.
1306533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**                  count: number of elements in database.
1307533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1308533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski** Returns          None.
1309533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
1310533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski*******************************************************************************/
131112339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowskivoid bta_gattc_get_gatt_db(UINT16 conn_id, UINT16 start_handle, UINT16 end_handle, btgatt_db_element_t **db, int *count)
1312533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski{
1313533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
1314533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1315533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    LOG_DEBUG(LOG_TAG, "%s", __func__);
1316533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    if (p_clcb == NULL) {
1317533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        APPL_TRACE_ERROR("Unknown conn ID: %d", conn_id);
1318533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        return;
1319533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    }
1320533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1321533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    if (p_clcb->state != BTA_GATTC_CONN_ST) {
1322533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        APPL_TRACE_ERROR("server cache not available, CLCB state = %d",
1323533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski                         p_clcb->state);
1324533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        return;
1325533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    }
1326533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1327533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    if (!p_clcb->p_srcb || p_clcb->p_srcb->p_srvc_list || /* no active discovery */
1328533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        !p_clcb->p_srcb->p_srvc_cache) {
1329533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski        APPL_TRACE_ERROR("No server cache available");
1330533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    }
1331533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
133212339a801146d45f8aab010b38c099082bfc80e5Jakub Pawlowski    bta_gattc_get_gatt_db_impl(p_clcb->p_srcb, start_handle, end_handle, db, count);
1333533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski}
1334533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
1335533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski/*******************************************************************************
1336533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski**
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_rebuild_cache
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      rebuild server cache from NV cache.
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_rebuild_cache(tBTA_GATTC_SERV *p_srvc_cb, UINT16 num_attr,
134756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                             tBTA_GATTC_NV_ATTR *p_attr)
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* first attribute loading, initialize buffer */
13509df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski    APPL_TRACE_ERROR("%s: bta_gattc_rebuild_cache", __func__);
135156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
135256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    list_free(p_srvc_cb->p_srvc_cache);
135356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    p_srvc_cb->p_srvc_cache = NULL;
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (num_attr > 0 && p_attr != NULL)
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (p_attr->attr_type)
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_GATTC_ATTR_TYPE_SRVC:
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_add_srvc_to_cache(p_srvc_cb,
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_attr->s_handle,
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_attr->e_handle,
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            &p_attr->uuid,
136429feba05f64b8f3bd9897ef6ed1cadc837ee0f77Jakub Pawlowski                                            p_attr->is_primary);
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_GATTC_ATTR_TYPE_CHAR:
1368552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                //TODO(jpawlowski): store decl_handle properly.
1369552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                bta_gattc_add_char_to_cache(p_srvc_cb,
1370552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                            p_attr->s_handle,
1371552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                            p_attr->s_handle,
1372552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                            &p_attr->uuid,
1373552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                                            p_attr->prop);
1374552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski                break;
1375552e630435a68d8f51d458dccf8697c625cf1510Jakub Pawlowski
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_GATTC_ATTR_TYPE_CHAR_DESCR:
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_GATTC_ATTR_TYPE_INCL_SRVC:
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_add_attr_to_cache(p_srvc_cb,
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_attr->s_handle,
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            &p_attr->uuid,
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_attr->prop,
138236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                            p_attr->incl_srvc_handle,
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_attr->attr_type);
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_attr ++;
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_attr --;
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_fill_nv_attr
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      fill a NV attribute entry value
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_fill_nv_attr(tBTA_GATTC_NV_ATTR *p_attr, UINT8 type, UINT16 s_handle,
140136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                            UINT16 e_handle, tBT_UUID uuid, UINT8 prop, UINT16 incl_srvc_handle,
14028fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                            BOOLEAN is_primary)
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr->s_handle    = s_handle;
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr->e_handle    = e_handle;
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr->attr_type   = type;
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr->is_primary  = is_primary;
140829feba05f64b8f3bd9897ef6ed1cadc837ee0f77Jakub Pawlowski    p_attr->id          = 0;
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr->prop        = prop;
141036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    p_attr->incl_srvc_handle = incl_srvc_handle;
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&p_attr->uuid, &uuid, sizeof(tBT_UUID));
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
141456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_cache_save
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      save the server cache into NV
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
142456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskivoid bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id)
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
142656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (!p_srvc_cb->p_srvc_cache || list_is_empty(p_srvc_cb->p_srvc_cache))
142756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        return;
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
142956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    int i = 0;
143056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    size_t db_size = bta_gattc_get_db_size(p_srvc_cb->p_srvc_cache, 0x0000, 0xFFFF);
143156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    tBTA_GATTC_NV_ATTR *nv_attr = osi_malloc(db_size * sizeof(tBTA_GATTC_NV_ATTR));
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
143356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    for (list_node_t *sn = list_begin(p_srvc_cb->p_srvc_cache);
143456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski         sn != list_end(p_srvc_cb->p_srvc_cache); sn = list_next(sn)) {
143536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_SERVICE *p_cur_srvc = list_node(sn);
14369df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
143756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        bta_gattc_fill_nv_attr(&nv_attr[i++],
143856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                                BTA_GATTC_ATTR_TYPE_SRVC,
143956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                               p_cur_srvc->s_handle,
144056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                               p_cur_srvc->e_handle,
144126f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                               p_cur_srvc->uuid,
144236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                               0 /* properties */,
144336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                               0 /* incl_srvc_handle */,
144426f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski                               p_cur_srvc->is_primary);
144536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    }
144636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
144736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski    for (list_node_t *sn = list_begin(p_srvc_cb->p_srvc_cache);
144836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski         sn != list_end(p_srvc_cb->p_srvc_cache); sn = list_next(sn)) {
144936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        tBTA_GATTC_SERVICE *p_cur_srvc = list_node(sn);
145036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
145136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (!p_cur_srvc->characteristics || list_is_empty(p_cur_srvc->characteristics))
145236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            continue;
145336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
145436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        for (list_node_t *cn = list_begin(p_cur_srvc->characteristics);
145536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski             cn != list_end(p_cur_srvc->characteristics); cn = list_next(cn)) {
145636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            tBTA_GATTC_CHARACTERISTIC *p_char = list_node(cn);
145736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
145836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            bta_gattc_fill_nv_attr(&nv_attr[i++],
145936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   BTA_GATTC_ATTR_TYPE_CHAR,
146036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   p_char->handle,
146136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   0,
146236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   p_char->uuid,
146336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   p_char->properties,
146436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   0 /* incl_srvc_handle */,
146536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   FALSE);
146636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
146736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            if (!p_char->descriptors || list_is_empty(p_char->descriptors))
146836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                continue;
146936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
147036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            for (list_node_t *dn = list_begin(p_char->descriptors);
147136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                 dn != list_end(p_char->descriptors); dn = list_next(dn)) {
147236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                tBTA_GATTC_DESCRIPTOR *p_desc = list_node(dn);
147336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski
147436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                bta_gattc_fill_nv_attr(&nv_attr[i++],
147536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                       BTA_GATTC_ATTR_TYPE_CHAR_DESCR,
147636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                       p_desc->handle,
147736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                       0,
147836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                       p_desc->uuid,
147936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                       0 /* properties */,
148036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                       0 /* incl_srvc_handle */,
148136b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                       FALSE);
148236b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            }
148336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        }
14849df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
148536b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        if (!p_cur_srvc->included_svc || list_is_empty(p_cur_srvc->included_svc))
148656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski            continue;
14879df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
148836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski        for (list_node_t *an = list_begin(p_cur_srvc->included_svc);
148936b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski             an != list_end(p_cur_srvc->included_svc); an = list_next(an)) {
149036b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski            tBTA_GATTC_INCLUDED_SVC *p_isvc = list_node(an);
14919df3192b94a186207976ecc579d390f3cfd547c6Jakub Pawlowski
149256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski            bta_gattc_fill_nv_attr(&nv_attr[i++],
149336b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   BTA_GATTC_ATTR_TYPE_INCL_SRVC,
149436b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   p_isvc->handle,
149556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                                   0,
149636b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   p_isvc->uuid,
149736b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   0 /* properties */,
149836b67072266468e4b4becc76c0ddbff6154bb12cJakub Pawlowski                                   p_isvc->included_service->s_handle,
149956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                                   FALSE);
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
150356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    bta_gattc_cache_write(p_srvc_cb->server_bda, db_size, nv_attr);
150456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    osi_free(nv_attr);
150556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski}
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
150756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski/*******************************************************************************
150856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
150956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Function         bta_gattc_cache_load
151056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
151156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Description      Load GATT cache from storage for server.
151256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
151356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Parameter        p_clcb: pointer to server clcb, that will
151456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**                          be filled from storage
151556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Returns          true on success, false otherwise
151656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
151756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski*******************************************************************************/
151856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskibool bta_gattc_cache_load(tBTA_GATTC_CLCB *p_clcb)
151956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski{
152056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    char fname[255] = {0};
152156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    bta_gattc_generate_cache_file_name(fname, p_clcb->p_srcb->server_bda);
152256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
152356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    FILE *fd = fopen(fname, "rb");
152456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (!fd) {
152556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't open GATT cache file %s for reading, error: %s",
152656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                         __func__, fname, strerror(errno));
152756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        return false;
152856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
153056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    UINT16 cache_ver = 0;
153156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    tBTA_GATTC_NV_ATTR  *attr = NULL;
153256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    bool success = false;
153356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
153456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (fread(&cache_ver, sizeof(UINT16), 1, fd) != 1) {
153556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't read GATT cache version from: %s", __func__, fname);
153656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        goto done;
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
153856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
153956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (cache_ver != GATT_CACHE_VERSION) {
154056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: wrong GATT cache version: %s", __func__, fname);
154156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        goto done;
154256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
154356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
154456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    UINT16 num_attr = 0;
154556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
154656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (fread(&num_attr, sizeof(UINT16), 1, fd) != 1) {
154756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't read number of GATT attributes: %s", __func__, fname);
154856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        goto done;
154956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
155056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
155156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    attr = osi_malloc(sizeof(tBTA_GATTC_NV_ATTR) * num_attr);
155256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
155356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (fread(attr, sizeof(tBTA_GATTC_NV_ATTR), 0xFF, fd) != num_attr) {
155456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't read GATT attributes: %s", __func__, fname);
155556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        goto done;
155656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
155756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
155856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    bta_gattc_rebuild_cache(p_clcb->p_srcb, num_attr, attr);
155956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
156056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    success = true;
156156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
156256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskidone:
156356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    osi_free(attr);
156456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    fclose(fd);
156556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    return success;
156656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski}
156756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
156856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski/*******************************************************************************
156956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
157056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Function         bta_gattc_cache_write
157156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
157256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Description      This callout function is executed by GATT when a server cache
157356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**                  is available to save.
157456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
157556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Parameter        server_bda: server bd address of this cache belongs to
157656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**                  num_attr: number of attribute to be save.
157756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**                  attr: pointer to the list of attributes to save.
157856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Returns
157956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
158056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski*******************************************************************************/
158156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskistatic void bta_gattc_cache_write(BD_ADDR server_bda, UINT16 num_attr,
158256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski                           tBTA_GATTC_NV_ATTR *attr)
158356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski{
158456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    char fname[255] = {0};
158556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    bta_gattc_generate_cache_file_name(fname, server_bda);
158656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
158756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    FILE *fd = fopen(fname, "wb");
158856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (!fd) {
158956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't open GATT cache file for writing: %s", __func__, fname);
159056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        return;
159156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
159256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
159356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    UINT16 cache_ver = GATT_CACHE_VERSION;
159456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (fwrite(&cache_ver, sizeof(UINT16), 1, fd) != 1) {
159556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't write GATT cache version: %s", __func__, fname);
159656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        fclose(fd);
159756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        return;
159856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
159956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
160056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (fwrite(&num_attr, sizeof(UINT16), 1, fd) != 1) {
160156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't write GATT cache attribute count: %s", __func__, fname);
160256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        fclose(fd);
160356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        return;
160456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
160556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
160656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    if (fwrite(attr, sizeof(tBTA_GATTC_NV_ATTR), num_attr, fd) != num_attr) {
160756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        APPL_TRACE_ERROR("%s: can't write GATT cache attributes: %s", __func__, fname);
160856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        fclose(fd);
160956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski        return;
161056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    }
161156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
161256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    fclose(fd);
161356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski}
161456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski
161556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski/*******************************************************************************
161656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
161756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Function         bta_gattc_cache_reset
161856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
161956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Description      This callout function is executed by GATTC to reset cache in
162056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**                  application
162156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
162256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Parameter        server_bda: server bd address of this cache belongs to
162356658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
162456658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski** Returns          void.
162556658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski**
162656658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski*******************************************************************************/
162756658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowskivoid bta_gattc_cache_reset(BD_ADDR server_bda)
162856658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski{
162956658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    BTIF_TRACE_DEBUG("%s", __func__);
163056658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    char fname[255] = {0};
163156658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    bta_gattc_generate_cache_file_name(fname, server_bda);
163256658ccb40957a296f6600bdfed529d3f6e264a7Jakub Pawlowski    unlink(fname);
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1636