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(¶m, 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, ¶m.s_handle, ¶m.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, ¶m); 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