view src/aci2/bmi/mmiCPHS.c @ 662:8cd8fd15a095

SIM speed enhancement re-enabled and made configurable TI's original code supported SIM speed enhancement, but Openmoko had it disabled, and OM's disabling of speed enhancement somehow caused certain SIM cards to start working which didn't work before (OM's bug #666). Because our FC community is much smaller in year 2020 than OM's community was in their day, we are not able to find one of those #666-affected SIMs, thus the real issue they had encountered remains elusive. Thus our solution is to re-enable SIM speed enhancement and simply wait for if and when someone runs into a #666-affected SIM once again. We provide a SIM_allow_speed_enhancement global variable that allows SIM speed enhancement to be enabled or disabled per session, and an /etc/SIM_spenh file in FFS that allows it to enabled or disabled on a non-volatile basis. SIM speed enhancement is now enabled by default.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 24 May 2020 05:02:28 +0000
parents 3c2acfa1a72f
children
line wrap: on
line source

/*******************************************************************************

					CONDAT (UK)

********************************************************************************									      

 This software product is the property of Condat (UK) Ltd and may not be
 disclosed to any third party without the express permission of the owner.				   
									      
********************************************************************************

 $Project name: Basic MMI						       
 $Project code: BMI (6349)							     
 $Module:		CPHS
 $File: 	    MmiCPHS.c
 $Revision:		1.0							  
									      
 $Author:		Condat(UK)							   
 $Date: 	    25/01/02							  
									       
********************************************************************************
									      
 Description

    This module provides the CPHS functionality

  
********************************************************************************
 $History: MmiCall.c

	Jun 14, 2005 REF: MMI-FIX-30439 x0018858
   	Description: The homezone/cityzone tags were not being displayed properly.
   	Solution: Modified to save the tags properly in caches and also made the 
	appropriate modifications to update the same properly during mobility.

	Aug 16, 2004    REF: CRR 24323   Deepa M.D
	Bug:Clenup of sprintf used for tracing
	Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX

    	Jun 23, 2004        	REF: CRR MMI-SPR-13599  Rashmi C N(Sasken) 
  	Solution:			The CF state is maintained in flash. During bootup the CF icon in the idle screen
  					 is displayed depending upon its state in the ffs


//  May 31, 2004        REF: CRR 17291  xvilliva
//	Bug:	After power cycle the setting of the used line which have been made 
//			from the BMI is lost.
//	Fix:	1.The global g_pin2 is defined here.
//		2. sAT_PlusCLCK() is called while locking and unlocking ALS.
//		3. ALSPresent() is modified to call tAT_PercentALS() & qAT_PercentALS().
//		NOTE:- ALSPresent() was giving faulty status earlier.


  25/01/02			Original Condat(UK) BMI version. (MC)	
	   
 $End

*******************************************************************************/


/******************************************************************************
									      
				Include Files
									      
*******************************************************************************/

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif
#include "mfw_sys.h"

#include "cus_aci.h"

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "ksd.h"
#include "psa.h"
#include "mfw_sms.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_lng.h"
#include "mfw_sat.h"
#include "mfw_kbd.h"
#include "mfw_nm.h"
#include "mfw_str.h"

#include "dspl.h"

#include "MmiMain.h"
#include "MmiDummy.h"
#include "MmiMmi.h"
#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiDialogs.h"
#include "MmiMenu.h"
#include "MmiSoftKeys.h"
/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"
#else
#include "MmiEditor.h"
#endif
#include "MmiBookShared.h"
#include "mmiSmsMenu.h"
#include "Mmiicons.h"
#include "mmiColours.h"

#include "MmiCPHS.h"
// Jun 23 2004        REF: CRR MMI-SPR-13599  Rashmi C N(Sasken) 
#include "mfw_ffs.h"
/* SPR759 - SH */
#ifdef MMI_HOMEZONE_ENABLED
#include "MmiHomezone.h"
#endif




/******************************************************************************
									      
			       Definitions
									      
*******************************************************************************/
//#define CPHS_PROV_TEST /*Test to bypass the reading of the CPHS field from the SIM card*/
char g_pin2[MAX_PIN+1];//xvilliva SPR17291

typedef enum


{
	INFO_NUM_LIST,
	MAILBOX_LIST, 
	MAILBOX_LIST_CALL
}
	T_MENU_TYPE;


static MfwMnuAttr InfoNum_menuAttrib =
{
    &melody_menuArea,
    MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu	    */
    -1, 				/* use default font	    */
    NULL,				/* with these items	    */
    0,					/* number of items     */
    COLOUR_LIST_XX, TxtNull, NULL, MNUATTRSPARE

};

typedef struct 
{
	 /* administrative data */

    T_MMI_CONTROL	mmi_control;
    T_MFW_HND		win;
    T_MFW_HND		parent_win;
#ifdef NEW_EDITOR
	T_AUI_EDITOR_DATA	editor_data;	/* SPR#1428 - SH - New Editor data */
#else /* NEW_EDITOR */
	T_EDITOR_DATA		editor_data;
#endif /* NEW_EDITOR */

    /* associated handlers */

    T_MFW_HND		kbd;
    T_MFW_HND		kbd_long;
    T_MFW_HND		menu;
	T_MFW_HND		menu_tim;
	UBYTE				status_of_timer; /* use for the keypadlock */

	T_MFW_HND mailbox_win;
	T_MFW_CPHS_ENTRY cphs_voicemail_num;
	T_MFW_CPHS_VC_STAT* cphs_voicemail_status;
	T_MFW_CPHS_STATUS cphs_status;
	T_MFW_CPHS_OP_NAME* operator_name;

}  T_MMI_CPHS_DATA;


typedef struct
{
  T_MMI_CONTROL    mmi_control;
  T_MFW_HND	   numbers_win; 				   /* MFW win handler	   */
  T_MFW_HND	   parent;
  T_MFW_HND	   melody_handler;	   /* MFW sms handler	   */
  unsigned char      local_status;
  ListMenuData	   * menu_list_data;
} T_INFO_NUM_INFO;

#define E_INIT 1



#define CPHS_TELESERVICES_BYTE_VALUE	0x06
#define ALS_MASK						0x80

#define CPHS_INFONUMS_BYTE_VALUE		0xC0
#define INFONUM_MASK					0xFF


/******************************************************************************
									      
			       Static Global variables
									      
*******************************************************************************/

static T_MFW_CPHS_ENTRY cphs_voicemail_num;
static T_MFW_CPHS_INFONUM_ENTRY current_info_num;
static T_MFW_CPHS_VC_NUM cphs_voicemail_numbers;
static T_MFW_CPHS_VC_STAT* cphs_voicemail_status;
static T_MFW_CPHS_STATUS cphs_status = CPHS_NotPresent;
static T_MFW_CPHS_OP_NAME operator_name;
static T_MFW_CPHS_DV_STAT call_forwarding_status;
static T_MFW_CPHS_ALS_STATUS als_status;
static T_MFW_CPHS_CSP customer_service_profile;
static T_MFW_CPHS_INFONUM_LIST* info_numbers[4]= {NULL, NULL, NULL, NULL};

static UBYTE info_num_level;
static USHORT info_num_index;

static T_MENU_TYPE type_of_list = INFO_NUM_LIST;

/******************************************************************************
									      
			       Function Prototypes
									      
*******************************************************************************/
int InfoNumbers2(void); // RAVI

int show_cphs_mb_number(T_MFW_CPHS_ENTRY* mb_number);
static void mailbox_edit_cb( T_MFW_HND win, USHORT Identifier,UBYTE reason);
static int cphs_win_cb (T_MFW_EVENT event, T_MFW_WIN * win);
int cphs_mfw_cb(T_MFW_EVENT event, void* para);
void cphs_dialog_cb(T_MFW_HND win, USHORT e,  SHORT identifier, void *parameter);
T_MFW_HND mmi_cphs_create(T_MFW_HND parent_window);
T_MFW_HND	edit_mailbox_start(T_MFW_HND parent_window);

static T_MFW_HND  buildInfoNumberMenu( MfwHnd parent_window);
void info_num_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
void InfonumList_cb(T_MFW_HND * Parent, ListMenuData * ListData);
static void InfoNum_destroy(MfwHnd own_window);
static int info_num_win_cb (MfwEvt e, MfwWin *w) ;
void info_num_display_cb(T_MFW_HND win, USHORT identifier, UBYTE reason);
EXTERN void  cphs_support_check(void);  // ADDED BY RAVI - 29-11-2005

/******************************************************************************
									      
			       Public functions
									      
*******************************************************************************/
/*******************************************************************************

 $Function:	mmi_cphs_init()

 $Description:	initiatialise cphs module
 
 $Returns:		mfw handle

 $Arguments:	none
		
*******************************************************************************/
T_MFW_HND mmi_cphs_init()
{	
	T_MFW_HND status;
	cphs_init();			//initialise MFW CPHS module

	status = cphs_create(NULL, 0xFFFF, cphs_mfw_cb); //create handler for MFW CPHS EVENTS
	
	info_num_level = 0;
	info_num_index = 1;
	cphs_get_als_info(&als_status);
	return status;
}

void mmi_cphs_refresh()
{	
	cphs_support_check();	//check if cphs supported
	/*retrieval of other values set off by callback function cphs_mfw_cb
	so when the CPHS status is retrieved, the operator name is then requested and 
	when it has returned, then the CSP is requested etc etec  */
		
}
/*******************************************************************************

 $Function:	cphs_E_plus_ALS_supported

 $Description:	returns TRUE if SIM is from E-plus, FALSE otherwise 
 
 $Returns:		status BOOL

 $Arguments:	none
		
*******************************************************************************/
BOOL cphs_E_plus_ALS_supported()
{	char IMSI[17];
	char MNC_MCC[6];
	char E_plus_MNC_MCC[] = "26203";
	int i=0;
	T_ACI_RETURN result;
//	char debug[40];  // RAVI
	
	while ((result = qAT_PlusCIMI(CMD_SRC_LCL, IMSI)) != AT_CMPL  && i < 5)
	{
		i++;
	}
		
	strncpy(MNC_MCC, IMSI, 5);
	MNC_MCC[5] =0;//terminate string
	TRACE_EVENT("E-plus IMSI?");
	TRACE_EVENT(MNC_MCC);
	if (!strncmp(E_plus_MNC_MCC, MNC_MCC, 5)) //if e-plus IMSI
	{	
		return TRUE;

	}
	else
	{	TRACE_EVENT("Not e-plus IMSI");
		return FALSE;
	}

}
/*******************************************************************************

 $Function:	cphs_als_status

 $Description:	display which ALS line is enabled
 
 $Returns:		status int

 $Arguments:	menu, tag (not used)
		
*******************************************************************************/
int cphs_als_status(MfwMnu* m, MfwMnuItem* i)
{	T_MFW_HND		parent	     = mfwParent( mfw_header());
	UBYTE line;
	line = GetAlsLine();
#ifndef CPHS_PROV_TEST
	if (CphsPresent() == TRUE || cphs_E_plus_ALS_supported())
#endif
	{
		if (als_status.selectedLine != MFW_SERV_NotPresent)
			switch(line)
			{
				case (MFW_SERV_LINE1): ShowMessage(parent, TxtLine1, TxtActivated);break;
				case (MFW_SERV_LINE2): ShowMessage(parent, TxtLine2, TxtActivated);break;
				default: ShowMessage(parent, TxtReadError, TxtNull);break;
			}
		else
			ShowMessage(parent, TxtReadError, TxtNull);
	}
#ifndef CPHS_PROV_TEST
	else
		ShowMessage(parent, TxtNotSupported, TxtNull);
#else
		cphs_support_check();
#endif

	return MFW_EVENT_CONSUMED;
}

/*******************************************************************************

 $Function:	       cphs_lock_als

 $Description:	       Lock ALS Line Selection from menu 
 
 $Returns:		status int

 $Arguments:	       menu, tag (not used)
		
*******************************************************************************/
int cphs_lock_als(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND		parent	     = mfwParent( mfw_header());
	T_MFW			retVal;

	TRACE_FUNCTION("cphs_lock_als");

#ifndef CPHS_PROV_TEST
	if (!ALSPresent(NULL, NULL, NULL))
#endif
	{
		//xvilliva SPR17291 
		//We call sAT_PlusCLCK(), to update the value in FFS. This is the value used by
		//ACI to estabilish a call on Line1 or Line2.
#ifndef FF_2TO1_PS 
		sAT_PlusCLCK(CMD_SRC_LCL,CLCK_FAC_Al,CLCK_MOD_Lock,g_pin2,
				((als_status.selectedLine == MFW_SERV_LINE1) ? CLASS_Vce : CLASS_AuxVce));//
#endif
		retVal = cphs_set_als_status(MFW_LINE_LOCKED);
		if (retVal == CPHS_OK)
		{
			als_status.status = MFW_LINE_LOCKED;
			ShowMessage(parent, TxtAlsLocked, TxtNull);
		}
	}
#ifndef CPHS_PROV_TEST
	else
		ShowMessage(parent, TxtNotSupported, TxtNull);
#endif

	return MFW_EVENT_CONSUMED;
}

/*******************************************************************************

 $Function:	       cphs_unlock_als

 $Description:	       Unlock ALS Line Selection from menu 
 
 $Returns:		status int

 $Arguments:	       menu, tag (not used)
		
*******************************************************************************/
int cphs_unlock_als(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND		parent	     = mfwParent( mfw_header());
	T_MFW			retVal;

	TRACE_FUNCTION("cphs_unlock_als");

#ifndef CPHS_PROV_TEST
	if (!ALSPresent(NULL, NULL, NULL))
#endif
	{
		//xvilliva SPR17291
		//We call sAT_PlusCLCK(), to update the value in FFS. This is the value used by
		//ACI to estabilish a call on Line1 or Line2. 
#ifndef FF_2TO1_PS
		sAT_PlusCLCK(CMD_SRC_LCL,CLCK_FAC_Al,CLCK_MOD_Unlock,g_pin2,((als_status.selectedLine == MFW_SERV_LINE1) ? CLASS_Vce : CLASS_AuxVce));//
#endif
		retVal = cphs_set_als_status(MFW_LINE_UNLOCKED);
		if (retVal == CPHS_OK)
		{
			als_status.status = MFW_LINE_UNLOCKED;
			ShowMessage(parent, TxtAlsUnlocked, TxtNull);
		}
	}
#ifndef CPHS_PROV_TEST
	else
		ShowMessage(parent, TxtNotSupported, TxtNull);
#endif

	return MFW_EVENT_CONSUMED;
}

/*******************************************************************************

 $Function:	cphs_line1_select

 $Description:	Enable ALS Line1 from menu 
 
 $Returns:		status int

 $Arguments:	menu, tag (not used)
		
*******************************************************************************/
int cphs_line1_select(MfwMnu* m, MfwMnuItem* i)
{	
	T_MFW_HND		parent	     = mfwParent( mfw_header());
#ifndef CPHS_PROV_TEST
	if (!ALSPresent(NULL, NULL, NULL))
#endif
	{	cphs_select_line(MFW_SERV_LINE1);
		cphs_get_divert_status();
	}
#ifndef CPHS_PROV_TEST
	else
		ShowMessage(parent, TxtNotSupported, TxtNull);
#endif
	return MFW_EVENT_CONSUMED;
}
/*******************************************************************************

 $Function:	cphs_line2_select

 $Description:	Enable ALS Line2 from menu 
 
 $Returns:		status int

 $Arguments:	menu, tag (not used)
		
*******************************************************************************/
int cphs_line2_select(MfwMnu* m, MfwMnuItem* i)
{	T_MFW_HND		parent	     = mfwParent( mfw_header());

#ifndef CPHS_PROV_TEST
	if (!ALSPresent(NULL, NULL, NULL))
#endif
	{	cphs_select_line(MFW_SERV_LINE2);
		cphs_get_divert_status();
	}
#ifndef CPHS_PROV_TEST
	else
		ShowMessage(parent, TxtNotSupported, TxtNull);
#endif
	return MFW_EVENT_CONSUMED;
}
/*******************************************************************************

 $Function:	menu_cphs_call_mailbox_number

 $Description:	edit mailbox numbers from menu 
 
 $Returns:		status int

 $Arguments:	menu, tag (not used)
		
*******************************************************************************/
int menu_cphs_call_mailbox_number(MfwMnu* m, MfwMnuItem* i)
{   T_MFW_HND		parent	     = mfwParent( mfw_header());
	T_MFW_CPHS_INFO configuration;
	type_of_list = MAILBOX_LIST_CALL;
	cphs_config(&configuration);
	/***************************Go-lite Optimization changes Start***********************/
	//Aug 16, 2004    REF: CRR 24323   Deepa M.D
	TRACE_EVENT_P2( "CPHS? %d Mailbox config info: %d", configuration.mbNum, CphsPresent());
	/***************************Go-lite Optimization changes end***********************/
	if (CphsMailboxPresent()==TRUE )
		cphs_get_mailbox();
	else
		M_callVoice(m, i);
    return MFW_EVENT_CONSUMED;		
}
/*******************************************************************************

 $Function:	menu_cphs_edit_mailbox_number

 $Description:	edit mailbox numbers from menu 
 
 $Returns:		status int

 $Arguments:	menu, tag (not used)
		
*******************************************************************************/
int menu_cphs_edit_mailbox_number(MfwMnu* m, MfwMnuItem* i)
{   T_MFW_HND		parent	     = mfwParent( mfw_header());
	T_MFW_CPHS_INFO configuration;
	
	type_of_list = MAILBOX_LIST;
	
	cphs_config(&configuration);
	/***************************Go-lite Optimization changes Start***********************/
	//Aug 16, 2004    REF: CRR 24323   Deepa M.D
	TRACE_EVENT_P2( "CPHS? %d Mailbox config info: %d", configuration.mbNum, CphsPresent());
	/***************************Go-lite Optimization changes end***********************/
	if (CphsMailboxPresent()==TRUE )
		cphs_get_mailbox();
	else
		M_exeVoice(m, i);
    return MFW_EVENT_CONSUMED;		
}
/*******************************************************************************

 $Function:	InfoNumbers

 $Description:	displays information number list from CPHS 

 $Returns:		MFW_EVENT_CONSUMED always

 $Arguments:	m, menu, i, item
 
*******************************************************************************/

int InfoNumbers( MfwMnu *m, MfwMnuItem *i )
{
	T_MFW_HND win;
    T_MFW_HND parent_win = mfw_parent(mfw_header());
	T_MFW_CPHS_INFO config_info;
	
	cphs_config(&config_info);
	/***************************Go-lite Optimization changes Start***********************/
//Aug 16, 2004    REF: CRR 24323   Deepa M.D
	TRACE_EVENT_P1("Info Num config info: %d", config_info.iNum);
	/***************************Go-lite Optimization changes end***********************/
	if (CphsPresent() && config_info.iNum&0x03)
	{	if (info_numbers[0] != NULL&& info_numbers[0]->count != 0)
		{	type_of_list = INFO_NUM_LIST;
			info_num_level = 1;
			win = buildInfoNumberMenu(parent_win);
			
			if (win NEQ NULL)
			{
				SEND_EVENT (win, E_INIT, 0, 0);
			}
		}
		else
			ShowMessage(parent_win, TxtEmptyList, TxtNull);
	}
	else
		ShowMessage(parent_win, TxtNotSupported, TxtNull);
	
	return MFW_EVENT_CONSUMED;
}


/*******************************************************************************

 $Function:	CphsRequestOperatorName()

 $Description:	returns operator name data structure from CPHS SIM data

 $Returns:		see above

 $Arguments:	none
 
*******************************************************************************/
T_MFW_CPHS_OP_NAME* CphsRequestOperatorName()
{	
	return &operator_name;
}

/*******************************************************************************

 $Function:	CphsPresent()

 $Description:	indicates whether CPHS sim or not

 $Returns:		TRUE if it is, FALSe if it isn't
 $Arguments:	none
 
*******************************************************************************/
UBYTE CphsPresent()
{

	if (cphs_status == CPHS_OK)
		return TRUE;
	else
	 {	 if (cphs_status == CPHS_NotPresent)
			return FALSE;
		else /*MC 21/05/02, CONQ5999->6007 Helps diagnose initialisation probs*/
			return CPHS_ERR;
	}
}
/*******************************************************************************

 $Function:	CphsMailboxPresent

 $Description:	indicates whether a CPHS SIM which supports mailbox numbers

 $Returns:		TRUE if it is, FALSe if it isn't
 $Arguments:	none
 
*******************************************************************************/
USHORT CphsMailboxPresent( /*struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi*/ )
{	T_MFW_CPHS_INFO config_info;

	cphs_config(&config_info);

	if (config_info.mbNum &0x03 && CphsPresent())
		return /*0*/TRUE;
	else
		return /*1*/FALSE;

}
/*******************************************************************************

 $Function:	ALSPresent

 $Description:	indicates whether a CPHS SIM supports ALS by checking CSP

 $Returns:		0 if it does, 1 if it doesn't
 $Arguments:	menu tag, menu attribute tag, menu item tag (none of them used, 
				this is merely the format for menu display/suppression functions)
 
*******************************************************************************/
USHORT ALSPresent( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{ 
	//xvilliva SPR17291 - The pre-existing code was returning ALS not supported 
	//		      even if it the SIM supported. Changed the code to call 
	//		      tAT_PercentALS() and qAT_PercentALS(). 		

	T_ACI_RETURN ACI_return = AT_FAIL ;
	T_ACI_ALS_MOD ALSmode = (T_ACI_ALS_MOD)0;  // RAVI

	ACI_return = tAT_PercentALS( CMD_SRC_NONE, &ALSmode );
	ACI_return = qAT_PercentALS( CMD_SRC_NONE, &ALSmode );

	// ALSmode = 1;//xvilliva  SPR17291 - IMP: Hardcoded for our SIMS - got to test on ALS sim.

	return   (!ALSmode);//returns 0 (if line1 or line2) returns 1 if not supported.
}
/*******************************************************************************

 $Function:	       CphsALSUnlocked

 $Description:	       Indicates whether a CPHS SIM's support of ALS has been locked by the User

 $Returns:		0 if it hasn't, 1 if it has
 $Arguments:	       menu tag, menu attribute tag, menu item tag (none of them used, 
				this is merely the format for menu display/suppression functions)
 
*******************************************************************************/
USHORT CphsALSUnlocked( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{
	USHORT retVal = CphsALSLocked(m, ma, mi);

	if (retVal == 0)
		retVal = 1;
	else
		retVal = 0;
	
	return (retVal);
}
/*******************************************************************************

 $Function:	       CphsALSUnlocked

 $Description:	       Indicates whether a CPHS SIM's support of ALS has been locked by the User

 $Returns:		0 if it has, 1 if it hasn't
 $Arguments:	       menu tag, menu attribute tag, menu item tag (none of them used, 
				this is merely the format for menu display/suppression functions)
 
*******************************************************************************/
USHORT CphsALSLocked( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{
	USHORT retVal;
	
	if (als_status.status == MFW_LINE_LOCKED)
		retVal = 0;
	else
		retVal = 1;
	
	return (retVal);
}
/*******************************************************************************

 $Function:	InfoNumbersPresent

 $Description:	indicates whether a CPHS SIM has Info Numbers by checking CSP

 $Returns:		0 if it does, 1 if it doesn't
 $Arguments:	none
 
*******************************************************************************/
USHORT InfoNumbersPresent( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{	T_MFW_CPHS_INFO config_info;
	
	int i;
	cphs_config(&config_info);
	/***************************Go-lite Optimization changes Start***********************/
	//Aug 16, 2004    REF: CRR 24323   Deepa M.D
	TRACE_EVENT_P1("InfoNum config: %d", config_info.iNum);
	/***************************Go-lite Optimization changes end***********************/
	for(i=0; i< strlen((char*)customer_service_profile.csp); i+=2)	
	{
		if (customer_service_profile.csp[i] ==CPHS_INFONUMS_BYTE_VALUE)
			if (customer_service_profile.csp[(i+1)] & INFONUM_MASK)
				return 0; //ALS is supported
	}
	return 1;
}
/*******************************************************************************

 $Function:	GetCphsVoicemailStatus

 $Description:	Asks MFW to check voicemail status on CPHS SIM
				cphs_mfw_cb handles callback from this
 $Returns:		status of line passed as parameter
 $Arguments:	line
 
*******************************************************************************/
T_MFW_CFLAG_STATUS GetCphsVoicemailStatus(UBYTE line)
{	
	cphs_get_mailbox_status (); 
	TRACE_EVENT("Requesting voicemail status");
	
	/*SPR 2653, removed unneccessary code*/
	/*requesting the mailbox status will trigger an event from the MFW if
	CPHS is supported and that event will cause a voicemail indication window if a 
	voicemail flag has been set in the SIM*/
		return MFW_CFLAG_NotPresent;


}
/*******************************************************************************

 $Function:	GetCphsDivertStatus

 $Description:	get call forwarding status of specified line
				cphs_mfw_cb handles callback from this
 $Returns:		status of line passed as parameter
 $Arguments:	line
 
*******************************************************************************/

T_MFW_CFLAG_STATUS GetCphsDivertStatus(UBYTE line)
{	
	switch (line)
	{
		case MFW_SERV_LINE1:	return call_forwarding_status.line1; //break;  // RAVI
		case MFW_SERV_LINE2:		return call_forwarding_status.line2; // break; // RAVI
		case MFW_SERV_FAX:		return call_forwarding_status.fax; // break; // RAVI
		case MFW_SERV_DATA:		return call_forwarding_status.data; // break; // RAVI
		default:		return MFW_CFLAG_NotPresent;
	}
}
/*******************************************************************************

 $Function:	GetAlsLine
 $Description:	gets current als line
 $Returns:		current als line
 $Arguments:	line
 
*******************************************************************************/
UBYTE GetAlsLine()
{	
	return als_status.selectedLine;
}

/*******************************************************************************

 $Function:	ShowMessage
 $Description:	Displays screen with passed text ids
 $Returns:		nothing
 $Arguments:	parent window, 2 text ids
 
*******************************************************************************/
void ShowMessage(T_MFW_HND win, USHORT TextId1, USHORT TextId2)
{

	T_DISPLAY_DATA Dialog;

	/* Initialise the dialog control block with default information
	*/
	dlg_initDisplayData_TextId( &Dialog, TxtNull,  TxtNull, TextId1, TextId2 , COLOUR_STATUS);
	dlg_initDisplayData_events( &Dialog, NULL, THREE_SECS, KEY_LEFT| KEY_RIGHT|KEY_CLEAR );

	/* Show the dialog
	*/
	info_dialog( win, &Dialog );
}



/******************************************************************************
									      
			     Private functions
									      
*******************************************************************************/

T_MFW_HND	edit_mailbox_start(T_MFW_HND parent_window)
{
		T_MFW_HND		win	      = mmi_cphs_create(parent_window);
		TRACE_FUNCTION("calc_start()");
	    if (win NEQ NULL)
		{
		SEND_EVENT(win, MAILBOX, NULL, NULL);
	       
		} 

	   return win;
} 





T_MFW_HND mmi_cphs_create(T_MFW_HND parent)
{	T_MMI_CPHS_DATA     * data = (T_MMI_CPHS_DATA *)ALLOC_MEMORY (sizeof (T_MMI_CPHS_DATA ));
	T_MFW_WIN  * mailbox_win;

	if (data EQ NULL)
	{
		return NULL;
	}

	// Create window handler
	data->mailbox_win = win_create (parent, 0, E_WIN_VISIBLE, (MfwCb)cphs_win_cb);
	if (data->mailbox_win EQ NULL)
	{
		
		return NULL;
	}
	// connect the dialog data to the MFW-window
	data->mmi_control.dialog = (T_DIALOG_FUNC)cphs_dialog_cb;
	data->mmi_control.data	 = data;
	mailbox_win			 = ((T_MFW_HDR *)data->mailbox_win)->data;
	mailbox_win->user		 = (void *)data;
	data->parent_win	 = parent;
	data->win = mailbox_win;
	return data->mailbox_win;

}

void mailbox_destroy(MfwHnd own_window)
{
  T_MFW_WIN * win_data;
  T_MMI_CPHS_DATA   * data = NULL; 

  if (own_window)
	{	

	win_data = ((T_MFW_HDR *)own_window)->data;
		if (win_data != NULL) //PATCH TB
			data = (T_MMI_CPHS_DATA *)win_data->user;

	  if (data)
		{
		TRACE_EVENT ("mailbox_destroy()");
			
			win_delete (data->win);
		  // Free Memory
			FREE_MEMORY ((void *)data, sizeof (T_MMI_CPHS_DATA));
	
		}
	  else
		{
			TRACE_EVENT ("mailbox_destroy() called twice");
		}
	}
}

void cphs_dialog_cb(T_MFW_HND win, USHORT e,  SHORT identifier, void *parameter)
{	TRACE_EVENT("cphs_dialog_cb()");
	switch(e)
	{	case (MAILBOX): 
			cphs_get_mailbox();break;
		default: break;
	}
}

static int cphs_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
{
    T_MMI_CPHS_DATA	* data = (T_MMI_CPHS_DATA *)win->user;
	
    TRACE_FUNCTION ("cphs_win_cb()");

    if(data EQ 0)
	return 1;
    switch (event)
    {
	case E_WIN_VISIBLE:
		if (win->flags & E_WIN_VISIBLE)
		{
		    /* Print the information dialog */
		    /* Clear Screen */
		    dspl_ClearAll();
		}
	   default:
		return 0;
	}
    return 1;
}
/*******************************************************************************

 $Function:	show_cphs_mb_numbers
 $Description:	Show the list of mailbox numbers
 $Returns:		nothing
 $Arguments:	none
 
*******************************************************************************/
void show_cphs_mb_numbers()
{
	T_MFW_HND win;
    T_MFW_HND parent_win= mfw_parent(mfw_header());

	{
		win = buildInfoNumberMenu(parent_win);

		if (win NEQ NULL)
		{
			SEND_EVENT (win, E_INIT, 0, 0);
		}
	}
}

/*******************************************************************************

 $Function:	show_cphs_mb_number
 $Description:	Show the passed mailbox number in editor
 $Returns:		status int
 $Arguments:	mailbox number entry
 
*******************************************************************************/

int show_cphs_mb_number(T_MFW_CPHS_ENTRY* mb_number)
{	T_MFW_HND parent_win = mfw_parent(mfw_header());
#ifdef NEW_EDITOR
	T_AUI_EDITOR_DATA	editor_data;	/* SPR#1428 - SH - New Editor data*/
#else
	T_EDITOR_DATA		editor_data;
#endif
	char temp_number[PHB_MAX_LEN];

	memset(temp_number, 0, PHB_MAX_LEN);

	//if it's an international number without a '+' 
	if (mb_number->ton == MFW_TON_INTERNATIONAL && mb_number->number[0] != '+')
	{	strcat(temp_number, "+");	//put a + in front of number
		strcat(temp_number, (char*)mb_number->number);
		strcpy((char*)mb_number->number, temp_number);
	}

/* SPR#1428 - SH - New Editor changes */

#ifdef NEW_EDITOR
	AUI_edit_SetDefault(&editor_data);
	AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE *)mb_number->number, PHB_MAX_LEN-1);
	AUI_edit_SetMode(&editor_data, 0, ED_CURSOR_UNDERLINE);
	AUI_edit_SetDisplay(&editor_data, 0, COLOUR_EDITOR, EDITOR_FONT);
	AUI_edit_SetEvents(&editor_data, 0, TRUE, FOREVER, (T_AUI_EDIT_CB)mailbox_edit_cb);
	AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtNull, NULL);

	AUI_edit_Start(parent_win, &editor_data);
#else /* NEW_EDITOR */
	editor_attr_init(&editor_data.editor_attr, 0, edtCurBar1, NULL, (char*)mb_number->number, PHB_MAX_LEN-1, COLOUR_EDITOR);
	editor_data_init(&editor_data, (T_EDIT_CB)mailbox_edit_cb, TxtSoftOK, TxtDelete, NULL, 1, DIGITS_MODE, FOREVER);
	editor_data.Identifier		=  0; 
	editor_data.hide				= FALSE;
	editor_data.destroyEditor		= TRUE; 
	editor_data.TextString		= NULL; /*MC SPR 1257, stops glitch in Chinese*/ 


	editor_start(parent_win,&editor_data);	/* start the editor */ 
#endif /* NEW_EDITOR */
// ADDED BY RAVI - 29-11-2005
#if (BOARD == 61)
	return 1; 
#endif
// END RAVI
}

/*******************************************************************************

 $Function:	mailbox_edit_cb
 $Description:	callback for mailbox editor screen
 $Returns:		nothing
 $Arguments:	window, identifier, reason
 
*******************************************************************************/
static void mailbox_edit_cb( T_MFW_HND win, USHORT Identifier,UBYTE reason)
{

	TRACE_FUNCTION("mailbox_edit_cb()");
	switch (reason )
    {
	case INFO_KCD_LEFT:
	{	
		TRACE_EVENT((char*)cphs_voicemail_num.number);
		cphs_set_mailbox(&cphs_voicemail_num);
		
		}

		break;
		
	default:
	{
	    /* otherwise no action to be performed
	    */
		    break;
	}
	}
}
/*******************************************************************************

 $Function:	cphs_mfw_cb
 $Description:	Callback handler for mfw_cphs events
 $Returns:		status int
 $Arguments:	event, parameter pointer
 
*******************************************************************************/
int cphs_mfw_cb(T_MFW_EVENT event, void* para)
{	T_MFW_HND parent = mfwParent( mfw_header());
	
//   T_MFW_CPHS_VC_NUM* number_list =(T_MFW_CPHS_VC_NUM* )para;  // RAVI

//	T_MFW_CPHS_PARA* parameter = (T_MFW_CPHS_PARA*)para;  // RAVI
//	T_MFW_CPHS_STATUS temp;  // RAVI
	switch(event)
	{	case E_CPHS_IND: 
			TRACE_EVENT("Getting cphs status");
			if(para != NULL)
			{	cphs_status =(* (T_MFW_CPHS_STATUS*)para);
				if (cphs_status != CPHS_OK)
				{
					/***************************Go-lite Optimization changes Start***********************/
					//Aug 16, 2004    REF: CRR 24323   Deepa M.D	
					TRACE_EVENT_P1("cphs not supported, apparently%d", cphs_status);
					/***************************Go-lite Optimization changes end***********************/
				}
				cphs_operator_name();
			}
			break;	      
		case E_CPHS_OP_NAME:	
			if(para != NULL)
			{	
				memcpy(&operator_name, para, sizeof(T_MFW_CPHS_OP_NAME));
				TRACE_EVENT("operator name callback");
				
									     
			if (operator_name.longName.data[0] == NULL)
				TRACE_EVENT("Blank long name");

			if (operator_name.shortName.data[0] == NULL)
				TRACE_EVENT("Blank short name");

			cphs_get_csp();
			}
			 break;   
		case E_CPHS_GET_VC_NUM:
		{	
			if (para!= NULL)
			{	memcpy(&cphs_voicemail_numbers, para, sizeof(T_MFW_CPHS_VC_NUM));
			/***************************Go-lite Optimization changes Start***********************/
			//Aug 16, 2004    REF: CRR 24323   Deepa M.D
			TRACE_EVENT_P1("Voicemail No %s", cphs_voicemail_numbers.entries[0].number);
			/***************************Go-lite Optimization changes end***********************/
				show_cphs_mb_numbers();
			}
			
		}
		break;
		 case E_CPHS_SET_VC_NUM:   
		{		//result of writing mailbox number
			UBYTE write_result;
			if(para != NULL)
			{	write_result = *(UBYTE*)para;
				if (write_result == MFW_SIMOP_WRITE_OK)
					ShowMessage(parent, TxtSaved, TxtNull);
				else
					ShowMessage(parent, TxtWriteError, TxtNull);//display "Write Error"
			}
		 }
		 break;
			 case E_CPHS_GET_VC_STAT:  
			 {	
				MfwHnd	idle_win =idle_get_window();
				// UBYTE line;  // RAVI
				if(para != NULL)
				{	cphs_voicemail_status = (T_MFW_CPHS_VC_STAT*)para;

					TRACE_EVENT("Getting voicemail status");
					if (cphs_voicemail_status->line1 == MFW_CFLAG_SET)
					{
    					       ShowMessage(idle_win, TxtVoicemail, TxtLine1);

    					       /* SPR#1929 - DS - Set voicemail icon on idle screen. Port of 1960 */
    					       iconsSetState(iconIdVoice);
    				      }

				
					if (cphs_voicemail_status->line2 == MFW_CFLAG_SET)
					{	
						ShowMessage(idle_win, TxtVoicemail, TxtLine2);

						/* SPR#1929 - DS - Set voicemail icon on idle screen. Port of 1960 */
    					      iconsSetState(iconIdVoice);
					}

					 /* SPR#1929 - DS - Remove voicemail icon from idle screen if 
                                  * there is no voicemail waiting on either line1/line2. Port of 1960.
                                  */
					if ( (cphs_voicemail_status->line1 != MFW_CFLAG_SET) && 
					     (cphs_voicemail_status->line2 != MFW_CFLAG_SET) )
    				      {
    				            iconsDeleteState(iconIdVoice);
    				      }

				}

			 }
			 break;
			case E_CPHS_SET_VC_STAT:  
		 
			{		//result of resetting mailbox status
				// UBYTE write_result;  // RAVI

				TRACE_EVENT("Mailbox status set");
				//Update our copy of the mailbox status
				GetCphsVoicemailStatus(0);
			}
			break;
			 case E_CPHS_GET_DV_STAT:
			 {	
				TRACE_EVENT("Getting divert status");
				if(para != NULL)
					memcpy(&call_forwarding_status, para, sizeof(T_MFW_CPHS_DV_STAT));
				{UBYTE line;
				//check for divert on active line
					line = GetAlsLine();
					//check if current outgoing line diverted
					if (line == MFW_SERV_LINE2)
						DivertStatus = GetCphsDivertStatus(MFW_SERV_LINE2);
					else//if (line == MFW_SERV_LINE1)
						DivertStatus = GetCphsDivertStatus(MFW_SERV_LINE1);

					//set the call forwarding icon 
					if (DivertStatus == MFW_CFLAG_SET)
					{
						iconsSetState(iconIdCallFor);
//  Jun 23, 2004        REF: CRR MMI-SPR-13599  Rashmi C N(Sasken) 
//              Setting the Current state of CF in Flash						
						FFS_flashData.CFState=TRUE;
					}
					//gid rid of call forwarding icon 
					if (DivertStatus == MFW_CFLAG_NOTSet)
					{
						iconsDeleteState(iconIdCallFor); 
//  Jun 23, 2004        REF: CRR MMI-SPR-13599  Rashmi C N(Sasken) 
//              Setting the Current state of CF in Flash						
						FFS_flashData.CFState=FALSE;
					}
//  Jun 23, 2004        REF: CRR MMI-SPR-13599  Rashmi C N(Sasken) 
//              Writng the Current state of CF into ffs						
			flash_write();
					
				}
			 }break; 
			 case E_CPHS_SET_DV_STAT:    
			 {		//result of setting divert status
				// UBYTE write_result;  // RAVI

					TRACE_EVENT("Divert status set");
					cphs_get_divert_status(); //refresh divert status

			 }
			 break;
			 case E_CPHS_GET_ALS_STATUS:  
				{	if(para != NULL)
						memcpy(&als_status, para, sizeof(T_MFW_CPHS_ALS_STATUS));
				}
				break;
			 case E_CPHS_SET_LINE: 
			 {		//result of set ALS line
				UBYTE write_result;
				if(para != NULL)
				{	write_result = *(UBYTE*)para;
					if (write_result == MFW_SIMOP_WRITE_OK)
						ShowMessage(parent, TxtChanged, TxtNull);
					if (write_result == MFW_SIMOP_WRITE_ERR)
						ShowMessage(parent, TxtWriteError, TxtNull);//display "Write Error"
				}
				cphs_get_als_info(&als_status);//refresh current line
				cphs_get_divert_status(); //refresh divert status
			 }
			 break;
			 case E_CPHS_SET_ALS_STATUS: 
			 {		//result of setting ALS status
				UBYTE write_result;
				if(para != NULL)
				{	write_result = *(UBYTE*)para;
					if (write_result == MFW_SIMOP_WRITE_OK)
						ShowMessage(parent, TxtSaved, TxtNull);
					if (write_result == MFW_SIMOP_WRITE_ERR)
						ShowMessage(parent, TxtWriteError, TxtNull);//display "Write Error"
				}
			 }
			 break;
			 case E_CPHS_GET_CSP:	
			 { if(para != NULL)
				{	memcpy(&customer_service_profile, para, sizeof(T_MFW_CPHS_CSP));
			 /***************************Go-lite Optimization changes Start***********************/
			 //Aug 16, 2004    REF: CRR 24323   Deepa M.D
			 TRACE_EVENT_P7("CSP: %x,%x,%x,%x,%x,%x,%x", customer_service_profile.csp[0], customer_service_profile.csp[1], 
				 customer_service_profile.csp[2], customer_service_profile.csp[3], customer_service_profile.csp[4], customer_service_profile.csp[5],
				 customer_service_profile.csp[6]);
			 TRACE_EVENT_P3("%x,%x,%x", customer_service_profile.csp[7], customer_service_profile.csp[8], customer_service_profile.csp[9]);
			 TRACE_EVENT_P7("CSP: %x,%x,%x,%x,%x,%x,%x", customer_service_profile.csp[10], customer_service_profile.csp[11], 
				 customer_service_profile.csp[12], customer_service_profile.csp[13], customer_service_profile.csp[14], customer_service_profile.csp[15],
				 customer_service_profile.csp[16]);
			 TRACE_EVENT_P3("%x,%x,%x", customer_service_profile.csp[17], customer_service_profile.csp[18], customer_service_profile.csp[19]);
			 /***************************Go-lite Optimization changes end***********************/
					cphs_get_info_num(1, info_num_index);
				}

			 }break;  
			 case E_CPHS_GET_INFO_NUM:
			 {	
				if(para != NULL)
				{	
					memcpy(&current_info_num, para, sizeof( T_MFW_CPHS_INFONUM_ENTRY));

					TRACE_EVENT("Getting info number");
					if (current_info_num.result !=MFW_SIMOP_READ_ERR)
						{	T_DISPLAY_DATA Dialog;
							TRACE_EVENT("Displaying num");
							/* Initialise the dialog control block with default information
							*/
							dlg_initDisplayData_TextStr( &Dialog, TxtSoftCall,  TxtSoftBack, (char*)current_info_num.alpha.data, (char*)current_info_num.number, COLOUR_STATUS);
							dlg_initDisplayData_events( &Dialog, (T_VOID_FUNC) info_num_display_cb, FOREVER, KEY_LEFT| KEY_RIGHT|KEY_CLEAR );

							/* Show the dialog
							*/
							info_dialog( parent, &Dialog );
						}
					}
				 }
			 
			 break; 
			 case E_CPHS_GET_INFO_LIST:
				{ 
					if (para == NULL)
					{	
						TRACE_EVENT("Invalid info num list");
					}
					else
					{	//populate next pointer 
					       //RAVI - 29-11-2005 
						if ((info_numbers[info_num_level] = (T_MFW_CPHS_INFONUM_LIST*) ALLOC_MEMORY(sizeof(T_MFW_CPHS_INFONUM_LIST))))
							memcpy(info_numbers[info_num_level], para, sizeof(T_MFW_CPHS_INFONUM_LIST));

						
							TRACE_EVENT("Getting info numbers!!");
							if (info_numbers[info_num_level]->count != 0)
							{
								/***************************Go-lite Optimization changes Start***********************/
								//Aug 16, 2004    REF: CRR 24323   Deepa M.D
								TRACE_EVENT_P1("Valid info num list, count:%d",info_numbers[info_num_level]->count);
								/***************************Go-lite Optimization changes end***********************/
								if (info_num_level)
								{	info_num_level++;
									InfoNumbers2();
									
								}
							}
							else
								info_numbers[info_num_level]=NULL;
					}
				}
			 break;
			 case E_CPHS_GET_SIM_FIELD:
				{	T_MFW_CPHS_READ_SIM_ENTRY temp;

					memcpy(&temp, para, sizeof(T_MFW_CPHS_READ_SIM_ENTRY));
					if (temp.data_len >0)
						//Jun 14, 2005 REF: MMI-FIX-30439 x0018858
						//begin 30439
						//temp.exchange_data[temp.data_len-1] = 0;
						//end 30439
					/***************************Go-lite Optimization changes Start***********************/
					//Aug 16, 2004    REF: CRR 24323   Deepa M.D
					TRACE_EVENT_P3("Sim Read, Field: %d (Record: %d) Errcode: %d",temp.requested_field, temp.record, temp.sim_result);
					/***************************Go-lite Optimization changes end***********************/
					/* SPR759 - SH - Read Sim for homezone, calls appropriate functions */
					#ifdef MMI_HOMEZONE_ENABLED	
						if (temp.requested_field>=HZ_SIM_PARAMETERS
							&& temp.requested_field < (HZ_SIM_CELL_CACHE+HZ_ZONES_MAX) )
						{
							homezoneReadSimCb(temp.requested_field, temp.record, temp.sim_result);
						}
					#endif
				}
			 break;

			  case E_CPHS_SET_SIM_FIELD:
				{
				T_MFW_CPHS_READ_SIM_ENTRY temp;

					memcpy(&temp, para, sizeof(T_MFW_CPHS_READ_SIM_ENTRY));
					if (temp.data_len >0)
						temp.exchange_data[temp.data_len-1] = 0;
					/***************************Go-lite Optimization changes Start***********************/
					//Aug 16, 2004    REF: CRR 24323   Deepa M.D
					TRACE_EVENT_P2("Sim Write, Requested_field: %d Errcode: %d",temp.requested_field, temp.sim_result);
					/***************************Go-lite Optimization changes end***********************/
					/* SPR759 - SH - Read Sim for homezone, calls appropriate functions */
					#ifdef MMI_HOMEZONE_ENABLED
						if (temp.requested_field>=HZ_SIM_PARAMETERS
							&& temp.requested_field < (HZ_SIM_CELL_CACHE+HZ_ZONES_MAX) )
						{
							homezoneWriteSimCb(temp.requested_field, temp.record, temp.sim_result);
						}
					#endif
				}
				break;
				
			 default: break;
				}
	

	return TRUE;
}








/*******************************************************************************

 $Function:	int InfoNumbers2( )
 $Description:	Displays info number sub-menus
 $Returns:		status int
 $Arguments:	nothing
 
*******************************************************************************/
//for sub-menus
int InfoNumbers2( )
{
	T_MFW_HND win;
    T_MFW_HND parent_win = mfw_parent(mfw_header());
    
	TRACE_FUNCTION("InfoNumbers2");
	
	if (info_numbers != NULL)
	{	type_of_list = INFO_NUM_LIST;
		win = buildInfoNumberMenu(parent_win);

		if (win NEQ NULL)
		{
			SEND_EVENT (win, E_INIT, 0, 0);
		}
	}
	
	return MFW_EVENT_CONSUMED;
}
/*******************************************************************************

 $Function:	buildInfoNumberMenu
 $Description:	Creates window for Information numbers
 $Returns:		window created
 $Arguments:	parent window
 
*******************************************************************************/
static T_MFW_HND  buildInfoNumberMenu( MfwHnd parent_window)
{
	T_INFO_NUM_INFO *  data = (T_INFO_NUM_INFO *)ALLOC_MEMORY (sizeof (T_INFO_NUM_INFO));
	T_MFW_WIN  * win;
	

    /*
     * Create window handler
     */

    data->numbers_win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)info_num_win_cb);
    if (data->numbers_win EQ NULL)
	{
	   return NULL;
	}

	TRACE_EVENT(">>>> Info num window created: " );
    /* 
     * connect the dialog data to the MFW-window
     */

    data->mmi_control.dialog = (T_DIALOG_FUNC)info_num_exec_cb;
    data->mmi_control.data   = data;
    win 		     = ((T_MFW_HDR *)data->numbers_win)->data;
    win->user		     = (void *)data;
    data->parent	     = parent_window;
	winShow(data->numbers_win);
    /*
     * return window handle
     */

     return data->numbers_win;
}

/*******************************************************************************

 $Function:	info_num_display_cb

 $Description:	Dialogue callback function of the information Numbers display window
 
 $Returns:		none

 $Arguments:	win - window handler, dialogue id, key pressed
				
 
*******************************************************************************/

void info_num_display_cb(T_MFW_HND win, USHORT identifier, UBYTE reason)
{

   // char buf [40];  // RAVI
    
	TRACE_FUNCTION ("info_num_display_cb");

      switch (reason) 
      {
	case INFO_KCD_LEFT: callNumber((UBYTE*)current_info_num.number);
	default: break;  // RAVI - Deafault corrected to default.
	
      }
}
/*******************************************************************************

 $Function:	info_num_exec_cb

 $Description:	Exec callback function of the information Numbers window
 
 $Returns:		none

 $Arguments:	win - window handler
				event - mfw event
				parameter - optional data.
 
*******************************************************************************/
void info_num_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
    T_MFW_WIN	   * win_data = ((T_MFW_HDR *) win)->data;
    T_INFO_NUM_INFO   * data = (T_INFO_NUM_INFO *)win_data->user;
	UBYTE i;
	UBYTE numberOfEntries;
//	ListWinInfo	 * mnu_data = (ListWinInfo *)parameter;   // RAVI
	char* Mailboxes[4];

	Mailboxes[0] = MmiRsrcGetText(TxtLine1);
	Mailboxes[1] =MmiRsrcGetText(TxtLine2);
	Mailboxes[2] = MmiRsrcGetText(TxtFax);
	Mailboxes[3] = MmiRsrcGetText(TxtData);
    TRACE_FUNCTION (">>>>> info_num_exec_cb()");
	
    switch (event)
	{
	case E_INIT:

		TRACE_EVENT(">>>> info_num_exec_cb() Event:E_INIT");

		 /* initialization of administrative data */


		data->menu_list_data = (ListMenuData *)ALLOC_MEMORY(sizeof(ListMenuData));

		if(data->menu_list_data == 0)
		{
			TRACE_EVENT("Failed memory alloc 1 ");
			return;
		}
		if (type_of_list == MAILBOX_LIST || type_of_list == MAILBOX_LIST_CALL)
			{	numberOfEntries = cphs_voicemail_numbers.count;
				if (numberOfEntries > 4)
					numberOfEntries = 4;
			}
		else
			numberOfEntries = info_numbers[info_num_level-1]->count;
		
		data->menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( 4 * sizeof(T_MFW_MNU_ITEM) );

		if(data->menu_list_data->List == 0)
		{
			TRACE_EVENT("Failed memory alloc 2");
			return;
		}
		
		for (i = 0; i < numberOfEntries ; i++)
		{
			mnuInitDataItem(&data->menu_list_data->List[i]);
			if (type_of_list == MAILBOX_LIST || type_of_list == MAILBOX_LIST_CALL)
				data->menu_list_data->List[i].str  = (char *)cphs_voicemail_numbers.entries[i].alpha.data;
			else
				data->menu_list_data->List[i].str  = (char *)info_numbers[info_num_level-1]->entry[i].alpha.data;
			data->menu_list_data->List[i].flagFunc = item_flag_none; 
		}

		data->menu_list_data->ListLength =numberOfEntries;
		data->menu_list_data->ListPosition = 1;
		data->menu_list_data->CursorPosition = 1;
		data->menu_list_data->SnapshotSize = numberOfEntries;
		data->menu_list_data->Font = 0;
		if (type_of_list == MAILBOX_LIST_CALL)
			data->menu_list_data->LeftSoftKey = TxtSoftCall;
		else
			data->menu_list_data->LeftSoftKey = TxtSoftSelect;
		data->menu_list_data->RightSoftKey = TxtSoftBack;
		data->menu_list_data->KeyEvents = KEY_ALL;
		data->menu_list_data->Reason = 0;
		data->menu_list_data->Strings = TRUE;
		data->menu_list_data->Attr   = &InfoNum_menuAttrib;
		data->menu_list_data->autoDestroy    = FALSE;
		
		
		/* Create the dynamic menu window */
	    listDisplayListMenu(win, data->menu_list_data,(ListCbFunc)InfonumList_cb,0);
		  
		break;

	default:
	    break;
	}
}
/*******************************************************************************

 $Function:	InfonumList_cb

 $Description:	Callback function for the info num list.
 
 $Returns:		none
 
 $Arguments:	Parent - parent window.
				ListData - Menu item list
*******************************************************************************/

void InfonumList_cb(T_MFW_HND * Parent, ListMenuData * ListData)
{
    T_MFW_WIN	    * win_data = ((T_MFW_HDR *)Parent)->data;
    T_INFO_NUM_INFO * data     = (T_INFO_NUM_INFO *)win_data->user;	  
//	char debug[40];   // RAVI

	if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR))
	{
	   
		listsDestroy(ListData->win);
	    InfoNum_destroy(data->numbers_win);
	    info_num_level--;
	}
	else if(ListData->Reason EQ LISTS_REASON_SELECT)
	{
		if (type_of_list == MAILBOX_LIST || type_of_list == MAILBOX_LIST_CALL) //get the correct voicemail num
		{	
			if (type_of_list == MAILBOX_LIST)
			{	/*If we're editing*/
				show_cphs_mb_number(&cphs_voicemail_numbers.entries[ListData->ListPosition]);
				memcpy(&cphs_voicemail_num, &cphs_voicemail_numbers.entries[ListData->ListPosition], sizeof(T_MFW_CPHS_ENTRY));
			}
			else
			{	char temp_number[PHB_MAX_LEN];
			
				memcpy(&cphs_voicemail_num, &cphs_voicemail_numbers.entries[ListData->ListPosition], sizeof(T_MFW_CPHS_ENTRY));
				memset(temp_number, 0, PHB_MAX_LEN);
				
				/*If we're calling the number*/ 
				//if it's an international number without a '+' 
				if (cphs_voicemail_num.ton == MFW_TON_INTERNATIONAL && cphs_voicemail_num.number[0] != '+')
				{	strcat(temp_number, "+");	//put a + in front of number
					strcat(temp_number, (char*)cphs_voicemail_num.number);
					strcpy((char*)cphs_voicemail_num.number, temp_number);
				}
				callNumber(cphs_voicemail_num.number);

			}

			
		}
		else
		{	
			//get the number/directory
				info_num_index = info_numbers[info_num_level-1]->entry[ListData->ListPosition].index;
				/***************************Go-lite Optimization changes Start***********************/
				//Aug 16, 2004    REF: CRR 24323   Deepa M.D
				TRACE_EVENT_P3("Index selected: %d, Level, %d, entryStat:%d",info_num_index, info_num_level, 
					info_numbers[info_num_level-1]->entry[ListData->ListPosition].entryStat); 
				/***************************Go-lite Optimization changes end***********************/
								if (info_numbers[info_num_level-1]->entry[ListData->ListPosition].entryStat & 0x80) //if bit 8 set
				{	TRACE_EVENT("CPHS INFO:Should be number entry");
					if (info_num_level < 4)
						cphs_select_info_num(info_num_index);
				}
				else
				{	if (info_num_level < 4)
					{	TRACE_EVENT("CPHS INFO:Should be dir entry");
					
						cphs_get_info_num(info_num_level+1, info_num_index+1);
					}
				}
					
		}	
			   
	}

	
}

/*******************************************************************************

 $Function:	InfoNum_destroy

 $Description:	Destroy the info num window.
			
 $Returns:		none

 $Arguments:	own_window- current window
*******************************************************************************/

static void InfoNum_destroy(MfwHnd own_window)
{
    T_MFW_WIN * win_data;
    T_INFO_NUM_INFO	* data;
	UBYTE numberOfEntries;
	
    TRACE_FUNCTION ("InfoNum_destroy()");
	
    if (own_window)
	{
	    win_data = ((T_MFW_HDR *)own_window)->data;
	    data = (T_INFO_NUM_INFO *)win_data->user;

	    if (data)
		{
		    /*
		     * Delete WIN handler
		     */ 
		    win_delete (data->numbers_win);

		    /*	   
		     * Free Memory
		     */
		     if (type_of_list == MAILBOX_LIST)
		    {	numberOfEntries = cphs_voicemail_numbers.count;
				if (numberOfEntries > 4)
					numberOfEntries = 4;
			}
		     else
				numberOfEntries =info_numbers[info_num_level-1]->count;
			if (data->menu_list_data != NULL)
			{	//int i; // RAVI
				FREE_MEMORY ((void *)data->menu_list_data->List, numberOfEntries * sizeof (T_MFW_MNU_ITEM));
			    FREE_MEMORY ((void *)data->menu_list_data, sizeof (ListMenuData));
			    if (type_of_list == INFO_NUM_LIST && info_num_level > 1)//if info numbers, 
				{	FREE_MEMORY((void*)info_numbers[info_num_level-1], sizeof(T_MFW_CPHS_INFONUM_LIST));
				info_numbers[info_num_level-1] = NULL;
			    }
			}
			FREE_MEMORY ((void *)data, sizeof (T_INFO_NUM_INFO));

		}
	    else
		{
		    TRACE_EVENT ("InfoNum_destroy() called twice");
		}
	}
}

/*******************************************************************************

 $Function:	info_num_win_cb

 $Description:	Window callback function for the info numbers window.
 
 $Returns:		none

 $Arguments:	w - mfw window handler
				e - mfw event
				
*******************************************************************************/

static int info_num_win_cb (MfwEvt e, MfwWin *w)    /* yyy window event handler */
{
	TRACE_EVENT ("info_num_win_cb()");
	switch (e)
	{
	case MfwWinVisible:  /* window is visible  */
		break;
	case MfwWinFocussed: /* input focus / selected	 */	
	case MfwWinDelete:   /* window will be deleted	 */   
		
	default:	    
		return MFW_EVENT_REJECTED;
	}
	return MFW_EVENT_CONSUMED;
}