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 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpdefs.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gattc_int.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 38bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#include "btm_ble_api.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_char_dscpt_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb); 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_sdp_service_disc(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 430ed08d62a94235fb6a1a752452a313a3e9be6192Prerepa Viswanadham#define BTA_GATT_SDP_DB_SIZE 4096 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_gattc_attr_type[] = 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "I", /* Included Service */ 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "C", /* Characteristic */ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "D" /* Characteristic Descriptor */ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* utility functions */ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_display_cache_server 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description debug function to display the server cache. 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_display_cache_server(tBTA_GATTC_CACHE *p_cache) 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0, j; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE *p_cur_srvc = p_cache; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE_ATTR *p_attr; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 73e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("<================Start Server Cache =============>"); 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_cur_srvc) 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 77e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Service[%d]: handle[%d ~ %d] %s[0x%04x] inst[%d]", 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i, p_cur_srvc->s_handle, p_cur_srvc->e_handle, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_cur_srvc->service_uuid.id.uuid.len == 2) ? "uuid16" : "uuid128"), 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc->service_uuid.id.uuid.uu.uuid16, 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc->service_uuid.id.inst_id); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i ++; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_cur_srvc->p_attr; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (j = 0; p_attr; j ++ ) 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 88e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("\t Attr[0x%04x] handle[%d] uuid[0x%04x] inst[%d] type[%s] prop[0x%1x]", 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id, 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_attr_type[p_attr->attr_type], p_attr->property); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_attr->p_next; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc = p_cur_srvc->p_next; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 97e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("<================End Server Cache =============>"); 98e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR(" "); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_display_explore_record 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description debug function to display the exploration list 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_display_explore_record(tBTA_GATTC_ATTR_REC *p_rec, UINT8 num_rec) 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *pp = p_rec; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 115e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("<================Start Explore Queue =============>"); 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < num_rec; i ++, pp ++) 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 118e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("\t rec[%d] uuid[0x%04x] s_handle[%d] e_handle[%d] is_primary[%d]", 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i + 1, pp->uuid.uu.uuid16, pp->s_handle, pp->e_handle, pp->is_primary); 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 121e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("<================ End Explore Queue =============>"); 122e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR(" "); 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_DEBUG == TRUE */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_alloc_cache_buf 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Allocate a GKI buffer for database cache. 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *bta_gattc_alloc_cache_buf(tBTA_GATTC_SERV *p_srvc_cb) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL) 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 143e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed."); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&p_srvc_cb->p_srvc_list); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->free_byte = 0; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_buf, 0, GKI_get_buf_size(p_buf)); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_free = (UINT8 *) p_buf; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->free_byte = GKI_get_buf_size(p_buf); 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* link into buffer queue */ 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue(&p_srvc_cb->cache_buffer, p_buf); 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_GATT_DEBUG== TRUE 157e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("allocating new buffer: free byte = %d", p_srvc_cb->free_byte); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_init_cache 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initialize the database cache and discovery related resources. 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATT_STATUS bta_gattc_init_cache(tBTA_GATTC_SERV *p_srvc_cb) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_OK; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_srvc_cb->cache_buffer.p_first) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_srvc_cb->cache_buffer)); 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&p_srvc_cb->p_srvc_list); 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srvc_cb->p_srvc_list = (tBTA_GATTC_ATTR_REC*)GKI_getbuf(BTA_GATTC_ATTR_LIST_SIZE)) == NULL) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 181e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed."); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->total_srvc = 0; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->cur_srvc_idx = 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->cur_char_idx = 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->next_avail_idx = 0; 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_cur_srvc = p_srvc_cb->p_srvc_cache = NULL; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_get_srvc_inst_id 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description get service instance number 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns instance ID of the service. 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_gattc_get_srvc_inst_id(tBTA_GATTC_SERV *p_srvc_cb, tBT_UUID uuid) 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0, inst = 0; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_srvc_rec; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_srvc_cb->total_srvc; i ++) 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (; i < p_srvc_cb->cur_srvc_idx; i ++)*/ 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_rec = p_srvc_cb->p_srvc_list + i; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2236975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(&p_srvc_rec->uuid, &uuid, TRUE)) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project inst ++; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return inst ; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_get_char_inst_id 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description get characteristic instance number 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns characteristic instance ID. 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2376975b4d711142b885af479721cada448952c6b41Andre Eisenbachstatic UINT8 bta_gattc_get_char_inst_id(tBTA_GATTC_CACHE *p_service_cache, tBT_UUID *p_uuid) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 inst = 0; 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE_ATTR *p_attr; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID attr_uuid; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_service_cache->p_attr; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_attr) 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_pack_attr_uuid(p_attr, &attr_uuid); 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2496975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(&attr_uuid, p_uuid, TRUE)) 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project inst ++; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_attr->p_next; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2546975b4d711142b885af479721cada448952c6b41Andre Eisenbach 2556975b4d711142b885af479721cada448952c6b41Andre Eisenbach return inst ; 2566975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 2576975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************* 2586975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 2596975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Function bta_gattc_get_char_descr_inst_id 2606975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 2616975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description get characteristic descriptor instance number 2626975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 2636975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Returns characteristic instance ID. 2646975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 2656975b4d711142b885af479721cada448952c6b41Andre Eisenbach*******************************************************************************/ 2666975b4d711142b885af479721cada448952c6b41Andre Eisenbachstatic UINT8 bta_gattc_get_char_descr_inst_id(tBTA_GATTC_CACHE_ATTR *p_char_attr, tBT_UUID *p_uuid) 2676975b4d711142b885af479721cada448952c6b41Andre Eisenbach{ 2686975b4d711142b885af479721cada448952c6b41Andre Eisenbach UINT8 inst = 0; 2696975b4d711142b885af479721cada448952c6b41Andre Eisenbach tBT_UUID attr_uuid; 2706975b4d711142b885af479721cada448952c6b41Andre Eisenbach 2716975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_char_attr != NULL) 2726975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_char_attr = p_char_attr->p_next; 2736975b4d711142b885af479721cada448952c6b41Andre Eisenbach 2746975b4d711142b885af479721cada448952c6b41Andre Eisenbach while (p_char_attr) 2756975b4d711142b885af479721cada448952c6b41Andre Eisenbach { 2766975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gattc_pack_attr_uuid(p_char_attr, &attr_uuid); 2776975b4d711142b885af479721cada448952c6b41Andre Eisenbach 2786975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(&attr_uuid, p_uuid, TRUE)) 2796975b4d711142b885af479721cada448952c6b41Andre Eisenbach inst ++; 2806975b4d711142b885af479721cada448952c6b41Andre Eisenbach 2816975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_char_attr = p_char_attr->p_next; 2826975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return inst ; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_add_srvc_to_cache 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a service into database cache. 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_srvc_to_cache(tBTA_GATTC_SERV *p_srvc_cb, 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s_handle, UINT16 e_handle, 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_uuid, 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_primary, UINT8 srvc_inst) 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE *p_new_srvc = NULL; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_OK; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 304e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Add a service into Service"); 305e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, sizeof(tBTA_GATTC_CACHE)) 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->free_byte < sizeof(tBTA_GATTC_CACHE)) 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_NO_RESOURCES; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new_srvc = (tBTA_GATTC_CACHE *)p_srvc_cb->p_free; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update service information */ 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new_srvc->s_handle = s_handle; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new_srvc->e_handle = e_handle; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new_srvc->service_uuid.is_primary = is_primary; 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_new_srvc->service_uuid.id.uuid, p_uuid, sizeof(tBT_UUID)); 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new_srvc->service_uuid.id.inst_id = srvc_inst; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new_srvc->p_next = NULL; 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->p_cur_srvc != NULL) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_cur_srvc->p_next = p_new_srvc; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_cur_srvc = p_new_srvc; 3266975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_srvc_cb->p_cur_srvc->p_cur_char = NULL; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* first service */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->p_srvc_cache == NULL) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_srvc_cache = p_new_srvc; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update buffer managament info */ 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_free += sizeof(tBTA_GATTC_CACHE); 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->free_byte -= sizeof(tBTA_GATTC_CACHE); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_add_attr_to_cache 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add an attribute into database cache buffer. 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_attr_to_cache(tBTA_GATTC_SERV *p_srvc_cb, 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle, 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_uuid, 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 property, 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_TYPE type) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE_ATTR *p_attr; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_OK; 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = sizeof(tBTA_GATTC_CACHE_ATTR) + p_uuid->len; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 360e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gattc_add_attr_to_cache: Add a [%s] into Service", bta_gattc_attr_type[type]); 361e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("handle=%d uuid16=0x%x property=0x%x type=%d", handle, p_uuid->uu.uuid16, property, type); 362e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, len); 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_srvc_cb->p_cur_srvc == NULL) 366ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 367e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Illegal action to add char/descr/incl srvc before adding a service!"); 368ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return GATT_WRONG_STATE; 369ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 370ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->free_byte < len) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_NO_RESOURCES; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = (tBTA_GATTC_CACHE_ATTR *)p_srvc_cb->p_free; 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->attr_handle = handle; 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->attr_type = type; 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->property = property; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->uuid_len = p_uuid->len; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->p_uuid = (tBTA_GATTC_UUID *)(p_attr + 1); 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->p_next = NULL; 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pp = (UINT8 *)p_attr->p_uuid; 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_uuid->len == LEN_UUID_16) 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(pp, p_uuid->uu.uuid16); 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_uuid->len == LEN_UUID_128) 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(pp, p_uuid->uu.uuid128, LEN_UUID_128); 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (type == BTA_GATTC_ATTR_TYPE_CHAR) 3986975b4d711142b885af479721cada448952c6b41Andre Eisenbach { 3996975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_attr->inst_id = bta_gattc_get_char_inst_id(p_srvc_cb->p_cur_srvc, p_uuid); 4006975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_srvc_cb->p_cur_srvc->p_cur_char = p_attr; 4016975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 4026975b4d711142b885af479721cada448952c6b41Andre Eisenbach else if (type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) 4036975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_attr->inst_id = bta_gattc_get_char_descr_inst_id(p_srvc_cb->p_cur_srvc->p_cur_char, p_uuid); 4046975b4d711142b885af479721cada448952c6b41Andre Eisenbach else /* TODO: --->> temp treat included service as single instance */ 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->inst_id = 0; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update service information */ 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_free += len; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->free_byte -= len; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* first attribute within the service, update the attribute pointer */ 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->p_cur_srvc->p_attr == NULL) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_cur_srvc->p_attr = p_attr; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->p_cur_srvc->p_last_attr != NULL) 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_cur_srvc->p_last_attr->p_next = p_attr; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_cur_srvc->p_last_attr = p_attr; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 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_get_disc_range 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description get discovery stating and ending handle range. 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4335738f83aeb59361a0a2eda2460113f6dc919427The 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) 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_rec = NULL; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_srvc) 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_s_hdl = p_rec->s_handle; 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_char_idx; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_s_hdl = p_rec->s_handle + 1; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_e_hdl = p_rec->e_handle; 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 450e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("discover range [%d ~ %d]",p_rec->s_handle, p_rec->e_handle); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_discover_pri_service 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start primary service discovery 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation. 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4638fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, 4648fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT8 disc_type) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4668fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); 4678fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tBTA_GATT_STATUS status = BTA_GATT_ERROR; 4688fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 4698fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (p_clcb) 4708fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 4718fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (p_clcb->transport == BTA_TRANSPORT_LE) 4728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta status = bta_gattc_discover_procedure(conn_id, p_server_cb, disc_type); 4738fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta else 4748fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta status = bta_gattc_sdp_service_disc(conn_id, p_server_cb); 4758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 4768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 4778fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta return status; 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_discover_procedure 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start a particular type of discovery procedure on server. 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation. 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4888fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, 4898fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT8 disc_type) 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_DISC_PARAM param; 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_service = TRUE; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(¶m, 0, sizeof(tGATT_DISC_PARAM)); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc_type == GATT_DISC_SRVC_ALL || disc_type == GATT_DISC_SRVC_BY_UUID) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param.s_handle = 1; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param.e_handle = 0xFFFF; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc_type == GATT_DISC_CHAR_DSCPT) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_service = FALSE; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_get_disc_range(p_server_cb, ¶m.s_handle, ¶m.e_handle, is_service); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (param.s_handle > param.e_handle) 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_ERROR; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATTC_Discover (conn_id, disc_type, ¶m); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_start_disc_include_srvc 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start discovery for included service 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation. 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATT_STATUS bta_gattc_start_disc_include_srvc(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_INC_SRVC); 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_start_disc_char 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start discovery for characteristic 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation. 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATT_STATUS bta_gattc_start_disc_char(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->total_char = 0; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_start_disc_char_dscp 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start discovery for characteristic descriptor 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_start_disc_char_dscp(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 555e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("starting discover characteristics descriptor"); 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR_DSCPT) != 0) 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_explore_srvc 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the service discovery complete event 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_explore_srvc(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 575e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Start service discovery: srvc_idx = %d", p_srvc_cb->cur_srvc_idx); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->cur_char_idx = p_srvc_cb->next_avail_idx = p_srvc_cb->total_srvc; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb == NULL) 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 581e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("unknown connection ID"); 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start expore a service if there is service not been explored */ 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->cur_srvc_idx < p_srvc_cb->total_srvc) 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add the first service into cache */ 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gattc_add_srvc_to_cache (p_srvc_cb, 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->s_handle, 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->e_handle, 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_rec->uuid, 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->is_primary, 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->srvc_inst_id) == 0) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start discovering included services */ 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_start_disc_include_srvc(conn_id, p_srvc_cb); 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no service found at all, the end of server discovery*/ 601e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("No More Service found"); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_display_cache_server(p_srvc_cb->p_srvc_cache); 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save cache to NV */ 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_srcb->state = BTA_GATTC_SERV_SAVE; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_co_cache_open(p_srvc_cb->server_bda, BTA_GATTC_CI_CACHE_OPEN_EVT, 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id, TRUE); 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_incl_srvc_disc_cmpl 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the relationship discovery complete event 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_incl_srvc_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->cur_char_idx = p_srvc_cb->total_srvc; 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start discoverying characteristic */ 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_start_disc_char(conn_id, p_srvc_cb); 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_char_disc_cmpl 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the characteristic discovery complete event 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_char_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_char_idx; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if there are characteristic needs to be explored */ 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->total_char > 0) 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add the first characteristic into cache */ 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_attr_to_cache (p_srvc_cb, 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->s_handle, 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_rec->uuid, 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->property, 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_GATTC_ATTR_TYPE_CHAR); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start discoverying characteristic descriptor , if failed, disc for next char*/ 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_start_disc_char_dscp(conn_id, p_srvc_cb); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* otherwise start with next service */ 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->cur_srvc_idx ++; 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_explore_srvc (conn_id, p_srvc_cb); 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_char_dscpt_disc_cmpl 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the char descriptor discovery complete event 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_char_dscpt_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_rec = NULL; 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (-- p_srvc_cb->total_char > 0) 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec = p_srvc_cb->p_srvc_list + (++ p_srvc_cb->cur_char_idx); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add the next characteristic into cache */ 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_attr_to_cache (p_srvc_cb, 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->s_handle, 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_rec->uuid, 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->property, 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_GATTC_ATTR_TYPE_CHAR); 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start discoverying next characteristic for char descriptor */ 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_start_disc_char_dscp(conn_id, p_srvc_cb); 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* all characteristic has been explored, start with next service if any */ 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 690e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("all char has been explored"); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->cur_srvc_idx ++; 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_explore_srvc (conn_id, p_srvc_cb); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_gattc_srvc_in_list(tBTA_GATTC_SERV *p_srvc_cb, UINT16 s_handle, 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 e_handle, tBT_UUID uuid) 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_rec = NULL; 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN exist_srvc = FALSE; 7035cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(uuid); 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!GATT_HANDLE_IS_VALID(s_handle) || !GATT_HANDLE_IS_VALID(e_handle)) 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 707e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("invalid included service handle: [0x%04x ~ 0x%04x]", s_handle, e_handle); 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project exist_srvc = TRUE; 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_srvc_cb->next_avail_idx; i ++) 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec = p_srvc_cb->p_srvc_list + i; 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* a new service should not have any overlap with other service handle range */ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rec->s_handle == s_handle || p_rec->e_handle == e_handle) 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project exist_srvc = TRUE; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return exist_srvc; 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_add_srvc_to_list 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a service into explore pending list 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_srvc_to_list(tBTA_GATTC_SERV *p_srvc_cb, 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s_handle, UINT16 e_handle, 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID uuid, BOOLEAN is_primary) 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_rec = NULL; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_OK; 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 74248db2d254997a69f8709e94c55607732e7772436Andre Eisenbach if (p_srvc_cb->p_srvc_list && p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR) 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->next_avail_idx; 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->total_srvc ++; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 748e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gattc_add_srvc_to_list handle = %d, service type = 0x%04x", 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_handle, uuid.uu.uuid16); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->s_handle = s_handle; 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->e_handle = e_handle; 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->is_primary = is_primary; 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->srvc_inst_id = bta_gattc_get_srvc_inst_id(p_srvc_cb, uuid); 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_rec->uuid, &uuid, sizeof(tBT_UUID)); 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->next_avail_idx ++; 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { /* allocate bigger buffer ?? */ 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_DB_FULL; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 764e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("service not added, no resources or wrong state"); 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_add_char_to_list 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a characteristic into explore pending list 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_add_char_to_list(tBTA_GATTC_SERV *p_srvc_cb, 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 decl_handle, UINT16 value_handle, 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID uuid, UINT8 property) 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_REC *p_rec = NULL; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_OK; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->p_srvc_list == NULL) 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 786e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("No service available, unexpected char discovery result"); 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_INTERNAL_ERROR; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR) 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->next_avail_idx; 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->total_char ++; 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->s_handle = value_handle; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->property = property; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->e_handle = (p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx)->e_handle; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_rec->uuid, &uuid, sizeof(tBT_UUID)); 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update the endind handle of pervious characteristic if available */ 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb->total_char > 1) 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec -= 1; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->e_handle = decl_handle - 1; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->next_avail_idx ++; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 811e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("char not added, no resources"); 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate bigger buffer ?? */ 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_DB_FULL; 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_sdp_callback 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the discovery result from sdp 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_sdp_callback (UINT16 sdp_status) 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DISC_REC *p_sdp_rec = NULL; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID service_uuid; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM pe; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 start_handle = 0, end_handle = 0; 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_SERV *p_srvc_cb = bta_gattc_find_scb_by_cid(bta_gattc_cb.sdp_conn_id); 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(((sdp_status == SDP_SUCCESS) || (sdp_status == SDP_DB_FULL)) && p_srvc_cb != NULL) 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find a service record, report it */ 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sdp_rec = SDP_FindServiceInDb(bta_gattc_cb.p_sdp_db, 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, p_sdp_rec); 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sdp_rec) 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_ATT, &pe)) 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_handle = (UINT16) pe.params[0]; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project end_handle = (UINT16) pe.params[1]; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 853e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("Found ATT service [0x%04x] handle[0x%04x ~ 0x%04x]", 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_uuid.uu.uuid16, start_handle, end_handle); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8578fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle)&& 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb != NULL) 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* discover services result, add services into a service list */ 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_srvc_to_list(p_srvc_cb, 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_handle, 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project end_handle, 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_uuid, 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRUE); 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 869e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("invalid start_handle = %d end_handle = %d", 8708fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta start_handle, end_handle); 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (p_sdp_rec); 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_srvc_cb != NULL) 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start discover primary service */ 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_explore_srvc(bta_gattc_cb.sdp_conn_id, p_srvc_cb); 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 885e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("GATT service discovery is done on unknown connection"); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(bta_gattc_cb.p_sdp_db); 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_cb.p_sdp_db = NULL; 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_cb.sdp_conn_id = 0; 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_sdp_service_disc 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start DSP Service Discovert 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_sdp_service_disc(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_UUID uuid; 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_attrs = 2; 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_list[2]; 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_ERROR; 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&uuid, 0, sizeof(tSDP_UUID)); 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid.len = LEN_UUID_16; 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid.uu.uuid16 = UUID_PROTOCOL_ATT; 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((bta_gattc_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_GATT_SDP_DB_SIZE)) != NULL) 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9188fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta SDP_InitDiscoveryDb (bta_gattc_cb.p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1, 9198fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta &uuid, num_attrs, attr_list); 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if(!SDP_ServiceSearchAttributeRequest (p_server_cb->server_bda, 9228fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta bta_gattc_cb.p_sdp_db, &bta_gattc_sdp_callback)) 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(bta_gattc_cb.p_sdp_db); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_cb.p_sdp_db = NULL; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_cb.sdp_conn_id = conn_id; 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_OK; 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_disc_res_cback 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bta_gattc_disc_cmpl_cback 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description callback functions to GATT client stack. 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_disc_res_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES *p_data) 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_SERV * p_srvc_cb = NULL; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN pri_srvc; 94948db2d254997a69f8709e94c55607732e7772436Andre Eisenbach tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb = bta_gattc_find_scb_by_cid(conn_id); 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 95348db2d254997a69f8709e94c55607732e7772436Andre Eisenbach if (p_srvc_cb != NULL && p_clcb != NULL && p_clcb->state == BTA_GATTC_DISCOVER_ST) 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (disc_type) 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_SRVC_ALL: 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* discover services result, add services into a service list */ 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_srvc_to_list(p_srvc_cb, 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->handle, 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.group_value.e_handle, 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.group_value.service_type, 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRUE); 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_SRVC_BY_UUID: 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_srvc_to_list(p_srvc_cb, 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->handle, 969ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_data->value.group_value.e_handle, 970ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_data->value.group_value.service_type, 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRUE); 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_INC_SRVC: 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add included service into service list if it's secondary or it never showed up 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project in the primary service search */ 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pri_srvc = bta_gattc_srvc_in_list(p_srvc_cb, 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.incl_service.s_handle, 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.incl_service.e_handle, 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.incl_service.service_type); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!pri_srvc) 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_srvc_to_list(p_srvc_cb, 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.incl_service.s_handle, 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.incl_service.e_handle, 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.incl_service.service_type, 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add into database */ 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_attr_to_cache(p_srvc_cb, 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->handle, 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_data->value.incl_service.service_type, 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pri_srvc, 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_GATTC_ATTR_TYPE_INCL_SRVC); 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_CHAR: 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add char value into database */ 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_char_to_list(p_srvc_cb, 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->handle, 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.dclr_value.val_handle, 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.dclr_value.char_uuid, 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->value.dclr_value.char_prop); 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_CHAR_DSCPT: 10068fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0, 10078fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BTA_GATTC_ATTR_TYPE_CHAR_DESCR); 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_disc_cmpl_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status) 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_SERV * p_srvc_cb; 1015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ( p_clcb && (status != GATT_SUCCESS || p_clcb->status != GATT_SUCCESS) ) 1018ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 101948db2d254997a69f8709e94c55607732e7772436Andre Eisenbach if (p_clcb->status == GATT_SUCCESS) 102048db2d254997a69f8709e94c55607732e7772436Andre Eisenbach p_clcb->status = status; 1021ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_gattc_sm_execute(p_clcb, BTA_GATTC_DISCOVER_CMPL_EVT, NULL); 1022ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1023ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb = bta_gattc_find_scb_by_cid(conn_id); 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb != NULL) 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (disc_type) 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_SRVC_ALL: 1031ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case GATT_DISC_SRVC_BY_UUID: 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx); 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_explore_srvc(conn_id, p_srvc_cb); 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_INC_SRVC: 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_incl_srvc_disc_cmpl(conn_id, p_srvc_cb); 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_CHAR: 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx); 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_char_disc_cmpl(conn_id, p_srvc_cb); 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_DISC_CHAR_DSCPT: 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb); 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_id2handle 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description map GATT ID to handle in a given cache. 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the handle mapped. 0 if not found. 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 bta_gattc_id2handle(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_SRVC_ID *p_service_id, 10666975b4d711142b885af479721cada448952c6b41Andre Eisenbach tBTA_GATT_ID *p_char_id, tBTA_GATT_ID *p_descr_uuid) 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE *p_cache = p_srcb->p_srvc_cache; 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE_ATTR *p_attr; 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 j; 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = 0; 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID attr_uuid; 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN char_map = FALSE, done = FALSE; 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while (p_service_id && p_cache && !done) 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1078e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]", 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16, 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->service_uuid.id.inst_id); 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_cache->p_attr; 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1084ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid)) 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (j = 0; p_attr; j ++) 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1089e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]", 10908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, 10918fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_attr->inst_id, p_attr->attr_type); 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_pack_attr_uuid(p_attr, &attr_uuid); 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10956975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(&p_char_id->uuid, &attr_uuid, TRUE) && 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_char_id->inst_id == p_attr->inst_id) 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10986975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_descr_uuid == NULL) 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = p_attr->attr_handle; 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project done = TRUE; 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1107e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("found matching characteristic for the descriptor"); 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char_map = TRUE; 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (char_map == TRUE) 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11176975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_descr_uuid != NULL && 11186975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gattc_uuid_compare(&p_descr_uuid->uuid, &attr_uuid, TRUE) && 11196975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_descr_uuid->inst_id == p_attr->inst_id) 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1122e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("found descriptor!!"); 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = p_attr->attr_handle; 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project done = TRUE; 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1131e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("descriptor UUID not matching"); 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* another char */ 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1138e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("no matching descptr found!!start of next characteristic"); 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char_map = FALSE; 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project done = TRUE; 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_attr->p_next; 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache = p_cache->p_next; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return handle; 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_handle2id 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description map a handle to GATT ID in a given cache. 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns FALSE if map can not be found. 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_gattc_handle2id(tBTA_GATTC_SERV *p_srcb, UINT16 handle, tBTA_GATT_SRVC_ID *p_service_id, 11646975b4d711142b885af479721cada448952c6b41Andre Eisenbach tBTA_GATT_ID *p_char_id, tBTA_GATT_ID *p_descr_type) 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE *p_cache = p_srcb->p_srvc_cache; 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE_ATTR *p_attr, *p_char = NULL; 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 j; 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_service_id, 0, sizeof(tBTA_GATT_SRVC_ID)); 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_char_id, 0, sizeof(tBTA_GATT_ID)); 11726975b4d711142b885af479721cada448952c6b41Andre Eisenbach memset(p_descr_type, 0, sizeof(tBTA_GATT_ID)); 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_cache) 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1177e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]", 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16, 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->service_uuid.id.inst_id); 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* a service found */ 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cache->s_handle == handle) 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_service_id, &p_cache->service_uuid, sizeof(tBTA_GATT_SRVC_ID)); 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* start looking for attributes within the service */ 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_cache->p_attr; 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (j = 0; p_attr; j ++) 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1195e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]", 11968fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, 11978fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_attr->inst_id, p_attr->attr_type); 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR) 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_char = p_attr; 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle == p_attr->attr_handle) 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_service_id, &p_cache->service_uuid, sizeof(tBTA_GATT_SRVC_ID)); 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12086975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gattc_pack_attr_uuid(p_attr, &p_descr_type->uuid); 12096975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_descr_type->inst_id = p_attr->inst_id; 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_char != NULL) 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_pack_attr_uuid(p_char, &p_char_id->uuid); 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_char_id->inst_id = p_char->inst_id; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1218e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("descptr does not belong to any chracteristic"); 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is a characterisitc value or included service */ 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_pack_attr_uuid(p_attr, &p_char_id->uuid); 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_char_id->inst_id =p_attr->inst_id; 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_attr->p_next; 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache = p_cache->p_next; 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_search_service 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description search local cache for matching service record. 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns FALSE if map can not be found. 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12476975b4d711142b885af479721cada448952c6b41Andre Eisenbachvoid bta_gattc_search_service(tBTA_GATTC_CLCB *p_clcb, tBT_UUID *p_uuid) 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_SERV *p_srcb = p_clcb->p_srcb; 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE *p_cache = p_srcb->p_srvc_cache; 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC cb_data; 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_cache) 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12556975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(p_uuid, &p_cache->service_uuid.id.uuid, FALSE)) 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1258e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("found service [0x%04x], inst[%d] handle [%d]", 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->service_uuid.id.uuid.uu.uuid16, 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->service_uuid.id.inst_id, 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->s_handle); 1262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->p_rcb->p_cback) 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cb_data, 0, sizeof(tBTA_GATTC)); 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_res.conn_id = p_clcb->bta_conn_id; 12688fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta memcpy(&cb_data.srvc_res.service_uuid, &p_cache->service_uuid, 12698fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta sizeof(tBTA_GATT_SRVC_ID)); 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_RES_EVT, &cb_data); 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache = p_cache->p_next; 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_find_record 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description search local cache for matching attribute record. 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter p_result: output parameter to store the characteristic/ 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** included service GATT ID. 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_ERROR is no recording found. BTA_GATT_OK if record found. 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_GATT_STATUS bta_gattc_find_record(tBTA_GATTC_SERV *p_srcb, 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_TYPE attr_type, 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_SRVC_ID *p_service_id, 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_ID *p_start_rec, 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID * p_uuid_cond, 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_ID *p_result, 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_param) 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE *p_cache = p_srcb->p_srvc_cache; 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_ERROR; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, j; 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE_ATTR *p_attr; 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN char_found = FALSE, descr_found = FALSE; 13026975b4d711142b885af479721cada448952c6b41Andre Eisenbach tBTA_GATT_ID *p_descr_id = (tBTA_GATT_ID *)p_param;; 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1304ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i = 0; p_cache && status != BTA_GATT_OK; i ++) 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1306ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid)) 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1309e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("found matching service [0x%04x], inst[%d]", 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->service_uuid.id.uuid.uu.uuid16, 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache->service_uuid.id.inst_id); 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_cache->p_attr; 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (j = 0; p_attr; j ++) 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1318e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\t Attr[%d] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]", 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project j + 1, p_attr->attr_handle, 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->p_uuid->uuid16, 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->inst_id, 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->attr_type); 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_pack_attr_uuid(p_attr, &p_result->uuid); 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_start_rec != NULL && char_found == FALSE) 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find the starting record first */ 13296975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(&p_start_rec->uuid, &p_result->uuid, FALSE) && 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_start_rec->inst_id == p_attr->inst_id && 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (attr_type == p_attr->attr_type || 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find descriptor would look for characteristic first */ 13336975b4d711142b885af479721cada448952c6b41Andre Eisenbach (attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR && 13346975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR))) 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char_found = TRUE; 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if looking for descriptor, here is the where the descrptor to be found */ 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* next characeteristic already, return error */ 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->attr_type != BTA_GATTC_ATTR_TYPE_CHAR_DESCR) 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13516975b4d711142b885af479721cada448952c6b41Andre Eisenbach /* find starting descriptor */ 13526975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_descr_id != NULL && !descr_found) 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13546975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(&p_descr_id->uuid, &p_result->uuid, TRUE) 13556975b4d711142b885af479721cada448952c6b41Andre Eisenbach && p_descr_id->inst_id == p_attr->inst_id) 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project descr_found = TRUE; 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* with matching descriptor */ 13636975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(p_uuid_cond, &p_result->uuid, FALSE)) 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13656975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_result->inst_id = p_attr->inst_id; 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_OK; 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13746975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (bta_gattc_uuid_compare(p_uuid_cond, &p_result->uuid, FALSE) && 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_type == p_attr->attr_type) 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 137848db2d254997a69f8709e94c55607732e7772436Andre Eisenbach#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 1379e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("found char handle mapping characteristic"); 138048db2d254997a69f8709e94c55607732e7772436Andre Eisenbach#endif 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_result->inst_id = p_attr->inst_id; 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_param != NULL) 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (attr_type == BTA_GATTC_ATTR_TYPE_CHAR || 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_type == BTA_GATTC_ATTR_TYPE_INCL_SRVC) 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(tBTA_GATT_CHAR_PROP *)p_param = p_attr->property; 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_OK; 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_attr->p_next; 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 139948db2d254997a69f8709e94c55607732e7772436Andre Eisenbach#if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status) 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1402e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("In the given service, can not find matching record"); 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 140448db2d254997a69f8709e94c55607732e7772436Andre Eisenbach#endif 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cache = p_cache->p_next; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_query_cache 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description search local cache for matching attribute record. 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection ID which identify the server. 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_srvc_id: the service ID of which the characteristic is belonged to. 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** *p_start_rec: start the search from the next record 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** after the one identified by *p_start_rec. 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_uuid_cond: UUID, if NULL find the first available 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** characteristic/included service. 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_output: output parameter which will store the GATT ID 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of the characteristic /included service found. 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTA_GATT_ERROR is no recording found. BTA_GATT_OK if record found. 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATT_STATUS bta_gattc_query_cache(UINT16 conn_id, 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_ATTR_TYPE query_type, 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_SRVC_ID *p_srvc_id, 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_ID *p_start_rec, 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_uuid_cond, 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_ID *p_output, 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_param) 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER; 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb != NULL ) 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->state == BTA_GATTC_CONN_ST) 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->p_srcb && 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !p_clcb->p_srcb->p_srvc_list && /* no active discovery */ 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_srcb->p_srvc_cache) 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = bta_gattc_find_record(p_clcb->p_srcb, 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project query_type, 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_id, 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_start_rec, 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_uuid_cond, 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_output, 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_param); 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_ERROR; 1462e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("No server cache available"); 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1467e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("server cache not available, CLCB state = %d", p_clcb->state); 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (p_clcb->state == BTA_GATTC_DISCOVER_ST) ? BTA_GATT_BUSY : BTA_GATT_ERROR; 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1474e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown conn ID: %d", conn_id); 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_rebuild_cache 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description rebuild server cache from NV cache. 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_rebuild_cache(tBTA_GATTC_SERV *p_srvc_cb, UINT16 num_attr, 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_NV_ATTR *p_attr, UINT16 attr_index) 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* first attribute loading, initialize buffer */ 1495e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_gattc_rebuild_cache"); 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (attr_index == 0) 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_srvc_cb->cache_buffer.p_first) 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_srvc_cb->cache_buffer)); 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1503e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("allocate cache buffer failed, no resources"); 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->p_cur_srvc = p_srvc_cb->p_srvc_cache = NULL; 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (num_attr > 0 && p_attr != NULL) 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_attr->attr_type) 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_GATTC_ATTR_TYPE_SRVC: 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_srvc_to_cache(p_srvc_cb, 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->s_handle, 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->e_handle, 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_attr->uuid, 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->is_primary, 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->id); 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_GATTC_ATTR_TYPE_CHAR: 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_GATTC_ATTR_TYPE_CHAR_DESCR: 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_GATTC_ATTR_TYPE_INCL_SRVC: 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_add_attr_to_cache(p_srvc_cb, 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->s_handle, 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_attr->uuid, 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->prop, 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->attr_type); 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr ++; 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr --; 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_fill_nv_attr 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description fill a NV attribute entry value 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_fill_nv_attr(tBTA_GATTC_NV_ATTR *p_attr, UINT8 type, UINT16 s_handle, 15498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT16 e_handle, UINT8 id, tBT_UUID uuid, UINT8 prop, 15508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BOOLEAN is_primary) 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->s_handle = s_handle; 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->e_handle = e_handle; 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->attr_type = type; 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->is_primary = is_primary; 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->id = id; 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->prop = prop; 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_attr->uuid, &uuid, sizeof(tBT_UUID)); 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_cache_save 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description save the server cache into NV 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id) 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE *p_cur_srvc = p_srvc_cb->p_srvc_cache; 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 offset = 0; 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_NV_ATTR nv_attr[BTA_GATTC_NV_LOAD_MAX]; 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CACHE_ATTR *p_attr; 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID uuid; 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_cur_srvc && i < BTA_GATTC_NV_LOAD_MAX) 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (offset ++ >= p_srvc_cb->attr_index) 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_fill_nv_attr(&nv_attr[i++], 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_GATTC_ATTR_TYPE_SRVC, 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc->s_handle, 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc->e_handle, 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc->service_uuid.id.inst_id, 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc->service_uuid.id.uuid, 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc->service_uuid.is_primary); 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = p_cur_srvc->p_attr; 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (; p_attr && i < BTA_GATTC_NV_LOAD_MAX ; offset ++, p_attr = p_attr->p_next) 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (offset >= p_srvc_cb->attr_index) 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((uuid.len = p_attr->uuid_len) == LEN_UUID_16) 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid.uu.uuid16 = p_attr->p_uuid->uuid16; 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(uuid.uu.uuid128, p_attr->p_uuid->uuid128, LEN_UUID_128); 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_fill_nv_attr(&nv_attr[i++], 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->attr_type, 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->attr_handle, 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->inst_id, 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid, 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->property, 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE); 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cur_srvc = p_cur_srvc->p_next; 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i > 0) 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gattc_co_cache_save(p_srvc_cb->server_bda, BTA_GATTC_CI_CACHE_SAVE_EVT, i, 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nv_attr, p_srvc_cb->attr_index, conn_id); 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->attr_index += i; 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */ 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1637