Home | History | Annotate | Download | only in co
      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 #include <stdio.h>
     20 #include <unistd.h>
     21 
     22 #include "gki.h"
     23 #include "bta_gattc_co.h"
     24 #include "bta_gattc_ci.h"
     25 #include "btif_util.h"
     26 #include "btm_int.h"
     27 
     28 #if( defined BLE_INCLUDED ) && (BLE_INCLUDED == TRUE)
     29 #if( defined BTA_GATT_INCLUDED ) && (BTA_GATT_INCLUDED == TRUE)
     30 
     31 #define GATT_CACHE_PREFIX "/data/misc/bluedroid/gatt_cache_"
     32 
     33 static FILE* sCacheFD = 0;
     34 
     35 static void getFilename(char *buffer, BD_ADDR bda)
     36 {
     37     sprintf(buffer, "%s%02x%02x%02x%02x%02x%02x", GATT_CACHE_PREFIX
     38         , bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
     39 }
     40 
     41 static void cacheClose()
     42 {
     43     if (sCacheFD != 0)
     44     {
     45         fclose(sCacheFD);
     46         sCacheFD = 0;
     47     }
     48 }
     49 
     50 static bool cacheOpen(BD_ADDR bda, bool to_save)
     51 {
     52     char fname[255] = {0};
     53     getFilename(fname, bda);
     54 
     55     cacheClose();
     56     sCacheFD = fopen(fname, to_save ? "w" : "r");
     57 
     58     return (sCacheFD != 0);
     59 }
     60 
     61 static void cacheReset(BD_ADDR bda)
     62 {
     63     char fname[255] = {0};
     64     getFilename(fname, bda);
     65     unlink(fname);
     66 }
     67 
     68 
     69 /*****************************************************************************
     70 **  Function Declarations
     71 *****************************************************************************/
     72 
     73 /*******************************************************************************
     74 **
     75 ** Function         bta_gattc_co_cache_open
     76 **
     77 ** Description      This callout function is executed by GATTC when a GATT server
     78 **                  cache is ready to be sent.
     79 **
     80 ** Parameter        server_bda: server bd address of this cache belongs to
     81 **                  evt: call in event to be passed in when cache open is done.
     82 **                  conn_id: connection ID of this cache operation attach to.
     83 **                  to_save: open cache to save or to load.
     84 **
     85 ** Returns          void.
     86 **
     87 *******************************************************************************/
     88 void bta_gattc_co_cache_open(BD_ADDR server_bda, UINT16 evt, UINT16 conn_id, BOOLEAN to_save)
     89 {
     90     /* open NV cache and send call in */
     91     tBTA_GATT_STATUS    status = BTA_GATT_OK;
     92     if (!btm_sec_is_a_bonded_dev(server_bda) || !cacheOpen(server_bda, to_save))
     93         status = BTA_GATT_ERROR;
     94 
     95     BTIF_TRACE_DEBUG("%s() - status=%d", __FUNCTION__, status);
     96     bta_gattc_ci_cache_open(server_bda, evt, status, conn_id);
     97 }
     98 
     99 /*******************************************************************************
    100 **
    101 ** Function         bta_gattc_co_cache_load
    102 **
    103 ** Description      This callout function is executed by GATT when server cache
    104 **                  is required to load.
    105 **
    106 ** Parameter        server_bda: server bd address of this cache belongs to
    107 **                  evt: call in event to be passed in when cache save is done.
    108 **                  num_attr: number of attribute to be save.
    109 **                  attr_index: starting attribute index of the save operation.
    110 **                  conn_id: connection ID of this cache operation attach to.
    111 ** Returns
    112 **
    113 *******************************************************************************/
    114 void bta_gattc_co_cache_load(BD_ADDR server_bda, UINT16 evt, UINT16 start_index, UINT16 conn_id)
    115 {
    116     UINT16              num_attr = 0;
    117     tBTA_GATTC_NV_ATTR  attr[BTA_GATTC_NV_LOAD_MAX];
    118     tBTA_GATT_STATUS    status = BTA_GATT_ERROR;
    119 
    120     if (sCacheFD && (0 == fseek(sCacheFD, start_index * sizeof(tBTA_GATTC_NV_ATTR), SEEK_SET)))
    121     {
    122         num_attr = fread(attr, sizeof(tBTA_GATTC_NV_ATTR), BTA_GATTC_NV_LOAD_MAX, sCacheFD);
    123         status = (num_attr < BTA_GATTC_NV_LOAD_MAX ? BTA_GATT_OK : BTA_GATT_MORE);
    124     }
    125 
    126     BTIF_TRACE_DEBUG("%s() - sCacheFD=%p, start_index=%d, read=%d, status=%d",
    127         __FUNCTION__, sCacheFD, start_index, num_attr, status);
    128     bta_gattc_ci_cache_load(server_bda, evt, num_attr, attr, status, conn_id);
    129 }
    130 
    131 /*******************************************************************************
    132 **
    133 ** Function         bta_gattc_co_cache_save
    134 **
    135 ** Description      This callout function is executed by GATT when a server cache
    136 **                  is available to save.
    137 **
    138 ** Parameter        server_bda: server bd address of this cache belongs to
    139 **                  evt: call in event to be passed in when cache save is done.
    140 **                  num_attr: number of attribute to be save.
    141 **                  p_attr: pointer to the list of attributes to save.
    142 **                  attr_index: starting attribute index of the save operation.
    143 **                  conn_id: connection ID of this cache operation attach to.
    144 ** Returns
    145 **
    146 *******************************************************************************/
    147 void bta_gattc_co_cache_save (BD_ADDR server_bda, UINT16 evt, UINT16 num_attr,
    148                               tBTA_GATTC_NV_ATTR *p_attr_list, UINT16 attr_index, UINT16 conn_id)
    149 {
    150     tBTA_GATT_STATUS    status = BTA_GATT_OK;
    151     UNUSED(attr_index);
    152 
    153     if (sCacheFD != 0)
    154     {
    155         int num = fwrite(p_attr_list, sizeof(tBTA_GATTC_NV_ATTR), num_attr, sCacheFD);
    156         BTIF_TRACE_DEBUG("%s() wrote %d", __FUNCTION__, num);
    157     }
    158 
    159     bta_gattc_ci_cache_save(server_bda, evt, status, conn_id);
    160 }
    161 
    162 /*******************************************************************************
    163 **
    164 ** Function         bta_gattc_co_cache_close
    165 **
    166 ** Description      This callout function is executed by GATTC when a GATT server
    167 **                  cache is written completely.
    168 **
    169 ** Parameter        server_bda: server bd address of this cache belongs to
    170 **                  conn_id: connection ID of this cache operation attach to.
    171 **
    172 ** Returns          void.
    173 **
    174 *******************************************************************************/
    175 void bta_gattc_co_cache_close(BD_ADDR server_bda, UINT16 conn_id)
    176 {
    177     UNUSED(server_bda);
    178     UNUSED(conn_id);
    179 
    180     cacheClose();
    181 
    182     /* close NV when server cache is done saving or loading,
    183        does not need to do anything for now on Insight */
    184 
    185     BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
    186 }
    187 
    188 /*******************************************************************************
    189 **
    190 ** Function         bta_gattc_co_cache_reset
    191 **
    192 ** Description      This callout function is executed by GATTC to reset cache in
    193 **                  application
    194 **
    195 ** Parameter        server_bda: server bd address of this cache belongs to
    196 **
    197 ** Returns          void.
    198 **
    199 *******************************************************************************/
    200 void bta_gattc_co_cache_reset(BD_ADDR server_bda)
    201 {
    202     BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
    203     cacheReset(server_bda);
    204 }
    205 
    206 #endif
    207 #endif
    208 
    209