15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2003-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the GATT client action functions for the state
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  machine.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gattc_int.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 BOOLEAN connected, tGATT_DISCONN_REASON reason);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void  bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  tGATT_CL_COMPLETE *p_data);
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tGATT_CBACK bta_gattc_cl_cback =
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_conn_cback,
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_cmpl_cback,
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_disc_res_cback,
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_disc_cmpl_cback,
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT16 bta_gattc_opcode_to_int_evt[] =
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_GATTC_API_READ_EVT,
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_GATTC_API_WRITE_EVT,
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_GATTC_API_EXEC_EVT
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char *bta_gattc_op_code_name[] =
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Unknown",
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Discovery",
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Read",
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Write",
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Exec",
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Config",
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Notification",
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Indication"
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Action Functions
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_register
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register a GATT client application with BTA.
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_register(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data)
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC               cb_data;
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                    i;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID                 *p_app_uuid = &p_data->api_reg.app_uuid;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_INT_START_IF  *p_buf;
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* todo need to check duplicate uuid */
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTC_CL_MAX; i ++)
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_cb->cl_rcb[i].in_use)
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_app_uuid == NULL) || (p_cb->cl_rcb[i].client_if = GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0)
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("Register with GATT stack failed.");
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.reg_oper.status = BTA_GATT_ERROR;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->cl_rcb[i].in_use = TRUE;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->cl_rcb[i].p_cback = p_data->api_reg.p_cback;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&p_cb->cl_rcb[i].app_uuid, p_app_uuid, sizeof(tBT_UUID));
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* BTA use the same client interface as BTE GATT statck */
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.reg_oper.client_if = p_cb->cl_rcb[i].client_if;
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&(cb_data.reg_oper.app_uuid),p_app_uuid,sizeof(tBT_UUID));
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.reg_oper.status = BTA_GATT_OK;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_buf = (tBTA_GATTC_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTC_INT_START_IF))) != NULL)
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->hdr.event    = BTA_GATTC_INT_START_IF_EVT;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->client_if    = p_cb->cl_rcb[i].client_if;
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_sys_sendmsg(p_buf);
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    cb_data.reg_oper.status = BTA_GATT_NO_RESOURCES;
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memset( &p_cb->cl_rcb[i], 0 , sizeof(tBTA_GATTC_RCB));
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* callback with register event */
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->api_reg.p_cback)
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_data->api_reg.p_cback)(BTA_GATTC_REG_EVT,  (tBTA_GATTC *)&cb_data);
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_start_if
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      start an application interface.
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_start_if(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg)
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_cl_get_regcb(p_msg->int_start_if.client_if) !=NULL )
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GATT_StartIf(p_msg->int_start_if.client_if);
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if );
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_deregister_cmpl
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      De-Register a GATT client application with BTA completed.
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_int_deregister_cmpl(tBTA_GATTC_RCB *p_clreg, tBTA_GATTC_IF client_if)
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CBACK    *p_cback = p_clreg->p_cback;
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC          cb_data;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_int_deregister_cmpl client_if=%d", client_if );
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATT_Deregister(p_clreg->client_if);
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_clreg, 0, sizeof(tBTA_GATTC_RCB));
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.client_if = client_if;
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.status    = BTA_GATT_OK;
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cback)
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* callback with de-register event */
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cback)(BTA_GATTC_DEREG_EVT,  (tBTA_GATTC *)&cb_data);
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_deregister_cmpl
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      De-Register a GATT client application with BTA completed.
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg, tBTA_GATTC_IF client_if)
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_INT_DEREG  *p_buf;
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_deregister_cmpl client_if=%d", client_if );
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (tBTA_GATTC_INT_DEREG *) GKI_getbuf(sizeof(tBTA_GATTC_INT_DEREG))) != NULL)
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.event = BTA_GATTC_INT_DEREG_EVT;
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->client_if = client_if;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_gattc_deregister_cmpl unable to allocate buffer to complete dereg=%d", client_if);
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_deregister
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      De-Register a GATT client application with BTA.
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_int_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data)
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_IF       client_if = p_data->int_dereg.client_if;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CBACK    *p_cback;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC          cb_data;
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_RCB      *p_clreg;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_int_deregister_cmpl client_if=%d", client_if );
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cback = p_clreg->p_cback;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GATT_Deregister(client_if);
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_clreg, 0, sizeof(tBTA_GATTC_RCB));
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.reg_oper.client_if = client_if;
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.reg_oper.status    = BTA_GATT_OK;
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cback)
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* callback with de-register event */
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_cback)(BTA_GATTC_DEREG_EVT,  (tBTA_GATTC *)&cb_data);
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_gattc_int_deregister Deregister Failed, unknown client_if: %d", p_data->int_dereg.client_if);
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_deregister
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      De-Register a GATT client application with BTA.
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data)
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_RCB      *p_clreg;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               i;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR              buf;
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_clreg = bta_gattc_cl_get_regcb(p_data->api_dereg.client_if)) != NULL)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clreg->num_clcb > 0)
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* close all CLCB related to this app */
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i= 0; i < BTA_GATTC_CLCB_MAX; i ++)
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_cb->clcb[i].in_use && (p_cb->clcb[i].p_rcb == p_clreg))
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_clreg->dereg_pending = TRUE;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    buf.event = BTA_GATTC_API_CLOSE_EVT;
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    buf.layer_specific = p_cb->clcb[i].bta_conn_id;
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_gattc_close(&p_cb->clcb[i], (tBTA_GATTC_DATA *)&buf)  ;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_deregister_cmpl(p_clreg, p_clreg->client_if);
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_gattc_deregister Deregister Failed, unknown client_if: %d", p_data->api_dereg.client_if);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_process_api_open
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process connect API request.
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 event = ((BT_HDR *)p_msg)->event;
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CLCB *p_clcb = NULL;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_conn.client_if);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clreg != NULL)
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_msg->api_conn.is_direct)
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if,
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_msg->api_conn.remote_bda)) != NULL)
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_sm_execute(p_clcb, event, p_msg);
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("No resources to open a new connection.");
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_send_open_cback(p_clreg,
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          BTA_GATT_NO_RESOURCES,
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_msg->api_conn.remote_bda,
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          BTA_GATT_INVALID_CONN_ID);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_init_bk_conn(&p_msg->api_conn, p_clreg);
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_gattc_process_api_open Failed, unknown client_if: %d",
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->api_conn.client_if);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_process_api_open_cancel
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process connect API request.
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 event = ((BT_HDR *)p_msg)->event;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CLCB *p_clcb = NULL;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_RCB *p_clreg;
361ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC cb_data;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->api_cancel_conn.is_direct)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if,
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                 p_msg->api_cancel_conn.remote_bda)) != NULL)
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(p_clcb, event, p_msg);
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("No such connection need to be cancelled");
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clreg && p_clreg->p_cback)
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
378ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                cb_data.status = BTA_GATT_ERROR;
379ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_cancel_bk_conn(&p_msg->api_cancel_conn);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_cancel_open_error
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_cancel_open_error(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC cb_data;
401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    cb_data.status=BTA_GATT_ERROR;
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
403ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ( p_clcb && p_clcb->p_rcb && p_clcb->p_rcb->p_cback )
404ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_open_error
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_open_error(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_ERROR0("Connection already opened. wrong state");
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_send_open_cback(p_clcb->p_rcb,
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              BTA_GATT_ALREADY_OPEN,
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_clcb->bda,
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_clcb->bta_conn_id);
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_open_fail
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_open_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_open_error(p_clcb, p_data);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* open failure, remove clcb */
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_clcb_dealloc(p_clcb);
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_open
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process API connection function.
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_DATA gattc_data;
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* open/hold a connection */
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, TRUE))
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("Connection open failure");
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* a connected remote device */
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (GATT_GetConnIdIfConnected(p_clcb->p_rcb->client_if,
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_data->api_conn.remote_bda,
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      &p_clcb->bta_conn_id))
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gattc_data.hdr.layer_specific = p_clcb->bta_conn_id;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* else wait for the callback event */
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_init_bk_conn
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process API Open for a background connection
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS         status = BTA_GATT_NO_RESOURCES;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                   conn_id;
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CLCB         *p_clcb;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_DATA         gattc_data;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, TRUE, FALSE))
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* alwaya call open to hold a connection */
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE))
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_ERROR;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("bta_gattc_init_bk_conn failed");
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_OK;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if is a connected remote device */
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (GATT_GetConnIdIfConnected(p_data->client_if,
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_data->remote_bda,
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &conn_id))
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_clcb = bta_gattc_clcb_alloc(p_data->client_if, p_data->remote_bda)) != NULL)
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* open connection */
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    status = BTA_GATT_OK;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* open failure, report OPEN_EVT */
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_GATT_OK)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda, BTA_GATT_INVALID_CONN_ID);
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_cancel_bk_conn
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process API Cancel Open for a background connection
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN *p_data)
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_RCB      *p_clreg;
538ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC          cb_data;
539ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    cb_data.status = BTA_GATT_ERROR;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* remove the device from the bg connection mask */
542ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, FALSE, FALSE))
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (GATT_CancelConnect(p_data->client_if, p_data->remote_bda, FALSE))
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            cb_data.status = BTA_GATT_OK;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("bta_gattc_cancel_bk_conn failed");
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clreg = bta_gattc_cl_get_regcb(p_data->client_if);
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clreg && p_clreg->p_cback)
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_int_cancel_open_ok
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC          cb_data;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_clcb->p_rcb->p_cback )
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        cb_data.status = BTA_GATT_OK;
577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_clcb_dealloc(p_clcb);
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_cancel_open
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_cancel_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC          cb_data;
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATT_CancelConnect(p_clcb->p_rcb->client_if, p_data->api_cancel_conn.remote_bda, TRUE))
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CANCEL_OPEN_OK_EVT, p_data);
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( p_clcb->p_rcb->p_cback )
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            cb_data.status = BTA_GATT_ERROR;
604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_conn
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      receive connection callback from stack
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_conn(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_IF   gatt_if;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state);
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data != NULL)
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG1("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->p_srcb->connected = TRUE;
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->bta_conn_id  = p_data->hdr.layer_specific;
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GATT_GetConnectionInfor(p_data->hdr.layer_specific, &gatt_if, p_clcb->bda);
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start database cache if needed */
631ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_clcb->p_srcb->p_srvc_cache == NULL ||
632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_clcb->p_srcb->state != BTA_GATTC_SERV_IDLE)
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE)
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->p_srcb->state = BTA_GATTC_SERV_LOAD;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_sm_execute(p_clcb, BTA_GATTC_START_CACHE_EVT, p_data);
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else /* cache is building */
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->state = BTA_GATTC_DISCOVER_ST;
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* a pending service handle change indication */
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb->p_srcb->srvc_hdl_chg)
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->p_srcb->srvc_hdl_chg = FALSE;
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* start discovery */
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->p_rcb)
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_send_open_cback(p_clcb->p_rcb,
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTA_GATT_OK,
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_clcb->bda,
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_clcb->bta_conn_id);
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_close_fail
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      close a  connection.
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_close_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC           cb_data;
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_clcb->p_rcb->p_cback )
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&cb_data, 0, sizeof(tBTA_GATTC));
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.close.client_if = p_clcb->p_rcb->client_if;
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.close.conn_id   = p_data->hdr.layer_specific;
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(cb_data.close.remote_bda, p_clcb->bda);
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.close.status    = BTA_GATT_ERROR;
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.close.reason    = BTA_GATT_CONN_NONE;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CLOSE_EVT, &cb_data);
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_api_close
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      close a GATTC connection.
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CBACK    *p_cback = p_clcb->p_rcb->p_cback;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_RCB      *p_clreg = p_clcb->p_rcb;
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC           cb_data;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id);
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT)
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->status = GATT_Disconnect(p_clcb->bta_conn_id);
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.close.client_if = p_clcb->p_rcb->client_if;
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.close.conn_id   = p_clcb->bta_conn_id;
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.close.status    = p_clcb->status;
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.close.reason    = p_clcb->reason;
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(cb_data.close.remote_bda, p_clcb->bda);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    bta_gattc_clcb_dealloc(p_clcb);
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ( * p_cback)(BTA_GATTC_CLOSE_EVT,   (tBTA_GATTC *)&cb_data);
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
719ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_clreg->num_clcb == 0 && p_clreg->dereg_pending)
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_deregister_cmpl(p_clreg, p_clreg->client_if);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_reset_discover_st
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      when a SRCB finished discovery, tell all related clcb.
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
733ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_gattc_reset_discover_st(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_STATUS status)
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CB   *p_cb = &bta_gattc_cb;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++)
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->clcb[i].p_srcb == p_srcb)
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->clcb[i].status = status;
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(&p_cb->clcb[i], BTA_GATTC_DISCOVER_CMPL_EVT, NULL);
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_gattc_disc_close
750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      close a GATTC connection while in discovery state.
752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
754ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
756ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_gattc_disc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
758ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    APPL_TRACE_DEBUG1("Discovery cancel conn_id=%d",p_clcb->bta_conn_id);
759ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
760ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_gattc_sm_execute(p_clcb, BTA_GATTC_API_CLOSE_EVT, p_data);
762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_set_discover_st
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      when a SRCB start discovery, tell all related clcb and set
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the state.
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_set_discover_st(tBTA_GATTC_SERV *p_srcb)
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CB   *p_cb = &bta_gattc_cb;
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_EnableUpdateBleConnParams(p_srcb->server_bda, FALSE);
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++)
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->clcb[i].p_srcb == p_srcb)
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->clcb[i].status = BTA_GATT_OK;
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->clcb[i].state = BTA_GATTC_DISCOVER_ST;
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_gattc_restart_discover
793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      process service change in discovery state, mark up the auto
795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  update flag and set status to be discovery cancel for current
796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  discovery.
797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          None.
799ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_gattc_restart_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_clcb->status      = BTA_GATT_CANCEL;
804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
807ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_start_discover
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start a discovery on server.
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_start_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    APPL_TRACE_DEBUG2("bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_clcb->bta_conn_id, p_clcb->p_srcb->state);
820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (((p_clcb->p_q_cmd == NULL || p_clcb->auto_update == BTA_GATTC_REQ_WAITING) &&
822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) ||
823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_clcb->p_srcb->state == BTA_GATTC_SERV_DISC)
824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* no pending operation, start discovery right away */
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->auto_update = BTA_GATTC_NO_SCHEDULE;
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->p_srcb != NULL)
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* clear the service change mask */
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_srcb->srvc_hdl_chg = FALSE;
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_srcb->update_count = 0;
833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC_ACT;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* set all srcb related clcb into discovery ST */
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_set_discover_st(p_clcb->p_srcb);
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if ((p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb)) == BTA_GATT_OK)
839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_clcb->status = bta_gattc_discover_pri_service(p_clcb->bta_conn_id, p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
841ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
842ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_clcb->status != BTA_GATT_OK)
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("discovery on server failed");
845ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("unknown device, can not start discovery");
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* pending operation, wait until it finishes */
854ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
855ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
856ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
857ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
858ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE)
859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_clcb->state = BTA_GATTC_CONN_ST; /* set clcb state */
860ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
861ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_disc_cmpl
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      discovery on server is finished
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_disc_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_DATA *p_q_cmd = p_clcb->p_q_cmd;
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id);
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE);
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
882ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_clcb->status != GATT_SUCCESS)
883ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
884ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* clean up cache */
885ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if(p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache)
886ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            while (p_clcb->p_srcb->cache_buffer.p_first)
888ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
889ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                GKI_freebuf (GKI_dequeue (&p_clcb->p_srcb->cache_buffer));
890ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
891ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_clcb->p_srcb->p_srvc_cache = NULL;
892ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
893ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
894ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* used to reset cache in application */
895ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_gattc_co_cache_reset(p_clcb->p_srcb->server_bda);
896ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* release pending attribute list buffer */
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&p_clcb->p_srcb->p_srvc_list);
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
900ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
901ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
902ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* start discovery again */
903ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
904ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get any queued command to proceed */
906ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else if (p_q_cmd != NULL)
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->p_q_cmd = NULL;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd);
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        utl_freebuf((void **)&p_q_cmd);
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_read
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Read an attribute
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_read(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 handle = 0;
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_READ_PARAM    read_param;
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_OP_CMPL  op_cmpl;
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&read_param, 0 ,sizeof(tGATT_READ_PARAM));
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&op_cmpl, 0 ,sizeof(tBTA_GATTC_OP_CMPL));
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_enqueue(p_clcb, p_data))
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((handle = bta_gattc_id2handle(p_clcb->p_srcb,
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_data->api_read.srvc_id,
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_data->api_read.char_id,
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_data->api_read.descr_type)) == 0)
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.status = BTA_GATT_ERROR;
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            read_param.by_handle.handle = handle;
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            read_param.by_handle.auth_req = p_data->api_read.auth_req;
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_BY_HANDLE, &read_param);
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* read fail */
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (op_cmpl.status != BTA_GATT_OK)
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.op_code = GATTC_OPTYPE_READ;
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.p_cmpl = NULL;
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_read_multi
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      read multiple
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*********************************************************************************/
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_read_multi(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              i, handle;
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = BTA_GATT_OK;
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_READ_PARAM    read_param;
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_OP_CMPL  op_cmpl;
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_ATTR_ID  *p_id;
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID            dummy_uuid;
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_enqueue(p_clcb, p_data))
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&dummy_uuid, 0, sizeof(tBT_UUID));
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&read_param, 0, sizeof(tGATT_READ_PARAM));
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_id = p_data->api_read_multi.p_id_list;
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < p_data->api_read_multi.num_attr && p_id; i ++, p_id ++)
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle = 0;
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_id->id_type == BTA_GATT_TYPE_CHAR)
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                handle = bta_gattc_id2handle(p_clcb->p_srcb,
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     &p_id->id_value.char_id.srvc_id,
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     &p_id->id_value.char_id.char_id,
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     dummy_uuid);
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (p_id->id_type == BTA_GATT_TYPE_CHAR_DESCR)
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                handle = bta_gattc_id2handle(p_clcb->p_srcb,
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     &p_id->id_value.char_descr_id.char_id.srvc_id,
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     &p_id->id_value.char_descr_id.char_id.char_id,
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_id->id_value.char_descr_id.descr_type);
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR1("invalud ID type: %d", p_id->id_type);
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (handle == 0)
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_GATT_ERROR;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == BTA_GATT_OK)
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            read_param.read_multiple.num_handles = p_data->api_read_multi.num_attr;
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            read_param.read_multiple.auth_req = p_data->api_read_multi.auth_req;
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_MULTIPLE, &read_param);
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* read fail */
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != BTA_GATT_OK)
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL));
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.status  = status;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.op_code = GATTC_OPTYPE_READ;
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.p_cmpl  = NULL;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_write
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Write an attribute
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_write(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              handle = 0;
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE         attr = {0};
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_OP_CMPL  op_cmpl;
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = BTA_GATT_OK;
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_enqueue(p_clcb, p_data))
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((handle = bta_gattc_id2handle(p_clcb->p_srcb,
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_data->api_write.srvc_id,
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_data->api_write.char_id,
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_data->api_write.descr_type)) == 0)
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_ERROR;
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr.handle= handle;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr.offset = p_data->api_write.offset;
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr.len    = p_data->api_write.len;
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr.auth_req = p_data->api_write.auth_req;
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->api_write.p_value)
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(attr.value, p_data->api_write.p_value, p_data->api_write.len);
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = GATTC_Write(p_clcb->bta_conn_id, p_data->api_write.write_type, &attr);
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* write fail */
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != BTA_GATT_OK)
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL));
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.status  = status;
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.op_code = GATTC_OPTYPE_WRITE;
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.p_cmpl  = NULL;
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_execute
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      send execute write
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*********************************************************************************/
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_execute(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_OP_CMPL  op_cmpl;
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status;
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_enqueue(p_clcb, p_data))
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = GATTC_ExecuteWrite(p_clcb->bta_conn_id, p_data->api_exec.is_execute);
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != BTA_GATT_OK)
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL));
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.status  = status;
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.op_code = GATTC_OPTYPE_EXE_WRITE;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            op_cmpl.p_cmpl  = NULL;
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_confirm
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      send handle value confirmation
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_confirm(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 handle;
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID    null_uuid = {0};
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((handle = bta_gattc_id2handle(p_clcb->p_srcb,
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      &p_data->api_confirm.srvc_id,
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      &p_data->api_confirm.char_id,
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      null_uuid)) == 0)
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("Can not map service/char ID into valid handle");
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific, handle)
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            != GATT_SUCCESS)
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR1("bta_gattc_confirm to handle [0x%04x] failed", handle);
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_read_cmpl
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      read complete
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_read_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data)
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               event;
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC          cb_data;
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_READ_VAL  read_value;
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&cb_data, 0, sizeof(tBTA_GATTC));
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&read_value, 0, sizeof(tBTA_GATT_READ_VAL));
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.read.status     = p_data->status;
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->p_cmpl != NULL && p_data->status == BTA_GATT_OK)
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_gattc_handle2id(p_clcb->p_srcb,
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                p_data->p_cmpl->att_value.handle,
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                &cb_data.read.srvc_id,
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                &cb_data.read.char_id,
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                &cb_data.read.descr_type) == FALSE)
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.read.status = BTA_GATT_INTERNAL_ERROR;
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR1("can not map to GATT ID. handle = 0x%04x", p_data->p_cmpl->att_value.handle);
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.read.status = bta_gattc_pack_read_cb_data(p_clcb->p_srcb,
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                              cb_data.read.descr_type,
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                              &p_data->p_cmpl->att_value,
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                              &read_value);
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.read.p_value = &read_value;
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.read.srvc_id = p_clcb->p_q_cmd->api_read.srvc_id;
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.read.char_id = p_clcb->p_q_cmd->api_read.char_id;
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.read.descr_type = p_clcb->p_q_cmd->api_read.descr_type;
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event = (p_clcb->p_q_cmd->api_read.descr_type.len == 0) ? BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT;
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.read.conn_id = p_clcb->bta_conn_id;
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&p_clcb->p_q_cmd);
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* read complete, callback */
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ( *p_clcb->p_rcb->p_cback)(event, (tBTA_GATTC *)&cb_data);
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_write_cmpl
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      read complete
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_write_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data)
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC      cb_data = {0};
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8          event;
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.write.status     = p_data->status;
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->p_cmpl != NULL)
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_handle2id(p_clcb->p_srcb, p_data->p_cmpl->handle,
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &cb_data.write.srvc_id, &cb_data.write.char_id,
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &cb_data.write.descr_type);
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.write.srvc_id = p_clcb->p_q_cmd->api_write.srvc_id;
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.write.char_id = p_clcb->p_q_cmd->api_write.char_id;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.write.descr_type = p_clcb->p_q_cmd->api_write.descr_type;
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->p_q_cmd->api_write.hdr.event == BTA_GATTC_API_WRITE_EVT &&
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->p_q_cmd->api_write.write_type == BTA_GATTC_WRITE_PREPARE)
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        event = BTA_GATTC_PREP_WRITE_EVT;
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_clcb->p_q_cmd->api_write.descr_type.len == 0)
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        event = BTA_GATTC_WRITE_CHAR_EVT;
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        event = BTA_GATTC_WRITE_DESCR_EVT;
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&p_clcb->p_q_cmd);
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.write.conn_id = p_clcb->bta_conn_id;
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* write complete, callback */
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ( *p_clcb->p_rcb->p_cback)(event, (tBTA_GATTC *)&cb_data);
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_exec_cmpl
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      execute write complete
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_exec_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data)
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC          cb_data;
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&p_clcb->p_q_cmd);
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb->status      = BTA_GATT_OK;
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* execute complete, callback */
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.exec_cmpl.conn_id = p_clcb->bta_conn_id;
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.exec_cmpl.status = p_data->status;
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_EXEC_EVT,  &cb_data);
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_op_cmpl
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      operation completed.
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid  bta_gattc_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           op = (UINT8)p_data->op_cmpl.op_code;
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           mapped_op = 0;
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_op_cmpl op = %d", op);
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION)
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("unexpected operation, ignored");
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (op >= GATTC_OPTYPE_READ)
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->p_q_cmd == NULL)
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("No pending command");
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ])
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT + GATTC_OPTYPE_READ;
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( mapped_op > GATTC_OPTYPE_INDICATION)   mapped_op = 0;
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR3("expect op:(%s :0x%04x), receive unexpected operation (%s).",
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event,
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                bta_gattc_op_code_name[op]);
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR3("expect op:(%u :0x%04x), receive unexpected operation (%u).",
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                mapped_op , p_clcb->p_q_cmd->hdr.event, op);
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* service handle change void the response, discard it */
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (op == GATTC_OPTYPE_READ)
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl);
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (op == GATTC_OPTYPE_WRITE)
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_write_cmpl(p_clcb, &p_data->op_cmpl);
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (op == GATTC_OPTYPE_EXE_WRITE)
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_exec_cmpl(p_clcb, &p_data->op_cmpl);
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (op == GATTC_OPTYPE_CONFIG) // API to be added
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       */
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_op_cmpl
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      operation completed.
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid  bta_gattc_ignore_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* receive op complete when discovery is started, ignore the response,
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        and wait for discovery finish and resent */
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_ignore_op_cmpl op = %d", p_data->hdr.layer_specific);
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_search
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      start a search in the local server cache
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_search(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = GATT_INTERNAL_ERROR;
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC cb_data;
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id);
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache)
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_GATT_OK;
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* search the local cache of a server device */
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_search_service(p_clcb, p_data->api_search.srvc_uuid);
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.search_cmpl.status  = status;
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.search_cmpl.conn_id = p_clcb->bta_conn_id;
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* end of search or no server cache available */
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_CMPL_EVT,  &cb_data);
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_q_cmd
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      enqueue a command into control block, usually because discovery
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  operation is busy.
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_q_cmd(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_enqueue(p_clcb, p_data);
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_cache_open
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      open a NV cache for loading
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_cache_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_set_discover_st(p_clcb->p_srcb);
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id);
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_co_cache_open(p_clcb->p_srcb->server_bda, BTA_GATTC_CI_CACHE_OPEN_EVT,
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_clcb->bta_conn_id, FALSE);
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_start_load
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      start cache loading by sending callout open cache
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_ci_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2("bta_gattc_ci_open conn_id=%d server state=%d" ,
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_clcb->bta_conn_id, p_clcb->p_srcb->state);
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->p_srcb->state == BTA_GATTC_SERV_LOAD)
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->ci_open.status == BTA_GATT_OK)
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_srcb->attr_index = 0;
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda,
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    BTA_GATTC_CI_CACHE_LOAD_EVT,
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_clcb->p_srcb->attr_index,
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_clcb->bta_conn_id);
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* cache open failure, start discovery */
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_start_discover(p_clcb, NULL);
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->p_srcb->state == BTA_GATTC_SERV_SAVE)
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->ci_open.status == BTA_GATT_OK)
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id))
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_data->ci_open.status = BTA_GATT_ERROR;
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->ci_open.status != BTA_GATT_OK)
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_srcb->attr_index = 0;
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, p_clcb->bta_conn_id);
1451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_ci_load
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      cache loading received.
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2("bta_gattc_ci_load conn_id=%d load status=%d" ,
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_clcb->bta_conn_id, p_data->ci_load.status );
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_data->ci_load.status == BTA_GATT_OK ||
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         p_data->ci_load.status == BTA_GATT_MORE) &&
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->ci_load.num_attr > 0)
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        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);
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->ci_load.status == BTA_GATT_OK)
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_srcb->attr_index = 0;
1481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* load more */
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_srcb->attr_index += p_data->ci_load.num_attr;
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda,
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    BTA_GATTC_CI_CACHE_LOAD_EVT,
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_clcb->p_srcb->attr_index,
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_clcb->bta_conn_id);
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1496ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->p_srcb->attr_index = 0;
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* cache open failure, start discovery */
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_start_discover(p_clcb, NULL);
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_ci_load
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      cache loading received.
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_ci_save(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_gattc_ci_save conn_id=%d  " ,
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_clcb->bta_conn_id   );
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id))
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb->p_srcb->attr_index = 0;
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
1520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_fail
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      report API call failure back to apps
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->status == BTA_GATT_OK)
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("operation not supported at current state [%d]", p_clcb->state);
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_conn_cback
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bta_gattc_cmpl_cback
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      callback functions to GATT client stack.
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 BOOLEAN connected, tGATT_DISCONN_REASON reason)
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *p_buf;
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CLCB *p_clcb = NULL;
1554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
1555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           role ;
1556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG4("bta_gattc_conn_cback: cif = %d connected = %d conn_id = %d reaosn = 0x%04x",
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      gattc_if, connected, conn_id, reason);
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (connected)
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
1563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        role = L2CA_GetBleConnRole(bda);
1564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (role == HCI_ROLE_SLAVE)
1566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_gattc_conn_find_alloc(bda);
1567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
1568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* outgoing connection : locate a logic channel */
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda)) == NULL)
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
1573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* for a background connection or listening connection */
1574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (/* L2CA_GetBleConnRole(bda)== HCI_ROLE_MASTER && */
1575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_gattc_check_bg_conn(gattc_if, bda, role))
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* allocate a new channel */
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb = bta_gattc_clcb_alloc(gattc_if, bda);
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb != NULL)
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->bta_conn_id = conn_id;
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->event = BTA_GATTC_INT_CONN_EVT;
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->layer_specific = conn_id;
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_sendmsg(p_buf);
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
1598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_gattc_conn_dealloc(bda);
1599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* connection attempt timeout, send connection callback event */
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (reason == GATT_CONN_CANCEL )
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_clcb = bta_gattc_find_alloc_clcb(gattc_if, bda);
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->bta_conn_id = conn_id;
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) != NULL)
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->event = BTA_GATTC_INT_DISCONN_EVT;
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->layer_specific = conn_id;
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_clcb->reason        = reason;
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_sendmsg(p_buf);
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1(" connection ID: [%d] not used by BTA", conn_id);
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_gattc_process_api_refresh
1626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      process refresh API to delete cache and start a new discovery
1628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  if currently connected.
1629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          None.
1631ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
1633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
1634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
1635ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC_SERV *p_srvc_cb = bta_gattc_find_srvr_cache(p_msg->api_conn.remote_bda);
1636ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC_CLCB      *p_clcb = &bta_gattc_cb.clcb[0];
1637ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         found = FALSE;
1638ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           i;
1639ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_srvc_cb != NULL)
1641ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* try to find a CLCB */
1643ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_srvc_cb->connected && p_srvc_cb->num_clcb != 0)
1644ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
1645ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++)
1646ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1647ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (p_clcb->in_use && p_clcb->p_srcb == p_srvc_cb)
1648ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
1649ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    found = TRUE;
1650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    break;
1651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
1652ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
1653ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (found)
1654ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1655ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
1656ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return;
1657ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
1658ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
1659ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* in all other cases, mark it and delete the cache */
1660ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_srvc_cb->p_srvc_cache != NULL)
1661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
1662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            while (p_srvc_cb->cache_buffer.p_first)
1663ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                GKI_freebuf (GKI_dequeue (&p_srvc_cb->cache_buffer));
1664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_srvc_cb->p_srvc_cache = NULL;
1666ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
1667ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1668ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* used to reset cache in application */
1669ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_gattc_co_cache_reset(p_msg->api_conn.remote_bda);
1670ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1671ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1672ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_process_srvc_chg_ind
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process service change indication.
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_gattc_process_srvc_chg_ind(UINT16 conn_id,
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTA_GATTC_RCB      *p_clrcb,
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTA_GATTC_SERV     *p_srcb,
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTA_GATTC_CLCB      *p_clcb,
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTA_GATTC_NOTIFY    *p_notify,
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT16 handle)
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID        gattp_uuid, srvc_chg_uuid;
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         processed = FALSE;
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           i;
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gattp_uuid.len = 2;
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gattp_uuid.uu.uuid16 = UUID_SERVCLASS_GATT_SERVER;
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    srvc_chg_uuid.len = 2;
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    srvc_chg_uuid.uu.uuid16 = GATT_UUID_GATT_SRV_CHGD;
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_uuid_compare(p_notify->char_id.srvc_id.id.uuid, gattp_uuid, TRUE) &&
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_uuid_compare(p_notify->char_id.char_id.uuid, srvc_chg_uuid, TRUE))
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        processed = TRUE;
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* mark service handle change pending */
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srcb->srvc_hdl_chg = TRUE;
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear up all notification/indication registration */
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_clear_notif_registration(conn_id);
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* service change indication all received, do discovery update */
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( ++ p_srcb->update_count == bta_gattc_num_reg_app())
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* not an opened connection; or connection busy */
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* search for first available clcb and start discovery */
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb == NULL || (p_clcb && p_clcb->p_q_cmd != NULL))
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                for (i = 0 ; i < BTA_GATTC_CLCB_MAX; i ++)
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (bta_gattc_cb.clcb[i].in_use &&
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_gattc_cb.clcb[i].p_srcb == p_srcb &&
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_gattc_cb.clcb[i].p_q_cmd == NULL)
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_clcb = &bta_gattc_cb.clcb[i];
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send confirmation here if this is an indication, it should always be */
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GATTC_SendHandleValueConfirm(conn_id, handle);
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if connection available, refresh cache by doing discovery now */
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb != NULL)
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* notify applicationf or service change */
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clrcb->p_cback != NULL)
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           (* p_clrcb->p_cback)(BTA_GATTC_SRVC_CHG_EVT, (tBTA_GATTC *)p_srcb->server_bda);
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return processed;
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_proc_other_indication
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process all non-service change indication/notification.
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_proc_other_indication(tBTA_GATTC_CLCB *p_clcb, UINT8 op,
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     tGATT_CL_COMPLETE *p_data,
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     tBTA_GATTC_NOTIFY *p_notify)
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2("bta_gattc_proc_other_indication check \
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->att_value.handle=%d p_data->handle=%d",
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->att_value.handle, p_data->handle);
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("is_notify", p_notify->is_notify);
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? FALSE : TRUE;
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_notify->len = p_data->att_value.len;
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(p_notify->bda, p_clcb->bda);
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_notify->value, p_data->att_value.value, p_data->att_value.len);
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_notify->conn_id = p_clcb->bta_conn_id;
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->p_rcb->p_cback)
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_clcb->p_rcb->p_cback)(BTA_GATTC_NOTIF_EVT,  (tBTA_GATTC *)p_notify);
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_process_indicate
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process indication/notification.
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_process_indicate(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_CL_COMPLETE *p_data)
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              handle = p_data->att_value.handle;
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CLCB     *p_clcb ;
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_RCB      *p_clrcb = NULL;
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_SERV     *p_srcb = NULL;
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_NOTIFY   notify;
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR             remote_bda;
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_IF       gatt_if;
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda))
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("indication/notif for unknown app");
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) == NULL)
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("indication/notif for unregistered app");
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL)
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("indication/notif for unknown device, ignore");
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gattc_handle2id(p_srcb, handle,
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &notify.char_id.srvc_id,
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &notify.char_id.char_id,
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &notify.descr_type))
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if non-service change indication/notification, forward to application */
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!bta_gattc_process_srvc_chg_ind(conn_id, p_clrcb, p_srcb, p_clcb, &notify, handle))
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if app registered for the notification */
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, &notify))
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* connection not open yet */
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_clcb == NULL)
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda)) != NULL)
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_clcb->bta_conn_id = conn_id;
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* send connection event */
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_gattc_send_open_cback(p_clrcb,
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  BTA_GATT_OK,
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  remote_bda,
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  conn_id);
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        APPL_TRACE_ERROR0("No resources");
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_clcb != NULL)
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_gattc_proc_other_indication(p_clcb, op, p_data, &notify);
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* no one intersted and need ack? */
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (op == GATTC_OPTYPE_INDICATION)
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_DEBUG0("no one interested, ack now");
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GATTC_SendHandleValueConfirm(conn_id, handle);
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Indi/Notif for Unknown handle[0x%04x], can not find in local cache.", handle);
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gattc_cmpl_cback
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      client operation complete callback register with BTE GATT.
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void  bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  tGATT_CL_COMPLETE *p_data)
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_CLCB     *p_clcb ;
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTC_OP_CMPL  *p_buf;
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE);
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG3("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      conn_id, op, status);
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notification and indication processed right away */
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (op == GATTC_OPTYPE_NOTIFICATION || op == GATTC_OPTYPE_INDICATION)
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gattc_process_indicate(conn_id, op, p_data);
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for all other operation, not expected if w/o connection */
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) == NULL)
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_gattc_cmpl_cback unknown conn_id =  %d, ignore data", conn_id);
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (tBTA_GATTC_OP_CMPL *) GKI_getbuf(len)) != NULL)
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_buf, 0, len);
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.event = BTA_GATTC_OP_CMPL_EVT;
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.layer_specific = conn_id;
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->status = status;
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->op_code = op;
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data != NULL)
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->p_cmpl = (tGATT_CL_COMPLETE *)(p_buf + 1);
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p_buf->p_cmpl, p_data, sizeof(tGATT_CL_COMPLETE));
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1907ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
1908ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1909ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1910ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_gattc_init_clcb_conn
1911ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1912ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Initaite a BTA CLCB connection
1913ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
1915ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1916ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta********************************************************************************/
1917ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_gattc_init_clcb_conn(UINT8 cif, BD_ADDR remote_bda)
1918ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
1919ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC_CLCB     *p_clcb = NULL;
1920ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_GATTC_DATA     gattc_data;
1921ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16              conn_id;
1922ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1923ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* should always get the connection ID */
1924ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (GATT_GetConnIdIfConnected(cif, remote_bda,&conn_id) == FALSE)
1925ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1926ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        APPL_TRACE_ERROR0("bta_gattc_init_clcb_conn ERROR: not a connected device");
1927ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
1928ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1929ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1930ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* initaite a new connection here */
1931ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda)) != NULL)
1932ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1933ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
1934ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1935ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        gattc_data.api_conn.client_if = cif;
1936ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy(gattc_data.api_conn.remote_bda, remote_bda, BD_ADDR_LEN);
1937ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        gattc_data.api_conn.is_direct = TRUE;
1938ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1939ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_gattc_sm_execute(p_clcb, BTA_GATTC_API_OPEN_EVT, &gattc_data);
1940ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1941ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
1942ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1943ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        APPL_TRACE_ERROR0("No resources");
1944ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1945ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1946ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1947ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif /* #if BLE_INCLUDED == TRUE */
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */
1949