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