16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 2003-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains the GATT client action functions for the state 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * machine. 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h" 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "utl.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h" 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bd.h" 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_sys.h" 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_gattc_int.h" 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_api.h" 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/***************************************************************************** 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Constants 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/ 456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachstatic void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id, 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN connected, tGATT_DISCONN_REASON reason); 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 486ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachstatic void bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tGATT_CL_COMPLETE *p_data); 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic tGATT_CBACK bta_gattc_cl_cback = 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_conn_cback, 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_cmpl_cback, 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_disc_res_cback, 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_disc_cmpl_cback, 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach NULL 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */ 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT16 bta_gattc_opcode_to_int_evt[] = 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_API_READ_EVT, 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_API_WRITE_EVT, 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_API_EXEC_EVT 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BT_TRACE_VERBOSE == TRUE) 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic const char *bta_gattc_op_code_name[] = 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Unknown", 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Discovery", 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Read", 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Write", 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Exec", 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Config", 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Notification", 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "Indication" 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/***************************************************************************** 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Action Functions 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/ 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_register 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Register a GATT client application with BTA. 906ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_register(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data) 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach tBT_UUID *p_app_uuid = &p_data->api_reg.app_uuid; 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_INT_START_IF *p_buf; 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* todo need to check duplicate uuid */ 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTA_GATTC_CL_MAX; i ++) 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_cb->cl_rcb[i].in_use) 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_app_uuid == NULL) || (p_cb->cl_rcb[i].client_if = GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0) 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("Register with GATT stack failed."); 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.status = BTA_GATT_ERROR; 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->cl_rcb[i].in_use = TRUE; 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->cl_rcb[i].p_cback = p_data->api_reg.p_cback; 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&p_cb->cl_rcb[i].app_uuid, p_app_uuid, sizeof(tBT_UUID)); 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* BTA use the same client interface as BTE GATT statck */ 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.client_if = p_cb->cl_rcb[i].client_if; 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// btla-specific ++ 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&(cb_data.reg_oper.app_uuid),p_app_uuid,sizeof(tBT_UUID)); 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// btla-specific -- 1246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.status = BTA_GATT_OK; 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (tBTA_GATTC_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTC_INT_START_IF))) != NULL) 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.event = BTA_GATTC_INT_START_IF_EVT; 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->client_if = p_cb->cl_rcb[i].client_if; 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.status = BTA_GATT_NO_RESOURCES; 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset( &p_cb->cl_rcb[i], 0 , sizeof(tBTA_GATTC_RCB)); 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* callback with register event */ 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->api_reg.p_cback) 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_data->api_reg.p_cback)(BTA_GATTC_REG_EVT, (tBTA_GATTC *)&cb_data); 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_start_if 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description start an application interface. 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns none. 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_start_if(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_cl_get_regcb(p_msg->int_start_if.client_if) !=NULL ) 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GATT_StartIf(p_msg->int_start_if.client_if); 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if ); 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_deregister_cmpl 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description De-Register a GATT client application with BTA completed. 1776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_int_deregister_cmpl(tBTA_GATTC_RCB *p_clreg, tBTA_GATTC_IF client_if) 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CBACK *p_cback = p_clreg->p_cback; 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_int_deregister_cmpl client_if=%d", client_if ); 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GATT_Deregister(p_clreg->client_if); 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(p_clreg, 0, sizeof(tBTA_GATTC_RCB)); 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.client_if = client_if; 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.status = BTA_GATT_OK; 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cback) 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* callback with de-register event */ 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_cback)(BTA_GATTC_DEREG_EVT, (tBTA_GATTC *)&cb_data); 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_deregister_cmpl 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description De-Register a GATT client application with BTA completed. 2066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg, tBTA_GATTC_IF client_if) 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_INT_DEREG *p_buf; 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_deregister_cmpl client_if=%d", client_if ); 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (tBTA_GATTC_INT_DEREG *) GKI_getbuf(sizeof(tBTA_GATTC_INT_DEREG))) != NULL) 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.event = BTA_GATTC_INT_DEREG_EVT; 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->client_if = client_if; 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("bta_gattc_deregister_cmpl unable to allocate buffer to complete dereg=%d", client_if); 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_deregister 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description De-Register a GATT client application with BTA. 2346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_int_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data) 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_IF client_if = p_data->int_dereg.client_if; 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CBACK *p_cback; 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clreg; 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_int_deregister_cmpl client_if=%d", client_if ); 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL) 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cback = p_clreg->p_cback; 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GATT_Deregister(client_if); 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(p_clreg, 0, sizeof(tBTA_GATTC_RCB)); 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.client_if = client_if; 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.reg_oper.status = BTA_GATT_OK; 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cback) 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* callback with de-register event */ 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_cback)(BTA_GATTC_DEREG_EVT, (tBTA_GATTC *)&cb_data); 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("bta_gattc_int_deregister Deregister Failed, unknown client_if: %d", p_data->int_dereg.client_if); 2646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_deregister 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description De-Register a GATT client application with BTA. 2736ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data) 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clreg; 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR buf; 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clreg = bta_gattc_cl_get_regcb(p_data->api_dereg.client_if)) != NULL) 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clreg->num_clcb > 0) 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* close all CLCB related to this app */ 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i= 0; i < BTA_GATTC_CLCB_MAX; i ++) 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->clcb[i].in_use && (p_cb->clcb[i].p_rcb == p_clreg)) 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clreg->dereg_pending = TRUE; 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach buf.event = BTA_GATTC_API_CLOSE_EVT; 2956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach buf.layer_specific = p_cb->clcb[i].bta_conn_id; 2966ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_close(&p_cb->clcb[i], (tBTA_GATTC_DATA *)&buf) ; 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_deregister_cmpl(p_clreg, p_clreg->client_if); 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("bta_gattc_deregister Deregister Failed, unknown client_if: %d", p_data->api_dereg.client_if); 3066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_process_api_open 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description process connect API request. 3136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 event = ((BT_HDR *)p_msg)->event; 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CLCB *p_clcb = NULL; 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_conn.client_if); 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clreg != NULL) 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_msg->api_conn.is_direct) 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if, 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->api_conn.remote_bda)) != NULL) 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, event, p_msg); 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("No resources to open a new connection."); 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3366ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_send_open_cback(p_clreg, 3376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTA_GATT_NO_RESOURCES, 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->api_conn.remote_bda, 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATT_INVALID_CONN_ID); 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_init_bk_conn(&p_msg->api_conn, p_clreg); 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3496ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_ERROR1("bta_gattc_process_api_open Failed, unknown client_if: %d", 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->api_conn.client_if); 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_process_api_open_cancel 356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description process connect API request. 3586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) 363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 event = ((BT_HDR *)p_msg)->event; 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CLCB *p_clcb = NULL; 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clreg; 367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status = BTA_GATT_ERROR; 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_msg->api_cancel_conn.is_direct) 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if, 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->api_cancel_conn.remote_bda)) != NULL) 373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, event, p_msg); 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("No such connection need to be cancelled"); 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if); 381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clreg && p_clreg->p_cback) 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, (tBTA_GATTC *)&status); 385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_cancel_bk_conn(&p_msg->api_cancel_conn); 391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_cancel_open_error 398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 4006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_cancel_open_error(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status=BTA_GATT_ERROR; 407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( p_clcb->p_rcb->p_cback ) 409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, (tBTA_GATTC *)&status); 410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_open_error 415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 4176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_open_error(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("Connection already opened. wrong state"); 424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_send_open_cback(p_clcb->p_rcb, 4266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTA_GATT_ALREADY_OPEN, 427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bda, 428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id); 429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_open_fail 433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 4356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_open_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_open_error(p_clcb, p_data); 442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* open failure, remove clcb */ 443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_clcb_dealloc(p_clcb); 444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_open 449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process API connection function. 4516ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_DATA gattc_data; 4586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* open/hold a connection */ 460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, TRUE)) 461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("Connection open failure"); 463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data); 465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* a connected remote device */ 4696ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (GATT_GetConnIdIfConnected(p_clcb->p_rcb->client_if, 4706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_data->api_conn.remote_bda, 471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_clcb->bta_conn_id)) 4726ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach gattc_data.hdr.layer_specific = p_clcb->bta_conn_id; 474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data); 476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* else wait for the callback event */ 478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_init_bk_conn 483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process API Open for a background connection 4856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg) 490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status = BTA_GATT_NO_RESOURCES; 492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 conn_id; 493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CLCB *p_clcb; 494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_DATA gattc_data; 495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, TRUE)) 497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* alwaya call open to hold a connection */ 499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE)) 500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_GATT_ERROR; 5026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_ERROR0("bta_gattc_init_bk_conn failed"); 503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_GATT_OK; 507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if is a connected remote device */ 5096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (GATT_GetConnIdIfConnected(p_data->client_if, 5106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_data->remote_bda, 511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &conn_id)) 5126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clcb = bta_gattc_clcb_alloc(p_data->client_if, p_data->remote_bda)) != NULL) 5146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id; 516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* open connection */ 518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data); 519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_GATT_OK; 520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 5246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* open failure, report OPEN_EVT */ 526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status != BTA_GATT_OK) 527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda, BTA_GATT_INVALID_CONN_ID); 529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_cancel_bk_conn 534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process API Cancel Open for a background connection 5366ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN *p_data) 541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clreg; 543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status = BTA_GATT_ERROR; 544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* remove the device from the bg connection mask */ 546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, FALSE)) 547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (GATT_CancelConnect(p_data->client_if, p_data->remote_bda, FALSE)) 549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_GATT_OK; 551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("bta_gattc_cancel_bk_conn failed"); 555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clreg = bta_gattc_cl_get_regcb(p_data->client_if); 5586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clreg && p_clreg->p_cback) 560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, (tBTA_GATTC *)&status); 562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_int_cancel_open_ok 568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 5696ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 5706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status = BTA_GATT_OK; 577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( p_clcb->p_rcb->p_cback ) 579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, (tBTA_GATTC *)&status); 581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_clcb_dealloc(p_clcb); 584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_cancel_open 589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 5906ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 5916ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_cancel_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status=BTA_GATT_ERROR; 598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (GATT_CancelConnect(p_clcb->p_rcb->client_if, p_data->api_cancel_conn.remote_bda, TRUE)) 600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CANCEL_OPEN_OK_EVT, p_data); 602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( p_clcb->p_rcb->p_cback ) 606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, (tBTA_GATTC *)&status); 608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_conn 614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description receive connection callback from stack 6166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_conn(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_IF gatt_if; 623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state); 624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data != NULL) 626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific); 628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->connected = TRUE; 630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id = p_data->hdr.layer_specific; 631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GATT_GetConnectionInfor(p_data->hdr.layer_specific, &gatt_if, p_clcb->bda); 632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* start database cache if needed */ 634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_srcb->p_srvc_cache == NULL) 635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) 637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->state = BTA_GATTC_SERV_LOAD; 639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_START_CACHE_EVT, p_data); 640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* cache is building */ 642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->state = BTA_GATTC_DISCOVER_ST; 643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 6446ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 6456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach else 646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* a pending service handle change indication */ 648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_srcb->srvc_hdl_chg) 649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->srvc_hdl_chg = FALSE; 651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* start discovery */ 652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); 653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 6556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_rcb) 6576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 6586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_send_open_cback(p_clcb->p_rcb, 6596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTA_GATT_OK, 6606ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_clcb->bda, 6616ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_clcb->bta_conn_id); 662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 6656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_close_fail 669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description close a connection. 6716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_close_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( p_clcb->p_rcb->p_cback ) 680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&cb_data, 0, sizeof(tBTA_GATTC)); 682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.client_if = p_clcb->p_rcb->client_if; 683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.conn_id = p_data->hdr.layer_specific; 684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(cb_data.close.remote_bda, p_clcb->bda); 685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.status = BTA_GATT_ERROR; 686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.reason = BTA_GATT_CONN_NONE; 687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CLOSE_EVT, &cb_data); 690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_api_close 695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description close a GATTC connection. 6976ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CBACK *p_cback = p_clcb->p_rcb->p_cback; 704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clreg = p_clcb->p_rcb; 705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id); 7086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT) 710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->status = GATT_Disconnect(p_clcb->bta_conn_id); 7116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.client_if = p_clcb->p_rcb->client_if; 713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.conn_id = p_clcb->bta_conn_id; 714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.status = p_clcb->status; 715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.close.reason = p_clcb->reason; 716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(cb_data.close.remote_bda, p_clcb->bda); 717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->status == BTA_GATT_OK) 719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if the srcb is no longer needed, reset the state */ 721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( -- p_clcb->p_srcb->num_clcb == 0) 722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("Update srcb connection status"); 724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->connected = FALSE; 725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE; 726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_clcb_dealloc(p_clcb); 729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ( * p_cback)(BTA_GATTC_CLOSE_EVT, (tBTA_GATTC *)&cb_data); 732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (-- p_clreg->num_clcb == 0 && p_clreg->dereg_pending) 734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_deregister_cmpl(p_clreg, p_clreg->client_if); 736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 7376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_reset_discover_st 743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description when a SRCB finished discovery, tell all related clcb. 7456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_reset_discover_st(tBTA_GATTC_SERV *p_srcb) 750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CB *p_cb = &bta_gattc_cb; 752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++) 755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->clcb[i].p_srcb == p_srcb) 757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(&p_cb->clcb[i], BTA_GATTC_DISCOVER_CMPL_EVT, NULL); 759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_set_discover_st 765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 7666ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description when a SRCB start discovery, tell all related clcb and set 767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** the state. 7686ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_set_discover_st(tBTA_GATTC_SERV *p_srcb) 773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CB *p_cb = &bta_gattc_cb; 775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_EnableUpdateBleConnParams(p_srcb->server_bda, FALSE); 779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++) 781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->clcb[i].p_srcb == p_srcb) 783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->clcb[i].state = BTA_GATTC_DISCOVER_ST; 785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_start_discover 791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Start a discovery on server. 7936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_start_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* pending operation, wait until it finishes */ 800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_start_discover conn_id=%d",p_clcb->bta_conn_id); 802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_q_cmd != NULL && p_clcb->auto_update == BTA_GATTC_NO_SCHEDULE && 803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) 804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 8056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_clcb->auto_update = BTA_GATTC_DISC_WAITING; 806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->state = BTA_GATTC_CONN_ST; /* set clcb state */ 807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* no pending operation, start discovery right away */ 809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->auto_update = BTA_GATTC_NO_SCHEDULE; 811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_srcb != NULL) 813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* clear the service change mask */ 815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->srvc_hdl_chg = FALSE; 816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->update_count = 0; 817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* set all srcb related clcb into discovery ST */ 819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_set_discover_st(p_clcb->p_srcb); 820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_gattc_init_cache(p_clcb->p_srcb) || 822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_discover_pri_service(p_clcb->bta_conn_id, p_clcb->p_srcb, GATT_DISC_SRVC_ALL) != BTA_GATT_OK) 823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("discovery on server failed"); 825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_reset_discover_st(p_clcb->p_srcb); 826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("unknown device, can not start discovery"); 831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_disc_cmpl 837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description discovery on server is finished 8396ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_disc_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_DATA *p_q_cmd = p_clcb->p_q_cmd; 846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id); 847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE); 850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE; 852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* release pending attribute list buffer */ 854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&p_clcb->p_srcb->p_srvc_list); 855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get any queued command to proceed */ 857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_q_cmd != NULL) 858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_q_cmd = NULL; 860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd); 862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&p_q_cmd); 864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_read 870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Read an attribute 8726ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_read(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 handle = 0; 879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tGATT_READ_PARAM read_param; 880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_OP_CMPL op_cmpl; 881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&read_param, 0 ,sizeof(tGATT_READ_PARAM)); 883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&op_cmpl, 0 ,sizeof(tBTA_GATTC_OP_CMPL)); 884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_enqueue(p_clcb, p_data)) 886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((handle = bta_gattc_id2handle(p_clcb->p_srcb, 888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->api_read.srvc_id, 889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->api_read.char_id, 890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->api_read.descr_type)) == 0) 891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.status = BTA_GATT_ERROR; 893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach read_param.by_handle.handle = handle; 897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach read_param.by_handle.auth_req = p_data->api_read.auth_req; 898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_BY_HANDLE, &read_param); 900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* read fail */ 903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (op_cmpl.status != BTA_GATT_OK) 904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.op_code = GATTC_OPTYPE_READ; 906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.p_cmpl = NULL; 907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl); 909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_read_multi 915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description read multiple 9176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*********************************************************************************/ 920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_read_multi(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 i, handle; 923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status = BTA_GATT_OK; 924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tGATT_READ_PARAM read_param; 925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_OP_CMPL op_cmpl; 9266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach tBTA_GATTC_ATTR_ID *p_id; 927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID dummy_uuid; 928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_enqueue(p_clcb, p_data)) 930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&dummy_uuid, 0, sizeof(tBT_UUID)); 932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&read_param, 0, sizeof(tGATT_READ_PARAM)); 933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 934e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_id = p_data->api_read_multi.p_id_list; 935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < p_data->api_read_multi.num_attr && p_id; i ++, p_id ++) 937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach handle = 0; 939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_id->id_type == BTA_GATT_TYPE_CHAR) 941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach handle = bta_gattc_id2handle(p_clcb->p_srcb, 943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_id->id_value.char_id.srvc_id, 944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_id->id_value.char_id.char_id, 945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach dummy_uuid); 946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 947e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (p_id->id_type == BTA_GATT_TYPE_CHAR_DESCR) 948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach handle = bta_gattc_id2handle(p_clcb->p_srcb, 950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_id->id_value.char_descr_id.char_id.srvc_id, 951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_id->id_value.char_descr_id.char_id.char_id, 952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_id->id_value.char_descr_id.descr_type); 953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 954e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 956e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("invalud ID type: %d", p_id->id_type); 957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (handle == 0) 960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_GATT_ERROR; 962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status == BTA_GATT_OK) 966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach read_param.read_multiple.num_handles = p_data->api_read_multi.num_attr; 968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach read_param.read_multiple.auth_req = p_data->api_read_multi.auth_req; 969e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 970e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_MULTIPLE, &read_param); 971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 972e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* read fail */ 974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status != BTA_GATT_OK) 975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 976e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL)); 977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.status = status; 979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.op_code = GATTC_OPTYPE_READ; 980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.p_cmpl = NULL; 981e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl); 983e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_write 989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Write an attribute 9916ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_write(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 handle = 0; 998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tGATT_VALUE attr = {0}; 999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_OP_CMPL op_cmpl; 1000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status = BTA_GATT_OK; 1001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_enqueue(p_clcb, p_data)) 1003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((handle = bta_gattc_id2handle(p_clcb->p_srcb, 1005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->api_write.srvc_id, 1006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->api_write.char_id, 1007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->api_write.descr_type)) == 0) 1008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_GATT_ERROR; 1010e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach attr.handle= handle; 1014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach attr.offset = p_data->api_write.offset; 1015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach attr.len = p_data->api_write.len; 1016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach attr.auth_req = p_data->api_write.auth_req; 1017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1018e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->api_write.p_value) 1019e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(attr.value, p_data->api_write.p_value, p_data->api_write.len); 1020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = GATTC_Write(p_clcb->bta_conn_id, p_data->api_write.write_type, &attr); 1022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* write fail */ 1025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status != BTA_GATT_OK) 1026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL)); 1028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.status = status; 1030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.op_code = GATTC_OPTYPE_WRITE; 1031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.p_cmpl = NULL; 1032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl); 1034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1039e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_execute 1040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description send execute write 10426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*********************************************************************************/ 1045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_execute(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1046e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_OP_CMPL op_cmpl; 1048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status; 1049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_enqueue(p_clcb, p_data)) 1051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1052e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = GATTC_ExecuteWrite(p_clcb->bta_conn_id, p_data->api_exec.is_execute); 1053e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status != BTA_GATT_OK) 1055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL)); 1057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.status = status; 1059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.op_code = GATTC_OPTYPE_EXE_WRITE; 1060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach op_cmpl.p_cmpl = NULL; 1061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl); 1063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_confirm 1070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description send handle value confirmation 10726ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_confirm(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 10786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach UINT16 handle; 1079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID null_uuid = {0}; 1080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((handle = bta_gattc_id2handle(p_clcb->p_srcb, 1082e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->api_confirm.srvc_id, 1083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->api_confirm.char_id, 1084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach null_uuid)) == 0) 1085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("Can not map service/char ID into valid handle"); 1087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1090e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific, handle) 1091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach != GATT_SUCCESS) 1092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("bta_gattc_confirm to handle [0x%04x] failed", handle); 1094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1098e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1099e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_read_cmpl 1100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description read complete 11026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_read_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) 1107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 event; 1109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 1110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_READ_VAL read_value; 1111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&cb_data, 0, sizeof(tBTA_GATTC)); 1113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&read_value, 0, sizeof(tBTA_GATT_READ_VAL)); 1114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.status = p_data->status; 1116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->p_cmpl != NULL && p_data->status == BTA_GATT_OK) 1118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 11196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (bta_gattc_handle2id(p_clcb->p_srcb, 11206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_data->p_cmpl->att_value.handle, 11216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach &cb_data.read.srvc_id, 11226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach &cb_data.read.char_id, 1123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &cb_data.read.descr_type) == FALSE) 1124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.status = BTA_GATT_INTERNAL_ERROR; 1126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("can not map to GATT ID. handle = 0x%04x", p_data->p_cmpl->att_value.handle); 1127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.status = bta_gattc_pack_read_cb_data(p_clcb->p_srcb, 11316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach cb_data.read.descr_type, 11326ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach &p_data->p_cmpl->att_value, 1133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &read_value); 1134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.p_value = &read_value; 11356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 1136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.srvc_id = p_clcb->p_q_cmd->api_read.srvc_id; 1140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.char_id = p_clcb->p_q_cmd->api_read.char_id; 1141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.descr_type = p_clcb->p_q_cmd->api_read.descr_type; 1142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = (p_clcb->p_q_cmd->api_read.descr_type.len == 0) ? BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT; 1145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.read.conn_id = p_clcb->bta_conn_id; 1146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&p_clcb->p_q_cmd); 1148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* read complete, callback */ 1149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ( *p_clcb->p_rcb->p_cback)(event, (tBTA_GATTC *)&cb_data); 1150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_write_cmpl 1155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description read complete 11576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_write_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) 1162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data = {0}; 1164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 event; 1165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.write.status = p_data->status; 1167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->p_cmpl != NULL) 1169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 11706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_handle2id(p_clcb->p_srcb, p_data->p_cmpl->handle, 11716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach &cb_data.write.srvc_id, &cb_data.write.char_id, 1172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &cb_data.write.descr_type); 1173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.write.srvc_id = p_clcb->p_q_cmd->api_write.srvc_id; 1177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.write.char_id = p_clcb->p_q_cmd->api_write.char_id; 1178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.write.descr_type = p_clcb->p_q_cmd->api_write.descr_type; 1179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_q_cmd->api_write.hdr.event == BTA_GATTC_API_WRITE_EVT && 1182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_q_cmd->api_write.write_type == BTA_GATTC_WRITE_PREPARE) 1183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = BTA_GATTC_PREP_WRITE_EVT; 1185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (p_clcb->p_q_cmd->api_write.descr_type.len == 0) 1187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = BTA_GATTC_WRITE_CHAR_EVT; 1189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = BTA_GATTC_WRITE_DESCR_EVT; 1192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&p_clcb->p_q_cmd); 1194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.write.conn_id = p_clcb->bta_conn_id; 1195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* write complete, callback */ 1196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ( *p_clcb->p_rcb->p_cback)(event, (tBTA_GATTC *)&cb_data); 1197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_exec_cmpl 1202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description execute write complete 12046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_exec_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) 1209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 1211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&p_clcb->p_q_cmd); 1213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->status = BTA_GATT_OK; 1215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* execute complete, callback */ 1217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.exec_cmpl.conn_id = p_clcb->bta_conn_id; 12186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach cb_data.exec_cmpl.status = p_data->status; 1219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_EXEC_EVT, &cb_data); 1221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_op_cmpl 1228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description operation completed. 12306ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 op = (UINT8)p_data->op_cmpl.op_code; 1237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 mapped_op = 0; 1238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_op_cmpl op = %d", op); 1240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION) 1242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("unexpected operation, ignored"); 1244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (op >= GATTC_OPTYPE_READ) 1246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_q_cmd == NULL) 1248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("No pending command"); 1250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ]) 1253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT + GATTC_OPTYPE_READ; 1255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( mapped_op > GATTC_OPTYPE_INDICATION) mapped_op = 0; 1256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BT_TRACE_VERBOSE == TRUE) 12586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_ERROR3("expect op:(%s :0x%04x), receive unexpected operation (%s).", 12596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event, 1260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_op_code_name[op]); 1261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 12626ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_ERROR3("expect op:(%u :0x%04x), receive unexpected operation (%u).", 1263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mapped_op , p_clcb->p_q_cmd->hdr.event, op); 1264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* service handle change void the response, discard it */ 1269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) 1270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 12716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_clcb->auto_update = BTA_GATTC_REQ_WAITING; 12726ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); 1273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (op == GATTC_OPTYPE_READ) 1275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl); 1276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (op == GATTC_OPTYPE_WRITE) 1278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_write_cmpl(p_clcb, &p_data->op_cmpl); 1279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (op == GATTC_OPTYPE_EXE_WRITE) 1281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_exec_cmpl(p_clcb, &p_data->op_cmpl); 1282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* 12836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach else if (op == GATTC_OPTYPE_CONFIG) // API to be added 1284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach */ 1287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_op_cmpl 1292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description operation completed. 12946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_ignore_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 13006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* receive op complete when discovery is started, ignore the response, 1301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach and wait for discovery finish and resent */ 1302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_ignore_op_cmpl op = %d", p_data->hdr.layer_specific); 1303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_search 1308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description start a search in the local server cache 13106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_search(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATT_STATUS status = GATT_INTERNAL_ERROR; 1317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC cb_data; 1318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id); 1319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) 1320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_GATT_OK; 1322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* search the local cache of a server device */ 1323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_search_service(p_clcb, p_data->api_search.srvc_uuid); 1324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.search_cmpl.status = status; 1326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cb_data.search_cmpl.conn_id = p_clcb->bta_conn_id; 1327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* end of search or no server cache available */ 1329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_CMPL_EVT, &cb_data); 1330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_q_cmd 1334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description enqueue a command into control block, usually because discovery 1336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** operation is busy. 13376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_q_cmd(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_enqueue(p_clcb, p_data); 1344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_cache_open 1348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description open a NV cache for loading 13506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_cache_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_set_discover_st(p_clcb->p_srcb); 1357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id); 13596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_co_cache_open(p_clcb->p_srcb->server_bda, BTA_GATTC_CI_CACHE_OPEN_EVT, 1360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id, FALSE); 1361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_start_load 1365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description start cache loading by sending callout open cache 13676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_ci_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2("bta_gattc_ci_open conn_id=%d server state=%d" , 1374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id, p_clcb->p_srcb->state); 1375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_srcb->state == BTA_GATTC_SERV_LOAD) 1376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->ci_open.status == BTA_GATT_OK) 1378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->attr_index = 0; 13806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda, 13816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTA_GATTC_CI_CACHE_LOAD_EVT, 1382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->attr_index, 1383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id); 1384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* cache open failure, start discovery */ 1388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_start_discover(p_clcb, NULL); 1389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_srcb->state == BTA_GATTC_SERV_SAVE) 1392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->ci_open.status == BTA_GATT_OK) 1394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id)) 1396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ci_open.status = BTA_GATT_ERROR; 1398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->ci_open.status != BTA_GATT_OK) 1401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->attr_index = 0; 1403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, p_clcb->bta_conn_id); 1404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_reset_discover_st(p_clcb->p_srcb); 1405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_ci_load 1412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description cache loading received. 14146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2("bta_gattc_ci_load conn_id=%d load status=%d" , 1422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id, p_data->ci_load.status ); 1423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0); 1424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 14256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_data->ci_load.status == BTA_GATT_OK || 14266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_data->ci_load.status == BTA_GATT_MORE) && 1427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ci_load.num_attr > 0) 1428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr, p_data->ci_load.attr, p_clcb->p_srcb->attr_index); 1430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->ci_load.status == BTA_GATT_OK) 1432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->attr_index = 0; 1434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_reset_discover_st(p_clcb->p_srcb); 1435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* load more */ 1438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->attr_index += p_data->ci_load.num_attr; 1440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 14416ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda, 14426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTA_GATTC_CI_CACHE_LOAD_EVT, 14436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_clcb->p_srcb->attr_index, 1444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id); 1445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->attr_index = 0; 1450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* cache open failure, start discovery */ 1451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_start_discover(p_clcb, NULL); 1452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_ci_load 1457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description cache loading received. 14596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_ci_save(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_gattc_ci_save conn_id=%d " , 1466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id ); 1467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id)) 1469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->p_srcb->attr_index = 0; 14716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0); 1472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_reset_discover_st(p_clcb->p_srcb); 1473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_fail 1479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description report API call failure back to apps 14816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 1486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->status == BTA_GATT_OK) 1488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("operation not supported at current state [%d]", p_clcb->state); 1490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_conn_cback 1495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** bta_gattc_cmpl_cback 1496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description callback functions to GATT client stack. 14986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 15026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachstatic void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id, 1503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN connected, tGATT_DISCONN_REASON reason) 1504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_buf; 1506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CLCB *p_clcb = NULL; 1507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 15086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_DEBUG4("bta_gattc_conn_cback: cif = %d connected = %d conn_id = %d reaosn = 0x%04x", 1509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach gattc_if, connected, conn_id, reason); 1510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (connected) 1512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* outgoing connection : locate a logic channel */ 1514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda)) == NULL) 1515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 15166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 1518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* for a background connection */ 1519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (L2CA_GetBleConnRole(bda)== HCI_ROLE_MASTER && 1520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_check_bg_conn(gattc_if, bda)) 1521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* allocate a new channel */ 1523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb = bta_gattc_clcb_alloc(gattc_if, bda); 1524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb != NULL) 1528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id = conn_id; 1530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 1532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->event = BTA_GATTC_INT_CONN_EVT; 1534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->layer_specific = conn_id; 1535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 1537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* connection attempt timeout, send connection callback event */ 1543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (reason == GATT_CONN_CANCEL ) 1544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb = bta_gattc_clcb_alloc(gattc_if, bda); 1546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id = conn_id; 1547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) != NULL) 1549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 1551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->event = BTA_GATTC_INT_DISCONN_EVT; 1553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->layer_specific = conn_id; 1554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->reason = reason; 1555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 1557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1(" connection ID: [%d] not used by BTA", conn_id); 1562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_process_srvc_chg_ind 1568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description process service change indication. 15706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 15746ef101187774e30ddba6b46bbedef549a42196adAndre EisenbachBOOLEAN bta_gattc_process_srvc_chg_ind(UINT16 conn_id, 1575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clrcb, 15766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach tBTA_GATTC_SERV *p_srcb, 15776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach tBTA_GATTC_CLCB *p_clcb, 15786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach tBTA_GATTC_NOTIFY *p_notify, 1579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 handle) 1580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID gattp_uuid, srvc_chg_uuid; 1582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN processed = FALSE; 1583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 1584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach gattp_uuid.len = 2; 1586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach gattp_uuid.uu.uuid16 = UUID_SERVCLASS_GATT_SERVER; 1587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach srvc_chg_uuid.len = 2; 1589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach srvc_chg_uuid.uu.uuid16 = GATT_UUID_GATT_SRV_CHGD; 1590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_uuid_compare(p_notify->char_id.srvc_id.id.uuid, gattp_uuid, TRUE) && 1592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_uuid_compare(p_notify->char_id.char_id.uuid, srvc_chg_uuid, TRUE)) 1593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach processed = TRUE; 1595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* mark service handle change pending */ 1596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_srcb->srvc_hdl_chg = TRUE; 1597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* clear up all notification/indication registration */ 1598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_clear_notif_registration(conn_id); 1599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* service change indication all received, do discovery update */ 1600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( ++ p_srcb->update_count == bta_gattc_num_reg_app()) 1601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* not an opened connection; or connection busy */ 16036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* search for first available clcb and start discovery */ 1604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb == NULL || (p_clcb && p_clcb->p_q_cmd != NULL)) 1605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0 ; i < BTA_GATTC_CLCB_MAX; i ++) 1607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 16086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (bta_gattc_cb.clcb[i].in_use && 1609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_cb.clcb[i].p_srcb == p_srcb && 1610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_cb.clcb[i].p_q_cmd == NULL) 1611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb = &bta_gattc_cb.clcb[i]; 1613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send confirmation here if this is an indication, it should always be */ 1618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GATTC_SendHandleValueConfirm(conn_id, handle); 16196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if connection available, refresh cache by doing discovery now */ 1621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb != NULL) 1622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); 16236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 1624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* notify applicationf or service change */ 1625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clrcb->p_cback != NULL) 1626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("bta_gattc_process_srvc_chg_ind 2"); 1628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (* p_clrcb->p_cback)(BTA_GATTC_SRVC_CHG_EVT, (tBTA_GATTC *)p_srcb->server_bda); 1629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 16306ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return processed; 1634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_proc_other_indication 1639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description process all non-service change indication/notification. 16416ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 16456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachvoid bta_gattc_proc_other_indication(tBTA_GATTC_CLCB *p_clcb, UINT8 op, 1646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tGATT_CL_COMPLETE *p_data, 1647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_NOTIFY *p_notify) 1648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2("bta_gattc_proc_other_indication check \ 16506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_data->att_value.handle=%d p_data->handle=%d", 16516ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_data->att_value.handle, p_data->handle); 1652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("is_notify", p_notify->is_notify); 1653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? FALSE : TRUE; 1655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_notify->len = p_data->att_value.len; 1656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_notify->bda, p_clcb->bda); 1657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p_notify->value, p_data->att_value.value, p_data->att_value.len); 1658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_notify->conn_id = p_clcb->bta_conn_id; 1659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb->p_rcb->p_cback) 1661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_clcb->p_rcb->p_cback)(BTA_GATTC_NOTIF_EVT, (tBTA_GATTC *)p_notify); 16626ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_process_indicate 1667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description process indication/notification. 16696ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_gattc_process_indicate(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_CL_COMPLETE *p_data) 1674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 16756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach UINT16 handle = p_data->att_value.handle; 1676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CLCB *p_clcb ; 1677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_RCB *p_clrcb = NULL; 1678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_SERV *p_srcb = NULL; 1679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_NOTIFY notify; 1680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_ADDR remote_bda; 1681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_IF gatt_if; 1682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda)) 1684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("indication/notif for unknown app"); 1686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) == NULL) 1690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("indication/notif for unregistered app"); 1692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL) 1696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("indication/notif for unknown device, ignore"); 1698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); 1702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 17036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (bta_gattc_handle2id(p_srcb, handle, 17046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ¬ify.char_id.srvc_id, 17056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ¬ify.char_id.char_id, 1706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ¬ify.descr_type)) 1707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if non-service change indication/notification, forward to application */ 1709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bta_gattc_process_srvc_chg_ind(conn_id, p_clrcb, p_srcb, p_clcb, ¬ify, handle)) 1710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if app registered for the notification */ 1712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, ¬ify)) 1713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* connection not open yet */ 1715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_clcb == NULL) 1716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda)) != NULL) 1718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_clcb->bta_conn_id = conn_id; 1720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send connection event */ 17226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_send_open_cback(p_clrcb, 17236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTA_GATT_OK, 1724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach remote_bda, 1725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach conn_id); 1726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("No resources"); 1730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 17336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (p_clcb != NULL) 17346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_gattc_proc_other_indication(p_clcb, op, p_data, ¬ify); 1735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* no one intersted and need ack? */ 1737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (op == GATTC_OPTYPE_INDICATION) 1738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 17396ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_DEBUG0("no one interested, ack now"); 17406ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach GATTC_SendHandleValueConfirm(conn_id, handle); 1741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 17436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 1744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("Indi/Notif for Unknown handle[0x%04x], can not find in local cache.", handle); 1747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_gattc_cmpl_cback 1753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description client operation complete callback register with BTE GATT. 17556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 1756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None. 1757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 17596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachstatic void bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, 1760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tGATT_CL_COMPLETE *p_data) 1761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_CLCB *p_clcb ; 1763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_GATTC_OP_CMPL *p_buf; 1764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE); 1765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 17666ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_DEBUG3("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d", 1767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach conn_id, op, status); 1768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* notification and indication processed right away */ 1770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (op == GATTC_OPTYPE_NOTIFICATION || op == GATTC_OPTYPE_INDICATION) 1771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_gattc_process_indicate(conn_id, op, p_data); 1773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* for all other operation, not expected if w/o connection */ 1776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) == NULL) 17776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 1778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("bta_gattc_cmpl_cback unknown conn_id = %d, ignore data", conn_id); 1779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (tBTA_GATTC_OP_CMPL *) GKI_getbuf(len)) != NULL) 1784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(p_buf, 0, len); 1786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.event = BTA_GATTC_OP_CMPL_EVT; 1787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.layer_specific = conn_id; 1788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->status = status; 1789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->op_code = op; 1790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data != NULL) 1792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->p_cmpl = (tGATT_CL_COMPLETE *)(p_buf + 1); 1794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p_buf->p_cmpl, p_data, sizeof(tGATT_CL_COMPLETE)); 1795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 1798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* BTA_GATT_INCLUDED */ 1803