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 Server 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
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
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 "bta_sys.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_co.h"
36781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach#include "btm_ble_api.h"
3789f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach#include "btif/include/btif_debug_conn.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req,
427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                tGATTS_SRV_CHG_RSP *p_rsp);
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                      BOOLEAN connected, tGATT_DISCONN_REASON reason,
467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                      tGATT_TRANSPORT transport);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_send_request_cback (UINT16 conn_id,
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 trans_id,
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data);
5017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested);
5117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tGATT_CBACK bta_gatts_cback =
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_conn_cback,
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
587051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu    bta_gatts_send_request_cback,
5917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    NULL,
6017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    bta_gatts_cong_cback
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_APPL_INFO bta_gatts_nv_cback =
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_nv_save_cback,
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_nv_srv_chg_cback
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_nv_save_cback
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      NV save callback function.
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        is_add: true is to add a handle range; otherwise is to delete.
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_nv_save_cback(BOOLEAN is_add, tGATTS_HNDL_RANGE *p_hndl_range)
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_co_update_handle_range(is_add, (tBTA_GATTS_HNDL_RANGE *)p_hndl_range);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
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_gatts_nv_srv_chg_cback
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      NV save callback function.
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        is_add: true is to add a handle range; otherwise is to delete.
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                              tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd,
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                (tBTA_GATTS_SRV_CHG_REQ *) p_req,
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                (tBTA_GATTS_SRV_CHG_RSP *) p_rsp);
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_enable
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      enable BTA GATTS module.
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_enable(tBTA_GATTS_CB *p_cb)
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 index=0;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_HNDL_RANGE handle_range;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
118e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    if (p_cb->enabled)
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
120e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("GATTS already enabled.");
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
122e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    else
123e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    {
124e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
126e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        p_cb->enabled = TRUE;
127e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
128e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        while ( bta_gatts_co_load_handle_range(index, &handle_range))
129e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        {
130e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            GATTS_AddHandleRange((tGATTS_HNDL_RANGE *)&handle_range);
131e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE));
132e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            index++;
133e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        }
134e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
135e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index);
136e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
137e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        if (!GATTS_NVRegister(&bta_gatts_nv_cback))
138e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        {
139e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("BTA GATTS NV register failed.");
140e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        }
141e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
142e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach}
143e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
144e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/*******************************************************************************
145e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
146e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Function         bta_gatts_api_disable
147e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
148e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Description      disable BTA GATTS module.
149e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
150e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Returns          none.
151e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
152e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach*******************************************************************************/
153e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbachvoid bta_gatts_api_disable(tBTA_GATTS_CB *p_cb)
154e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach{
155e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    UINT8 i;
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
157e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    if (p_cb->enabled)
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
159e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
160e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        {
161e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            if (p_cb->rcb[i].in_use)
162e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            {
163e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                GATT_Deregister(p_cb->rcb[i].gatt_if);
164e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            }
165e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        }
166e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
167e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
168e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    else
169e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    {
170e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("GATTS not enabled");
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
173e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_register
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      register an application.
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_INT_START_IF  *p_buf;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS               cb_data;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS         status = BTA_GATT_OK;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                    i, first_unuse = 0xff;
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
190e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    if (p_cb->enabled == FALSE)
191e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    {
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gatts_enable(p_cb);
193e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[i].in_use)
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid))
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
201e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("application already registered.");
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_GATT_DUP_REG;
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTA_GATT_OK)
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (first_unuse == 0xff && !p_cb->rcb[i].in_use)
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                first_unuse = i;
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF;
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (first_unuse != 0xff)
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
225e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[first_unuse].in_use = TRUE;
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.reg_oper.server_if      =
23116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            p_cb->rcb[first_unuse].gatt_if  =
2327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( !p_cb->rcb[first_unuse].gatt_if)
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_GATT_NO_RESOURCES;
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if ((p_buf =
2407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                  (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->hdr.event    = BTA_GATTS_INT_START_IF_EVT;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->server_if    = p_cb->rcb[first_unuse].gatt_if;
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_sys_sendmsg(p_buf);
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    status = BTA_GATT_NO_RESOURCES;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memset( &p_cb->rcb[first_unuse], 0 , sizeof(tBTA_GATTS_RCB));
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_NO_RESOURCES;
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.status = status;
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->api_reg.p_cback)
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_start_if
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      start an application interface.
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
2785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if))
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GATT_StartIf(p_msg->int_start_if.server_if);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
285e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
2867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_msg->int_start_if.server_if );
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_deregister
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      deregister an application.
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = BTA_GATT_ERROR;
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_CBACK    *p_cback = NULL;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               i;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.server_if = p_msg->api_dereg.server_if;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.status = status;
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cback = p_cb->rcb[i].p_cback;
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_OK;
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* deregister the app */
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GATT_Deregister(p_cb->rcb[i].gatt_if);
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reset cb */
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB));
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.reg_oper.status = status;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cback)
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
331e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("application not registered.");
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_create_srvc
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to create a service.
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               rcb_idx;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               srvc_idx;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              service_id = 0;
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.create.status = BTA_GATT_ERROR;
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if);
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
354e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx);
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (rcb_idx != BTA_GATTS_INVALID_APP)
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP)
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* create the service now */
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = GATTS_CreateService (p_cb->rcb[rcb_idx].gatt_if,
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              &p_msg->api_create_svc.service_uuid,
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.inst,
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.num_handle,
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.is_pri);
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (service_id != 0)
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid,
3707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].service_id   = service_id;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].inst_num     = p_msg->api_create_svc.inst;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].idx          = srvc_idx;
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.status      = BTA_GATT_OK;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.service_id  = service_id;
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.is_primary  = p_msg->api_create_svc.is_pri;
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.server_if   = p_cb->rcb[rcb_idx].gatt_if;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.status  = BTA_GATT_ERROR;
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB));
386e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("service creation failed.");
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.create.svc_instance= p_msg->api_create_svc.inst;
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[rcb_idx].p_cback)
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* p_cb->rcb[rcb_idx].p_cback)(BTA_GATTS_CREATE_EVT, &cb_data);
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* application not registered */
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
398e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Application not registered");
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_include_srvc
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add an included service.
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * p_msg)
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddIncludeService(p_msg->api_add_incl_srvc.hdr.layer_specific,
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_incl_srvc.included_service_id);
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_INCL_SRVC_EVT, &cb_data);
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_char
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add characteristic.
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddCharacteristic(p_msg->api_add_char.hdr.layer_specific,
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      &p_msg->api_add_char.char_uuid,
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_char.perm,
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_char.property);
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char.char_uuid, sizeof(tBT_UUID));
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_EVT, &cb_data);
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_char_descr
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add characteristic descriptor.
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddCharDescriptor(p_msg->api_add_char_descr.hdr.layer_specific,
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       p_msg->api_add_char_descr.perm,
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       &p_msg->api_add_char_descr.descr_uuid);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char_descr.descr_uuid, sizeof(tBT_UUID));
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_DESCR_EVT, &cb_data);
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_delete_service
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to delete a service.
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_DeleteService(p_rcb->gatt_if,
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &p_srvc_cb->service_uuid,
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_srvc_cb->inst_num))
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_OK;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB));
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_ERROR;
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data);
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_start_service
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to start a service.
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_StartService(p_rcb->gatt_if,
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_srvc_cb->service_id,
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_msg->api_start.transport) ==  GATT_SUCCESS)
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
566e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_OK;
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_ERROR;
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_START_EVT, &cb_data);
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_stop_service
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to stop a service.
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5915cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_msg);
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATTS_StopService(p_srvc_cb->service_id);
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.status = BTA_GATT_OK;
597e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6056975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Function         bta_gatts_send_rsp
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6076975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description      GATTS send response.
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6145cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific,
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->api_rsp.trans_id,
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->api_rsp.status,
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS)
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
621e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Sending response failed");
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
627781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach** Function         bta_gatts_indicate_handle
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6296975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description      GATTS send handle value indication or notification.
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_SRVC_CB  *p_srvc_cb;
63717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS_RCB      *p_rcb = NULL;
638781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach    tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
639781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach    tGATT_IF            gatt_if;
640781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach    BD_ADDR             remote_bda;
6417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTA_TRANSPORT transport;
64217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS          cb_data;
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_srvc_cb )
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
6497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            &gatt_if, remote_bda, &transport))
650781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        {
65117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
65217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
653781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            if (p_msg->api_indicate.need_confirm)
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific,
656781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                      p_msg->api_indicate.attr_id,
657781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                      p_msg->api_indicate.len,
658781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                      p_msg->api_indicate.value);
659781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            else
660781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                status = GATTS_HandleValueNotification (p_msg->api_indicate.hdr.layer_specific,
661781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                        p_msg->api_indicate.attr_id,
662781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                        p_msg->api_indicate.len,
663781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                        p_msg->api_indicate.value);
664781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
665781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            /* if over BR_EDR, inform PM for mode change */
6667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (transport == BTA_TRANSPORT_BR_EDR)
667781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            {
668781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
669781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
670781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            }
671781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        }
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
673781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        {
674e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification",
675781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                              p_msg->api_indicate.hdr.layer_specific);
676781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        }
67717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
6787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
67917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
68117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.req_data.status = status;
68217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
68317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
68417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
689e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x",
690781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                          p_msg->api_indicate.attr_id);
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_open
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB      *p_rcb=NULL;
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
7087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT16              conn_id;
7095cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL)
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* should always get the connection ID */
7147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
7157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                        p_msg->api_open.is_direct, p_msg->api_open.transport))
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_OK;
7187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
7207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                            &conn_id, p_msg->api_open.transport))
7217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
7227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                status = BTA_GATT_ALREADY_OPEN;
7237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
728e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if);
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb && p_rcb->p_cback)
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT,  (tBTA_GATTS *)&status);
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_cancel_open
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB      *p_rcb;
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
7485cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL)
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
7537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                p_msg->api_cancel_open.is_direct))
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
755e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request");
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status= BTA_GATT_OK;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
764e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb && p_rcb->p_cback)
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT,  (tBTA_GATTS *)&status);
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_close
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB     *p_rcb;
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF            gatt_if;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR             remote_bda;
7857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTA_GATT_TRANSPORT transport;
7867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7875cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport))
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS)
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
793e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status= BTA_GATT_OK;
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb && p_rcb->p_cback)
803781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        {
8047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (transport == BTA_TRANSPORT_BR_EDR)
805781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda);
806781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT,  (tBTA_GATTS *)&status);
808781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        }
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
812e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific);
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8165c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach/*******************************************************************************
8175c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
8185c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Function         bta_gatts_listen
8195c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
8205c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Description      Start or stop listening for LE connection on a GATT server
8215c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
8225c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Returns          none.
8235c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
8245c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach*******************************************************************************/
8255c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbachvoid bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
8265c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach{
8275c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    tBTA_GATTS_RCB     *p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_listen.server_if);
8285c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    tBTA_GATTS          cb_data;
8295cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
8305cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
8315c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    cb_data.reg_oper.status = BTA_GATT_OK;
8325c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    cb_data.reg_oper.server_if = p_msg->api_listen.server_if;
8335c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach
8345c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    if (p_rcb == NULL)
8355c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    {
836e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Unknown GATTS application");
8375c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach        return;
8385c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    }
8395c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach
8405c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    if (!GATT_Listen(p_msg->api_listen.server_if,
8415c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach                     p_msg->api_listen.start,
8425c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach                     p_msg->api_listen.remote_bda))
8435c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    {
8445c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach        cb_data.status = BTA_GATT_ERROR;
845e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("bta_gatts_listen Listen failed");
8465c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    }
8475c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach
8485c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    if (p_rcb->p_cback)
8495c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach        (*p_rcb->p_cback)(BTA_GATTS_LISTEN_EVT, &cb_data);
8505c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach}
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_request_cback
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATTS attribute request callback.
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_send_request_cback (UINT16 conn_id,
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 trans_id,
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data)
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB     *p_rcb;
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF            gatt_if;
8687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTA_GATT_TRANSPORT transport;
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&cb_data, 0 , sizeof(tBTA_GATTS));
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
876e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d",
8777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                            conn_id, trans_id, req_type);
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb && p_rcb->p_cback)
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
881781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            /* if over BR_EDR, inform PM for mode change */
8827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (transport == BTA_TRANSPORT_BR_EDR)
883781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            {
884781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
885781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
886781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            }
887781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.conn_id    = conn_id;
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.trans_id   = trans_id;
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.p_data     = (tBTA_GATTS_REQ_DATA *)p_data;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_rcb->p_cback)(req_type,  &cb_data);
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
896e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if);
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
901e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id);
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_conn_cback
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      connection callback.
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
9157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  BOOLEAN connected, tGATT_DISCONN_REASON reason,
9167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  tGATT_TRANSPORT transport)
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT;
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_reg;
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
922e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        gatt_if, conn_id, connected, reason);
924e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
92789f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    bt_bdaddr_t bdaddr;
92889f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    bdcpy(bdaddr.address, bda);
92989f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    if (connected)
93089f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach        btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
93189f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    else
93289f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach        btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
93389f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reg && p_reg->p_cback)
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
938781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        /* there is no RM for GATT */
9397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (transport == BTA_TRANSPORT_BR_EDR)
9406975b4d711142b885af479721cada448952c6b41Andre Eisenbach        {
9416975b4d711142b885af479721cada448952c6b41Andre Eisenbach            if (connected)
9426975b4d711142b885af479721cada448952c6b41Andre Eisenbach                bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
9436975b4d711142b885af479721cada448952c6b41Andre Eisenbach            else
9446975b4d711142b885af479721cada448952c6b41Andre Eisenbach                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, bda);
9456975b4d711142b885af479721cada448952c6b41Andre Eisenbach        }
946781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.conn_id = conn_id;
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.server_if = gatt_if;
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.reason = reason;
9507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        cb_data.conn.transport = transport;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_reg->p_cback)(evt, &cb_data);
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
956e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if);
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
95917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
96017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/*******************************************************************************
96117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
96217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Function         bta_gatts_cong_cback
96317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
96417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Description      congestion callback.
96517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
96617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Returns          none.
96717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
96817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach*******************************************************************************/
96917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested)
97017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach{
97117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS_RCB *p_rcb;
97217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tGATT_IF gatt_if;
97317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATT_TRANSPORT transport;
97417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS cb_data;
97517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
97617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
97717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    {
97817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
97917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
98017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        if (p_rcb && p_rcb->p_cback)
98117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        {
98217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.congest.conn_id = conn_id;
98317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.congest.congested = congested;
98417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
98517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
98617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        }
98717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    }
98817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach}
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */
990