bta_gattc_api.cc revision 7dd34f52bc950bae2fb1b30b17da0ff34ee016aa
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2010-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 is the implementation of the API for GATT module of BTA.
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
28f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson
29221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski#include <base/bind.h>
30221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski#include <base/bind_helpers.h>
31f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson#include <base/callback.h>
32258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
33221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski#include "bta_closure_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatt_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gattc_int.h"
36cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_sys.h"
3796fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski#include "device/include/controller.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Constants
418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic const tBTA_SYS_REG bta_gattc_reg = {bta_gattc_hdl_event,
44cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                           BTA_GATTC_Disable};
45e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Disable
498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to disable GATTC module
518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       None.
538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_Disable(void) {
58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_sys_is_register(BTA_ID_GATTC) == false) {
59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_WARNING("GATTC Module not enabled/already disabled");
60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
62e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->event = BTA_GATTC_API_DISABLE_EVT;
65717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
67cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_deregister(BTA_ID_GATTC);
68ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
69ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
70221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowskistatic void create_random_uuid(tBT_UUID* uuid) {
71221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  uuid->len = LEN_UUID_128;
72221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski
73221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  for (int i = 0; i < 16; ++i) {
74221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski    uuid->uu.uuid128[i] = (uint8_t)(rand() % 256);
75221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  }
76221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski}
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
78221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski/**
79221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * This function is called to register application callbacks with BTA GATTC
80221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * module. |client_cb| pointer to the application callback function.
81221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * |cb| one time callback when registration is finished
82221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski */
83221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowskivoid BTA_GATTC_AppRegister(tBTA_GATTC_CBACK* p_client_cb,
84221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski                           BtaAppRegisterCallback cb) {
85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_sys_is_register(BTA_ID_GATTC) == false)
86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_register(BTA_ID_GATTC, &bta_gattc_reg);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
88221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  // base::Owned will own and free app_uuid
89221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  tBT_UUID* uuid = new tBT_UUID;
90221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  create_random_uuid(uuid);
91221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  do_in_bta_thread(FROM_HERE, base::Bind(&bta_gattc_register, base::Owned(uuid),
92221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski                                         p_client_cb, std::move(cb)));
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_AppDeregister
988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to deregister an application
1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  from BTA GATTC module.
1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface identifier.
1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_AppDeregister(tBTA_GATTC_IF client_if) {
108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_DEREG* p_buf =
109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_DEREG*)osi_malloc(sizeof(tBTA_GATTC_API_DEREG));
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_DEREG_EVT;
112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->client_if = client_if;
113717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Open
1208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Open a direct connection or add a background auto connection
1228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bd address
1238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if: server interface.
1258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda: remote device BD address.
1268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  is_direct: direct connection or background auto connection
127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  transport: Transport to be used for GATT connection
1281baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                             (BREDR/LE)
12996fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski *                  initiating_phys: LE PHY to use, optional
1308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, bool is_direct,
133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    tBTA_GATT_TRANSPORT transport) {
13496fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski  uint8_t phy = controller_get_interface()->get_le_all_initiating_phys();
13596fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski  BTA_GATTC_Open(client_if, remote_bda, is_direct, transport, phy);
13696fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski}
13796fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski
13896fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowskivoid BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, bool is_direct,
13996fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski                    tBTA_GATT_TRANSPORT transport, uint8_t initiating_phys) {
140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_OPEN* p_buf =
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_OPEN*)osi_malloc(sizeof(tBTA_GATTC_API_OPEN));
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_OPEN_EVT;
144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->client_if = client_if;
145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_direct = is_direct;
146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->transport = transport;
14796fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski  p_buf->initiating_phys = initiating_phys;
148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_CancelOpen
1568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      Cancel a direct open connection or remove a background auto
1581baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  connection
1598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bd address
1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if: server interface.
1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda: remote device BD address.
1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  is_direct: direct connection or background auto connection
1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_CancelOpen(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                          bool is_direct) {
170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_CANCEL_OPEN* p_buf = (tBTA_GATTC_API_CANCEL_OPEN*)osi_malloc(
171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_CANCEL_OPEN));
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_CANCEL_OPEN_EVT;
174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->client_if = client_if;
175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_direct = is_direct;
176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Close
1848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Close a connection to a GATT server.
1868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connectino ID to be closed.
1888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_Close(uint16_t conn_id) {
193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->event = BTA_GATTC_API_CLOSE_EVT;
196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->layer_specific = conn_id;
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
200717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ConfigureMTU
2048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Configure the MTU size in the GATT channel. This can be done
2068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  only once per connection.
2078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID.
2098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  mtu: desired MTU size to use.
2108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ConfigureMTU(uint16_t conn_id, uint16_t mtu) {
215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_CFG_MTU* p_buf =
216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_CFG_MTU*)osi_malloc(sizeof(tBTA_GATTC_API_CFG_MTU));
2179426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_CFG_MTU_EVT;
219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->mtu = mtu;
2219426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
2239426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach}
224717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
2259426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach/*******************************************************************************
2268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ServiceSearchRequest
2288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to request a GATT service discovery
2301baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  on a GATT server. This function report service search
2311baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  result by a callback event, and followed by a service search
2321baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  complete event.
2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID.
235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  p_srvc_uuid: a UUID of the service application is interested
2361baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                               in.
2378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                              If Null, discover for all services.
2388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
2408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ServiceSearchRequest(uint16_t conn_id, tBT_UUID* p_srvc_uuid) {
243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  const size_t len = sizeof(tBTA_GATTC_API_SEARCH) + sizeof(tBT_UUID);
244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_SEARCH* p_buf = (tBTA_GATTC_API_SEARCH*)osi_calloc(len);
245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_SEARCH_EVT;
247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_srvc_uuid) {
249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_srvc_uuid = (tBT_UUID*)(p_buf + 1);
250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_srvc_uuid, p_srvc_uuid, sizeof(tBT_UUID));
251cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_srvc_uuid = NULL;
253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
256717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov}
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetServices
2618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the services on the given
2631baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  server.
2648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID which identify the server.
2668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns list_t of tBTA_GATTC_SERVICE or NULL.
2688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
270e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenconst list_t* BTA_GATTC_GetServices(uint16_t conn_id) {
271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_services(conn_id);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetCharacteristic
2778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the characteristic on the
2791baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  given server.
2808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID which identify the server.
2828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteristic handle
2838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns pointer to tBTA_GATTC_CHARACTERISTIC or NULL.
2858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_GATTC_CHARACTERISTIC* BTA_GATTC_GetCharacteristic(uint16_t conn_id,
288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                             uint16_t handle) {
289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_characteristic(conn_id, handle);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetDescriptor
2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
296cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the characteristic on the
2971baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  given server.
2988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID which identify the server.
3008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor handle
3018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns pointer to tBTA_GATTC_DESCRIPTOR or NULL.
3038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_GATTC_DESCRIPTOR* BTA_GATTC_GetDescriptor(uint16_t conn_id,
306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                     uint16_t handle) {
307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_descriptor(conn_id, handle);
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetGattDb
3138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to get the GATT database.
3158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID which identify the server.
317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  db: output parameter which will contain the GATT database
3181baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                      copy. Caller is responsible for freeing it.
3198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  count: number of elements in database.
3208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_GetGattDb(uint16_t conn_id, uint16_t start_handle,
323cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         uint16_t end_handle, btgatt_db_element_t** db,
324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         int* count) {
325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_get_gatt_db(conn_id, start_handle, end_handle, db, count);
326533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski}
327533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
328533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski/*******************************************************************************
3298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadCharacteristic
3318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read a characteristics value
3338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
3358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteritic handle to read.
3368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
3388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadCharacteristic(uint16_t conn_id, uint16_t handle,
341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                  tBTA_GATT_AUTH_REQ auth_req,
342cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                  GATT_READ_OP_CB callback, void* cb_data) {
343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ* p_buf =
344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
345cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb = callback;
351cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb_data = cb_data;
352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3567dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski/**
3577dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski * This function is called to read a value of characteristic with uuid equal to
3587dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski * |uuid|
3597dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski */
3607dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowskivoid BTA_GATTC_ReadUsingCharUuid(uint16_t conn_id, tBT_UUID uuid,
3617dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 uint16_t s_handle, uint16_t e_handle,
3627dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 tBTA_GATT_AUTH_REQ auth_req,
3637dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 GATT_READ_OP_CB callback, void* cb_data) {
3647dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  tBTA_GATTC_API_READ* p_buf =
3657dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
3667dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3677dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
3687dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->hdr.layer_specific = conn_id;
3697dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->auth_req = auth_req;
3707dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->handle = 0;
3717dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->uuid = uuid;
3727dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->s_handle = s_handle;
3737dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->e_handle = e_handle;
3747dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->read_cb = callback;
3757dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->read_cb_data = cb_data;
3767dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3777dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  bta_sys_sendmsg(p_buf);
3787dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski}
3797dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadCharDescr
3838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read a descriptor value.
3858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
3878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor handle to read.
3888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
3908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadCharDescr(uint16_t conn_id, uint16_t handle,
393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             tBTA_GATT_AUTH_REQ auth_req,
394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             GATT_READ_OP_CB callback, void* cb_data) {
395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ* p_buf =
396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb = callback;
403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb_data = cb_data;
404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
407717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadMultiple
4118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read multiple characteristic or
4138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  characteristic descriptors.
4148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connectino ID.
4168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    p_read_multi - pointer to the read multiple parameter.
4178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadMultiple(uint16_t conn_id, tBTA_GATTC_MULTI* p_read_multi,
422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            tBTA_GATT_AUTH_REQ auth_req) {
423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ_MULTI* p_buf =
424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ_MULTI*)osi_calloc(sizeof(tBTA_GATTC_API_READ_MULTI));
425717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_MULTI_EVT;
427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->num_attr = p_read_multi->num_attr;
430717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_buf->num_attr > 0)
432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->handles, p_read_multi->handles,
433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson           sizeof(uint16_t) * p_read_multi->num_attr);
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
436717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov}
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_WriteCharValue
4418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to write characteristic value.
4438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
4458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteristic handle to write.
4468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  write_type - type of write.
4478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
4488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
452cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_WriteCharValue(uint16_t conn_id, uint16_t handle,
453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATTC_WRITE_TYPE write_type,
454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              std::vector<uint8_t> value,
455cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATT_AUTH_REQ auth_req,
456cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              GATT_WRITE_OP_CB callback, void* cb_data) {
457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
459cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
460cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
461cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = write_type;
465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->len = value.size();
466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
469cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() > 0) {
470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
476717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_WriteCharDescr
4808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to write descriptor value.
4828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID
4848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor hadle to write.
4858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
4868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_WriteCharDescr(uint16_t conn_id, uint16_t handle,
491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              std::vector<uint8_t> value,
492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATT_AUTH_REQ auth_req,
493cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              GATT_WRITE_OP_CB callback, void* cb_data) {
494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
495cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
496cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
497cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = BTA_GATTC_TYPE_WRITE;
502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() != 0) {
506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->len = value.size();
508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
513717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_PrepareWrite
5178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to prepare write a characteristic
5191baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  value.
5208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  p_char_id - GATT characteritic ID of the service.
5238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  offset - offset of the write value.
5248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
5258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_PrepareWrite(uint16_t conn_id, uint16_t handle, uint16_t offset,
530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            std::vector<uint8_t> value,
531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            tBTA_GATT_AUTH_REQ auth_req,
532cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            GATT_WRITE_OP_CB callback, void* cb_data) {
533cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
534cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
535cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = BTA_GATTC_WRITE_PREPARE;
544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->offset = offset;
545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->len = value.size();
546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() > 0) {
548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
552cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
554717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ExecuteWrite
5588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
559cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to execute write a prepare write
5601baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  sequence.
5618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    is_execute - execute or cancel.
5648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
568cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ExecuteWrite(uint16_t conn_id, bool is_execute) {
569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_EXEC* p_buf =
570cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_EXEC*)osi_calloc(sizeof(tBTA_GATTC_API_EXEC));
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_EXEC_EVT;
573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
574cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_execute = is_execute;
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
578717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_SendIndConfirm
5828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to send handle value confirmation.
5848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    p_char_id - characteristic ID to confirm.
5878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_SendIndConfirm(uint16_t conn_id, uint16_t handle) {
592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_CONFIRM* p_buf =
593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_CONFIRM*)osi_calloc(sizeof(tBTA_GATTC_API_CONFIRM));
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_API("%s conn_id=%d handle=0x%04x", __func__, conn_id, handle);
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_CONFIRM_EVT;
598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_RegisterForNotifications
6078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to register for notification of a
6091baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  service.
6108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface.
6128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bda - target GATT server.
6138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - GATT characteristic handle.
6148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          OK if registration succeed, otherwise failed.
6168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
618cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsontBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications(tBTA_GATTC_IF client_if,
619cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                    const BD_ADDR bda,
620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                    uint16_t handle) {
621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg;
622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER;
623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!handle) {
626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("deregistration failed, handle is 0");
627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return status;
628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
630f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_clreg = bta_gattc_cl_get_regcb(client_if);
631f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_clreg != NULL) {
632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clreg->notif_reg[i].in_use &&
634cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].handle == handle) {
636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_WARNING("notification already registered");
637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_OK;
638cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (status != BTA_GATT_OK) {
642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (!p_clreg->notif_reg[i].in_use) {
644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          memset((void*)&p_clreg->notif_reg[i], 0,
645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                 sizeof(tBTA_GATTC_NOTIF_REG));
646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].in_use = true;
648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          memcpy(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN);
649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].handle = handle;
651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          status = BTA_GATT_OK;
652cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (i == BTA_GATTC_NOTIF_REG_MAX) {
656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_NO_RESOURCES;
657cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_ERROR("Max Notification Reached, registration failed.");
658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
660cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if);
662cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
664cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return status;
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_DeregisterForNotifications
6708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to de-register for notification of a
6721baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  service.
6738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface.
6758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda - target GATT server.
6768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - GATT characteristic handle.
6778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          OK if deregistration succeed, otherwise failed.
6798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
681cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsontBTA_GATT_STATUS BTA_GATTC_DeregisterForNotifications(tBTA_GATTC_IF client_if,
682cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                      const BD_ADDR bda,
683cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                      uint16_t handle) {
684cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!handle) {
685cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("%s: deregistration failed, handle is 0", __func__);
686cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return BTA_GATT_ILLEGAL_PARAMETER;
687cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
688cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
689cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(client_if);
690cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg == NULL) {
691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR(
692cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        "%s client_if: %d not registered bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
693cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        __func__, client_if, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return BTA_GATT_ILLEGAL_PARAMETER;
695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (int i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clreg->notif_reg[i].in_use &&
699cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clreg->notif_reg[i].handle == handle) {
701cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_DEBUG("%s deregistered bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
702cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       __func__, bda[0], bda[1], bda[2], bda[3], bda[4],
703cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       bda[5]);
704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
705cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      return BTA_GATT_OK;
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
707cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_ERROR(
710cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      "%s registration not found bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return BTA_GATT_ERROR;
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
7168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Refresh
7188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Refresh the server cache of the remote device
7208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       remote_bda: remote device BD address.
7228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
7248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
726cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_Refresh(const BD_ADDR remote_bda) {
727cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_OPEN* p_buf =
728cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_OPEN*)osi_malloc(sizeof(tBTA_GATTC_API_OPEN));
729ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
730cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_REFRESH_EVT;
731cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
732ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
733cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
735