FreeCalypso > hg > tcs211-fcmodem
comparison g23m/condat/ms/src/mfw/mfw_bt_dm.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 /* | |
2 +-------------------------------------------------------------------+ | |
3 | PROJECT: MMI-Framework (8445) $Workfile:: mfw_bt_dm.c $| | |
4 | $Author:: NDH $Revision:: 1 $| | |
5 | CREATED: 22.04.04 $Modtime:: 22.04.04 11:07 $| | |
6 | STATE : code | | |
7 +-------------------------------------------------------------------+ | |
8 | |
9 | |
10 MODULE : MFW_BT_DM | |
11 | |
12 PURPOSE : This module contains the functions for MFW Bluetooth Device Manager Profile | |
13 | |
14 | |
15 */ | |
16 | |
17 #define ENTITY_MFW | |
18 | |
19 #include <string.h> | |
20 | |
21 #if defined (NEW_FRAME) | |
22 | |
23 #include "typedefs.h" | |
24 #include "vsi.h" | |
25 #include "pei.h" | |
26 #include "custom.h" | |
27 #include "gsm.h" | |
28 | |
29 #else | |
30 | |
31 #include "STDDEFS.H" | |
32 #include "custom.h" | |
33 #include "gsm.h" | |
34 #include "vsi.h" | |
35 | |
36 #endif | |
37 | |
38 #include "bta_riviera.h" | |
39 #include "mfw_bte.h" | |
40 #include "mfw_bt_dm.h" | |
41 #include "mfw_bt_geh.h" | |
42 #include "mfw_bt_flash.h" | |
43 | |
44 | |
45 T_MFW_BT_CB mfw_bt_cb; | |
46 | |
47 /* file where is stored bd address of the device to connect */ | |
48 #ifndef MFW_BT_BD_ADDR_FILE | |
49 #define MFW_BT_BD_ADDR_FILE "/bt/remote_bd" | |
50 #endif | |
51 | |
52 static T_MFW_BT_STATUS mfw_bt_dm_trust_device(BOOLEAN is_trusted, BD_ADDR bd_addr); | |
53 | |
54 | |
55 /******************************************************************************* | |
56 | |
57 $Function: mfw_bt_dm_set_visibility | |
58 | |
59 $Description: set visibility of local BT device | |
60 | |
61 $Returns: T_MFW_BT_STATUS. Success or fail. | |
62 | |
63 $Arguments: is_visible: new visibility setting. is_temp: define whether it is a temporary | |
64 modification ( TRUE ) or a permanent one ( FALSE ). | |
65 | |
66 *******************************************************************************/ | |
67 T_MFW_BT_STATUS mfw_bt_dm_set_visibility( BOOL is_visible, BOOL is_temp) | |
68 { | |
69 /* other devices will be able to find this device during an inquiry */ | |
70 if( mfw_bt_cb.is_started == TRUE ) | |
71 BTA_DmSetVisibility( (is_visible)?BTA_DM_GENERAL_DISC:BTA_DM_NON_DISC, | |
72 BTA_DM_CONN); | |
73 | |
74 if( is_temp == TRUE) | |
75 /* it looks like this is only a temporary change => don't store that in flash! */ | |
76 return MFW_BT_SUCCESS; | |
77 | |
78 /* update to nvram and mfw_bt_cfg */ | |
79 return mfw_bt_store_visibility( is_visible ); | |
80 } | |
81 | |
82 /******************************************************************************* | |
83 | |
84 $Function: mfw_bt_dm_get_visibility | |
85 | |
86 $Description: get visibility of local BT device | |
87 | |
88 $Returns: TRUE if visible, FALSE if not. | |
89 | |
90 $Arguments: none | |
91 | |
92 *******************************************************************************/ | |
93 BOOL mfw_bt_dm_get_visibility( void ) | |
94 { | |
95 return mfw_bt_read_visibility( ); | |
96 } | |
97 | |
98 | |
99 | |
100 /******************************************************************************* | |
101 | |
102 $Function: mfw_bt_dm_get_local_name | |
103 | |
104 $Description: read local BT device name | |
105 | |
106 $Returns: a pointer to a string. NULL if no name available. One should make a copy of | |
107 string if he wants to use it/modify it. | |
108 | |
109 $Arguments: none | |
110 | |
111 *******************************************************************************/ | |
112 UINT8 * mfw_bt_dm_get_local_name( void ) | |
113 { | |
114 return mfw_bt_read_local_name(); | |
115 } | |
116 | |
117 | |
118 | |
119 | |
120 /******************************************************************************* | |
121 | |
122 $Function: mfw_bt_dm_set_local_name | |
123 | |
124 $Description: set local BT device name | |
125 | |
126 $Returns: T_MFW_BT_STATUS | |
127 | |
128 $Arguments: new name. Pointer to a string. This string is copied locally. Buffer is not freed. | |
129 | |
130 *******************************************************************************/ | |
131 T_MFW_BT_STATUS mfw_bt_dm_set_local_name( INT8 *name ) | |
132 { | |
133 if( strlen((char*)name) == 0 ) | |
134 { | |
135 /* BMI should never ever send back an empty string, except at start-up */ | |
136 if( mfw_bt_cb.is_name_requested == FALSE ) | |
137 return MFW_BT_FAIL; | |
138 | |
139 /* we are here, this means: | |
140 - it's a start-up | |
141 - apparently, the local name was never set. => it's the first start-up | |
142 - the user don't really want to use BT as he cancelled the setting. | |
143 => this means we do want to stop BT... So go for it! :o) */ | |
144 mfw_bt_disable( ); | |
145 return MFW_BT_SUCCESS; | |
146 } | |
147 | |
148 if( mfw_bt_cb.is_name_requested == TRUE ) | |
149 mfw_bt_cb.is_name_requested = FALSE; | |
150 | |
151 if( strlen((char*)name) > MFW_BT_NAME_LENGTH ) | |
152 return MFW_BT_INVALID_DATA; | |
153 | |
154 if( mfw_bt_cb.is_started ) | |
155 BTA_DmSetDeviceName( (char*)name ); | |
156 /* update to nv memory and mfw_bt_cfg with new name */ | |
157 return mfw_bt_store_local_name( (char*) name ); | |
158 } | |
159 | |
160 /******************************************************************************* | |
161 | |
162 $Function: mfw_bt_dm_get_bt_status | |
163 | |
164 $Description: get the status of the local Bluetooth system. Used at start-up to decide whether | |
165 or not we want BT to be started by default. | |
166 | |
167 $Returns: MFW_BT_SUCCESS is BT is started. 0 if OFF | |
168 | |
169 $Arguments: | |
170 | |
171 *******************************************************************************/ | |
172 BOOL mfw_bt_dm_get_bt_status( void ) | |
173 { | |
174 return mfw_bt_read_status( ); | |
175 | |
176 } | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 /******************************************************************************* | |
183 | |
184 $Function: mfw_bt_dm_pin_code | |
185 | |
186 $Description: used by BMI to send back a pin code | |
187 | |
188 $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED is BT is not started. | |
189 | |
190 $Arguments: pin code and pin code length. This data is copied. | |
191 | |
192 *******************************************************************************/ | |
193 T_MFW_BT_STATUS mfw_bt_dm_pin_code(UINT8* pin_code, UINT8 pin_len) | |
194 { | |
195 BOOLEAN accept = TRUE; | |
196 | |
197 if( mfw_bt_cb.is_started != TRUE ) | |
198 return MFW_BT_NOT_INITIALISED; | |
199 | |
200 if(pin_len == 0) | |
201 accept = FALSE; | |
202 BTA_DmPinReply( mfw_bt_cb.peer_bdaddr, | |
203 accept, | |
204 pin_len, | |
205 pin_code); | |
206 | |
207 return MFW_BT_SUCCESS; | |
208 } | |
209 | |
210 | |
211 | |
212 /******************************************************************************* | |
213 | |
214 $Function: mfw_bt_dm_bond | |
215 | |
216 $Description: used by BMI to send a pin code in order to establish a bonding with a | |
217 remote device. | |
218 | |
219 $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED is BT is not started. | |
220 | |
221 | |
222 $Arguments: BD_ADDR of the remote device, pin code and pin code length. Data is copied. | |
223 | |
224 *******************************************************************************/ | |
225 T_MFW_BT_STATUS mfw_bt_dm_bond(BD_ADDR bd_addr, UINT8* pin_code, UINT8 pin_len ) | |
226 { | |
227 if( mfw_bt_cb.is_started != TRUE ) | |
228 return MFW_BT_NOT_INITIALISED; | |
229 | |
230 | |
231 MFW_BT_TRACE("try to bond with stored device"); | |
232 if(pin_len != 0) | |
233 { | |
234 /* now tell the BT stack */ | |
235 BTA_DmBond ( bd_addr, pin_len, pin_code ); | |
236 return MFW_BT_SUCCESS; | |
237 } | |
238 else | |
239 { | |
240 MFW_BT_TRACE(" [ mfw_bt dm bond]: no pin code entered!"); | |
241 return MFW_BT_FAIL; | |
242 } | |
243 | |
244 } | |
245 | |
246 | |
247 /******************************************************************************* | |
248 | |
249 $Function: mfw_bt_dm_authorize_resp | |
250 | |
251 $Description: used to answer to an authorization request | |
252 | |
253 $Returns: T_MFW_BT_STATUS. SUCCESS/FAIL, but also: | |
254 MFW_BT_NOT_INITIALISED is BT is not started. | |
255 MFW_BT_INVALID_DATA if auth value is not correct. | |
256 MFW_BT_UNKNOWN_DEVICE if BD_addr is not recognized. | |
257 MFW_BT_DATA_BASE_FULL if there are already too many devices in the DB. | |
258 | |
259 | |
260 $Arguments: MFW_BT_AUTH_FAIL to refuse, | |
261 MFW_BT_AUTH_ONCE to grant access temporarily, | |
262 MFW_BT_AUTH_ALWAYS to grant permanent access | |
263 | |
264 *******************************************************************************/ | |
265 T_MFW_BT_STATUS mfw_bt_dm_authorize_resp( T_MFW_BT_AUTHORIZE auth) | |
266 { | |
267 T_MFW_BT_STATUS status; | |
268 | |
269 if( mfw_bt_cb.is_started != TRUE ) | |
270 return MFW_BT_NOT_INITIALISED; | |
271 | |
272 switch (auth) | |
273 { | |
274 case MFW_BT_AUTH_FAIL: | |
275 /* reject */ | |
276 BTA_DmAuthorizeReply( mfw_bt_cb.peer_bdaddr, | |
277 mfw_bt_cb.peer_service, | |
278 BTA_DM_NOT_AUTH); | |
279 mfw_bt_dm_trust_device( FALSE, mfw_bt_cb.peer_bdaddr ); | |
280 break; | |
281 | |
282 case MFW_BT_AUTH_ALWAYS: | |
283 /* | |
284 ** CQ22024 : Set the device as Trusted, and Authorise it for this an all subsequent connections | |
285 ** If writing to the Flash fails, proceed with the authorisation anyway. | |
286 */ | |
287 status = mfw_bt_dm_trust_device( TRUE, mfw_bt_cb.peer_bdaddr ); | |
288 | |
289 /* | |
290 ** Even if we fail to write the information to the FLASH, we should continue with the | |
291 ** Authorisation procedure. If the device is unknown, the device will remain Authorised as | |
292 ** long as the Handset is not powered down (Not ideal, but better than refusing Authorisation all together) | |
293 */ | |
294 BTA_DmAuthorizeReply( mfw_bt_cb.peer_bdaddr, | |
295 mfw_bt_cb.peer_service, | |
296 BTA_DM_AUTH_PERM); | |
297 break; | |
298 | |
299 case MFW_BT_AUTH_ONCE: | |
300 /* CQ22024 : tell the BT stack we authorize the device, but for this connection only */ | |
301 BTA_DmAuthorizeReply( mfw_bt_cb.peer_bdaddr, | |
302 mfw_bt_cb.peer_service, | |
303 BTA_DM_AUTH_TEMP); | |
304 break; | |
305 | |
306 default: | |
307 return MFW_BT_INVALID_DATA; | |
308 } | |
309 return MFW_BT_SUCCESS; | |
310 } | |
311 | |
312 | |
313 /******************************************************************************* | |
314 | |
315 $Function: mfw_bt_dm_sig_strength | |
316 | |
317 $Description: ask for the link quality | |
318 | |
319 $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED if BT is not started. | |
320 | |
321 $Arguments: T_MFW_BT_DM_SIG_STRENGTH sig_strength, UINT16 period, BOOLEAN is_on | |
322 See BTA documentation for more details. | |
323 | |
324 *******************************************************************************/ | |
325 T_MFW_BT_STATUS mfw_bt_dm_sig_strength ( T_MFW_BT_DM_SIG_STRENGTH sig_strength, | |
326 UINT16 period, | |
327 BOOLEAN is_on ) | |
328 { | |
329 if( mfw_bt_cb.is_started != TRUE ) | |
330 return MFW_BT_NOT_INITIALISED; | |
331 BTA_DmSignalStrength((tBTA_SIG_STRENGTH_MASK) sig_strength, period, is_on); | |
332 return MFW_BT_SUCCESS; | |
333 } | |
334 | |
335 | |
336 /******************************************************************************* | |
337 | |
338 $Function: mfw_bt_dm_get_known_devices | |
339 | |
340 $Description: used by BMI to get the list of known devices for a specified condition: either a | |
341 service mask, either a bd address ( union ). | |
342 MFW will fill in the variables: pp_device => table of known devices | |
343 number_of_devices => number of devices. | |
344 MFW will allocate memory for each device found. It's up to BMI to free it! | |
345 | |
346 $Returns: T_MFW_BT_STATUS. | |
347 If BD_ADDR is specified, might return MFW_BT_UNKNOWN_DEVICE. | |
348 The answers will be returned using BMI signals: | |
349 - E_BT_DM_INQ_CMPL with the number of devices | |
350 - E_BT_DM_DISC_RES for each device | |
351 - then E_BT_DM_DISC_CMPL when it's done. | |
352 | |
353 $Arguments: BD_ADDR if looking for a particular device. services if looking for a | |
354 category of device. If bd_addr is specified, ignore services. If services set | |
355 to 0, will return all the known devices. | |
356 | |
357 *******************************************************************************/ | |
358 void mfw_bt_dm_get_known_devices ( BD_ADDR bd_addr, | |
359 T_MFW_BT_SERVICE_MASK services) | |
360 { | |
361 T_MFW_BT_REM_DEVICE *ptr_db_device[MFW_BT_NUM_REM_DEVICE]; | |
362 UINT8 i, number_of_devices; | |
363 T_MFW_BT_DM_INQ_CMPL inq_cmpl_res; | |
364 T_MFW_BT_STATUS status; | |
365 BD_ADDR null_bd_addr; | |
366 | |
367 number_of_devices = 0; | |
368 memset(&null_bd_addr[0], 0x00, sizeof(BD_ADDR)); | |
369 | |
370 /* we have a BT address, try to find the related data */ | |
371 /* CQ21834 : cannot treat bd_addr as a pointer, because it is passed by value. Use MemCmp */ | |
372 if( memcmp(&bd_addr[0], &null_bd_addr[0], sizeof(BD_ADDR)) != 0 ) | |
373 { | |
374 ptr_db_device[0] = mfw_bt_get_device_info(bd_addr); | |
375 | |
376 if(ptr_db_device[0] != NULL) | |
377 { | |
378 if((ptr_db_device[0])->is_new == FALSE) | |
379 number_of_devices = 1; | |
380 } | |
381 } | |
382 else | |
383 { | |
384 /* Now we want to find all the devices which support the given services */ | |
385 mfw_bt_get_device_by_service(services, &ptr_db_device[0], &number_of_devices ); | |
386 } | |
387 | |
388 /* first send the number of found devices. this is important! BMI shouldn't do anything | |
389 before he gets all the answer */ | |
390 inq_cmpl_res.num_resps = number_of_devices; | |
391 mfw_bt_signal( E_BT_DM_INQ_CMPL, (void*)&inq_cmpl_res); | |
392 | |
393 if (number_of_devices > 0) | |
394 { | |
395 /* | |
396 ** CQ21834 : The incorrect structure was being used for the signal, so the data was never received by the BMI. | |
397 */ | |
398 T_MFW_BT_DM_DISC_RES disc_res; | |
399 | |
400 /* now for each device found, send a signal to BMI. This will copy the data! */ | |
401 for( i=0; i<number_of_devices; i++ ) | |
402 { | |
403 memcpy((void *)&disc_res, (void *)ptr_db_device[i], sizeof(disc_res)); | |
404 | |
405 mfw_bt_signal( E_BT_DM_DISC_RES, (void *)&disc_res); | |
406 } | |
407 | |
408 mfw_bt_signal( E_BT_DM_DISC_CMPL, NULL); | |
409 } | |
410 | |
411 return; | |
412 | |
413 } | |
414 | |
415 | |
416 | |
417 | |
418 | |
419 | |
420 | |
421 /******************************************************************************* | |
422 | |
423 $Function: mfw_bt_dm_trust_device | |
424 | |
425 $Description: specify whether a remote device should or not be trusted ( => access granted ) | |
426 | |
427 $Returns: T_MFW_BT_STATUS | |
428 success, failure, MFW_BT_UNKNOWN_DEVICE | |
429 | |
430 $Arguments: BOOLEAN for the permission; BD address of the remote device | |
431 | |
432 *******************************************************************************/ | |
433 T_MFW_BT_STATUS mfw_bt_dm_trust_device(BOOLEAN is_trusted, BD_ADDR bd_addr) | |
434 { | |
435 T_MFW_BT_REM_DEVICE * p_device; | |
436 T_MFW_BT_STATUS status; | |
437 | |
438 /* check if we know this device*/ | |
439 if(( p_device = mfw_bt_get_device_info(bd_addr)) == NULL ) | |
440 /* unknown device... */ | |
441 return MFW_BT_UNKNOWN_DEVICE; | |
442 | |
443 p_device->is_trusted = is_trusted; | |
444 if (( status = mfw_bt_flash_store_device(p_device)) != MFW_BT_SUCCESS ) | |
445 return status; | |
446 | |
447 /* update BTA with new settings */ | |
448 if( mfw_bt_cb.is_started ) | |
449 { | |
450 if(p_device->link_key_present) | |
451 BTA_DmAddDevice(bd_addr, p_device->link_key, BTA_ALL_SERVICE_MASK, is_trusted); | |
452 else | |
453 BTA_DmAddDevice(bd_addr, NULL, BTA_ALL_SERVICE_MASK, is_trusted); | |
454 } | |
455 | |
456 return MFW_BT_SUCCESS; | |
457 } | |
458 | |
459 | |
460 | |
461 /******************************************************************************* | |
462 | |
463 $Function: mfw_bt_dm_delete_device | |
464 | |
465 $Description: remove a device from the local DB | |
466 | |
467 $Returns: T_MFW_BT_STATUS ( MFW_BT_SUCCESS, MFW_BT_FAIL, MFW_BT_UNKNOWN_DEVICE ) | |
468 | |
469 $Arguments: BD address | |
470 | |
471 *******************************************************************************/ | |
472 T_MFW_BT_STATUS mfw_bt_dm_delete_device(BD_ADDR bd_addr) | |
473 { | |
474 if( mfw_bt_cb.is_started ) | |
475 BTA_DmRemoveDevice (bd_addr); | |
476 return mfw_bt_flash_delete_device(bd_addr); | |
477 } | |
478 | |
479 | |
480 | |
481 /******************************************************************************* | |
482 | |
483 $Function: mfw_bt_dm_add_device | |
484 | |
485 $Description: This will store permanently a device in Flash. | |
486 | |
487 $Returns: T_MFW_BT_STATUS | |
488 errors: MFW_BT_UNKNOWN_DEVICE, MFW_BT_DATA_BASE_FULL, | |
489 | |
490 | |
491 $Arguments: new BD address | |
492 | |
493 *******************************************************************************/ | |
494 T_MFW_BT_STATUS mfw_bt_dm_add_device(BD_ADDR bd_addr) | |
495 { | |
496 T_MFW_BT_REM_DEVICE *p_device; | |
497 T_MFW_BT_STATUS status; | |
498 | |
499 MFW_BT_TRACE("mfw_bt_dm_add_device()"); | |
500 | |
501 /* get the info about this device */ | |
502 if( ( p_device = mfw_bt_get_device_info( bd_addr)) == NULL) | |
503 return MFW_BT_UNKNOWN_DEVICE; | |
504 | |
505 if( p_device->is_new == TRUE ) | |
506 { | |
507 /* | |
508 ** CQ21834 : Ensure that the is_new value is set before writing the data to Flash, so that it will be | |
509 ** set correctly when the handset is restarted. | |
510 */ | |
511 p_device->is_new = FALSE; | |
512 if((status = mfw_bt_flash_store_device(p_device))!=MFW_BT_SUCCESS) | |
513 return status; | |
514 } | |
515 | |
516 /* update BTA device database */ | |
517 if( mfw_bt_cb.is_started ) | |
518 { | |
519 if(p_device->link_key_present) | |
520 BTA_DmAddDevice(p_device->bd_addr, p_device->link_key, | |
521 p_device->trusted_services, p_device->is_trusted); | |
522 else | |
523 BTA_DmAddDevice(p_device->bd_addr, NULL, | |
524 p_device->trusted_services, p_device->is_trusted); | |
525 } | |
526 return MFW_BT_SUCCESS; | |
527 | |
528 } | |
529 | |
530 | |
531 | |
532 /******************************************************************************* | |
533 | |
534 $Function: mfw_bt_dm_rename_device | |
535 | |
536 $Description: modify the friendly name of a known ( already stored ) remote device | |
537 | |
538 $Returns: T_MFW_BT_STATUS. | |
539 MFW_BT_UNKNOWN_DEVICE, DATA_BASE_FULL, MFW_BT_INVALID_DATA... | |
540 | |
541 $Arguments: bd address of the remote device and the new name associated | |
542 | |
543 *******************************************************************************/ | |
544 T_MFW_BT_STATUS mfw_bt_dm_rename_device(BD_ADDR bd_addr, UINT8* new_name) | |
545 { | |
546 T_MFW_BT_REM_DEVICE *p_device; | |
547 | |
548 if( ( p_device = mfw_bt_get_device_info( bd_addr)) == NULL ) | |
549 return MFW_BT_UNKNOWN_DEVICE; | |
550 /* if this device is new ( == in the inq DB ), we don't want to do anything */ | |
551 if( p_device->is_new == TRUE ) | |
552 return MFW_BT_FAIL; | |
553 /* verify the string is OK */ | |
554 if( strlen( (char*)new_name ) > MFW_BT_NAME_LENGTH ) | |
555 return MFW_BT_INVALID_DATA; | |
556 strcpy(p_device->friendly_name, (char*)new_name ); | |
557 return mfw_bt_flash_store_device(p_device); | |
558 | |
559 } | |
560 | |
561 | |
562 | |
563 | |
564 | |
565 | |
566 /* | |
567 ** Functions used to interact with the BT "search engine" | |
568 */ | |
569 | |
570 | |
571 /******************************************************************************* | |
572 | |
573 $Function: mfw_bt_dm_discover_device | |
574 | |
575 $Description: Discovers services on a device | |
576 | |
577 $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED if BT not started. | |
578 | |
579 $Arguments: bd address of the remote device to discover | |
580 | |
581 *******************************************************************************/ | |
582 T_MFW_BT_STATUS mfw_bt_dm_discover_device(BD_ADDR bd_addr) | |
583 { | |
584 | |
585 T_MFW_BT_SERVICE_MASK client_services; | |
586 | |
587 if( mfw_bt_cb.is_started != TRUE ) | |
588 return MFW_BT_NOT_INITIALISED; | |
589 | |
590 /* remember it's an inquiry */ | |
591 mfw_bt_cb.is_discovery = TRUE; | |
592 | |
593 /* we need to find only services for which we can be in client role, plus HS/HF */ | |
594 client_services = ((BTA_SUPPORTED_CLIENT_SERVICES & \ | |
595 ~( BTA_DUN_SERVICE_MASK | BTA_FAX_SERVICE_MASK )) \ | |
596 | BTA_HSP_SERVICE_MASK | BTA_HFP_SERVICE_MASK ); | |
597 | |
598 BTA_DmDiscover(bd_addr, BTA_ALL_SERVICE_MASK, (tBTA_DM_SEARCH_CBACK*)mfw_bt_dm_search_cb); | |
599 | |
600 return MFW_BT_SUCCESS; | |
601 } | |
602 | |
603 | |
604 /******************************************************************************* | |
605 | |
606 $Function: mfw_bt_dm_is_discover | |
607 | |
608 $Description: Checks if we are in discovering services process | |
609 | |
610 $Returns: | |
611 | |
612 $Arguments: None | |
613 | |
614 *******************************************************************************/ | |
615 UINT8 mfw_bt_dm_is_discover(void) | |
616 { | |
617 return mfw_bt_cb.is_discovery; | |
618 } | |
619 | |
620 | |
621 | |
622 /******************************************************************************* | |
623 | |
624 $Function: mfw_bt_dm_cancel_search | |
625 | |
626 $Description: cancel an ongoing search | |
627 | |
628 $Returns: MFW_BT_NOT_INITIALISED if BT not started. | |
629 | |
630 $Arguments: | |
631 | |
632 *******************************************************************************/ | |
633 T_MFW_BT_STATUS mfw_bt_dm_cancel_search( void ) | |
634 { | |
635 if( mfw_bt_cb.is_started != TRUE ) | |
636 return MFW_BT_NOT_INITIALISED; | |
637 BTA_DmSearchCancel(); | |
638 return MFW_BT_SUCCESS; | |
639 } | |
640 | |
641 | |
642 /******************************************************************************* | |
643 | |
644 $Function: mfw_bt_dm_search | |
645 | |
646 $Description: Searches for devices supporting the services specified. If services = 0, will | |
647 return all the found devices regardless of their functionalities. | |
648 | |
649 $Returns: MFW_BT_NOT_INITIALISED if BT not started. | |
650 | |
651 $Arguments: services. If | |
652 | |
653 *******************************************************************************/ | |
654 T_MFW_BT_STATUS mfw_bt_dm_search(T_MFW_BT_SERVICE_MASK services) | |
655 { | |
656 tBTA_DM_INQ inq_params; | |
657 UINT8 inq_index; | |
658 | |
659 if( mfw_bt_cb.is_started != TRUE ) | |
660 return MFW_BT_NOT_INITIALISED; | |
661 mfw_bt_cb.is_discovery = FALSE; | |
662 inq_params.mode = 0; | |
663 inq_params.duration = MFW_BT_DEFAULT_INQ_DURATION; | |
664 inq_params.max_resps = MFW_BT_NUM_REM_DEVICE; | |
665 inq_params.filter_type = BTA_DM_INQ_CLR; | |
666 | |
667 /* "initialize" the inquiry data base */ | |
668 mfw_bt_clean_inq_db( ); | |
669 /* store the services we are looking for, so that we can filter the results */ | |
670 mfw_bt_cb.search_services = services; | |
671 /* find nearby devices */ | |
672 BTA_DmSearch(&inq_params, services, mfw_bt_dm_search_cb ); | |
673 return MFW_BT_SUCCESS; | |
674 | |
675 } | |
676 | |
677 | |
678 | |
679 | |
680 /* | |
681 ** MFW Bluetooth Device Manager Signal Handler Function Definitions | |
682 */ | |
683 /******************************************************************************* | |
684 | |
685 $Function: mfw_bt_dm_security_hndlr | |
686 | |
687 $Description: This function recieves the BTA DM Security events from the Generic Event Handler | |
688 and either processes them in their entirety or passes them to the MMI for further | |
689 processing. | |
690 | |
691 $Returns: MFW_BT_SUCCESS : The signal was handled successfully | |
692 | |
693 $Arguments: event : Event Id returned from the Bluetooth Module | |
694 data : pointer to the relevant data returned from the Mluetooth Module | |
695 | |
696 *******************************************************************************/ | |
697 T_MFW_BT_STATUS mfw_bt_dm_security_hndlr (T_MFW_BT_DM_SEC_EVT event, T_MFW_BT_DM_SEC_SIG_DATA *data) | |
698 { | |
699 T_MFW_BT_STATUS retVal = MFW_BT_SUCCESS; | |
700 | |
701 MFW_BT_TRACE("mfw_bt_dm_security_hndlr"); | |
702 | |
703 switch (event) | |
704 { | |
705 case BTA_DM_SYS_START_EVT: | |
706 { | |
707 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_SYS_START_EVT event received"); | |
708 /* now enable bluetooth functionalities before calling other BTA API */ | |
709 BTA_EnableBluetooth(&mfw_bt_dm_security_cb); | |
710 } | |
711 break; | |
712 | |
713 case BTA_DM_ENABLE_EVT: | |
714 { | |
715 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_ENABLE_EVT event received"); | |
716 /* call the enable call-back */ | |
717 mfw_bt_enable_cb( ); | |
718 } | |
719 break; | |
720 | |
721 case BTA_DM_DISABLE_EVT: | |
722 { | |
723 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_DISABLE_EVT event received"); | |
724 | |
725 /* stop the BT chipset */ | |
726 BTA_SysStop(); | |
727 | |
728 /* we won't use BT anymore => free the event handler */ | |
729 mfw_bt_ge_disable(); | |
730 | |
731 /* store the new settings */ | |
732 mfw_bt_store_status(FALSE); | |
733 mfw_bt_cb.is_started = FALSE; | |
734 | |
735 /* and tell BMI */ | |
736 mfw_bt_signal(E_BT_DISABLE_CMPL, (void *)0); | |
737 } | |
738 break; | |
739 | |
740 case BTA_DM_PIN_REQ_EVT: | |
741 { | |
742 /* store the BD ADDR of the remote device */ | |
743 bdcpy(mfw_bt_cb.peer_bdaddr, data->pin_req.bd_addr); | |
744 /* and forward the signal to BMI */ | |
745 mfw_bt_signal(E_BT_DM_PIN_REQ, data); | |
746 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_PIN_REQ_EVT event received"); | |
747 } | |
748 break; | |
749 | |
750 case BTA_DM_AUTH_CMPL_EVT: | |
751 { | |
752 T_MFW_BT_DM_AUTH_CMPL data_auth; | |
753 T_MFW_BT_REM_DEVICE device; | |
754 T_MFW_BT_REM_DEVICE *p_device; | |
755 | |
756 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_AUTH_CMPL_EVT event received"); | |
757 /* first, give some feedback to BMI */ | |
758 /* => copy data */ | |
759 memcpy(data_auth.bd_addr, data->auth_cmpl.bd_addr, BD_ADDR_LEN); | |
760 if( strlen((char*)data->auth_cmpl.bd_name) != 0 ) | |
761 mfwStrncpy((char*)data_auth.bd_name, (const char*)data->auth_cmpl.bd_name, MFW_BT_NAME_LENGTH); | |
762 data_auth.is_success = data->auth_cmpl.success; | |
763 /* and forward it */ | |
764 mfw_bt_signal(E_BT_DM_AUTH_CMPL, (void*)&data_auth); | |
765 | |
766 /* now see if we have to update our data base */ | |
767 p_device = mfw_bt_get_device_info(data->auth_cmpl.bd_addr); | |
768 if( p_device == NULL ) | |
769 { | |
770 /* we don't know this device ... */ | |
771 if ( data->auth_cmpl.success == FALSE ) | |
772 /* ... and auth has been rejected: get away from here... */ | |
773 break; | |
774 | |
775 /* ... but it's trusted. So add it to our DB. This means we have to create a | |
776 real T_MFW_BT_REM_DEVICE entity, which will be copied */ | |
777 p_device = &device; | |
778 memset(&device, 0, sizeof( T_MFW_BT_REM_DEVICE ) ); | |
779 } | |
780 | |
781 /* ok, now update our local DB: get the info we received */ | |
782 memcpy(p_device->bd_addr, data->auth_cmpl.bd_addr, BD_ADDR_LEN); | |
783 if( strlen((char*)data->auth_cmpl.bd_name) != 0 ) | |
784 mfwStrncpy((char*)p_device->name, (const char*)data->auth_cmpl.bd_name, MFW_BT_NAME_LENGTH); | |
785 memcpy(p_device->link_key, data->auth_cmpl.key, LINK_KEY_LEN ); | |
786 p_device->link_key_present = data->auth_cmpl.key_present; | |
787 | |
788 /* we don't modify the other fields => either the already stored ones will be used, | |
789 either for a new device they will be set to zero. */ | |
790 | |
791 mfw_bt_flash_store_device( p_device ); | |
792 } | |
793 break; | |
794 | |
795 case BTA_DM_AUTHORIZE_EVT: | |
796 { | |
797 /* keep a trace of the information??? */ | |
798 bdcpy(mfw_bt_cb.peer_bdaddr, data->authorize.bd_addr); | |
799 strncpy((char*)mfw_bt_cb.peer_name, (char*)data->authorize.bd_name, MFW_BT_NAME_LENGTH); | |
800 mfw_bt_cb.peer_service = data->authorize.service; | |
801 /*and forward it to BMI */ | |
802 mfw_bt_signal(E_BT_DM_AUTHORIZE_REQ, data ); | |
803 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_AUTHORIZE_EVT event received"); | |
804 } | |
805 break; | |
806 | |
807 case BTA_DM_LINK_UP_EVT: | |
808 { | |
809 /* this is only a "HW" connection, so no service or name needed. Just show BT is busy */ | |
810 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_LINK_UP_EVT event received"); | |
811 mfw_bt_signal(E_BT_DM_LINK_UP, data ); | |
812 } | |
813 break; | |
814 | |
815 case BTA_DM_LINK_DOWN_EVT: | |
816 { | |
817 /* just to know BT is idle again */ | |
818 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_LINK_DOWN_EVT event received"); | |
819 mfw_bt_signal(E_BT_DM_LINK_DOWN, data ); | |
820 } | |
821 break; | |
822 | |
823 case BTA_DM_SIG_STRENGTH_EVT: | |
824 { | |
825 /* ok, we receive a signal strength indication. Great. */ | |
826 MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_SIG_STRENGTH_EVT event received"); | |
827 mfw_bt_signal(E_BT_DM_SIG_STRENGTH_IND, data ); | |
828 } | |
829 break; | |
830 | |
831 default: | |
832 { | |
833 /* | |
834 ** Unexpected Event, set the data sized to -1 to exit with no further action | |
835 */ | |
836 MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Unexpected Event %d", event); | |
837 retVal = MFW_BT_INVALID_EVENT; | |
838 } | |
839 break; | |
840 | |
841 } | |
842 | |
843 return retVal; | |
844 } | |
845 | |
846 | |
847 | |
848 | |
849 /******************************************************************************* | |
850 | |
851 $Function: mfw_bt_dm_search_hndlr | |
852 | |
853 $Description: This function recieves the BTA DM Search events from the Generic Event Handler | |
854 and either processes them in their entirety or passes them to the MMI for further | |
855 processing. | |
856 | |
857 $Returns: MFW_BT_SUCCESS : The signal was handled successfully | |
858 | |
859 $Arguments: event : Event Id returned from the Bluetooth Module | |
860 data : pointer to the relevant data returned from the Mluetooth Module | |
861 | |
862 *******************************************************************************/ | |
863 T_MFW_BT_STATUS mfw_bt_dm_search_hndlr (T_MFW_BT_DM_SRCH_EVT event, T_MFW_BT_DM_SRCH_SIG_DATA *data) | |
864 { | |
865 T_MFW_BT_STATUS retVal = MFW_BT_SUCCESS; | |
866 | |
867 MFW_BT_TRACE("mfw_bt_dm_search_hndlr"); | |
868 | |
869 /* | |
870 ** Set the expected data size according to the received event | |
871 */ | |
872 switch (event) | |
873 { | |
874 case BTA_DM_INQ_RES_EVT: | |
875 { | |
876 MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_INQ_RES_EVT event received"); | |
877 /* we just received a BD address... Don't even forward this to BMI */ | |
878 MFW_BT_TRACE_P6("DB_ADDR: msg_str%02x:%02x:%02x:%02x:%02x:%02x\n", | |
879 data->inq_res.bd_addr[0], data->inq_res.bd_addr[1], | |
880 data->inq_res.bd_addr[2], data->inq_res.bd_addr[3], | |
881 data->inq_res.bd_addr[4], data->inq_res.bd_addr[5]); | |
882 mfw_bt_add_inq_device( &(data->inq_res) ); | |
883 } | |
884 break; | |
885 | |
886 case BTA_DM_INQ_CMPL_EVT: | |
887 mfw_bt_signal( E_BT_DM_INQ_CMPL, (void*)&data->inq_cmpl); | |
888 MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_INQ_CMPL_EVT event received"); | |
889 break; | |
890 | |
891 case BTA_DM_DISC_RES_EVT: | |
892 { | |
893 T_MFW_BT_DM_DISC_RES disc_res_data; | |
894 T_MFW_BT_REM_DEVICE *p_device_rec = NULL; /*CQ21834 : Not Just needed for discovery, but search also */ | |
895 | |
896 /* | |
897 ** Do some preliminary initialisation, so that if nothing changes we send the right information | |
898 */ | |
899 memset(&disc_res_data, 0x00, sizeof(T_MFW_BT_DM_DISC_RES)); | |
900 | |
901 memcpy(disc_res_data.bd_addr, data->disc_res.bd_addr, sizeof(BD_ADDR)); | |
902 memcpy(disc_res_data.name, data->disc_res.bd_name, MFW_BT_NAME_LENGTH); | |
903 disc_res_data.services = data->disc_res.services; | |
904 disc_res_data.is_new = TRUE; | |
905 | |
906 /* if we are doing a discovery on a device */ | |
907 if(mfw_bt_cb.is_discovery == TRUE) | |
908 { | |
909 if(data->disc_res.services == 0 ) | |
910 { | |
911 MFW_BT_TRACE("No service found"); | |
912 } | |
913 else | |
914 { | |
915 p_device_rec = mfw_bt_get_device_info(data->disc_res.bd_addr ); | |
916 if(p_device_rec) | |
917 { | |
918 /* we really should find our device! */ | |
919 p_device_rec->services = data->disc_res.services; | |
920 | |
921 if( p_device_rec->is_new) | |
922 mfw_bt_add_disc_device((T_MFW_BT_DM_DISC_RES*) p_device_rec); | |
923 else | |
924 mfw_bt_flash_store_device(p_device_rec); | |
925 /* forward the info to BMI */ | |
926 | |
927 /* | |
928 ** Reset the information for the signal from the known or already discovered database | |
929 */ | |
930 memcpy(&disc_res_data, p_device_rec, sizeof(T_MFW_BT_DM_DISC_RES)); | |
931 } | |
932 } | |
933 } | |
934 /* we are doing device search. We receive the information about all the found devices. | |
935 Let's verify if we specified services to look for => if yes, filter the results */ | |
936 else if( mfw_bt_cb.search_services == 0 || | |
937 (mfw_bt_cb.search_services & data->disc_res.services)) | |
938 { | |
939 /* | |
940 ** CQ21834 : Check to determine whether the device is already known, if so get (and update) | |
941 ** the information in th eKnown Devices Database | |
942 */ | |
943 p_device_rec = mfw_bt_get_device_info(data->disc_res.bd_addr ); | |
944 | |
945 /* | |
946 ** p_device_rec should not be NULL because the device was added to the inquiry database when the inq result | |
947 ** was recieved if it was not already in the known device database. | |
948 */ | |
949 if (p_device_rec->is_new == FALSE) | |
950 { | |
951 MFW_BT_TRACE("BTA_DM_DISC_RES_EVT > This device is known"); | |
952 | |
953 if (strncmp(p_device_rec->name, (char *)&data->disc_res.bd_name, MFW_BT_NAME_LENGTH) != 0) | |
954 { | |
955 mfwStrncpy(p_device_rec->name, (char *)&data->disc_res.bd_name, MFW_BT_NAME_LENGTH); | |
956 } | |
957 | |
958 /* Update the device details! */ | |
959 p_device_rec->services |= data->disc_res.services; | |
960 mfw_bt_flash_store_device(p_device_rec); | |
961 | |
962 memcpy(&disc_res_data, p_device_rec, sizeof(T_MFW_BT_DM_DISC_RES)); | |
963 } | |
964 | |
965 /* | |
966 ** CQ21834: update our database whether the device is known or not, so that if the user removes it from the | |
967 ** known device database, we will still have the details available. | |
968 */ | |
969 mfw_bt_add_disc_device( (T_MFW_BT_DM_DISC_RES*) &disc_res_data); | |
970 } | |
971 | |
972 MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_DISC_RES_EVT event received"); | |
973 /* and forward the event to BMI */ | |
974 mfw_bt_signal( E_BT_DM_DISC_RES, (void*)&disc_res_data); | |
975 } | |
976 break; | |
977 | |
978 case BTA_DM_DISC_CMPL_EVT: | |
979 mfw_bt_signal( E_BT_DM_DISC_CMPL, NULL ); | |
980 MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_DISC_CMPL_EVT event received"); | |
981 break; | |
982 | |
983 case BTA_DM_SEARCH_CANCEL_CMPL_EVT: | |
984 /* currently, we don't do anything when a search is cancelled. Should we? */ | |
985 MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_SEARCH_CANCEL_CMPL_EVT event received"); | |
986 break; | |
987 | |
988 default: | |
989 /* | |
990 ** Unexpected Event, setthe data sized to -1 to exit with no further action | |
991 */ | |
992 MFW_BT_TRACE_P1("mfw_bt_dm_search_hndlr > Unexpected Event %d", event); | |
993 retVal = MFW_BT_INVALID_EVENT; | |
994 | |
995 } | |
996 | |
997 return retVal; | |
998 } | |
999 | |
1000 | |
1001 | |
1002 | |
1003 | |
1004 /* | |
1005 ** MFW Bluetooth Device Manager Callback Function Definitions | |
1006 */ | |
1007 /******************************************************************************* | |
1008 | |
1009 $Function: mfw_bt_dm_security_b | |
1010 | |
1011 $Description: This is the Device Manager Security Callback function, a pointer to it is passed | |
1012 to the Bluetooth Module in the BTA DM Enable function and it is used to return | |
1013 information from the Bluetooth Module | |
1014 | |
1015 $Returns: None | |
1016 | |
1017 $Arguments: event : Event Id returned from the Bluetooth Module | |
1018 data : pointer to the relevant data returned from the Mluetooth Module | |
1019 | |
1020 *******************************************************************************/ | |
1021 void mfw_bt_dm_security_cb(T_MFW_BT_DM_SEC_EVT event, T_MFW_BT_DM_SEC_SIG_DATA *data) | |
1022 { | |
1023 int dataLen; | |
1024 T_MFW_BT_STATUS geRetVal = MFW_BT_SUCCESS; | |
1025 | |
1026 MFW_BT_TRACE("mfw_bt_dm_security_b"); | |
1027 | |
1028 /* | |
1029 ** Set the expected data size according to the received event | |
1030 */ | |
1031 switch (event) | |
1032 { | |
1033 case BTA_DM_SYS_START_EVT: | |
1034 dataLen = 0; | |
1035 break; | |
1036 case BTA_DM_ENABLE_EVT: | |
1037 dataLen = sizeof(tBTA_DM_ENABLE); | |
1038 break; | |
1039 | |
1040 case BTA_DM_DISABLE_EVT: | |
1041 dataLen = 0; | |
1042 break; | |
1043 | |
1044 case BTA_DM_PIN_REQ_EVT: | |
1045 dataLen = sizeof(tBTA_DM_PIN_REQ); | |
1046 break; | |
1047 | |
1048 case BTA_DM_AUTH_CMPL_EVT: | |
1049 dataLen = sizeof(tBTA_DM_AUTH_CMPL); | |
1050 break; | |
1051 | |
1052 case BTA_DM_AUTHORIZE_EVT: | |
1053 dataLen = sizeof(tBTA_DM_AUTHORIZE); | |
1054 break; | |
1055 | |
1056 case BTA_DM_LINK_UP_EVT: | |
1057 dataLen = sizeof(tBTA_DM_LINK_UP); | |
1058 break; | |
1059 | |
1060 case BTA_DM_LINK_DOWN_EVT: | |
1061 dataLen = sizeof(tBTA_DM_LINK_DOWN); | |
1062 break; | |
1063 | |
1064 case BTA_DM_SIG_STRENGTH_EVT: | |
1065 dataLen = sizeof(tBTA_DM_SIG_STRENGTH); | |
1066 break; | |
1067 | |
1068 default: | |
1069 /* | |
1070 ** Unexpected Event, setthe data sized to -1 to exit with no further action | |
1071 */ | |
1072 MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Unexpected Event %d", event); | |
1073 dataLen = -1; | |
1074 | |
1075 } | |
1076 | |
1077 | |
1078 if (dataLen > 0) | |
1079 { | |
1080 /* | |
1081 ** Data is expected with the received signal | |
1082 */ | |
1083 if ((void *)data == (void *)0) | |
1084 { | |
1085 /* | |
1086 ** The data pointer is NULL, report the error | |
1087 */ | |
1088 MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Event : %d, Data Pointer is NULL, but data is expected", event); | |
1089 } | |
1090 else | |
1091 { | |
1092 /* | |
1093 ** Post the event and data to the Generic event handler | |
1094 */ | |
1095 geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SECURITY, (ULONG)event, (void *)data, dataLen); | |
1096 } | |
1097 } | |
1098 else if (dataLen == 0) | |
1099 { | |
1100 /* | |
1101 ** There is no expected data with the received signal, post the event to the Generic event handler | |
1102 */ | |
1103 geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SECURITY, (ULONG)event, (void *)0, 0); | |
1104 } | |
1105 | |
1106 if (geRetVal != MFW_BT_SUCCESS) | |
1107 { | |
1108 /* | |
1109 ** There is an error, but there is nothing that can be done other than to report it. | |
1110 */ | |
1111 MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Failed to post the event. Error %d", geRetVal); | |
1112 } | |
1113 | |
1114 return; | |
1115 } | |
1116 | |
1117 | |
1118 /******************************************************************************* | |
1119 | |
1120 $Function: mfw_bt_Dm_Search_Cb | |
1121 | |
1122 $Description: This is the Device Manager Search Callback function, a pointer to it is passed | |
1123 to the Bluetooth Module in the BTA DM Search and Discover functions and it is | |
1124 used to return information from the Bluetooth Module | |
1125 | |
1126 $Returns: None | |
1127 | |
1128 $Arguments: event : Event Id returned from the Bluetooth Module | |
1129 data : pointer to the relevant data returned from the Mluetooth Module | |
1130 | |
1131 *******************************************************************************/ | |
1132 void mfw_bt_dm_search_cb(T_MFW_BT_DM_SRCH_EVT event, T_MFW_BT_DM_SRCH_SIG_DATA *data) | |
1133 { | |
1134 int dataLen; | |
1135 T_MFW_BT_STATUS geRetVal = MFW_BT_SUCCESS; | |
1136 | |
1137 MFW_BT_TRACE("mfw_bt_Dm_Search_Cb"); | |
1138 | |
1139 /* | |
1140 ** Set the expected data size according to the received event | |
1141 */ | |
1142 switch (event) | |
1143 { | |
1144 case BTA_DM_INQ_RES_EVT: | |
1145 dataLen = sizeof(tBTA_DM_INQ_RES); | |
1146 break; | |
1147 | |
1148 case BTA_DM_INQ_CMPL_EVT: | |
1149 dataLen = sizeof(tBTA_DM_INQ_CMPL); | |
1150 break; | |
1151 | |
1152 case BTA_DM_DISC_RES_EVT: | |
1153 dataLen = sizeof(tBTA_DM_DISC_RES); | |
1154 break; | |
1155 | |
1156 case BTA_DM_DISC_CMPL_EVT: | |
1157 dataLen = 0; | |
1158 break; | |
1159 | |
1160 case BTA_DM_SEARCH_CANCEL_CMPL_EVT: | |
1161 dataLen = 0; | |
1162 break; | |
1163 | |
1164 | |
1165 default: | |
1166 /* | |
1167 ** Unexpected Event, setthe data sized to -1 to exit with no further action | |
1168 */ | |
1169 MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Unexpected Event %d", event); | |
1170 dataLen = -1; | |
1171 | |
1172 } | |
1173 | |
1174 | |
1175 if (dataLen > 0) | |
1176 { | |
1177 /* | |
1178 ** Data is expected with the received signal | |
1179 */ | |
1180 if ((void *)data == (void *)0) | |
1181 { | |
1182 /* | |
1183 ** The data pointer is NULL, report the error | |
1184 */ | |
1185 MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Event : %d, Data Pointer is NULL, but data is expected", event); | |
1186 } | |
1187 else | |
1188 { | |
1189 /* | |
1190 ** Post the event and data to the Generic event handler | |
1191 */ | |
1192 geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SEARCH, (ULONG)event, (void *)data, dataLen); | |
1193 } | |
1194 } | |
1195 else if (dataLen == 0) | |
1196 { | |
1197 /* | |
1198 ** There is no expected data with the received signal, post the event to the Generic event handler | |
1199 */ | |
1200 geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SEARCH, (ULONG)event, (void *)0, 0); | |
1201 } | |
1202 | |
1203 if (geRetVal != MFW_BT_SUCCESS) | |
1204 { | |
1205 /* | |
1206 ** There is an error, but there is nothing that can be done other than to report it. | |
1207 */ | |
1208 MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Failed to post the event. Error %d", geRetVal); | |
1209 } | |
1210 | |
1211 return; | |
1212 } | |
1213 | |
1214 |