bta_gattc_api.cc revision a484a888196ddf8bcbf1ad3226d6451bc735a94b
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
6331a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski  do_in_bta_thread(FROM_HERE, base::Bind(&bta_gattc_disable));
64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_deregister(BTA_ID_GATTC);
65ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
66ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
67221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowskistatic void create_random_uuid(tBT_UUID* uuid) {
68221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  uuid->len = LEN_UUID_128;
69221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski
70221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  for (int i = 0; i < 16; ++i) {
71221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski    uuid->uu.uuid128[i] = (uint8_t)(rand() % 256);
72221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  }
73221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski}
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
75221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski/**
76221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * This function is called to register application callbacks with BTA GATTC
77221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * module. |client_cb| pointer to the application callback function.
78221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * |cb| one time callback when registration is finished
79221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski */
80221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowskivoid BTA_GATTC_AppRegister(tBTA_GATTC_CBACK* p_client_cb,
81221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski                           BtaAppRegisterCallback cb) {
82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_sys_is_register(BTA_ID_GATTC) == false)
83cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_register(BTA_ID_GATTC, &bta_gattc_reg);
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
85221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  // base::Owned will own and free app_uuid
86221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  tBT_UUID* uuid = new tBT_UUID;
87221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  create_random_uuid(uuid);
88221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  do_in_bta_thread(FROM_HERE, base::Bind(&bta_gattc_register, base::Owned(uuid),
89221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski                                         p_client_cb, std::move(cb)));
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9231a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowskistatic void app_deregister_impl(tBTA_GATTC_IF client_if) {
9331a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski  bta_gattc_deregister(bta_gattc_cl_get_regcb(client_if));
9431a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski}
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) {
10831a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski  do_in_bta_thread(FROM_HERE, base::Bind(&app_deregister_impl, client_if));
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Open
1148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Open a direct connection or add a background auto connection
1168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bd address
1178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if: server interface.
1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda: remote device BD address.
1208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  is_direct: direct connection or background auto connection
121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  transport: Transport to be used for GATT connection
1221baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                             (BREDR/LE)
12396fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski *                  initiating_phys: LE PHY to use, optional
12416bb48b320cde54a1a06a525f4d9be1421689649Jakub Pawlowski *                  opportunistic: wether the connection shall be opportunistic,
12516bb48b320cde54a1a06a525f4d9be1421689649Jakub Pawlowski *                                 and don't impact the disconnection timer
1268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
128a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTA_GATTC_Open(tBTA_GATTC_IF client_if, const RawAddress& remote_bda,
129c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                    bool is_direct, tBTA_GATT_TRANSPORT transport,
130c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                    bool opportunistic) {
13196fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski  uint8_t phy = controller_get_interface()->get_le_all_initiating_phys();
13247474c3e584806e0b49b27e1e5330c1e6646cfb9Jakub Pawlowski  BTA_GATTC_Open(client_if, remote_bda, is_direct, transport, opportunistic,
13347474c3e584806e0b49b27e1e5330c1e6646cfb9Jakub Pawlowski                 phy);
13496fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski}
13596fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski
136a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTA_GATTC_Open(tBTA_GATTC_IF client_if, const RawAddress& remote_bda,
137c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                    bool is_direct, tBTA_GATT_TRANSPORT transport,
138c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                    bool opportunistic, uint8_t initiating_phys) {
139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_OPEN* p_buf =
140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_OPEN*)osi_malloc(sizeof(tBTA_GATTC_API_OPEN));
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_OPEN_EVT;
143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->client_if = client_if;
144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_direct = is_direct;
145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->transport = transport;
14696fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski  p_buf->initiating_phys = initiating_phys;
14716bb48b320cde54a1a06a525f4d9be1421689649Jakub Pawlowski  p_buf->opportunistic = opportunistic;
148c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_buf->remote_bda = remote_bda;
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 ******************************************************************************/
168a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTA_GATTC_CancelOpen(tBTA_GATTC_IF client_if, const RawAddress& remote_bda,
169a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                          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;
176c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_buf->remote_bda = remote_bda;
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
25845aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowskivoid BTA_GATTC_DiscoverServiceByUuid(uint16_t conn_id, tBT_UUID* p_srvc_uuid) {
25945aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  tGATT_DISC_PARAM* param = new tGATT_DISC_PARAM;
26045aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  param->s_handle = 0x0001;
26145aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  param->e_handle = 0xFFFF;
26245aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  param->service = *p_srvc_uuid;
26345aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  do_in_bta_thread(FROM_HERE,
26445aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski                   base::Bind(base::IgnoreResult(&GATTC_Discover), conn_id,
26545aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski                              GATT_DISC_SRVC_BY_UUID, base::Owned(param)));
26645aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski}
26745aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetServices
2718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the services on the given
2731baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  server.
2748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID which identify the server.
2768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns list_t of tBTA_GATTC_SERVICE or NULL.
2788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
280e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenconst list_t* BTA_GATTC_GetServices(uint16_t conn_id) {
281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_services(conn_id);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetCharacteristic
2878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the characteristic on the
2891baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  given server.
2908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID which identify the server.
2928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteristic handle
2938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns pointer to tBTA_GATTC_CHARACTERISTIC or NULL.
2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
297cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_GATTC_CHARACTERISTIC* BTA_GATTC_GetCharacteristic(uint16_t conn_id,
298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                             uint16_t handle) {
299cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_characteristic(conn_id, handle);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetDescriptor
3058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the characteristic on the
3071baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  given server.
3088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID which identify the server.
3108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor handle
3118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns pointer to tBTA_GATTC_DESCRIPTOR or NULL.
3138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
315cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_GATTC_DESCRIPTOR* BTA_GATTC_GetDescriptor(uint16_t conn_id,
316cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                     uint16_t handle) {
317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_descriptor(conn_id, handle);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetGattDb
3238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to get the GATT database.
3258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID which identify the server.
327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  db: output parameter which will contain the GATT database
3281baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                      copy. Caller is responsible for freeing it.
3298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  count: number of elements in database.
3308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_GetGattDb(uint16_t conn_id, uint16_t start_handle,
333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         uint16_t end_handle, btgatt_db_element_t** db,
334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         int* count) {
335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_get_gatt_db(conn_id, start_handle, end_handle, db, count);
336533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski}
337533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
338533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski/*******************************************************************************
3398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadCharacteristic
3418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read a characteristics value
3438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
3458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteritic handle to read.
3468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
3488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadCharacteristic(uint16_t conn_id, uint16_t handle,
351cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                  tBTA_GATT_AUTH_REQ auth_req,
352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                  GATT_READ_OP_CB callback, void* cb_data) {
353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ* p_buf =
354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb = callback;
361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb_data = cb_data;
362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3667dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski/**
3677dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski * This function is called to read a value of characteristic with uuid equal to
3687dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski * |uuid|
3697dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski */
3707dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowskivoid BTA_GATTC_ReadUsingCharUuid(uint16_t conn_id, tBT_UUID uuid,
3717dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 uint16_t s_handle, uint16_t e_handle,
3727dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 tBTA_GATT_AUTH_REQ auth_req,
3737dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 GATT_READ_OP_CB callback, void* cb_data) {
3747dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  tBTA_GATTC_API_READ* p_buf =
3757dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
3767dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3777dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
3787dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->hdr.layer_specific = conn_id;
3797dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->auth_req = auth_req;
3807dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->handle = 0;
3817dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->uuid = uuid;
3827dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->s_handle = s_handle;
3837dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->e_handle = e_handle;
3847dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->read_cb = callback;
3857dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->read_cb_data = cb_data;
3867dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3877dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  bta_sys_sendmsg(p_buf);
3887dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski}
3897dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadCharDescr
3938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read a descriptor value.
3958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
3978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor handle to read.
3988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadCharDescr(uint16_t conn_id, uint16_t handle,
403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             tBTA_GATT_AUTH_REQ auth_req,
404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             GATT_READ_OP_CB callback, void* cb_data) {
405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ* p_buf =
406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
409cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
412cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb = callback;
413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb_data = cb_data;
414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
415cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
417717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadMultiple
4218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read multiple characteristic or
4238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  characteristic descriptors.
4248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connectino ID.
4268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    p_read_multi - pointer to the read multiple parameter.
4278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadMultiple(uint16_t conn_id, tBTA_GATTC_MULTI* p_read_multi,
432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            tBTA_GATT_AUTH_REQ auth_req) {
433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ_MULTI* p_buf =
434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ_MULTI*)osi_calloc(sizeof(tBTA_GATTC_API_READ_MULTI));
435717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
436cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_MULTI_EVT;
437cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->num_attr = p_read_multi->num_attr;
440717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_buf->num_attr > 0)
442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->handles, p_read_multi->handles,
443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson           sizeof(uint16_t) * p_read_multi->num_attr);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
446717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov}
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_WriteCharValue
4518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to write characteristic value.
4538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
4558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteristic handle to write.
4568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  write_type - type of write.
4578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
4588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_WriteCharValue(uint16_t conn_id, uint16_t handle,
463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATTC_WRITE_TYPE write_type,
464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              std::vector<uint8_t> value,
465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATT_AUTH_REQ auth_req,
466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              GATT_WRITE_OP_CB callback, void* cb_data) {
467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
469cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = write_type;
475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->len = value.size();
476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() > 0) {
480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
486717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_WriteCharDescr
4908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to write descriptor value.
4928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID
4948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor hadle to write.
4958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
4968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_WriteCharDescr(uint16_t conn_id, uint16_t handle,
501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              std::vector<uint8_t> value,
502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATT_AUTH_REQ auth_req,
503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              GATT_WRITE_OP_CB callback, void* cb_data) {
504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = BTA_GATTC_TYPE_WRITE;
512cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() != 0) {
516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->len = value.size();
518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
523717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_PrepareWrite
5278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
528cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to prepare write a characteristic
5291baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  value.
5308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  p_char_id - GATT characteritic ID of the service.
5338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  offset - offset of the write value.
5348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
5358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_PrepareWrite(uint16_t conn_id, uint16_t handle, uint16_t offset,
540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            std::vector<uint8_t> value,
541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            tBTA_GATT_AUTH_REQ auth_req,
542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            GATT_WRITE_OP_CB callback, void* cb_data) {
543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
552cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = BTA_GATTC_WRITE_PREPARE;
554cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->offset = offset;
555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->len = value.size();
556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() > 0) {
558cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
559cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
562cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
564717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ExecuteWrite
5688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to execute write a prepare write
5701baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  sequence.
5718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    is_execute - execute or cancel.
5748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ExecuteWrite(uint16_t conn_id, bool is_execute) {
579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_EXEC* p_buf =
580cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_EXEC*)osi_calloc(sizeof(tBTA_GATTC_API_EXEC));
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
582cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_EXEC_EVT;
583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_execute = is_execute;
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
586cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
588717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_SendIndConfirm
5928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to send handle value confirmation.
5948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    p_char_id - characteristic ID to confirm.
5978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_SendIndConfirm(uint16_t conn_id, uint16_t handle) {
602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_CONFIRM* p_buf =
603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_CONFIRM*)osi_calloc(sizeof(tBTA_GATTC_API_CONFIRM));
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_API("%s conn_id=%d handle=0x%04x", __func__, conn_id, handle);
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_CONFIRM_EVT;
608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_RegisterForNotifications
6178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
618cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to register for notification of a
6191baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  service.
6208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface.
6228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bda - target GATT server.
6238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - GATT characteristic handle.
6248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          OK if registration succeed, otherwise failed.
6268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
628cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsontBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications(tBTA_GATTC_IF client_if,
629a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                                    const RawAddress& bda,
630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                    uint16_t handle) {
631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg;
632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER;
633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
634cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!handle) {
636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("deregistration failed, handle is 0");
637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return status;
638cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
640f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_clreg = bta_gattc_cl_get_regcb(client_if);
641f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_clreg != NULL) {
642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clreg->notif_reg[i].in_use &&
644c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          p_clreg->notif_reg[i].remote_bda == bda &&
645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].handle == handle) {
646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_WARNING("notification already registered");
647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_OK;
648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (status != BTA_GATT_OK) {
652cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
653cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (!p_clreg->notif_reg[i].in_use) {
654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          memset((void*)&p_clreg->notif_reg[i], 0,
655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                 sizeof(tBTA_GATTC_NOTIF_REG));
656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
657cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].in_use = true;
658c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          p_clreg->notif_reg[i].remote_bda = bda;
659cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
660cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].handle = handle;
661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          status = BTA_GATT_OK;
662cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
664cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
665cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (i == BTA_GATTC_NOTIF_REG_MAX) {
666cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_NO_RESOURCES;
667cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_ERROR("Max Notification Reached, registration failed.");
668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if);
672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return status;
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_DeregisterForNotifications
6808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
681cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to de-register for notification of a
6821baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  service.
6838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface.
6858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda - target GATT server.
6868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - GATT characteristic handle.
6878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          OK if deregistration succeed, otherwise failed.
6898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
691cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsontBTA_GATT_STATUS BTA_GATTC_DeregisterForNotifications(tBTA_GATTC_IF client_if,
692a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                                      const RawAddress& bda,
693cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                      uint16_t handle) {
694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!handle) {
695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("%s: deregistration failed, handle is 0", __func__);
696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return BTA_GATT_ILLEGAL_PARAMETER;
697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
699cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(client_if);
700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg == NULL) {
701c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    LOG(ERROR) << __func__ << " client_if: " << +client_if
702c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski               << " not registered bd_addr:" << bda;
703cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return BTA_GATT_ILLEGAL_PARAMETER;
704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
705cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
706cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (int i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
707cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clreg->notif_reg[i].in_use &&
708c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        p_clreg->notif_reg[i].remote_bda == bda &&
709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clreg->notif_reg[i].handle == handle) {
710c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski      VLOG(1) << __func__ << " deregistered bd_addr:" << bda;
711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      return BTA_GATT_OK;
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
714cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
716c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  LOG(ERROR) << __func__ << " registration not found bd_addr:" << bda;
717cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return BTA_GATT_ERROR;
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
7218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Refresh
7238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Refresh the server cache of the remote device
7258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       remote_bda: remote device BD address.
7278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
7298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
731a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTA_GATTC_Refresh(const RawAddress& remote_bda) {
732d7ee6f2e85a1a8837b0b1e2e8ba1c72b53650cd8Jakub Pawlowski  do_in_bta_thread(FROM_HERE,
733d7ee6f2e85a1a8837b0b1e2e8ba1c72b53650cd8Jakub Pawlowski                   base::Bind(&bta_gattc_process_api_refresh, remote_bda));
734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
735