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                            &notify.char_id.srvc_id,
17056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                            &notify.char_id.char_id,
1706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            &notify.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, &notify, handle))
1710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if app registered for the notification */
1712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, &notify))
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, &notify);
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