FreeCalypso > hg > tcs211-pirelli
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 |
