diff g23m/condat/ms/src/bmi/mmiBluetooth.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/bmi/mmiBluetooth.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,4736 @@
+/*
++-------------------------------------------------------------------+
+| PROJECT: MMI-Framework (8445)		$Workfile:: mmiBluetooth.c			$|
+| $Author:: NDH						$Revision::  1						$|
+| CREATED: 26.04.04					$Modtime:: 26.04.04 10:21			$|
+| STATE  : code														 |
++-------------------------------------------------------------------+
+
+
+   MODULE  : MFW_BT
+
+   PURPOSE : This module contains the functions for MFW Bluetooth Management
+
+
+*/
+
+#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"
+#include "prim.h"
+
+#else
+
+#include "STDDEFS.H"
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+
+#endif
+
+#include "message.h" /* included for aci_cmh.h .... */
+//#include "prim.h" /* included for aci_cmh.h .... */
+#include "aci_cmh.h" /* included for mfw_sat.h, included for MmiDummy.h, included for MmiMenu.h */
+
+#include "mfw_mfw.h"
+#include "mfw_win.h"
+#include "mfw_icn.h"	/* included for mfw_mnu.h */
+#include "mfw_mnu.h"
+#include "mfw_tim.h"
+#include "mfw_kbd.h"
+#include "mfw_sat.h" /* included for MmiDummy.h, included for MmiMenu.h */
+
+#include "mfw_bte.h"
+#include "mfw_bt_dm.h"
+#include "mfw_bt_dg.h"
+#include "mfw_bt_ag.h"
+#include "mfw_bt_op.h"
+#include "mfw_bt_ft.h"
+#include "mfw_bt_geh.h"
+//#include "mfw_bt_temp.h"
+
+#include "MmiBlkLangDB.h"
+#include "mmiColours.h"
+#include "MmiDialogs.h"
+#include "mmiBluetooth.h"
+
+#include "MmiDummy.h" /* included for MmiMenu.h */
+#include "MmiLists.h"
+#include "MmiMenu.h"
+
+#include "MmiSoftKeys.h"
+
+#include "AUIEditor.h"
+
+/*
+** Local Typedefs
+*/
+typedef struct{
+	MfwHnd			bt_win;
+	MfwHnd			bt_dev_name_win;
+	MfwHnd			bt_pin_req_win;
+	MfwHnd			bt_authorize_win;
+	MfwHnd			bt_discoverable_timer;
+	MfwHnd			bt_connection_timer;
+	
+	BOOL			bt_isEnabled;
+	BOOL			bt_isActive;
+	BOOL			bt_stopBtOnDiscoverableTimeout;
+	BOOL			bt_DevNameForStartup;
+	UBYTE			bt_num_active_connections;
+}	T_MMI_BtData;
+
+
+typedef struct{
+	T_MMI_CONTROL	mmi_control;
+
+	MfwHnd			win;
+	MfwHnd			bt_auth_info_win;
+	MfwHnd			bt_auth_info_editor;
+	MfwHnd			bt_auth_menu;
+
+	T_MFW_BT_DM_AUTHORIZE_REQ	*bt_auth_req_param;
+	UBYTE						*bt_auth_info_text;
+	USHORT						bt_auth_info_text_size;
+	
+}	T_MMI_BT_Authorise_Data;
+
+
+typedef struct{
+	T_MMI_CONTROL	mmi_control;
+
+	MfwHnd			win;
+	MfwHnd			bt_dev_name_editor;
+	UBYTE			bt_device_name[MFW_BT_NAME_LENGTH+1];
+	T_MFW_BT_DM_DEV_ADDR	bt_dev_address;			/* CQ21843 - Bt Addr of remote device */
+	T_MFW_BT_REM_DEVICE_INFO *rem_device_info;		/* CQ21843 - Global information about the remote device*/
+}	T_MMI_BT_Dev_Name_Data;
+
+
+typedef struct{
+	T_MMI_CONTROL	mmi_control;
+
+	MfwHnd			win;
+	MfwHnd			bt_pin_req_editor;
+	MfwHnd			bt_please_wait_dialog;
+	
+	T_MFW_BT_DM_DEV_ADDR	bt_pin_req_dev;
+	UBYTE			bt_pin_req_buf[MFW_BT_MAX_PIN_CODE_LEN+1];
+
+	T_BT_REQ_RESP	bt_required_response;
+}	T_MMI_BT_PIN_Req_Data;
+
+#if 0
+typedef struct {
+	T_MFW_BT_DM_DEV_ADDR	bd_addr;
+	UBYTE					bd_name[MFW_BT_NAME_LENGTH + 1];
+	T_MFW_BT_SERVICE_MASK	services;
+	BOOL					isPaired;
+	BOOL					isKnown;
+	BOOL					isTrustued;
+	T_MFW_BT_SERVICE_MASK	trustedServices;
+} T_MMI_BtDevDetails;
+#endif
+
+typedef struct{
+	T_MMI_CONTROL				srch_bt_control;
+
+	MfwHnd						win;
+	MfwHnd						srch_bt_cmpnt;
+	MfwHnd						srch_bt_pairing_pin_editor;
+	MfwHnd						srch_bt_please_wait_dialog;
+	MfwHnd						srch_bt_dev_list_win;
+	MfwHnd						srch_bt_show_services_win;
+	MfwHnd						srch_bt_search_timer;
+	
+	T_BT_SEARCH_MODE			srch_bt_mode;
+
+	UBYTE						bt_pairing_pin_buf[MFW_BT_MAX_PIN_CODE_LEN+1];
+
+	T_BT_REQ_RESP				srch_bt_req_resp;
+
+	ListMenuData    				srch_bt_list_devices_menu_data;
+	ListMenuData    				srch_bt_show_services_menu_data;
+	UBYTE						srch_bt_num_devices;
+	UBYTE						srch_bt_device_count;
+	ListCbFunc					srch_bt_dev_list_cb;
+	T_MFW_BT_REM_DEVICE_INFO	*srch_bt_dev_list;
+	UBYTE						srch_bt_cur_dev_idx;
+	ULONG						srch_bt_cur_dev_serv_list[BTA_MAX_SERVICE_ID-1];
+}	T_MMI_BtSearchData;
+
+typedef struct
+{
+  T_MMI_CONTROL   mmi_control;
+  T_MFW_HND       win;
+  T_MFW_HND       kbd;
+  T_MFW_HND       kbd_long;
+  T_MFW_HND       menu;
+  T_VOID_FUNC     func_cb;
+  T_VOID_FUNC	cancel_cb;
+  /*
+   * internal data
+   */
+}T_bt_menu;
+
+/*
+** Local Defines
+*/
+#define BT_MAX_DISPLAY_DEV_NAME_LENGTH	20
+
+#define BT_INFO_SCRN_TIMEOUT		1500
+#define BT_SEARCH_RESP_TIMEOUT       15000		/* 15 seconds */
+#define BT_AUTHORISE_RESP_TIMEOUT 30000		/* 30 seconds */
+#define BT_DISCOVERABLE_DURATION	180000		/* 3 minutes */
+#define BT_CONNECTION_DURATION	60000		/* 1 minute */
+
+/*
+** Local Function Prototypes
+*/
+static int  mmi_bluetooth_device_mnu_cb(MfwMnu * mnu, MfwMnuItem * item);
+static void mmi_bluetooth_editor_cb(T_MFW_HND win, USHORT identifier, SHORT reason);
+static int mmi_bluetooth_search_cb(T_MFW_EVENT evnt, void* para);
+static int mmi_bluetooth_root_cb(T_MFW_EVENT evnt, void* para);
+static int mmi_bluetooth_search_timer_cb(MfwEvt e, MfwTim *t);
+static int mmi_bluetooth_discovery_timer_cb(MfwEvt e, MfwTim *t);
+static int mmi_bluetooth_connection_timer_cb(MfwEvt e, MfwTim *t);
+static void mmi_bluetooth_dlg_cb(void);
+static void mmi_bt_srch_no_device_found_dlg_cb(void);
+static MfwHnd mmi_bluetooth_show_please_wait(T_MFW_HND parent);
+static MfwHnd mmi_bluetooth_show_info_callback(T_MFW_HND parent, int str1, int str2, T_VOID_FUNC callback);
+static MfwHnd mmi_bluetooth_show_info(T_MFW_HND parent, int str1, int str2);
+
+T_MFW_HND bt_menu_start(MfwHnd parent,MfwMnuAttr* menuAttr,T_VOID_FUNC func_cb);
+static T_MFW_HND bt_menu_create(MfwHnd parent);
+static void bt_menu_destroy(MfwHnd window);
+static void bt_menu (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
+static int bt_menu_mnu_cb (MfwEvt e, MfwMnu *m);
+static int bt_menu_win_cb (MfwEvt e, MfwWin *w);
+static int bt_menu_kbd_cb (MfwEvt e, MfwKbd *k);
+static int bt_menu_kbd_long_cb (MfwEvt e, MfwKbd *k);
+static void mmi_bt_authorize_editor_cb(T_MFW_HND win, USHORT identifier, SHORT reason);
+static int mmi_bt_authorize_display_info(MfwMnu* m, MfwMnuItem* i);
+static int mmi_bt_authorize_once(MfwMnu* m, MfwMnuItem* i);
+static int mmi_bt_authorize_always(MfwMnu* m, MfwMnuItem* i);
+static int mmi_bt_dont_authorize(MfwMnu* m, MfwMnuItem* i);
+static void mmi_bt_authorize_rsk(void);
+static int bt_srch_dev_pair (MfwMnu * mnu, MfwMnuItem * item);
+static int bt_srch_dev_show_services (MfwMnu * mnu, MfwMnuItem * item);
+static int bt_srch_dev_set_name (MfwMnu * mnu, MfwMnuItem * item);		/* CQ21843 - Menu Action Function to set Friendly name for Remote device */
+static int bt_srch_dev_add_known (MfwMnu * mnu, MfwMnuItem * item);
+static int bt_srch_dev_rem_known (MfwMnu * mnu, MfwMnuItem * item);
+static void bt_srch_dev_list_searching_cb(T_MFW_HND Parent, ListMenuData *ListData);
+static void bt_srch_dev_list_listmnu_cb(T_MFW_HND Parent, ListMenuData * ListData);
+static void bt_srch_service_list_listmnu_cb(T_MFW_HND Parent, ListMenuData * ListData);
+static int bt_count_dev_services(T_MFW_BT_SERVICE_MASK services, T_MFW_BT_SERVICE_MASK *srv_mask_arry);
+static int bt_get_TxtId_for_service(T_MFW_BT_SERVICE_MASK service);
+
+/*
+** Local Static Data
+*/
+static  MfwMnuItem menuBtAuthorizeItems[] =
+{
+	{0,0,0, (char*) TxtBtInfo,  		0, (MenuFunc)mmi_bt_authorize_display_info,	item_flag_none},
+	{0,0,0, (char*) TxtBtYesOnce,	0, (MenuFunc)mmi_bt_authorize_once,			item_flag_none},
+	{0,0,0, (char*) TxtBtYesAlways,	0, (MenuFunc)mmi_bt_authorize_always,			item_flag_none},
+	{0,0,0, (char*) TxtNo,			0, (MenuFunc)mmi_bt_dont_authorize,			item_flag_none }
+};
+
+static const MfwMnuAttr menuBtAuthorize =
+{
+	&menuArea,
+	MNU_LEFT | MNU_LIST | MNU_CUR_LINE,					/* centered page menu       */
+	-1,													/* use default font         */
+	(MfwMnuItem*)menuBtAuthorizeItems,				/* with these items         */
+	sizeof(menuBtAuthorizeItems)/sizeof(MfwMnuItem),	/* number of items          */
+	COLOUR_LIST_XX,										/* Colour */
+	TxtBtAuthorize,										/* Hdr Id */
+	NULL,												/* Background */
+	MNUATTRSPARE										/* unused */
+};
+
+
+static MfwMnuAttr menuBtSearchListAttr =
+{
+	&menuArea,
+	MNU_LEFT | MNU_LIST | MNU_CUR_LINE,		/* centered page menu       */
+	-1,										/* use default font         */
+	NULL,									/* with these items (filled in later)  */
+	0,										/* number of items (filled in leter)  */
+	COLOUR_LIST_XX,							/* Colour */
+	TxtNull,									/* Hdr Id */
+	NULL,									/* Background */
+	MNUATTRSPARE							/* unused */
+};
+
+
+static MfwMnuAttr menuBtShowServicesListAttr =
+{
+	&menuArea,
+	MNU_LEFT | MNU_LIST | MNU_CUR_LINE,		/* centered page menu       */
+	-1,										/* use default font         */
+	NULL,									/* with these items (filled in later)  */
+	0,										/* number of items (filled in leter)  */
+	COLOUR_LIST_XX,							/* Colour */
+	TxtNull,									/* Hdr Id */
+	NULL,									/* Background */
+	MNUATTRSPARE							/* unused */
+};
+
+static  MfwMnuItem menuBtDeviceOptionsItems[] =
+{
+	{0,0,0, (char*) 0,  	0, (MenuFunc)bt_srch_dev_pair,			isBtDevicePaired},
+	{0,0,0, (char*) 0,	0, (MenuFunc)bt_srch_dev_pair,			isBtDeviceUnPaired},
+	{0,0,0, (char*) 0,	0, (MenuFunc)bt_srch_dev_show_services,	item_flag_none},
+	{0,0,0, (char*) 0,	0, (MenuFunc)bt_srch_dev_set_name,		isBtDeviceUnknown},		/* CQ21843 - Added Menu option*/
+	{0,0,0, (char*) 0,	0, (MenuFunc)bt_srch_dev_add_known,		isBtDeviceKnown},
+	{0,0,0, (char*) 0,	0, (MenuFunc)bt_srch_dev_rem_known,		isBtDeviceUnknown},
+};
+
+/*
+** CQ22023 : The Menu attributes should not be const, because the Header Id is to change depending on the Device Name
+**			Also MNU_HDRFORMAT_STR has to be added to the Menu Mode to allow a Real-Time string to be used as
+**			the Header Id.
+*/
+static MfwMnuAttr menuBtDeviceOptions =
+{
+	&menuArea,
+	MNU_LEFT | MNU_LIST | MNU_CUR_LINE | MNU_HDRFORMAT_STR, 	/* centered page menu       */
+	-1,													/* use default font         */
+	(MfwMnuItem*)menuBtDeviceOptionsItems,				/* with these items         */
+	sizeof(menuBtDeviceOptionsItems)/sizeof(MfwMnuItem),	/* number of items          */
+	COLOUR_LIST_XX,										/* Colour */
+	TxtNull,												/* Hdr Id */
+	NULL,												/* Background */
+	MNUATTRSPARE										/* unused */
+};
+
+#if 0
+static  MfwMnuItem menuBtServiceOptionsItems[] =
+{
+	{0,0,0, (char*) TxtBtAuthorize,  		0, (MenuFunc)bt_srch_serv_authorize,				isBtServiceTrusted},
+	{0,0,0, (char*) TxtBtUnAuthorize,		0, (MenuFunc)bt_srch_serv_revoke_authorization,	isBtServiceNotTrusted},
+};
+
+static const MfwMnuAttr menuBtServiceOptions =
+{
+	&menuArea,
+	MNU_LEFT | MNU_LIST | MNU_CUR_LINE,					/* centered page menu       */
+	-1,													/* use default font         */
+	(MfwMnuItem*)menuBtServiceOptionsItems,				/* with these items         */
+	sizeof(menuBtServiceOptionsItems)/sizeof(MfwMnuItem),	/* number of items          */
+	COLOUR_LIST_XX,										/* Colour */
+	TxtNull,												/* Hdr Id */
+	NULL,												/* Background */
+	MNUATTRSPARE										/* unused */
+};
+#endif
+
+/*
+** Bluetooth defined Global Data
+*/
+T_MMI_BtData		bt_data = {0};
+
+T_MMI_BtSearchData bt_srch_data = {0};
+
+extern MfwHnd mainMmiLng;
+
+#if 0
+/*
+** Test Specific Local Typedefs
+*/
+typedef void (*MfwBtCb) (int, void *);
+
+/*
+** Test Specific Local Defines
+*/
+#define mmiBtModTestDevMngr		1
+#define mmiBtModTestDevMngrSrch	2
+#define mmiBtModTestDevMngrSec		3
+#define mmiBtModTestDataGw			4
+#define mmiBtModTestAudioGw		5
+#define mmiBtModTestObjPush		6
+#define mmiBtModTestObjPushClient	7
+#define mmiBtModTestObjPushServer	8
+#define mmiBtModTestFileTxfr			9
+#define mmiBtModTestFileTxfrClient	10
+#define mmiBtModTestFileTxfrServer	11
+
+/*
+** Test Specific Local Static Data
+*/
+static int btModuleUnderTest = 0;
+static MfwBtCb btModuleUnderTestCb = 0;
+
+
+/*
+** Module Test Function Definitoins
+*/
+/*******************************************************************************
+
+ $Function:		bluetoothTestDevMngr
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is the Device Manager
+ 				profile which is under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestDevMngr (void)
+{
+	TRACE_EVENT("bluetoothTestDevMngr");
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestDevMngrSrch
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is the Device Manager
+ 				(Search) profile which is under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestDevMngrSrch (void)
+{
+	TRACE_EVENT("bluetoothTestDevMngr");
+
+	btModuleUnderTest = mmiBtModTestDevMngrSrch;
+	btModuleUnderTestCb = (MfwBtCb)mfw_bt_Dm_Search_Cb;
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestDevMngrSec
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is the Device Manager
+ 				(Security) profile which is under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestDevMngrSec (void)
+{
+	TRACE_EVENT("bluetoothTestDevMngr");
+
+	btModuleUnderTest = mmiBtModTestDevMngrSec;
+	btModuleUnderTestCb = (MfwBtCb)mfw_bt_Dm_Security_Cb;
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestDataGw
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is the Data Gateway
+ 				profile which is under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestDataGw (void)
+{
+	TRACE_EVENT("bluetoothTestDataGw");
+
+	btModuleUnderTest = mmiBtModTestDataGw;
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestAudioGw
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is the Audion Gateway
+ 				profile which is under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestAudioGw (void)
+{
+	TRACE_EVENT("bluetoothTestAudioGw");
+
+	btModuleUnderTest = mmiBtModTestAudioGw;
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestObjPush
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is the Object Push
+ 				profile which is under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestObjPush (void)
+{
+	TRACE_EVENT("bluetoothTestObjPush");
+
+	btModuleUnderTest = mmiBtModTestObjPush;
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestFileTxfr
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is the File Transfer
+ 				profile which is under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestFileTxfr (void)
+{
+	TRACE_EVENT("bluetoothTestFileTxfr");
+
+	btModuleUnderTest = mmiBtModTestFileTxfr;
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestClient
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is either the
+ 				Object Push or File Transfer Client profiles which are under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestClient (void)
+{
+	TRACE_EVENT("bluetoothTestClient");
+
+	if (btModuleUnderTest == mmiBtModTestObjPush)
+	{
+		btModuleUnderTest = mmiBtModTestObjPushClient;
+		btModuleUnderTestCb = (MfwBtCb)mfw_bt_Opc_Cb;
+	}
+	else
+	{
+		btModuleUnderTest = mmiBtModTestFileTxfrClient;
+		btModuleUnderTestCb = (MfwBtCb)mfw_bt_Ftc_Cb;
+	}
+}
+
+/*******************************************************************************
+
+ $Function:		bluetoothTestServer
+
+ $Description:		This function sets a flag for the Test Menu to indicate that it is either the
+ 				Object Push or File Transfer Server profiles which are under test
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+void bluetoothTestServer (void)
+{
+	TRACE_EVENT("bluetoothTestServer");
+
+	if (btModuleUnderTest == mmiBtModTestObjPush)
+	{
+		btModuleUnderTest = mmiBtModTestObjPushServer;
+		btModuleUnderTestCb = (MfwBtCb)mfw_bt_Ops_Cb;
+	}
+	else
+	{
+		btModuleUnderTest = mmiBtModTestFileTxfrServer;
+		btModuleUnderTestCb = (MfwBtCb)mfw_bt_Fts_Cb;
+	}
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_test_single_msg
+
+ $Description:		This function test the sending of a single event via the appropriate profile callback
+
+ $Returns:		None
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_test_single_msg (MfwMnu* mnu, MfwMnuItem* item)
+{
+	int event;
+	U8 *sigData = mfwAlloc(sizeof(T_MFW_BT_SIG_DATA));
+
+	TRACE_EVENT("mmi_bluetooth_test_single_msg");
+	memset(sigData, 0x37, sizeof(T_MFW_BT_SIG_DATA));
+
+	switch (btModuleUnderTest)
+	{
+		case mmiBtModTestDevMngrSrch:
+			event = BTA_DM_INQ_RES_EVT;
+			break;
+
+		case mmiBtModTestDevMngrSec:
+			event = BTA_DM_ENABLE_EVT;
+			break;
+			
+		case mmiBtModTestDataGw:
+			event = BTA_DG_LISTEN_EVT;
+			break;
+
+		case mmiBtModTestAudioGw:
+			event = BTA_AG_OPEN_EVT;
+			break;
+
+		case mmiBtModTestObjPushClient:
+			event = BTA_OPC_OBJECT_EVT;
+			break;
+
+		case mmiBtModTestObjPushServer:
+			event = BTA_OPS_CLOSE_EVT;
+			break;
+
+		case mmiBtModTestFileTxfrClient:
+			event = BTA_FTC_ENABLE_EVT;
+			break;
+
+		case mmiBtModTestFileTxfrServer:
+			event = BTA_FTS_AUTH_EVT;
+			break;
+
+		default:
+			TRACE_EVENT("mmi_bluetooth_test_single_msg > Invalid Test Module");
+			mfwFree(sigData, sizeof(T_MFW_BT_SIG_DATA));
+			return 1;
+	}
+
+	btModuleUnderTestCb(BTA_DG_LISTEN_EVT, sigData);
+
+	mfwFree(sigData, sizeof(T_MFW_BT_SIG_DATA));
+	return 1;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_test_multi_msg
+
+ $Description:		This function test the sending of a multiple events via the appropriate profile callback
+
+ $Returns:		None
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_test_multi_msg (MfwMnu* mnu, MfwMnuItem* item)
+{
+	U8 *sigData = mfwAlloc(sizeof(T_MFW_BT_SIG_DATA));
+	int	iLoop, iLoopMaxVal;
+	unsigned char chInit;
+
+	TRACE_EVENT("mmi_bluetooth_test_multi_msg");
+
+	chInit = 0x41;
+
+	switch (btModuleUnderTest)
+	{
+		case mmiBtModTestDevMngrSrch:
+			iLoopMaxVal = BTA_DM_DISC_CMPL_EVT;
+			break;
+
+		case mmiBtModTestDevMngrSec:
+			iLoopMaxVal = BTA_DM_SIG_STRENGTH_EVT;
+			break;
+			
+		case mmiBtModTestDataGw:
+			iLoopMaxVal = BTA_DG_CLOSE_EVT;
+			break;
+
+		case mmiBtModTestAudioGw:
+			iLoopMaxVal = BTA_AG_AT_CNUM_EVT;
+			break;
+
+		case mmiBtModTestObjPushClient:
+			iLoopMaxVal = BTA_OPC_CLOSE_EVT;
+			break;
+
+		case mmiBtModTestObjPushServer:
+			iLoopMaxVal = BTA_OPS_CLOSE_EVT;
+			break;
+
+		case mmiBtModTestFileTxfrClient:
+			iLoopMaxVal = BTA_FTC_GETFILE_EVT;
+			break;
+
+		case mmiBtModTestFileTxfrServer:
+			iLoopMaxVal = BTA_FTS_AUTH_EVT;
+			break;
+
+		default:
+			TRACE_EVENT("mmi_bluetooth_test_multi_msg > Invalid Test Module");
+			mfwFree(sigData, sizeof(T_MFW_BT_SIG_DATA));
+			return 1;
+	}
+
+	for (iLoop = 0; iLoop <= iLoopMaxVal; iLoop++)
+	{
+		chInit++;
+		memset(sigData, chInit, sizeof(T_MFW_BT_SIG_DATA));
+		
+		btModuleUnderTestCb(iLoop, sigData);
+	}
+
+	mfwFree(sigData, sizeof(T_MFW_BT_SIG_DATA));
+
+	return 1;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_test_buf_ovrflow
+
+ $Description:		This function testS the sending of a multiple events via the appropriate profile callback,
+ 				causing a buf overflow of the event buffer
+
+ $Returns:		None
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_test_buf_ovrflow(MfwMnu* mnu, MfwMnuItem* item)
+{
+	int event;
+	U8 *sigData = mfwAlloc(sizeof(T_MFW_BT_SIG_DATA));
+	int	iLoop, iLoopMaxVal;
+	unsigned char chInit;
+
+	TRACE_EVENT("mmi_bluetooth_test_multi_msg");
+
+	chInit = 0x61;
+
+	switch (btModuleUnderTest)
+	{
+		case mmiBtModTestDevMngrSrch:
+			iLoopMaxVal = BTA_DM_DISC_CMPL_EVT;
+			break;
+
+		case mmiBtModTestDevMngrSec:
+			iLoopMaxVal = BTA_DM_SIG_STRENGTH_EVT;
+			break;
+			
+		case mmiBtModTestDataGw:
+			iLoopMaxVal = BTA_DG_CLOSE_EVT;
+			break;
+
+		case mmiBtModTestAudioGw:
+			iLoopMaxVal = BTA_AG_AT_CNUM_EVT;
+			break;
+
+		case mmiBtModTestObjPushClient:
+			iLoopMaxVal = BTA_OPC_CLOSE_EVT;
+			break;
+
+		case mmiBtModTestObjPushServer:
+			iLoopMaxVal = BTA_OPS_CLOSE_EVT;
+			break;
+
+		case mmiBtModTestFileTxfrClient:
+			iLoopMaxVal = BTA_FTC_GETFILE_EVT;
+			break;
+
+		case mmiBtModTestFileTxfrServer:
+			iLoopMaxVal = BTA_FTS_AUTH_EVT;
+			break;
+
+		default:
+			TRACE_EVENT("mmi_bluetooth_test_multi_msg > Invalid Test Module");
+			mfwFree(sigData, sizeof(T_MFW_BT_SIG_DATA));
+			return 1;
+	}
+
+
+	event  = 0;
+	for (iLoop = 0; iLoop <= MFW_BT_MAX_SIG_Q_ENTRIES+1; iLoop++)
+	{
+		chInit++;
+		memset(sigData, chInit, sizeof(T_MFW_BT_SIG_DATA));
+		
+		btModuleUnderTestCb(event, sigData);
+		event++;
+		if (event > iLoopMaxVal)
+			event = 0;
+	}
+
+	mfwFree(sigData, sizeof(T_MFW_BT_SIG_DATA));
+
+	return 1;
+}
+#endif
+
+/*
+** Module Function Definitions
+*/
+
+/*******************************************************************************
+
+ $Function:		isBluetoothActive
+
+ $Description:		This function checks to determine whether Bluetooth is enabled
+
+ $Returns:		USHORT : 1 is Bluetooth is Enabled, 0 otherwise
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isBluetoothActive( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
+{
+	MFW_BT_TRACE("isBluetoothActive()");
+
+	if (bt_data.bt_isActive)
+		return 1;
+	
+	return 0;
+}
+
+/*******************************************************************************
+
+ $Function:		isBluetoothInactive
+
+ $Description:		This function checks to determine whether Bluetooth is disabled
+
+ $Returns:		USHORT : 1 is Bluetooth is Disabled, 0 otherwise
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isBluetoothInactive ( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
+{
+	MFW_BT_TRACE("isBluetoothInactive()");
+
+	if (bt_data.bt_isActive == FALSE)
+		return 1;
+
+	return 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_automatic
+
+ $Description:		This function performs the necessary steps to enable bluetooth. It creates a dialog,
+ 				with the MfwRoot as the parent, and calls the MFW BT functions
+
+ $Returns:		Always returnd MFW_EVENT_CONSUMED (1)
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int mmi_bluetooth_automatic (MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_HND win = mfw_parent(mfw_header());
+
+	MFW_BT_TRACE("mmi_bluetooth_automatic()");
+
+	/*
+	** Create a timed dialog to display the Message "Bluetooth Failed"
+	*/
+	mmi_bluetooth_show_info(win, TxtNotAvailable, TxtNull);
+}
+
+/*******************************************************************************
+
+ $Function:		isBtDevicePaired
+
+ $Description:		This function checks to determine whether the active device is Paired or not.
+
+ $Returns:		USHORT : 1 is Device is Paired, 0 otherwise
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isBtDevicePaired ( MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi )
+{
+	T_MFW_BT_REM_DEVICE_INFO *cur_device = &bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx];
+
+	MFW_BT_TRACE("isBtDevicePaired()");
+	
+	if (cur_device->link_key_present != FALSE)
+		return 1;
+
+	return 0;
+}
+
+/*******************************************************************************
+
+ $Function:		isBtDeviceUnPaired
+
+ $Description:		This function is the opposite of isBtDevicePaired (above)
+
+ $Returns:		USHORT : 1 is Device is Not Paired, 0 otherwise
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isBtDeviceUnPaired( MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi )
+{
+	T_MFW_BT_REM_DEVICE_INFO *cur_device = &bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx];
+
+	MFW_BT_TRACE("isBtDeviceUnPaired()");
+
+	if (cur_device->link_key_present != FALSE)
+		return 0;
+
+	return 1;
+}
+
+/*******************************************************************************
+
+ $Function:		isBtDeviceKnown
+
+ $Description:		This function checks to determine whether the active device is Known or not.
+
+ $Returns:		USHORT : 1 is Device is Known, 0 otherwise
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isBtDeviceKnown( MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi )
+{
+	T_MFW_BT_REM_DEVICE_INFO *cur_device = &bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx];
+
+	MFW_BT_TRACE("isBtDeviceKnown()");
+
+	if (cur_device->is_new == FALSE)
+		return 1;
+
+	return 0;
+}
+
+/*******************************************************************************
+
+ $Function:		isBtDeviceUnknown
+
+ $Description:		This function is the opposite of isBtDeviceKnown (above).
+
+ $Returns:		USHORT : 1 is Device is Not Known, 0 otherwise
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isBtDeviceUnknown( MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi )
+{
+	T_MFW_BT_REM_DEVICE_INFO *cur_device = &bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx];
+
+	MFW_BT_TRACE("isBtDeviceUnknown()");
+
+	if (cur_device->is_new == FALSE)
+		return 0;
+
+	return 1;
+}
+
+/*
+** CQ 21834 : The following function is required to hide a Known Device in the List whem it is removed
+** 			 from the Known Devices Database
+*/
+/*******************************************************************************
+
+ $Function:		isListDeviceUnknown
+
+ $Description:		This function is determines whether the current device in the known device list
+ 				is still in the Known Devices Database.
+
+ $Returns:		USHORT : 1 is Device is Not Known, 0 otherwise
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isListDeviceUnknown( MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi )
+{
+	int index;
+	int indexFound = 0;
+	MfwMnuItem *mItem;
+	T_MFW_BT_REM_DEVICE_INFO *cur_device;
+
+	index = 0;
+	while ((indexFound == 0) && (index < ma->nItems))
+	{
+		mItem = &(ma->items[index]);
+
+		if (mItem == mi)
+			indexFound = 1;
+		else
+			index++;
+	}
+
+	if (indexFound == 1)
+	{
+		MFW_BT_TRACE_P1("isListDeviceUnknown()  index = %d", index);
+	}
+	else
+	{
+		MFW_BT_TRACE("isListDeviceUnknown()  : Unable to determine Index");
+	}
+
+	cur_device = &bt_srch_data.srch_bt_dev_list[index];
+
+	if (cur_device->is_new == FALSE)
+		return 0;
+
+	return 1;
+}
+
+/*
+** CQ 21834 : The following function is required to determine whether a "No Devices" entry in the
+**			 Known Devices list should be visible. Without the "No Devices" Entry the list would
+**			 be empty, and this is not handled correctly in the BMI.
+*/
+/*******************************************************************************
+
+ $Function:		isDeviceListEmpty
+
+ $Description:		This function determines whether there are any entries in the known devices
+ 				database.
+
+ $Returns:		USHORT : 0 if the Known Device Database is Empty, 1 otherwise.
+
+ $Arguments:		Not Used.
+
+*******************************************************************************/
+USHORT isDeviceListEmpty( MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi )
+{
+	int index;
+	T_MFW_BT_REM_DEVICE_INFO *cur_device;
+	T_MFW_WIN	* win_data;
+	ListWinInfo	* data;
+
+	MFW_BT_TRACE("isDeviceListEmpty()");
+	
+	for (index = 0; index < (ma->nItems -1); index++)
+	{
+		cur_device = &bt_srch_data.srch_bt_dev_list[index];
+
+		if (cur_device->is_new == FALSE)
+			return 1;
+	}
+
+	/*
+	** The list is otherwise empty so :
+	** 	1. remove the left soft key
+	**	2. ensure that the "No Devices" entry is displayed
+	*/
+	
+	win_data = ((T_MFW_HDR *)bt_srch_data.srch_bt_dev_list_win)->data;
+	data = (ListWinInfo *)win_data->user;
+
+	data->MenuData.LeftSoftKey = TxtNull;
+	return 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_init
+
+ $Description:		This function initializes the Bluetooth functionality on MMI startup
+
+ $Returns:		none
+
+ $Arguments:		none.
+
+*******************************************************************************/
+
+void  mmi_bt_exit (void)
+{
+	T_MMI_BtData		*data = &bt_data;
+	
+	MFW_BT_TRACE("mmi_bt_exit()");
+	if (data->bt_isEnabled == FALSE)
+		return;
+	
+	mfw_bt_delete(data->bt_win);
+	timDelete(data->bt_discoverable_timer);
+	timDelete(data->bt_connection_timer);
+
+	mfw_bt_exit();
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_init
+
+ $Description:		This function initializes the Bluetooth functionality on MMI startup
+
+ $Returns:		none
+
+ $Arguments:		none.
+
+*******************************************************************************/
+
+void mmi_bt_init (void)
+{
+	T_MMI_BtData		*data = &bt_data;
+	
+	MFW_BT_TRACE("mmi_bt_init()");
+	
+	mfw_bt_init();			/* Initialize Bluetooth Module */
+
+
+	data->bt_isEnabled = TRUE;
+
+	/*
+	** Create a Bluetooth component
+	*/
+	MFW_BT_TRACE("mmi_bt_init > Creating the MFW_BT component");
+
+	if (data->bt_win == (void *)0)
+	{
+		data->bt_win = mfw_bt_create(0, E_BT_ALL_SERVICES, (MfwCb)mmi_bluetooth_root_cb);
+	}
+
+	if (data->bt_win == (void *)0)
+	{
+		MFW_BT_TRACE("mmi_bt_init > MFW_BT Component Failure");
+		data->bt_isEnabled = FALSE;
+	}
+	else
+	{
+
+		/*
+		** Create a Timer component for the "Discoverable" Timeout
+		*/
+		MFW_BT_TRACE("mmi_bt_init > Creating the discoverable timer");
+		if (data->bt_discoverable_timer == (void *)0)
+			data->bt_discoverable_timer = timCreate(0,
+												BT_DISCOVERABLE_DURATION,
+												(MfwCb)mmi_bluetooth_discovery_timer_cb);
+
+		if (data->bt_discoverable_timer == (void *)0)
+		{
+			MFW_BT_TRACE("mmi_bt_init > Discoverable timer creation failed ");
+			data->bt_isEnabled = FALSE;
+			/*
+			** Timer Compnonent Failed to start, delete previous components
+			*/
+			mfw_bt_delete(data->bt_win);
+		}
+		else
+		{
+
+			/*
+			** Create a Timer component for the "Connection" Timeout, when the timeout expires
+			** for the device being discoverable, but the is still a BT connection in progress
+			*/
+			MFW_BT_TRACE("mmi_bt_init > Creating the connection timer");
+			if (data->bt_connection_timer == (void *)0)
+				data->bt_connection_timer = timCreate(0,
+												     BT_CONNECTION_DURATION,
+												     (MfwCb)mmi_bluetooth_connection_timer_cb);
+			if (data->bt_connection_timer == (void *)0)
+			{
+				MFW_BT_TRACE("mmi_bt_init > Connection Timer creation failure");
+				data->bt_isEnabled = FALSE;
+				/*
+				** Timer Compnonent Failed to start, delete previous components
+				*/
+				mfw_bt_delete(data->bt_win);
+				timDelete(data->bt_discoverable_timer);
+			}
+			else
+			{
+				menuBtDeviceOptionsItems[0].str = MmiRsrcGetText(TxtBtPairDevice);
+				menuBtDeviceOptionsItems[1].str = MmiRsrcGetText(TxtBtChangePassKey);
+				menuBtDeviceOptionsItems[2].str = MmiRsrcGetText(TxtBtShowServices);
+				menuBtDeviceOptionsItems[3].str = MmiRsrcGetText(TxtBtSetLocalName);	/* CQ21843 - Menu Entry to Allow setting the Friendly Name */
+				menuBtDeviceOptionsItems[4].str = MmiRsrcGetText(TxtBtAddToKnown);
+				menuBtDeviceOptionsItems[5].str = MmiRsrcGetText(TxtBtRemoveDevice);
+			}
+		}
+	}
+	return;
+	
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_on
+
+ $Description:		This function performs the necessary steps to turn on bluetooth. It will create the
+ 				root window if required
+
+ $Returns:		Always returnd MFW_EVENT_CONSUMED (1)
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_on (MfwMnu* mnu, MfwMnuItem* item)
+{
+#if 1 /* Disable this while developing the test harness ... it'll come later */
+
+	T_MFW_BT_STATUS btRetVal;
+
+	MFW_BT_TRACE("mmi_bluetooth_on()");
+
+	if (bt_data.bt_isEnabled == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+	}
+	else
+	{
+		btRetVal = mfw_bt_enable(MFW_BT_DEFAULT_VIS);
+
+		if (btRetVal != MFW_BT_SUCCESS)
+		{
+			MFW_BT_TRACE_P1("mmi_bluetooth() : Attempt to enable Bluetooth Failed with %d", btRetVal);
+			/*
+			** Create a timed dialog to display the Message "Bluetooth Failed"
+			*/
+			mmi_bluetooth_show_info(0, TxtBluetooth, TxtFailed);
+		}
+	}
+
+	
+#else
+	T_MFW_BT_STATUS mfwBtRetVal;
+
+	mfwBtRetVal = mfw_bt_ge_enable();
+
+	if (mfwBtRetVal <= 0)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth Failed"
+		*/
+		mmi_bluetooth_show_info(TxtBluetooth, TxtFailed);
+	}
+	else
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth Activated"
+		*/
+		mmi_bluetooth_show_info(TxtBluetooth, TxtActivated);
+	}
+	
+#endif
+
+	return MFW_EVENT_CONSUMED;
+	
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_off
+
+ $Description:		This function performs the necessary steps to turn off bluetooth
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_off (MfwMnu* mnu, MfwMnuItem* item)
+{
+#if 1	/* Disable this while developing the test harness ... it'll come later */
+	T_MMI_BtData		*data = &bt_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_off()");
+
+	if (data->bt_isEnabled == FALSE)
+	{
+		return MFW_EVENT_CONSUMED;
+	}
+	else
+	{
+		if (data->bt_isActive != FALSE)
+		{
+			/*
+			** Disable the Bluetooth module
+			*/
+			mfw_bt_disable();
+
+			timStop(data->bt_discoverable_timer);
+			timStop(data->bt_connection_timer);
+		}
+	}
+#else
+	mfw_bt_Ge_Disable();
+
+	/*
+	** Create a timed dialog to display the Message "Bluetooth DeActivated"
+	*/
+	mmi_bluetooth_show_info(TxtBluetooth, TxtDeActivated);
+
+#endif
+
+	return MFW_EVENT_CONSUMED;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_change_name
+
+ $Description:		This function performs the necessary steps to change the name of the local device.
+ 				It will start an editor to prompt for the name, and allow the user to cancel the input.
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_change_name(MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+	
+	MfwHnd win = mfw_parent(mfw_header());
+
+	MFW_BT_TRACE("mmi_bluetooth_change_name()");	/* CQ21835 */
+
+	if (data->bt_isEnabled == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+	}
+	else if (data->bt_dev_name_win == (void *)0)
+	{
+		data->bt_DevNameForStartup = FALSE;
+
+		data->bt_dev_name_win = mmi_bt_dev_name_create(win);
+
+		if (data->bt_dev_name_win != (void *)0)
+		{
+			SEND_EVENT(data->bt_dev_name_win, BT_DEV_NAME_REQ, 0, (void *)0);
+		}
+		else
+		{
+			MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to create Device Name Win!");
+		}
+	}
+	else
+	{
+		MFW_BT_TRACE("mmi_bluetooth_root_cb() : Device Name Win already active");
+	}
+
+	return MFW_EVENT_CONSUMED;
+
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_set_discoverable_on
+
+ $Description:		This function performs the necessary steps to make this device discoverable, it
+ 				will turn on Bluetooth if it is currently off.
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_set_discoverable_on(MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_set_discoverable_on()");
+
+	if (data->bt_isEnabled == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+	}
+	else
+	{
+		timStop(data->bt_discoverable_timer);
+		timStop(data->bt_connection_timer);
+		btRetVal = mfw_bt_dm_set_visibility(TRUE, FALSE);	/* Shown, and permanently on */
+
+		if (btRetVal != MFW_BT_SUCCESS)
+		{
+			MFW_BT_TRACE_P1("mmi_bluetooth_set_discoverable_on() : Set Visibility (TRUE) failed with status : %d", btRetVal);
+			/*
+			** Create a timed dialog to display the Message "Failed"
+			*/
+			mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+		}
+		else
+		{
+			if (data->bt_isActive == FALSE)
+			{
+				/*
+				** Enable Bluetooth with the appropriate Visibility Mask
+				*/
+				btRetVal = mfw_bt_enable(MFW_BT_SHOWN);
+
+				if (btRetVal != MFW_BT_SUCCESS)
+				{
+					MFW_BT_TRACE_P1("mmi_bluetooth_set_discoverable_on() : Attempt to enable Bluetooth Failed with %d", btRetVal);
+					/*
+					** Create a timed dialog to display the Message "Failed"
+					*/
+					mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+				}
+			}
+			else
+			{
+				/*
+				** Create a timed dialog to display the Message "Device Discoverable"
+				*/
+				mmi_bluetooth_show_info(0, TxtBtDevice, TxtBtDiscoverable);
+			}
+		}
+	}
+
+	return MFW_EVENT_CONSUMED;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_set_discoverable_timed
+
+ $Description:		This function performs the necessary steps to make this device discoverable
+ 				for a preconfigured amount of time. It bluetooth is Off, it will be started. When
+ 				the time expiures, thew devicde will become hidden. If there is a connection
+ 				open, and bluetooth was started as a result of this request, the timer will be reset,
+ 				and when it expires with no connection active, bluetooth will be deactivated.
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_set_discoverable_timed(MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_set_discoverable_timed()");
+
+	if (data->bt_isEnabled == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+	}
+	else if (data->bt_isActive == FALSE)
+	{
+		/*
+		** Enable Bluetooth with the appropriate Visibility Mask
+		*/
+		btRetVal = mfw_bt_enable(MFW_BT_SHOWN);
+
+		if (btRetVal != MFW_BT_SUCCESS)
+		{
+			MFW_BT_TRACE_P1("mmi_bluetooth_set_discoverable_timed() : Attempt to enable Bluetooth Failed with %d", btRetVal);
+			/*
+			** Create a timed dialog to display the Message "Failed"
+			*/
+			mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+		}
+		else
+			data->bt_stopBtOnDiscoverableTimeout = TRUE;
+	}
+	else
+	{
+		btRetVal = mfw_bt_dm_set_visibility(TRUE, TRUE);
+
+		if (btRetVal != MFW_BT_SUCCESS)
+		{
+			MFW_BT_TRACE_P1("mmi_bluetooth_set_discoverable_timed() : Set Visibility (TRUE) failed with status : %d", btRetVal);
+			/*
+			** Create a timed dialog to display the Message "Failed"
+			*/
+			mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+		}
+		else
+		{
+			/*
+			** Create a timed dialog to display the Message "Device Discoverable"
+			*/
+			mmi_bluetooth_show_info(0, TxtBtDevice, TxtBtDiscoverable);
+			data->bt_stopBtOnDiscoverableTimeout = FALSE;
+		}
+	}
+
+	timStart(data->bt_discoverable_timer);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_set_discoverable_off
+
+ $Description:		This function performs the necessary steps to make this device hidden. It
+ 				will not change the state of Bluetooth, if it is on, it will remain on, but hidden,
+ 				if it is Off it will remain off.
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_set_discoverable_off(MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_set_discoverable_off()");
+
+	if (data->bt_isEnabled == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+	}
+	else
+	{
+		timStop(data->bt_discoverable_timer);
+		timStop(data->bt_connection_timer);
+
+		btRetVal = mfw_bt_dm_set_visibility(FALSE, FALSE);
+
+		if (btRetVal != MFW_BT_SUCCESS)
+		{
+			MFW_BT_TRACE_P1("mmi_bluetooth() : Set Visibility (FALSE) failed with status : %d", btRetVal);
+			/*
+			** Create a timed dialog to display the Message "Failed"
+			*/
+			mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+		}
+		else
+		{
+			mmi_bluetooth_show_info(0, TxtBtDevice, TxtBtHidden);
+		}
+	}
+	return MFW_EVENT_CONSUMED;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_device_search
+
+ $Description:		This function performs the necessary steps to search for local bluetooth devices.
+ 				It will only be avaiable if in the menu Bluetooth is active. It will start a new window
+ 				to specifically handle the search.
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_device_search(MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_HND win;
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+	T_MMI_BtSearchData *srch_data = &bt_srch_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_device_search()");
+
+	if (data->bt_isActive == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+		return MFW_EVENT_CONSUMED;
+	}
+	
+	if (srch_data->win == (void *)0)
+	{
+		win = mfw_parent(mfw_header());
+		
+		if (mmi_bt_search_create(win) == FALSE)
+		{
+			/*
+			** Create a timed dialog to display the Message "Failed"
+			*/
+			mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+			return MFW_EVENT_CONSUMED;
+		}
+		SEND_EVENT(srch_data->win, BT_DEVICE_SEARCH, 0, 0);
+	}
+	else
+	{
+		MFW_BT_TRACE("mmi_bluetooth_device_search > win not NULL!!!");
+		
+	}
+	
+	return MFW_EVENT_CONSUMED;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_list_known_devices
+
+ $Description:		This function performs the necessary steps to search for local bluetooth devices.
+ 				It will only be avaiable if in the menu Bluetooth is active. It will start a new window
+ 				to specifically handle the search.
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_list_known_devices(MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_HND win;
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+	T_MMI_BtSearchData *srch_data = &bt_srch_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_list_known_devices()");
+
+	if (data->bt_isEnabled == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+		return MFW_EVENT_CONSUMED;
+	}
+
+	if (srch_data->win == (void *)0)
+	{
+		win = mfw_parent(mfw_header());
+		
+		if (mmi_bt_search_create(win) == FALSE)
+		{
+			/*
+			** Create a timed dialog to display the Message "Failed"
+			*/
+			mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+			return MFW_EVENT_CONSUMED;
+		}
+	}
+
+	SEND_EVENT(srch_data->win, BT_LIST_KNOWN_DEVICES, 0, 0);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_clear_all_stored_devices
+
+ $Description:		This function clears all stored devices from FFS.
+
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:		mnu : pointer to the mnu data for the menu which caused this function to be called.
+ 				item : pointer to the item data from the menu.
+
+*******************************************************************************/
+
+GLOBAL int  mmi_bluetooth_clear_all_stored_devices(MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MFW_BT_REM_DEVICE *cur_device;
+	T_MFW_BT_REM_DEVICE *ptr_db_device[MFW_BT_NUM_REM_DEVICE];
+	UINT8 dev_index;
+	UINT8 num_of_known_devices;
+
+	MFW_BT_TRACE("mmi_bluetooth_clear_all_stored_devices()");
+
+	if (bt_data.bt_isEnabled == FALSE)
+	{
+		/*
+		** Create a timed dialog to display the Message "Bluetooth DeActivated"
+		*/
+		mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+		return MFW_EVENT_CONSUMED;
+	}
+
+	mfw_bt_get_device_by_service(BTA_ALL_SERVICE_MASK, &ptr_db_device[0], &num_of_known_devices);
+	
+	for (dev_index = 0; dev_index < num_of_known_devices; dev_index++)
+	{
+		cur_device = ptr_db_device[dev_index];
+		
+		btRetVal = mfw_bt_dm_delete_device(cur_device->bd_addr);
+
+		if (btRetVal != MFW_BT_SUCCESS)
+		{
+			MFW_BT_TRACE_P1("mfw_bt_dm_clear_all_stored_dev returned error : %d", btRetVal);
+			mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+			return MFW_EVENT_CONSUMED;
+		}
+	}
+		
+	mmi_bluetooth_show_info(0, TxtBtKnownDevices, TxtDeleted);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_pin_request_create
+
+ $Description:		This function performs the necessary steps to create the a window to handle the
+ 				PIN Request, pairing process. It will be removed, or rather remove itself on receipt
+ 				of the AUTH_CMPL event
+ 				
+ $Returns:		T_MFW_HND : Window Handle to th eNew Window, Null if failed.
+
+ $Arguments:		parent : pointer to the parent window.
+
+*******************************************************************************/
+T_MFW_HND mmi_bt_pin_request_create(T_MFW_HND parent)
+{
+	T_MMI_BT_PIN_Req_Data *data;
+	T_MFW_WIN * win;
+
+	data = (T_MMI_BT_PIN_Req_Data *)mfwAlloc((U16)sizeof(T_MMI_BT_PIN_Req_Data));
+
+	if (data == (void *)0)
+		return data;
+
+	data->win = winCreate(parent, 0, E_WIN_VISIBLE, mmi_bluetooth_win_cb);
+
+	if (data->win == (void *)0)
+	{
+		/*
+		** Failed to start : Free Memory, and exit
+		*/
+		mfwFree((U8 *)data, (U16)sizeof(T_MMI_BT_PIN_Req_Data));
+		data = (void *)0;
+		return data;
+	}
+	else
+	{
+		/*
+		** Setup the Dialog control functions
+		*/
+		data->mmi_control.dialog = (T_DIALOG_FUNC)mmi_bt_pin_req_cntrl;
+		data->mmi_control.data = data;
+		
+		win = ((T_MFW_HDR *)data->win)->data;
+		win->user = (void *)data;
+	}
+
+	bt_data.bt_pin_req_win = data->win;
+	return data->win;
+
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_pin_request_destroy
+
+ $Description:		This function performs the necessary steps to remove the window handling the
+ 				PIN request, tidying up all allocated resources.
+
+ $Returns:		MfwResOk : Success
+ 				MfwResIllHnd : Illegal Window Handler provided
+
+ $Arguments:		win : Window to be destroyed
+
+*******************************************************************************/
+MfwRes mmi_bt_pin_request_destroy(T_MFW_HND win)
+{
+	T_MFW_WIN * win_data;
+	T_MMI_BT_PIN_Req_Data * data;
+
+	if (win == (void *)0)
+		return MfwResIllHnd;
+
+	win_data = ((T_MFW_HDR *) win)->data;
+	data = (T_MMI_BT_PIN_Req_Data *)win_data->user;
+
+	/*
+	** Destroy the Window
+	*/
+	win_delete(data->win);
+
+	/*
+	** Free the dynamically allocated memory
+	*/
+	mfwFree((U8 *)data, (U16)sizeof(T_MMI_BT_PIN_Req_Data));
+
+	bt_data.bt_pin_req_win = (void *)0;
+
+	return MfwResOk;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_pin_req_cntrl
+
+ $Description:		This is the dialog control function for the Pin REquest Window. It receives the signals
+ 				from the MFW and determines what action, if any, to take.
+
+ $Returns:		None
+
+ $Arguments:		win :		The pointer to the window handler, so the function can reference the
+							dynamic user data, if any.
+ 				event :		The incoming event
+ 				value :		Generic incoming Parameter, it will be 'event' dependant
+ 				parameter :	Generic incoming Parameter, it will be 'event' dependant
+
+*******************************************************************************/
+void mmi_bt_pin_req_cntrl (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+	T_MFW_WIN			* win_data = ((T_MFW_HDR *) win)->data;
+	T_MMI_BT_PIN_Req_Data * data = (T_MMI_BT_PIN_Req_Data *)win_data->user;
+
+	T_AUI_EDITOR_DATA	editor_data;
+	T_MFW_BT_STATUS		btRetVal;
+	
+	T_MFW_BT_DM_PIN_REQ	*pin_req_param;
+	T_MFW_BT_DM_AUTH_CMPL	*auth_cmpl_param;
+
+	MFW_BT_TRACE_P1("mmi_bt_pin_req_cntrl() : Event Received : %d", event);
+
+	switch (event)
+	{
+		case BT_PIN_REQ:
+#ifdef NEW_EDITOR
+			/*
+			** Initialise the editor
+			*/
+			AUI_edit_SetDefault(&editor_data);
+			AUI_edit_SetMode(&editor_data, ED_MODE_HIDDEN, ED_CURSOR_BAR);
+
+			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->bt_pin_req_buf, MFW_BT_MAX_PIN_CODE_LEN);
+			AUI_edit_SetTextStr(&editor_data, TxtSoftSelect, TxtSoftBack, TxtBtEnterPassKey, TxtNull);
+			AUI_edit_SetAltTextStr(&editor_data, 1, TxtNull, TRUE, TxtCancel);
+			
+
+			AUI_edit_SetEvents(&editor_data, BT_PIN_REQ_EDITOR, TRUE, FOREVER, (T_AUI_EDIT_CB)mmi_bluetooth_editor_cb);
+
+			pin_req_param = (T_MFW_BT_DM_PIN_REQ *)parameter;
+			memcpy(&data->bt_pin_req_dev, &pin_req_param->bd_addr, sizeof(T_MFW_BT_DM_DEV_ADDR));
+			data->bt_pin_req_editor = AUI_edit_Start(data->win, &editor_data);
+#endif
+			break;
+
+		case BT_AUTH_COMPLETE:
+			auth_cmpl_param = (T_MFW_BT_DM_AUTH_CMPL *)parameter;
+
+			if (memcmp(auth_cmpl_param->bd_addr, data->bt_pin_req_dev, sizeof(T_MFW_BT_DM_DEV_ADDR)) != 0)
+			{
+				MFW_BT_TRACE("mmi_bt_pin_req_cntrl() > AUTH Complete event with invalid BD Address");
+				return;
+			}
+
+			if (data->bt_please_wait_dialog != (void *)0)
+			{
+				SEND_EVENT(data->bt_please_wait_dialog, DIALOG_DESTROY, 0, 0);
+
+				data->bt_please_wait_dialog = (void *)0;
+			}
+
+			if (data->bt_pin_req_editor != (void *)0)
+			{
+				/*
+				** Destory the current Pin Entry Window, as Bluetooth has timed out the request
+				*/
+				AUI_edit_Destroy(data->bt_pin_req_editor);
+
+				data->bt_pin_req_editor = (void *)0;
+				memset(data->bt_pin_req_buf, 0x00, MFW_BT_MAX_PIN_CODE_LEN+1);
+
+				/*
+				** Create a timed dialog to display the Message "Failed"
+				*/
+				mmi_bluetooth_show_info(0, TxtBtPassKey, TxtBtTimeout);
+			}
+			else if (data->bt_required_response == BT_SUCCESS_FAIL_RESP)
+			{
+				if (auth_cmpl_param->is_success == FALSE)
+				{
+						/*
+						** Create a timed dialog to display the Message "Failed"
+						*/
+						mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+				}
+				else
+				{
+					/*
+					** Create a timed dialog to display the Message "Pin OK"
+					*/
+					mmi_bluetooth_show_info(0, TxtPINOK, TxtNull);
+				}
+			}
+
+			/*
+			** Destory the PIN Request Window, the editor has been destroyed and the last response received.
+			*/
+			mmi_bt_pin_request_destroy(data->win);
+			break;
+
+
+		case BT_EDITOR_CANCEL:
+
+			data->bt_required_response = BT_NO_RESP;
+
+			if (value == BT_PIN_REQ_EDITOR)
+			{
+				/*
+				** The User has cancelled the input from a Pin request,
+				** return a FALSE value to the MFW as an indication. Not bothered about the
+				** return value as this is a fail anyway!
+				*/
+				(void)mfw_bt_dm_pin_code((void *)0, 0);
+
+				/*
+				** The editor will have been destroyed. Reset the Window handler
+				*/
+				data->bt_pin_req_editor = (void *)0;
+			}
+			else
+				MFW_BT_TRACE_P1("mmi_bt_pin_req_cntrl(), BT_EDITOR_CANCEL event received with unexpected value %d", value);
+
+			break;
+
+		case BT_EDITOR_SELECT:
+			if (value == BT_PIN_REQ_EDITOR)
+			{
+				data->bt_required_response = BT_SUCCESS_FAIL_RESP;
+				/*
+				** The user has entered a Pin Key, pass it to the MFW for processing
+				*/
+				btRetVal = mfw_bt_dm_pin_code((void *)&data->bt_pin_req_buf, strlen((void *)&data->bt_pin_req_buf));
+
+				/*
+				** CQ21957 : The editor will have been destroyed. Reset the Window handler
+				*/
+				data->bt_pin_req_editor = (void *)0;
+
+				if (btRetVal != MFW_BT_SUCCESS)
+				{
+					MFW_BT_TRACE_P1("mmi_bt_pin_req_cntrl() : Attempt to set return Pin Code Failed with %d", btRetVal);
+				}
+				else
+					data->bt_please_wait_dialog = mmi_bluetooth_show_please_wait(data->win);
+			}
+			else
+			{
+				MFW_BT_TRACE_P1("mmi_bt_pin_req_cntrl(), BT_EDITOR_SELECT event received with unexpected value %d", value);
+			}
+			break;
+
+		default:
+			MFW_BT_TRACE("mmi_bt_pin_req_cntrl() : Unexpected Event!");
+	}
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_dev_name_create
+
+ $Description:		This function performs the necessary steps to create the a window to handle the
+ 				Device Name Request. It will be removed, or rather remove itself on returning the
+ 				data to the Mfw.
+ 				
+ $Returns:		T_MFW_HND : Window Handle to the New Window, Null if failed.
+
+ $Arguments:		parent : pointer to the parent window.
+
+*******************************************************************************/
+T_MFW_HND mmi_bt_dev_name_create(T_MFW_HND parent)
+{
+	T_MMI_BT_Dev_Name_Data *data;
+	T_MFW_WIN * win;
+
+	data = (T_MMI_BT_Dev_Name_Data *)mfwAlloc((U16)sizeof(T_MMI_BT_Dev_Name_Data));
+
+	if (data == (void *)0)
+		return data;
+
+	data->win = winCreate(parent, 0, E_WIN_VISIBLE, mmi_bluetooth_win_cb);
+
+	if (data->win == (void *)0)
+	{
+		/*
+		** Failed to start : Free Memory, and exit
+		*/
+		mfwFree((U8 *)data, (U16)sizeof(T_MMI_BT_Dev_Name_Data));
+		data = (void *)0;
+		return data;
+	}
+	else
+	{
+		/*
+		** Setup the Dialog control functions
+		*/
+		data->mmi_control.dialog = (T_DIALOG_FUNC)mmi_bt_dev_name_cntrl;
+		data->mmi_control.data = data;
+		
+		win = ((T_MFW_HDR *)data->win)->data;
+		win->user = (void *)data;
+	}
+
+	bt_data.bt_dev_name_win = data->win;
+	return data->win;
+
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_dev_name_destroy
+
+ $Description:		This function performs the necessary steps to remove the window handling the
+ 				Device Name request, tidying up all allocated resources.
+
+ $Returns:		MfwResOk : Success
+ 				MfwResIllHnd : Illegal Window Handler provided
+
+ $Arguments:		win : Window to be destroyed
+
+*******************************************************************************/
+MfwRes mmi_bt_dev_name_destroy(T_MFW_HND win)
+{
+	T_MFW_WIN * win_data;
+	T_MMI_BT_Dev_Name_Data * data;
+
+	if (win == (void *)0)
+		return MfwResIllHnd;
+
+	win_data = ((T_MFW_HDR *) win)->data;
+	data = (T_MMI_BT_Dev_Name_Data *)win_data->user;
+
+	/*
+	** Destroy the Window
+	*/
+	win_delete(data->win);
+
+	/*
+	** Free the dynamically allocated memory
+	*/
+	mfwFree((U8 *)data, (U16)sizeof(T_MMI_BT_Dev_Name_Data));
+
+	bt_data.bt_dev_name_win = (void *)0;
+	return MfwResOk;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_dev_name_cntrl
+
+ $Description:		This is the dialog control function for the Device Name Request Window. It
+ 				receives the signals from the MFW and determines what action, if any, to take.
+
+ $Returns:		None
+
+ $Arguments:		win :		The pointer to the window handler, so the function can reference the
+							dynamic user data, if any.
+ 				event :		The incoming event
+ 				value :		Generic incoming Parameter, it will be 'event' dependant
+ 				parameter :	Generic incoming Parameter, it will be 'event' dependant
+
+*******************************************************************************/
+void mmi_bt_dev_name_cntrl (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+	T_MFW_WIN			* win_data = ((T_MFW_HDR *) win)->data;
+	T_MMI_BT_Dev_Name_Data * data = (T_MMI_BT_Dev_Name_Data *)win_data->user;
+
+	T_AUI_EDITOR_DATA	editor_data;
+	UBYTE				*ptr_device_name;
+
+	T_MFW_BT_STATUS		btRetVal;
+	
+	MFW_BT_TRACE_P1("mmi_bt_dev_name_cntrl() : Event Received : %d", event);
+
+	switch (event)
+	{
+		case BT_DEV_NAME_REQ:
+#ifdef NEW_EDITOR
+			/*
+			** Get the current Device Name from the MFW
+			*/
+			ptr_device_name = mfw_bt_dm_get_local_name();
+
+			memcpy(&data->bt_device_name, ptr_device_name, MFW_BT_NAME_LENGTH);
+
+			/*
+			** Initialise the editor
+			*/
+			AUI_edit_SetDefault(&editor_data);
+
+			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->bt_device_name, MFW_BT_NAME_LENGTH);
+			AUI_edit_SetTextStr(&editor_data, TxtSoftSelect, TxtSoftBack, TxtBtEnterDeviceName, TxtNull);
+			AUI_edit_SetAltTextStr(&editor_data, 1, TxtNull, TRUE, TxtCancel);
+
+			AUI_edit_SetEvents(&editor_data, BT_DEV_NAME_EDITOR, TRUE, FOREVER, (T_AUI_EDIT_CB)mmi_bluetooth_editor_cb);
+
+			data->bt_dev_name_editor = AUI_edit_Start(data->win, &editor_data);
+#endif
+			break;
+
+		case BT_SET_REM_DEV_NAME:		/* CQ21843 : Get a Friendly name for a remote device */
+#ifdef NEW_EDITOR
+			data->rem_device_info = (T_MFW_BT_REM_DEVICE_INFO *)parameter;
+
+			memcpy(&data->bt_dev_address, &data->rem_device_info->bd_addr, sizeof(T_MFW_BT_DM_DEV_ADDR));
+			memcpy(&data->bt_device_name, data->rem_device_info->name, MFW_BT_NAME_LENGTH);
+
+			/*
+			** Initialise the editor
+			*/
+			AUI_edit_SetDefault(&editor_data);
+
+			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->bt_device_name, MFW_BT_NAME_LENGTH);
+			AUI_edit_SetTextStr(&editor_data, TxtSoftSelect, TxtSoftBack, TxtBtEnterDeviceName, TxtNull);
+			AUI_edit_SetAltTextStr(&editor_data, 1, TxtNull, TRUE, TxtCancel);
+
+			AUI_edit_SetEvents(&editor_data, BT_REM_DEV_NAME_EDITOR, TRUE, FOREVER, (T_AUI_EDIT_CB)mmi_bluetooth_editor_cb);
+
+			data->bt_dev_name_editor = AUI_edit_Start(data->win, &editor_data);
+#endif
+			break;
+
+		case BT_EDITOR_CANCEL:
+
+			if (value == BT_DEV_NAME_EDITOR)
+			{
+				if (bt_data.bt_DevNameForStartup)
+				{
+					/*
+					** The User has cancelled the input from a "Device Name" request, which was
+					** requested as a result of the startup sequence. Return a FALSE value to the
+					** MFW as an indication. Not bothered about the return value as this is a fail anyway!
+					*/
+					(void)mfw_bt_dm_set_local_name((void *)0);
+				}
+
+				/*
+				** The editor will have been destroyed. Reset the Window handler
+				*/
+				data->bt_dev_name_editor = (void *)0;
+			}
+			else if (value == BT_REM_DEV_NAME_EDITOR)	/* CQ21843 : Add Editor processing for new action */
+			{
+				/*
+				** The editor will have been destroyed. Reset the Window handler
+				*/
+				data->bt_dev_name_editor = (void *)0;
+			}
+			else
+			{
+				MFW_BT_TRACE_P1("mmi_bt_dev_name_cntrl(), BT_EDITOR_CANCEL event received with unexpected value %d", value);
+			}
+
+			/*
+			** Destroy the Device Name Request Window
+			*/
+			mmi_bt_dev_name_destroy(data->win);
+			break;
+
+		case BT_EDITOR_SELECT:
+			if (value == BT_DEV_NAME_EDITOR)
+			{
+				/*
+				** The user has entered a Device Name, pass it to the MFW for processing
+				*/
+				btRetVal = mfw_bt_dm_set_local_name((void *)&data->bt_device_name);
+
+				if (btRetVal != MFW_BT_SUCCESS)
+				{
+					MFW_BT_TRACE_P1("mmi_bt_dev_name_cntrl() : Attempt to set Device Name Failed with %d", btRetVal);
+				}
+				else
+				{
+					/*
+					** Create a timed dialog to display the Message "Device Name Set"
+					*/
+					mmi_bluetooth_show_info(0, TxtBtDeviceName, TxtBtSet);
+				}
+
+				/*
+				** CQ21957 : The editor will have been destroyed. Reset the Window handler
+				*/
+				data->bt_dev_name_editor = (void *)0;
+			}
+			else if (value == BT_REM_DEV_NAME_EDITOR)	/* CQ21843 : Add Editor processing for new action */
+			{
+				/*
+				** The user has entered a Device Name, pass it to the MFW for processing
+				*/
+				btRetVal = mfw_bt_dm_rename_device(data->bt_dev_address, data->bt_device_name);
+
+				if (btRetVal != MFW_BT_SUCCESS)
+				{
+					MFW_BT_TRACE_P1("mmi_bt_dev_name_cntrl() : Attempt to set Remote Device Name Failed with %d", btRetVal);
+				}
+				else
+				{
+					/*
+					** Create a timed dialog to display the Message "Device Name Set"
+					*/
+					mmi_bluetooth_show_info(0, TxtBtDeviceName, TxtBtSet);
+
+					/*
+					** Set the Name in the local Device list, so that the Menu will be updated
+					*/
+					memcpy(&data->rem_device_info->name, &data->bt_device_name, MFW_BT_NAME_LENGTH);
+				}
+
+				/*
+				** CQ21957 : The editor will have been destroyed. Reset the Window handler
+				*/
+				data->bt_dev_name_editor = (void *)0;
+			}
+			else
+			{
+				MFW_BT_TRACE_P1("mmi_bt_dev_name_cntrl(), BT_EDITOR_SELECT event received with unexpected value %d", value);
+			}
+
+			/*
+			** Destroy the Device Name Request Window
+			*/
+			mmi_bt_dev_name_destroy(data->win);
+			break;
+
+		default:
+			MFW_BT_TRACE("mmi_bt_dev_name_cntrl() : Unexpected Event!");
+	}
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_authorize_create
+
+ $Description:		This function performs the necessary steps to create the a window to handle the
+ 				Authorize Request. It will be removed, or rather remove itself on returning the
+ 				data to the Mfw.
+ 
+ $Returns:		T_MFW_HND : Window Handle to the New Window, Null if failed.
+
+ $Arguments:		parent : pointer to the parent window.
+
+*******************************************************************************/
+T_MFW_HND mmi_bt_authorize_create(T_MFW_HND parent)
+{
+	T_MMI_BT_Authorise_Data *data;
+	T_MFW_WIN * win;
+
+	data = (T_MMI_BT_Authorise_Data *)mfwAlloc((U16)sizeof(T_MMI_BT_Authorise_Data));
+
+	if (data == (void *)0)
+		return data;
+
+	data->win = winCreate(parent, 0, E_WIN_VISIBLE, mmi_bluetooth_win_cb);
+
+	if (data->win == (void *)0)
+	{
+		/*
+		** Failed to start : Free Memory, and exit
+		*/
+		mfwFree((U8 *)data, (U16)sizeof(T_MMI_BT_Authorise_Data));
+		data = (void *)0;
+		return data;
+	}
+	else
+	{
+		/*
+		** Setup the Dialog control functions
+		*/
+		data->mmi_control.dialog = (T_DIALOG_FUNC)mmi_bt_authorize_cntrl;
+		data->mmi_control.data = data;
+		
+		win = ((T_MFW_HDR *)data->win)->data;
+		win->user = (void *)data;
+	}
+
+	bt_data.bt_authorize_win = data->win;
+	return data->win;
+
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_authorize_destroy
+
+ $Description:		This function performs the necessary steps to remove the window handling for the
+ 				Authorize request, tidying up all allocated resources.
+
+ $Returns:		MfwResOk : Success
+ 				MfwResIllHnd : Illegal Window Handler provided
+
+ $Arguments:		win : Window to be destroyed
+
+*******************************************************************************/
+MfwRes mmi_bt_authorize_destroy(T_MFW_HND win)
+{
+	T_MFW_WIN * win_data;
+	T_MMI_BT_Authorise_Data * data;
+
+	if (win == (void *)0)
+		return MfwResIllHnd;
+
+	win_data = ((T_MFW_HDR *) win)->data;
+	data = (T_MMI_BT_Authorise_Data *)win_data->user;
+
+	/*
+	** Destroy the Window
+	*/
+	win_delete(data->win);
+
+	/*
+	** Free the dynamically allocated memory
+	*/
+	mfwFree((U8 *)data, (U16)sizeof(T_MMI_BT_Authorise_Data));
+
+	bt_data.bt_authorize_win = (void *)0;
+	return MfwResOk;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_authorize_cntrl
+
+ $Description:		This is the dialog control function for the Authorise Request Window. It receives
+ 				the signals from the MFW and determines what action, if any, to take.
+
+ $Returns:		None
+
+ $Arguments:		win :		The pointer to the window handler, so the function can reference the
+							dynamic user data, if any.
+ 				event :		The incoming event
+ 				value :		Generic incoming Parameter, it will be 'event' dependant
+ 				parameter :	Generic incoming Parameter, it will be 'event' dependant
+
+*******************************************************************************/
+void mmi_bt_authorize_cntrl (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+	T_MFW_WIN			* win_data = ((T_MFW_HDR *) win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+
+	T_DISPLAY_DATA		display_info;
+
+	T_MFW_BT_STATUS		btRetVal;
+
+	MFW_BT_TRACE_P1("mmi_bluetooth() : Event Received : %d", event);
+
+	switch (event)
+	{
+		case BT_AUTHORIZE_REQ:
+			data->bt_auth_req_param = (T_MFW_BT_DM_AUTHORIZE_REQ *)mfwAlloc(sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+
+			if (data->bt_auth_req_param == (T_MFW_BT_DM_AUTHORIZE_REQ *)0)
+			{
+				/*
+				** Problems with Memory Allocation, so reject the request this time
+				*/
+				btRetVal = mfw_bt_dm_authorize_resp(MFW_BT_AUTH_FAIL);
+				mfwFree((void *)data->bt_auth_req_param, (U16)sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+				mmi_bt_authorize_destroy(data->win);
+				return;
+			}
+
+			memcpy(data->bt_auth_req_param, parameter, sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+
+			/*
+			** if the length of the Device Name is greater than a predefined limit, truncate it :o)
+			*/
+			if (strlen((char *)(data->bt_auth_req_param)->bd_name) > BT_MAX_DISPLAY_DEV_NAME_LENGTH)
+			{
+				/*
+				** Terminate the device name at this maximum length!
+				** It will be used for display purposes only!
+				*/
+				data->bt_auth_req_param->bd_name[BT_MAX_DISPLAY_DEV_NAME_LENGTH] = 0x00;
+			}
+
+			/*
+			** Create a popup dialog to prompt the user whether to proceed with the authorization.
+			** CQ22022 : Call to dlg_initDisplayData_TextId removed, and dlg_initDisplayData_TextStr updated.
+			*/
+			dlg_initDisplayData_TextStr( &display_info, TxtSoftOptions, TxtNo, MmiRsrcGetText(TxtBtAuthorize), (char *)(data->bt_auth_req_param)->bd_name, COLOUR_STATUS);
+
+			dlg_initDisplayData_events(&display_info, (T_VOID_FUNC)mmi_bt_authorize_dlg_cb, BT_AUTHORISE_RESP_TIMEOUT, KEY_HUP | KEY_LEFT| KEY_RIGHT);
+
+			data->bt_auth_info_win = info_dialog(data->win, &display_info);
+			break;
+		default:
+			MFW_BT_TRACE("mmi_bluetooth() : Unexpected Event!");
+	}
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_authorize_dlg_cb
+
+ $Description:		This function is the windows callback function for the Authorize Request Dialog.
+
+ $Returns:		None
+
+ $Arguments:		win : The pointer to the window handler, so the function can reference the
+				dynamic user data, if any.
+				identifier : is a flag set during Dialog Create.
+ 				reason : is the event to be processed
+
+*******************************************************************************/
+void mmi_bt_authorize_dlg_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
+{
+	T_MFW_HND	parent = bt_data.bt_authorize_win;
+	T_MFW_WIN   * win_data = ((T_MFW_HDR *) parent)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+	T_MFW_BT_STATUS	btRetVal;
+
+	MFW_BT_TRACE("mmi_bt_authorize_dlg_cb()");
+
+	switch (reason)	 
+	{
+
+		case INFO_KCD_LEFT:
+			/*
+			** Create an Authorize Menu and get the Response (Once, Always or No)
+			*/
+			data->bt_auth_menu = bt_menu_start(data->win, (MfwMnuAttr *)&menuBtAuthorize, (T_VOID_FUNC)mmi_bt_authorize_rsk);
+
+			/*
+			** CQ22021 : The Dialog is destroyed automatically, reset the win value to NULL
+			*/
+			data->bt_auth_info_win = 0;
+			break;
+
+		case INFO_KCD_HUP:
+		case INFO_KCD_RIGHT:
+			btRetVal = mfw_bt_dm_authorize_resp((U8)MFW_BT_AUTH_FAIL);
+			mfwFree((void *)data->bt_auth_req_param, (U16)sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+
+			/*
+			** CQ22021 : The Dialog is destroyed automatically, reset the win value to NULL
+			*/
+			data->bt_auth_info_win = 0;
+			mmi_bt_authorize_destroy(data->win);
+			break;
+	}
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_search_create
+
+ $Description:		This function performs the necessary steps to create the bluetooth search window,
+ 				set up the dialog, and create a Bluetooth Entity within that window. The Bt Search window
+ 				is a child of the Bt Root Window, and is used to manage the search for local devices or
+ 				the listing of known devices and the subsequent functions available after that
+ 
+ $Returns:		BOOL - True is successful, otherwise FALSE
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+BOOL mmi_bt_search_create (T_MFW_HND parent)
+{
+	T_MMI_BtSearchData *data = &bt_srch_data;
+	T_MFW_WIN		    *win;
+	BOOL retVal = TRUE;
+
+	MFW_BT_TRACE("mmi_bt_search_create()");
+
+	/*
+	** If the Bluetooth Search is already created then there is nothing to do.
+	*/
+	if ((data->win == (void *)0) ||
+	     (data->srch_bt_cmpnt == (void *)0))
+	{
+		/*
+		** Create the Bluetooth Search Window
+		*/
+		MFW_BT_TRACE("mmi_bt_search_create >> Creating BT Search Window");
+		if (data->win == (void *)0)
+			data->win = win_create(parent, 0, E_WIN_VISIBLE, (MfwCb)mmi_bluetooth_win_cb);
+
+		if (data->win == (void *)0)
+		{
+			MFW_BT_TRACE("mmi_bt_search_create >> Create BT Search Window FAILED");
+			/*
+			** Bluetooth Search Failed to start
+			*/
+			retVal = FALSE;
+		}
+		else
+		{
+			MFW_BT_TRACE("mmi_bt_search_create >> Configuring Window Dialog");
+			/*
+			** Setup the Dialog control functions
+			*/
+			data->srch_bt_control.dialog = (T_DIALOG_FUNC)mmi_bt_search_cntrl;
+			data->srch_bt_control.data = data;
+			
+			win = ((T_MFW_HDR *)data->win)->data;
+			win->user = (void *)data;
+
+			/*
+			** Create a Bluetooth component
+			*/
+			if (data->srch_bt_cmpnt == (void *)0)
+			{
+				MFW_BT_TRACE("mmi_bt_search_create >> Creating MFW_BT Component");
+				data->srch_bt_cmpnt = mfw_bt_create(data->win, E_BT_ALL_SERVICES, (MfwCb)mmi_bluetooth_search_cb);
+			}
+			else
+			{
+				MFW_BT_TRACE("mmi_bt_search_create >> MFW_BT Component Already EXISTS????");
+			}
+
+			if (data->srch_bt_cmpnt == (void *)0)
+			{
+				retVal = FALSE;
+				/*
+				** Bluetooth Search Compnonent Failed to start
+				*/
+				winDelete(data->win);
+			}
+			else
+			{
+				/*
+				** Create a Timer component to Timeout a Device Search if no response from BT_Mobile
+				*/
+				MFW_BT_TRACE("mmi_bt_search_create > Creating the search timer");
+				if (data->srch_bt_search_timer == (void *)0)
+					data->srch_bt_search_timer = timCreate(data->win,
+														BT_SEARCH_RESP_TIMEOUT,
+														(MfwCb)mmi_bluetooth_search_timer_cb);
+
+				if (data->srch_bt_search_timer == (void *)0)
+				{
+					MFW_BT_TRACE("mmi_bt_search_create > search timer creation failed ");
+					/*
+					** Timer Compnonent Failed to start, delete previous components
+					*/
+					mfw_bt_delete(data->srch_bt_cmpnt);
+					winDelete(data->win);
+				}
+				else
+				{
+					timStart(data->srch_bt_search_timer);
+				}
+			}
+		}
+	}
+
+	return retVal;
+	
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_destroy
+
+ $Description:		This function performs the necessary steps to remove the bluetooth, search window
+   				tidying up all allocated resources.
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+GLOBAL void  mmi_bt_search_destroy (void)
+{
+	T_MMI_BtSearchData * data = &bt_srch_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_search_destroy()");
+
+	if (data->win == (void *)0)
+		return;
+
+	if (data->srch_bt_pairing_pin_editor != (void *)0)
+		SEND_EVENT(data->srch_bt_pairing_pin_editor, E_ED_DEINIT, 0, 0);
+
+	if (data->srch_bt_please_wait_dialog != (void *)0)
+		SEND_EVENT(data->srch_bt_please_wait_dialog, DIALOG_DESTROY, 0, 0);
+
+	if (data->srch_bt_cmpnt != (void *)0)
+		mfw_bt_delete(data->srch_bt_cmpnt);
+
+	if (data->srch_bt_search_timer != (void *)0)
+		timDelete(data->srch_bt_search_timer);
+	winDelete(data->win);
+
+	data->win = (void *)0;
+	data->srch_bt_pairing_pin_editor = (void *)0;
+	data->srch_bt_please_wait_dialog = (void *)0;
+	data->srch_bt_dev_list_win = (void *)0;
+	data->srch_bt_show_services_win = (void *)0;
+	data->srch_bt_cmpnt = (void *)0;
+	data->srch_bt_search_timer = (void *)0;
+	
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bt_search_cntrl
+
+ $Description:		This is the dialog control function for the Bluetooth Search Window. It receives the signals
+ 				from the MFW or BMI and determines what action, if any, to take.
+
+ $Returns:		None
+
+ $Arguments:		win :		The pointer to the window handler, so the function can reference the
+							dynamic user data, if any.
+ 				event :		The incoming event
+ 				value :		Generic incoming Parameter, it will be 'event' dependant
+ 				parameter :	Generic incoming Parameter, it will be 'event' dependant
+
+*******************************************************************************/
+void mmi_bt_search_cntrl (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+	T_MFW_WIN			* win_data = ((T_MFW_HDR *) win)->data;
+	T_MMI_BtSearchData	* data = (T_MMI_BtSearchData *)win_data->user;
+
+	T_DISPLAY_DATA		display_info;
+	T_AUI_EDITOR_DATA	editor_data;
+	BOOL				valid;
+	BOOL				btIsDiscoverable;
+	UBYTE				*ptr_device_name;
+
+	T_MFW_BT_STATUS			btRetVal;
+	
+	T_MFW_BT_DM_AUTH_CMPL		*auth_cmpl_param;
+	T_MFW_BT_DM_INQ_CMPL		*inq_cmpl_param;
+	T_MFW_BT_DM_DISC_RES		*disc_res_param;
+	T_MFW_BT_REM_DEVICE_INFO	*cur_device;
+
+	MfwMnuItem *listItem;
+	T_MFW_BT_REM_DEVICE_INFO *device;
+	MfwMnuItem			*ptr_tempListItem;
+	T_MFW_BT_REM_DEVICE_INFO	*ptr_tempDevDb;
+	UINT8 num_of_services;
+
+
+	int  iLoop;
+	
+	MFW_BT_TRACE_P1("mmi_bt_search_cntrl() : Event Received : %d", event);
+
+	switch (event)
+	{
+		case BT_EDITOR_CANCEL:
+
+			if ((value == BT_DEV_NAME_EDITOR) ||
+			     (value == BT_REM_DEV_NAME_EDITOR) ||		/* CQ21843 : Editor Identier has another value */
+			     (value == BT_PIN_REQ_EDITOR))
+			{
+				/*
+				** Not handled by this window, pass to the root window.
+				*/
+				MFW_BT_TRACE_P1("mmi_bt_search_cntrl() : Unexpected Editor Cancel Event : value = %d!", value);
+			}
+			else if (value == BT_PAIRING_EDITOR)
+			{
+				data->srch_bt_req_resp = BT_NOT_EXPECTED;
+
+				/*
+				** The User has cancelled the input from a Pairing  Pin request,
+				** the process has not been started. Don't proceed.
+				*/
+				/*
+				** The editor will have been destroyed. Reset the Window handler
+				*/
+				data->srch_bt_pairing_pin_editor = (void *)0;
+			}
+			else
+			{
+				MFW_BT_TRACE_P1("mmi_bt_search_cntrl(), BT_EDITOR_CANCEL event received with unknown value %d", value);
+			}
+
+			break;
+
+		case BT_EDITOR_SELECT:
+			if ((value == BT_DEV_NAME_EDITOR) ||
+			     (value == BT_REM_DEV_NAME_EDITOR) ||		/* CQ21843 : Editor Identier has another value */
+			     (value == BT_PIN_REQ_EDITOR))
+			{
+				/*
+				** Not handled by this window, pass to the root window.
+				*/
+				MFW_BT_TRACE_P1("mmi_bt_search_cntrl() : Unexpected Editor Select Event : value = %d!", value);
+			}
+			else if (value == BT_PAIRING_EDITOR)
+			{
+				/*
+				** The editor will have been destroyed. Reset the Window handler
+				*/
+				data->srch_bt_pairing_pin_editor = (void *)0;
+
+				data->srch_bt_req_resp = BT_PAIRED_NOT_RESP;
+
+				/*
+				**The user has entered a Pin Key, now use it in the pairing process
+				*/
+				cur_device = &data->srch_bt_dev_list[data->srch_bt_cur_dev_idx];
+
+				btRetVal = mfw_bt_dm_bond(cur_device->bd_addr,
+										     (void *)&data->bt_pairing_pin_buf,
+										     strlen((void *)&data->bt_pairing_pin_buf));
+
+				if (btRetVal != MFW_BT_SUCCESS)
+				{
+					MFW_BT_TRACE_P1("mmi_bt_search_cntrl() : Attempt to start Pairing process Failed with %d", btRetVal);
+				}
+				else
+					data->srch_bt_please_wait_dialog = mmi_bluetooth_show_please_wait(data->win);
+			}
+			else
+			{
+				MFW_BT_TRACE_P1("mmi_bt_search_cntrl(), BT_EDITOR_SELECT event received with unknown value %d", value);
+			}
+
+			break;
+
+		case BT_AUTH_COMPLETE:
+			auth_cmpl_param = (T_MFW_BT_DM_AUTH_CMPL *)parameter;
+
+			if (data->srch_bt_req_resp == BT_NOT_EXPECTED)
+			{
+				/*
+				** Not handled by this window, pass to the root window.
+				*/
+				MFW_BT_TRACE("mmi_bt_search_cntrl() : Unexpected Auth_Complete Event");
+			}
+			else
+			{
+				UBYTE iLoop;
+				T_MFW_BT_REM_DEVICE_INFO *device;
+
+				MFW_BT_TRACE_P6("mmi_bt_search_cntrl(), Auth BD_ADDR 0x%02x%02x%02x%02x%02x%02x",
+								     auth_cmpl_param->bd_addr[0], auth_cmpl_param->bd_addr[1],
+ 								     auth_cmpl_param->bd_addr[2], auth_cmpl_param->bd_addr[3],
+								     auth_cmpl_param->bd_addr[4], auth_cmpl_param->bd_addr[5]);
+				if (data->srch_bt_please_wait_dialog != (void *)0)
+				{
+					SEND_EVENT(data->srch_bt_please_wait_dialog, DIALOG_DESTROY, 0, 0);
+					data->srch_bt_please_wait_dialog = (void *)0;
+				}
+
+				if (data->srch_bt_req_resp == BT_PAIRED_NOT_RESP)
+				{
+					if (auth_cmpl_param->is_success == FALSE)
+					{
+						/*
+						** Create a timed dialog to display the Message "Pairing Failed"
+						*/
+						mmi_bluetooth_show_info(data->win, TxtBtPairing, TxtFailed);
+					}
+					else
+					{
+						/*
+						** Create a timed dialog to display the Message "Paired"
+						*/
+						mmi_bluetooth_show_info(data->win, TxtBtPaired, TxtNull);
+
+						/*
+						** This will have been as part of a "Device List" either known or local
+						** The device will have been added to the known devices list, and will
+						** have a link_key present. Update our local data to reflect this.
+						*/
+						iLoop = 0;
+						while (iLoop < data->srch_bt_num_devices)
+						{
+							device = &data->srch_bt_dev_list[iLoop];
+
+							MFW_BT_TRACE_P7("mmi_bt_search_cntrl(), dev_list[%d] BD_ADDR 0x%02x%02x%02x%02x%02x%02x",
+											     iLoop, device->bd_addr[0], device->bd_addr[1], device->bd_addr[2], device->bd_addr[3],
+											     device->bd_addr[4], device->bd_addr[5]);
+
+							if (memcmp(&device->bd_addr[0], &auth_cmpl_param->bd_addr[0], BD_ADDR_LEN) == 0 )
+							{
+								MFW_BT_TRACE("mmi_bt_search_cntrl() : Auth_Complete Event, device found");
+								device->link_key_present = TRUE;
+								device->is_new = FALSE;
+								iLoop = 0xFF;
+							}
+							else
+								iLoop++;
+						}
+					}
+				}
+
+				data->srch_bt_req_resp = BT_NOT_EXPECTED;
+			}
+			break;
+
+		case BT_LIST_KNOWN_DEVICES:
+			{
+				BD_ADDR null_bd_addr;
+
+				memset(&null_bd_addr, 0x00, sizeof(BD_ADDR));
+			/*
+			** Get the known devices from the MFW
+			*/
+			data->srch_bt_mode = BT_MODE_KNOWN_DEVICES;
+			
+				mfw_bt_dm_get_known_devices(null_bd_addr, BTA_ALL_SERVICE_MASK);
+			}
+			break;
+			
+		case BT_DEVICE_SEARCH:
+			/*
+			** Trigger Bluetooth to search locally for any devices
+			*/
+			data->srch_bt_mode = BT_MODE_LOCAL_SEARCH;
+
+			/* Search for all devices, not service specified */
+			mfw_bt_dm_search(0);
+			data->srch_bt_please_wait_dialog = mmi_bluetooth_show_please_wait(data->win);
+			break;
+
+		case BT_INQUIRY_COMPLETE:
+			MFW_BT_TRACE("mmi_bt_search_cntrl > Recieved the INQUIRY COMPLETE Event");
+	
+			inq_cmpl_param = (T_MFW_BT_DM_INQ_CMPL *)parameter;
+
+			if ((data->srch_bt_mode == BT_MODE_KNOWN_DEVICES) ||
+			     (data->srch_bt_mode == BT_MODE_LOCAL_SEARCH))
+			{
+				(void)timStop(data->srch_bt_search_timer);
+				if (data->srch_bt_please_wait_dialog != (void *)0)
+				{
+					SEND_EVENT(data->srch_bt_please_wait_dialog, DIALOG_DESTROY, 0, 0);
+					data->srch_bt_please_wait_dialog = (void *)0;
+				}
+			if (inq_cmpl_param->num_resps == 0)
+			{
+				/*
+				** Display an Dialog Screen to display "No Devices Found"
+				*/
+				mmi_bluetooth_show_info_callback(data->win, TxtBtNoDevices, TxtBtFound, mmi_bt_srch_no_device_found_dlg_cb);
+					data->srch_bt_mode = BT_MODE_NO_SEARCH;
+			}
+			else
+			{
+					MFW_BT_TRACE("mmi_bt_search_cntrl > Initialising the List");
+				/*
+				** Create the list menu to display the results
+				*/
+				/* initialization of the dialog data */
+				data->srch_bt_list_devices_menu_data.ListPosition   = 1;/* True cursor position in list menu. */
+				data->srch_bt_list_devices_menu_data.Font           = 0;
+				data->srch_bt_list_devices_menu_data.LeftSoftKey    = TxtNull;
+				data->srch_bt_list_devices_menu_data.RightSoftKey   = TxtCancel;
+				data->srch_bt_list_devices_menu_data.KeyEvents      = KEY_RIGHT;
+				data->srch_bt_list_devices_menu_data.Reason         = 0;
+				data->srch_bt_list_devices_menu_data.Strings        = TRUE;
+				data->srch_bt_list_devices_menu_data.autoDestroy    = FALSE;
+				
+				data->srch_bt_list_devices_menu_data.Attr           = (MfwMnuAttr *)&menuBtSearchListAttr;
+				data->srch_bt_list_devices_menu_data.Attr->hdrId = TxtSearching;
+
+					/*
+					** CQ21834 : Special processing for Known Device List.
+					*/
+					if (data->srch_bt_mode == BT_MODE_KNOWN_DEVICES)
+					{
+						/*
+						** "Known devices" requires an extra entry, for further details see the comment below
+						*/
+						data->srch_bt_list_devices_menu_data.Attr->nItems = inq_cmpl_param->num_resps + 1;
+						data->srch_bt_list_devices_menu_data.ListLength = inq_cmpl_param->num_resps + 1; /* actual number of entries in list menu.    */
+					}
+					else
+					{
+				data->srch_bt_list_devices_menu_data.Attr->nItems = inq_cmpl_param->num_resps;
+						data->srch_bt_list_devices_menu_data.ListLength = inq_cmpl_param->num_resps; /* actual number of entries in list menu.    */
+					}
+						
+
+				data->srch_bt_list_devices_menu_data.List = (MfwMnuItem *)mfwAlloc(data->srch_bt_list_devices_menu_data.ListLength * sizeof (MfwMnuItem));
+
+				if (data->srch_bt_list_devices_menu_data.List != (MfwMnuItem *)0)
+				{
+					MfwMnuItem *listItem;
+
+					MFW_BT_TRACE("mmi_bt_search_cntrl > List Memory Allocated successfully");
+					/*
+					** Initialise the memory to 0x00
+					*/
+					memset(data->srch_bt_list_devices_menu_data.List, 0x00, data->srch_bt_list_devices_menu_data.ListLength * sizeof (MfwMnuItem));
+
+					for (iLoop = 0; iLoop <data->srch_bt_list_devices_menu_data.ListLength; iLoop++)
+					{
+						listItem = &data->srch_bt_list_devices_menu_data.List[iLoop];
+
+						listItem->str = MmiRsrcGetText(TxtPleaseWait);
+						listItem->menu =     (MfwMnuAttr *)&menuBtDeviceOptions;
+						listItem->func =       (MenuFunc)mmi_bluetooth_device_mnu_cb;
+						listItem->flagFunc = (FlagFunc)item_flag_hide;
+					}
+
+						/*
+						** CQ21834 : If we are displaying a list of known devices, then if ALL the devices
+						** are removed from the list, there must be another entry to display otherwise
+						** the D-Sample will reset because it will enter an infinite loop. This is overcome
+						** by added an extra (an normally hidden) entry which will display "No Devices".
+						*/
+						if (data->srch_bt_mode == BT_MODE_KNOWN_DEVICES)
+						{
+							listItem = &data->srch_bt_list_devices_menu_data.List[inq_cmpl_param->num_resps];
+
+							listItem->str = MmiRsrcGetText(TxtBtNoDevices);
+							listItem->menu =     (MfwMnuAttr *)0;
+							listItem->func =       (MenuFunc)0;
+							listItem->flagFunc = (FlagFunc)isDeviceListEmpty;
+						}
+				}
+
+				data->srch_bt_dev_list_cb = (ListCbFunc)bt_srch_dev_list_searching_cb;
+				data->srch_bt_dev_list_win = (void *)0;
+
+				/*
+				** Create a dynamic memory pool to store the necessary data for the following menus
+				*/
+				data->srch_bt_num_devices = inq_cmpl_param->num_resps;
+				data->srch_bt_dev_list = (T_MFW_BT_REM_DEVICE_INFO *)mfwAlloc(sizeof(T_MFW_BT_REM_DEVICE_INFO) * data->srch_bt_num_devices);
+
+				data->srch_bt_device_count = 0;
+				}
+			}
+			break;
+
+		case BT_DISCOVER_RESULT:
+
+			disc_res_param = (T_MFW_BT_DM_DISC_RES *)parameter;
+
+			if (!mfw_bt_dm_is_discover())
+			{
+				/* We get here at the end of inquiry process */
+			/*
+			** If the mode is 'LIST COMPLETE' at this point it is because the user cancel the search but there
+			** were device events queued ... ignore them.
+			*/
+			if ((data->srch_bt_dev_list) &&
+			     (data->srch_bt_list_devices_menu_data.List) &&
+			     ((data->srch_bt_mode == BT_MODE_KNOWN_DEVICES) ||
+			      (data->srch_bt_mode == BT_MODE_LOCAL_SEARCH)))
+			{
+
+				if (data->srch_bt_dev_list_win != (void *)0)
+				{
+					/*
+					** The menu is recreated on each device received because the user may decide to halt
+					** the search at any point. For Known devices the menu is created at the end because
+					** The reponse for ALL devices is immediate.
+					** Delete the Menu window, as it will be recreated at the end of this operation
+					*/
+					listsDestroy(data->srch_bt_dev_list_win);
+				}
+				
+				listItem = &data->srch_bt_list_devices_menu_data.List[data->srch_bt_device_count];
+				device = &data->srch_bt_dev_list[data->srch_bt_device_count];
+
+				memcpy(device, disc_res_param, sizeof(T_MFW_BT_REM_DEVICE_INFO));
+
+				listItem->str = device->name;
+
+					/*
+					** CQ21834 : For Known Devices, the device should be hidden in the list if the "Remove Device" menu
+					** 			option is selected.
+					*/
+					if (data->srch_bt_mode == BT_MODE_KNOWN_DEVICES)
+						listItem->flagFunc = (FlagFunc)isListDeviceUnknown;
+					else
+				listItem->flagFunc = (FlagFunc)item_flag_none;
+
+				MFW_BT_TRACE_P3("mmi_bt_search_cntrl > Idx %d : Device Name : %s, Item Str %s",
+								    data->srch_bt_device_count,
+								    device->name,
+								    listItem->str);
+
+				data->srch_bt_device_count++;
+
+				if (data->srch_bt_device_count == data->srch_bt_num_devices)
+				{
+					data->srch_bt_list_devices_menu_data.Attr->hdrId = TxtBtDevices;
+
+					data->srch_bt_list_devices_menu_data.LeftSoftKey = TxtSoftOptions;
+					data->srch_bt_list_devices_menu_data.RightSoftKey = TxtSoftBack;
+					data->srch_bt_list_devices_menu_data.KeyEvents      = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN |KEY_HUP;
+					data->srch_bt_list_devices_menu_data.autoDestroy = TRUE;
+					data->srch_bt_mode = BT_MODE_LIST_COMPLETE;
+
+					data->srch_bt_dev_list_cb = (ListCbFunc)bt_srch_dev_list_listmnu_cb;
+				}
+
+				if ((data->srch_bt_mode == BT_MODE_LOCAL_SEARCH) ||
+				     (data->srch_bt_mode == BT_MODE_LIST_COMPLETE))
+				{
+					/*
+					** Recreate the menu with the new details;
+					*/
+					if (listDisplayListMenu(data->win, &data->srch_bt_list_devices_menu_data, data->srch_bt_dev_list_cb, FALSE) != LISTS_FAIL)
+						data->srch_bt_dev_list_win = data->srch_bt_list_devices_menu_data.win;
+				}
+			}
+			}
+			else
+			{
+				/* We get here at the end of services discovery process */
+
+				if (data->srch_bt_please_wait_dialog != (void *)0)
+				{
+					SEND_EVENT(data->srch_bt_please_wait_dialog, DIALOG_DESTROY, 0, 0);
+					data->srch_bt_please_wait_dialog = (void *)0;
+				}
+
+				device = &data->srch_bt_dev_list[data->srch_bt_cur_dev_idx];
+
+				device->services = disc_res_param->services;
+
+				MFW_BT_TRACE("mmi_bt_search_cntrl > Memset srch_bt_cur_dev_serv_list to 0x00 ... ");
+
+			memset(data->srch_bt_cur_dev_serv_list, 0x00, (sizeof(ULONG)*(BTA_MAX_SERVICE_ID-1)));
+
+				num_of_services = bt_count_dev_services(device->services,
+												     data->srch_bt_cur_dev_serv_list);
+
+				MFW_BT_TRACE("mmi_bt_search_cntrl > Initialising the List Data");
+				/*
+				** Create the list menu to display the results
+				*/
+				/* initialization of the dialog data */
+				data->srch_bt_show_services_menu_data.ListPosition   = 1;/* True cursor position in list menu. */
+				data->srch_bt_show_services_menu_data.Font           = 0;
+				data->srch_bt_show_services_menu_data.LeftSoftKey    = TxtNull;
+				data->srch_bt_show_services_menu_data.RightSoftKey   = TxtSoftBack;
+				data->srch_bt_show_services_menu_data.KeyEvents      = KEY_CLEAR | KEY_RIGHT | KEY_MNUUP | KEY_MNUDOWN |KEY_HUP;
+				data->srch_bt_show_services_menu_data.Reason         = 0;
+				data->srch_bt_show_services_menu_data.Strings        = FALSE;
+				data->srch_bt_show_services_menu_data.autoDestroy    = TRUE;
+				
+				data->srch_bt_show_services_menu_data.Attr           = (MfwMnuAttr *)&menuBtShowServicesListAttr;
+				data->srch_bt_show_services_menu_data.Attr->hdrId = TxtBtServices;
+				data->srch_bt_show_services_menu_data.Attr->nItems = num_of_services;
+
+				data->srch_bt_show_services_menu_data.ListLength = num_of_services; /* actual number of entries in list menu.    */
+				data->srch_bt_show_services_menu_data.List = (MfwMnuItem *)mfwAlloc(data->srch_bt_show_services_menu_data.ListLength * sizeof (MfwMnuItem));
+
+				if (data->srch_bt_show_services_menu_data.List != (MfwMnuItem *)0)
+				{
+					/*
+					** Initialise the memory to 0x00
+					*/
+					memset(data->srch_bt_show_services_menu_data.List, 0x00, data->srch_bt_show_services_menu_data.ListLength * sizeof (MfwMnuItem));
+
+					for (iLoop = 0; iLoop < data->srch_bt_show_services_menu_data.ListLength; iLoop++)
+					{
+						listItem = &data->srch_bt_show_services_menu_data.List[iLoop];
+						
+						listItem->str =(char *)bt_get_TxtId_for_service(data->srch_bt_cur_dev_serv_list[iLoop]);
+						listItem->flagFunc = (FlagFunc)item_flag_none;
+					}
+
+					MFW_BT_TRACE("mmi_bt_search_cntrl > Displaying the List Menu!");
+
+					if (listDisplayListMenu(data->win, &data->srch_bt_show_services_menu_data, (ListCbFunc)bt_srch_service_list_listmnu_cb, FALSE) != LISTS_FAIL)
+							data->srch_bt_show_services_win = data->srch_bt_show_services_menu_data.win;
+				}
+				else
+				{
+					mmi_bluetooth_show_info(data->win, TxtFailed, TxtNull);
+				}
+			}
+
+
+
+			break;
+
+		case BT_DISCOVER_COMPLETE:
+			/*
+			** CQ 21838 : This event signifies the end of the discover process, this event shoulkd not be ignored.
+			**
+			** If the results for all the expected devices have been received then there will be nothing else to do,
+			** otherwise this signal will have to trigger the end of the search. If no device results had been
+			** reported, then the "No Devices Found".
+			*/
+			
+			if (!mfw_bt_dm_is_discover())
+			{
+				if (data->srch_bt_device_count != data->srch_bt_num_devices)
+				{
+					if (data->srch_bt_device_count == 0)
+					{
+						/*
+						** If No devices have been reported display a dialog
+						*/
+						mmi_bluetooth_show_info_callback(data->win, TxtBtNoDevices, TxtBtFound, mmi_bt_srch_no_device_found_dlg_cb);
+
+						/*
+						** Destroy the memory allocated when the inquiry complete was received
+						*/
+						mfwFree((U8 *)data->srch_bt_list_devices_menu_data.List,
+									   (data->srch_bt_list_devices_menu_data.ListLength * sizeof (MfwMnuItem)));
+
+						mfwFree((U8 *)data->srch_bt_dev_list,
+										(sizeof(T_MFW_BT_REM_DEVICE_INFO) * data->srch_bt_num_devices));
+
+						data->srch_bt_num_devices = 0;
+						data->srch_bt_mode = BT_MODE_NO_SEARCH;
+					}
+					else
+					{
+						/*
+						** There are devices which have been reported.
+						** Change the mode of the list
+						*/
+						data->srch_bt_mode = BT_MODE_LIST_COMPLETE;
+
+						/*
+						** Destroy the window and recreate it
+						*/
+						listsDestroy(data->srch_bt_dev_list_win);
+
+						/*
+						** Allocate memory to copy the devices already listed, copy the active data,
+						** and free the memory set aside for ALL the devices to be listed.
+						**
+						** This should NOT be possible for the known device list, so there is no need to take account of the
+						** "No Devices" list entry
+						*/
+
+						ptr_tempListItem = (MfwMnuItem *)mfwAlloc(data->srch_bt_device_count * sizeof(MfwMnuItem));
+						if (ptr_tempListItem != (MfwMnuItem *)0)
+						{
+							/*
+							** Copy the list of items
+							*/
+							memcpy(ptr_tempListItem, data->srch_bt_list_devices_menu_data.List, (data->srch_bt_device_count * sizeof(MfwMnuItem)));
+
+							/*
+							** Free the first (and larger) list
+							*/
+							mfwFree((U8 *)data->srch_bt_list_devices_menu_data.List, (U16)(data->srch_bt_list_devices_menu_data.ListLength * sizeof(MfwMnuItem)));
+
+							data->srch_bt_list_devices_menu_data.List = ptr_tempListItem;
+						}
+
+						/*
+						** Repeat for the 'Device List'
+						*/
+						ptr_tempDevDb = (T_MFW_BT_REM_DEVICE_INFO *)mfwAlloc(data->srch_bt_device_count * sizeof(T_MFW_BT_REM_DEVICE_INFO));
+						if (ptr_tempDevDb!= (T_MFW_BT_REM_DEVICE_INFO *)0)
+						{
+							/*
+							** Copy the list of devices
+							*/
+							memcpy(ptr_tempDevDb, data->srch_bt_dev_list, (data->srch_bt_device_count * sizeof(T_MFW_BT_REM_DEVICE_INFO)));
+
+							/*
+							** Free the first (and larger) list
+							*/
+							mfwFree((U8 *)data->srch_bt_dev_list, (U16)(data->srch_bt_num_devices * sizeof(T_MFW_BT_REM_DEVICE_INFO)));
+
+							data->srch_bt_dev_list = ptr_tempDevDb;
+			}
+
+						/*
+						** Configure some other List parameters
+						*/
+						data->srch_bt_num_devices = data->srch_bt_device_count;
+						data->srch_bt_list_devices_menu_data.ListLength = data->srch_bt_device_count;
+						
+						data->srch_bt_list_devices_menu_data.Attr->nItems = data->srch_bt_device_count;
+
+						data->srch_bt_list_devices_menu_data.Attr->hdrId = TxtBtDevices;
+						data->srch_bt_list_devices_menu_data.LeftSoftKey = TxtSoftOptions;
+						data->srch_bt_list_devices_menu_data.RightSoftKey = TxtSoftBack;
+
+						/*
+						** CQ21842 : Modify the List Key Events so that it handles all teh keys it requires.
+						*/
+						data->srch_bt_list_devices_menu_data.KeyEvents      = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN |KEY_HUP;
+
+						data->srch_bt_list_devices_menu_data.autoDestroy = TRUE;
+
+						data->srch_bt_dev_list_cb = (ListCbFunc)bt_srch_dev_list_listmnu_cb;
+
+						/*
+						** CQ21841 : For each device in the list, reset the string pointer because it will be pointing to the old device
+						** list which has just been freed
+						*/
+						for (iLoop = 0; iLoop < data->srch_bt_num_devices; iLoop++)
+							data->srch_bt_list_devices_menu_data.List[iLoop].str = data->srch_bt_dev_list[iLoop].name;
+ 
+						/*
+						** Recreate the menu with the new details;
+						*/
+						if (listDisplayListMenu(data->win, &data->srch_bt_list_devices_menu_data, data->srch_bt_dev_list_cb, FALSE) != LISTS_FAIL)
+							data->srch_bt_dev_list_win = data->srch_bt_list_devices_menu_data.win;
+					}
+				}					
+			}
+
+			break;
+
+		case BT_PAIR_DEVICE:
+#ifdef NEW_EDITOR
+			/*
+			** Initialise the editor
+			*/
+			AUI_edit_SetDefault(&editor_data);
+			AUI_edit_SetMode(&editor_data, ED_MODE_HIDDEN, ED_CURSOR_BAR);
+
+			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->bt_pairing_pin_buf, MFW_BT_MAX_PIN_CODE_LEN);
+			AUI_edit_SetTextStr(&editor_data, TxtSoftSelect, TxtSoftBack, TxtBtEnterPassKey, TxtNull);
+			AUI_edit_SetAltTextStr(&editor_data, 1, TxtNull, TRUE, TxtCancel);
+
+			AUI_edit_SetEvents(&editor_data, BT_PAIRING_EDITOR, TRUE, FOREVER, (T_AUI_EDIT_CB)mmi_bluetooth_editor_cb);
+
+			data->srch_bt_pairing_pin_editor= AUI_edit_Start(data->win, &editor_data);
+#endif
+			break;
+
+		case BT_SHOW_DEV_SERVICES:
+
+			cur_device = &data->srch_bt_dev_list[data->srch_bt_cur_dev_idx];
+
+			data->srch_bt_please_wait_dialog = mmi_bluetooth_show_please_wait(data->win);
+			
+			mfw_bt_dm_discover_device(cur_device->bd_addr);
+			
+			break;
+
+		case BT_DISABLE_SEARCH:
+			mmi_bt_search_destroy();
+			break;
+
+		default:
+			MFW_BT_TRACE("mmi_bluetooth() : Unexpected Event!");
+	}
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_win_cb
+
+ $Description:		This function is the windows callback function for the Bluetooth Root window.
+ 				It has no display
+
+ $Returns:		MFW_EVENT_REJECTED : This window does not display anything. The event is rejected
+ 				so it is passed down the win chain.
+
+ $Arguments:		Not used.
+
+*******************************************************************************/
+int mmi_bluetooth_win_cb (MfwEvt evt, MfwHnd win)
+{
+	MFW_BT_TRACE("mmi_bluetooth_win_cb()");
+
+	return MFW_EVENT_REJECTED;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_device_mnu_cb
+
+ $Description:		This function is called when the user has a list of devices (either known or local)
+ 				and they select 1.
+ 				
+ $Returns:		BOOL - True is successful, otherwise FALSE
+
+ $Arguments:		None
+
+*******************************************************************************/
+static int  mmi_bluetooth_device_mnu_cb(MfwMnu * mnu, MfwMnuItem * item)
+{
+	MFW_BT_TRACE("mmi_bluetooth_device_mnu_cb()");
+
+	bt_srch_data.srch_bt_cur_dev_idx = mnu->lCursor[mnu->level];
+
+	/*
+	** CQ22023 : Modify the Menu Header to display the name of the Current Device
+	*/
+	menuBtDeviceOptions.hdrId = (int)bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx].name;
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_editor_cb
+
+ $Description:		This function provides the callback functionality to an editor for Bluetooth
+
+ $Returns:		None
+
+ $Arguments:	
+ 
+*******************************************************************************/
+
+static void mmi_bluetooth_editor_cb(T_MFW_HND win, USHORT identifier, SHORT reason)
+{
+	T_MFW_WIN		* win_data = ((T_MFW_HDR *) win)->data;
+	T_MMI_BT_PIN_Req_Data * pin_req_data = (T_MMI_BT_PIN_Req_Data *)win_data->user;
+	T_MMI_BT_Dev_Name_Data* dev_name_data = (T_MMI_BT_Dev_Name_Data *)win_data->user;
+	T_MMI_BtSearchData *srch_data = (T_MMI_BtSearchData *)win_data->user;
+
+	UBYTE			* editor_buffer = NULL;
+	SHORT			max_edit_size = 0;
+	T_MFW_HND		editor_win;
+	T_MFW_HND		parent;
+
+	MFW_BT_TRACE("mmi_bluetooth_editor_cb()");
+
+	if ((identifier == BT_DEV_NAME_EDITOR) ||
+	     (identifier == BT_REM_DEV_NAME_EDITOR))	/* CQ21843 */
+	{
+		editor_buffer = dev_name_data->bt_device_name;
+		max_edit_size = MFW_BT_NAME_LENGTH;
+		editor_win = dev_name_data->bt_dev_name_editor;
+		parent = dev_name_data->win;
+	}
+	else if (identifier == BT_PIN_REQ_EDITOR)
+	{
+		editor_buffer = pin_req_data->bt_pin_req_buf;
+		max_edit_size = MFW_BT_MAX_PIN_CODE_LEN;
+		editor_win = pin_req_data->bt_pin_req_editor;
+		parent = pin_req_data->win;
+	}
+	else if (identifier == BT_PAIRING_EDITOR)
+	{
+		editor_buffer = srch_data->bt_pairing_pin_buf;
+		max_edit_size = MFW_BT_MAX_PIN_CODE_LEN;
+		editor_win = srch_data->srch_bt_pairing_pin_editor;
+		parent = srch_data->win;
+	}
+	else
+	{
+		MFW_BT_TRACE_P1("mmi_bluetooth_editor_cb() : Unknown Identifier %d", identifier);
+		/*
+		** if this isn't one of the "recognised" editors leave now!
+		*/
+		return;
+	}
+
+	switch (reason)
+	{
+		case INFO_KCD_LEFT:
+		{	
+			/*
+			** Construct the required string
+			*/
+
+			/*
+			** The Editor Attributes for all Bluetooth Editors require ASCII text. Text should not be Unicode
+			**
+			if (editor_buffer[0] == 0x80 )		// If Unicode (there is no way it should be though!!)
+			{	//If empty string, remove 0x80 at beginning
+				if (editor_buffer[2]==0x00 &&  editor_buffer[3] == 0x00)
+					memset(editor_buffer, 0, max_edit_size);
+			}
+			*/
+
+			/*
+			** If there is no string entered, treat this as if it was a "Cancel"
+			*/
+			if (editor_buffer[0] == 0x00)
+			{
+				/*
+				** Send a "Cancel" to the Bluetooth window
+				*/
+				SEND_EVENT(parent, BT_EDITOR_CANCEL, identifier, NULL);
+			}
+			else
+			{
+				/*
+				** Send a "Select" to the Bluetooth window
+				*/
+				SEND_EVENT(parent, BT_EDITOR_SELECT, identifier, NULL);
+			}
+		}
+		break;
+
+		case INFO_KCD_RIGHT:
+			if (strlen((char *)editor_buffer) == 0)
+			{
+				/*
+				** Send a "Cancel" to the Bluetooth window
+				*/
+				SEND_EVENT(parent, BT_EDITOR_CANCEL, identifier, NULL);
+			}
+			break;
+
+		case INFO_KCD_HUP:
+			/*
+			** Set the buffer to NULLS
+			*/
+			memset(editor_buffer, 0x00, max_edit_size);
+
+
+			/*
+			** Send a "Cancel" to the Bluetooth window
+			*/
+			SEND_EVENT(parent, BT_EDITOR_CANCEL, identifier, NULL);
+			break;
+
+		default:
+			/* otherwise no action to be performed
+			*/
+			break;
+	}
+}
+
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_search_cb
+
+ $Description:		This function 
+
+ $Returns:		None
+
+ $Arguments:	
+ 
+*******************************************************************************/
+
+static int mmi_bluetooth_search_cb(T_MFW_EVENT evnt, void *para)
+{
+	MFW_BT_TRACE_P1("mmi_bluetooth_search_cb() : event received %d", evnt);
+
+	switch (evnt)
+	{
+		case E_BT_DM_AUTH_CMPL:
+			if (bt_srch_data.srch_bt_req_resp == BT_PAIRED_NOT_RESP)
+				SEND_EVENT(bt_srch_data.win, BT_AUTH_COMPLETE, 0, (void *)para);
+			else
+				return MFW_EVENT_REJECTED;
+			break;
+
+		case E_BT_DM_INQ_CMPL:
+			SEND_EVENT(bt_srch_data.win, BT_INQUIRY_COMPLETE, 0, (void *)para);
+			break;
+			
+		case E_BT_DM_DISC_RES:
+			SEND_EVENT(bt_srch_data.win, BT_DISCOVER_RESULT, 0, (void *)para);
+			break;
+			
+		case E_BT_DM_DISC_CMPL:
+			SEND_EVENT(bt_srch_data.win, BT_DISCOVER_COMPLETE, 0, (void *)para);
+			break;
+
+		default:
+			return MFW_EVENT_REJECTED;
+	}
+
+	return MFW_EVENT_CONSUMED;
+}
+/*******************************************************************************
+
+ $Function:		mmi_bluetooth_root_cb
+
+ $Description:		This function 
+
+ $Returns:		None
+
+ $Arguments:	
+ 
+*******************************************************************************/
+
+static int mmi_bluetooth_root_cb(T_MFW_EVENT evnt, void* para)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+	T_MFW_HND win = mfw_parent(mfw_header());
+	
+	MFW_BT_TRACE_P1("mmi_bluetooth_root_cb() : event received %d", evnt);
+
+	switch (evnt)
+	{
+		case E_BT_ENABLE_CMPL:
+			if (((T_MFW_BT_ENABLE_CMPL *)para)->Success == FALSE)
+			{
+				/*
+				** Ensure Flag is Disabled
+				*/
+				data->bt_isActive = FALSE;
+
+				/*
+				** Turn the Bluetooth Icon Off ... Not Done because there is no documentation re icons!!!!!
+				**                                             and there is not the time to figure them out from Raw Code!!
+				*/
+
+				/*
+				** Create a timed dialog to display the Message "Bluetooth Failed"
+				*/
+				mmi_bluetooth_show_info(0, TxtBluetooth, TxtFailed);
+			}
+			else
+			{
+				/*
+				** Set Flag to Enabled
+				*/
+				data->bt_isActive = TRUE;
+
+				/*
+				** Turn the Bluetooth Icon On ... Not Done because there is no documentation re icons!!!!!
+				**                                             and there is not the time to figure them out from Raw Code!!
+				*/
+
+				/*
+				** Create a timed dialog to display the Message "Bluetooth Activated"
+				*/
+				mmi_bluetooth_show_info(0, TxtBluetooth, TxtActivated);
+			}
+			break;
+
+		case E_BT_DISABLE_CMPL:
+			/*
+			** Set Flag to Enabled
+			*/
+			data->bt_isActive = FALSE;
+
+			/*
+			** Turn the Bluetooth Icon Off ... Not Done because there is no documentation re icons!!!!!
+			**                                             and there is not the time to figure them out from Raw Code!!
+			*/
+
+			/*
+			** Create a timed dialog to display the Message "Bluetooth DeActivated"
+			*/
+			mmi_bluetooth_show_info(0, TxtBluetooth, TxtDeActivated);
+			break;
+
+		case E_BT_DM_DEV_NAME_REQ:
+			if (data->bt_dev_name_win == (void *)0)
+			{
+				data->bt_DevNameForStartup = TRUE;
+				data->bt_dev_name_win = mmi_bt_dev_name_create(win);
+
+				if (data->bt_dev_name_win != (void *)0)
+				{
+					SEND_EVENT(data->bt_dev_name_win, BT_DEV_NAME_REQ, 0, (void *)para);
+				}
+				else
+				{
+					MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to create Device Name Win!");
+
+					btRetVal = mfw_bt_dm_set_local_name((void *)0);
+					if (btRetVal != MFW_BT_SUCCESS)
+					{
+						MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to return Device Name to Mfw!");
+					}
+				}
+			}
+			else
+			{
+				MFW_BT_TRACE("mmi_bluetooth_root_cb() : Device Name Win already active");
+			}
+			break;
+
+		case E_BT_DM_LINK_UP:
+			if (data->bt_num_active_connections < MFW_BT_MAX_CONSEC_CONNECTIONS)
+				data->bt_num_active_connections++;
+			else
+			{
+				MFW_BT_TRACE("mmi_bluetooth_root_cb() : LINK_UP indicated after Max Consecutive connections reached");
+			}
+			break;
+
+		case E_BT_DM_LINK_DOWN:
+			if (data->bt_num_active_connections >= 1)
+				data->bt_num_active_connections--;
+			else
+			{
+				MFW_BT_TRACE("mmi_bluetooth_root_cb() : LINK_DOWN indicated when no active connections!");
+			}
+			break;
+
+		case E_BT_DM_PIN_REQ:
+			if (data->bt_pin_req_win  == (void *)0)
+			{
+				data->bt_pin_req_win = mmi_bt_pin_request_create(win);
+
+				if (data->bt_pin_req_win != (void *)0)
+				{
+					SEND_EVENT(data->bt_pin_req_win, BT_PIN_REQ, 0, (void *)para);
+				}
+				else
+				{
+					MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to create PIN Req Win!");
+
+					btRetVal = mfw_bt_dm_pin_code((UINT8 *)0, (UINT8)0);
+					if (btRetVal != MFW_BT_SUCCESS)
+					{
+						MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to return PIN to Mfw!");
+					}
+				}
+			}
+			else
+			{
+				MFW_BT_TRACE("mmi_bluetooth_root_cb() : PIN Req Win already active");
+
+				btRetVal = mfw_bt_dm_pin_code((UINT8 *)0, (UINT8)0);
+				if (btRetVal != MFW_BT_SUCCESS)
+				{
+					MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to return PIN to Mfw!");
+				}
+			}
+			break;
+
+		case E_BT_DM_AUTH_CMPL:
+			if (data->bt_pin_req_win != (void *)0)
+			{
+				SEND_EVENT(data->bt_pin_req_win, BT_AUTH_COMPLETE, 0, (void *)para);
+			}
+			else
+			{
+				MFW_BT_TRACE("mmi_bluetooth_root_cb() : PIN Req Win inactive!");
+			}
+			break;
+
+		case E_BT_DM_AUTHORIZE_REQ:
+			if (data->bt_authorize_win == (void *)0)
+			{
+				data->bt_authorize_win = mmi_bt_authorize_create(win);
+
+				if (data->bt_authorize_win != (void *)0)
+				{
+					SEND_EVENT(data->bt_authorize_win, BT_AUTHORIZE_REQ, 0, (void *)para);
+				}
+				else
+				{
+					MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to create Authorization Req Win!");
+
+					btRetVal = mfw_bt_dm_authorize_resp(MFW_BT_AUTH_FAIL);
+					if (btRetVal != MFW_BT_SUCCESS)
+					{
+						MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to return Authorization to Mfw!");
+					}
+				}
+			}
+			else
+			{
+				MFW_BT_TRACE("mmi_bluetooth_root_cb() : Authorization IReq Win already active");
+
+				btRetVal = mfw_bt_dm_authorize_resp(MFW_BT_AUTH_FAIL);
+				if (btRetVal != MFW_BT_SUCCESS)
+				{
+					MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unable to return Authorization to Mfw!");
+				}
+			}
+			break;
+
+		case E_BT_DM_SIG_STRENGTH_IND:
+			break;
+
+		case E_BT_DM_INQ_RES:
+		case E_BT_DM_INQ_CMPL:
+		case E_BT_DM_DISC_RES:
+		case E_BT_DM_DISC_CMPL:
+		default:
+			MFW_BT_TRACE("mmi_bluetooth_root_cb() : Unexpected Event!!");
+	}
+	return MFW_EVENT_CONSUMED;
+
+}
+
+static int mmi_bluetooth_search_timer_cb(MfwEvt e, MfwTim *t)
+{
+	T_MMI_BtSearchData *data = &bt_srch_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_search_timer_cb()");
+
+	if (data->srch_bt_please_wait_dialog != (void *)0)
+	{
+		SEND_EVENT(data->srch_bt_please_wait_dialog, DIALOG_DESTROY, 0, 0);
+		data->srch_bt_please_wait_dialog = (void *)0;
+	}
+	/*
+	** Display "No Devices Found" and exit the Search Window
+	*/
+	mmi_bluetooth_show_info_callback(data->win, TxtBtNoDevices, TxtBtFound, mmi_bt_srch_no_device_found_dlg_cb);
+
+	data->srch_bt_mode = BT_MODE_NO_SEARCH;
+}
+static int mmi_bluetooth_discovery_timer_cb(MfwEvt e, MfwTim *t)
+{
+	T_MMI_BtData *data = &bt_data;
+	T_MFW_BT_STATUS btRetVal;
+
+	MFW_BT_TRACE("mmi_bluetooth_discovery_timer_cb()");
+
+	/*
+	** Make the Device Not Discoverable, (Device Hiddenm but from Temporary Request)
+	*/
+	btRetVal = mfw_bt_dm_set_visibility(FALSE, TRUE);
+	
+	if (btRetVal != MFW_BT_SUCCESS)
+	{
+		MFW_BT_TRACE_P1("mmi_bluetooth_discovery_timer_cb() : Set Visibility (FALSE) failed with status : %d", btRetVal);
+	}
+	else
+	{
+		/*
+		** Create a timed dialog to display the Message "Device Hidden"
+		*/
+		mmi_bluetooth_show_info(0, TxtBtDevice, TxtBtHidden);
+	}
+
+	if (data->bt_stopBtOnDiscoverableTimeout != FALSE)
+	{
+	/*
+	** If there are currently active connections, start the connection timer, otherwise turn bluetooth off
+	*/
+	if (data->bt_num_active_connections >= 1)
+	{
+		timStart(data->bt_connection_timer);
+	}
+	else if (data->bt_isActive != FALSE)
+	{
+		/*
+		** Disable the Bluetooth module
+		*/
+		mfw_bt_disable();
+		}
+	}
+}
+
+static int mmi_bluetooth_connection_timer_cb(MfwEvt e, MfwTim *t)
+{
+	T_MMI_BtData *data = &bt_data;
+
+	MFW_BT_TRACE("mmi_bluetooth_connection_timer_cb()");
+
+	/*
+	** If there are currently active connections, start the connection timer, otherwise turn bluetooth off
+	*/
+	if (data->bt_num_active_connections >= 1)
+	{
+		timStart(data->bt_connection_timer);
+	}
+	else if (data->bt_isActive != FALSE)
+	{
+		/*
+		** Disable the Bluetooth module
+		*/
+		mfw_bt_disable();
+	}
+}
+
+static void mmi_bluetooth_dlg_cb(void)
+{
+	MFW_BT_TRACE("mmi_bluetooth_dlg_cb()");
+
+	return;
+}
+
+static void mmi_bt_srch_no_device_found_dlg_cb(void)
+{
+	MFW_BT_TRACE("mmi_bt_srch_no_device_found_dlg_cb()");
+
+	mmi_bt_search_destroy();
+	return;
+}
+static MfwHnd mmi_bluetooth_show_please_wait(T_MFW_HND parent)
+{
+	T_DISPLAY_DATA display_info;
+
+	MFW_BT_TRACE("mmi_bluetooth_show_please_wait()");
+
+	/*
+	** Create a timed dialog to display the Message "Failed"
+	*/
+	dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, TxtPleaseWait, TxtNull, COLOUR_STATUS);
+	dlg_initDisplayData_events( &display_info, mmi_bluetooth_dlg_cb, FOREVER, 0);
+
+	return info_dialog(parent, &display_info);
+}
+
+static MfwHnd mmi_bluetooth_show_info_callback(T_MFW_HND parent, int str1, int str2, T_VOID_FUNC callback)
+{
+	T_DISPLAY_DATA display_info;
+
+	MFW_BT_TRACE("mmi_bluetooth_show_info()");
+
+
+	/*
+	** Create a timed dialog to display the Message "Failed"
+	*/
+	dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, str1, str2, COLOUR_STATUS);
+	dlg_initDisplayData_events( &display_info, callback, BT_INFO_SCRN_TIMEOUT, KEY_LEFT | KEY_CLEAR | KEY_HUP);
+
+	return info_dialog(parent, &display_info);
+}
+
+static MfwHnd mmi_bluetooth_show_info(T_MFW_HND parent, int str1, int str2)
+{
+	return mmi_bluetooth_show_info_callback(parent, str1, str2, mmi_bluetooth_dlg_cb);
+}
+
+
+
+T_MFW_HND bt_menu_start(MfwHnd parent, MfwMnuAttr* menuAttr, T_VOID_FUNC cancel_cb)
+{
+	T_MFW_HND win;
+		T_MFW_WIN     *win_data;
+		T_bt_menu *data;
+
+	MFW_BT_TRACE("bt_menu_start()");
+
+	win = bt_menu_create (parent);
+
+	if (win NEQ NULL)
+	{
+		win_data = ((T_MFW_HDR *)win)->data;
+		data = (T_bt_menu *)win_data->user;
+
+		data->cancel_cb = cancel_cb;
+
+		SEND_EVENT (win, BT_MNU_INIT, 0, (MfwMnuAttr*) menuAttr);
+	}
+
+	return win;
+}
+
+static T_MFW_HND bt_menu_create(MfwHnd parent)
+{
+	T_MFW_WIN     * win_data;
+	T_bt_menu *  data = (T_bt_menu *)mfwAlloc(sizeof (T_bt_menu));
+
+
+	MFW_BT_TRACE ("bt_menu_create()");
+
+	data->win = win_create (parent, 0, E_WIN_VISIBLE, (T_MFW_CB)bt_menu_win_cb);
+
+	if (data->win EQ 0)
+	return 0;
+
+	/*
+	* Create window handler
+	*/
+	data->mmi_control.dialog   = (T_DIALOG_FUNC)bt_menu;
+	data->mmi_control.data     = data;
+	win_data                   = ((T_MFW_HDR *)data->win)->data;
+	win_data->user             = (void *)data;
+
+	/*
+	** Create the keyboard Handler
+	*/
+	data->kbd = kbdCreate(data->win,KEY_ALL,(MfwCb)bt_menu_kbd_cb);
+	data->kbd_long = kbdCreate(data->win,KEY_ALL|KEY_LONG,(MfwCb)bt_menu_kbd_long_cb);
+
+	/*
+	* return window handle
+	*/
+	return data->win;
+}
+
+static void bt_menu_destroy(MfwHnd window)
+{
+	T_MFW_WIN     * win_data  = ((T_MFW_HDR *)window)->data;
+	T_bt_menu * data = (T_bt_menu *)win_data->user;
+
+	MfwHnd auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN		* auth_win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * auth_data = (T_MMI_BT_Authorise_Data *)auth_win_data->user;
+
+	MFW_BT_TRACE ("bt_menu_destroy()");
+
+	if (window == NULL)
+	{
+		MFW_BT_TRACE ("Error : Called with NULL Pointer");
+		return;
+	}
+
+	if (data)
+	{
+		auth_data->bt_auth_menu = 0;
+		winDelete (data->win);
+		
+		/*
+		** Free Memory
+		*/
+		mfwFree((void *)data, sizeof (T_bt_menu));
+	}
+}
+
+static void bt_menu (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
+	T_bt_menu      * data = (T_bt_menu *)win_data->user;
+
+	MFW_BT_TRACE ("bt_menu()");
+
+	switch (event)
+	{
+		case BT_MNU_INIT:
+			data->menu = mnuCreate(data->win, (MfwMnuAttr*)parameter, E_MNU_ESCAPE, (MfwCb)bt_menu_mnu_cb);
+			mnuLang(data->menu, mainMmiLng);
+			mnuUnhide(data->menu);
+			winShow(data->win);
+			break;
+
+		default:
+			return;
+	}
+}
+
+static int bt_menu_mnu_cb (MfwEvt e, MfwMnu *m)
+{
+	T_MFW_HND	win  = mfwParent(mfw_header());
+	
+	MfwHnd auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN		* win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+
+	MFW_BT_TRACE ("bt_menu_mnu_cb()");
+
+	switch (e)
+	{
+		case E_MNU_ESCAPE:
+			bt_menu_destroy(win);
+			data->bt_auth_menu = 0;
+			break;
+
+		default:
+			return 0;
+	}
+
+	return 1;
+}
+
+static int bt_menu_win_cb (MfwEvt e, MfwWin *w)
+{
+	T_bt_menu * data = (T_bt_menu *)w->user;
+	MfwMnu * mnu;
+
+	MFW_BT_TRACE ("bt_menu_win_cb()");
+	
+	switch (e)
+	{
+		case MfwWinVisible:
+			mnu = (MfwMnu *)mfwControl(data->menu);
+			softKeys_displayId(TxtSoftSelect, TxtSoftBack, 0, mnu->curAttr->mnuColour );
+			break;
+
+		default:
+			return 0;
+	}
+	return 1;
+}
+
+static int bt_menu_kbd_cb (MfwEvt e, MfwKbd *k)
+{
+	T_MFW_HND	win  = mfwParent(mfw_header());
+	T_MFW_WIN	*win_data = ((T_MFW_HDR *)win)->data;
+	T_bt_menu	*data = (T_bt_menu *)win_data->user;
+
+	T_VOID_FUNC cancel_cb;
+
+	MFW_BT_TRACE ("bt_menu_kbd_cb()");
+
+
+	switch (k->code)
+	{
+		case KCD_MNUUP:
+			mnuUp(data->menu);
+			winShow(win);
+			break;
+
+		case KCD_MNUDOWN:
+			mnuDown(data->menu);
+			winShow(win);
+			break;
+
+		case KCD_LEFT:
+			mnuSelect(data->menu);
+			{
+				MfwMnu *mnu;
+				mnu = (MfwMnu *) mfwControl( data->menu );
+				if (mnu != NULL)
+				{
+					if (mnu->curAttr != NULL)
+						softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, mnu->curAttr->mnuColour);
+				}
+			}
+			break;
+
+		case KCD_RIGHT:
+		case KCD_HUP:
+			cancel_cb = data->cancel_cb;
+			mnuEscape(data->menu);
+
+			cancel_cb();
+			break;
+
+		default:
+			return MFW_EVENT_CONSUMED;
+	}
+	return MFW_EVENT_CONSUMED;
+}
+
+static int bt_menu_kbd_long_cb (MfwEvt e, MfwKbd *k)
+{
+	T_MFW_HND       win  = mfwParent(mfw_header());
+	T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
+	T_bt_menu * data = (T_bt_menu *)win_data->user;
+
+
+	MFW_BT_TRACE ("bt_menu_kbd_long_cb()");
+
+	if ((e & KEY_CLEAR) && (e & KEY_LONG))
+	{
+		mnuEscape(data->menu);
+		return MFW_EVENT_CONSUMED;
+	}
+	
+	return  MFW_EVENT_CONSUMED;
+}
+
+static void mmi_bt_authorize_editor_cb(T_MFW_HND win, USHORT identifier, SHORT reason)
+{
+	MfwHnd auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN		* win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+	
+	MFW_BT_TRACE("bt_auth_editor_cb()");
+	
+	switch (reason)
+	{
+		case INFO_KCD_RIGHT:
+		case INFO_KCD_HUP:
+			/*
+			** CQ22021 : The Editor is destroyed automatically, reset the win value to NULL
+			*/
+			 data->bt_auth_info_editor = (void *)0;
+
+			/*
+			** Free the dynamically allocated memory
+			*/
+			mfwFree(data->bt_auth_info_text, data->bt_auth_info_text_size);
+			break;
+
+		default:
+			/* otherwise no action to be performed
+			*/
+			break;
+	}
+
+	return;
+}
+
+static int mmi_bt_authorize_display_info(MfwMnu* m, MfwMnuItem* i)
+{
+	T_MFW_HND	auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN   * win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+
+	USHORT			reqBufSize = 0;
+	USHORT			serviceTxtId = TxtNotSupported;
+#ifdef NEW_EDITOR
+	T_AUI_EDITOR_DATA	editor_data;
+#endif
+	
+	MFW_BT_TRACE("mmi_bt_authorize_display_info()");
+	
+	/*
+	** Get the Text Id to be used to represent the service
+	*/
+	switch(data->bt_auth_req_param->service)
+	{
+		case BTA_SPP_SERVICE_ID:
+			serviceTxtId = TxtBtSerialPort;
+			break;
+
+		case BTA_DUN_SERVICE_ID:
+			serviceTxtId = TxtBtDialUpNetworking;
+			break;
+
+		case BTA_FAX_SERVICE_ID:
+			serviceTxtId = TxtFax;
+			break;
+
+		case BTA_HSP_SERVICE_ID:
+			serviceTxtId = TxtBtHeadSet;
+			break;
+
+		case BTA_HFP_SERVICE_ID:
+			serviceTxtId = TxtBtHandsFree;
+			break;
+
+		case BTA_OP_SERVICE_ID:
+			serviceTxtId = TxtBtObjectPush;
+			break;
+
+		case BTA_FT_SERVICE_ID:
+			serviceTxtId = TxtBtFileTransfer;
+			break;
+	}
+
+	/*
+	** Calculate the size of Buffer required this will give a little extra ... not not much.
+	*/
+	reqBufSize = BT_MAX_DISPLAY_DEV_NAME_LENGTH; // The max length of the dev name was ensured when the event was received
+	reqBufSize += strlen(MmiRsrcGetText(TxtBtRequiresAuthorizationForService));
+	reqBufSize += strlen(MmiRsrcGetText(serviceTxtId));
+	reqBufSize += 6; // Added for CR/Lf to ensure enough space
+
+	/*
+	** Allocate enough memory for the display text
+	*/
+	data->bt_auth_info_text = mfwAlloc(reqBufSize);
+
+	if (data->bt_auth_info_text == 0)
+	{
+		/*
+		** Display an error dialog and return
+		*/
+		mmi_bluetooth_show_info(data->win, TxtFailed, TxtErrorOutOfMem);
+		return MFW_EVENT_CONSUMED;
+	}
+
+	data->bt_auth_info_text_size = reqBufSize;
+
+	sprintf((char *)data->bt_auth_info_text, MmiRsrcGetText(TxtBtRequiresAuthorizationForService),
+		     (char *)data->bt_auth_req_param->bd_name,
+		     (char *)MmiRsrcGetText(serviceTxtId));
+	
+#ifdef NEW_EDITOR
+	/*
+	** Initialise the editor
+	*/
+	AUI_edit_SetDefault(&editor_data);
+
+	AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->bt_auth_info_text, data->bt_auth_info_text_size);
+	AUI_edit_SetTextStr(&editor_data, TxtNull, TxtSoftBack, TxtBtInfo, TxtNull);
+	AUI_edit_SetMode(&editor_data, ED_MODE_READONLY, ED_CURSOR_NONE);
+
+	AUI_edit_SetEvents(&editor_data, 0, TRUE, FOREVER, mmi_bt_authorize_editor_cb);
+
+	data->bt_auth_info_editor = AUI_edit_Start(data->win, &editor_data);
+#endif
+
+	return MFW_EVENT_CONSUMED;
+}
+
+static int mmi_bt_authorize_once(MfwMnu* m, MfwMnuItem* i)
+{
+	MfwHnd auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN		* win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+	T_MFW_BT_STATUS	btRetVal;
+
+	MFW_BT_TRACE("mmi_bt_authorize_once()");
+
+	/*
+	** Send the appropriate response to Bluetooth
+	*/
+	btRetVal = mfw_bt_dm_authorize_resp(MFW_BT_AUTH_ONCE);
+
+	/*
+	** Destroy the Menu
+	*/
+	if (data->bt_auth_menu != 0)
+		bt_menu_destroy(data->bt_auth_menu);
+
+	/*
+	** Free the Allocated Memory
+	*/
+	mfwFree((U8 *)data->bt_auth_req_param, (U16)sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+	data->bt_auth_req_param = (void *)0;
+
+	/*
+	** Destroy the Authorization Window
+	*/
+	mmi_bt_authorize_destroy(data->win);
+	
+	return MFW_EVENT_CONSUMED;
+
+}
+
+static int mmi_bt_authorize_always(MfwMnu* m, MfwMnuItem* i)
+{
+	MfwHnd auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN		* win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+	T_MFW_BT_STATUS	btRetVal;
+
+	MFW_BT_TRACE("bt_authorize_always()");
+
+	/*
+	** Send the appropriate response to Bluetooth
+	*/
+	btRetVal = mfw_bt_dm_authorize_resp(MFW_BT_AUTH_ALWAYS);
+
+	/*
+	** Destroy the Menu
+	*/
+	if (data->bt_auth_menu != 0)
+		bt_menu_destroy(data->bt_auth_menu);
+
+	/*
+	** Free the Allocated Memory
+	*/
+	mfwFree((U8 *)data->bt_auth_req_param, (U16)sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+	data->bt_auth_req_param = (void *)0;
+
+	/*
+	** Destroy the Authorization Window
+	*/
+	mmi_bt_authorize_destroy(data->win);
+	
+	return MFW_EVENT_CONSUMED;
+
+}
+
+static int mmi_bt_dont_authorize(MfwMnu* m, MfwMnuItem* i)
+{
+	MfwHnd auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN		* win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+	T_MFW_BT_STATUS	btRetVal;
+
+	MFW_BT_TRACE("mmi_bt_dont_authorize()");
+
+	/*
+	** Send the appropriate response to Bluetooth
+	*/
+	btRetVal = mfw_bt_dm_authorize_resp(MFW_BT_AUTH_FAIL);
+
+	/*
+	** Destroy the Menu
+	*/
+	if (data->bt_auth_menu != 0)
+		bt_menu_destroy(data->bt_auth_menu);
+
+	/*
+	** Free the Allocated Memory
+	*/
+	mfwFree((U8*)data->bt_auth_req_param, (U16)sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+	data->bt_auth_req_param = (void *)0;
+
+	/*
+	** Destroy the Authorization Window
+	*/
+	mmi_bt_authorize_destroy(data->win);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+static void mmi_bt_authorize_rsk(void)
+{
+	MfwHnd auth_win = bt_data.bt_authorize_win;
+	T_MFW_WIN		* win_data = ((T_MFW_HDR *) auth_win)->data;
+	T_MMI_BT_Authorise_Data * data = (T_MMI_BT_Authorise_Data *)win_data->user;
+	T_MFW_BT_STATUS	btRetVal;
+
+	MFW_BT_TRACE("bt_authorize_rsk()");
+
+	/*
+	** Send the appropriate response to Bluetooth
+	*/
+	btRetVal = mfw_bt_dm_authorize_resp(MFW_BT_AUTH_FAIL);
+
+	/*
+	** Destroy the Menu
+	*/
+	if (data->bt_auth_menu != 0)
+		bt_menu_destroy(data->bt_auth_menu);
+
+	/*
+	** Menu will be destroyed automatically by Right Softkey Press
+	** Free the Allocated Memory
+	*/
+	mfwFree((U8 *)data->bt_auth_req_param, (U16)sizeof(T_MFW_BT_DM_AUTHORIZE_REQ));
+	data->bt_auth_req_param = (void *)0;
+
+	/*
+	** Destroy the Authorization Window
+	*/
+	mmi_bt_authorize_destroy(data->win);
+
+	return;
+}
+
+static int bt_srch_dev_pair (MfwMnu * mnu, MfwMnuItem * item)
+{
+	MFW_BT_TRACE("bt_srch_dev_pair()");
+
+	SEND_EVENT(bt_srch_data.win, BT_PAIR_DEVICE, 0, 0);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+static int bt_srch_dev_show_services (MfwMnu * mnu, MfwMnuItem * item)
+{
+	MFW_BT_TRACE("bt_srch_dev_show_services()");
+
+	SEND_EVENT(bt_srch_data.win, BT_SHOW_DEV_SERVICES, 0, 0);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+/*
+**	CQ21843 : Menu Action function
+*/
+static int bt_srch_dev_set_name (MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MMI_BtData *data = &bt_data;
+	T_MFW_BT_REM_DEVICE_INFO *cur_device;
+	
+	MfwHnd win = mfw_parent(mfw_header());
+
+	MFW_BT_TRACE("bt_srch_dev_set_name()");
+
+	cur_device = &bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx];
+
+	if (data->bt_dev_name_win == (void *)0)
+	{
+		data->bt_DevNameForStartup = FALSE;
+
+		data->bt_dev_name_win = mmi_bt_dev_name_create(win);
+
+		if (data->bt_dev_name_win != (void *)0)
+		{
+			SEND_EVENT(data->bt_dev_name_win, BT_SET_REM_DEV_NAME, 0, (void *)cur_device);
+		}
+		else
+		{
+			MFW_BT_TRACE("bt_srch_dev_set_name() : Unable to create Device Name Win!");
+		}
+	}
+	else
+	{
+		MFW_BT_TRACE("bt_srch_dev_set_name() : Device Name Win already active");
+	}
+	return MFW_EVENT_CONSUMED;
+}
+
+static int bt_srch_dev_add_known (MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MFW_BT_REM_DEVICE_INFO *cur_device;
+
+
+	cur_device = &bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx];
+	MFW_BT_TRACE_P7("bt_srch_dev_add_known(), Idx %d, BD_ADDR 0x%02x%02x%02x%02x%02x%02x",
+					     bt_srch_data.srch_bt_cur_dev_idx,
+					     cur_device->bd_addr[0],
+					     cur_device->bd_addr[1],
+					     cur_device->bd_addr[2],
+					     cur_device->bd_addr[3],
+					     cur_device->bd_addr[4],
+					     cur_device->bd_addr[5]);
+
+	/*
+	** 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.
+	*/
+	cur_device->is_new = FALSE;
+
+	btRetVal = mfw_bt_dm_add_device(cur_device->bd_addr);
+
+	if (btRetVal != MFW_BT_SUCCESS)
+	{
+		/*
+		** CQ21834 : Failed to write the data to Flash, continue to treat the device as unknown.
+		*/
+		cur_device->is_new = TRUE;
+		MFW_BT_TRACE_P1("mfw_bt_dm_add_device returned error : %d", btRetVal);
+		mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+	}
+	else
+	{
+		winShow(mfw_parent(mfw_header()));
+	}
+	
+	return MFW_EVENT_CONSUMED;
+}
+
+static int bt_srch_dev_rem_known (MfwMnu * mnu, MfwMnuItem * item)
+{
+	T_MFW_BT_STATUS btRetVal;
+	T_MFW_BT_REM_DEVICE_INFO *cur_device;
+
+	MFW_BT_TRACE("bt_srch_dev_rem_known()");
+
+	cur_device = &bt_srch_data.srch_bt_dev_list[bt_srch_data.srch_bt_cur_dev_idx];
+
+	btRetVal = mfw_bt_dm_delete_device(cur_device->bd_addr);
+
+	if (btRetVal != MFW_BT_SUCCESS)
+	{
+		MFW_BT_TRACE_P1("mfw_bt_dm_delete_device returned error : %d", btRetVal);
+		mmi_bluetooth_show_info(0, TxtFailed, TxtNull);
+	}
+	else
+	{
+		cur_device->is_new = TRUE;
+		cur_device->link_key_present = FALSE;
+
+		winShow(mfw_parent(mfw_header()));
+	}
+
+	return MFW_EVENT_CONSUMED;
+}
+
+static void bt_srch_dev_list_searching_cb(T_MFW_HND Parent, ListMenuData * ListData)
+{
+	T_MFW_WIN			*win_data	= ((T_MFW_HDR *)Parent)->data;
+	T_MMI_BtSearchData	*data		= (T_MMI_BtSearchData *)win_data->user;
+	MfwMnuItem			*ptr_tempListItem;
+	T_MFW_BT_REM_DEVICE_INFO	*ptr_tempDevDb;
+	int iLoop;						/* CQ21841 : Loop identifier used while resetting the List labels */
+
+	MFW_BT_TRACE("bt_srch_dev_list_searching_cb()");
+
+	if ((ListData->Reason EQ LISTS_REASON_BACK) ||
+	     (ListData->Reason EQ LISTS_REASON_CLEAR) ||
+	     (ListData->Reason EQ LISTS_REASON_HANGUP))
+	{
+		/*
+		** Change the mode of the list
+		*/
+		data->srch_bt_mode = BT_MODE_LIST_COMPLETE;
+
+		/*
+		** Stop the Search Now ... even if there are more entries waiting in the buffer, they will be ignored.
+		*/
+		mfw_bt_dm_cancel_search();
+
+		/*
+		** Destroy the window and recreate it
+		*/
+		listsDestroy(ListData->win);
+
+		/*
+		** Allocate memory to copy the devices already listed, copy the active data,
+		** and free the memory set aside for ALL the devices to be listed.
+		*/
+
+		ptr_tempListItem = (MfwMnuItem *)mfwAlloc(data->srch_bt_device_count * sizeof(MfwMnuItem));
+		if (ptr_tempListItem != (MfwMnuItem *)0)
+		{
+			/*
+			** Copy the list of items
+			*/
+			memcpy(ptr_tempListItem, data->srch_bt_list_devices_menu_data.List, (data->srch_bt_device_count * sizeof(MfwMnuItem)));
+
+			/*
+			** Free the first (and larger) list
+			*/
+			mfwFree((U8 *)data->srch_bt_list_devices_menu_data.List, (U16)(data->srch_bt_num_devices * sizeof(MfwMnuItem)));
+
+			data->srch_bt_list_devices_menu_data.List = ptr_tempListItem;
+		}
+
+		/*
+		** Repeat for the 'Device List'
+		*/
+		ptr_tempDevDb = (T_MFW_BT_REM_DEVICE_INFO *)mfwAlloc(data->srch_bt_device_count * sizeof(T_MFW_BT_REM_DEVICE_INFO));
+		if (ptr_tempDevDb!= (T_MFW_BT_REM_DEVICE_INFO *)0)
+		{
+			/*
+			** Copy the list of devices
+			*/
+			memcpy(ptr_tempDevDb, data->srch_bt_dev_list, (data->srch_bt_device_count * sizeof(T_MFW_BT_REM_DEVICE_INFO)));
+
+			/*
+			** Free the first (and larger) list
+			*/
+			mfwFree((U8 *)data->srch_bt_dev_list, (U16)(data->srch_bt_num_devices * sizeof(T_MFW_BT_REM_DEVICE_INFO)));
+
+			data->srch_bt_dev_list = ptr_tempDevDb;
+		}
+
+		/*
+		** Configure some other List parameters
+		*/
+		data->srch_bt_num_devices = data->srch_bt_device_count;
+		data->srch_bt_list_devices_menu_data.ListLength = data->srch_bt_device_count;
+		data->srch_bt_list_devices_menu_data.Attr->nItems = data->srch_bt_device_count;
+
+		data->srch_bt_list_devices_menu_data.Attr->hdrId = TxtBtDevices;
+
+		data->srch_bt_list_devices_menu_data.LeftSoftKey = TxtSoftOptions;
+		data->srch_bt_list_devices_menu_data.RightSoftKey = TxtSoftBack;
+
+		/*
+		** CQ21842 : Modify the List Key Events so that it handles all teh keys it requires.
+		*/
+		data->srch_bt_list_devices_menu_data.KeyEvents      = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN |KEY_HUP;
+
+		data->srch_bt_list_devices_menu_data.autoDestroy = TRUE;
+
+		data->srch_bt_dev_list_cb = (ListCbFunc)bt_srch_dev_list_listmnu_cb;
+
+		/*
+		** CQ21841 : For each device in the list, reset the string pointer because it will be pointing to the old device
+		** list which has just been freed
+		*/
+		for (iLoop = 0; iLoop < data->srch_bt_num_devices; iLoop++)
+ 			data->srch_bt_list_devices_menu_data.List[iLoop].str = data->srch_bt_dev_list[iLoop].name;
+ 
+		/*
+		** Recreate the menu with the new details;
+		*/
+		if (listDisplayListMenu(data->win, &data->srch_bt_list_devices_menu_data, data->srch_bt_dev_list_cb, FALSE) != LISTS_FAIL)
+			data->srch_bt_dev_list_win = data->srch_bt_list_devices_menu_data.win;
+
+	}
+
+	return;
+}
+
+static void bt_srch_dev_list_listmnu_cb(T_MFW_HND Parent, ListMenuData * ListData)
+{
+	T_MFW_WIN			*win_data	= ((T_MFW_HDR *)Parent)->data;
+	//T_MMI_BtSearchData	*data		= (T_MMI_BtSearchData *)win_data->user;
+	T_MMI_BtSearchData	*data		= &bt_srch_data;
+	MfwMnuItem			*ptr_tempListItem;
+	T_MFW_BT_REM_DEVICE_INFO	*ptr_tempDevDb;
+
+	MFW_BT_TRACE_P1("bt_srch_dev_list_listmnu_cb(), with reason %d", ListData->Reason);
+
+	if ((ListData->Reason EQ LISTS_REASON_BACK) ||
+	     (ListData->Reason EQ LISTS_REASON_CLEAR) ||
+	     (ListData->Reason EQ LISTS_REASON_HANGUP))
+	{
+		/*
+		** Destroy the window --- Not sure if this is required! ... leave it out for now
+		*/
+		 listsDestroy(ListData->win);
+
+		/*
+		** Free the memory set aside for ALL the devices to be listed.
+		** CQ21834 : Use the "ListLength" value as this will also include the "No Devices" Entry for Known Devices.
+		*/
+		mfwFree((U8 *)data->srch_bt_list_devices_menu_data.List, (U16)(data->srch_bt_list_devices_menu_data.ListLength * sizeof(MfwMnuItem)));
+		data->srch_bt_list_devices_menu_data.List = (void *)0;
+
+		/*
+		** Repeat for the 'Device List'
+		*/
+		mfwFree((U8 *)data->srch_bt_dev_list, (U16)(data->srch_bt_num_devices * sizeof(T_MFW_BT_REM_DEVICE_INFO)));
+		data->srch_bt_dev_list = (void *)0;
+
+		/*
+		** Configure some other List parameters
+		*/
+		data->srch_bt_num_devices = 0;
+		data->srch_bt_device_count = 0;
+		data->srch_bt_list_devices_menu_data.ListLength = 0;
+		data->srch_bt_list_devices_menu_data.Attr->nItems = 0;
+
+		data->srch_bt_list_devices_menu_data.Attr->hdrId = 0;
+
+		data->srch_bt_list_devices_menu_data.LeftSoftKey = 0;
+		data->srch_bt_list_devices_menu_data.RightSoftKey = 0;
+		data->srch_bt_list_devices_menu_data.autoDestroy = TRUE;
+
+		data->srch_bt_dev_list_cb = (ListCbFunc)0;
+
+		data->srch_bt_dev_list_win = 0;
+		data->srch_bt_mode = BT_MODE_NO_SEARCH;
+
+		/*
+		** Destroy the "Bt Search Window" and return to the underlying Menu
+		*/
+		SEND_EVENT(data->win, BT_DISABLE_SEARCH, 0, 0);
+
+	}
+
+	return;
+}
+
+static void bt_srch_service_list_listmnu_cb(T_MFW_HND Parent, ListMenuData * ListData)
+{
+	T_MFW_WIN			*win_data	= ((T_MFW_HDR *)Parent)->data;
+	T_MMI_BtSearchData	*data		= (T_MMI_BtSearchData *)win_data->user;
+	MfwMnuItem			*ptr_tempListItem;
+	T_MFW_BT_REM_DEVICE_INFO	*ptr_tempDevDb;
+
+	MFW_BT_TRACE("bt_srch_service_list_listmnu_cb()");
+
+	if ((ListData->Reason EQ LISTS_REASON_BACK) ||
+	     (ListData->Reason EQ LISTS_REASON_CLEAR) ||
+	     (ListData->Reason EQ LISTS_REASON_HANGUP))
+	{
+		/*
+		** Destroy the window --- Not sure if this is required! ... leave it out for now
+		*/
+		listsDestroy(ListData->win);
+
+		/*
+		** Free the memory set aside for ALL the devices to be listed.
+		*/
+		mfwFree((U8 *)data->srch_bt_show_services_menu_data.List, (U16)(data->srch_bt_show_services_menu_data.ListLength * sizeof(MfwMnuItem)));
+		data->srch_bt_show_services_menu_data.List = (void *)0;
+
+		/*
+		** Configure some other List parameters
+		*/
+		data->srch_bt_show_services_menu_data.ListLength = 0;
+		data->srch_bt_show_services_menu_data.Attr->nItems = 0;
+
+		data->srch_bt_show_services_menu_data.Attr->hdrId = 0;
+
+		data->srch_bt_show_services_menu_data.LeftSoftKey = 0;
+		data->srch_bt_show_services_menu_data.RightSoftKey = 0;
+		data->srch_bt_show_services_menu_data.autoDestroy = TRUE;
+
+		data->srch_bt_show_services_win = 0;
+	}
+
+	return;
+}
+
+static int bt_count_dev_services(T_MFW_BT_SERVICE_MASK services, T_MFW_BT_SERVICE_MASK *srv_mask_arry)
+{
+	ULONG	chk_serv = 2;
+	int		iLoop;
+	int		iCount = 0;
+
+	MFW_BT_TRACE_P1("bt_count_dev_services() : services 0x%08lx", services);
+
+	for (iLoop = BTA_RES_SERVICE_ID + 1; iLoop < BTA_MAX_SERVICE_ID ; iLoop++)
+	{
+		MFW_BT_TRACE_P4("bt_count_dev_services > Idx %d, Count %d, Services 0x%08lx, chk_srv 0x%08lx",
+							iLoop, iCount, services, chk_serv);
+		
+			if ((services & chk_serv) != 0)
+			{
+				MFW_BT_TRACE_P2("bt_count_dev_services > Idx %d, Service 0x%08lx", iCount, chk_serv);
+				srv_mask_arry[iCount] = chk_serv;
+				
+				iCount++;
+			}
+
+			chk_serv *= 2;
+	}
+
+	MFW_BT_TRACE_P1("bt_count_dev_services > Number of Services Found : %d" , iCount);
+
+	return iCount;
+}
+
+static int bt_get_TxtId_for_service(T_MFW_BT_SERVICE_MASK service)
+{
+	int TxtId;
+	
+	MFW_BT_TRACE("bt_get_TxtId_for_service()");
+
+	switch (service)
+	{
+		case BTA_SPP_SERVICE_MASK:
+			TxtId = TxtBtSerialPort;
+			break;
+
+		case BTA_DUN_SERVICE_MASK:
+			TxtId = TxtBtDialUpNetworking;
+			break;
+
+		case BTA_FAX_SERVICE_MASK:
+			TxtId = TxtFax;
+			break;
+
+		case BTA_LAP_SERVICE_MASK:
+			TxtId = TxtBtLanAccess;
+			break;
+
+		case BTA_HSP_SERVICE_MASK:
+			TxtId = TxtBtHeadSet;
+			break;
+
+		case BTA_HFP_SERVICE_MASK:
+			TxtId = TxtBtHandsFree;
+			break;
+
+		case BTA_OP_SERVICE_MASK:
+			TxtId = TxtBtObjectPush;
+			break;
+
+		case BTA_FT_SERVICE_MASK:
+			TxtId = TxtBtFileTransfer;
+			break;
+
+		case BTA_CT_SERVICE_MASK:
+			TxtId = TxtBtCordlessTelephony;
+			break;
+
+		case BTA_IC_SERVICE_MASK:
+			TxtId = TxtBtIntercom;
+			break;
+
+		default:
+			TxtId = TxtBtUnknownService;			
+	}
+
+	return TxtId;
+}
+