1 /*****************************************************************************
2 **
3 ** Name: bta_gattc_co.c
4 **
5 ** Description: This file contains the GATT client call-out
6 ** function implementation for Insight.
7 **
8 ** Copyright (c) 2010, Broadcom Corp., All Rights Reserved.
9 ** Broadcom Bluetooth Core. Proprietary and confidential.
10 **
11 *****************************************************************************/
12
13 #include "bta_api.h"
14
15 #if( defined BLE_INCLUDED ) && (BLE_INCLUDED == TRUE)
16 #if( defined BTA_GATT_INCLUDED ) && (BTA_GATT_INCLUDED == TRUE)
17
18 #include <stdlib.h>
19 #include "gki.h"
20 #include "bd.h"
21 #include "bta_gatts_co.h"
22
23 /*****************************************************************************
24 ** Local type definitions
25 *****************************************************************************/
26
27 #define BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE 50
28
29 typedef struct
30 {
31 BOOLEAN enable;
32 UINT8 num_clients;
33 tBTA_GATTS_SRV_CHG srv_chg[BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE];
34 } __attribute__((packed)) btif_gatts_srv_chg_cb_t;
35
36 /*****************************************************************************
37 ** Static variables
38 *****************************************************************************/
39
40 static btif_gatts_srv_chg_cb_t btif_gatts_srv_chg_cb;
41
42 /*****************************************************************************
43 ** Static functions
44 *****************************************************************************/
45
btif_gatts_check_init(void)46 static void btif_gatts_check_init(void)
47 {
48 btif_gatts_srv_chg_cb_t *p_cb= &btif_gatts_srv_chg_cb;
49
50 if (!p_cb->enable)
51 {
52 memset(p_cb, 0, sizeof(btif_gatts_srv_chg_cb_t));
53 p_cb->enable = TRUE;
54 }
55 }
56
btif_gatts_srv_chg(tBTA_GATTS_SRV_CHG_CMD cmd,tBTA_GATTS_SRV_CHG_REQ * p_req,tBTA_GATTS_SRV_CHG_RSP * p_rsp)57 static BOOLEAN btif_gatts_srv_chg(tBTA_GATTS_SRV_CHG_CMD cmd,
58 tBTA_GATTS_SRV_CHG_REQ *p_req,
59 tBTA_GATTS_SRV_CHG_RSP *p_rsp)
60 {
61 BOOLEAN status = TRUE;
62 BOOLEAN found = FALSE;
63 UINT8 i, j, idx, last_idx;
64 btif_gatts_srv_chg_cb_t *p_cb = &btif_gatts_srv_chg_cb;
65
66 btif_gatts_check_init();
67
68 switch (cmd)
69 {
70 case BTA_GATTS_SRV_CHG_CMD_ADD_CLIENT:
71
72 if (p_cb->num_clients < BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE)
73 {
74 memcpy(&p_cb->srv_chg[p_cb->num_clients], &p_req->srv_chg, sizeof(tBTA_GATTS_SRV_CHG));
75 p_cb->num_clients++;
76 } else {
77 status = FALSE;
78 }
79 break;
80
81 case BTA_GATTS_SRV_CHG_CMD_UPDATE_CLIENT:
82
83 for (i=0; i != p_cb->num_clients; ++i)
84 {
85 if (!memcmp(p_cb->srv_chg[i].bda, p_req->srv_chg.bda, sizeof(BD_ADDR)))
86 {
87 found = TRUE;
88 memcpy(&p_cb->srv_chg[i], &p_req->srv_chg, sizeof(tBTA_GATTS_SRV_CHG));
89 break;
90 }
91 }
92
93 if (!found)
94 status = FALSE;
95 break;
96
97 case BTA_GATTS_SRV_CHG_CMD_REMOVE_CLIENT:
98
99 for (i=0; i != p_cb->num_clients; ++i)
100 {
101 if (!memcmp(p_cb->srv_chg[i].bda, p_req->srv_chg.bda, sizeof(BD_ADDR)))
102 {
103 found = TRUE;
104 last_idx = p_cb->num_clients - 1;
105
106 if (i != last_idx )
107 {
108 /* Update the array so there is no gap */
109 for (j=i; j != last_idx; ++j )
110 {
111 memcpy(&p_cb->srv_chg[j], &p_cb->srv_chg[j+1], sizeof(tBTA_GATTS_SRV_CHG));
112 }
113
114 }
115
116 /* Reset the last client and update num_clients */
117 memset(&p_cb->srv_chg[last_idx], 0, sizeof(tBTA_GATTS_SRV_CHG));
118 p_cb->num_clients--;
119 break;
120 }
121 }
122
123 if (!found)
124 status = FALSE;
125 break;
126
127 case BTA_GATTS_SRV_CHG_CMD_READ_NUM_CLENTS:
128 p_rsp->num_clients = p_cb->num_clients;
129 break;
130
131 case BTA_GATTS_SRV_CHG_CMD_READ_CLENT:
132 idx = p_req->client_read_index - 1;
133
134 if (idx < p_cb->num_clients )
135 memcpy(&p_rsp->srv_chg, &p_cb->srv_chg[idx], sizeof(tBTA_GATTS_SRV_CHG));
136 else
137 status = FALSE;
138 break;
139
140 default:
141 status = FALSE;
142 break;
143 }
144
145 return status;
146 }
147
148 /*****************************************************************************
149 ** Externally called functions
150 *****************************************************************************/
151
btif_gatts_add_bonded_dev_from_nv(BD_ADDR bda)152 void btif_gatts_add_bonded_dev_from_nv(BD_ADDR bda)
153 {
154 btif_gatts_srv_chg_cb_t *p_cb= &btif_gatts_srv_chg_cb;
155 BOOLEAN found = FALSE;
156 UINT8 i;
157
158 btif_gatts_check_init();
159
160 for (i=0; i != p_cb->num_clients; ++i)
161 {
162 if (!memcmp(p_cb->srv_chg[i].bda, bda, sizeof(BD_ADDR)))
163 {
164 found = TRUE;
165 break;
166 }
167 }
168
169 if (!found)
170 {
171 if (p_cb->num_clients < BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE)
172 {
173 bdcpy(p_cb->srv_chg[p_cb->num_clients].bda, bda);
174 p_cb->srv_chg[p_cb->num_clients].srv_changed = FALSE;
175 p_cb->num_clients++;
176 }
177 }
178 }
179
180 /*****************************************************************************
181 ** Call-out functions
182 *****************************************************************************/
183
184 /*******************************************************************************
185 **
186 ** Function bta_gatts_co_update_handle_range
187 **
188 ** Description This callout function is executed by GATTS when a GATT server
189 ** handle range ios to be added or removed.
190 **
191 ** Parameter is_add: true is to add a handle range; otherwise is to delete.
192 ** p_hndl_range: handle range.
193 **
194 ** Returns void.
195 **
196 *******************************************************************************/
bta_gatts_co_update_handle_range(BOOLEAN is_add,tBTA_GATTS_HNDL_RANGE * p_hndl_range)197 void bta_gatts_co_update_handle_range(BOOLEAN is_add, tBTA_GATTS_HNDL_RANGE *p_hndl_range)
198 {
199 }
200
201 /*******************************************************************************
202 **
203 ** Function bta_gatts_co_srv_chg
204 **
205 ** Description This call-out is to read/write/remove service change related
206 ** informaiton. The request consists of the cmd and p_req and the
207 ** response is returned in p_rsp
208 **
209 ** Parameter cmd - request command
210 ** p_req - request paramters
211 ** p_rsp - response data for the request
212 **
213 ** Returns TRUE - if the request is processed successfully and
214 ** the response is returned in p_rsp.
215 ** FASLE - if the request can not be processed
216 **
217 *******************************************************************************/
bta_gatts_co_srv_chg(tBTA_GATTS_SRV_CHG_CMD cmd,tBTA_GATTS_SRV_CHG_REQ * p_req,tBTA_GATTS_SRV_CHG_RSP * p_rsp)218 BOOLEAN bta_gatts_co_srv_chg(tBTA_GATTS_SRV_CHG_CMD cmd,
219 tBTA_GATTS_SRV_CHG_REQ *p_req,
220 tBTA_GATTS_SRV_CHG_RSP *p_rsp)
221 {
222 return FALSE;
223 }
224
225 /*******************************************************************************
226 **
227 ** Function bta_gatts_co_load_handle_range
228 **
229 ** Description This callout function is executed by GATTS when a GATT server
230 ** handle range is requested to be loaded from NV.
231 **
232 ** Parameter
233 **
234 ** Returns void.
235 **
236 *******************************************************************************/
bta_gatts_co_load_handle_range(UINT8 index,tBTA_GATTS_HNDL_RANGE * p_handle_range)237 BOOLEAN bta_gatts_co_load_handle_range(UINT8 index,
238 tBTA_GATTS_HNDL_RANGE *p_handle_range)
239 {
240 return FALSE;
241 }
242 #endif
243 #endif
244