diff src/aci2/mfw/mfw_bt_dm.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/aci2/mfw/mfw_bt_dm.c	Mon Sep 26 00:29:36 2016 +0000
@@ -0,0 +1,1214 @@
+/*
++-------------------------------------------------------------------+
+| PROJECT: MMI-Framework (8445)		$Workfile:: mfw_bt_dm.c			$|
+| $Author:: NDH						$Revision::  1						$|
+| CREATED: 22.04.04					$Modtime:: 22.04.04 11:07			$|
+| STATE  : code														 |
++-------------------------------------------------------------------+
+
+
+   MODULE  : MFW_BT_DM
+
+   PURPOSE : This module contains the functions for MFW Bluetooth Device Manager Profile
+
+
+*/
+
+#define ENTITY_MFW
+
+#include <string.h>
+
+#if defined (NEW_FRAME)
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "pei.h"
+#include "custom.h"
+#include "gsm.h"
+
+#else
+
+#include "STDDEFS.H"
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+
+#endif
+
+#include "bta_riviera.h"
+#include "mfw_bte.h"
+#include "mfw_bt_dm.h"
+#include "mfw_bt_geh.h"
+#include "mfw_bt_flash.h"
+
+
+T_MFW_BT_CB 			mfw_bt_cb;
+
+/* file where is stored bd address of the device to connect */
+#ifndef MFW_BT_BD_ADDR_FILE
+#define MFW_BT_BD_ADDR_FILE "/bt/remote_bd"
+#endif
+
+static T_MFW_BT_STATUS mfw_bt_dm_trust_device(BOOLEAN is_trusted, BD_ADDR bd_addr);
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_set_visibility
+
+ $Description:		set visibility of local BT device
+
+ $Returns:		T_MFW_BT_STATUS. Success or fail.	
+
+ $Arguments:		is_visible: new visibility setting. is_temp: define whether it is a temporary
+ 				modification ( TRUE ) or a permanent one ( FALSE ).
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_set_visibility( BOOL is_visible, BOOL is_temp)
+{
+	/* other devices will be able to find this device during an inquiry */
+	if( mfw_bt_cb.is_started == TRUE )
+		BTA_DmSetVisibility( 	(is_visible)?BTA_DM_GENERAL_DISC:BTA_DM_NON_DISC, 
+    								BTA_DM_CONN);	
+
+	if( is_temp == TRUE)
+		/* it looks like this is only a temporary change  => don't store that in flash! */
+		return MFW_BT_SUCCESS;
+
+	/* update to nvram and mfw_bt_cfg */
+    	return mfw_bt_store_visibility( is_visible );
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_get_visibility
+
+ $Description:		get visibility of local BT device
+
+ $Returns:		TRUE if visible, FALSE if not.
+
+ $Arguments:		none
+
+*******************************************************************************/
+BOOL mfw_bt_dm_get_visibility( void )
+{
+	return mfw_bt_read_visibility( );
+}
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_get_local_name
+
+ $Description:		read  local BT device name
+
+ $Returns:		a pointer to a string. NULL if no name available. One should make a copy of
+ 				string if he wants to use it/modify it. 
+
+ $Arguments:		none
+
+*******************************************************************************/
+UINT8 * mfw_bt_dm_get_local_name( void )
+{
+	return mfw_bt_read_local_name();
+}
+
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_set_local_name
+
+ $Description:		set local BT device name
+
+ $Returns:		T_MFW_BT_STATUS	
+
+ $Arguments:		new name. Pointer to a string. This string is copied locally. Buffer is not freed.
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_set_local_name( INT8 *name )
+{
+	if( strlen((char*)name) == 0 )
+	{
+		/* BMI should never ever send back an empty string, except at start-up */
+		if( mfw_bt_cb.is_name_requested == FALSE )
+			return MFW_BT_FAIL;
+		
+		/* we are here, this means:
+			- it's a start-up
+			- apparently, the local name was never set. => it's the first start-up
+			- the user don't really want to use BT as he cancelled the setting.
+		=> this means we do want to stop BT... So go for it!  :o)  */
+		mfw_bt_disable( );
+		return MFW_BT_SUCCESS;
+	}	
+
+	if( mfw_bt_cb.is_name_requested == TRUE )
+		mfw_bt_cb.is_name_requested = FALSE;
+
+	if( strlen((char*)name) > MFW_BT_NAME_LENGTH )
+		return MFW_BT_INVALID_DATA;
+	
+	if( mfw_bt_cb.is_started )
+		BTA_DmSetDeviceName( (char*)name );
+	/* update to nv memory and mfw_bt_cfg with new name */
+	return mfw_bt_store_local_name( (char*) name );
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_get_bt_status
+
+ $Description:		get the status of the local Bluetooth system. Used at start-up to decide whether
+ 				or not we want BT to be started by default.
+
+ $Returns:		MFW_BT_SUCCESS is BT is started. 0 if OFF	
+
+ $Arguments:		
+
+*******************************************************************************/
+BOOL mfw_bt_dm_get_bt_status( void )
+{
+	return mfw_bt_read_status( );
+
+}
+
+
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_pin_code
+
+ $Description:		used by BMI to send back a pin code
+
+ $Returns:		T_MFW_BT_STATUS. 	MFW_BT_NOT_INITIALISED is BT is not started.
+
+ $Arguments:		pin code and pin code length. This data is copied.
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_pin_code(UINT8* pin_code, UINT8 pin_len)
+{
+	BOOLEAN accept = TRUE;
+
+	if( mfw_bt_cb.is_started != TRUE )
+		return MFW_BT_NOT_INITIALISED;
+	
+	if(pin_len == 0)
+	    accept = FALSE;
+	BTA_DmPinReply( 	mfw_bt_cb.peer_bdaddr, 
+	                			accept,   
+	                			pin_len, 
+	                			pin_code);
+
+	return MFW_BT_SUCCESS;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_bond
+
+ $Description:		used by BMI to send a pin code in order to establish a bonding with a 
+ 				remote device.
+
+ $Returns:		T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED is BT is not started.
+ 				
+
+ $Arguments:		BD_ADDR of the remote device, pin code and pin code length. Data is copied.
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_bond(BD_ADDR bd_addr, UINT8* pin_code, UINT8 pin_len )
+{
+	if( mfw_bt_cb.is_started != TRUE )
+		return MFW_BT_NOT_INITIALISED;
+	
+
+	MFW_BT_TRACE("try to bond with stored device");
+	if(pin_len != 0)
+	{
+		/* now tell the BT stack */
+		BTA_DmBond (	bd_addr,	pin_len,  pin_code );		
+		return MFW_BT_SUCCESS;		
+	}
+	else
+	{
+		MFW_BT_TRACE("  [ mfw_bt dm bond]: no pin code entered!");
+		return MFW_BT_FAIL;
+	}
+
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_authorize_resp
+
+ $Description:		used to answer to an authorization request
+
+ $Returns:		T_MFW_BT_STATUS. SUCCESS/FAIL, but also:
+ 				MFW_BT_NOT_INITIALISED is BT is not started. 
+ 				MFW_BT_INVALID_DATA if auth value is not correct.
+ 				MFW_BT_UNKNOWN_DEVICE if BD_addr is not recognized.
+ 				MFW_BT_DATA_BASE_FULL if there are already too many devices in the DB.
+ 				
+
+ $Arguments:		MFW_BT_AUTH_FAIL to refuse, 
+ 				MFW_BT_AUTH_ONCE to grant access temporarily,
+ 				MFW_BT_AUTH_ALWAYS to grant permanent access
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_authorize_resp( T_MFW_BT_AUTHORIZE auth)
+{
+	T_MFW_BT_STATUS status;
+	
+	if( mfw_bt_cb.is_started != TRUE )
+		return MFW_BT_NOT_INITIALISED;
+	
+	switch (auth)
+	{
+	case MFW_BT_AUTH_FAIL:
+		/* reject */
+		BTA_DmAuthorizeReply(	mfw_bt_cb.peer_bdaddr, 
+								mfw_bt_cb.peer_service,
+		                     			BTA_DM_NOT_AUTH);
+		mfw_bt_dm_trust_device( FALSE, mfw_bt_cb.peer_bdaddr );
+		break;
+		
+	case MFW_BT_AUTH_ALWAYS:
+		/*
+		** CQ22024 : Set the device as Trusted, and Authorise it for this an all subsequent connections
+		**			If writing to the Flash fails, proceed with the authorisation anyway.
+		*/
+		status = mfw_bt_dm_trust_device( TRUE, mfw_bt_cb.peer_bdaddr );
+
+		/*
+		** Even if we fail to write the information to the FLASH, we should continue with the
+		** Authorisation procedure. If the device is unknown, the device will remain Authorised as
+		** long as the Handset is not powered down (Not ideal, but better than refusing Authorisation all together)
+		*/
+		BTA_DmAuthorizeReply(	mfw_bt_cb.peer_bdaddr, 
+								mfw_bt_cb.peer_service,
+								BTA_DM_AUTH_PERM);
+		break;
+		
+	case MFW_BT_AUTH_ONCE:
+		/* CQ22024 : tell the BT stack we authorize the device, but for this connection only */
+		BTA_DmAuthorizeReply(	mfw_bt_cb.peer_bdaddr, 
+								mfw_bt_cb.peer_service,
+								BTA_DM_AUTH_TEMP);
+		break;
+
+	default:
+		return MFW_BT_INVALID_DATA;
+	}
+	return MFW_BT_SUCCESS;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_sig_strength
+
+ $Description:		ask for the link quality
+
+ $Returns:		T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED if BT is not started.
+
+ $Arguments:		T_MFW_BT_DM_SIG_STRENGTH sig_strength,  UINT16 period, 	BOOLEAN is_on
+				See BTA documentation for more details.
+				
+*******************************************************************************/
+T_MFW_BT_STATUS	mfw_bt_dm_sig_strength (	T_MFW_BT_DM_SIG_STRENGTH sig_strength,
+													UINT16 period,
+													BOOLEAN is_on )
+{
+	if( mfw_bt_cb.is_started != TRUE )
+		return MFW_BT_NOT_INITIALISED;
+	BTA_DmSignalStrength((tBTA_SIG_STRENGTH_MASK) sig_strength,  period,  is_on);
+	return MFW_BT_SUCCESS;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_get_known_devices
+
+ $Description:		used by BMI to get the list of known devices for a specified condition: either a 
+ 				service mask, either a bd address ( union ). 
+ 				MFW will fill in the variables: pp_device => table of known devices
+ 				number_of_devices => number of devices.
+ 				MFW will allocate memory for each device found. It's up to BMI to free it!
+
+ $Returns:		T_MFW_BT_STATUS. 
+ 				If BD_ADDR is specified, might return MFW_BT_UNKNOWN_DEVICE.
+ 				 The answers will be returned using BMI signals:
+ 				- E_BT_DM_INQ_CMPL with the number of devices
+ 				- E_BT_DM_DISC_RES for each device
+ 				- then E_BT_DM_DISC_CMPL when it's done.
+ 
+ $Arguments:		BD_ADDR if looking for a particular device. services if looking for a 
+ 				category of device. If bd_addr is specified, ignore services. If services set
+ 				to 0, will return all the known devices.
+
+*******************************************************************************/
+void mfw_bt_dm_get_known_devices ( 	BD_ADDR bd_addr,
+											T_MFW_BT_SERVICE_MASK services)
+{
+	T_MFW_BT_REM_DEVICE *ptr_db_device[MFW_BT_NUM_REM_DEVICE];
+	UINT8 i, number_of_devices;
+	T_MFW_BT_DM_INQ_CMPL inq_cmpl_res;
+	T_MFW_BT_STATUS status;
+	BD_ADDR null_bd_addr;
+	
+	number_of_devices = 0;
+	memset(&null_bd_addr[0], 0x00, sizeof(BD_ADDR));
+	
+	/* we have a BT address, try to find the related data */
+	/* CQ21834 : cannot treat bd_addr as a pointer, because it is passed by value. Use MemCmp */
+	if( memcmp(&bd_addr[0], &null_bd_addr[0], sizeof(BD_ADDR)) != 0 )
+	{
+		ptr_db_device[0] = mfw_bt_get_device_info(bd_addr);
+		
+		if(ptr_db_device[0] != NULL)
+		{
+			if((ptr_db_device[0])->is_new == FALSE)
+				number_of_devices = 1;
+		}
+	}
+	else
+	{
+		/* Now we want to find all the devices which support the given services */
+		mfw_bt_get_device_by_service(services, &ptr_db_device[0], &number_of_devices );
+	}
+
+	/* first send the number of found devices. this is important! BMI shouldn't do anything
+	before he gets all the answer */
+	inq_cmpl_res.num_resps = number_of_devices;
+	mfw_bt_signal( E_BT_DM_INQ_CMPL, (void*)&inq_cmpl_res);
+	
+	if (number_of_devices > 0)
+	{
+		/*
+		** CQ21834 : The incorrect structure was being used for the signal, so the data was never received by the BMI.
+		*/
+		T_MFW_BT_DM_DISC_RES disc_res;
+
+		/* now for each device found, send a signal to BMI. This will copy the data! */	
+		for( i=0; i<number_of_devices; i++ )
+		{
+			memcpy((void *)&disc_res, (void *)ptr_db_device[i], sizeof(disc_res));
+
+			mfw_bt_signal( E_BT_DM_DISC_RES, (void *)&disc_res);
+		}
+
+		mfw_bt_signal( E_BT_DM_DISC_CMPL, NULL);
+	}
+	
+	return;
+	
+}
+
+
+
+
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_trust_device
+
+ $Description:		specify whether a remote device should or not be trusted ( => access granted )
+
+ $Returns:		T_MFW_BT_STATUS	
+ 				success, failure, MFW_BT_UNKNOWN_DEVICE
+
+ $Arguments:		BOOLEAN for the permission; BD address of the remote device
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_trust_device(BOOLEAN is_trusted, BD_ADDR bd_addr)
+{
+	T_MFW_BT_REM_DEVICE * p_device;
+	T_MFW_BT_STATUS status;
+	
+	/* check if we know this device*/
+	if(( p_device = mfw_bt_get_device_info(bd_addr)) == NULL )
+		/* unknown device... */
+		return MFW_BT_UNKNOWN_DEVICE;
+		
+	p_device->is_trusted = is_trusted;
+	if (( status = mfw_bt_flash_store_device(p_device)) != MFW_BT_SUCCESS )
+		return status;
+
+	/* update BTA with new settings */
+	if( mfw_bt_cb.is_started )
+	{
+		if(p_device->link_key_present)
+			BTA_DmAddDevice(bd_addr, p_device->link_key, BTA_ALL_SERVICE_MASK, is_trusted);
+		else 
+			BTA_DmAddDevice(bd_addr, NULL, BTA_ALL_SERVICE_MASK, is_trusted);
+	}
+
+	return MFW_BT_SUCCESS;
+ }
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_delete_device
+
+ $Description:		remove a device from the local DB
+ 
+ $Returns:		T_MFW_BT_STATUS ( MFW_BT_SUCCESS, MFW_BT_FAIL, MFW_BT_UNKNOWN_DEVICE )	
+
+ $Arguments:		BD address
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_delete_device(BD_ADDR bd_addr)
+{
+	if( mfw_bt_cb.is_started )
+		BTA_DmRemoveDevice (bd_addr);
+	return mfw_bt_flash_delete_device(bd_addr);
+}
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_add_device
+
+ $Description:		This will store permanently a device in Flash.
+
+ $Returns:		T_MFW_BT_STATUS
+ 				errors: MFW_BT_UNKNOWN_DEVICE, MFW_BT_DATA_BASE_FULL, 
+ 				
+
+ $Arguments:		new BD address
+
+*******************************************************************************/
+ T_MFW_BT_STATUS mfw_bt_dm_add_device(BD_ADDR bd_addr)
+{
+	T_MFW_BT_REM_DEVICE *p_device;
+	T_MFW_BT_STATUS status;
+	
+	MFW_BT_TRACE("mfw_bt_dm_add_device()");
+
+	/* get the info about this device */
+	if( ( p_device = mfw_bt_get_device_info( bd_addr)) == NULL)
+		return MFW_BT_UNKNOWN_DEVICE;
+	
+	if( p_device->is_new == TRUE )
+	{
+		/*
+		** CQ21834 : Ensure that the is_new value is set before writing the data to Flash, so that it will be
+		**			set correctly when  the handset is restarted.
+		*/
+		p_device->is_new = FALSE;
+		if((status = mfw_bt_flash_store_device(p_device))!=MFW_BT_SUCCESS)
+			return status;
+	}
+	
+	/* update BTA device database */
+	if( mfw_bt_cb.is_started )
+	{
+		if(p_device->link_key_present)
+			BTA_DmAddDevice(p_device->bd_addr, p_device->link_key,
+		                    p_device->trusted_services, p_device->is_trusted);
+		else 
+		    	BTA_DmAddDevice(p_device->bd_addr, NULL,
+		                    p_device->trusted_services, p_device->is_trusted);
+	}
+	return MFW_BT_SUCCESS;
+
+}
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_rename_device
+
+ $Description:		modify the friendly name of a known ( already stored ) remote device
+
+ $Returns:		T_MFW_BT_STATUS.
+ 				MFW_BT_UNKNOWN_DEVICE, DATA_BASE_FULL, MFW_BT_INVALID_DATA...
+
+ $Arguments:		bd address of the remote device and the new name associated
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_rename_device(BD_ADDR bd_addr, UINT8* new_name)
+{
+	T_MFW_BT_REM_DEVICE *p_device;
+
+	if( ( p_device = mfw_bt_get_device_info( bd_addr)) == NULL )
+		return MFW_BT_UNKNOWN_DEVICE;
+	/* if this device is new ( == in the inq DB ), we don't want to do anything */
+	if( p_device->is_new == TRUE )
+		return MFW_BT_FAIL;
+	/* verify the string is OK */
+	if( strlen( (char*)new_name ) > MFW_BT_NAME_LENGTH )
+		return MFW_BT_INVALID_DATA;
+	strcpy(p_device->friendly_name, (char*)new_name );
+	return mfw_bt_flash_store_device(p_device);
+	
+}
+
+
+
+
+
+
+/*
+**  Functions used to interact with the BT "search engine"
+*/
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_discover_device
+
+ $Description:		Discovers services on a device
+
+ $Returns:		T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED if BT not started.	
+
+ $Arguments:		bd address of the remote device to discover
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_discover_device(BD_ADDR bd_addr)
+{
+
+    	T_MFW_BT_SERVICE_MASK client_services;
+
+	if( mfw_bt_cb.is_started != TRUE )
+		return MFW_BT_NOT_INITIALISED;
+
+	/* remember it's an inquiry */
+	mfw_bt_cb.is_discovery = TRUE;
+	
+	/* we need to find only services for which we can be in client role, plus HS/HF */
+	client_services = ((BTA_SUPPORTED_CLIENT_SERVICES & \
+	                                ~( BTA_DUN_SERVICE_MASK | BTA_FAX_SERVICE_MASK )) \
+	                                | BTA_HSP_SERVICE_MASK | BTA_HFP_SERVICE_MASK );
+
+	BTA_DmDiscover(bd_addr, BTA_ALL_SERVICE_MASK, (tBTA_DM_SEARCH_CBACK*)mfw_bt_dm_search_cb);
+
+	return MFW_BT_SUCCESS;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_is_discover
+
+ $Description:	Checks if we are in discovering services process
+
+ $Returns:		
+
+ $Arguments:	None
+
+*******************************************************************************/
+UINT8 mfw_bt_dm_is_discover(void)
+{
+	return mfw_bt_cb.is_discovery;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_cancel_search
+
+ $Description:		cancel an ongoing search
+
+ $Returns:		MFW_BT_NOT_INITIALISED if BT not started.	
+
+ $Arguments:		
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_cancel_search( void )
+{
+	if( mfw_bt_cb.is_started != TRUE )
+		return MFW_BT_NOT_INITIALISED;
+    	BTA_DmSearchCancel();
+	return MFW_BT_SUCCESS;		
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_search
+
+ $Description:		Searches for devices supporting the services specified. If services = 0, will 
+ 				return all the found devices regardless of their functionalities.
+
+ $Returns:		MFW_BT_NOT_INITIALISED if BT not started.	
+
+ $Arguments:		services. If
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_dm_search(T_MFW_BT_SERVICE_MASK services)
+{
+	tBTA_DM_INQ inq_params;
+	UINT8 inq_index;
+
+	if( mfw_bt_cb.is_started != TRUE )
+		return MFW_BT_NOT_INITIALISED;
+	mfw_bt_cb.is_discovery = FALSE;
+	inq_params.mode = 0;
+	inq_params.duration = MFW_BT_DEFAULT_INQ_DURATION;
+	inq_params.max_resps = MFW_BT_NUM_REM_DEVICE;
+	inq_params.filter_type = BTA_DM_INQ_CLR;
+
+	/* "initialize" the inquiry data base */
+	mfw_bt_clean_inq_db( );
+	/* store the services we are looking for, so that we can filter the results */
+	mfw_bt_cb.search_services = services;
+	/* find nearby devices */
+	BTA_DmSearch(&inq_params, services, mfw_bt_dm_search_cb );
+	return MFW_BT_SUCCESS;		
+	
+}
+
+
+
+
+/*
+** MFW Bluetooth Device Manager Signal Handler Function Definitions
+*/
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_security_hndlr
+
+ $Description:		This function recieves the BTA DM Security events from the Generic Event Handler
+ 				and either processes them in their entirety or passes them to the MMI for further
+ 				processing.
+
+ $Returns:		MFW_BT_SUCCESS	: The signal was handled successfully
+
+ $Arguments:		event	: Event Id returned from the Bluetooth Module
+ 				data		: pointer to the relevant data returned from the Mluetooth Module
+
+*******************************************************************************/
+T_MFW_BT_STATUS	mfw_bt_dm_security_hndlr (T_MFW_BT_DM_SEC_EVT event, T_MFW_BT_DM_SEC_SIG_DATA *data)
+{
+	T_MFW_BT_STATUS retVal = MFW_BT_SUCCESS;
+	
+	MFW_BT_TRACE("mfw_bt_dm_security_hndlr");
+
+	switch (event)
+	{
+		case BTA_DM_SYS_START_EVT:
+		{
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_SYS_START_EVT event received");
+			/* now enable bluetooth functionalities before calling other BTA API */
+			BTA_EnableBluetooth(&mfw_bt_dm_security_cb);  
+		}
+		break;			
+			
+		case BTA_DM_ENABLE_EVT:
+		{
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_ENABLE_EVT event received");
+			/* call the enable call-back */
+			mfw_bt_enable_cb( );
+		}
+		break;
+
+		case BTA_DM_DISABLE_EVT:
+		{
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_DISABLE_EVT event received");
+
+			/* stop the BT chipset */
+			BTA_SysStop();
+
+			/* we won't use BT anymore => free the event handler */
+			mfw_bt_ge_disable();
+			
+			/* store the new settings */
+			mfw_bt_store_status(FALSE);
+			mfw_bt_cb.is_started = FALSE;
+			
+			/* and tell BMI */
+			mfw_bt_signal(E_BT_DISABLE_CMPL, (void *)0);
+		}
+		break;
+
+		case BTA_DM_PIN_REQ_EVT:
+		{
+			/* store the BD ADDR of the remote device */
+			bdcpy(mfw_bt_cb.peer_bdaddr, data->pin_req.bd_addr);
+			/* and forward the signal to BMI */
+			mfw_bt_signal(E_BT_DM_PIN_REQ, data);
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_PIN_REQ_EVT event received");
+		}
+		break;
+
+		case BTA_DM_AUTH_CMPL_EVT:
+		{	
+			T_MFW_BT_DM_AUTH_CMPL data_auth;
+			T_MFW_BT_REM_DEVICE device;
+			T_MFW_BT_REM_DEVICE *p_device;
+
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_AUTH_CMPL_EVT event received");
+			/* first, give some feedback to BMI */
+			/* => copy data */
+			memcpy(data_auth.bd_addr, data->auth_cmpl.bd_addr, BD_ADDR_LEN); 
+			if( strlen((char*)data->auth_cmpl.bd_name) != 0 )
+				mfwStrncpy((char*)data_auth.bd_name, (const char*)data->auth_cmpl.bd_name, MFW_BT_NAME_LENGTH);
+			data_auth.is_success = data->auth_cmpl.success;
+			/* and forward it */
+			mfw_bt_signal(E_BT_DM_AUTH_CMPL, (void*)&data_auth);
+
+			/* now see if we have to update our data base */
+			p_device = mfw_bt_get_device_info(data->auth_cmpl.bd_addr);
+			if( p_device == NULL )
+			{	
+				/* we don't know this device ... */ 
+				if ( data->auth_cmpl.success == FALSE )
+					/* ... and auth has been rejected: get away from here... */
+					break;			
+				
+				/* ... but it's trusted. So add it to our DB. This means we have to create a 
+				real T_MFW_BT_REM_DEVICE entity, which will be copied */
+				p_device = &device;
+				memset(&device, 0, sizeof( T_MFW_BT_REM_DEVICE ) );
+			}
+				
+			/* ok, now  update our local DB: get the info we received */
+			memcpy(p_device->bd_addr, data->auth_cmpl.bd_addr, BD_ADDR_LEN); 
+			if( strlen((char*)data->auth_cmpl.bd_name) != 0 )
+				mfwStrncpy((char*)p_device->name, (const char*)data->auth_cmpl.bd_name, MFW_BT_NAME_LENGTH);
+			memcpy(p_device->link_key, data->auth_cmpl.key, LINK_KEY_LEN );
+			p_device->link_key_present = data->auth_cmpl.key_present;
+
+			/* we don't modify the other fields => either the already stored ones will be used, 
+			either for a new device they will be set to zero. */
+			
+			mfw_bt_flash_store_device( p_device );			
+		}
+		break;
+
+		case BTA_DM_AUTHORIZE_EVT:
+		{
+			/* keep a trace of the information??? */
+			bdcpy(mfw_bt_cb.peer_bdaddr, data->authorize.bd_addr);
+			strncpy((char*)mfw_bt_cb.peer_name, (char*)data->authorize.bd_name, MFW_BT_NAME_LENGTH);
+			mfw_bt_cb.peer_service = data->authorize.service;
+			/*and forward it to BMI */
+			mfw_bt_signal(E_BT_DM_AUTHORIZE_REQ, data );
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_AUTHORIZE_EVT event received");
+		}
+		break;
+
+		case BTA_DM_LINK_UP_EVT:
+		{	
+			/* this is only a "HW" connection, so no service or name needed. Just show BT is busy */
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_LINK_UP_EVT event received");
+			mfw_bt_signal(E_BT_DM_LINK_UP, data );
+		}
+		break;
+
+		case BTA_DM_LINK_DOWN_EVT:
+		{	
+			/* just to know BT is idle again */
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_LINK_DOWN_EVT event received");
+			mfw_bt_signal(E_BT_DM_LINK_DOWN, data );
+		}
+		break;
+
+		case BTA_DM_SIG_STRENGTH_EVT:
+		{	
+			/* ok, we receive a signal strength indication. Great. */
+			MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_SIG_STRENGTH_EVT event received");
+			mfw_bt_signal(E_BT_DM_SIG_STRENGTH_IND, data );
+		}	
+		break;
+
+		default:
+		{
+			/*
+			** Unexpected Event, set the data sized to -1 to exit with no further action
+			*/
+			MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Unexpected Event %d", event);
+			retVal = MFW_BT_INVALID_EVENT;
+		}
+		break;
+			
+	}
+
+	return retVal;
+}
+
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_search_hndlr
+
+ $Description:		This function recieves the BTA DM Search events from the Generic Event Handler
+ 				and either processes them in their entirety or passes them to the MMI for further
+ 				processing.
+
+ $Returns:		MFW_BT_SUCCESS	: The signal was handled successfully
+
+ $Arguments:		event	: Event Id returned from the Bluetooth Module
+ 				data		: pointer to the relevant data returned from the Mluetooth Module
+
+*******************************************************************************/
+T_MFW_BT_STATUS	mfw_bt_dm_search_hndlr (T_MFW_BT_DM_SRCH_EVT event, T_MFW_BT_DM_SRCH_SIG_DATA *data)
+{
+	T_MFW_BT_STATUS retVal = MFW_BT_SUCCESS;
+	
+	MFW_BT_TRACE("mfw_bt_dm_search_hndlr");
+
+	/*
+	** Set the expected data size according to the received event
+	*/
+	switch (event)
+	{
+		case BTA_DM_INQ_RES_EVT:
+			{
+				MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_INQ_RES_EVT event received");
+				/* we just received a BD address... Don't even forward this to BMI */
+			    	MFW_BT_TRACE_P6("DB_ADDR: msg_str%02x:%02x:%02x:%02x:%02x:%02x\n",
+									data->inq_res.bd_addr[0], data->inq_res.bd_addr[1],
+							              data->inq_res.bd_addr[2], data->inq_res.bd_addr[3],
+							              data->inq_res.bd_addr[4], data->inq_res.bd_addr[5]);
+				mfw_bt_add_inq_device( &(data->inq_res) );
+			}
+			break;
+
+		case BTA_DM_INQ_CMPL_EVT:
+			mfw_bt_signal( E_BT_DM_INQ_CMPL, (void*)&data->inq_cmpl);
+			MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_INQ_CMPL_EVT event received");
+			break;
+
+		case BTA_DM_DISC_RES_EVT:
+		{
+			T_MFW_BT_DM_DISC_RES disc_res_data;
+			T_MFW_BT_REM_DEVICE *p_device_rec = NULL;	/*CQ21834 : Not Just needed for discovery, but search also */
+
+			/*
+			** Do some preliminary initialisation, so that if nothing changes we send the right information
+			*/
+			memset(&disc_res_data, 0x00, sizeof(T_MFW_BT_DM_DISC_RES));
+			
+			memcpy(disc_res_data.bd_addr, data->disc_res.bd_addr, sizeof(BD_ADDR));
+			memcpy(disc_res_data.name, data->disc_res.bd_name, MFW_BT_NAME_LENGTH);
+			disc_res_data.services = data->disc_res.services;	
+			disc_res_data.is_new = TRUE;
+
+			/* if we are doing a discovery on a device */
+			if(mfw_bt_cb.is_discovery == TRUE)
+			{
+				if(data->disc_res.services == 0 )
+				{
+				    MFW_BT_TRACE("No service found");
+				}
+				else
+				{
+		                	p_device_rec = mfw_bt_get_device_info(data->disc_res.bd_addr );
+		                	if(p_device_rec)
+			              {
+			              	/* we really should find our device! */ 
+						p_device_rec->services = data->disc_res.services;
+							
+			              	if( p_device_rec->is_new)
+							mfw_bt_add_disc_device((T_MFW_BT_DM_DISC_RES*) p_device_rec);
+						else
+							mfw_bt_flash_store_device(p_device_rec);
+						/* forward the info to BMI */
+
+						/*
+						** Reset the information for the signal from the known or already discovered database
+						*/
+						memcpy(&disc_res_data, p_device_rec, sizeof(T_MFW_BT_DM_DISC_RES));
+			              }
+		            	}
+		        }
+		        /* we are doing device search. We receive the information about all the found devices. 
+				Let's verify if we specified services to look for => if yes, filter the results */
+		        else if( mfw_bt_cb.search_services == 0 ||  
+					(mfw_bt_cb.search_services & data->disc_res.services))
+		        {		
+			/*
+			** CQ21834 : Check to determine whether the device is already known, if so get (and update)
+			** 			the information in th eKnown Devices Database
+			*/
+	                p_device_rec = mfw_bt_get_device_info(data->disc_res.bd_addr );
+
+			/*
+			** p_device_rec should not be NULL because the device was added to the inquiry database when the inq result
+			** was recieved if it was not already in the known device database.
+			*/
+	                if (p_device_rec->is_new == FALSE)
+		          {
+		            MFW_BT_TRACE("BTA_DM_DISC_RES_EVT > This device is known");
+				
+		            if (strncmp(p_device_rec->name, (char *)&data->disc_res.bd_name, MFW_BT_NAME_LENGTH) != 0)
+	              	{
+	              		mfwStrncpy(p_device_rec->name, (char *)&data->disc_res.bd_name, MFW_BT_NAME_LENGTH);
+	              	}
+
+		            /* Update the device details! */ 
+		                    p_device_rec->services |= data->disc_res.services;
+				mfw_bt_flash_store_device(p_device_rec);
+
+		            memcpy(&disc_res_data, p_device_rec, sizeof(T_MFW_BT_DM_DISC_RES));
+	                }
+
+		        /*
+			** CQ21834: update our database whether the device is known or not, so that if the user removes it from the
+			** known device database, we will still have the details available.
+			*/
+		        	mfw_bt_add_disc_device( (T_MFW_BT_DM_DISC_RES*) &disc_res_data);
+		       }
+		       
+			MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_DISC_RES_EVT event received");
+			/* and forward the event to BMI */
+			mfw_bt_signal( E_BT_DM_DISC_RES, (void*)&disc_res_data);			
+		}
+		break;
+
+		case BTA_DM_DISC_CMPL_EVT:
+			mfw_bt_signal( E_BT_DM_DISC_CMPL, NULL );
+			MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_DISC_CMPL_EVT event received");
+			break;
+
+		case BTA_DM_SEARCH_CANCEL_CMPL_EVT:
+			/* currently, we don't do anything when a search is cancelled. Should we? */
+			MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_SEARCH_CANCEL_CMPL_EVT event received");
+			break;
+
+		default:
+			/*
+			** Unexpected Event, setthe data sized to -1 to exit with no further action
+			*/
+			MFW_BT_TRACE_P1("mfw_bt_dm_search_hndlr > Unexpected Event %d", event);
+			retVal = MFW_BT_INVALID_EVENT;
+			
+	}
+
+	return retVal;
+}
+
+
+
+
+
+/*
+** MFW Bluetooth Device Manager Callback Function Definitions
+*/
+/*******************************************************************************
+
+ $Function:		mfw_bt_dm_security_b
+
+ $Description:		This is the Device Manager Security Callback function, a pointer to it is passed
+ 				to the Bluetooth Module in the BTA DM Enable function and it is used to return
+ 				information from the Bluetooth Module
+
+ $Returns:		None
+
+ $Arguments:		event	: Event Id returned from the Bluetooth Module
+ 				data		: pointer to the relevant data returned from the Mluetooth Module
+
+*******************************************************************************/
+void	mfw_bt_dm_security_cb(T_MFW_BT_DM_SEC_EVT event, T_MFW_BT_DM_SEC_SIG_DATA *data)
+{
+	int dataLen;
+	T_MFW_BT_STATUS	geRetVal = MFW_BT_SUCCESS;
+
+	MFW_BT_TRACE("mfw_bt_dm_security_b");
+
+	/*
+	** Set the expected data size according to the received event
+	*/
+	switch (event)
+	{
+		case BTA_DM_SYS_START_EVT:
+			dataLen = 0;
+			break;
+		case BTA_DM_ENABLE_EVT:
+			dataLen = sizeof(tBTA_DM_ENABLE);
+			break;
+
+		case BTA_DM_DISABLE_EVT:
+			dataLen = 0;
+			break;
+
+		case BTA_DM_PIN_REQ_EVT:
+			dataLen = sizeof(tBTA_DM_PIN_REQ);
+			break;
+
+		case BTA_DM_AUTH_CMPL_EVT:
+			dataLen = sizeof(tBTA_DM_AUTH_CMPL);
+			break;
+
+		case BTA_DM_AUTHORIZE_EVT:
+			dataLen = sizeof(tBTA_DM_AUTHORIZE);
+			break;
+
+		case BTA_DM_LINK_UP_EVT:
+			dataLen = sizeof(tBTA_DM_LINK_UP);
+			break;
+
+		case BTA_DM_LINK_DOWN_EVT:
+			dataLen = sizeof(tBTA_DM_LINK_DOWN);
+			break;
+
+		case BTA_DM_SIG_STRENGTH_EVT:
+			dataLen = sizeof(tBTA_DM_SIG_STRENGTH);
+			break;
+
+		default:
+			/*
+			** Unexpected Event, setthe data sized to -1 to exit with no further action
+			*/
+			MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Unexpected Event %d", event);
+			dataLen = -1;
+			
+	}
+
+
+	if (dataLen > 0)
+	{
+		/*
+		** Data is expected with the received signal
+		*/
+		if ((void *)data == (void *)0)
+		{
+			/*
+			** The data pointer is NULL, report the error
+			*/
+			MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Event : %d, Data Pointer is NULL, but data is expected", event);
+		}
+		else
+		{
+			/*
+			** Post the event and data to the Generic event handler
+			*/
+			geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SECURITY, (ULONG)event, (void *)data, dataLen);
+		}
+	}
+	else if (dataLen == 0)
+	{
+		/*
+		** There is no expected data with the received signal, post the event to the Generic event handler
+		*/
+		geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SECURITY, (ULONG)event, (void *)0, 0);
+	}
+
+	if (geRetVal != MFW_BT_SUCCESS)
+	{
+		/*
+		** There is an error, but there is nothing that can be done other than to report it.
+		*/
+		MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Failed to post the event. Error %d", geRetVal);
+	}
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_Dm_Search_Cb
+
+ $Description:		This is the Device Manager Search Callback function, a pointer to it is passed
+ 				to the Bluetooth Module in the BTA DM Search and Discover functions and it is
+ 				used to return information from the Bluetooth Module
+
+ $Returns:		None
+
+ $Arguments:		event	: Event Id returned from the Bluetooth Module
+ 				data		: pointer to the relevant data returned from the Mluetooth Module
+
+*******************************************************************************/
+void	mfw_bt_dm_search_cb(T_MFW_BT_DM_SRCH_EVT event, T_MFW_BT_DM_SRCH_SIG_DATA *data)
+{
+	int dataLen;
+	T_MFW_BT_STATUS	geRetVal = MFW_BT_SUCCESS;
+
+	MFW_BT_TRACE("mfw_bt_Dm_Search_Cb");
+
+	/*
+	** Set the expected data size according to the received event
+	*/
+	switch (event)
+	{
+		case BTA_DM_INQ_RES_EVT:
+			dataLen = sizeof(tBTA_DM_INQ_RES);
+			break;
+
+		case BTA_DM_INQ_CMPL_EVT:
+			dataLen = sizeof(tBTA_DM_INQ_CMPL);
+			break;
+
+		case BTA_DM_DISC_RES_EVT:
+			dataLen = sizeof(tBTA_DM_DISC_RES);
+			break;
+
+		case BTA_DM_DISC_CMPL_EVT:
+			dataLen = 0;
+			break;
+
+		case BTA_DM_SEARCH_CANCEL_CMPL_EVT:
+			dataLen = 0;
+			break;
+
+
+		default:
+			/*
+			** Unexpected Event, setthe data sized to -1 to exit with no further action
+			*/
+			MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Unexpected Event %d", event);
+			dataLen = -1;
+			
+	}
+
+
+	if (dataLen > 0)
+	{
+		/*
+		** Data is expected with the received signal
+		*/
+		if ((void *)data == (void *)0)
+		{
+			/*
+			** The data pointer is NULL, report the error
+			*/
+			MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Event : %d, Data Pointer is NULL, but data is expected", event);
+		}
+		else
+		{
+			/*
+			** Post the event and data to the Generic event handler
+			*/
+			geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SEARCH, (ULONG)event, (void *)data, dataLen);
+		}
+	}
+	else if (dataLen == 0)
+	{
+		/*
+		** There is no expected data with the received signal, post the event to the Generic event handler
+		*/
+		geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SEARCH, (ULONG)event, (void *)0, 0);
+	}
+
+	if (geRetVal != MFW_BT_SUCCESS)
+	{
+		/*
+		** There is an error, but there is nothing that can be done other than to report it.
+		*/
+		MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Failed to post the event. Error %d", geRetVal);
+	}
+
+	return;
+}
+
+