bta_gatts_act.cc revision e1202caae4920139ea0cfed5c51f5f76b2dc8bc4
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2003-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the GATT Server action functions for the state
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  machine.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_co.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp);
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_send_request_cback (UINT16 conn_id,
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 trans_id,
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data);
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tGATT_CBACK bta_gatts_cback =
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_conn_cback,
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_send_request_cback
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_APPL_INFO bta_gatts_nv_cback =
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_nv_save_cback,
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_nv_srv_chg_cback
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_nv_save_cback
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      NV save callback function.
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        is_add: true is to add a handle range; otherwise is to delete.
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_nv_save_cback(BOOLEAN is_add, tGATTS_HNDL_RANGE *p_hndl_range)
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_gatts_co_update_handle_range(is_add, (tBTA_GATTS_HNDL_RANGE *)p_hndl_range);
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_nv_srv_chg_cback
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      NV save callback function.
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        is_add: true is to add a handle range; otherwise is to delete.
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd,
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                (tBTA_GATTS_SRV_CHG_REQ *) p_req,
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                (tBTA_GATTS_SRV_CHG_RSP *) p_rsp);
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_enable
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      enable BTA GATTS module.
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_enable(tBTA_GATTS_CB *p_cb)
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 index=0;
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_HNDL_RANGE handle_range;
108e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    tBTA_GATT_STATUS    status = BTA_GATT_OK;
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
110e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    if (p_cb->enabled)
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
112e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        APPL_TRACE_DEBUG0("GATTS already enabled.");
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
114e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    else
115e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    {
116e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
118e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        p_cb->enabled = TRUE;
119e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
120e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        while ( bta_gatts_co_load_handle_range(index, &handle_range))
121e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        {
122e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            GATTS_AddHandleRange((tGATTS_HNDL_RANGE *)&handle_range);
123e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE));
124e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            index++;
125e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        }
126e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
127e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        APPL_TRACE_DEBUG1("bta_gatts_enable: num of handle range added=%d", index);
128e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
129e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        if (!GATTS_NVRegister(&bta_gatts_nv_cback))
130e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        {
131e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            APPL_TRACE_ERROR0("BTA GATTS NV register failed.");
132e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            status = BTA_GATT_ERROR;
133e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        }
134e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
135e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach}
136e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
137e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/*******************************************************************************
138e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
139e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Function         bta_gatts_api_disable
140e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
141e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Description      disable BTA GATTS module.
142e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
143e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Returns          none.
144e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach**
145e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach*******************************************************************************/
146e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbachvoid bta_gatts_api_disable(tBTA_GATTS_CB *p_cb)
147e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach{
148e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    UINT8 i;
149e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    tBTA_GATT_STATUS    status = BTA_GATT_OK;
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
151e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    if (p_cb->enabled)
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
153e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
154e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        {
155e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            if (p_cb->rcb[i].in_use)
156e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            {
157e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                GATT_Deregister(p_cb->rcb[i].gatt_if);
158e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach            }
159e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        }
160e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
161e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
162e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    else
163e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    {
164e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        APPL_TRACE_ERROR0("GATTS not enabled");
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
167e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_register
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      register an application.
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_INT_START_IF  *p_buf;
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS               cb_data;
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS         status = BTA_GATT_OK;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                    i, first_unuse = 0xff;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
184e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    if (p_cb->enabled == FALSE)
185e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    {
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_gatts_enable(p_cb);
187e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[i].in_use)
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid))
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("application already registered.");
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_GATT_DUP_REG;
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTA_GATT_OK)
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (first_unuse == 0xff && !p_cb->rcb[i].in_use)
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                first_unuse = i;
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF;
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (first_unuse != 0xff)
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR1("register application first_unuse rcb_idx = %d", first_unuse);
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[first_unuse].in_use = TRUE;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.reg_oper.server_if      =
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[first_unuse].gatt_if  = GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( !p_cb->rcb[first_unuse].gatt_if)
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_GATT_NO_RESOURCES;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_buf = (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->hdr.event    = BTA_GATTS_INT_START_IF_EVT;
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->server_if    = p_cb->rcb[first_unuse].gatt_if;
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_sys_sendmsg(p_buf);
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    status = BTA_GATT_NO_RESOURCES;
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memset( &p_cb->rcb[first_unuse], 0 , sizeof(tBTA_GATTS_RCB));
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_NO_RESOURCES;
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.status = status;
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->api_reg.p_cback)
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_start_if
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      start an application interface.
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if))
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GATT_StartIf(p_msg->int_start_if.server_if);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.server_if );
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_deregister
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      deregister an application.
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status = BTA_GATT_ERROR;
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_CBACK    *p_cback = NULL;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               i;
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.server_if = p_msg->api_dereg.server_if;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.reg_oper.status = status;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if)
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cback = p_cb->rcb[i].p_cback;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_OK;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* deregister the app */
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GATT_Deregister(p_cb->rcb[i].gatt_if);
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reset cb */
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB));
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.reg_oper.status = status;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cback)
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data);
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("application not registered.");
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_create_srvc
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to create a service.
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               rcb_idx;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               srvc_idx;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              service_id = 0;
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.create.status = BTA_GATT_ERROR;
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_ERROR1("create service rcb_idx = %d", rcb_idx);
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (rcb_idx != BTA_GATTS_INVALID_APP)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP)
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* create the service now */
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = GATTS_CreateService (p_cb->rcb[rcb_idx].gatt_if,
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              &p_msg->api_create_svc.service_uuid,
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.inst,
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.num_handle,
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_msg->api_create_svc.is_pri);
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (service_id != 0)
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].service_id   = service_id;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].inst_num     = p_msg->api_create_svc.inst;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->srvc_cb[srvc_idx].idx          = srvc_idx;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.status      = BTA_GATT_OK;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.service_id  = service_id;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.is_primary  = p_msg->api_create_svc.is_pri;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.create.server_if   = p_cb->rcb[rcb_idx].gatt_if;
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cb_data.status  = BTA_GATT_ERROR;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB));
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("service creation failed.");
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.create.svc_instance= p_msg->api_create_svc.inst;
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->rcb[rcb_idx].p_cback)
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* p_cb->rcb[rcb_idx].p_cback)(BTA_GATTS_CREATE_EVT, &cb_data);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* application not registered */
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("Application not registered");
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_include_srvc
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add an included service.
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * p_msg)
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddIncludeService(p_msg->api_add_incl_srvc.hdr.layer_specific,
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_incl_srvc.included_service_id);
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_INCL_SRVC_EVT, &cb_data);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_char
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add characteristic.
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddCharacteristic(p_msg->api_add_char.hdr.layer_specific,
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      &p_msg->api_add_char.char_uuid,
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_char.perm,
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_msg->api_add_char.property);
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char.char_uuid, sizeof(tBT_UUID));
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_EVT, &cb_data);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_add_char_descr
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to add characteristic descriptor.
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          attr_id = 0;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_id = GATTS_AddCharDescriptor(p_msg->api_add_char_descr.hdr.layer_specific,
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       p_msg->api_add_char_descr.perm,
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       &p_msg->api_add_char_descr.descr_uuid);
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.server_if = p_rcb->gatt_if;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.add_result.attr_id = attr_id;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char_descr.descr_uuid, sizeof(tBT_UUID));
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_id)
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_OK;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.add_result.status = BTA_GATT_ERROR;
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_DESCR_EVT, &cb_data);
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_delete_service
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to delete a service.
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_DeleteService(p_rcb->gatt_if,
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            &p_srvc_cb->service_uuid,
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_srvc_cb->inst_num))
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_OK;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB));
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_ERROR;
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data);
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_start_service
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to start a service.
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_StartService(p_rcb->gatt_if,
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_srvc_cb->service_id,
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_msg->api_start.transport) ==  GATT_SUCCESS)
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG1("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_OK;
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.srvc_oper.status = BTA_GATT_ERROR;
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_START_EVT, &cb_data);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_stop_service
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      action function to stop a service.
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GATTS_StopService(p_srvc_cb->service_id);
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cb_data.srvc_oper.status = BTA_GATT_OK;
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_ERROR1("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb->p_cback)
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_send_rsp
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATTS send response.
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific,
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->api_rsp.trans_id,
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->api_rsp.status,
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS)
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("Sending response failed");
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_send_rsp
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATTS send response.
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_SRVC_CB  *p_srvc_cb;
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status;
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id);
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_srvc_cb )
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_msg->api_indicate.need_confirm)
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific,
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_msg->api_indicate.attr_id,
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_msg->api_indicate.len,
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_msg->api_indicate.value);
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = GATTS_HandleValueNotification (p_msg->api_indicate.hdr.layer_specific,
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_msg->api_indicate.attr_id,
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_msg->api_indicate.len,
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_msg->api_indicate.value);
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != GATT_SUCCESS &&
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->api_indicate.need_confirm &&
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)(BTA_GATTS_CONF_EVT, (tBTA_GATTS *)&status);
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Not an registered servce attribute ID: 0x%04x", p_msg->api_indicate.attr_id);
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_open
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB      *p_rcb=NULL;
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL)
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda, p_msg->api_open.is_direct))
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_GATT_OK;
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Inavlide server_if=%d", p_msg->api_open.server_if);
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb && p_rcb->p_cback)
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT,  (tBTA_GATTS *)&status);
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_cancel_open
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB      *p_rcb;
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL)
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda, p_msg->api_cancel_open.is_direct))
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("bta_gatts_cancel_open failed for open request");
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status= BTA_GATT_OK;
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb && p_rcb->p_cback)
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT,  (tBTA_GATTS *)&status);
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_close
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB     *p_rcb;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF            gatt_if;
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR             remote_bda;
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda))
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS)
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR1("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status= BTA_GATT_OK;
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb && p_rcb->p_cback)
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT,  (tBTA_GATTS *)&status);
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Unknown connection ID: %d", p_msg->hdr.layer_specific);
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_request_cback
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      GATTS attribute request callback.
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_send_request_cback (UINT16 conn_id,
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 trans_id,
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data)
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS          cb_data;
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB     *p_rcb;
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF            gatt_if;
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&cb_data, 0 , sizeof(tBTA_GATTS));
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda))
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG3 ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d", conn_id, trans_id, req_type);
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb && p_rcb->p_cback)
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.conn_id    = conn_id;
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.trans_id   = trans_id;
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.req_data.p_data     = (tBTA_GATTS_REQ_DATA *)p_data;
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_rcb->p_cback)(req_type,  &cb_data);
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR1("connection request on gatt_if[%d] is not interested", gatt_if);
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("request received on unknown connectino ID: %d", conn_id);
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_gatts_conn_cback
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      connection callback.
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  BOOLEAN connected, tGATT_DISCONN_REASON reason)
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS      cb_data;
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT;
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_GATTS_RCB  *p_reg;
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG4 ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        gatt_if, conn_id, connected, reason);
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG6("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reg && p_reg->p_cback)
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.conn_id = conn_id;
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.server_if = gatt_if;
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cb_data.conn.reason = reason;
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_reg->p_cback)(evt, &cb_data);
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_gatts_conn_cback server_if=%d not found",gatt_if);
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */
840