15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2003-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the GATT Server action functions for the state 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * machine. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h" 32a11035b5ecbc6cbd9da5bd707683504c47e2744ePavlin Radoslavov#include "bt_common.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_co.h" 36781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach#include "btm_ble_api.h" 3789f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach#include "btif/include/btif_debug_conn.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range); 417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, 427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATTS_SRV_CHG_RSP *p_rsp); 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, 457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN connected, tGATT_DISCONN_REASON reason, 467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATT_TRANSPORT transport); 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_send_request_cback (UINT16 conn_id, 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id, 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data); 5017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested); 5117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tGATT_CBACK bta_gatts_cback = 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gatts_conn_cback, 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 587051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu bta_gatts_send_request_cback, 5917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach NULL, 6017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach bta_gatts_cong_cback 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_APPL_INFO bta_gatts_nv_cback = 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gatts_nv_save_cback, 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gatts_nv_srv_chg_cback 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_nv_save_cback 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description NV save callback function. 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter is_add: true is to add a handle range; otherwise is to delete. 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_nv_save_cback(BOOLEAN is_add, tGATTS_HNDL_RANGE *p_hndl_range) 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gatts_co_update_handle_range(is_add, (tBTA_GATTS_HNDL_RANGE *)p_hndl_range); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_nv_srv_chg_cback 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description NV save callback function. 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter is_add: true is to add a handle range; otherwise is to delete. 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, 967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd, 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (tBTA_GATTS_SRV_CHG_REQ *) p_req, 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (tBTA_GATTS_SRV_CHG_RSP *) p_rsp); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_enable 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description enable BTA GATTS module. 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_enable(tBTA_GATTS_CB *p_cb) 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index=0; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_HNDL_RANGE handle_range; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 118e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_cb->enabled) 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 120e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("GATTS already enabled."); 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 122e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach else 123e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 124e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach memset(p_cb, 0, sizeof(tBTA_GATTS_CB)); 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 126e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach p_cb->enabled = TRUE; 127e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 128e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach while ( bta_gatts_co_load_handle_range(index, &handle_range)) 129e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 130e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach GATTS_AddHandleRange((tGATTS_HNDL_RANGE *)&handle_range); 131e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE)); 132e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach index++; 133e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 134e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 135e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index); 136e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 137e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (!GATTS_NVRegister(&bta_gatts_nv_cback)) 138e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 139e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("BTA GATTS NV register failed."); 140e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 141e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 142e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach} 143e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 144e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/******************************************************************************* 145e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** 146e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Function bta_gatts_api_disable 147e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** 148e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Description disable BTA GATTS module. 149e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** 150e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** Returns none. 151e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** 152e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach*******************************************************************************/ 153e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbachvoid bta_gatts_api_disable(tBTA_GATTS_CB *p_cb) 154e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach{ 155e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach UINT8 i; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 157e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_cb->enabled) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 159e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 160e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 161e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_cb->rcb[i].in_use) 162e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 163e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach GATT_Deregister(p_cb->rcb[i].gatt_if); 164e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 165e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 166e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach memset(p_cb, 0, sizeof(tBTA_GATTS_CB)); 167e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 168e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach else 169e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 170e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("GATTS not enabled"); 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 173e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_register 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description register an application. 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_OK; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, first_unuse = 0xff; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 189e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_cb->enabled == FALSE) 190e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_gatts_enable(p_cb); 192e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->rcb[i].in_use) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid)) 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 200e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("application already registered."); 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_DUP_REG; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTA_GATT_OK) 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (first_unuse == 0xff && !p_cb->rcb[i].in_use) 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project first_unuse = i; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID)); 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (first_unuse != 0xff) 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 222e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rcb[first_unuse].in_use = TRUE; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID)); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.reg_oper.server_if = 22816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham p_cb->rcb[first_unuse].gatt_if = 2297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback); 2305fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if ( !p_cb->rcb[first_unuse].gatt_if) { 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_NO_RESOURCES; 2325fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov } else { 2335fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTA_GATTS_INT_START_IF *p_buf = 2345fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tBTA_GATTS_INT_START_IF *)osi_malloc(sizeof(tBTA_GATTS_INT_START_IF)); 2355fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT; 2365fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->server_if = p_cb->rcb[first_unuse].gatt_if; 2375fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 2385fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_sys_sendmsg(p_buf); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2405fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov } else { 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_NO_RESOURCES; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.reg_oper.status = status; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg->api_reg.p_cback) 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data); 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_start_if 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description start an application interface. 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2625cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_cb); 2635cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if)) 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_StartIf(p_msg->int_start_if.server_if); 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 270e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d", 2717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_msg->int_start_if.server_if ); 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_deregister 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description deregister an application. 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status = BTA_GATT_ERROR; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_CBACK *p_cback = NULL; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.reg_oper.server_if = p_msg->api_dereg.server_if; 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.reg_oper.status = status; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cback = p_cb->rcb[i].p_cback; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_OK; 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* deregister the app */ 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_Deregister(p_cb->rcb[i].gatt_if); 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reset cb */ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB)); 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.reg_oper.status = status; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cback) 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 316e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("application not registered."); 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_create_srvc 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description action function to create a service. 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 rcb_idx; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 srvc_idx; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 service_id = 0; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.create.status = BTA_GATT_ERROR; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 339e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rcb_idx != BTA_GATTS_INVALID_APP) 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create the service now */ 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = GATTS_CreateService (p_cb->rcb[rcb_idx].gatt_if, 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_msg->api_create_svc.service_uuid, 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_create_svc.inst, 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_create_svc.num_handle, 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_create_svc.is_pri); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service_id != 0) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid, 3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID)); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->srvc_cb[srvc_idx].service_id = service_id; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->srvc_cb[srvc_idx].inst_num = p_msg->api_create_svc.inst; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->srvc_cb[srvc_idx].idx = srvc_idx; 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.create.status = BTA_GATT_OK; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.create.service_id = service_id; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.create.is_primary = p_msg->api_create_svc.is_pri; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.create.server_if = p_cb->rcb[rcb_idx].gatt_if; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.status = BTA_GATT_ERROR; 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB)); 369e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("service creation failed."); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID)); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.create.svc_instance= p_msg->api_create_svc.inst; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->rcb[rcb_idx].p_cback) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* p_cb->rcb[rcb_idx].p_cback)(BTA_GATTS_CREATE_EVT, &cb_data); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* application not registered */ 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 379e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Application not registered"); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_add_include_srvc 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description action function to add an included service. 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * p_msg) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_id = 0; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_id = GATTS_AddIncludeService(p_msg->api_add_incl_srvc.hdr.layer_specific, 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_add_incl_srvc.included_service_id); 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.server_if = p_rcb->gatt_if; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.attr_id = attr_id; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (attr_id) 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.status = BTA_GATT_OK; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.status = BTA_GATT_ERROR; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->p_cback) 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_ADD_INCL_SRVC_EVT, &cb_data); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_add_char 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description action function to add characteristic. 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_id = 0; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_id = GATTS_AddCharacteristic(p_msg->api_add_char.hdr.layer_specific, 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_msg->api_add_char.char_uuid, 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_add_char.perm, 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_add_char.property); 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.server_if = p_rcb->gatt_if; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.attr_id = attr_id; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char.char_uuid, sizeof(tBT_UUID)); 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (attr_id) 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.status = BTA_GATT_OK; 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.status = BTA_GATT_ERROR; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->p_cback) 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_EVT, &cb_data); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_add_char_descr 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description action function to add characteristic descriptor. 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_id = 0; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_id = GATTS_AddCharDescriptor(p_msg->api_add_char_descr.hdr.layer_specific, 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_add_char_descr.perm, 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_msg->api_add_char_descr.descr_uuid); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.server_if = p_rcb->gatt_if; 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.attr_id = attr_id; 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char_descr.descr_uuid, sizeof(tBT_UUID)); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (attr_id) 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.status = BTA_GATT_OK; 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.add_result.status = BTA_GATT_ERROR; 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->p_cback) 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_DESCR_EVT, &cb_data); 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_delete_service 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description action function to delete a service. 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.server_if = p_rcb->gatt_if; 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATTS_DeleteService(p_rcb->gatt_if, 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_srvc_cb->service_uuid, 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->inst_num)) 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.status = BTA_GATT_OK; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB)); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.status = BTA_GATT_ERROR; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->p_cback) 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_start_service 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description action function to start a service. 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.server_if = p_rcb->gatt_if; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATTS_StartService(p_rcb->gatt_if, 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb->service_id, 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_start.transport) == GATT_SUCCESS) 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 543e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id); 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.status = BTA_GATT_OK; 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.status = BTA_GATT_ERROR; 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->p_cback) 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_START_EVT, &cb_data); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_stop_service 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description action function to stop a service. 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 5685cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_msg); 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATTS_StopService(p_srvc_cb->service_id); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.server_if = p_rcb->gatt_if; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.service_id = p_srvc_cb->service_id; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.srvc_oper.status = BTA_GATT_OK; 574e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb->p_cback) 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data); 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5826975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Function bta_gatts_send_rsp 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5846975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description GATTS send response. 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5915cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_cb); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific, 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_rsp.trans_id, 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->api_rsp.status, 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS) 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 598e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Sending response failed"); 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 604781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach** Function bta_gatts_indicate_handle 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6066975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description GATTS send handle value indication or notification. 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_SRVC_CB *p_srvc_cb; 61417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tBTA_GATTS_RCB *p_rcb = NULL; 615781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER; 616781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach tGATT_IF gatt_if; 617781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach BD_ADDR remote_bda; 6187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTA_TRANSPORT transport; 61917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tBTA_GATTS cb_data; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id); 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srvc_cb ) 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific, 6267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta &gatt_if, remote_bda, &transport)) 627781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach { 62817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 62917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 630781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach if (p_msg->api_indicate.need_confirm) 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 632781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific, 633781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.attr_id, 634781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.len, 635781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.value); 636781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach else 637781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach status = GATTS_HandleValueNotification (p_msg->api_indicate.hdr.layer_specific, 638781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.attr_id, 639781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.len, 640781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.value); 641781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach 642781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach /* if over BR_EDR, inform PM for mode change */ 6437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BTA_TRANSPORT_BR_EDR) 644781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach { 645781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda); 646781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda); 647781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach } 648781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach } 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 650781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach { 651e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification", 652781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.hdr.layer_specific); 653781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach } 65417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 6557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) && 65617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback) 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 65817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cb_data.req_data.status = status; 65917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific; 66017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 66117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 666e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x", 667781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach p_msg->api_indicate.attr_id); 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_open 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb=NULL; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status= BTA_GATT_ERROR; 6857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT16 conn_id; 6865cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_cb); 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL) 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* should always get the connection ID */ 6917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda, 6928ed030ff4a36b248e1b115f94ddd4650d4b5e360Jakub Pawlowski p_msg->api_open.is_direct, p_msg->api_open.transport, false)) 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_GATT_OK; 6957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 6967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda, 6977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta &conn_id, p_msg->api_open.transport)) 6987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 6997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta status = BTA_GATT_ALREADY_OPEN; 7007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 705e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if); 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb && p_rcb->p_cback) 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT, (tBTA_GATTS *)&status); 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_cancel_open 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb; 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status= BTA_GATT_ERROR; 7255cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_cb); 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL) 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda, 7307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_msg->api_cancel_open.is_direct)) 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 732e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request"); 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status= BTA_GATT_OK; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 741e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb && p_rcb->p_cback) 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT, (tBTA_GATTS *)&status); 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_close 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb; 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATT_STATUS status= BTA_GATT_ERROR; 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if; 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR remote_bda; 7627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTA_GATT_TRANSPORT transport; 7637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 7645cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_cb); 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport)) 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS) 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 770e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific); 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status= BTA_GATT_OK; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb && p_rcb->p_cback) 780781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach { 7817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BTA_TRANSPORT_BR_EDR) 782781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda); 783781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT, (tBTA_GATTS *)&status); 785781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach } 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 789e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific); 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7935c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach/******************************************************************************* 7945c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** 7955c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Function bta_gatts_listen 7965c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** 7975c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Description Start or stop listening for LE connection on a GATT server 7985c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** 7995c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** Returns none. 8005c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach** 8015c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach*******************************************************************************/ 8025c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbachvoid bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 8035c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach{ 8045c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach tBTA_GATTS_RCB *p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_listen.server_if); 8055c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach tBTA_GATTS cb_data; 8065cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_cb); 8075cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 8085c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach cb_data.reg_oper.status = BTA_GATT_OK; 8095c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach cb_data.reg_oper.server_if = p_msg->api_listen.server_if; 8105c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach 8115c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach if (p_rcb == NULL) 8125c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach { 813e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown GATTS application"); 8145c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach return; 8155c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach } 8165c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach 8175c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach if (!GATT_Listen(p_msg->api_listen.server_if, 8185c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach p_msg->api_listen.start, 8195c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach p_msg->api_listen.remote_bda)) 8205c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach { 8215c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach cb_data.status = BTA_GATT_ERROR; 822e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_gatts_listen Listen failed"); 8235c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach } 8245c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach 8255c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach if (p_rcb->p_cback) 8265c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach (*p_rcb->p_cback)(BTA_GATTS_LISTEN_EVT, &cb_data); 8275c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach} 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_request_cback 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description GATTS attribute request callback. 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_send_request_cback (UINT16 conn_id, 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id, 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data) 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_rcb; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if; 8457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTA_GATT_TRANSPORT transport; 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cb_data, 0 , sizeof(tBTA_GATTS)); 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 853e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d", 8547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta conn_id, trans_id, req_type); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb && p_rcb->p_cback) 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 858781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach /* if over BR_EDR, inform PM for mode change */ 8597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BTA_TRANSPORT_BR_EDR) 860781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach { 861781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda); 862781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda); 863781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach } 864781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.req_data.conn_id = conn_id; 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.req_data.trans_id = trans_id; 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.req_data.p_data = (tBTA_GATTS_REQ_DATA *)p_data; 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_rcb->p_cback)(req_type, &cb_data); 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 873e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if); 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 878e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id); 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatts_conn_cback 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description connection callback. 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none. 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, 8927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN connected, tGATT_DISCONN_REASON reason, 8937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATT_TRANSPORT transport) 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS cb_data; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT; 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTS_RCB *p_reg; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 899e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d", 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_if, conn_id, connected, reason); 901e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gatts_conn_cback bda :%02x-%02x-%02x-%02x-%02x-%02x ", 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 90489f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach bt_bdaddr_t bdaddr; 90589f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach bdcpy(bdaddr.address, bda); 90689f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach if (connected) 90789f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN); 90889f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach else 90989f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason); 91089f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if); 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg && p_reg->p_cback) 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 915781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach /* there is no RM for GATT */ 9167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BTA_TRANSPORT_BR_EDR) 9176975b4d711142b885af479721cada448952c6b41Andre Eisenbach { 9186975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (connected) 9196975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda); 9206975b4d711142b885af479721cada448952c6b41Andre Eisenbach else 9216975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, bda); 9226975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 923781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.conn.conn_id = conn_id; 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.conn.server_if = gatt_if; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.conn.reason = reason; 9277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta cb_data.conn.transport = transport; 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN); 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_reg->p_cback)(evt, &cb_data); 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 933e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 93617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 93717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/******************************************************************************* 93817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 93917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Function bta_gatts_cong_cback 94017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 94117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Description congestion callback. 94217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 94317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Returns none. 94417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 94517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach*******************************************************************************/ 94617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested) 94717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach{ 94817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tBTA_GATTS_RCB *p_rcb; 94917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tGATT_IF gatt_if; 95017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tBTA_GATT_TRANSPORT transport; 95117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tBTA_GATTS cb_data; 95217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 95317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) 95417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 95517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 95617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 95717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (p_rcb && p_rcb->p_cback) 95817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 95917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cb_data.congest.conn_id = conn_id; 96017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cb_data.congest.congested = congested; 96117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 96217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data); 96317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 96417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 96517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach} 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */ 967