1 /******************************************************************************
2 *
3 * Copyright (C) 2009-2013 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19
20 /*******************************************************************************
21 *
22 * Filename: btif_gatt_client.c
23 *
24 * Description: GATT client implementation
25 *
26 *******************************************************************************/
27
28 #include <hardware/bluetooth.h>
29 #include <hardware/bt_gatt.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <errno.h>
33 #include <string.h>
34
35 #define LOG_TAG "BtGatt.btif"
36
37 #include "btif_common.h"
38 #include "btif_util.h"
39
40 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
41
42 #include "bta_api.h"
43 #include "bta_gatt_api.h"
44 #include "bd.h"
45 #include "btif_storage.h"
46 #include "btif_config.h"
47
48 #include "btif_gatt.h"
49 #include "btif_gatt_util.h"
50 #include "btif_dm.h"
51 #include "btif_storage.h"
52
53 /*******************************************************************************
54 ** Constants & Macros
55 ********************************************************************************/
56
57 #define CHECK_BTGATT_INIT() if (bt_gatt_callbacks == NULL)\
58 {\
59 ALOGW("%s: BTGATT not initialized", __FUNCTION__);\
60 return BT_STATUS_NOT_READY;\
61 } else {\
62 ALOGD("%s", __FUNCTION__);\
63 }
64
65
66 typedef enum {
67 BTIF_GATTC_REGISTER_APP = 1000,
68 BTIF_GATTC_UNREGISTER_APP,
69 BTIF_GATTC_SCAN_START,
70 BTIF_GATTC_SCAN_STOP,
71 BTIF_GATTC_OPEN,
72 BTIF_GATTC_CLOSE,
73 BTIF_GATTC_SEARCH_SERVICE,
74 BTIF_GATTC_GET_FIRST_CHAR,
75 BTIF_GATTC_GET_NEXT_CHAR,
76 BTIF_GATTC_GET_FIRST_CHAR_DESCR,
77 BTIF_GATTC_GET_NEXT_CHAR_DESCR,
78 BTIF_GATTC_GET_FIRST_INCL_SERVICE,
79 BTIF_GATTC_GET_NEXT_INCL_SERVICE,
80 BTIF_GATTC_READ_CHAR,
81 BTIF_GATTC_READ_CHAR_DESCR,
82 BTIF_GATTC_WRITE_CHAR,
83 BTIF_GATTC_WRITE_CHAR_DESCR,
84 BTIF_GATTC_EXECUTE_WRITE,
85 BTIF_GATTC_REG_FOR_NOTIFICATION,
86 BTIF_GATTC_DEREG_FOR_NOTIFICATION,
87 BTIF_GATTC_REFRESH,
88 BTIF_GATTC_READ_RSSI
89 } btif_gattc_event_t;
90
91 #define BTIF_GATT_MAX_OBSERVED_DEV 40
92
93 #define BTIF_GATT_OBSERVE_EVT 0x1000
94 #define BTIF_GATTC_RSSI_EVT 0x1001
95
96 /*******************************************************************************
97 ** Local type definitions
98 ********************************************************************************/
99
100 typedef struct
101 {
102 uint8_t value[BTGATT_MAX_ATTR_LEN];
103 bt_bdaddr_t bd_addr;
104 btgatt_srvc_id_t srvc_id;
105 btgatt_srvc_id_t incl_srvc_id;
106 btgatt_char_id_t char_id;
107 bt_uuid_t uuid;
108 uint16_t conn_id;
109 uint16_t len;
110 uint8_t client_if;
111 uint8_t action;
112 uint8_t is_direct;
113 uint8_t search_all;
114 uint8_t auth_req;
115 uint8_t write_type;
116 uint8_t status;
117 uint8_t addr_type;
118 int8_t rssi;
119 tBT_DEVICE_TYPE device_type;
120 } __attribute__((packed)) btif_gattc_cb_t;
121
122 typedef struct
123 {
124 bt_bdaddr_t bd_addr;
125 BOOLEAN in_use;
126 }__attribute__((packed)) btif_gattc_dev_t;
127
128 typedef struct
129 {
130 btif_gattc_dev_t remote_dev[BTIF_GATT_MAX_OBSERVED_DEV];
131 uint8_t addr_type;
132 uint8_t next_storage_idx;
133 }__attribute__((packed)) btif_gattc_dev_cb_t;
134
135 /*******************************************************************************
136 ** Static variables
137 ********************************************************************************/
138
139 extern const btgatt_callbacks_t *bt_gatt_callbacks;
140 static btif_gattc_dev_cb_t btif_gattc_dev_cb;
141 static btif_gattc_dev_cb_t *p_dev_cb = &btif_gattc_dev_cb;
142 static uint8_t rssi_request_client_if;
143
144 /*******************************************************************************
145 ** Static functions
146 ********************************************************************************/
147
btif_gattc_init_dev_cb(void)148 static void btif_gattc_init_dev_cb(void)
149 {
150 memset(p_dev_cb, 0, sizeof(btif_gattc_dev_cb_t));
151 }
152
btif_gattc_add_remote_bdaddr(BD_ADDR p_bda,uint8_t addr_type)153 static void btif_gattc_add_remote_bdaddr (BD_ADDR p_bda, uint8_t addr_type)
154 {
155 BOOLEAN found=FALSE;
156 uint8_t i;
157 for (i = 0; i < BTIF_GATT_MAX_OBSERVED_DEV; i++)
158 {
159 if (!p_dev_cb->remote_dev[i].in_use )
160 {
161 memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
162 p_dev_cb->addr_type = addr_type;
163 p_dev_cb->remote_dev[i].in_use = TRUE;
164 ALOGD("%s device added idx=%d", __FUNCTION__, i );
165 break;
166 }
167 }
168
169 if ( i == BTIF_GATT_MAX_OBSERVED_DEV)
170 {
171 i= p_dev_cb->next_storage_idx;
172 memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
173 p_dev_cb->addr_type = addr_type;
174 p_dev_cb->remote_dev[i].in_use = TRUE;
175 ALOGD("%s device overwrite idx=%d", __FUNCTION__, i );
176 p_dev_cb->next_storage_idx++;
177 if(p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
178 p_dev_cb->next_storage_idx = 0;
179 }
180 }
181
btif_gattc_find_bdaddr(BD_ADDR p_bda)182 static BOOLEAN btif_gattc_find_bdaddr (BD_ADDR p_bda)
183 {
184 uint8_t i;
185 for (i = 0; i < BTIF_GATT_MAX_OBSERVED_DEV; i++)
186 {
187 if (p_dev_cb->remote_dev[i].in_use &&
188 !memcmp(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN))
189 {
190 return TRUE;
191 }
192 }
193 return FALSE;
194 }
195
btif_gattc_update_properties(btif_gattc_cb_t * p_btif_cb)196 static void btif_gattc_update_properties ( btif_gattc_cb_t *p_btif_cb )
197 {
198 uint8_t remote_name_len;
199 uint8_t *p_eir_remote_name=NULL;
200 bt_bdname_t bdname;
201
202 p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
203 BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
204
205 if(p_eir_remote_name == NULL)
206 {
207 p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
208 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
209 }
210
211 if(p_eir_remote_name)
212 {
213 memcpy(bdname.name, p_eir_remote_name, remote_name_len);
214 bdname.name[remote_name_len]='\0';
215
216 ALOGD("%s BLE device name=%s len=%d dev_type=%d", __FUNCTION__, bdname.name,
217 remote_name_len, p_btif_cb->device_type );
218 btif_dm_update_ble_remote_properties( p_btif_cb->bd_addr.address, bdname.name,
219 p_btif_cb->device_type);
220 }
221
222 btif_storage_set_remote_addr_type( &p_btif_cb->bd_addr, p_btif_cb->addr_type);
223 }
224
btif_gattc_upstreams_evt(uint16_t event,char * p_param)225 static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
226 {
227 ALOGD("%s: Event %d", __FUNCTION__, event);
228
229 tBTA_GATTC *p_data = (tBTA_GATTC*)p_param;
230 switch (event)
231 {
232 case BTA_GATTC_REG_EVT:
233 {
234 bt_uuid_t app_uuid;
235 bta_to_btif_uuid(&app_uuid, &p_data->reg_oper.app_uuid);
236 HAL_CBACK(bt_gatt_callbacks, client->register_client_cb
237 , p_data->reg_oper.status
238 , p_data->reg_oper.client_if
239 , &app_uuid
240 );
241 break;
242 }
243
244 case BTA_GATTC_DEREG_EVT:
245 break;
246
247 case BTA_GATTC_READ_CHAR_EVT:
248 {
249 btgatt_read_params_t data;
250 set_read_value(&data, &p_data->read);
251
252 HAL_CBACK(bt_gatt_callbacks, client->read_characteristic_cb
253 , p_data->read.conn_id, p_data->read.status, &data);
254 break;
255 }
256
257 case BTA_GATTC_WRITE_CHAR_EVT:
258 case BTA_GATTC_PREP_WRITE_EVT:
259 {
260 btgatt_write_params_t data;
261 bta_to_btif_srvc_id(&data.srvc_id, &p_data->write.srvc_id);
262 bta_to_btif_char_id(&data.char_id, &p_data->write.char_id);
263
264 HAL_CBACK(bt_gatt_callbacks, client->write_characteristic_cb
265 , p_data->write.conn_id, p_data->write.status, &data
266 );
267 break;
268 }
269
270 case BTA_GATTC_EXEC_EVT:
271 {
272 HAL_CBACK(bt_gatt_callbacks, client->execute_write_cb
273 , p_data->exec_cmpl.conn_id, p_data->exec_cmpl.status
274 );
275 break;
276 }
277
278 case BTA_GATTC_SEARCH_CMPL_EVT:
279 {
280 HAL_CBACK(bt_gatt_callbacks, client->search_complete_cb
281 , p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
282 break;
283 }
284
285 case BTA_GATTC_SEARCH_RES_EVT:
286 {
287 btgatt_srvc_id_t data;
288 bta_to_btif_srvc_id(&data, &(p_data->srvc_res.service_uuid));
289 HAL_CBACK(bt_gatt_callbacks, client->search_result_cb
290 , p_data->srvc_res.conn_id, &data);
291 break;
292 }
293
294 case BTA_GATTC_READ_DESCR_EVT:
295 {
296 btgatt_read_params_t data;
297 set_read_value(&data, &p_data->read);
298
299 HAL_CBACK(bt_gatt_callbacks, client->read_descriptor_cb
300 , p_data->read.conn_id, p_data->read.status, &data);
301 break;
302 }
303
304 case BTA_GATTC_WRITE_DESCR_EVT:
305 {
306 btgatt_write_params_t data;
307 bta_to_btif_srvc_id(&data.srvc_id, &p_data->write.srvc_id);
308 bta_to_btif_char_id(&data.char_id, &p_data->write.char_id);
309 bta_to_btif_uuid(&data.descr_id, &p_data->write.descr_type);
310
311 HAL_CBACK(bt_gatt_callbacks, client->write_descriptor_cb
312 , p_data->write.conn_id, p_data->write.status, &data);
313 break;
314 }
315
316 case BTA_GATTC_NOTIF_EVT:
317 {
318 btgatt_notify_params_t data;
319
320 bdcpy(data.bda.address, p_data->notify.bda);
321
322 bta_to_btif_srvc_id(&data.srvc_id, &p_data->notify.char_id.srvc_id);
323 bta_to_btif_char_id(&data.char_id, &p_data->notify.char_id.char_id);
324 memcpy(data.value, p_data->notify.value, p_data->notify.len);
325
326 data.is_notify = p_data->notify.is_notify;
327 data.len = p_data->notify.len;
328
329 HAL_CBACK(bt_gatt_callbacks, client->notify_cb
330 , p_data->notify.conn_id, &data);
331
332 if (p_data->notify.is_notify == FALSE)
333 {
334 BTA_GATTC_SendIndConfirm(p_data->notify.conn_id,
335 &p_data->notify.char_id);
336 }
337 break;
338 }
339
340 case BTA_GATTC_OPEN_EVT:
341 {
342 bt_bdaddr_t bda;
343 bdcpy(bda.address, p_data->open.remote_bda);
344
345 if (p_data->open.status == BTA_GATT_OK)
346 btif_gatt_check_encrypted_link(p_data->open.remote_bda);
347
348 HAL_CBACK(bt_gatt_callbacks, client->open_cb, p_data->open.conn_id
349 , p_data->open.status, p_data->open.client_if, &bda);
350 break;
351 }
352
353 case BTA_GATTC_CLOSE_EVT:
354 {
355 bt_bdaddr_t bda;
356 bdcpy(bda.address, p_data->close.remote_bda);
357 HAL_CBACK(bt_gatt_callbacks, client->close_cb, p_data->close.conn_id
358 , p_data->status, p_data->close.client_if, &bda);
359
360 if(p_data->status == BTA_GATT_OK)
361 btif_gatt_remove_encrypted_link(p_data->close.remote_bda);
362 break;
363 }
364
365 case BTA_GATTC_ACL_EVT:
366 ALOGD("BTA_GATTC_ACL_EVT: status = %d", p_data->status);
367 /* Ignore for now */
368 break;
369
370 case BTA_GATTC_CANCEL_OPEN_EVT:
371 break;
372
373 case BTIF_GATT_OBSERVE_EVT:
374 {
375 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
376 if (!btif_gattc_find_bdaddr(p_btif_cb->bd_addr.address))
377 {
378 btif_gattc_add_remote_bdaddr(p_btif_cb->bd_addr.address, p_btif_cb->addr_type);
379 btif_gattc_update_properties(p_btif_cb);
380 }
381 HAL_CBACK(bt_gatt_callbacks, client->scan_result_cb,
382 &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->value);
383 break;
384 }
385
386 case BTIF_GATTC_RSSI_EVT:
387 {
388 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
389 HAL_CBACK(bt_gatt_callbacks, client->read_remote_rssi_cb, p_btif_cb->client_if,
390 &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->status);
391 break;
392 }
393
394 default:
395 ALOGE("%s: Unhandled event (%d)!", __FUNCTION__, event);
396 break;
397 }
398 }
399
bte_gattc_cback(tBTA_GATTC_EVT event,tBTA_GATTC * p_data)400 static void bte_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
401 {
402 bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt,
403 (uint16_t) event, (void*)p_data, sizeof(tBTA_GATTC), NULL);
404 ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
405 }
406
bte_scan_results_cb(tBTA_DM_SEARCH_EVT event,tBTA_DM_SEARCH * p_data)407 static void bte_scan_results_cb (tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
408 {
409 btif_gattc_cb_t btif_cb;
410 uint8_t len;
411
412 switch (event)
413 {
414 case BTA_DM_INQ_RES_EVT:
415 {
416 bdcpy(btif_cb.bd_addr.address, p_data->inq_res.bd_addr);
417 btif_cb.device_type = p_data->inq_res.device_type;
418 btif_cb.rssi = p_data->inq_res.rssi;
419 btif_cb.addr_type = p_data->inq_res.ble_addr_type;
420 if (p_data->inq_res.p_eir)
421 {
422 memcpy(btif_cb.value, p_data->inq_res.p_eir, 62);
423 if (BTA_CheckEirData(p_data->inq_res.p_eir, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE,
424 &len))
425 {
426 p_data->inq_res.remt_name_not_required = TRUE;
427 }
428 }
429 }
430 break;
431
432 case BTA_DM_INQ_CMPL_EVT:
433 {
434 BTIF_TRACE_DEBUG2("%s BLE observe complete. Num Resp %d",
435 __FUNCTION__,p_data->inq_cmpl.num_resps);
436 return;
437 }
438
439 default:
440 BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
441 return;
442 }
443 btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATT_OBSERVE_EVT,
444 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
445 }
446
btm_read_rssi_cb(tBTM_RSSI_RESULTS * p_result)447 static void btm_read_rssi_cb (tBTM_RSSI_RESULTS *p_result)
448 {
449 btif_gattc_cb_t btif_cb;
450
451 bdcpy(btif_cb.bd_addr.address, p_result->rem_bda);
452 btif_cb.rssi = p_result->rssi;
453 btif_cb.status = p_result->status;
454 btif_cb.client_if = rssi_request_client_if;
455 btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATTC_RSSI_EVT,
456 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
457 }
458
459
btgattc_handle_event(uint16_t event,char * p_param)460 static void btgattc_handle_event(uint16_t event, char* p_param)
461 {
462 tBTA_GATT_STATUS status;
463 tBT_UUID uuid;
464 tBTA_GATT_SRVC_ID srvc_id;
465 tGATT_CHAR_PROP out_char_prop;
466 tBTA_GATTC_CHAR_ID in_char_id;
467 tBTA_GATTC_CHAR_ID out_char_id;
468 tBTA_GATTC_CHAR_DESCR_ID in_char_descr_id;
469 tBTA_GATTC_CHAR_DESCR_ID out_char_descr_id;
470 tBTA_GATTC_INCL_SVC_ID in_incl_svc_id;
471 tBTA_GATTC_INCL_SVC_ID out_incl_svc_id;
472 tBTA_GATT_UNFMT descr_val;
473
474 btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*)p_param;
475 if (!p_cb) return;
476
477 ALOGD("%s: Event %d", __FUNCTION__, event);
478
479 switch (event)
480 {
481 case BTIF_GATTC_REGISTER_APP:
482 btif_to_bta_uuid(&uuid, &p_cb->uuid);
483 BTA_GATTC_AppRegister(&uuid, bte_gattc_cback);
484 break;
485
486 case BTIF_GATTC_UNREGISTER_APP:
487 BTA_GATTC_AppDeregister(p_cb->client_if);
488 break;
489
490 case BTIF_GATTC_SCAN_START:
491 btif_gattc_init_dev_cb();
492 BTA_DmBleObserve(TRUE, 0, bte_scan_results_cb);
493 break;
494
495 case BTIF_GATTC_SCAN_STOP:
496 BTA_DmBleObserve(FALSE, 0, 0);
497 break;
498
499 case BTIF_GATTC_OPEN:
500 if (!p_cb->is_direct)
501 BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
502
503 BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct);
504 break;
505
506 case BTIF_GATTC_CLOSE:
507 // Disconnect establiched connections
508 if (p_cb->conn_id != 0)
509 BTA_GATTC_Close(p_cb->conn_id);
510 else
511 BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, TRUE);
512
513 // Cancel pending background connections (remove from whitelist)
514 BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, FALSE);
515 break;
516
517 case BTIF_GATTC_SEARCH_SERVICE:
518 {
519 if (p_cb->search_all)
520 {
521 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, NULL);
522 } else {
523 btif_to_bta_uuid(&uuid, &p_cb->uuid);
524 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &uuid);
525 }
526 break;
527 }
528
529 case BTIF_GATTC_GET_FIRST_CHAR:
530 {
531 btgatt_char_id_t char_id;
532 btif_to_bta_srvc_id(&srvc_id, &p_cb->srvc_id);
533 status = BTA_GATTC_GetFirstChar(p_cb->conn_id, &srvc_id, NULL,
534 &out_char_id, &out_char_prop);
535
536 if (status == 0)
537 bta_to_btif_char_id(&char_id, &out_char_id.char_id);
538
539 HAL_CBACK(bt_gatt_callbacks, client->get_characteristic_cb,
540 p_cb->conn_id, status, &p_cb->srvc_id,
541 &char_id, out_char_prop);
542 break;
543 }
544
545 case BTIF_GATTC_GET_NEXT_CHAR:
546 {
547 btgatt_char_id_t char_id;
548 btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
549 btif_to_bta_char_id(&in_char_id.char_id, &p_cb->char_id);
550
551 status = BTA_GATTC_GetNextChar(p_cb->conn_id, &in_char_id, NULL,
552 &out_char_id, &out_char_prop);
553
554 if (status == 0)
555 bta_to_btif_char_id(&char_id, &out_char_id.char_id);
556
557 HAL_CBACK(bt_gatt_callbacks, client->get_characteristic_cb,
558 p_cb->conn_id, status, &p_cb->srvc_id,
559 &char_id, out_char_prop);
560 break;
561 }
562
563 case BTIF_GATTC_GET_FIRST_CHAR_DESCR:
564 {
565 bt_uuid_t descr_id;
566 btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
567 btif_to_bta_char_id(&in_char_id.char_id, &p_cb->char_id);
568
569 status = BTA_GATTC_GetFirstCharDescr(p_cb->conn_id, &in_char_id, NULL,
570 &out_char_descr_id);
571
572 if (status == 0)
573 bta_to_btif_uuid(&descr_id, &out_char_descr_id.descr_type);
574
575 HAL_CBACK(bt_gatt_callbacks, client->get_descriptor_cb,
576 p_cb->conn_id, status, &p_cb->srvc_id,
577 &p_cb->char_id, &descr_id);
578 break;
579 }
580
581 case BTIF_GATTC_GET_NEXT_CHAR_DESCR:
582 {
583 bt_uuid_t descr_id;
584 btif_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &p_cb->srvc_id);
585 btif_to_bta_char_id(&in_char_descr_id.char_id.char_id, &p_cb->char_id);
586 btif_to_bta_uuid(&in_char_descr_id.descr_type, &p_cb->uuid);
587
588 status = BTA_GATTC_GetNextCharDescr(p_cb->conn_id, &in_char_descr_id
589 , NULL, &out_char_descr_id);
590
591 if (status == 0)
592 bta_to_btif_uuid(&descr_id, &out_char_descr_id.descr_type);
593
594 HAL_CBACK(bt_gatt_callbacks, client->get_descriptor_cb,
595 p_cb->conn_id, status, &p_cb->srvc_id,
596 &p_cb->char_id, &descr_id);
597 break;
598 }
599
600 case BTIF_GATTC_GET_FIRST_INCL_SERVICE:
601 {
602 btgatt_srvc_id_t incl_srvc_id;
603 btif_to_bta_srvc_id(&srvc_id, &p_cb->srvc_id);
604
605 status = BTA_GATTC_GetFirstIncludedService(p_cb->conn_id,
606 &srvc_id, NULL, &out_incl_svc_id);
607
608 bta_to_btif_srvc_id(&incl_srvc_id, &out_incl_svc_id.incl_svc_id);
609
610 HAL_CBACK(bt_gatt_callbacks, client->get_included_service_cb,
611 p_cb->conn_id, status, &p_cb->srvc_id,
612 &incl_srvc_id);
613 break;
614 }
615
616 case BTIF_GATTC_GET_NEXT_INCL_SERVICE:
617 {
618 btgatt_srvc_id_t incl_srvc_id;
619 btif_to_bta_srvc_id(&in_incl_svc_id.srvc_id, &p_cb->srvc_id);
620 btif_to_bta_srvc_id(&in_incl_svc_id.incl_svc_id, &p_cb->incl_srvc_id);
621
622 status = BTA_GATTC_GetNextIncludedService(p_cb->conn_id,
623 &in_incl_svc_id, NULL, &out_incl_svc_id);
624
625 bta_to_btif_srvc_id(&incl_srvc_id, &out_incl_svc_id.incl_svc_id);
626
627 HAL_CBACK(bt_gatt_callbacks, client->get_included_service_cb,
628 p_cb->conn_id, status, &p_cb->srvc_id,
629 &incl_srvc_id);
630 break;
631 }
632
633 case BTIF_GATTC_READ_CHAR:
634 btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
635 btif_to_bta_char_id(&in_char_id.char_id, &p_cb->char_id);
636
637 BTA_GATTC_ReadCharacteristic(p_cb->conn_id, &in_char_id, p_cb->auth_req);
638 break;
639
640 case BTIF_GATTC_READ_CHAR_DESCR:
641 btif_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &p_cb->srvc_id);
642 btif_to_bta_char_id(&in_char_descr_id.char_id.char_id, &p_cb->char_id);
643 btif_to_bta_uuid(&in_char_descr_id.descr_type, &p_cb->uuid);
644
645 BTA_GATTC_ReadCharDescr(p_cb->conn_id, &in_char_descr_id, p_cb->auth_req);
646 break;
647
648 case BTIF_GATTC_WRITE_CHAR:
649 btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
650 btif_to_bta_char_id(&in_char_id.char_id, &p_cb->char_id);
651
652 BTA_GATTC_WriteCharValue(p_cb->conn_id, &in_char_id,
653 p_cb->write_type,
654 p_cb->len,
655 p_cb->value,
656 p_cb->auth_req);
657 break;
658
659 case BTIF_GATTC_WRITE_CHAR_DESCR:
660 btif_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &p_cb->srvc_id);
661 btif_to_bta_char_id(&in_char_descr_id.char_id.char_id, &p_cb->char_id);
662 btif_to_bta_uuid(&in_char_descr_id.descr_type, &p_cb->uuid);
663
664 descr_val.len = p_cb->len;
665 descr_val.p_value = p_cb->value;
666
667 BTA_GATTC_WriteCharDescr(p_cb->conn_id, &in_char_descr_id,
668 p_cb->write_type, &descr_val,
669 p_cb->auth_req);
670 break;
671
672 case BTIF_GATTC_EXECUTE_WRITE:
673 BTA_GATTC_ExecuteWrite(p_cb->conn_id, p_cb->action);
674 break;
675
676 case BTIF_GATTC_REG_FOR_NOTIFICATION:
677 btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
678 btif_to_bta_char_id(&in_char_id.char_id, &p_cb->char_id);
679
680 status = BTA_GATTC_RegisterForNotifications(p_cb->client_if,
681 p_cb->bd_addr.address, &in_char_id);
682
683 HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
684 p_cb->conn_id, 1, status, &p_cb->srvc_id,
685 &p_cb->char_id);
686 break;
687
688 case BTIF_GATTC_DEREG_FOR_NOTIFICATION:
689 btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
690 btif_to_bta_char_id(&in_char_id.char_id, &p_cb->char_id);
691
692 status = BTA_GATTC_DeregisterForNotifications(p_cb->client_if,
693 p_cb->bd_addr.address, &in_char_id);
694
695 HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
696 p_cb->conn_id, 0, status, &p_cb->srvc_id,
697 &p_cb->char_id);
698 break;
699
700 case BTIF_GATTC_REFRESH:
701 BTA_GATTC_Refresh(p_cb->bd_addr.address);
702 break;
703
704 case BTIF_GATTC_READ_RSSI:
705 rssi_request_client_if = p_cb->client_if;
706 BTM_ReadRSSI (p_cb->bd_addr.address, (tBTM_CMPL_CB *)btm_read_rssi_cb);
707 break;
708
709 default:
710 ALOGE("%s: Unknown event (%d)!", __FUNCTION__, event);
711 break;
712 }
713 }
714
715 /*******************************************************************************
716 ** Client API Functions
717 ********************************************************************************/
718
btif_gattc_register_app(bt_uuid_t * uuid)719 static bt_status_t btif_gattc_register_app(bt_uuid_t *uuid)
720 {
721 CHECK_BTGATT_INIT();
722 btif_gattc_cb_t btif_cb;
723 memcpy(&btif_cb.uuid, uuid, sizeof(bt_uuid_t));
724 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REGISTER_APP,
725 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
726 }
727
btif_gattc_unregister_app(int client_if)728 static bt_status_t btif_gattc_unregister_app(int client_if )
729 {
730 CHECK_BTGATT_INIT();
731 btif_gattc_cb_t btif_cb;
732 btif_cb.client_if = (uint8_t) client_if;
733 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_UNREGISTER_APP,
734 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
735 }
736
btif_gattc_scan(int client_if,bool start)737 static bt_status_t btif_gattc_scan( int client_if, bool start )
738 {
739 CHECK_BTGATT_INIT();
740 btif_gattc_cb_t btif_cb;
741 btif_cb.client_if = (uint8_t) client_if;
742 return btif_transfer_context(btgattc_handle_event, start ? BTIF_GATTC_SCAN_START : BTIF_GATTC_SCAN_STOP,
743 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
744 }
745
btif_gattc_open(int client_if,const bt_bdaddr_t * bd_addr,bool is_direct)746 static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr, bool is_direct )
747 {
748 CHECK_BTGATT_INIT();
749 btif_gattc_cb_t btif_cb;
750 btif_cb.client_if = (uint8_t) client_if;
751 btif_cb.is_direct = is_direct ? 1 : 0;
752 bdcpy(btif_cb.bd_addr.address, bd_addr->address);
753 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_OPEN,
754 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
755 }
756
btif_gattc_close(int client_if,const bt_bdaddr_t * bd_addr,int conn_id)757 static bt_status_t btif_gattc_close( int client_if, const bt_bdaddr_t *bd_addr, int conn_id)
758 {
759 CHECK_BTGATT_INIT();
760 btif_gattc_cb_t btif_cb;
761 btif_cb.client_if = (uint8_t) client_if;
762 btif_cb.conn_id = (uint16_t) conn_id;
763 bdcpy(btif_cb.bd_addr.address, bd_addr->address);
764 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CLOSE,
765 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
766 }
767
btif_gattc_refresh(int client_if,const bt_bdaddr_t * bd_addr)768 static bt_status_t btif_gattc_refresh( int client_if, const bt_bdaddr_t *bd_addr )
769 {
770 CHECK_BTGATT_INIT();
771 btif_gattc_cb_t btif_cb;
772 btif_cb.client_if = (uint8_t) client_if;
773 bdcpy(btif_cb.bd_addr.address, bd_addr->address);
774 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REFRESH,
775 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
776 }
777
btif_gattc_search_service(int conn_id,bt_uuid_t * filter_uuid)778 static bt_status_t btif_gattc_search_service(int conn_id, bt_uuid_t *filter_uuid )
779 {
780 CHECK_BTGATT_INIT();
781 btif_gattc_cb_t btif_cb;
782 btif_cb.conn_id = (uint16_t) conn_id;
783 btif_cb.search_all = filter_uuid ? 0 : 1;
784 if (filter_uuid)
785 memcpy(&btif_cb.uuid, filter_uuid, sizeof(bt_uuid_t));
786 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SEARCH_SERVICE,
787 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
788 }
789
btif_gattc_get_characteristic(int conn_id,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * start_char_id)790 static bt_status_t btif_gattc_get_characteristic( int conn_id
791 , btgatt_srvc_id_t *srvc_id, btgatt_char_id_t *start_char_id)
792 {
793 CHECK_BTGATT_INIT();
794 btif_gattc_cb_t btif_cb;
795 btif_cb.conn_id = (uint16_t) conn_id;
796 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
797 if (start_char_id)
798 {
799 memcpy(&btif_cb.char_id, start_char_id, sizeof(btgatt_char_id_t));
800 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_NEXT_CHAR,
801 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
802 }
803 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_FIRST_CHAR,
804 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
805 }
806
btif_gattc_get_descriptor(int conn_id,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * char_id,bt_uuid_t * start_descr_id)807 static bt_status_t btif_gattc_get_descriptor( int conn_id
808 , btgatt_srvc_id_t *srvc_id, btgatt_char_id_t *char_id
809 , bt_uuid_t *start_descr_id)
810 {
811 CHECK_BTGATT_INIT();
812 btif_gattc_cb_t btif_cb;
813 btif_cb.conn_id = (uint16_t) conn_id;
814 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
815 memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_char_id_t));
816 if (start_descr_id)
817 {
818 memcpy(&btif_cb.uuid, start_descr_id, sizeof(bt_uuid_t));
819 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_NEXT_CHAR_DESCR,
820 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
821 }
822
823 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_FIRST_CHAR_DESCR,
824 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
825 }
826
btif_gattc_get_included_service(int conn_id,btgatt_srvc_id_t * srvc_id,btgatt_srvc_id_t * start_incl_srvc_id)827 static bt_status_t btif_gattc_get_included_service(int conn_id, btgatt_srvc_id_t *srvc_id,
828 btgatt_srvc_id_t *start_incl_srvc_id)
829 {
830 CHECK_BTGATT_INIT();
831 btif_gattc_cb_t btif_cb;
832 btif_cb.conn_id = (uint16_t) conn_id;
833 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
834 if (start_incl_srvc_id)
835 {
836 memcpy(&btif_cb.incl_srvc_id, start_incl_srvc_id, sizeof(btgatt_srvc_id_t));
837 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_NEXT_INCL_SERVICE,
838 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
839 }
840 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_FIRST_INCL_SERVICE,
841 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
842 }
843
btif_gattc_read_char(int conn_id,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * char_id,int auth_req)844 static bt_status_t btif_gattc_read_char(int conn_id, btgatt_srvc_id_t* srvc_id,
845 btgatt_char_id_t* char_id, int auth_req )
846 {
847 CHECK_BTGATT_INIT();
848 btif_gattc_cb_t btif_cb;
849 btif_cb.conn_id = (uint16_t) conn_id;
850 btif_cb.auth_req = (uint8_t) auth_req;
851 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
852 memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_char_id_t));
853 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR,
854 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
855 }
856
btif_gattc_read_char_descr(int conn_id,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * char_id,bt_uuid_t * descr_id,int auth_req)857 static bt_status_t btif_gattc_read_char_descr(int conn_id, btgatt_srvc_id_t* srvc_id,
858 btgatt_char_id_t* char_id, bt_uuid_t* descr_id,
859 int auth_req )
860 {
861 CHECK_BTGATT_INIT();
862 btif_gattc_cb_t btif_cb;
863 btif_cb.conn_id = (uint16_t) conn_id;
864 btif_cb.auth_req = (uint8_t) auth_req;
865 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
866 memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_char_id_t));
867 memcpy(&btif_cb.uuid, descr_id, sizeof(bt_uuid_t));
868 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR_DESCR,
869 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
870 }
871
btif_gattc_write_char(int conn_id,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * char_id,int write_type,int len,int auth_req,char * p_value)872 static bt_status_t btif_gattc_write_char(int conn_id, btgatt_srvc_id_t* srvc_id,
873 btgatt_char_id_t* char_id, int write_type,
874 int len, int auth_req, char* p_value)
875 {
876 CHECK_BTGATT_INIT();
877 btif_gattc_cb_t btif_cb;
878 btif_cb.conn_id = (uint16_t) conn_id;
879 btif_cb.auth_req = (uint8_t) auth_req;
880 btif_cb.write_type = (uint8_t) write_type;
881 btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len;
882 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
883 memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_char_id_t));
884 memcpy(btif_cb.value, p_value, btif_cb.len);
885 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR,
886 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
887 }
888
btif_gattc_write_char_descr(int conn_id,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * char_id,bt_uuid_t * descr_id,int write_type,int len,int auth_req,char * p_value)889 static bt_status_t btif_gattc_write_char_descr(int conn_id, btgatt_srvc_id_t* srvc_id,
890 btgatt_char_id_t* char_id, bt_uuid_t* descr_id,
891 int write_type, int len, int auth_req,
892 char* p_value)
893 {
894 CHECK_BTGATT_INIT();
895 btif_gattc_cb_t btif_cb;
896 btif_cb.conn_id = (uint16_t) conn_id;
897 btif_cb.auth_req = (uint8_t) auth_req;
898 btif_cb.write_type = (uint8_t) write_type;
899 btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len;
900 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
901 memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_char_id_t));
902 memcpy(&btif_cb.uuid, descr_id, sizeof(bt_uuid_t));
903 memcpy(btif_cb.value, p_value, btif_cb.len);
904 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR_DESCR,
905 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
906 }
907
btif_gattc_execute_write(int conn_id,int execute)908 static bt_status_t btif_gattc_execute_write(int conn_id, int execute)
909 {
910 CHECK_BTGATT_INIT();
911 btif_gattc_cb_t btif_cb;
912 btif_cb.conn_id = (uint16_t) conn_id;
913 btif_cb.action = (uint8_t) execute;
914 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_EXECUTE_WRITE,
915 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
916 }
917
btif_gattc_reg_for_notification(int client_if,const bt_bdaddr_t * bd_addr,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * char_id)918 static bt_status_t btif_gattc_reg_for_notification(int client_if, const bt_bdaddr_t *bd_addr,
919 btgatt_srvc_id_t* srvc_id,
920 btgatt_char_id_t* char_id)
921 {
922 CHECK_BTGATT_INIT();
923 btif_gattc_cb_t btif_cb;
924 btif_cb.client_if = (uint8_t) client_if;
925 bdcpy(btif_cb.bd_addr.address, bd_addr->address);
926 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
927 memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_char_id_t));
928 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REG_FOR_NOTIFICATION,
929 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
930 }
931
btif_gattc_dereg_for_notification(int client_if,const bt_bdaddr_t * bd_addr,btgatt_srvc_id_t * srvc_id,btgatt_char_id_t * char_id)932 static bt_status_t btif_gattc_dereg_for_notification(int client_if, const bt_bdaddr_t *bd_addr,
933 btgatt_srvc_id_t* srvc_id,
934 btgatt_char_id_t* char_id)
935 {
936 CHECK_BTGATT_INIT();
937 btif_gattc_cb_t btif_cb;
938 btif_cb.client_if = (uint8_t) client_if;
939 bdcpy(btif_cb.bd_addr.address, bd_addr->address);
940 memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
941 memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_char_id_t));
942 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DEREG_FOR_NOTIFICATION,
943 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
944 }
945
btif_gattc_read_remote_rssi(int client_if,const bt_bdaddr_t * bd_addr)946 static bt_status_t btif_gattc_read_remote_rssi(int client_if, const bt_bdaddr_t *bd_addr)
947 {
948 CHECK_BTGATT_INIT();
949 btif_gattc_cb_t btif_cb;
950 btif_cb.client_if = (uint8_t) client_if;
951 bdcpy(btif_cb.bd_addr.address, bd_addr->address);
952 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_RSSI,
953 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
954 }
955
btif_gattc_get_device_type(const bt_bdaddr_t * bd_addr)956 static int btif_gattc_get_device_type( const bt_bdaddr_t *bd_addr )
957 {
958 int device_type = 0;
959 char bd_addr_str[18] = {0};
960
961 bd2str(bd_addr, &bd_addr_str);
962 if (btif_config_get_int("Remote", bd_addr_str, "DevType", &device_type))
963 return device_type;
964 return 0;
965 }
966
967 extern bt_status_t btif_gattc_test_command_impl(int command, btgatt_test_params_t* params);
968
btif_gattc_test_command(int command,btgatt_test_params_t * params)969 static bt_status_t btif_gattc_test_command(int command, btgatt_test_params_t* params)
970 {
971 return btif_gattc_test_command_impl(command, params);
972 }
973
974
975 const btgatt_client_interface_t btgattClientInterface = {
976 btif_gattc_register_app,
977 btif_gattc_unregister_app,
978 btif_gattc_scan,
979 btif_gattc_open,
980 btif_gattc_close,
981 btif_gattc_refresh,
982 btif_gattc_search_service,
983 btif_gattc_get_included_service,
984 btif_gattc_get_characteristic,
985 btif_gattc_get_descriptor,
986 btif_gattc_read_char,
987 btif_gattc_write_char,
988 btif_gattc_read_char_descr,
989 btif_gattc_write_char_descr,
990 btif_gattc_execute_write,
991 btif_gattc_reg_for_notification,
992 btif_gattc_dereg_for_notification,
993 btif_gattc_read_remote_rssi,
994 btif_gattc_get_device_type,
995 btif_gattc_test_command
996 };
997
998 #endif
999