bta_gatts_act.cc revision 258c2538e3b62a8cdb403f2730c45d721e5292b4
1abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn/******************************************************************************
2abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
3abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  Copyright (C) 2003-2012 Broadcom Corporation
4abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
5abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  Licensed under the Apache License, Version 2.0 (the "License");
6abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  you may not use this file except in compliance with the License.
7abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  You may obtain a copy of the License at:
8abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
9abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  http://www.apache.org/licenses/LICENSE-2.0
10abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
11abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  Unless required by applicable law or agreed to in writing, software
12abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  distributed under the License is distributed on an "AS IS" BASIS,
13abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  See the License for the specific language governing permissions and
15abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *  limitations under the License.
16abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
172eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam ******************************************************************************/
18abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
194fdcec71dce130be3363dba93e685789797fee8eSteven Ng/******************************************************************************
204fdcec71dce130be3363dba93e685789797fee8eSteven Ng *
212eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam *  This file contains the GATT Server action functions for the state
222eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam *  machine.
234fdcec71dce130be3363dba93e685789797fee8eSteven Ng *
24524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav ******************************************************************************/
2517e9e1933055b207473b488595b2887bfcaea32eJim Miller
263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang#include "bt_target.h"
2852c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam
293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
304037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackborn
31abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn#include "utl.h"
32abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn#include "bt_common.h"
33751de372750336c2dbc6ed656de84b881ede0858Ricky Wai#include "bta_sys.h"
3439b467482d1bf256a111c757e9b7621c6f523271Jason Monk#include "bta_gatts_int.h"
3539b467482d1bf256a111c757e9b7621c6f523271Jason Monk#include "bta_gatts_co.h"
3639b467482d1bf256a111c757e9b7621c6f523271Jason Monk#include "btm_ble_api.h"
37abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn#include "btif/include/btif_debug_conn.h"
385437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos#include <string.h>
39f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen
4023c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrencestatic void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
41d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromstatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req,
42edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                                tGATTS_SRV_CHG_RSP *p_rsp);
4339b467482d1bf256a111c757e9b7621c6f523271Jason Monk
4439b467482d1bf256a111c757e9b7621c6f523271Jason Monkstatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
4562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                                      BOOLEAN connected, tGATT_DISCONN_REASON reason,
4627d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings                                      tGATT_TRANSPORT transport);
473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangstatic void bta_gatts_send_request_cback (UINT16 conn_id,
48524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                                          UINT32 trans_id,
494fdcec71dce130be3363dba93e685789797fee8eSteven Ng                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data);
50d16c9b7c3100b7ba653dcd58db036500dd220896Jim Millerstatic void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested);
51265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammer
526465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunnestatic tGATT_CBACK bta_gatts_cback =
532eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam{
542eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    bta_gatts_conn_cback,
552eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    NULL,
562eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    NULL,
572eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    NULL,
582eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    bta_gatts_send_request_cback,
59ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang    NULL,
604fdcec71dce130be3363dba93e685789797fee8eSteven Ng    bta_gatts_cong_cback
614fdcec71dce130be3363dba93e685789797fee8eSteven Ng};
629c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka
632eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice LamtGATT_APPL_INFO bta_gatts_nv_cback =
649c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka{
659c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka    bta_gatts_nv_save_cback,
66751de372750336c2dbc6ed656de84b881ede0858Ricky Wai    bta_gatts_nv_srv_chg_cback
67751de372750336c2dbc6ed656de84b881ede0858Ricky Wai};
68263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio
690698a216311acd9ab52224602d1a75c08bf89f04Jim Miller/*******************************************************************************
70abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn**
71abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn** Function         bta_gatts_nv_save_cback
7217e9e1933055b207473b488595b2887bfcaea32eJim Miller**
7317e9e1933055b207473b488595b2887bfcaea32eJim Miller** Description      NV save callback function.
7452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam**
7592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini** Parameter        is_add: true is to add a handle range; otherwise is to delete.
7692779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini** Returns          none.
774fdcec71dce130be3363dba93e685789797fee8eSteven Ng**
784fdcec71dce130be3363dba93e685789797fee8eSteven Ng*******************************************************************************/
7992779ce70156031f4fa3b8c2d84305f5b3b44105Udam Sainistatic void bta_gatts_nv_save_cback(BOOLEAN is_add, tGATTS_HNDL_RANGE *p_hndl_range)
8092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini{
8117e9e1933055b207473b488595b2887bfcaea32eJim Miller    bta_gatts_co_update_handle_range(is_add, (tBTA_GATTS_HNDL_RANGE *)p_hndl_range);
82a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani}
83a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
84a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
85a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani/*******************************************************************************
86a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani**
87a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani** Function         bta_gatts_nv_srv_chg_cback
8817e9e1933055b207473b488595b2887bfcaea32eJim Miller**
89bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller** Description      NV save callback function.
9052c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam**
9152c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam** Parameter        is_add: true is to add a handle range; otherwise is to delete.
9252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam** Returns          none.
9352c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam**
9466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani*******************************************************************************/
9566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasanistatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
9666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                                              tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
9717e9e1933055b207473b488595b2887bfcaea32eJim Miller{
98edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd,
993fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                                (tBTA_GATTS_SRV_CHG_REQ *) p_req,
10017e9e1933055b207473b488595b2887bfcaea32eJim Miller                                (tBTA_GATTS_SRV_CHG_RSP *) p_rsp);
1014fdcec71dce130be3363dba93e685789797fee8eSteven Ng}
10217e9e1933055b207473b488595b2887bfcaea32eJim Miller
10347f1cd4325e839dd33273a451fa052e83789e483Jim Miller
104d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom/*******************************************************************************
1053fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller**
10646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Function         bta_gatts_enable
10746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
1083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Description      enable BTA GATTS module.
10917e9e1933055b207473b488595b2887bfcaea32eJim Miller**
110edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns          none.
111edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
112edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam*******************************************************************************/
113edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lamvoid bta_gatts_enable(tBTA_GATTS_CB *p_cb)
114edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{
115edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    UINT8 index=0;
116edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    tBTA_GATTS_HNDL_RANGE handle_range;
117edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
118edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    if (p_cb->enabled)
119edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
120edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        APPL_TRACE_DEBUG("GATTS already enabled.");
121edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
122edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    else
123edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
124edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
125edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
126edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        p_cb->enabled = TRUE;
127edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
128edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        while ( bta_gatts_co_load_handle_range(index, &handle_range))
129edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        {
130edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            GATTS_AddHandleRange((tGATTS_HNDL_RANGE *)&handle_range);
1313fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE));
1323fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            index++;
1333fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        }
1344fdcec71dce130be3363dba93e685789797fee8eSteven Ng
1354fdcec71dce130be3363dba93e685789797fee8eSteven Ng        APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index);
13680412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
13717e9e1933055b207473b488595b2887bfcaea32eJim Miller        if (!GATTS_NVRegister(&bta_gatts_nv_cback))
13817e9e1933055b207473b488595b2887bfcaea32eJim Miller        {
139d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            APPL_TRACE_ERROR("BTA GATTS NV register failed.");
1406609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
1416609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales    }
14217e9e1933055b207473b488595b2887bfcaea32eJim Miller}
14347f1cd4325e839dd33273a451fa052e83789e483Jim Miller
14446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller/*******************************************************************************
14546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
14662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos** Function         bta_gatts_api_disable
147a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales**
1480698a216311acd9ab52224602d1a75c08bf89f04Jim Miller** Description      disable BTA GATTS module.
1499218687e4baaf0226ef16b58f78123d979711e5dJim Miller**
150fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri** Returns          none.
15192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini**
152e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic*******************************************************************************/
1534fdcec71dce130be3363dba93e685789797fee8eSteven Ngvoid bta_gatts_api_disable(tBTA_GATTS_CB *p_cb)
154ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn{
155edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    UINT8 i;
15617e9e1933055b207473b488595b2887bfcaea32eJim Miller
1578ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini    if (p_cb->enabled)
1588ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini    {
15917e9e1933055b207473b488595b2887bfcaea32eJim Miller        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
1606507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang        {
1619d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren            if (p_cb->rcb[i].in_use)
1628a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren            {
1638a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren                GATT_Deregister(p_cb->rcb[i].gatt_if);
1648a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren            }
16517e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
16617e9e1933055b207473b488595b2887bfcaea32eJim Miller        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
16717e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
1684fdcec71dce130be3363dba93e685789797fee8eSteven Ng    else
169ab50807d1edacb4fca5447525bb5270a853eaafcJeff Sharkey    {
17017e9e1933055b207473b488595b2887bfcaea32eJim Miller        APPL_TRACE_ERROR("GATTS not enabled");
171d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom    }
17217e9e1933055b207473b488595b2887bfcaea32eJim Miller}
1730698a216311acd9ab52224602d1a75c08bf89f04Jim Miller
1744fdcec71dce130be3363dba93e685789797fee8eSteven Ng/*******************************************************************************
1754fdcec71dce130be3363dba93e685789797fee8eSteven Ng**
17617e9e1933055b207473b488595b2887bfcaea32eJim Miller** Function         bta_gatts_register
177c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett**
178c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett** Description      register an application.
179c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett**
18066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani** Returns          none.
18166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani**
18240e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov*******************************************************************************/
18340e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafovvoid bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
18466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani{
18592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini    tBTA_GATTS_INT_START_IF  *p_buf;
186c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett    tBTA_GATTS               cb_data;
1876609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales    tBTA_GATT_STATUS         status = BTA_GATT_OK;
1886609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales    UINT8                    i, first_unuse = 0xff;
1896609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
1906609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales    if (p_cb->enabled == FALSE)
191c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam    {
192c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam        bta_gatts_enable(p_cb);
19362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    }
19462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
195ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
1966609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales    {
19717e9e1933055b207473b488595b2887bfcaea32eJim Miller        if (p_cb->rcb[i].in_use)
19817e9e1933055b207473b488595b2887bfcaea32eJim Miller        {
19947f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid))
20046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            {
20146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                APPL_TRACE_ERROR("application already registered.");
20246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                status = BTA_GATT_DUP_REG;
20340e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                break;
20440e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov            }
20540e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov        }
20640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov    }
20717e9e1933055b207473b488595b2887bfcaea32eJim Miller
208bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    if (status == BTA_GATT_OK)
2098f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak    {
2108f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
2118f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak        {
2128f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            if (first_unuse == 0xff && !p_cb->rcb[i].in_use)
2138f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            {
214ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                first_unuse = i;
215ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                break;
2168f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            }
217ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz        }
218edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
2194fdcec71dce130be3363dba93e685789797fee8eSteven Ng        cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF;
220788671647c6d615684d159a94ffb5b4367df6896Robin Lee// btla-specific ++
221bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra        memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
222bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra// btla-specific --
223bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra        if (first_unuse != 0xff)
224bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra        {
225e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse);
226e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
22747f1cd4325e839dd33273a451fa052e83789e483Jim Miller            p_cb->rcb[first_unuse].in_use = TRUE;
2282bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam            p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
22962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
23062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            cb_data.reg_oper.server_if      =
23162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            p_cb->rcb[first_unuse].gatt_if  =
23262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
23347f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if ( !p_cb->rcb[first_unuse].gatt_if)
2346370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            {
2356370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                status = BTA_GATT_NO_RESOURCES;
236788671647c6d615684d159a94ffb5b4367df6896Robin Lee            }
237788671647c6d615684d159a94ffb5b4367df6896Robin Lee            else
2384bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai            {
2394bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                if ((p_buf =
2404bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                  (tBTA_GATTS_INT_START_IF *) osi_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL)
241fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                {
24217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    p_buf->hdr.event    = BTA_GATTS_INT_START_IF_EVT;
2432bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam                    p_buf->server_if    = p_cb->rcb[first_unuse].gatt_if;
24447f1cd4325e839dd33273a451fa052e83789e483Jim Miller
24547f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    bta_sys_sendmsg(p_buf);
24617e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
247bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                else
2488ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini                {
2498ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini                    status = BTA_GATT_NO_RESOURCES;
2508ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini                    memset( &p_cb->rcb[first_unuse], 0 , sizeof(tBTA_GATTS_RCB));
2518ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini                }
25287fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            }
25339b467482d1bf256a111c757e9b7621c6f523271Jason Monk        }
2544fdcec71dce130be3363dba93e685789797fee8eSteven Ng        else
2554fdcec71dce130be3363dba93e685789797fee8eSteven Ng        {
2564fdcec71dce130be3363dba93e685789797fee8eSteven Ng            status = BTA_GATT_NO_RESOURCES;
2574fdcec71dce130be3363dba93e685789797fee8eSteven Ng        }
25887fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam
25987fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam    }
26087fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam    cb_data.reg_oper.status = status;
26187fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam    if (p_msg->api_reg.p_cback)
26239b467482d1bf256a111c757e9b7621c6f523271Jason Monk        (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data);
26317e9e1933055b207473b488595b2887bfcaea32eJim Miller}
26427d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
265fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri
2663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang/*******************************************************************************
2673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang**
2683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Function         bta_gatts_start_if
2693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang**
2704fdcec71dce130be3363dba93e685789797fee8eSteven Ng** Description      start an application interface.
271436256c36d69549c77320d073bef27649c1b1d6eSteven Ng**
272436256c36d69549c77320d073bef27649c1b1d6eSteven Ng** Returns          none.
2734fdcec71dce130be3363dba93e685789797fee8eSteven Ng**
2748f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak*******************************************************************************/
2758f41b9b665369356aae5a2410ebc62e79b9122a2Tony Makvoid bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
276436256c36d69549c77320d073bef27649c1b1d6eSteven Ng{
27740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov    UNUSED(p_cb);
27840e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov
27940e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov    if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if))
28040e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov    {
2814fdcec71dce130be3363dba93e685789797fee8eSteven Ng        GATT_StartIf(p_msg->int_start_if.server_if);
2824fdcec71dce130be3363dba93e685789797fee8eSteven Ng    }
28317e9e1933055b207473b488595b2887bfcaea32eJim Miller    else
2843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    {
28517e9e1933055b207473b488595b2887bfcaea32eJim Miller        APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
286bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            p_msg->int_start_if.server_if );
287bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    }
28846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller}
28946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller/*******************************************************************************
29046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
29146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Function         bta_gatts_deregister
29246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
29346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Description      deregister an application.
29446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
295a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales** Returns          none.
296a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales**
29746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller*******************************************************************************/
298146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikovvoid bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
299f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen{
30093bcfcb14d42ea0884b922ae1a4d84a6955ed835Clara Bayarri    tBTA_GATT_STATUS    status = BTA_GATT_ERROR;
301f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen    tBTA_GATTS_CBACK    *p_cback = NULL;
302fb4c583dba1fb8885ff9369bdab916eaa61b42bdPaul Lawrence    UINT8               i;
303146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov    tBTA_GATTS          cb_data;
30446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
30546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller    cb_data.reg_oper.server_if = p_msg->api_dereg.server_if;
306edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini    cb_data.reg_oper.status = status;
307edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
3082eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
30962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    {
31062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if)
31162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        {
312ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam            p_cback = p_cb->rcb[i].p_cback;
3130698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            status = BTA_GATT_OK;
3140698a216311acd9ab52224602d1a75c08bf89f04Jim Miller
3150698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            /* deregister the app */
316ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam            GATT_Deregister(p_cb->rcb[i].gatt_if);
3170698a216311acd9ab52224602d1a75c08bf89f04Jim Miller
318edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            /* reset cb */
319edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB));
320c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam            cb_data.reg_oper.status = status;
321c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam            break;
32292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        }
323378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng    }
324378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng
325378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng    if (p_cback)
326378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng    {
327378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng        (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data);
32846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller    }
32962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    else
33062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    {
33162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        APPL_TRACE_ERROR("application not registered.");
33262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    }
33362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos}
334edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/*******************************************************************************
33546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
33646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Function         bta_gatts_create_srvc
33746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
33817e9e1933055b207473b488595b2887bfcaea32eJim Miller** Description      action function to create a service.
33917e9e1933055b207473b488595b2887bfcaea32eJim Miller**
34017e9e1933055b207473b488595b2887bfcaea32eJim Miller** Returns          none.
34147f1cd4325e839dd33273a451fa052e83789e483Jim Miller**
34217e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/
34317e9e1933055b207473b488595b2887bfcaea32eJim Millervoid bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
344a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales{
3452bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam    UINT8               rcb_idx;
34662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    tBTA_GATTS          cb_data;
34762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    UINT8               srvc_idx;
34862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    UINT16              service_id = 0;
34962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
35062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    cb_data.create.status = BTA_GATT_ERROR;
35162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
35262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if);
35362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
354e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam    APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx);
355e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam
35677181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos    if (rcb_idx != BTA_GATTS_INVALID_APP)
357e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam    {
358e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam        if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP)
359edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        {
360edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            /* create the service now */
361edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            service_id = GATTS_CreateService (p_cb->rcb[rcb_idx].gatt_if,
362edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                              &p_msg->api_create_svc.service_uuid,
363edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                              p_msg->api_create_svc.inst,
364edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                              p_msg->api_create_svc.num_handle,
365edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                              p_msg->api_create_svc.is_pri);
366edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
367edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            if (service_id != 0)
368e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam            {
3694fdcec71dce130be3363dba93e685789797fee8eSteven Ng                memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid,
3704fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
371d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini                p_cb->srvc_cb[srvc_idx].service_id   = service_id;
3724fdcec71dce130be3363dba93e685789797fee8eSteven Ng                p_cb->srvc_cb[srvc_idx].inst_num     = p_msg->api_create_svc.inst;
3734fdcec71dce130be3363dba93e685789797fee8eSteven Ng                p_cb->srvc_cb[srvc_idx].idx          = srvc_idx;
3744fdcec71dce130be3363dba93e685789797fee8eSteven Ng
3758f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                cb_data.create.status      = BTA_GATT_OK;
3768f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                cb_data.create.service_id  = service_id;
3774fdcec71dce130be3363dba93e685789797fee8eSteven Ng// btla-specific ++
3784fdcec71dce130be3363dba93e685789797fee8eSteven Ng                cb_data.create.is_primary  = p_msg->api_create_svc.is_pri;
3794fdcec71dce130be3363dba93e685789797fee8eSteven Ng// btla-specific --
3804fdcec71dce130be3363dba93e685789797fee8eSteven Ng                cb_data.create.server_if   = p_cb->rcb[rcb_idx].gatt_if;
3814fdcec71dce130be3363dba93e685789797fee8eSteven Ng            }
3824fdcec71dce130be3363dba93e685789797fee8eSteven Ng            else
3834fdcec71dce130be3363dba93e685789797fee8eSteven Ng            {
3844fdcec71dce130be3363dba93e685789797fee8eSteven Ng                cb_data.status  = BTA_GATT_ERROR;
38517e9e1933055b207473b488595b2887bfcaea32eJim Miller                memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB));
38617e9e1933055b207473b488595b2887bfcaea32eJim Miller                APPL_TRACE_ERROR("service creation failed.");
38717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
38817e9e1933055b207473b488595b2887bfcaea32eJim Miller// btla-specific ++
38962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
39062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            cb_data.create.svc_instance= p_msg->api_create_svc.inst;
39162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos// btla-specific --
392bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
393bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        if (p_cb->rcb[rcb_idx].p_cback)
394d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini            (* p_cb->rcb[rcb_idx].p_cback)(BTA_GATTS_CREATE_EVT, &cb_data);
395d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini    }
396d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini    else /* application not registered */
397d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini    {
39817e9e1933055b207473b488595b2887bfcaea32eJim Miller        APPL_TRACE_ERROR("Application not registered");
39917e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
40017e9e1933055b207473b488595b2887bfcaea32eJim Miller}
40117e9e1933055b207473b488595b2887bfcaea32eJim Miller/*******************************************************************************
40217e9e1933055b207473b488595b2887bfcaea32eJim Miller**
40347f1cd4325e839dd33273a451fa052e83789e483Jim Miller** Function         bta_gatts_add_include_srvc
40446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller**
40546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Description      action function to add an included service.
40640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov**
40740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov** Returns          none.
40840e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov**
40917e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/
410bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millervoid bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * p_msg)
4112bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam{
4125541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
4135541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller    UINT16          attr_id = 0;
41417e9e1933055b207473b488595b2887bfcaea32eJim Miller    tBTA_GATTS      cb_data;
4156370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler
4165541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller    attr_id = GATTS_AddIncludeService(p_msg->api_add_incl_srvc.hdr.layer_specific,
417edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                      p_msg->api_add_incl_srvc.included_service_id);
4183fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller
4193fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller    cb_data.add_result.server_if = p_rcb->gatt_if;
42017e9e1933055b207473b488595b2887bfcaea32eJim Miller    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
42117e9e1933055b207473b488595b2887bfcaea32eJim Miller    cb_data.add_result.attr_id = attr_id;
42217e9e1933055b207473b488595b2887bfcaea32eJim Miller
42317e9e1933055b207473b488595b2887bfcaea32eJim Miller    if (attr_id)
4248ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini    {
4253fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        cb_data.add_result.status = BTA_GATT_OK;
426bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini    }
4279a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk    else
428524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav    {
4292bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam        cb_data.add_result.status = BTA_GATT_ERROR;
4302bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam    }
431edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
432bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    if (p_rcb->p_cback)
433abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        (*p_rcb->p_cback)(BTA_GATTS_ADD_INCL_SRVC_EVT, &cb_data);
434bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller}
4358ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini/*******************************************************************************
4368ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini**
437a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey** Function         bta_gatts_add_char
438a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey**
439edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Description      action function to add characteristic.
440159dff63a5e8e1286f0d42d400b64d43fb104649Jeff Sharkey**
441edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns          none.
442edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
4438ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini*******************************************************************************/
4448ef4c620031973187eefc1f1f1a330e8fd26696dUdam Sainivoid bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
445bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini{
446bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
447edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    UINT16          attr_id = 0;
448edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    tBTA_GATTS      cb_data;
449edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
450edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    attr_id = GATTS_AddCharacteristic(p_msg->api_add_char.hdr.layer_specific,
451edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                      &p_msg->api_add_char.char_uuid,
452bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                                      p_msg->api_add_char.perm,
453e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                                      p_msg->api_add_char.property);
454e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic    cb_data.add_result.server_if = p_rcb->gatt_if;
455edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
456edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    cb_data.add_result.attr_id = attr_id;
457e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic// btla-specific ++
458edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char.char_uuid, sizeof(tBT_UUID));
459e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic// btla-specific --
4604fdcec71dce130be3363dba93e685789797fee8eSteven Ng
4614fdcec71dce130be3363dba93e685789797fee8eSteven Ng    if (attr_id)
4624fdcec71dce130be3363dba93e685789797fee8eSteven Ng    {
4634fdcec71dce130be3363dba93e685789797fee8eSteven Ng        cb_data.add_result.status = BTA_GATT_OK;
464bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini    }
465bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini    else
466edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
467edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        cb_data.add_result.status = BTA_GATT_ERROR;
468edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
469edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
470edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    if (p_rcb->p_cback)
471edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_EVT, &cb_data);
472edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam}
473edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/*******************************************************************************
474edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
475edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Function         bta_gatts_add_char_descr
476edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
477edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Description      action function to add characteristic descriptor.
478edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
479edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns          none.
480edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
481edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam*******************************************************************************/
482edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lamvoid bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
483edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{
484edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    tBTA_GATTS_RCB  *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
485edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    UINT16          attr_id = 0;
486edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    tBTA_GATTS      cb_data;
4879a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
4889a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk    attr_id = GATTS_AddCharDescriptor(p_msg->api_add_char_descr.hdr.layer_specific,
4899a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                                       p_msg->api_add_char_descr.perm,
4909a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                                       &p_msg->api_add_char_descr.descr_uuid);
4919a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
4929a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk    cb_data.add_result.server_if = p_rcb->gatt_if;
4939a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk    cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
4949a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk    cb_data.add_result.attr_id = attr_id;
4959a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk// btla-specific ++
496e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk    memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char_descr.descr_uuid, sizeof(tBT_UUID));
497e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk// btla-specific --
4987402b2514358e02a0e0adde982b6deb8552dc28aClara Bayarri
499edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    if (attr_id)
5009a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk    {
501edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        cb_data.add_result.status = BTA_GATT_OK;
502edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
503edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    else
504edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
505d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        cb_data.add_result.status = BTA_GATT_ERROR;
506d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom    }
50717e9e1933055b207473b488595b2887bfcaea32eJim Miller
508df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang    if (p_rcb->p_cback)
509df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_DESCR_EVT, &cb_data);
510df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
511df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang}
5123fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller/*******************************************************************************
5133fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller**
514df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang** Function         bta_gatts_delete_service
5153fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller**
5163fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller** Description      action function to delete a service.
517df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang**
518df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang** Returns          none.
519df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang**
52017e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/
52117e9e1933055b207473b488595b2887bfcaea32eJim Millervoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
52217e9e1933055b207473b488595b2887bfcaea32eJim Miller{
523df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
52417e9e1933055b207473b488595b2887bfcaea32eJim Miller    tBTA_GATTS      cb_data;
525df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
526f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
527cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
528783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
52925c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak    if (GATTS_DeleteService(p_rcb->gatt_if,
5309c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                            &p_srvc_cb->service_uuid,
531f755baf1c3b8fcbcee68720c8367e03381fffb4bSudheer Shanka                            p_srvc_cb->inst_num))
532edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
533edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        cb_data.srvc_oper.status = BTA_GATT_OK;
534edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB));
535edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
5369c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka    else
537edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
538edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        cb_data.srvc_oper.status = BTA_GATT_ERROR;
539edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
540edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
541df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang    if (p_rcb->p_cback)
542edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data);
543df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
544f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos}
545cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani/*******************************************************************************
5469c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka**
5479c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** Function         bta_gatts_start_service
5485541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller**
5499c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** Description      action function to start a service.
5509c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka**
5519c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** Returns          none.
55217e9e1933055b207473b488595b2887bfcaea32eJim Miller**
55317e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/
5549c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankavoid bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5559c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka{
55617e9e1933055b207473b488595b2887bfcaea32eJim Miller    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
557bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    tBTA_GATTS      cb_data;
558bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
559bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
560bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
561524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
56223c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence    if (GATTS_StartService(p_rcb->gatt_if,
56323c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence                           p_srvc_cb->service_id,
56423c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence                           p_msg->api_start.transport) ==  GATT_SUCCESS)
56523c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence    {
56623c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence        APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
56723c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence        cb_data.srvc_oper.status = BTA_GATT_OK;
56823c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence    }
56940ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav    else
57040ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav    {
57140ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav        cb_data.srvc_oper.status = BTA_GATT_ERROR;
572524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav    }
573524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
574524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav    if (p_rcb->p_cback)
575524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        (*p_rcb->p_cback)(BTA_GATTS_START_EVT, &cb_data);
576524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
577edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam}
578edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/*******************************************************************************
579edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
580edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Function         bta_gatts_stop_service
581524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav**
582524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav** Description      action function to stop a service.
5832eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam**
5842eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Returns          none.
5856b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam**
5866b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam*******************************************************************************/
5872eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
5882eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam{
5892eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
5902eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    tBTA_GATTS      cb_data;
5912eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    UNUSED(p_msg);
592b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam
5932eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    GATTS_StopService(p_srvc_cb->service_id);
5942eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
5952eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
59640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov    cb_data.srvc_oper.status = BTA_GATT_OK;
59740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov    APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
5982eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam
5992eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    if (p_rcb->p_cback)
6002eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam        (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
6016609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
6026609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales}
6032eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam/*******************************************************************************
6042eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam**
6052eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Function         bta_gatts_send_rsp
606b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam**
6072eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Description      GATTS send response.
6082eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam**
6092eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Returns          none.
61040e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov**
61140e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov*******************************************************************************/
6122eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamvoid bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
6132eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam{
6142eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    UNUSED(p_cb);
615a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
616a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales    if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific,
617ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                        p_msg->api_rsp.trans_id,
618edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                        p_msg->api_rsp.status,
619edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                        (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS)
620edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini    {
621ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        APPL_TRACE_ERROR("Sending response failed");
622ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam    }
6235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
62417e9e1933055b207473b488595b2887bfcaea32eJim Miller}
62517e9e1933055b207473b488595b2887bfcaea32eJim Miller/*******************************************************************************
62617e9e1933055b207473b488595b2887bfcaea32eJim Miller**
62717e9e1933055b207473b488595b2887bfcaea32eJim Miller** Function         bta_gatts_indicate_handle
6286370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler**
62917e9e1933055b207473b488595b2887bfcaea32eJim Miller** Description      GATTS send handle value indication or notification.
630edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
631edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns          none.
632edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam**
63317e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/
63417e9e1933055b207473b488595b2887bfcaea32eJim Millervoid bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
635edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{
6366370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler    tBTA_GATTS_SRVC_CB  *p_srvc_cb;
63717e9e1933055b207473b488595b2887bfcaea32eJim Miller    tBTA_GATTS_RCB      *p_rcb = NULL;
6386370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler    tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
63917e9e1933055b207473b488595b2887bfcaea32eJim Miller    tGATT_IF            gatt_if;
640bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller    BD_ADDR             remote_bda;
641edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    tBTA_TRANSPORT transport;
6422eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam    tBTA_GATTS          cb_data;
643edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
644edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id);
645edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
646edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    if (p_srvc_cb )
647edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
6484fdcec71dce130be3363dba93e685789797fee8eSteven Ng        if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
6494fdcec71dce130be3363dba93e685789797fee8eSteven Ng            &gatt_if, remote_bda, &transport))
6504fdcec71dce130be3363dba93e685789797fee8eSteven Ng        {
6514fdcec71dce130be3363dba93e685789797fee8eSteven Ng            p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
652edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
653edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (p_msg->api_indicate.need_confirm)
654edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
655edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific,
6564bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                                                      p_msg->api_indicate.attr_id,
65779b4ebffebb48449d5d2126795f6c729eea25ec4Rubin Xu                                                      p_msg->api_indicate.len,
658edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                                                      p_msg->api_indicate.value);
659edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            else
6604fdcec71dce130be3363dba93e685789797fee8eSteven Ng                status = GATTS_HandleValueNotification (p_msg->api_indicate.hdr.layer_specific,
661edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                                                        p_msg->api_indicate.attr_id,
662751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                                        p_msg->api_indicate.len,
663edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                                                        p_msg->api_indicate.value);
664edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
665c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross            /* if over BR_EDR, inform PM for mode change */
6662eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            if (transport == BTA_TRANSPORT_BR_EDR)
667edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            {
668e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
6692eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
670e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            }
67125c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak        }
67217e9e1933055b207473b488595b2887bfcaea32eJim Miller        else
67317e9e1933055b207473b488595b2887bfcaea32eJim Miller        {
67417e9e1933055b207473b488595b2887bfcaea32eJim Miller            APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification",
67517e9e1933055b207473b488595b2887bfcaea32eJim Miller                              p_msg->api_indicate.hdr.layer_specific);
6762eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam        }
67717e9e1933055b207473b488595b2887bfcaea32eJim Miller
6782eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam        if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
67917e9e1933055b207473b488595b2887bfcaea32eJim Miller            p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
68092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        {
68192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            cb_data.req_data.status = status;
68292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
683edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
684abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn            (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
685b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
686751de372750336c2dbc6ed656de84b881ede0858Ricky Wai    }
687dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai    else
688dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai    {
689dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai        APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x",
690dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                          p_msg->api_indicate.attr_id);
691dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai    }
692dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai}
693dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai
694dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai
695dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai/*******************************************************************************
696dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai**
697dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai** Function         bta_gatts_open
6987569bb18815437a2f656fc7ff4d57274c5055477Charles He**
6997569bb18815437a2f656fc7ff4d57274c5055477Charles He** Description
7007569bb18815437a2f656fc7ff4d57274c5055477Charles He**
7017569bb18815437a2f656fc7ff4d57274c5055477Charles He** Returns          none.
7027569bb18815437a2f656fc7ff4d57274c5055477Charles He**
703751de372750336c2dbc6ed656de84b881ede0858Ricky Wai*******************************************************************************/
704eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarrivoid bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
705dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai{
7067569bb18815437a2f656fc7ff4d57274c5055477Charles He    tBTA_GATTS_RCB      *p_rcb=NULL;
7077569bb18815437a2f656fc7ff4d57274c5055477Charles He    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
708dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai    UINT16              conn_id;
709dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai    UNUSED(p_cb);
710751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
711dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL)
712dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai    {
713dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai        /* should always get the connection ID */
714dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai        if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
715dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                        p_msg->api_open.is_direct, p_msg->api_open.transport))
716dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai        {
7175a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini            status = BTA_GATT_OK;
7185a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini
7195a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini            if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
7205a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                                            &conn_id, p_msg->api_open.transport))
7215a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini            {
7225a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                status = BTA_GATT_ALREADY_OPEN;
7239218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
7249218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
7259218687e4baaf0226ef16b58f78123d979711e5dJim Miller    }
726751de372750336c2dbc6ed656de84b881ede0858Ricky Wai    else
7278d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey    {
7288d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if);
7298d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey    }
730751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
731ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn    if (p_rcb && p_rcb->p_cback)
732751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT,  (tBTA_GATTS *)&status);
733ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn
734751de372750336c2dbc6ed656de84b881ede0858Ricky Wai}
735751de372750336c2dbc6ed656de84b881ede0858Ricky Wai/*******************************************************************************
736751de372750336c2dbc6ed656de84b881ede0858Ricky Wai**
737751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** Function         bta_gatts_cancel_open
738751de372750336c2dbc6ed656de84b881ede0858Ricky Wai**
739751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** Description
740751de372750336c2dbc6ed656de84b881ede0858Ricky Wai**
741751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** Returns          none.
742751de372750336c2dbc6ed656de84b881ede0858Ricky Wai**
743751de372750336c2dbc6ed656de84b881ede0858Ricky Wai*******************************************************************************/
744751de372750336c2dbc6ed656de84b881ede0858Ricky Waivoid bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
745751de372750336c2dbc6ed656de84b881ede0858Ricky Wai{
746751de372750336c2dbc6ed656de84b881ede0858Ricky Wai    tBTA_GATTS_RCB      *p_rcb;
747751de372750336c2dbc6ed656de84b881ede0858Ricky Wai    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
748751de372750336c2dbc6ed656de84b881ede0858Ricky Wai    UNUSED(p_cb);
749751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
7509218687e4baaf0226ef16b58f78123d979711e5dJim Miller    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL)
7519218687e4baaf0226ef16b58f78123d979711e5dJim Miller    {
7529218687e4baaf0226ef16b58f78123d979711e5dJim Miller        if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
7539218687e4baaf0226ef16b58f78123d979711e5dJim Miller                                p_msg->api_cancel_open.is_direct))
7549218687e4baaf0226ef16b58f78123d979711e5dJim Miller        {
755b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request");
756b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
757b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        else
758b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        {
759b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            status= BTA_GATT_OK;
76034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        }
761788671647c6d615684d159a94ffb5b4367df6896Robin Lee    }
76234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    else
76334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    {
76434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
76534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    }
76638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos
7678d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey    if (p_rcb && p_rcb->p_cback)
7688d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey        (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT,  (tBTA_GATTS *)&status);
7698d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey}
7708d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey/*******************************************************************************
7718d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey**
7728d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey** Function         bta_gatts_close
773788671647c6d615684d159a94ffb5b4367df6896Robin Lee**
774fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri** Description
7753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang**
77634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Returns          none.
77734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri**
77834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri*******************************************************************************/
77934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarrivoid bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
78034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri{
78134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    tBTA_GATTS_RCB     *p_rcb;
78234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
78334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    tGATT_IF            gatt_if;
78434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    BD_ADDR             remote_bda;
78534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    tBTA_GATT_TRANSPORT transport;
7863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
7873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    UNUSED(p_cb);
78834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
78934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport))
79034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    {
79134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS)
79234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        {
79334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
79434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        }
79534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        else
79634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        {
7973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            status= BTA_GATT_OK;
7983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
7993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
800e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
80134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
80234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        if (p_rcb && p_rcb->p_cback)
80334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        {
80434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            if (transport == BTA_TRANSPORT_BR_EDR)
80534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda);
80634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
80734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT,  (tBTA_GATTS *)&status);
80834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        }
80934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    }
81034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    else
8113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    {
81234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific);
81334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    }
81434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
81534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri}
81634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri/*******************************************************************************
81734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri**
81834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Function         bta_gatts_listen
81934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri**
82034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Description      Start or stop listening for LE connection on a GATT server
82134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri**
8223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Returns          none.
8233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang**
8243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang*******************************************************************************/
8253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangvoid bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
826edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{
827edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    tBTA_GATTS_RCB     *p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_listen.server_if);
8283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    tBTA_GATTS          cb_data;
8293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    UNUSED(p_cb);
8303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    cb_data.reg_oper.status = BTA_GATT_OK;
8323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    cb_data.reg_oper.server_if = p_msg->api_listen.server_if;
833edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
834edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    if (p_rcb == NULL)
835edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
836edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        APPL_TRACE_ERROR("Unknown GATTS application");
837edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        return;
838edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
839edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
840edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    if (!GATT_Listen(p_msg->api_listen.server_if,
841edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                     p_msg->api_listen.start,
842edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                     p_msg->api_listen.remote_bda))
843edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
844edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        cb_data.status = BTA_GATT_ERROR;
845edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        APPL_TRACE_ERROR("bta_gatts_listen Listen failed");
846edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
847edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
848edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    if (p_rcb->p_cback)
849edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        (*p_rcb->p_cback)(BTA_GATTS_LISTEN_EVT, &cb_data);
8503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang}
851edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
852edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/*******************************************************************************
8533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang**
8543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Function         bta_gatts_request_cback
8553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang**
85634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Description      GATTS attribute request callback.
85738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos**
8583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Returns          none.
85934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri**
86034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri*******************************************************************************/
8613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangstatic void bta_gatts_send_request_cback (UINT16 conn_id,
8623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                          UINT32 trans_id,
8633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data)
864ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang{
8653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    tBTA_GATTS          cb_data;
86634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    tBTA_GATTS_RCB     *p_rcb;
86738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos    tGATT_IF            gatt_if;
8683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    tBTA_GATT_TRANSPORT transport;
8693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
87034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri    memset(&cb_data, 0 , sizeof(tBTA_GATTS));
87134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
8723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
8733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang    {
8743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
87534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
87638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos        APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d",
8773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                            conn_id, trans_id, req_type);
8783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        if (p_rcb && p_rcb->p_cback)
8803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        {
8813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            /* if over BR_EDR, inform PM for mode change */
8823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (transport == BTA_TRANSPORT_BR_EDR)
8833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            {
8843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
8853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
8863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            cb_data.req_data.conn_id    = conn_id;
8893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            cb_data.req_data.trans_id   = trans_id;
8903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            cb_data.req_data.p_data     = (tBTA_GATTS_REQ_DATA *)p_data;
8913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            (*p_rcb->p_cback)(req_type,  &cb_data);
8933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        else
89534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        {
89638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if);
89738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos        }
898edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
899edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    else
900edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    {
901edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id);
902edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam    }
903edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam}
9043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
9053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang/*******************************************************************************
906ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang**
907ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang** Function         bta_gatts_conn_cback
908ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang**
909ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang** Description      connection callback.
910ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang**
9113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Returns          none.
912abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn**
913abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn*******************************************************************************/
914static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
915                                  BOOLEAN connected, tGATT_DISCONN_REASON reason,
916                                  tGATT_TRANSPORT transport)
917{
918    tBTA_GATTS      cb_data;
919    UINT8           evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT;
920    tBTA_GATTS_RCB  *p_reg;
921
922    APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
923                        gatt_if, conn_id, connected, reason);
924    APPL_TRACE_DEBUG("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
925                      bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
926
927    bt_bdaddr_t bdaddr;
928    bdcpy(bdaddr.address, bda);
929    if (connected)
930        btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
931    else
932        btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
933
934    p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
935
936    if (p_reg && p_reg->p_cback)
937    {
938        /* there is no RM for GATT */
939        if (transport == BTA_TRANSPORT_BR_EDR)
940        {
941            if (connected)
942                bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
943            else
944                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, bda);
945        }
946
947        cb_data.conn.conn_id = conn_id;
948        cb_data.conn.server_if = gatt_if;
949        cb_data.conn.reason = reason;
950        cb_data.conn.transport = transport;
951        memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
952        (*p_reg->p_cback)(evt, &cb_data);
953    }
954    else
955    {
956        APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if);
957    }
958}
959
960/*******************************************************************************
961**
962** Function         bta_gatts_cong_cback
963**
964** Description      congestion callback.
965**
966** Returns          none.
967**
968*******************************************************************************/
969static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested)
970{
971    tBTA_GATTS_RCB *p_rcb;
972    tGATT_IF gatt_if;
973    tBTA_GATT_TRANSPORT transport;
974    tBTA_GATTS cb_data;
975
976    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
977    {
978        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
979
980        if (p_rcb && p_rcb->p_cback)
981        {
982            cb_data.congest.conn_id = conn_id;
983            cb_data.congest.congested = congested;
984
985            (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
986        }
987    }
988}
989#endif /* BTA_GATT_INCLUDED */
990