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 
getFilename(char * buffer,BD_ADDR bda)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 
cacheClose()41 static void cacheClose()
42 {
43     if (sCacheFD != 0)
44     {
45         fclose(sCacheFD);
46         sCacheFD = 0;
47     }
48 }
49 
cacheOpen(BD_ADDR bda,bool to_save)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 
cacheReset(BD_ADDR bda)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 *******************************************************************************/
bta_gattc_co_cache_open(BD_ADDR server_bda,UINT16 evt,UINT16 conn_id,BOOLEAN to_save)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 *******************************************************************************/
bta_gattc_co_cache_load(BD_ADDR server_bda,UINT16 evt,UINT16 start_index,UINT16 conn_id)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 *******************************************************************************/
bta_gattc_co_cache_save(BD_ADDR server_bda,UINT16 evt,UINT16 num_attr,tBTA_GATTC_NV_ATTR * p_attr_list,UINT16 attr_index,UINT16 conn_id)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 *******************************************************************************/
bta_gattc_co_cache_close(BD_ADDR server_bda,UINT16 conn_id)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 *******************************************************************************/
bta_gattc_co_cache_reset(BD_ADDR server_bda)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