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