15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 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
39819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowskiusing bluetooth::Uuid;
40819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Constants
438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic const tBTA_SYS_REG bta_gattc_reg = {bta_gattc_hdl_event,
46cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                           BTA_GATTC_Disable};
47e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Disable
518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to disable GATTC module
538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       None.
558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_Disable(void) {
60b749ebde2c6a55569e4e480abda3a4ee3afe2d72Myles Watson  if (!bta_sys_is_register(BTA_ID_GATTC)) {
612647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(WARNING) << "GATTC Module not enabled/already disabled";
62cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
64e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
6531a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski  do_in_bta_thread(FROM_HERE, base::Bind(&bta_gattc_disable));
66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_deregister(BTA_ID_GATTC);
67ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
68ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
69221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski/**
70221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * This function is called to register application callbacks with BTA GATTC
71221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * module. |client_cb| pointer to the application callback function.
72221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * |cb| one time callback when registration is finished
73221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski */
74221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowskivoid BTA_GATTC_AppRegister(tBTA_GATTC_CBACK* p_client_cb,
75221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski                           BtaAppRegisterCallback cb) {
76b749ebde2c6a55569e4e480abda3a4ee3afe2d72Myles Watson  if (!bta_sys_is_register(BTA_ID_GATTC))
77cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_register(BTA_ID_GATTC, &bta_gattc_reg);
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
79819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski  do_in_bta_thread(FROM_HERE, base::Bind(&bta_gattc_register, Uuid::GetRandom(),
80221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski                                         p_client_cb, std::move(cb)));
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
83e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowskistatic void app_deregister_impl(tGATT_IF client_if) {
8431a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski  bta_gattc_deregister(bta_gattc_cl_get_regcb(client_if));
8531a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski}
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_AppDeregister
898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to deregister an application
918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  from BTA GATTC module.
928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface identifier.
948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
98e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowskivoid BTA_GATTC_AppDeregister(tGATT_IF client_if) {
9931a6bf4f11b7f5483af93d9ded49f979167a0ccbJakub Pawlowski  do_in_bta_thread(FROM_HERE, base::Bind(&app_deregister_impl, client_if));
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Open
1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Open a direct connection or add a background auto connection
1078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bd address
1088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if: server interface.
1108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda: remote device BD address.
1118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  is_direct: direct connection or background auto connection
112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  transport: Transport to be used for GATT connection
1131baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                             (BREDR/LE)
11496fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski *                  initiating_phys: LE PHY to use, optional
11516bb48b320cde54a1a06a525f4d9be1421689649Jakub Pawlowski *                  opportunistic: wether the connection shall be opportunistic,
11616bb48b320cde54a1a06a525f4d9be1421689649Jakub Pawlowski *                                 and don't impact the disconnection timer
1178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
119e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowskivoid BTA_GATTC_Open(tGATT_IF client_if, const RawAddress& remote_bda,
12050ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski                    bool is_direct, tGATT_TRANSPORT transport,
121c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                    bool opportunistic) {
12296fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski  uint8_t phy = controller_get_interface()->get_le_all_initiating_phys();
12347474c3e584806e0b49b27e1e5330c1e6646cfb9Jakub Pawlowski  BTA_GATTC_Open(client_if, remote_bda, is_direct, transport, opportunistic,
12447474c3e584806e0b49b27e1e5330c1e6646cfb9Jakub Pawlowski                 phy);
12596fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski}
12696fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski
127e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowskivoid BTA_GATTC_Open(tGATT_IF client_if, const RawAddress& remote_bda,
12850ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski                    bool is_direct, tGATT_TRANSPORT transport,
129c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                    bool opportunistic, uint8_t initiating_phys) {
130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_OPEN* p_buf =
131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_OPEN*)osi_malloc(sizeof(tBTA_GATTC_API_OPEN));
132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_OPEN_EVT;
134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->client_if = client_if;
135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_direct = is_direct;
136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->transport = transport;
13796fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski  p_buf->initiating_phys = initiating_phys;
13816bb48b320cde54a1a06a525f4d9be1421689649Jakub Pawlowski  p_buf->opportunistic = opportunistic;
139c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_buf->remote_bda = remote_bda;
140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_CancelOpen
1478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      Cancel a direct open connection or remove a background auto
1491baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  connection
1508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bd address
1518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if: server interface.
1538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda: remote device BD address.
1548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  is_direct: direct connection or background auto connection
1558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
159e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowskivoid BTA_GATTC_CancelOpen(tGATT_IF client_if, const RawAddress& remote_bda,
160a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                          bool is_direct) {
161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_CANCEL_OPEN* p_buf = (tBTA_GATTC_API_CANCEL_OPEN*)osi_malloc(
162cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_CANCEL_OPEN));
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_CANCEL_OPEN_EVT;
165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->client_if = client_if;
166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_direct = is_direct;
167c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_buf->remote_bda = remote_bda;
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Close
1758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Close a connection to a GATT server.
1778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connectino ID to be closed.
1798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_Close(uint16_t conn_id) {
184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->event = BTA_GATTC_API_CLOSE_EVT;
187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->layer_specific = conn_id;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
191717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ConfigureMTU
1958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Configure the MTU size in the GATT channel. This can be done
1978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  only once per connection.
1988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID.
2008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  mtu: desired MTU size to use.
2018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ConfigureMTU(uint16_t conn_id, uint16_t mtu) {
206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_CFG_MTU* p_buf =
207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_CFG_MTU*)osi_malloc(sizeof(tBTA_GATTC_API_CFG_MTU));
2089426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_CFG_MTU_EVT;
210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->mtu = mtu;
2129426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
2149426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach}
215717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
2169426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach/*******************************************************************************
2178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ServiceSearchRequest
2198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to request a GATT service discovery
2211baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  on a GATT server. This function report service search
2221baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  result by a callback event, and followed by a service search
2231baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  complete event.
2248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID.
226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  p_srvc_uuid: a UUID of the service application is interested
2271baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                               in.
2288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                              If Null, discover for all services.
2298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
2318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
233819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowskivoid BTA_GATTC_ServiceSearchRequest(uint16_t conn_id, Uuid* p_srvc_uuid) {
234819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski  const size_t len = sizeof(tBTA_GATTC_API_SEARCH) + sizeof(Uuid);
235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_SEARCH* p_buf = (tBTA_GATTC_API_SEARCH*)osi_calloc(len);
236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_SEARCH_EVT;
238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_srvc_uuid) {
240819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski    p_buf->p_srvc_uuid = (Uuid*)(p_buf + 1);
241819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski    *p_buf->p_srvc_uuid = *p_srvc_uuid;
242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_srvc_uuid = NULL;
244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
247717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov}
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
249819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowskivoid BTA_GATTC_DiscoverServiceByUuid(uint16_t conn_id,
250819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski                                     const Uuid& p_srvc_uuid) {
25145aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  tGATT_DISC_PARAM* param = new tGATT_DISC_PARAM;
25245aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  param->s_handle = 0x0001;
25345aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  param->e_handle = 0xFFFF;
254819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski  param->service = p_srvc_uuid;
25545aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski  do_in_bta_thread(FROM_HERE,
25645aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski                   base::Bind(base::IgnoreResult(&GATTC_Discover), conn_id,
25745aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski                              GATT_DISC_SRVC_BY_UUID, base::Owned(param)));
25845aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski}
25945aebe75f75c1f93c396118bc39748fc0f4054c7Jakub Pawlowski
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetServices
2638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the services on the given
2651baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  server.
2668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID which identify the server.
2688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
269d9ca4100b8a22950a3e560985ca09d885eb22f32Jakub Pawlowski * Returns          returns list of tBTA_GATTC_SERVICE or NULL.
2708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
272fa9074885bea48e7844e2fd14df799df6da4782fJakub Pawlowskiconst std::vector<tBTA_GATTC_SERVICE>* BTA_GATTC_GetServices(uint16_t conn_id) {
273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_services(conn_id);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetCharacteristic
2798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the characteristic on the
2811baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  given server.
2828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID which identify the server.
2848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteristic handle
2858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns pointer to tBTA_GATTC_CHARACTERISTIC or NULL.
2878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_GATTC_CHARACTERISTIC* BTA_GATTC_GetCharacteristic(uint16_t conn_id,
290cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                             uint16_t handle) {
291cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_characteristic(conn_id, handle);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetDescriptor
2978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to find the characteristic on the
2991baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  given server.
3008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID which identify the server.
3028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor handle
3038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          returns pointer to tBTA_GATTC_DESCRIPTOR or NULL.
3058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_GATTC_DESCRIPTOR* BTA_GATTC_GetDescriptor(uint16_t conn_id,
308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                     uint16_t handle) {
309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gattc_get_descriptor(conn_id, handle);
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3126918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski/* Return characteristic that owns descriptor with handle equal to |handle|, or
3136918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski * NULL */
3146918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowskiconst tBTA_GATTC_CHARACTERISTIC* BTA_GATTC_GetOwningCharacteristic(
3156918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski    uint16_t conn_id, uint16_t handle) {
3166918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski  return bta_gattc_get_owning_characteristic(conn_id, handle);
3176918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski}
3186918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski
3196918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski/* Return service that owns descriptor or characteristic with handle equal to
3206918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski * |handle|, or NULL */
3216918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowskiconst tBTA_GATTC_SERVICE* BTA_GATTC_GetOwningService(uint16_t conn_id,
3226918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski                                                     uint16_t handle) {
3236918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski  return bta_gattc_get_service_for_handle(conn_id, handle);
3246918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski}
3256918d40fd9ca8c58c115cf694f165413165e5758Jakub Pawlowski
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_GetGattDb
3298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to get the GATT database.
3318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id: connection ID which identify the server.
333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  db: output parameter which will contain the GATT database
3341baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                      copy. Caller is responsible for freeing it.
3358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  count: number of elements in database.
3368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_GetGattDb(uint16_t conn_id, uint16_t start_handle,
339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         uint16_t end_handle, btgatt_db_element_t** db,
340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         int* count) {
341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_get_gatt_db(conn_id, start_handle, end_handle, db, count);
342533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski}
343533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
344533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski/*******************************************************************************
3458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadCharacteristic
3478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read a characteristics value
3498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
3518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteritic handle to read.
3528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
3548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadCharacteristic(uint16_t conn_id, uint16_t handle,
357ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                                  tGATT_AUTH_REQ auth_req,
358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                  GATT_READ_OP_CB callback, void* cb_data) {
359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ* p_buf =
360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb = callback;
367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb_data = cb_data;
368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3727dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski/**
3737dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski * This function is called to read a value of characteristic with uuid equal to
3747dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski * |uuid|
3757dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski */
376819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowskivoid BTA_GATTC_ReadUsingCharUuid(uint16_t conn_id, const Uuid& uuid,
3777dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 uint16_t s_handle, uint16_t e_handle,
378ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                                 tGATT_AUTH_REQ auth_req,
3797dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski                                 GATT_READ_OP_CB callback, void* cb_data) {
3807dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  tBTA_GATTC_API_READ* p_buf =
3817dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
3827dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3837dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
3847dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->hdr.layer_specific = conn_id;
3857dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->auth_req = auth_req;
3867dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->handle = 0;
3877dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->uuid = uuid;
3887dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->s_handle = s_handle;
3897dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->e_handle = e_handle;
3907dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->read_cb = callback;
3917dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  p_buf->read_cb_data = cb_data;
3927dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3937dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski  bta_sys_sendmsg(p_buf);
3947dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski}
3957dd34f52bc950bae2fb1b30b17da0ff34ee016aaJakub Pawlowski
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadCharDescr
3998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read a descriptor value.
4018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
4038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor handle to read.
4048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadCharDescr(uint16_t conn_id, uint16_t handle,
409ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                             tGATT_AUTH_REQ auth_req, GATT_READ_OP_CB callback,
410ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                             void* cb_data) {
411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ* p_buf =
412cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ*)osi_calloc(sizeof(tBTA_GATTC_API_READ));
413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
415cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb = callback;
419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->read_cb_data = cb_data;
420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
423717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ReadMultiple
4278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to read multiple characteristic or
4298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  characteristic descriptors.
4308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connectino ID.
4328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    p_read_multi - pointer to the read multiple parameter.
4338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
437cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ReadMultiple(uint16_t conn_id, tBTA_GATTC_MULTI* p_read_multi,
438ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                            tGATT_AUTH_REQ auth_req) {
439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_READ_MULTI* p_buf =
440cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_READ_MULTI*)osi_calloc(sizeof(tBTA_GATTC_API_READ_MULTI));
441717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_READ_MULTI_EVT;
443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->num_attr = p_read_multi->num_attr;
446717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_buf->num_attr > 0)
448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->handles, p_read_multi->handles,
449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson           sizeof(uint16_t) * p_read_multi->num_attr);
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
451cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
452717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov}
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_WriteCharValue
4578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to write characteristic value.
4598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
4618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - characteristic handle to write.
4628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  write_type - type of write.
4638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
4648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
4668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_WriteCharValue(uint16_t conn_id, uint16_t handle,
469e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski                              tGATT_WRITE_TYPE write_type,
470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              std::vector<uint8_t> value,
471ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                              tGATT_AUTH_REQ auth_req,
472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              GATT_WRITE_OP_CB callback, void* cb_data) {
473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = write_type;
481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->len = value.size();
482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() > 0) {
486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
492717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_WriteCharDescr
4968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to write descriptor value.
4988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID
5008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - descriptor hadle to write.
5018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
5028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_WriteCharDescr(uint16_t conn_id, uint16_t handle,
507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              std::vector<uint8_t> value,
508ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                              tGATT_AUTH_REQ auth_req,
509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              GATT_WRITE_OP_CB callback, void* cb_data) {
510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
512cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
517e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  p_buf->write_type = GATT_WRITE;
518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() != 0) {
522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->len = value.size();
524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
529717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_PrepareWrite
5338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
534cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to prepare write a characteristic
5351baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  value.
5368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  p_char_id - GATT characteritic ID of the service.
5398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  offset - offset of the write value.
5408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  value - the value to be written.
5418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_PrepareWrite(uint16_t conn_id, uint16_t handle, uint16_t offset,
546ee9a11f903af6ee6b3ca1bd59fc9f89fd029cebaJakub Pawlowski                            std::vector<uint8_t> value, tGATT_AUTH_REQ auth_req,
547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            GATT_WRITE_OP_CB callback, void* cb_data) {
548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_WRITE* p_buf = (tBTA_GATTC_API_WRITE*)osi_calloc(
549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      sizeof(tBTA_GATTC_API_WRITE) + value.size());
550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
552cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->auth_req = auth_req;
554cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb = callback;
556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_cb_data = cb_data;
557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
558cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->write_type = BTA_GATTC_WRITE_PREPARE;
559cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->offset = offset;
560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->len = value.size();
561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
562cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (value.size() > 0) {
563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_value = (uint8_t*)(p_buf + 1);
564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_value, value.data(), value.size());
565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
569717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_ExecuteWrite
5738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
574cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to execute write a prepare write
5751baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  sequence.
5768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
5788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    is_execute - execute or cancel.
5798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
5818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_ExecuteWrite(uint16_t conn_id, bool is_execute) {
584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_EXEC* p_buf =
585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_EXEC*)osi_calloc(sizeof(tBTA_GATTC_API_EXEC));
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_EXEC_EVT;
588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->is_execute = is_execute;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
593717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_SendIndConfirm
5978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      This function is called to send handle value confirmation.
5998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       conn_id - connection ID.
6018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                    p_char_id - characteristic ID to confirm.
6028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None
6048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_GATTC_SendIndConfirm(uint16_t conn_id, uint16_t handle) {
607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_API_CONFIRM* p_buf =
608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_API_CONFIRM*)osi_calloc(sizeof(tBTA_GATTC_API_CONFIRM));
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6102647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski  VLOG(1) << __func__ << ": conn_id=" << +conn_id << " handle=0x" << std::hex
6112647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski          << +handle;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_API_CONFIRM_EVT;
614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->handle = handle;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
617cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_RegisterForNotifications
6238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to register for notification of a
6251baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  service.
6268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface.
6288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bda - target GATT server.
6298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - GATT characteristic handle.
6308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          OK if registration succeed, otherwise failed.
6328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
634e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub PawlowskitGATT_STATUS BTA_GATTC_RegisterForNotifications(tGATT_IF client_if,
635e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski                                                const RawAddress& bda,
636e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski                                                uint16_t handle) {
637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg;
638e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  tGATT_STATUS status = GATT_ILLEGAL_PARAMETER;
639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
640cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!handle) {
6422647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "deregistration failed, handle is 0";
643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return status;
644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
646f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_clreg = bta_gattc_cl_get_regcb(client_if);
647f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_clreg != NULL) {
648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clreg->notif_reg[i].in_use &&
650c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          p_clreg->notif_reg[i].remote_bda == bda &&
651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].handle == handle) {
6522647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski        LOG(WARNING) << "notification already registered";
653e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski        status = GATT_SUCCESS;
654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
657e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski    if (status != GATT_SUCCESS) {
658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
659cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (!p_clreg->notif_reg[i].in_use) {
660cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          memset((void*)&p_clreg->notif_reg[i], 0,
661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                 sizeof(tBTA_GATTC_NOTIF_REG));
662cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
663cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].in_use = true;
664c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          p_clreg->notif_reg[i].remote_bda = bda;
665cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
666cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->notif_reg[i].handle = handle;
667e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski          status = GATT_SUCCESS;
668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (i == BTA_GATTC_NOTIF_REG_MAX) {
672e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski        status = GATT_NO_RESOURCES;
6732647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski        LOG(ERROR) << "Max Notification Reached, registration failed.";
674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
6772647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "client_if=" << +client_if << " Not Registered";
678cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
680cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return status;
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_DeregisterForNotifications
6868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
687cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      This function is called to de-register for notification of a
6881baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  service.
6898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       client_if - client interface.
6918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  remote_bda - target GATT server.
6928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  handle - GATT characteristic handle.
6938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          OK if deregistration succeed, otherwise failed.
6958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
697e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub PawlowskitGATT_STATUS BTA_GATTC_DeregisterForNotifications(tGATT_IF client_if,
698e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski                                                  const RawAddress& bda,
699e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski                                                  uint16_t handle) {
700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!handle) {
7012647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << __func__ << ": deregistration failed, handle is 0";
702e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski    return GATT_ILLEGAL_PARAMETER;
703cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
705cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(client_if);
706cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg == NULL) {
7072647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << __func__ << " client_if=" << +client_if
7082647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski               << " not registered bd_addr=" << bda;
709e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski    return GATT_ILLEGAL_PARAMETER;
710cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (int i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i++) {
713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clreg->notif_reg[i].in_use &&
714c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        p_clreg->notif_reg[i].remote_bda == bda &&
715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clreg->notif_reg[i].handle == handle) {
7162647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski      VLOG(1) << __func__ << " deregistered bd_addr=" << bda;
717cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
718e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski      return GATT_SUCCESS;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
720cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7222647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski  LOG(ERROR) << __func__ << " registration not found bd_addr=" << bda;
723e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  return GATT_ERROR;
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
7278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_GATTC_Refresh
7298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Refresh the server cache of the remote device
7318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters       remote_bda: remote device BD address.
7338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
7358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
737a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTA_GATTC_Refresh(const RawAddress& remote_bda) {
738d7ee6f2e85a1a8837b0b1e2e8ba1c72b53650cd8Jakub Pawlowski  do_in_bta_thread(FROM_HERE,
739d7ee6f2e85a1a8837b0b1e2e8ba1c72b53650cd8Jakub Pawlowski                   base::Bind(&bta_gattc_process_api_refresh, remote_bda));
740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
741