• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2010-2012 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  *  This is the implementation of the API for GATT module of BTA.
22  *
23  ******************************************************************************/
24 
25 #include "bt_target.h"
26 
27 #if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
28 
29 #include <string.h>
30 #include "gki.h"
31 #include "bta_sys.h"
32 #include "bta_gatt_api.h"
33 #include "bta_gattc_int.h"
34 
35 
36 /*****************************************************************************
37 **  Externs
38 *****************************************************************************/
39 #if BTA_DYNAMIC_MEMORY == FALSE
40 extern tBTA_GATTC_CB  bta_gattc_cb;
41 #endif
42 
43 /*****************************************************************************
44 **  Constants
45 *****************************************************************************/
46 
47 static const tBTA_SYS_REG bta_gatt_reg =
48 {
49     bta_gattc_hdl_event,
50     NULL        /* need a disable functino to be called when BT is disabled */
51 };
52 
53 /*******************************************************************************
54 **
55 ** Function         BTA_GATTC_Init
56 **
57 ** Description     This function is called to initalize GATTC module
58 **
59 ** Parameters       None
60 **
61 ** Returns          None
62 **
63 *******************************************************************************/
BTA_GATTC_Init()64 void BTA_GATTC_Init()
65 {
66     memset(&bta_gattc_cb, 0, sizeof(tBTA_GATTC_CB));
67 }
68 
69 /*******************************************************************************
70 **
71 ** Function         BTA_GATTC_AppRegister
72 **
73 ** Description      This function is called to register application callbacks
74 **                    with BTA GATTC module.
75 **
76 ** Parameters       p_app_uuid - applicaiton UUID
77 **                  p_client_cb - pointer to the application callback function.
78 **
79 ** Returns          None
80 **
81 *******************************************************************************/
BTA_GATTC_AppRegister(tBT_UUID * p_app_uuid,tBTA_GATTC_CBACK * p_client_cb)82 void BTA_GATTC_AppRegister(tBT_UUID *p_app_uuid, tBTA_GATTC_CBACK *p_client_cb)
83 {
84     tBTA_GATTC_API_REG  *p_buf;
85 
86     /* register with BTA system manager */
87     GKI_sched_lock();
88     bta_sys_register(BTA_ID_GATTC, &bta_gatt_reg);
89     GKI_sched_unlock();
90 
91     if ((p_buf = (tBTA_GATTC_API_REG *) GKI_getbuf(sizeof(tBTA_GATTC_API_REG))) != NULL)
92     {
93         p_buf->hdr.event    = BTA_GATTC_API_REG_EVT;
94         if (p_app_uuid != NULL)
95             memcpy(&p_buf->app_uuid, p_app_uuid, sizeof(tBT_UUID));
96         p_buf->p_cback      = p_client_cb;
97 
98         bta_sys_sendmsg(p_buf);
99     }
100     return;
101 }
102 
103 /*******************************************************************************
104 **
105 ** Function         BTA_GATTC_AppDeregister
106 **
107 ** Description      This function is called to deregister an application
108 **                  from BTA GATTC module.
109 **
110 ** Parameters       client_if - client interface identifier.
111 **
112 ** Returns          None
113 **
114 *******************************************************************************/
BTA_GATTC_AppDeregister(tBTA_GATTC_IF client_if)115 void BTA_GATTC_AppDeregister(tBTA_GATTC_IF client_if)
116 {
117     tBTA_GATTC_API_DEREG  *p_buf;
118 
119     if ((p_buf = (tBTA_GATTC_API_DEREG *) GKI_getbuf(sizeof(tBTA_GATTC_API_DEREG))) != NULL)
120     {
121         p_buf->hdr.event = BTA_GATTC_API_DEREG_EVT;
122         p_buf->client_if = client_if;
123         bta_sys_sendmsg(p_buf);
124     }
125     return;
126 }
127 
128 /*******************************************************************************
129 **
130 ** Function         BTA_GATTC_Open
131 **
132 ** Description      Open a direct connection or add a background auto connection
133 **                  bd address
134 **
135 ** Parameters       client_if: server interface.
136 **                  remote_bda: remote device BD address.
137 **                  is_direct: direct connection or background auto connection
138 **
139 ** Returns          void
140 **
141 *******************************************************************************/
BTA_GATTC_Open(tBTA_GATTC_IF client_if,BD_ADDR remote_bda,BOOLEAN is_direct)142 void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, BOOLEAN is_direct)
143 {
144     tBTA_GATTC_API_OPEN  *p_buf;
145 
146     if ((p_buf = (tBTA_GATTC_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_OPEN))) != NULL)
147     {
148         p_buf->hdr.event = BTA_GATTC_API_OPEN_EVT;
149 
150         p_buf->client_if = client_if;
151         p_buf->is_direct = is_direct;
152         memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
153 
154 
155         bta_sys_sendmsg(p_buf);
156     }
157     return;
158 }
159 
160 /*******************************************************************************
161 **
162 ** Function         BTA_GATTC_CancelOpen
163 **
164 ** Description      Cancel a direct open connection or remove a background auto connection
165 **                  bd address
166 **
167 ** Parameters       client_if: server interface.
168 **                  remote_bda: remote device BD address.
169 **                  is_direct: direct connection or background auto connection
170 **
171 ** Returns          void
172 **
173 *******************************************************************************/
BTA_GATTC_CancelOpen(tBTA_GATTC_IF client_if,BD_ADDR remote_bda,BOOLEAN is_direct)174 void BTA_GATTC_CancelOpen(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, BOOLEAN is_direct)
175 {
176     tBTA_GATTC_API_CANCEL_OPEN  *p_buf;
177 
178     if ((p_buf = (tBTA_GATTC_API_CANCEL_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_CANCEL_OPEN))) != NULL)
179     {
180         p_buf->hdr.event = BTA_GATTC_API_CANCEL_OPEN_EVT;
181 
182         p_buf->client_if = client_if;
183         p_buf->is_direct = is_direct;
184         memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
185 
186         bta_sys_sendmsg(p_buf);
187     }
188     return;
189 }
190 
191 /*******************************************************************************
192 **
193 ** Function         BTA_GATTC_Close
194 **
195 ** Description      Close a connection to a GATT server.
196 **
197 ** Parameters       conn_id: connectino ID to be closed.
198 **
199 ** Returns          void
200 **
201 *******************************************************************************/
BTA_GATTC_Close(UINT16 conn_id)202 void BTA_GATTC_Close(UINT16 conn_id)
203 {
204     BT_HDR  *p_buf;
205 
206     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
207     {
208         p_buf->event = BTA_GATTC_API_CLOSE_EVT;
209 
210         p_buf->layer_specific = conn_id;
211 
212         bta_sys_sendmsg(p_buf);
213     }
214     return;
215 
216 }
217 /*******************************************************************************
218 **
219 ** Function         BTA_GATTC_ServiceSearchRequest
220 **
221 ** Description      This function is called to request a GATT service discovery
222 **                    on a GATT server. This function report service search result
223 **                  by a callback event, and followed by a service search complete
224 **                  event.
225 **
226 ** Parameters       conn_id: connection ID.
227 **                  p_srvc_uuid: a UUID of the service application is interested in.
228 **                              If Null, discover for all services.
229 **
230 ** Returns          None
231 **
232 *******************************************************************************/
BTA_GATTC_ServiceSearchRequest(UINT16 conn_id,tBT_UUID * p_srvc_uuid)233 void BTA_GATTC_ServiceSearchRequest (UINT16 conn_id, tBT_UUID *p_srvc_uuid)
234 {
235     tBTA_GATTC_API_SEARCH  *p_buf;
236     UINT16  len = sizeof(tBTA_GATTC_API_SEARCH) + sizeof(tBT_UUID);
237 
238     if ((p_buf = (tBTA_GATTC_API_SEARCH *) GKI_getbuf(len)) != NULL)
239     {
240         memset(p_buf, 0, len);
241 
242         p_buf->hdr.event = BTA_GATTC_API_SEARCH_EVT;
243         p_buf->hdr.layer_specific = conn_id;
244 
245         if (p_srvc_uuid)
246         {
247             memcpy(&p_buf->srvc_uuid, p_srvc_uuid, sizeof(tBT_UUID));
248         }
249         bta_sys_sendmsg(p_buf);
250     }
251     return;
252 }
253 
254 
255 /*******************************************************************************
256 **
257 ** Function         BTA_GATTC_GetFirstChar
258 **
259 ** Description      This function is called to find the first characteristic of the
260 **                  service on the given server.
261 **
262 ** Parameters       conn_id: connection ID which identify the server.
263 **                  p_srvc_id: the service ID of which the characteristic is belonged to.
264 **                  p_char_uuid_cond: Characteristic UUID, if NULL find the first available
265 **                               characteristic.
266 **                  p_char_result: output parameter which will store the GATT
267 **                                  characteristic ID.
268 **                  p_property: output parameter to carry the characteristic property.
269 **
270 ** Returns          returns status.
271 **
272 *******************************************************************************/
BTA_GATTC_GetFirstChar(UINT16 conn_id,tBTA_GATT_SRVC_ID * p_srvc_id,tBT_UUID * p_char_uuid_cond,tBTA_GATTC_CHAR_ID * p_char_result,tBTA_GATT_CHAR_PROP * p_property)273 tBTA_GATT_STATUS  BTA_GATTC_GetFirstChar (UINT16 conn_id, tBTA_GATT_SRVC_ID *p_srvc_id,
274                                           tBT_UUID *p_char_uuid_cond,
275                                           tBTA_GATTC_CHAR_ID *p_char_result,
276                                           tBTA_GATT_CHAR_PROP *p_property)
277 {
278     tBTA_GATT_STATUS    status;
279 
280     if (!p_srvc_id || !p_char_result)
281         return BTA_GATT_ILLEGAL_PARAMETER;
282 
283     if ((status = bta_gattc_query_cache(conn_id, BTA_GATTC_ATTR_TYPE_CHAR, p_srvc_id, NULL,
284                                         p_char_uuid_cond, &p_char_result->char_id, p_property))
285         == BTA_GATT_OK)
286     {
287         memcpy(&p_char_result->srvc_id, p_srvc_id, sizeof(tBTA_GATT_SRVC_ID));
288     }
289 
290     return status;
291 
292 }
293 /*******************************************************************************
294 **
295 ** Function         BTA_GATTC_GetNextChar
296 **
297 ** Description      This function is called to find the next characteristic of the
298 **                  service on the given server.
299 **
300 ** Parameters       conn_id: connection ID which identify the server.
301 **                  p_start_char_id: start the characteristic search from the next record
302 **                           after the one identified by char_id.
303 **                  p_char_uuid_cond: Characteristic UUID, if NULL find the first available
304 **                               characteristic.
305 **                  p_char_result: output parameter which will store the GATT
306 **                                  characteristic ID.
307 **                  p_property: output parameter to carry the characteristic property.
308 **
309 ** Returns          returns status.
310 **
311 *******************************************************************************/
BTA_GATTC_GetNextChar(UINT16 conn_id,tBTA_GATTC_CHAR_ID * p_start_char_id,tBT_UUID * p_char_uuid_cond,tBTA_GATTC_CHAR_ID * p_char_result,tBTA_GATT_CHAR_PROP * p_property)312 tBTA_GATT_STATUS  BTA_GATTC_GetNextChar (UINT16 conn_id,
313                                          tBTA_GATTC_CHAR_ID *p_start_char_id,
314                                          tBT_UUID           *p_char_uuid_cond,
315                                          tBTA_GATTC_CHAR_ID *p_char_result,
316                                          tBTA_GATT_CHAR_PROP    *p_property)
317 {
318     tBTA_GATT_STATUS    status;
319 
320     if (!p_start_char_id || !p_char_result)
321         return BTA_GATT_ILLEGAL_PARAMETER;
322 
323     if ((status = bta_gattc_query_cache(conn_id, BTA_GATTC_ATTR_TYPE_CHAR,
324                                         &p_start_char_id->srvc_id,
325                                         &p_start_char_id->char_id,
326                                         p_char_uuid_cond,
327                                         &p_char_result->char_id,
328                                         p_property))
329         == BTA_GATT_OK)
330     {
331         memcpy(&p_char_result->srvc_id, &p_start_char_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID));
332     }
333 
334     return status;
335 }
336 
337 /*******************************************************************************
338 **
339 ** Function         BTA_GATTC_GetFirstCharDescr
340 **
341 ** Description      This function is called to find the first characteristic descriptor of the
342 **                  characteristic on the given server.
343 **
344 ** Parameters       conn_id: connection ID which identify the server.
345 **                  p_char_id: the characteristic ID of which the descriptor is belonged to.
346 **                  p_descr_uuid_cond: Characteristic Descr UUID, if NULL find the first available
347 **                               characteristic.
348 **                  p_descr_result: output parameter which will store the GATT
349 **                                  characteristic descriptor ID.
350 **
351 ** Returns          returns status.
352 **
353 *******************************************************************************/
BTA_GATTC_GetFirstCharDescr(UINT16 conn_id,tBTA_GATTC_CHAR_ID * p_char_id,tBT_UUID * p_descr_uuid_cond,tBTA_GATTC_CHAR_DESCR_ID * p_descr_result)354 tBTA_GATT_STATUS  BTA_GATTC_GetFirstCharDescr (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id,
355                                                 tBT_UUID *p_descr_uuid_cond,
356                                                 tBTA_GATTC_CHAR_DESCR_ID *p_descr_result)
357 {
358     tBTA_GATT_STATUS    status;
359 
360     if (!p_char_id || !p_descr_result)
361         return BTA_GATT_ILLEGAL_PARAMETER;
362 
363     memset(p_descr_result, 0, sizeof(tBTA_GATTC_CHAR_DESCR_ID));
364 
365     if ((status = bta_gattc_query_cache(conn_id,
366                                         BTA_GATTC_ATTR_TYPE_CHAR_DESCR,
367                                         &p_char_id->srvc_id,
368                                         &p_char_id->char_id,
369                                         p_descr_uuid_cond,
370                                         &p_descr_result->char_id.char_id,
371                                         NULL))
372         == BTA_GATT_OK)
373     {
374         memcpy(&p_descr_result->descr_type, &p_descr_result->char_id.char_id.uuid, sizeof(tBT_UUID));
375         memcpy(&p_descr_result->char_id, p_char_id, sizeof(tBTA_GATTC_CHAR_ID));
376     }
377 
378     return status;
379 
380 }
381 /*******************************************************************************
382 **
383 ** Function         BTA_GATTC_GetNextCharDescr
384 **
385 ** Description      This function is called to find the next characteristic descriptor
386 **                  of the characterisctic.
387 **
388 ** Parameters       conn_id: connection ID which identify the server.
389 **                  p_start_descr_id: start the characteristic search from the next record
390 **                           after the one identified by p_start_descr_id.
391 **                  p_descr_uuid_cond: Characteristic descriptor UUID, if NULL find
392 **                               the first available characteristic descriptor.
393 **                  p_descr_result: output parameter which will store the GATT
394 **                                  characteristic descriptor ID.
395 **
396 ** Returns          returns status.
397 **
398 *******************************************************************************/
BTA_GATTC_GetNextCharDescr(UINT16 conn_id,tBTA_GATTC_CHAR_DESCR_ID * p_start_descr_id,tBT_UUID * p_descr_uuid_cond,tBTA_GATTC_CHAR_DESCR_ID * p_descr_result)399 tBTA_GATT_STATUS  BTA_GATTC_GetNextCharDescr (UINT16 conn_id,
400                                              tBTA_GATTC_CHAR_DESCR_ID *p_start_descr_id,
401                                              tBT_UUID           *p_descr_uuid_cond,
402                                              tBTA_GATTC_CHAR_DESCR_ID *p_descr_result)
403 {
404     tBTA_GATT_STATUS    status;
405 
406     if (!p_start_descr_id || !p_descr_result)
407         return BTA_GATT_ILLEGAL_PARAMETER;
408 
409     memset(p_descr_result, 0, sizeof(tBTA_GATTC_CHAR_DESCR_ID));
410 
411     if ((status = bta_gattc_query_cache(conn_id, BTA_GATTC_ATTR_TYPE_CHAR_DESCR,
412                                         &p_start_descr_id->char_id.srvc_id,
413                                         &p_start_descr_id->char_id.char_id,
414                                         p_descr_uuid_cond,
415                                         &p_descr_result->char_id.char_id,
416                                         (void *)&p_start_descr_id->descr_type))
417         == BTA_GATT_OK)
418     {
419         memcpy(&p_descr_result->descr_type, &p_descr_result->char_id.char_id.uuid, sizeof(tBT_UUID));
420         memcpy(&p_descr_result->char_id, p_start_descr_id, sizeof(tBTA_GATTC_CHAR_ID));
421     }
422 
423     return status;
424 }
425 
426 
427 /*******************************************************************************
428 **
429 ** Function         BTA_GATTC_GetFirstIncludedService
430 **
431 ** Description      This function is called to find the first included service of the
432 **                  service on the given server.
433 **
434 ** Parameters       conn_id: connection ID which identify the server.
435 **                  p_srvc_id: the service ID of which the characteristic is belonged to.
436 **                  p_uuid_cond: Characteristic UUID, if NULL find the first available
437 **                               characteristic.
438 **                  p_result: output parameter which will store the GATT ID
439 **                              of the included service found.
440 **
441 ** Returns          returns status.
442 **
443 *******************************************************************************/
BTA_GATTC_GetFirstIncludedService(UINT16 conn_id,tBTA_GATT_SRVC_ID * p_srvc_id,tBT_UUID * p_uuid_cond,tBTA_GATTC_INCL_SVC_ID * p_result)444 tBTA_GATT_STATUS  BTA_GATTC_GetFirstIncludedService(UINT16 conn_id, tBTA_GATT_SRVC_ID *p_srvc_id,
445                                                     tBT_UUID *p_uuid_cond, tBTA_GATTC_INCL_SVC_ID *p_result)
446 {
447     tBTA_GATT_STATUS    status;
448 
449     if (!p_srvc_id || !p_result)
450         return BTA_GATT_ILLEGAL_PARAMETER;
451 
452     if ((status = bta_gattc_query_cache(conn_id,
453                                         BTA_GATTC_ATTR_TYPE_INCL_SRVC,
454                                         p_srvc_id,
455                                         NULL,
456                                         p_uuid_cond,
457                                         &p_result->incl_svc_id.id,
458                                         (tBTA_GATT_CHAR_PROP *)&p_result->incl_svc_id.is_primary))
459         == BTA_GATT_OK)
460     {
461         memcpy(&p_result->srvc_id, p_srvc_id, sizeof(tBTA_GATT_SRVC_ID));
462     }
463 
464     return status;
465 }
466 /*******************************************************************************
467 **
468 ** Function         BTA_GATTC_GetNextIncludedService
469 **
470 ** Description      This function is called to find the next included service of the
471 **                  service on the given server.
472 **
473 ** Parameters       conn_id: connection ID which identify the server.
474 **                  p_start_id: start the search from the next record
475 **                                  after the one identified by p_start_id.
476 **                  p_uuid_cond: Included service UUID, if NULL find the first available
477 **                               included service.
478 **                  p_result: output parameter which will store the GATT ID
479 **                              of the included service found.
480 **
481 ** Returns          returns status.
482 **
483 *******************************************************************************/
BTA_GATTC_GetNextIncludedService(UINT16 conn_id,tBTA_GATTC_INCL_SVC_ID * p_start_id,tBT_UUID * p_uuid_cond,tBTA_GATTC_INCL_SVC_ID * p_result)484 tBTA_GATT_STATUS  BTA_GATTC_GetNextIncludedService(UINT16 conn_id,
485                                                    tBTA_GATTC_INCL_SVC_ID *p_start_id,
486                                                    tBT_UUID               *p_uuid_cond,
487                                                    tBTA_GATTC_INCL_SVC_ID *p_result)
488 {
489     tBTA_GATT_STATUS    status;
490 
491     if (!p_start_id || !p_result)
492         return BTA_GATT_ILLEGAL_PARAMETER;
493 
494     if ((status = bta_gattc_query_cache(conn_id,
495                                         BTA_GATTC_ATTR_TYPE_INCL_SRVC,
496                                         &p_start_id->srvc_id,
497                                         &p_start_id->incl_svc_id.id,
498                                         p_uuid_cond,
499                                         &p_result->incl_svc_id.id,
500                                         (tBTA_GATT_CHAR_PROP *)&p_result->incl_svc_id.is_primary))
501         == BTA_GATT_OK)
502     {
503         memcpy(&p_result->srvc_id, &p_start_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID));
504     }
505 
506     return status;
507 }
508 
509 /*******************************************************************************
510 **
511 ** Function         BTA_GATTC_ReadCharacteristic
512 **
513 ** Description      This function is called to read a service's characteristics of
514 **                    the given characteritisc ID.
515 **
516 ** Parameters       conn_id - connectino ID.
517 **                    p_char_id - characteritic ID to read.
518 **
519 ** Returns          None
520 **
521 *******************************************************************************/
BTA_GATTC_ReadCharacteristic(UINT16 conn_id,tBTA_GATTC_CHAR_ID * p_char_id,tBTA_GATT_AUTH_REQ auth_req)522 void BTA_GATTC_ReadCharacteristic(UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id,
523                                   tBTA_GATT_AUTH_REQ auth_req)
524 {
525     tBTA_GATTC_API_READ  *p_buf;
526 
527     if ((p_buf = (tBTA_GATTC_API_READ *) GKI_getbuf(sizeof(tBTA_GATTC_API_READ))) != NULL)
528     {
529         memset(p_buf, 0, sizeof(tBTA_GATTC_API_READ));
530 
531         p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
532         p_buf->hdr.layer_specific = conn_id;
533         p_buf->auth_req = auth_req;
534 
535         memcpy(&p_buf->srvc_id, &p_char_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID));
536         memcpy(&p_buf->char_id, &p_char_id->char_id, sizeof(tBTA_GATT_ID));
537 
538         bta_sys_sendmsg(p_buf);
539     }
540     return;
541 }
542 
543 /*******************************************************************************
544 **
545 ** Function         BTA_GATTC_ReadCharDescr
546 **
547 ** Description      This function is called to read a characteristics descriptor.
548 **
549 ** Parameters       conn_id - connection ID.
550 **                    p_char_descr_id - characteritic descriptor ID to read.
551 **
552 ** Returns          None
553 **
554 *******************************************************************************/
BTA_GATTC_ReadCharDescr(UINT16 conn_id,tBTA_GATTC_CHAR_DESCR_ID * p_descr_id,tBTA_GATT_AUTH_REQ auth_req)555 void BTA_GATTC_ReadCharDescr (UINT16 conn_id,
556                               tBTA_GATTC_CHAR_DESCR_ID  *p_descr_id,
557                               tBTA_GATT_AUTH_REQ auth_req)
558 {
559     tBTA_GATTC_API_READ  *p_buf;
560 
561     if ((p_buf = (tBTA_GATTC_API_READ *) GKI_getbuf(sizeof(tBTA_GATTC_API_READ))) != NULL)
562     {
563         memset(p_buf, 0, sizeof(tBTA_GATTC_API_READ));
564 
565         p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
566         p_buf->hdr.layer_specific = conn_id;
567         p_buf->auth_req = auth_req;
568 
569         memcpy(&p_buf->srvc_id, &p_descr_id->char_id.srvc_id, sizeof(tBTA_GATT_SRVC_ID));
570         memcpy(&p_buf->char_id, &p_descr_id->char_id.char_id, sizeof(tBTA_GATT_ID));
571         memcpy(&p_buf->descr_type, &p_descr_id->descr_type, sizeof(tBT_UUID));
572 
573         bta_sys_sendmsg(p_buf);
574     }
575     return;
576 
577 }
578 /*******************************************************************************
579 **
580 ** Function         BTA_GATTC_ReadMultiple
581 **
582 ** Description      This function is called to read multiple characteristic or
583 **                  characteristic descriptors.
584 **
585 ** Parameters       conn_id - connectino ID.
586 **                    p_read_multi - pointer to the read multiple parameter.
587 **
588 ** Returns          None
589 **
590 *******************************************************************************/
BTA_GATTC_ReadMultiple(UINT16 conn_id,tBTA_GATTC_MULTI * p_read_multi,tBTA_GATT_AUTH_REQ auth_req)591 void BTA_GATTC_ReadMultiple(UINT16 conn_id, tBTA_GATTC_MULTI *p_read_multi,
592                             tBTA_GATT_AUTH_REQ auth_req)
593 {
594     tBTA_GATTC_API_READ_MULTI  *p_buf;
595     tBTA_GATTC_ATTR_ID          *p_value;
596     UINT16      len = (UINT16)(sizeof(tBTA_GATTC_API_READ_MULTI) +
597                                p_read_multi->num_attr * sizeof(tBTA_GATTC_ATTR_ID));
598     UINT8       i;
599 
600     if ((p_buf = (tBTA_GATTC_API_READ_MULTI *) GKI_getbuf(len)) != NULL)
601     {
602         memset(p_buf, 0, len);
603 
604         p_buf->hdr.event = BTA_GATTC_API_READ_MULTI_EVT;
605         p_buf->hdr.layer_specific = conn_id;
606         p_buf->auth_req = auth_req;
607 
608         p_buf->num_attr = p_read_multi->num_attr;
609 
610         if (p_buf->num_attr > 0)
611         {
612             p_buf->p_id_list = p_value = (tBTA_GATTC_ATTR_ID *)(p_buf + 1);
613 
614             for (i = 0; i < p_buf->num_attr; i ++, p_value ++)
615             {
616                 memcpy(p_value, &p_read_multi->id_list[i], sizeof(tBTA_GATTC_ATTR_ID));
617             }
618         }
619         bta_sys_sendmsg(p_buf);
620     }
621     return;
622 }
623 
624 
625 /*******************************************************************************
626 **
627 ** Function         BTA_GATTC_WriteCharValue
628 **
629 ** Description      This function is called to write characteristic value.
630 **
631 ** Parameters       conn_id - connection ID.
632 **                    p_char_id - characteristic ID to write.
633 **                    write_type - type of write.
634 **                  len: length of the data to be written.
635 **                  p_value - the value to be written.
636 **
637 ** Returns          None
638 **
639 *******************************************************************************/
BTA_GATTC_WriteCharValue(UINT16 conn_id,tBTA_GATTC_CHAR_ID * p_char_id,tBTA_GATTC_WRITE_TYPE write_type,UINT16 len,UINT8 * p_value,tBTA_GATT_AUTH_REQ auth_req)640 void BTA_GATTC_WriteCharValue ( UINT16 conn_id,
641                                 tBTA_GATTC_CHAR_ID *p_char_id,
642                                 tBTA_GATTC_WRITE_TYPE  write_type,
643                                 UINT16 len,
644                                 UINT8 *p_value,
645                                 tBTA_GATT_AUTH_REQ auth_req)
646 {
647     tBTA_GATTC_API_WRITE  *p_buf;
648 
649     if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_WRITE) + len))) != NULL)
650     {
651         memset(p_buf, 0, sizeof(tBTA_GATTC_API_WRITE) + len);
652 
653         p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
654         p_buf->hdr.layer_specific = conn_id;
655         p_buf->auth_req = auth_req;
656 
657         memcpy(&p_buf->srvc_id, &p_char_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID));
658         memcpy(&p_buf->char_id, &p_char_id->char_id, sizeof(tBTA_GATT_ID));
659 
660         p_buf->write_type = write_type;
661         p_buf->len = len;
662 
663         if (p_value && len > 0)
664         {
665             p_buf->p_value = (UINT8 *)(p_buf + 1);
666             memcpy(p_buf->p_value, p_value, len);
667         }
668 
669         bta_sys_sendmsg(p_buf);
670     }
671     return;
672 }
673 /*******************************************************************************
674 **
675 ** Function         BTA_GATTC_WriteCharDescr
676 **
677 ** Description      This function is called to write characteristic descriptor value.
678 **
679 ** Parameters       conn_id - connection ID
680 **                    p_char_descr_id - characteristic descriptor ID to write.
681 **                  write_type - write type.
682 **                  p_value - the value to be written.
683 **
684 ** Returns          None
685 **
686 *******************************************************************************/
BTA_GATTC_WriteCharDescr(UINT16 conn_id,tBTA_GATTC_CHAR_DESCR_ID * p_char_descr_id,tBTA_GATTC_WRITE_TYPE write_type,tBTA_GATT_UNFMT * p_data,tBTA_GATT_AUTH_REQ auth_req)687 void BTA_GATTC_WriteCharDescr (UINT16 conn_id,
688                                tBTA_GATTC_CHAR_DESCR_ID *p_char_descr_id,
689                                tBTA_GATTC_WRITE_TYPE  write_type,
690                                tBTA_GATT_UNFMT      *p_data,
691                                tBTA_GATT_AUTH_REQ auth_req)
692 {
693     tBTA_GATTC_API_WRITE  *p_buf;
694     UINT16  len = sizeof(tBTA_GATTC_API_WRITE);
695 
696     if (p_data != NULL)
697         len += p_data->len;
698 
699     if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf(len)) != NULL)
700     {
701         memset(p_buf, 0, len);
702 
703         p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
704         p_buf->hdr.layer_specific = conn_id;
705         p_buf->auth_req = auth_req;
706 
707         memcpy(&p_buf->srvc_id, &p_char_descr_id->char_id.srvc_id, sizeof(tBTA_GATT_SRVC_ID));
708         memcpy(&p_buf->char_id, &p_char_descr_id->char_id.char_id, sizeof(tBTA_GATT_ID));
709         memcpy(&p_buf->descr_type, &p_char_descr_id->descr_type, sizeof(tBT_UUID));
710         p_buf->write_type = write_type;
711 
712         if (p_data && p_data->len != 0)
713         {
714             p_buf->p_value  = (UINT8 *)(p_buf + 1);
715             p_buf->len      = p_data->len;
716             /* pack the descr data */
717             memcpy(p_buf->p_value, p_data->p_value, p_data->len);
718         }
719 
720         bta_sys_sendmsg(p_buf);
721     }
722     return;
723 
724 }
725 /*******************************************************************************
726 **
727 ** Function         BTA_GATTC_PrepareWrite
728 **
729 ** Description      This function is called to prepare write a characteristic value.
730 **
731 ** Parameters       conn_id - connection ID.
732 **                    p_char_id - GATT characteritic ID of the service.
733 **                  offset - offset of the write value.
734 **                  len: length of the data to be written.
735 **                  p_value - the value to be written.
736 **
737 ** Returns          None
738 **
739 *******************************************************************************/
BTA_GATTC_PrepareWrite(UINT16 conn_id,tBTA_GATTC_CHAR_ID * p_char_id,UINT16 offset,UINT16 len,UINT8 * p_value,tBTA_GATT_AUTH_REQ auth_req)740 void BTA_GATTC_PrepareWrite  (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id,
741                               UINT16 offset, UINT16 len, UINT8 *p_value,
742                               tBTA_GATT_AUTH_REQ auth_req)
743 {
744     tBTA_GATTC_API_WRITE  *p_buf;
745 
746     if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_WRITE) + len))) != NULL)
747     {
748         memset(p_buf, 0, sizeof(tBTA_GATTC_API_WRITE) + len);
749 
750         p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
751         p_buf->hdr.layer_specific = conn_id;
752         p_buf->auth_req = auth_req;
753 
754         memcpy(&p_buf->srvc_id, &p_char_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID));
755         memcpy(&p_buf->char_id, &p_char_id->char_id, sizeof(tBTA_GATT_ID));
756 
757         p_buf->write_type = BTA_GATTC_WRITE_PREPARE;
758         p_buf->offset   = offset;
759         p_buf->len = len;
760 
761         if (p_value && len > 0)
762         {
763             p_buf->p_value = (UINT8 *)(p_buf + 1);
764             memcpy(p_buf->p_value, p_value, len);
765         }
766 
767         bta_sys_sendmsg(p_buf);
768     }
769     return;
770 
771 }
772 /*******************************************************************************
773 **
774 ** Function         BTA_GATTC_ExecuteWrite
775 **
776 ** Description      This function is called to execute write a prepare write sequence.
777 **
778 ** Parameters       conn_id - connection ID.
779 **                    is_execute - execute or cancel.
780 **
781 ** Returns          None
782 **
783 *******************************************************************************/
BTA_GATTC_ExecuteWrite(UINT16 conn_id,BOOLEAN is_execute)784 void BTA_GATTC_ExecuteWrite  (UINT16 conn_id, BOOLEAN is_execute)
785 {
786     tBTA_GATTC_API_EXEC  *p_buf;
787 
788     if ((p_buf = (tBTA_GATTC_API_EXEC *) GKI_getbuf((UINT16)sizeof(tBTA_GATTC_API_EXEC))) != NULL)
789     {
790         memset(p_buf, 0, sizeof(tBTA_GATTC_API_EXEC));
791 
792         p_buf->hdr.event = BTA_GATTC_API_EXEC_EVT;
793         p_buf->hdr.layer_specific = conn_id;
794 
795         p_buf->is_execute = is_execute;
796 
797         bta_sys_sendmsg(p_buf);
798     }
799     return;
800 
801 }
802 /*******************************************************************************
803 **
804 ** Function         BTA_GATTC_SendIndConfirm
805 **
806 ** Description      This function is called to send handle value confirmation.
807 **
808 ** Parameters       conn_id - connection ID.
809 **                    p_char_id - characteristic ID to confirm.
810 **
811 ** Returns          None
812 **
813 *******************************************************************************/
BTA_GATTC_SendIndConfirm(UINT16 conn_id,tBTA_GATTC_CHAR_ID * p_char_id)814 void BTA_GATTC_SendIndConfirm (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id)
815 {
816     tBTA_GATTC_API_CONFIRM  *p_buf;
817 
818     APPL_TRACE_API3("BTA_GATTC_SendIndConfirm conn_id=%d service uuid1=0x%x char uuid=0x%x",
819                     conn_id, p_char_id->srvc_id.id.uuid.uu.uuid16, p_char_id->char_id.uuid.uu.uuid16);
820 
821     if ((p_buf = (tBTA_GATTC_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_GATTC_API_CONFIRM))) != NULL)
822     {
823         memset(p_buf, 0, sizeof(tBTA_GATTC_API_CONFIRM));
824 
825         p_buf->hdr.event = BTA_GATTC_API_CONFIRM_EVT;
826         p_buf->hdr.layer_specific = conn_id;
827 
828         memcpy(&p_buf->srvc_id, &p_char_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID));
829         memcpy(&p_buf->char_id, &p_char_id->char_id, sizeof(tBTA_GATT_ID));
830 
831         bta_sys_sendmsg(p_buf);
832     }
833     return;
834 
835 }
836 
837 /*******************************************************************************
838 **
839 ** Function         BTA_GATTC_RegisterForNotifications
840 **
841 ** Description      This function is called to register for notification of a service.
842 **
843 ** Parameters       client_if - client interface.
844 **                  bda - target GATT server.
845 **                  p_char_id - pointer to GATT characteristic ID.
846 **
847 ** Returns          OK if registration succeed, otherwise failed.
848 **
849 *******************************************************************************/
BTA_GATTC_RegisterForNotifications(tBTA_GATTC_IF client_if,BD_ADDR bda,tBTA_GATTC_CHAR_ID * p_char_id)850 tBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications (tBTA_GATTC_IF client_if,
851                                                      BD_ADDR bda,
852                                                      tBTA_GATTC_CHAR_ID *p_char_id)
853 {
854     tBTA_GATTC_RCB      *p_clreg;
855     tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
856     UINT8               i;
857 
858     if (!p_char_id)
859     {
860         APPL_TRACE_ERROR0("deregistration failed, unknow char id");
861         return status;
862     }
863 
864     /* lock other GKI task */
865     GKI_sched_lock();
866 
867     if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
868     {
869         for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
870         {
871             if ( p_clreg->notif_reg[i].in_use &&
872                  !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
873                   bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id))
874             {
875                 APPL_TRACE_WARNING0("notification already registered");
876                 status = BTA_GATT_OK;
877                 break;
878             }
879         }
880         if (status != BTA_GATT_OK)
881         {
882             for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
883             {
884                 if (!p_clreg->notif_reg[i].in_use)
885                 {
886                     memset((void *)&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
887 
888                     p_clreg->notif_reg[i].in_use = TRUE;
889                     memcpy(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN);
890 
891                     p_clreg->notif_reg[i].char_id.srvc_id.is_primary = p_char_id->srvc_id.is_primary;
892                     bta_gattc_cpygattid(&p_clreg->notif_reg[i].char_id.srvc_id.id, &p_char_id->srvc_id.id);
893                     bta_gattc_cpygattid(&p_clreg->notif_reg[i].char_id.char_id, &p_char_id->char_id);
894 
895                     status = BTA_GATT_OK;
896                     break;
897                 }
898             }
899             if (i == BTA_GATTC_NOTIF_REG_MAX)
900             {
901                 status = BTA_GATT_NO_RESOURCES;
902                 APPL_TRACE_ERROR0("Max Notification Reached, registration failed.");
903             }
904         }
905     }
906     else
907     {
908         APPL_TRACE_ERROR1("Client_if: %d Not Registered", client_if);
909     }
910 
911     GKI_sched_unlock();
912 
913     return status;
914 }
915 
916 /*******************************************************************************
917 **
918 ** Function         BTA_GATTC_DeregisterForNotifications
919 **
920 ** Description      This function is called to de-register for notification of a service.
921 **
922 ** Parameters       client_if - client interface.
923 **                  bda - target GATT server.
924 **                  p_char_id - pointer to GATT characteristic ID.
925 **
926 ** Returns          OK if deregistration succeed, otherwise failed.
927 **
928 *******************************************************************************/
BTA_GATTC_DeregisterForNotifications(tBTA_GATTC_IF client_if,BD_ADDR bda,tBTA_GATTC_CHAR_ID * p_char_id)929 tBTA_GATT_STATUS BTA_GATTC_DeregisterForNotifications (tBTA_GATTC_IF client_if,
930                                                        BD_ADDR bda,
931                                                        tBTA_GATTC_CHAR_ID *p_char_id)
932 {
933     tBTA_GATTC_RCB      *p_clreg;
934     tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
935     UINT8               i;
936 
937     if (!p_char_id)
938     {
939         APPL_TRACE_ERROR0("deregistration failed, unknow char id");
940         return status;
941     }
942 
943     /* lock other GKI task */
944     GKI_sched_lock();
945 
946     if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
947     {
948         for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
949         {
950             if (p_clreg->notif_reg[i].in_use &&
951                 !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
952                 bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id))
953             {
954                 APPL_TRACE_DEBUG0("Deregistered.");
955                 memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
956                 status = BTA_GATT_OK;
957                 break;
958             }
959         }
960         if (i == BTA_GATTC_NOTIF_REG_MAX)
961         {
962             status = BTA_GATT_ERROR;
963 
964             APPL_TRACE_ERROR0("registration not found");
965         }
966     }
967     else
968     {
969         APPL_TRACE_ERROR1("Client_if: %d Not Registered", client_if);
970     }
971 
972     GKI_sched_unlock();
973 
974     return status;
975 }
976 
977 /*******************************************************************************
978 **
979 ** Function         BTA_GATTC_Refresh
980 **
981 ** Description      Refresh the server cache of the remote device
982 **
983 ** Parameters       remote_bda: remote device BD address.
984 **
985 ** Returns          void
986 **
987 *******************************************************************************/
BTA_GATTC_Refresh(BD_ADDR remote_bda)988 void BTA_GATTC_Refresh(BD_ADDR remote_bda)
989 {
990     tBTA_GATTC_API_OPEN  *p_buf;
991 
992     if ((p_buf = (tBTA_GATTC_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_OPEN))) != NULL)
993     {
994         p_buf->hdr.event = BTA_GATTC_API_REFRESH_EVT;
995 
996         memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
997 
998 
999         bta_sys_sendmsg(p_buf);
1000     }
1001     return;
1002 }
1003 #endif /* BTA_GATT_INCLUDED */
1004 
1005