Home | History | Annotate | Download | only in src
      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 <stdio.h>
     30 #include <stdlib.h>
     31 #include <errno.h>
     32 #include <string.h>
     33 
     34 #define LOG_TAG "BtGatt.btif"
     35 
     36 #include "btif_common.h"
     37 #include "btif_util.h"
     38 
     39 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
     40 
     41 #include "gki.h"
     42 #include <hardware/bt_gatt.h>
     43 #include "bta_api.h"
     44 #include "bta_gatt_api.h"
     45 #include "bd.h"
     46 #include "btif_storage.h"
     47 #include "btif_config.h"
     48 
     49 #include "btif_gatt.h"
     50 #include "btif_gatt_util.h"
     51 #include "btif_dm.h"
     52 #include "btif_storage.h"
     53 
     54 /*******************************************************************************
     55 **  Constants & Macros
     56 ********************************************************************************/
     57 
     58 #define ADV_FLAGS 0x02
     59 
     60 #define CHECK_BTGATT_INIT() if (bt_gatt_callbacks == NULL)\
     61     {\
     62         ALOGW("%s: BTGATT not initialized", __FUNCTION__);\
     63         return BT_STATUS_NOT_READY;\
     64     } else {\
     65         ALOGD("%s", __FUNCTION__);\
     66     }
     67 
     68 
     69 typedef enum {
     70     BTIF_GATTC_REGISTER_APP = 1000,
     71     BTIF_GATTC_UNREGISTER_APP,
     72     BTIF_GATTC_SCAN_START,
     73     BTIF_GATTC_SCAN_STOP,
     74     BTIF_GATTC_OPEN,
     75     BTIF_GATTC_CLOSE,
     76     BTIF_GATTC_SEARCH_SERVICE,
     77     BTIF_GATTC_GET_FIRST_CHAR,
     78     BTIF_GATTC_GET_NEXT_CHAR,
     79     BTIF_GATTC_GET_FIRST_CHAR_DESCR,
     80     BTIF_GATTC_GET_NEXT_CHAR_DESCR,
     81     BTIF_GATTC_GET_FIRST_INCL_SERVICE,
     82     BTIF_GATTC_GET_NEXT_INCL_SERVICE,
     83     BTIF_GATTC_READ_CHAR,
     84     BTIF_GATTC_READ_CHAR_DESCR,
     85     BTIF_GATTC_WRITE_CHAR,
     86     BTIF_GATTC_WRITE_CHAR_DESCR,
     87     BTIF_GATTC_EXECUTE_WRITE,
     88     BTIF_GATTC_REG_FOR_NOTIFICATION,
     89     BTIF_GATTC_DEREG_FOR_NOTIFICATION,
     90     BTIF_GATTC_REFRESH,
     91     BTIF_GATTC_READ_RSSI,
     92     BTIF_GATTC_LISTEN,
     93     BTIF_GATTC_SET_ADV_DATA
     94 } btif_gattc_event_t;
     95 
     96 #define BTIF_GATT_MAX_OBSERVED_DEV 40
     97 
     98 #define BTIF_GATT_OBSERVE_EVT   0x1000
     99 #define BTIF_GATTC_RSSI_EVT     0x1001
    100 
    101 /*******************************************************************************
    102 **  Local type definitions
    103 ********************************************************************************/
    104 
    105 typedef struct
    106 {
    107     tBTA_BLE_AD_MASK mask;
    108     tBTA_BLE_ADV_DATA data;
    109 } btgatt_adv_data;
    110 
    111 typedef struct
    112 {
    113     uint8_t     value[BTGATT_MAX_ATTR_LEN];
    114     btgatt_adv_data adv_data;
    115     bt_bdaddr_t bd_addr;
    116     btgatt_srvc_id_t srvc_id;
    117     btgatt_srvc_id_t incl_srvc_id;
    118     btgatt_gatt_id_t char_id;
    119     btgatt_gatt_id_t descr_id;
    120     bt_uuid_t   uuid;
    121     uint16_t    conn_id;
    122     uint16_t    len;
    123     uint8_t     client_if;
    124     uint8_t     action;
    125     uint8_t     is_direct;
    126     uint8_t     search_all;
    127     uint8_t     auth_req;
    128     uint8_t     write_type;
    129     uint8_t     status;
    130     uint8_t     addr_type;
    131     uint8_t     start;
    132     int8_t      rssi;
    133     tBT_DEVICE_TYPE device_type;
    134 } __attribute__((packed)) btif_gattc_cb_t;
    135 
    136 typedef struct
    137 {
    138     bt_bdaddr_t bd_addr;
    139     BOOLEAN     in_use;
    140 }__attribute__((packed)) btif_gattc_dev_t;
    141 
    142 typedef struct
    143 {
    144     btif_gattc_dev_t remote_dev[BTIF_GATT_MAX_OBSERVED_DEV];
    145     uint8_t        addr_type;
    146     uint8_t        next_storage_idx;
    147 }__attribute__((packed)) btif_gattc_dev_cb_t;
    148 
    149 /*******************************************************************************
    150 **  Static variables
    151 ********************************************************************************/
    152 
    153 extern const btgatt_callbacks_t *bt_gatt_callbacks;
    154 static btif_gattc_dev_cb_t  btif_gattc_dev_cb;
    155 static btif_gattc_dev_cb_t  *p_dev_cb = &btif_gattc_dev_cb;
    156 static uint8_t rssi_request_client_if;
    157 
    158 /*******************************************************************************
    159 **  Static functions
    160 ********************************************************************************/
    161 
    162 static void btapp_gattc_req_data(UINT16 event, char *p_dest, char *p_src)
    163 {
    164     tBTA_GATTC *p_dest_data = (tBTA_GATTC*)p_dest;
    165     tBTA_GATTC *p_src_data = (tBTA_GATTC*)p_src;
    166 
    167     if (!p_src_data || !p_dest_data)
    168        return;
    169 
    170     // Copy basic structure first
    171     memcpy(p_dest_data, p_src_data, sizeof(tBTA_GATTC));
    172 
    173     // Allocate buffer for request data if necessary
    174     switch (event)
    175     {
    176         case BTA_GATTC_READ_CHAR_EVT:
    177         case BTA_GATTC_READ_DESCR_EVT:
    178 
    179             if (p_src_data->read.p_value != NULL)
    180             {
    181                 p_dest_data->read.p_value = GKI_getbuf(sizeof(tBTA_GATT_READ_VAL));
    182 
    183                 if (p_dest_data->read.p_value != NULL)
    184                 {
    185                     memcpy(p_dest_data->read.p_value, p_src_data->read.p_value,
    186                         sizeof(tBTA_GATT_READ_VAL));
    187 
    188                     // Allocate buffer for att value if necessary
    189                     if (get_uuid16(&p_src_data->read.descr_type.uuid) != GATT_UUID_CHAR_AGG_FORMAT
    190                       && p_src_data->read.p_value->unformat.len > 0
    191                       && p_src_data->read.p_value->unformat.p_value != NULL)
    192                     {
    193                         p_dest_data->read.p_value->unformat.p_value =
    194                                        GKI_getbuf(p_src_data->read.p_value->unformat.len);
    195                         if (p_dest_data->read.p_value->unformat.p_value != NULL)
    196                         {
    197                             memcpy(p_dest_data->read.p_value->unformat.p_value,
    198                                    p_src_data->read.p_value->unformat.p_value,
    199                                    p_src_data->read.p_value->unformat.len);
    200                         }
    201                     }
    202                 }
    203             }
    204             else
    205             {
    206                 BTIF_TRACE_WARNING2("%s :Src read.p_value ptr is NULL for event  0x%x",
    207                                     __FUNCTION__, event);
    208                 p_dest_data->read.p_value = NULL;
    209 
    210             }
    211             break;
    212 
    213         default:
    214             break;
    215     }
    216 }
    217 
    218 static void btapp_gattc_free_req_data(UINT16 event, tBTA_GATTC *p_data)
    219 {
    220     switch (event)
    221     {
    222         case BTA_GATTC_READ_CHAR_EVT:
    223         case BTA_GATTC_READ_DESCR_EVT:
    224             if (p_data != NULL && p_data->read.p_value != NULL)
    225             {
    226                 if (get_uuid16 (&p_data->read.descr_type.uuid) != GATT_UUID_CHAR_AGG_FORMAT
    227                   && p_data->read.p_value->unformat.len > 0
    228                   && p_data->read.p_value->unformat.p_value != NULL)
    229                 {
    230                     GKI_freebuf(p_data->read.p_value->unformat.p_value);
    231                 }
    232                 GKI_freebuf(p_data->read.p_value);
    233             }
    234             break;
    235 
    236         default:
    237             break;
    238     }
    239 }
    240 
    241 static void btif_gattc_init_dev_cb(void)
    242 {
    243     memset(p_dev_cb, 0, sizeof(btif_gattc_dev_cb_t));
    244 }
    245 
    246 static void btif_gattc_add_remote_bdaddr (BD_ADDR p_bda, uint8_t addr_type)
    247 {
    248     BOOLEAN found=FALSE;
    249     uint8_t i;
    250     for (i = 0; i < BTIF_GATT_MAX_OBSERVED_DEV; i++)
    251     {
    252         if (!p_dev_cb->remote_dev[i].in_use )
    253         {
    254             memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
    255             p_dev_cb->addr_type = addr_type;
    256             p_dev_cb->remote_dev[i].in_use = TRUE;
    257             ALOGD("%s device added idx=%d", __FUNCTION__, i  );
    258             break;
    259         }
    260     }
    261 
    262     if ( i == BTIF_GATT_MAX_OBSERVED_DEV)
    263     {
    264         i= p_dev_cb->next_storage_idx;
    265         memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
    266         p_dev_cb->addr_type = addr_type;
    267         p_dev_cb->remote_dev[i].in_use = TRUE;
    268         ALOGD("%s device overwrite idx=%d", __FUNCTION__, i  );
    269         p_dev_cb->next_storage_idx++;
    270         if(p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
    271                p_dev_cb->next_storage_idx = 0;
    272     }
    273 }
    274 
    275 static BOOLEAN btif_gattc_find_bdaddr (BD_ADDR p_bda)
    276 {
    277     uint8_t i;
    278     for (i = 0; i < BTIF_GATT_MAX_OBSERVED_DEV; i++)
    279     {
    280         if (p_dev_cb->remote_dev[i].in_use &&
    281             !memcmp(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN))
    282         {
    283             return TRUE;
    284         }
    285     }
    286     return FALSE;
    287 }
    288 
    289 static void btif_gattc_update_properties ( btif_gattc_cb_t *p_btif_cb )
    290 {
    291     uint8_t remote_name_len;
    292     uint8_t *p_eir_remote_name=NULL;
    293     bt_bdname_t bdname;
    294 
    295     p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
    296                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
    297 
    298     if(p_eir_remote_name == NULL)
    299     {
    300         p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
    301                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
    302     }
    303 
    304     if(p_eir_remote_name)
    305     {
    306          memcpy(bdname.name, p_eir_remote_name, remote_name_len);
    307          bdname.name[remote_name_len]='\0';
    308 
    309         ALOGD("%s BLE device name=%s len=%d dev_type=%d", __FUNCTION__, bdname.name,
    310               remote_name_len, p_btif_cb->device_type  );
    311         btif_dm_update_ble_remote_properties( p_btif_cb->bd_addr.address,   bdname.name,
    312                                                p_btif_cb->device_type);
    313     }
    314 
    315     btif_storage_set_remote_addr_type( &p_btif_cb->bd_addr, p_btif_cb->addr_type);
    316 }
    317 
    318 static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
    319 {
    320     ALOGD("%s: Event %d", __FUNCTION__, event);
    321 
    322     tBTA_GATTC *p_data = (tBTA_GATTC*)p_param;
    323     switch (event)
    324     {
    325         case BTA_GATTC_REG_EVT:
    326         {
    327             bt_uuid_t app_uuid;
    328             bta_to_btif_uuid(&app_uuid, &p_data->reg_oper.app_uuid);
    329             HAL_CBACK(bt_gatt_callbacks, client->register_client_cb
    330                 , p_data->reg_oper.status
    331                 , p_data->reg_oper.client_if
    332                 , &app_uuid
    333             );
    334             break;
    335         }
    336 
    337         case BTA_GATTC_DEREG_EVT:
    338             break;
    339 
    340         case BTA_GATTC_READ_CHAR_EVT:
    341         {
    342             btgatt_read_params_t data;
    343             set_read_value(&data, &p_data->read);
    344 
    345             HAL_CBACK(bt_gatt_callbacks, client->read_characteristic_cb
    346                 , p_data->read.conn_id, p_data->read.status, &data);
    347             break;
    348         }
    349 
    350         case BTA_GATTC_WRITE_CHAR_EVT:
    351         case BTA_GATTC_PREP_WRITE_EVT:
    352         {
    353             btgatt_write_params_t data;
    354             bta_to_btif_srvc_id(&data.srvc_id, &p_data->write.srvc_id);
    355             bta_to_btif_gatt_id(&data.char_id, &p_data->write.char_id);
    356 
    357             HAL_CBACK(bt_gatt_callbacks, client->write_characteristic_cb
    358                 , p_data->write.conn_id, p_data->write.status, &data
    359             );
    360             break;
    361         }
    362 
    363         case BTA_GATTC_EXEC_EVT:
    364         {
    365             HAL_CBACK(bt_gatt_callbacks, client->execute_write_cb
    366                 , p_data->exec_cmpl.conn_id, p_data->exec_cmpl.status
    367             );
    368             break;
    369         }
    370 
    371         case BTA_GATTC_SEARCH_CMPL_EVT:
    372         {
    373             HAL_CBACK(bt_gatt_callbacks, client->search_complete_cb
    374                 , p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
    375             break;
    376         }
    377 
    378         case BTA_GATTC_SEARCH_RES_EVT:
    379         {
    380             btgatt_srvc_id_t data;
    381             bta_to_btif_srvc_id(&data, &(p_data->srvc_res.service_uuid));
    382             HAL_CBACK(bt_gatt_callbacks, client->search_result_cb
    383                 , p_data->srvc_res.conn_id, &data);
    384             break;
    385         }
    386 
    387         case BTA_GATTC_READ_DESCR_EVT:
    388         {
    389             btgatt_read_params_t data;
    390             set_read_value(&data, &p_data->read);
    391 
    392             HAL_CBACK(bt_gatt_callbacks, client->read_descriptor_cb
    393                 , p_data->read.conn_id, p_data->read.status, &data);
    394             break;
    395         }
    396 
    397         case BTA_GATTC_WRITE_DESCR_EVT:
    398         {
    399             btgatt_write_params_t data;
    400             bta_to_btif_srvc_id(&data.srvc_id, &p_data->write.srvc_id);
    401             bta_to_btif_gatt_id(&data.char_id, &p_data->write.char_id);
    402             bta_to_btif_gatt_id(&data.descr_id, &p_data->write.descr_type);
    403 
    404             HAL_CBACK(bt_gatt_callbacks, client->write_descriptor_cb
    405                 , p_data->write.conn_id, p_data->write.status, &data);
    406             break;
    407         }
    408 
    409         case BTA_GATTC_NOTIF_EVT:
    410         {
    411             btgatt_notify_params_t data;
    412 
    413             bdcpy(data.bda.address, p_data->notify.bda);
    414 
    415             bta_to_btif_srvc_id(&data.srvc_id, &p_data->notify.char_id.srvc_id);
    416             bta_to_btif_gatt_id(&data.char_id, &p_data->notify.char_id.char_id);
    417             memcpy(data.value, p_data->notify.value, p_data->notify.len);
    418 
    419             data.is_notify = p_data->notify.is_notify;
    420             data.len = p_data->notify.len;
    421 
    422             HAL_CBACK(bt_gatt_callbacks, client->notify_cb
    423                 , p_data->notify.conn_id, &data);
    424 
    425             if (p_data->notify.is_notify == FALSE)
    426             {
    427                 BTA_GATTC_SendIndConfirm(p_data->notify.conn_id,
    428                                          &p_data->notify.char_id);
    429             }
    430             break;
    431         }
    432 
    433         case BTA_GATTC_OPEN_EVT:
    434         {
    435             bt_bdaddr_t bda;
    436             bdcpy(bda.address, p_data->open.remote_bda);
    437 
    438             HAL_CBACK(bt_gatt_callbacks, client->open_cb, p_data->open.conn_id
    439                 , p_data->open.status, p_data->open.client_if, &bda);
    440 
    441             if (p_data->open.status == BTA_GATT_OK)
    442                 btif_gatt_check_encrypted_link(p_data->open.remote_bda);
    443             break;
    444         }
    445 
    446         case BTA_GATTC_CLOSE_EVT:
    447         {
    448             bt_bdaddr_t bda;
    449             bdcpy(bda.address, p_data->close.remote_bda);
    450             HAL_CBACK(bt_gatt_callbacks, client->close_cb, p_data->close.conn_id
    451                 , p_data->status, p_data->close.client_if, &bda);
    452             break;
    453         }
    454 
    455         case BTA_GATTC_ACL_EVT:
    456             ALOGD("BTA_GATTC_ACL_EVT: status = %d", p_data->status);
    457             /* Ignore for now */
    458             break;
    459 
    460         case BTA_GATTC_CANCEL_OPEN_EVT:
    461             break;
    462 
    463         case BTIF_GATT_OBSERVE_EVT:
    464         {
    465             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
    466             uint8_t remote_name_len;
    467             uint8_t *p_eir_remote_name=NULL;
    468 
    469             p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
    470                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
    471 
    472             if(p_eir_remote_name == NULL)
    473             {
    474                 p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
    475                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
    476             }
    477 
    478             if ((p_btif_cb->addr_type != BLE_ADDR_RANDOM) || (p_eir_remote_name))
    479             {
    480                if (!btif_gattc_find_bdaddr(p_btif_cb->bd_addr.address))
    481                {
    482                   static const char* exclude_filter[] =
    483                         {"LinkKey", "LE_KEY_PENC", "LE_KEY_PID", "LE_KEY_PCSRK", "LE_KEY_LENC", "LE_KEY_LCSRK"};
    484 
    485                   btif_gattc_add_remote_bdaddr(p_btif_cb->bd_addr.address, p_btif_cb->addr_type);
    486                   btif_gattc_update_properties(p_btif_cb);
    487                   btif_config_filter_remove("Remote", exclude_filter, sizeof(exclude_filter)/sizeof(char*),
    488                   BTIF_STORAGE_MAX_ALLOWED_REMOTE_DEVICE);
    489                }
    490 
    491             }
    492             HAL_CBACK(bt_gatt_callbacks, client->scan_result_cb,
    493                       &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->value);
    494             break;
    495         }
    496 
    497         case BTIF_GATTC_RSSI_EVT:
    498         {
    499             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
    500             HAL_CBACK(bt_gatt_callbacks, client->read_remote_rssi_cb, p_btif_cb->client_if,
    501                       &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->status);
    502             break;
    503         }
    504 
    505         case BTA_GATTC_LISTEN_EVT:
    506         {
    507             HAL_CBACK(bt_gatt_callbacks, client->listen_cb
    508                 , p_data->reg_oper.status
    509                 , p_data->reg_oper.client_if
    510             );
    511             break;
    512         }
    513         default:
    514             ALOGE("%s: Unhandled event (%d)!", __FUNCTION__, event);
    515             break;
    516     }
    517 
    518     btapp_gattc_free_req_data(event, p_data);
    519 }
    520 
    521 static void bta_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
    522 {
    523     bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt,
    524                     (uint16_t) event, (void*)p_data, sizeof(tBTA_GATTC), btapp_gattc_req_data);
    525     ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
    526 }
    527 
    528 static void bta_scan_results_cb (tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
    529 {
    530     btif_gattc_cb_t btif_cb;
    531     uint8_t len;
    532 
    533     switch (event)
    534     {
    535         case BTA_DM_INQ_RES_EVT:
    536         {
    537             bdcpy(btif_cb.bd_addr.address, p_data->inq_res.bd_addr);
    538             btif_cb.device_type = p_data->inq_res.device_type;
    539             btif_cb.rssi = p_data->inq_res.rssi;
    540             btif_cb.addr_type = p_data->inq_res.ble_addr_type;
    541             if (p_data->inq_res.p_eir)
    542             {
    543                 memcpy(btif_cb.value, p_data->inq_res.p_eir, 62);
    544                 if (BTA_CheckEirData(p_data->inq_res.p_eir, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE,
    545                                       &len))
    546                 {
    547                     p_data->inq_res.remt_name_not_required  = TRUE;
    548                 }
    549             }
    550         }
    551         break;
    552 
    553         case BTA_DM_INQ_CMPL_EVT:
    554         {
    555             BTIF_TRACE_DEBUG2("%s  BLE observe complete. Num Resp %d",
    556                               __FUNCTION__,p_data->inq_cmpl.num_resps);
    557             return;
    558         }
    559 
    560         default:
    561         BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
    562         return;
    563     }
    564     btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATT_OBSERVE_EVT,
    565                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    566 }
    567 
    568 static void btm_read_rssi_cb (tBTM_RSSI_RESULTS *p_result)
    569 {
    570     btif_gattc_cb_t btif_cb;
    571 
    572     bdcpy(btif_cb.bd_addr.address, p_result->rem_bda);
    573     btif_cb.rssi = p_result->rssi;
    574     btif_cb.status = p_result->status;
    575     btif_cb.client_if = rssi_request_client_if;
    576     btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATTC_RSSI_EVT,
    577                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    578 }
    579 
    580 
    581 static void btgattc_handle_event(uint16_t event, char* p_param)
    582 {
    583     tBTA_GATT_STATUS           status;
    584     tBT_UUID                   uuid;
    585     tBTA_GATT_SRVC_ID          srvc_id;
    586     tGATT_CHAR_PROP            out_char_prop;
    587     tBTA_GATTC_CHAR_ID         in_char_id;
    588     tBTA_GATTC_CHAR_ID         out_char_id;
    589     tBTA_GATTC_CHAR_DESCR_ID   in_char_descr_id;
    590     tBTA_GATTC_CHAR_DESCR_ID   out_char_descr_id;
    591     tBTA_GATTC_INCL_SVC_ID     in_incl_svc_id;
    592     tBTA_GATTC_INCL_SVC_ID     out_incl_svc_id;
    593     tBTA_GATT_UNFMT            descr_val;
    594 
    595     btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*)p_param;
    596     if (!p_cb) return;
    597 
    598     ALOGD("%s: Event %d", __FUNCTION__, event);
    599 
    600     switch (event)
    601     {
    602         case BTIF_GATTC_REGISTER_APP:
    603             btif_to_bta_uuid(&uuid, &p_cb->uuid);
    604             BTA_GATTC_AppRegister(&uuid, bta_gattc_cback);
    605             break;
    606 
    607         case BTIF_GATTC_UNREGISTER_APP:
    608             BTA_GATTC_AppDeregister(p_cb->client_if);
    609             break;
    610 
    611         case BTIF_GATTC_SCAN_START:
    612             btif_gattc_init_dev_cb();
    613             BTA_DmBleObserve(TRUE, 0, bta_scan_results_cb);
    614             break;
    615 
    616         case BTIF_GATTC_SCAN_STOP:
    617             BTA_DmBleObserve(FALSE, 0, 0);
    618             break;
    619 
    620         case BTIF_GATTC_OPEN:
    621         {
    622             // Ensure device is in inquiry database
    623             int addr_type = 0;
    624             int device_type = 0;
    625 
    626             if (btif_get_device_type(p_cb->bd_addr.address, &addr_type, &device_type) == TRUE
    627                   && device_type != BT_DEVICE_TYPE_BREDR)
    628                 BTA_DmAddBleDevice(p_cb->bd_addr.address, addr_type, device_type);
    629 
    630             // Mark background connections
    631             if (!p_cb->is_direct)
    632                 BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
    633 
    634             // Connect!
    635             BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct);
    636             break;
    637         }
    638 
    639         case BTIF_GATTC_CLOSE:
    640             // Disconnect established connections
    641             if (p_cb->conn_id != 0)
    642                 BTA_GATTC_Close(p_cb->conn_id);
    643             else
    644                 BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, TRUE);
    645 
    646             // Cancel pending background connections (remove from whitelist)
    647             BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, FALSE);
    648             break;
    649 
    650         case BTIF_GATTC_SEARCH_SERVICE:
    651         {
    652             if (p_cb->search_all)
    653             {
    654                 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, NULL);
    655             } else {
    656                 btif_to_bta_uuid(&uuid, &p_cb->uuid);
    657                 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &uuid);
    658             }
    659             break;
    660         }
    661 
    662         case BTIF_GATTC_GET_FIRST_CHAR:
    663         {
    664             btgatt_gatt_id_t char_id;
    665             btif_to_bta_srvc_id(&srvc_id, &p_cb->srvc_id);
    666             status = BTA_GATTC_GetFirstChar(p_cb->conn_id, &srvc_id, NULL,
    667                                             &out_char_id, &out_char_prop);
    668 
    669             if (status == 0)
    670                 bta_to_btif_gatt_id(&char_id, &out_char_id.char_id);
    671 
    672             HAL_CBACK(bt_gatt_callbacks, client->get_characteristic_cb,
    673                 p_cb->conn_id, status, &p_cb->srvc_id,
    674                 &char_id, out_char_prop);
    675             break;
    676         }
    677 
    678         case BTIF_GATTC_GET_NEXT_CHAR:
    679         {
    680             btgatt_gatt_id_t char_id;
    681             btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
    682             btif_to_bta_gatt_id(&in_char_id.char_id, &p_cb->char_id);
    683 
    684             status = BTA_GATTC_GetNextChar(p_cb->conn_id, &in_char_id, NULL,
    685                                             &out_char_id, &out_char_prop);
    686 
    687             if (status == 0)
    688                 bta_to_btif_gatt_id(&char_id, &out_char_id.char_id);
    689 
    690             HAL_CBACK(bt_gatt_callbacks, client->get_characteristic_cb,
    691                 p_cb->conn_id, status, &p_cb->srvc_id,
    692                 &char_id, out_char_prop);
    693             break;
    694         }
    695 
    696         case BTIF_GATTC_GET_FIRST_CHAR_DESCR:
    697         {
    698             btgatt_gatt_id_t descr_id;
    699             btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
    700             btif_to_bta_gatt_id(&in_char_id.char_id, &p_cb->char_id);
    701 
    702             status = BTA_GATTC_GetFirstCharDescr(p_cb->conn_id, &in_char_id, NULL,
    703                                                     &out_char_descr_id);
    704 
    705             if (status == 0)
    706                 bta_to_btif_gatt_id(&descr_id, &out_char_descr_id.descr_id);
    707 
    708             HAL_CBACK(bt_gatt_callbacks, client->get_descriptor_cb,
    709                 p_cb->conn_id, status, &p_cb->srvc_id,
    710                 &p_cb->char_id, &descr_id);
    711             break;
    712         }
    713 
    714         case BTIF_GATTC_GET_NEXT_CHAR_DESCR:
    715         {
    716             btgatt_gatt_id_t descr_id;
    717             btif_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &p_cb->srvc_id);
    718             btif_to_bta_gatt_id(&in_char_descr_id.char_id.char_id, &p_cb->char_id);
    719             btif_to_bta_gatt_id(&in_char_descr_id.descr_id, &p_cb->descr_id);
    720 
    721             status = BTA_GATTC_GetNextCharDescr(p_cb->conn_id, &in_char_descr_id
    722                                         , NULL, &out_char_descr_id);
    723 
    724             if (status == 0)
    725                 bta_to_btif_gatt_id(&descr_id, &out_char_descr_id.descr_id);
    726 
    727             HAL_CBACK(bt_gatt_callbacks, client->get_descriptor_cb,
    728                 p_cb->conn_id, status, &p_cb->srvc_id,
    729                 &p_cb->char_id, &descr_id);
    730             break;
    731         }
    732 
    733         case BTIF_GATTC_GET_FIRST_INCL_SERVICE:
    734         {
    735             btgatt_srvc_id_t incl_srvc_id;
    736             btif_to_bta_srvc_id(&srvc_id, &p_cb->srvc_id);
    737 
    738             status = BTA_GATTC_GetFirstIncludedService(p_cb->conn_id,
    739                         &srvc_id, NULL, &out_incl_svc_id);
    740 
    741             bta_to_btif_srvc_id(&incl_srvc_id, &out_incl_svc_id.incl_svc_id);
    742 
    743             HAL_CBACK(bt_gatt_callbacks, client->get_included_service_cb,
    744                 p_cb->conn_id, status, &p_cb->srvc_id,
    745                 &incl_srvc_id);
    746             break;
    747         }
    748 
    749         case BTIF_GATTC_GET_NEXT_INCL_SERVICE:
    750         {
    751             btgatt_srvc_id_t incl_srvc_id;
    752             btif_to_bta_srvc_id(&in_incl_svc_id.srvc_id, &p_cb->srvc_id);
    753             btif_to_bta_srvc_id(&in_incl_svc_id.incl_svc_id, &p_cb->incl_srvc_id);
    754 
    755             status = BTA_GATTC_GetNextIncludedService(p_cb->conn_id,
    756                         &in_incl_svc_id, NULL, &out_incl_svc_id);
    757 
    758             bta_to_btif_srvc_id(&incl_srvc_id, &out_incl_svc_id.incl_svc_id);
    759 
    760             HAL_CBACK(bt_gatt_callbacks, client->get_included_service_cb,
    761                 p_cb->conn_id, status, &p_cb->srvc_id,
    762                 &incl_srvc_id);
    763             break;
    764         }
    765 
    766         case BTIF_GATTC_READ_CHAR:
    767             btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
    768             btif_to_bta_gatt_id(&in_char_id.char_id, &p_cb->char_id);
    769 
    770             BTA_GATTC_ReadCharacteristic(p_cb->conn_id, &in_char_id, p_cb->auth_req);
    771             break;
    772 
    773         case BTIF_GATTC_READ_CHAR_DESCR:
    774             btif_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &p_cb->srvc_id);
    775             btif_to_bta_gatt_id(&in_char_descr_id.char_id.char_id, &p_cb->char_id);
    776             btif_to_bta_gatt_id(&in_char_descr_id.descr_id, &p_cb->descr_id);
    777 
    778             BTA_GATTC_ReadCharDescr(p_cb->conn_id, &in_char_descr_id, p_cb->auth_req);
    779             break;
    780 
    781         case BTIF_GATTC_WRITE_CHAR:
    782             btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
    783             btif_to_bta_gatt_id(&in_char_id.char_id, &p_cb->char_id);
    784 
    785             BTA_GATTC_WriteCharValue(p_cb->conn_id, &in_char_id,
    786                                      p_cb->write_type,
    787                                      p_cb->len,
    788                                      p_cb->value,
    789                                      p_cb->auth_req);
    790             break;
    791 
    792         case BTIF_GATTC_WRITE_CHAR_DESCR:
    793             btif_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &p_cb->srvc_id);
    794             btif_to_bta_gatt_id(&in_char_descr_id.char_id.char_id, &p_cb->char_id);
    795             btif_to_bta_gatt_id(&in_char_descr_id.descr_id, &p_cb->descr_id);
    796 
    797             descr_val.len = p_cb->len;
    798             descr_val.p_value = p_cb->value;
    799 
    800             BTA_GATTC_WriteCharDescr(p_cb->conn_id, &in_char_descr_id,
    801                                      p_cb->write_type, &descr_val,
    802                                      p_cb->auth_req);
    803             break;
    804 
    805         case BTIF_GATTC_EXECUTE_WRITE:
    806             BTA_GATTC_ExecuteWrite(p_cb->conn_id, p_cb->action);
    807             break;
    808 
    809         case BTIF_GATTC_REG_FOR_NOTIFICATION:
    810             btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
    811             btif_to_bta_gatt_id(&in_char_id.char_id, &p_cb->char_id);
    812 
    813             status = BTA_GATTC_RegisterForNotifications(p_cb->client_if,
    814                                     p_cb->bd_addr.address, &in_char_id);
    815 
    816             HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
    817                 p_cb->conn_id, 1, status, &p_cb->srvc_id,
    818                 &p_cb->char_id);
    819             break;
    820 
    821         case BTIF_GATTC_DEREG_FOR_NOTIFICATION:
    822             btif_to_bta_srvc_id(&in_char_id.srvc_id, &p_cb->srvc_id);
    823             btif_to_bta_gatt_id(&in_char_id.char_id, &p_cb->char_id);
    824 
    825             status = BTA_GATTC_DeregisterForNotifications(p_cb->client_if,
    826                                         p_cb->bd_addr.address, &in_char_id);
    827 
    828             HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
    829                 p_cb->conn_id, 0, status, &p_cb->srvc_id,
    830                 &p_cb->char_id);
    831             break;
    832 
    833         case BTIF_GATTC_REFRESH:
    834             BTA_GATTC_Refresh(p_cb->bd_addr.address);
    835             break;
    836 
    837         case BTIF_GATTC_READ_RSSI:
    838             rssi_request_client_if = p_cb->client_if;
    839             BTM_ReadRSSI (p_cb->bd_addr.address, (tBTM_CMPL_CB *)btm_read_rssi_cb);
    840             break;
    841 
    842         case BTIF_GATTC_LISTEN:
    843 #ifdef BLE_PERIPHERAL_MODE_SUPPORT
    844             BTA_GATTC_Listen(p_cb->client_if, p_cb->start, NULL);
    845 #else
    846             BTA_GATTC_Broadcast(p_cb->client_if, p_cb->start);
    847 #endif
    848             break;
    849 
    850         case BTIF_GATTC_SET_ADV_DATA:
    851         {
    852             if (p_cb->start == 0)
    853                 BTA_DmBleSetAdvConfig(p_cb->adv_data.mask, &p_cb->adv_data.data);
    854             else
    855                 BTA_DmBleSetScanRsp(p_cb->adv_data.mask, &p_cb->adv_data.data);
    856 
    857             // Cleanup ...
    858 
    859             // ... manufacturer data
    860             if (p_cb->adv_data.data.manu.p_val != NULL)
    861                 GKI_freebuf(p_cb->adv_data.data.manu.p_val);
    862 
    863             // ... service data
    864             if (p_cb->adv_data.data.p_proprietary != NULL)
    865             {
    866                 int i = 0;
    867                 tBTA_BLE_PROP_ELEM *p_elem = p_cb->adv_data.data.p_proprietary->p_elem;
    868                 while (i++ != p_cb->adv_data.data.p_proprietary->num_elem && p_elem)
    869                 {
    870                     if (p_elem->p_val != NULL)
    871                         GKI_freebuf(p_elem->p_val);
    872                     ++p_elem;
    873                 }
    874                 if (p_cb->adv_data.data.p_proprietary->p_elem != NULL)
    875                     GKI_freebuf(p_cb->adv_data.data.p_proprietary->p_elem);
    876                 GKI_freebuf(p_cb->adv_data.data.p_proprietary);
    877             }
    878 
    879             // ... service list
    880             if (p_cb->adv_data.data.services.p_uuid != NULL)
    881                 GKI_freebuf(p_cb->adv_data.data.services.p_uuid);
    882 
    883             break;
    884         }
    885 
    886         default:
    887             ALOGE("%s: Unknown event (%d)!", __FUNCTION__, event);
    888             break;
    889     }
    890 }
    891 
    892 /*******************************************************************************
    893 **  Client API Functions
    894 ********************************************************************************/
    895 
    896 static bt_status_t btif_gattc_register_app(bt_uuid_t *uuid)
    897 {
    898     CHECK_BTGATT_INIT();
    899     btif_gattc_cb_t btif_cb;
    900     memcpy(&btif_cb.uuid, uuid, sizeof(bt_uuid_t));
    901     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REGISTER_APP,
    902                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    903 }
    904 
    905 static bt_status_t btif_gattc_unregister_app(int client_if )
    906 {
    907     CHECK_BTGATT_INIT();
    908     btif_gattc_cb_t btif_cb;
    909     btif_cb.client_if = (uint8_t) client_if;
    910     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_UNREGISTER_APP,
    911                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    912 }
    913 
    914 static bt_status_t btif_gattc_scan( int client_if, bool start )
    915 {
    916     CHECK_BTGATT_INIT();
    917     btif_gattc_cb_t btif_cb;
    918     btif_cb.client_if = (uint8_t) client_if;
    919     return btif_transfer_context(btgattc_handle_event, start ? BTIF_GATTC_SCAN_START : BTIF_GATTC_SCAN_STOP,
    920                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    921 }
    922 
    923 static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr, bool is_direct )
    924 {
    925     CHECK_BTGATT_INIT();
    926     btif_gattc_cb_t btif_cb;
    927     btif_cb.client_if = (uint8_t) client_if;
    928     btif_cb.is_direct = is_direct ? 1 : 0;
    929     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
    930     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_OPEN,
    931                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    932 }
    933 
    934 static bt_status_t btif_gattc_close( int client_if, const bt_bdaddr_t *bd_addr, int conn_id)
    935 {
    936     CHECK_BTGATT_INIT();
    937     btif_gattc_cb_t btif_cb;
    938     btif_cb.client_if = (uint8_t) client_if;
    939     btif_cb.conn_id = (uint16_t) conn_id;
    940     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
    941     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CLOSE,
    942                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    943 }
    944 
    945 static bt_status_t btif_gattc_listen(int client_if, bool start)
    946 {
    947     CHECK_BTGATT_INIT();
    948     btif_gattc_cb_t btif_cb;
    949     btif_cb.client_if = (uint8_t) client_if;
    950     btif_cb.start = start ? 1 : 0;
    951     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_LISTEN,
    952                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    953 }
    954 
    955 static bt_status_t btif_gattc_set_adv_data(int client_if, bool set_scan_rsp, bool include_name,
    956                 bool include_txpower, int min_interval, int max_interval, int appearance,
    957                 uint16_t manufacturer_len, char* manufacturer_data,
    958                 uint16_t service_data_len, char* service_data,
    959                 uint16_t service_uuid_len, char* service_uuid)
    960 {
    961     CHECK_BTGATT_INIT();
    962     btif_gattc_cb_t btif_cb;
    963     memset(&btif_cb, 0, sizeof(btif_gattc_cb_t));
    964     memset(&btif_cb.adv_data, 0, sizeof(btgatt_adv_data));
    965 
    966     btif_cb.client_if = (uint8_t) client_if;
    967     btif_cb.start = set_scan_rsp ? 1 : 0;
    968 
    969     if (!set_scan_rsp)
    970     {
    971         btif_cb.adv_data.mask = BTM_BLE_AD_BIT_FLAGS;
    972         btif_cb.adv_data.data.flag = ADV_FLAGS;
    973     }
    974 
    975     if (include_name)
    976         btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_DEV_NAME;
    977 
    978     if (include_txpower)
    979         btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_TX_PWR;
    980 
    981     if (min_interval > 0 && max_interval > 0 && max_interval > min_interval)
    982     {
    983         btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_INT_RANGE;
    984         btif_cb.adv_data.data.int_range.low = min_interval;
    985         btif_cb.adv_data.data.int_range.hi = max_interval;
    986     }
    987 
    988     if (appearance != 0)
    989     {
    990         btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_APPEARANCE;
    991         btif_cb.adv_data.data.appearance = appearance;
    992     }
    993 
    994     if (manufacturer_len > 0 && manufacturer_data != NULL)
    995     {
    996         btif_cb.adv_data.data.manu.p_val = GKI_getbuf(manufacturer_len);
    997         if (btif_cb.adv_data.data.manu.p_val != NULL)
    998         {
    999             btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_MANU;
   1000             btif_cb.adv_data.data.manu.len = manufacturer_len;
   1001             memcpy(btif_cb.adv_data.data.manu.p_val, manufacturer_data, manufacturer_len);
   1002         }
   1003     }
   1004 
   1005     tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
   1006     tBTA_BLE_PROP_ELEM *p_elem_service_128 = NULL;
   1007 
   1008     if (service_data_len > 0 && service_data != NULL)
   1009     {
   1010         p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
   1011         if (p_elem_service_data != NULL)
   1012         {
   1013             p_elem_service_data->p_val = GKI_getbuf(service_data_len);
   1014             if (p_elem_service_data->p_val != NULL)
   1015             {
   1016                 p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
   1017                 p_elem_service_data->len = service_data_len;
   1018                 memcpy(p_elem_service_data->p_val, service_data, service_data_len);
   1019 
   1020             } else {
   1021                 GKI_freebuf(p_elem_service_data);
   1022                 p_elem_service_data = NULL;
   1023             }
   1024         }
   1025     }
   1026 
   1027     if (service_uuid_len > 0 && service_uuid != NULL)
   1028     {
   1029         btif_cb.adv_data.data.services.list_cmpl = FALSE;
   1030         btif_cb.adv_data.data.services.num_service = 0;
   1031 
   1032         btif_cb.adv_data.data.services.p_uuid =
   1033             GKI_getbuf(service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
   1034         if (btif_cb.adv_data.data.services.p_uuid != NULL)
   1035         {
   1036             UINT16 *p_uuid_out = btif_cb.adv_data.data.services.p_uuid;
   1037             while (service_uuid_len >= LEN_UUID_128)
   1038             {
   1039                 bt_uuid_t uuid;
   1040                 memset(&uuid, 0, sizeof(bt_uuid_t));
   1041                 memcpy(&uuid.uu, service_uuid, LEN_UUID_128);
   1042 
   1043                 tBT_UUID bt_uuid;
   1044                 memset(&bt_uuid, 0, sizeof(tBT_UUID));
   1045                 btif_to_bta_uuid(&bt_uuid, &uuid);
   1046 
   1047                 if (bt_uuid.len == LEN_UUID_16)
   1048                 {
   1049                     btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_SERVICE;
   1050                     ++btif_cb.adv_data.data.services.num_service;
   1051                     *p_uuid_out++ = bt_uuid.uu.uuid16;
   1052 
   1053                 } else if (bt_uuid.len == LEN_UUID_128 && p_elem_service_128 == NULL) {
   1054                     /* Currently, only one 128-bit UUID is supported */
   1055                     p_elem_service_128 = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
   1056                     if (p_elem_service_128 != NULL)
   1057                     {
   1058                         p_elem_service_128->p_val = GKI_getbuf(LEN_UUID_128);
   1059                         if (p_elem_service_128->p_val != NULL)
   1060                         {
   1061                             p_elem_service_128->adv_type = BTM_BLE_AD_TYPE_128SRV_PART;
   1062                             p_elem_service_128->len = LEN_UUID_128;
   1063                             memcpy(p_elem_service_128->p_val, bt_uuid.uu.uuid128, LEN_UUID_128);
   1064 
   1065                         } else {
   1066                             GKI_freebuf(p_elem_service_128);
   1067                             p_elem_service_128 = NULL;
   1068                         }
   1069                     }
   1070                 }
   1071 
   1072                 service_uuid += LEN_UUID_128;
   1073                 service_uuid_len -= LEN_UUID_128;
   1074             }
   1075         }
   1076     }
   1077 
   1078     if (p_elem_service_data != NULL || p_elem_service_128 != NULL)
   1079     {
   1080         btif_cb.adv_data.data.p_proprietary = GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
   1081         if (btif_cb.adv_data.data.p_proprietary != NULL)
   1082         {
   1083             tBTA_BLE_PROPRIETARY *p_prop = btif_cb.adv_data.data.p_proprietary;
   1084             tBTA_BLE_PROP_ELEM *p_elem = NULL;
   1085             p_prop->num_elem = 0;
   1086             btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_PROPRIETARY;
   1087 
   1088             if (p_elem_service_128 != NULL)
   1089                 ++p_prop->num_elem;
   1090 
   1091             if (p_elem_service_data != NULL)
   1092                 ++p_prop->num_elem;
   1093 
   1094             p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
   1095             p_elem = p_prop->p_elem;
   1096 
   1097             if (p_elem_service_128 != NULL)
   1098             {
   1099                 memcpy(p_elem++, p_elem_service_128, sizeof(tBTA_BLE_PROP_ELEM));
   1100                 GKI_freebuf(p_elem_service_128);
   1101             }
   1102 
   1103             if (p_elem_service_data != NULL)
   1104             {
   1105                 memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
   1106                 GKI_freebuf(p_elem_service_data);
   1107             }
   1108         }
   1109     }
   1110 
   1111     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA,
   1112                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1113 }
   1114 
   1115 static bt_status_t btif_gattc_refresh( int client_if, const bt_bdaddr_t *bd_addr )
   1116 {
   1117     CHECK_BTGATT_INIT();
   1118     btif_gattc_cb_t btif_cb;
   1119     btif_cb.client_if = (uint8_t) client_if;
   1120     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1121     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REFRESH,
   1122                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1123 }
   1124 
   1125 static bt_status_t btif_gattc_search_service(int conn_id, bt_uuid_t *filter_uuid )
   1126 {
   1127     CHECK_BTGATT_INIT();
   1128     btif_gattc_cb_t btif_cb;
   1129     btif_cb.conn_id = (uint16_t) conn_id;
   1130     btif_cb.search_all = filter_uuid ? 0 : 1;
   1131     if (filter_uuid)
   1132         memcpy(&btif_cb.uuid, filter_uuid, sizeof(bt_uuid_t));
   1133     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SEARCH_SERVICE,
   1134                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1135 }
   1136 
   1137 static bt_status_t btif_gattc_get_characteristic( int conn_id
   1138         , btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *start_char_id)
   1139 {
   1140     CHECK_BTGATT_INIT();
   1141     btif_gattc_cb_t btif_cb;
   1142     btif_cb.conn_id = (uint16_t) conn_id;
   1143     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1144     if (start_char_id)
   1145     {
   1146         memcpy(&btif_cb.char_id, start_char_id, sizeof(btgatt_gatt_id_t));
   1147         return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_NEXT_CHAR,
   1148                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1149     }
   1150     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_FIRST_CHAR,
   1151                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1152 }
   1153 
   1154 static bt_status_t btif_gattc_get_descriptor( int conn_id
   1155         , btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id
   1156         , btgatt_gatt_id_t *start_descr_id)
   1157 {
   1158     CHECK_BTGATT_INIT();
   1159     btif_gattc_cb_t btif_cb;
   1160     btif_cb.conn_id = (uint16_t) conn_id;
   1161     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1162     memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_gatt_id_t));
   1163     if (start_descr_id)
   1164     {
   1165         memcpy(&btif_cb.descr_id, start_descr_id, sizeof(btgatt_gatt_id_t));
   1166         return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_NEXT_CHAR_DESCR,
   1167                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1168     }
   1169 
   1170     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_FIRST_CHAR_DESCR,
   1171                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1172 }
   1173 
   1174 static bt_status_t btif_gattc_get_included_service(int conn_id, btgatt_srvc_id_t *srvc_id,
   1175                                                    btgatt_srvc_id_t *start_incl_srvc_id)
   1176 {
   1177     CHECK_BTGATT_INIT();
   1178     btif_gattc_cb_t btif_cb;
   1179     btif_cb.conn_id = (uint16_t) conn_id;
   1180     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1181     if (start_incl_srvc_id)
   1182     {
   1183         memcpy(&btif_cb.incl_srvc_id, start_incl_srvc_id, sizeof(btgatt_srvc_id_t));
   1184         return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_NEXT_INCL_SERVICE,
   1185                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1186     }
   1187     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_FIRST_INCL_SERVICE,
   1188                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1189 }
   1190 
   1191 static bt_status_t btif_gattc_read_char(int conn_id, btgatt_srvc_id_t* srvc_id,
   1192                                         btgatt_gatt_id_t* char_id, int auth_req )
   1193 {
   1194     CHECK_BTGATT_INIT();
   1195     btif_gattc_cb_t btif_cb;
   1196     btif_cb.conn_id = (uint16_t) conn_id;
   1197     btif_cb.auth_req = (uint8_t) auth_req;
   1198     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1199     memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_gatt_id_t));
   1200     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR,
   1201                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1202 }
   1203 
   1204 static bt_status_t btif_gattc_read_char_descr(int conn_id, btgatt_srvc_id_t* srvc_id,
   1205                                               btgatt_gatt_id_t* char_id,
   1206                                               btgatt_gatt_id_t* descr_id,
   1207                                               int auth_req )
   1208 {
   1209     CHECK_BTGATT_INIT();
   1210     btif_gattc_cb_t btif_cb;
   1211     btif_cb.conn_id = (uint16_t) conn_id;
   1212     btif_cb.auth_req = (uint8_t) auth_req;
   1213     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1214     memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_gatt_id_t));
   1215     memcpy(&btif_cb.descr_id, descr_id, sizeof(btgatt_gatt_id_t));
   1216     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR_DESCR,
   1217                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1218 }
   1219 
   1220 static bt_status_t btif_gattc_write_char(int conn_id, btgatt_srvc_id_t* srvc_id,
   1221                                          btgatt_gatt_id_t* char_id, int write_type,
   1222                                          int len, int auth_req, char* p_value)
   1223 {
   1224     CHECK_BTGATT_INIT();
   1225     btif_gattc_cb_t btif_cb;
   1226     btif_cb.conn_id = (uint16_t) conn_id;
   1227     btif_cb.auth_req = (uint8_t) auth_req;
   1228     btif_cb.write_type = (uint8_t) write_type;
   1229     btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len;
   1230     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1231     memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_gatt_id_t));
   1232     memcpy(btif_cb.value, p_value, btif_cb.len);
   1233     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR,
   1234                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1235 }
   1236 
   1237 static bt_status_t btif_gattc_write_char_descr(int conn_id, btgatt_srvc_id_t* srvc_id,
   1238                                                btgatt_gatt_id_t* char_id,
   1239                                                btgatt_gatt_id_t* descr_id,
   1240                                                int write_type, int len, int auth_req,
   1241                                                char* p_value)
   1242 {
   1243     CHECK_BTGATT_INIT();
   1244     btif_gattc_cb_t btif_cb;
   1245     btif_cb.conn_id = (uint16_t) conn_id;
   1246     btif_cb.auth_req = (uint8_t) auth_req;
   1247     btif_cb.write_type = (uint8_t) write_type;
   1248     btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len;
   1249     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1250     memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_gatt_id_t));
   1251     memcpy(&btif_cb.descr_id, descr_id, sizeof(btgatt_gatt_id_t));
   1252     memcpy(btif_cb.value, p_value, btif_cb.len);
   1253     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR_DESCR,
   1254                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1255 }
   1256 
   1257 static bt_status_t btif_gattc_execute_write(int conn_id, int execute)
   1258 {
   1259     CHECK_BTGATT_INIT();
   1260     btif_gattc_cb_t btif_cb;
   1261     btif_cb.conn_id = (uint16_t) conn_id;
   1262     btif_cb.action = (uint8_t) execute;
   1263     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_EXECUTE_WRITE,
   1264                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1265 }
   1266 
   1267 static bt_status_t btif_gattc_reg_for_notification(int client_if, const bt_bdaddr_t *bd_addr,
   1268                                                    btgatt_srvc_id_t* srvc_id,
   1269                                                    btgatt_gatt_id_t* char_id)
   1270 {
   1271     CHECK_BTGATT_INIT();
   1272     btif_gattc_cb_t btif_cb;
   1273     btif_cb.client_if = (uint8_t) client_if;
   1274     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1275     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1276     memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_gatt_id_t));
   1277     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REG_FOR_NOTIFICATION,
   1278                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1279 }
   1280 
   1281 static bt_status_t btif_gattc_dereg_for_notification(int client_if, const bt_bdaddr_t *bd_addr,
   1282                                                      btgatt_srvc_id_t* srvc_id,
   1283                                                      btgatt_gatt_id_t* char_id)
   1284 {
   1285     CHECK_BTGATT_INIT();
   1286     btif_gattc_cb_t btif_cb;
   1287     btif_cb.client_if = (uint8_t) client_if;
   1288     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1289     memcpy(&btif_cb.srvc_id, srvc_id, sizeof(btgatt_srvc_id_t));
   1290     memcpy(&btif_cb.char_id, char_id, sizeof(btgatt_gatt_id_t));
   1291     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DEREG_FOR_NOTIFICATION,
   1292                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1293 }
   1294 
   1295 static bt_status_t btif_gattc_read_remote_rssi(int client_if, const bt_bdaddr_t *bd_addr)
   1296 {
   1297     CHECK_BTGATT_INIT();
   1298     btif_gattc_cb_t btif_cb;
   1299     btif_cb.client_if = (uint8_t) client_if;
   1300     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1301     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_RSSI,
   1302                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1303 }
   1304 
   1305 static int btif_gattc_get_device_type( const bt_bdaddr_t *bd_addr )
   1306 {
   1307     int device_type = 0;
   1308     char bd_addr_str[18] = {0};
   1309 
   1310     bd2str(bd_addr, &bd_addr_str);
   1311     if (btif_config_get_int("Remote", bd_addr_str, "DevType", &device_type))
   1312         return device_type;
   1313     return 0;
   1314 }
   1315 
   1316 extern bt_status_t btif_gattc_test_command_impl(int command, btgatt_test_params_t* params);
   1317 
   1318 static bt_status_t btif_gattc_test_command(int command, btgatt_test_params_t* params)
   1319 {
   1320     return btif_gattc_test_command_impl(command, params);
   1321 }
   1322 
   1323 
   1324 const btgatt_client_interface_t btgattClientInterface = {
   1325     btif_gattc_register_app,
   1326     btif_gattc_unregister_app,
   1327     btif_gattc_scan,
   1328     btif_gattc_open,
   1329     btif_gattc_close,
   1330     btif_gattc_listen,
   1331     btif_gattc_refresh,
   1332     btif_gattc_search_service,
   1333     btif_gattc_get_included_service,
   1334     btif_gattc_get_characteristic,
   1335     btif_gattc_get_descriptor,
   1336     btif_gattc_read_char,
   1337     btif_gattc_write_char,
   1338     btif_gattc_read_char_descr,
   1339     btif_gattc_write_char_descr,
   1340     btif_gattc_execute_write,
   1341     btif_gattc_reg_for_notification,
   1342     btif_gattc_dereg_for_notification,
   1343     btif_gattc_read_remote_rssi,
   1344     btif_gattc_get_device_type,
   1345     btif_gattc_set_adv_data,
   1346     btif_gattc_test_command
   1347 };
   1348 
   1349 #endif
   1350