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