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"
32a11035b5ecbc6cbd9da5bd707683504c47e2744ePavlin Radoslavov#include "bt_common.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               cb_data;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS         status = BTA_GATT_OK;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                    i, first_unuse = 0xff;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
189e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    if (p_cb->enabled == FALSE)
190e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    {
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gatts_enable(p_cb);
192e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[i].in_use)
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid))
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
200e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("application already registered.");
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_GATT_DUP_REG;
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTA_GATT_OK)
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (first_unuse == 0xff && !p_cb->rcb[i].in_use)
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                first_unuse = i;
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF;
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (first_unuse != 0xff)
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
222e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[first_unuse].in_use = TRUE;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.reg_oper.server_if      =
22816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            p_cb->rcb[first_unuse].gatt_if  =
2297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
2305fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            if ( !p_cb->rcb[first_unuse].gatt_if) {
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_GATT_NO_RESOURCES;
2325fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            } else {
2335fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov              tBTA_GATTS_INT_START_IF *p_buf =
2345fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                  (tBTA_GATTS_INT_START_IF *)osi_malloc(sizeof(tBTA_GATTS_INT_START_IF));
2355fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT;
2365fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                p_buf->server_if = p_cb->rcb[first_unuse].gatt_if;
2375fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
2385fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                bta_sys_sendmsg(p_buf);
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2405fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        } else {
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_NO_RESOURCES;
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.status = status;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->api_reg.p_cback)
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data);
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_start_if
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      start an application interface.
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2625cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
2635cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if))
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GATT_StartIf(p_msg->int_start_if.server_if);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
270e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
2717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_msg->int_start_if.server_if );
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_deregister
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      deregister an application.
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = BTA_GATT_ERROR;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_CBACK    *p_cback = NULL;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               i;
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.server_if = p_msg->api_dereg.server_if;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.status = status;
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if)
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cback = p_cb->rcb[i].p_cback;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_OK;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* deregister the app */
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GATT_Deregister(p_cb->rcb[i].gatt_if);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reset cb */
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB));
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.reg_oper.status = status;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cback)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
316e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("application not registered.");
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_create_srvc
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to create a service.
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               rcb_idx;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               srvc_idx;
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              service_id = 0;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.create.status = BTA_GATT_ERROR;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
339e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx);
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (rcb_idx != BTA_GATTS_INVALID_APP)
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP)
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* create the service now */
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = GATTS_CreateService (p_cb->rcb[rcb_idx].gatt_if,
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              &p_msg->api_create_svc.service_uuid,
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.inst,
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.num_handle,
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.is_pri);
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (service_id != 0)
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid,
3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].service_id   = service_id;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].inst_num     = p_msg->api_create_svc.inst;
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].idx          = srvc_idx;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.status      = BTA_GATT_OK;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.service_id  = service_id;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.is_primary  = p_msg->api_create_svc.is_pri;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.server_if   = p_cb->rcb[rcb_idx].gatt_if;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.status  = BTA_GATT_ERROR;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB));
369e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("service creation failed.");
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.create.svc_instance= p_msg->api_create_svc.inst;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[rcb_idx].p_cback)
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* p_cb->rcb[rcb_idx].p_cback)(BTA_GATTS_CREATE_EVT, &cb_data);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* application not registered */
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
379e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Application not registered");
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_include_srvc
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add an included service.
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * p_msg)
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddIncludeService(p_msg->api_add_incl_srvc.hdr.layer_specific,
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_incl_srvc.included_service_id);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_INCL_SRVC_EVT, &cb_data);
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_char
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add characteristic.
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddCharacteristic(p_msg->api_add_char.hdr.layer_specific,
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      &p_msg->api_add_char.char_uuid,
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_char.perm,
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_char.property);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char.char_uuid, sizeof(tBT_UUID));
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_EVT, &cb_data);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_char_descr
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add characteristic descriptor.
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddCharDescriptor(p_msg->api_add_char_descr.hdr.layer_specific,
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       p_msg->api_add_char_descr.perm,
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       &p_msg->api_add_char_descr.descr_uuid);
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char_descr.descr_uuid, sizeof(tBT_UUID));
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_DESCR_EVT, &cb_data);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_delete_service
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to delete a service.
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_DeleteService(p_rcb->gatt_if,
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &p_srvc_cb->service_uuid,
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_srvc_cb->inst_num))
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_OK;
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB));
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_ERROR;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data);
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_start_service
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to start a service.
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_StartService(p_rcb->gatt_if,
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_srvc_cb->service_id,
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_msg->api_start.transport) ==  GATT_SUCCESS)
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
543e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_OK;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_ERROR;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_START_EVT, &cb_data);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_stop_service
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to stop a service.
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5685cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_msg);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATTS_StopService(p_srvc_cb->service_id);
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.status = BTA_GATT_OK;
574e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5826975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Function         bta_gatts_send_rsp
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5846975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description      GATTS send response.
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5915cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific,
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->api_rsp.trans_id,
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->api_rsp.status,
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS)
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
598e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Sending response failed");
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
604781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach** Function         bta_gatts_indicate_handle
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6066975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description      GATTS send handle value indication or notification.
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_SRVC_CB  *p_srvc_cb;
61417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS_RCB      *p_rcb = NULL;
615781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach    tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
616781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach    tGATT_IF            gatt_if;
617781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach    BD_ADDR             remote_bda;
6187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTA_TRANSPORT transport;
61917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS          cb_data;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id);
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_srvc_cb )
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
6267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            &gatt_if, remote_bda, &transport))
627781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        {
62817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
62917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
630781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            if (p_msg->api_indicate.need_confirm)
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
632781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific,
633781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                      p_msg->api_indicate.attr_id,
634781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                      p_msg->api_indicate.len,
635781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                      p_msg->api_indicate.value);
636781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            else
637781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                status = GATTS_HandleValueNotification (p_msg->api_indicate.hdr.layer_specific,
638781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                        p_msg->api_indicate.attr_id,
639781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                        p_msg->api_indicate.len,
640781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                                                        p_msg->api_indicate.value);
641781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
642781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            /* if over BR_EDR, inform PM for mode change */
6437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (transport == BTA_TRANSPORT_BR_EDR)
644781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            {
645781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
646781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
647781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            }
648781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        }
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
650781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        {
651e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification",
652781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                              p_msg->api_indicate.hdr.layer_specific);
653781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        }
65417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
6557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
65617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
65817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.req_data.status = status;
65917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
66017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
66117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
666e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x",
667781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                          p_msg->api_indicate.attr_id);
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_open
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB      *p_rcb=NULL;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
6857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT16              conn_id;
6865cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL)
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* should always get the connection ID */
6917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
6928ed030ff4a36b248e1b115f94ddd4650d4b5e360Jakub Pawlowski                        p_msg->api_open.is_direct, p_msg->api_open.transport, false))
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_OK;
6957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
6967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
6977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                            &conn_id, p_msg->api_open.transport))
6987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
6997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                status = BTA_GATT_ALREADY_OPEN;
7007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
705e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if);
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb && p_rcb->p_cback)
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT,  (tBTA_GATTS *)&status);
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_cancel_open
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB      *p_rcb;
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
7255cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL)
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
7307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                p_msg->api_cancel_open.is_direct))
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
732e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request");
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status= BTA_GATT_OK;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
741e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb && p_rcb->p_cback)
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT,  (tBTA_GATTS *)&status);
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_close
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB     *p_rcb;
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF            gatt_if;
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR             remote_bda;
7627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTA_GATT_TRANSPORT transport;
7637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7645cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport))
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS)
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
770e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status= BTA_GATT_OK;
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb && p_rcb->p_cback)
780781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        {
7817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (transport == BTA_TRANSPORT_BR_EDR)
782781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda);
783781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT,  (tBTA_GATTS *)&status);
785781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        }
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
789e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific);
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7935c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach/*******************************************************************************
7945c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
7955c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Function         bta_gatts_listen
7965c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
7975c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Description      Start or stop listening for LE connection on a GATT server
7985c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
7995c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Returns          none.
8005c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach**
8015c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach*******************************************************************************/
8025c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbachvoid bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
8035c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach{
8045c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    tBTA_GATTS_RCB     *p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_listen.server_if);
8055c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    tBTA_GATTS          cb_data;
8065cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cb);
8075cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
8085c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    cb_data.reg_oper.status = BTA_GATT_OK;
8095c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    cb_data.reg_oper.server_if = p_msg->api_listen.server_if;
8105c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach
8115c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    if (p_rcb == NULL)
8125c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    {
813e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("Unknown GATTS application");
8145c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach        return;
8155c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    }
8165c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach
8175c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    if (!GATT_Listen(p_msg->api_listen.server_if,
8185c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach                     p_msg->api_listen.start,
8195c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach                     p_msg->api_listen.remote_bda))
8205c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    {
8215c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach        cb_data.status = BTA_GATT_ERROR;
822e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("bta_gatts_listen Listen failed");
8235c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    }
8245c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach
8255c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    if (p_rcb->p_cback)
8265c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach        (*p_rcb->p_cback)(BTA_GATTS_LISTEN_EVT, &cb_data);
8275c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach}
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_request_cback
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATTS attribute request callback.
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_send_request_cback (UINT16 conn_id,
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 trans_id,
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data)
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB     *p_rcb;
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF            gatt_if;
8457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTA_GATT_TRANSPORT transport;
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&cb_data, 0 , sizeof(tBTA_GATTS));
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
853e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d",
8547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                            conn_id, trans_id, req_type);
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb && p_rcb->p_cback)
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
858781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            /* if over BR_EDR, inform PM for mode change */
8597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (transport == BTA_TRANSPORT_BR_EDR)
860781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            {
861781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
862781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
863781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach            }
864781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.conn_id    = conn_id;
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.trans_id   = trans_id;
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.p_data     = (tBTA_GATTS_REQ_DATA *)p_data;
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_rcb->p_cback)(req_type,  &cb_data);
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
873e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if);
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
878e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id);
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_conn_cback
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      connection callback.
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
8927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  BOOLEAN connected, tGATT_DISCONN_REASON reason,
8937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  tGATT_TRANSPORT transport)
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT;
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_reg;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
899e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        gatt_if, conn_id, connected, reason);
901e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
90489f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    bt_bdaddr_t bdaddr;
90589f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    bdcpy(bdaddr.address, bda);
90689f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    if (connected)
90789f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach        btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
90889f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach    else
90989f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach        btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
91089f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reg && p_reg->p_cback)
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
915781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach        /* there is no RM for GATT */
9167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (transport == BTA_TRANSPORT_BR_EDR)
9176975b4d711142b885af479721cada448952c6b41Andre Eisenbach        {
9186975b4d711142b885af479721cada448952c6b41Andre Eisenbach            if (connected)
9196975b4d711142b885af479721cada448952c6b41Andre Eisenbach                bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
9206975b4d711142b885af479721cada448952c6b41Andre Eisenbach            else
9216975b4d711142b885af479721cada448952c6b41Andre Eisenbach                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, bda);
9226975b4d711142b885af479721cada448952c6b41Andre Eisenbach        }
923781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.conn_id = conn_id;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.server_if = gatt_if;
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.reason = reason;
9277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        cb_data.conn.transport = transport;
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_reg->p_cback)(evt, &cb_data);
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
933e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if);
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
93617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
93717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/*******************************************************************************
93817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
93917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Function         bta_gatts_cong_cback
94017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
94117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Description      congestion callback.
94217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
94317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Returns          none.
94417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach**
94517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach*******************************************************************************/
94617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested)
94717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach{
94817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS_RCB *p_rcb;
94917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tGATT_IF gatt_if;
95017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATT_TRANSPORT transport;
95117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    tBTA_GATTS cb_data;
95217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
95317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
95417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    {
95517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
95617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
95717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        if (p_rcb && p_rcb->p_cback)
95817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        {
95917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.congest.conn_id = conn_id;
96017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            cb_data.congest.congested = congested;
96117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
96217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach            (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
96317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach        }
96417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    }
96517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach}
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */
967