view src/ui/bmi/mmiCPHS.c @ 92:c0052fe355d3

src/ui/bmi/*.[ch]: rm trailing white space
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 08 Nov 2020 06:39:16 +0000
parents 67bfe9f274f6
children fbe284e160c1
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
 	Nov 27, 2006 OMAPS00098359 a0393213(R.Prabakar)
 	Description: CPHS 4.2 : Call Divert doesn't work properly for Line 2

       Oct 11, 2006 REF:OMAPS00098287  x0039928
       Description : CPHS 4.2: MMI variable als_status is not updated proplery with the SIM contents.
       Solution     : als_status update is deffered until the idle screen is displayed.

       May 30, 2006 REF:OMAPS00079650  a0393213 (R.Prabakar)
       Description : CPHS Call Forwarding feature implementation
       Solution     : As part of this implementation, E_CPHS_SET_DV_STAT and E_CPHS_GET_DV_STAT in cphs_mfw_cb()
       		      are modified

	May 26, 2006 ER: OMAPS00079607 x0012849 :Jagannatha M
	Description: CPHS: Display 'charge/Timers' menu based on AOC ( Advice of charge ) and support info numbers.
	Solution:Made the following changes
		       1. Aoc_flag variable is defined and it will be set based on the CSP information.
		       2. New function info_num_msg_cb() added to support info numbers.

	May 30, 2006  DR: OMAPS00070657 x0pleela
	Description: CPHS feature on Locosto-Lite
	Solution: For ALS feature,
			a) Defined a new macro "MAX_LINE_NAME_LEN"
			b) Defined new structure "T_ALS_DATA" for editing Line 1 and 2 names
			c) Defined new flag "Als_flag" to store the staus of ALS bit from CSP data
			d) Added new functions cphs_Line_Edit_cb(), cphs_edit_line_exec_cb(),
				cphs_edit_line_create(), cphs_edit_line1(), cphs_edit_line2(),
				mmi_cphs_get_als_info(), mmi_cphs_get_als_info(), mmi_cphs_set_als_value(),
				mmi_cphs_get_als_value(), mmi_get_als_selectedLine()

	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 "mfw_cphs.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

/* 30th May,2006     OMAPS00079650     a0393213 (R.Prabakar)
    Description : CPHS Call Forwarding feature implementation*/

#include "MmiServices.h"
//x0pleela 08 June, 2006  DR:OMAPS00079607
//Including this header file to get the definition of getRoamingStatus()
#ifdef FF_CPHS
#include "MmiNetwork.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	    */
    (U8)-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;

#ifdef FF_CPHS_REL4
typedef struct
{
  T_MMI_CONTROL    mmi_control;
  T_MFW_HND	   msp_win; 				   /* MFW win handler	   */
  T_MFW_HND	   parent;
  ListMenuData	   * menu_list_data;
} T_MSP_INFO;

typedef struct
{
  T_MMI_CONTROL    mmi_control;
  T_MFW_HND	   mwis_win; 				   /* MFW win handler	   */
  T_MFW_HND	   parent;
  ListMenuData	   * menu_list_data;
} T_MWIS_INFO;

#endif

//x0pleela 23 May, 2006  DR: OMAPS00070657
#ifdef FF_CPHS
#define MAX_LINE_NAME_LEN (20+1)

typedef struct
{
	 /* administrative data */

    T_MMI_CONTROL	mmi_control;
    T_MFW_HND		win;
    T_MFW_HND		parent_win;
    T_MFW_HND		    input_number_win;
#ifndef NEW_EDITOR
	MfwEdtAttr			edt_attr_name;
#endif /* NEW_EDITOR */
UBYTE				edt_buf_name[MAX_LINE_NAME_LEN];
}  T_ALS_DATA;


#endif

#define E_INIT 1



#define CPHS_TELESERVICES_BYTE_VALUE	0x06
#define ALS_MASK						0x80

#define CPHS_INFONUMS_BYTE_VALUE		0xC0
#define INFONUM_MASK					0xFF

//x0pleela 23 May, 2006  DR: OMAPS00070657
#ifdef FF_CPHS
static UBYTE Als_flag; //Stores the status of ALS from CSP data
#endif

#ifdef FF_CPHS_REL4
static BOOL MSP_flag;
BOOL msp_register;
UBYTE msp_reg_profid;
UBYTE prof_sel;
BOOL interrogate= 0;
T_MFW_CPHS_MSP_INFO* msp_info;
BOOL mwis_flag = FALSE;
#endif




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

			       Static Global variables

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

static T_MFW_HND cphs_wait_dialog_win = NULL;
static T_DISPLAY_DATA 	mmi_cphs_wait_dialog_data = {0};
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;
#ifdef FF_CPHS_REL4
T_MFW_CPHS_REL4_DV_STAT call_forwarding_status_rel4;
static T_MFW_CPHS_REL4_MBI cphs_rel4_mbi; /*used to cache mbi info-should be updated immediately whenever mbi changes*/
static T_MFW_CPHS_REL4_MBDN cphs_rel4_mbdn; /*used to cache mbdn info-should be updated immediately whenever mbdn changes*/
static T_MFW_HND mailbox_waiting_dialog;
static T_MFW_CPHS_REL4_MAILBOX_TYPE mailbox_type; /*used to store the mailbox type for which an action is performed*/
#endif
static T_MFW_CPHS_CSP customer_service_profile;
static T_MFW_CPHS_INFONUM_LIST* info_numbers[4]= {NULL, NULL, NULL, NULL};
// Oct 11, 2006 REF:OMAPS00098287  x0039928
T_MFW_CPHS_ALS_STATUS als_status;
BOOL als_bootup;

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);
#ifdef FF_CPHS_REL4
static int msp_cb (T_MFW_EVENT event, T_MFW_WIN * win);
#endif
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

//x0pleela 23 May, 2006  DR:OMAPS00070657
#ifdef FF_CPHS
void mmi_cphs_get_als_info( void );

/* x0045876, 14-Aug-2006 (WR - function declared implicitly)*/
EXTERN void setAOCflag(int aocValue);
#endif




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

			       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;

	TRACE_FUNCTION("mmi_cphs_init()");
	cphs_init();			//initialise MFW CPHS module

	status = cphs_create(NULL, 0xFFFFF, cphs_mfw_cb); //create handler for MFW CPHS EVENTS

	info_num_level = 0;
	info_num_index = 1;


#ifndef FF_CPHS_REL4
#ifdef FF_CPHS
// Oct 11, 2006 REF:OMAPS00098287  x0039928
// Fix: als update is done in idle_draw_main_idle
//	mmi_cphs_get_als_info();
       als_bootup = TRUE;
#else
	cphs_get_als_info(&als_status);
#endif
#endif

	return status;
}

void mmi_cphs_refresh()
{
//x0pleela 02 June, 2006  DR: OMAPS00079688
//Initialising CPHS
#ifdef FF_CPHS
	if (sAT_PercentCPHS(CMD_SRC_LCL,1) /* 1 => ACI_CPHS_INIT */
                  NEQ AT_EXCT)
      {
                TRACE_ERROR("Abnormal error Not able to turn on CPHS in ACI");
      }
#endif
	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

	result = qAT_PlusCIMI(CMD_SRC_LCL, IMSI);
	while (result != 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
            /*a0393213 warnings removal - CLCK_FAC_Al changed to FAC_Al as a result of ACI enum change*/
		sAT_PlusCLCK(CMD_SRC_LCL,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);
	//x0pleela 11 June, 2006  DR:OMAPS00079692
	 //changed from CPHS_OK to MFW_CPHS_OK
		if (retVal == MFW_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
             /*a0393213 warnings removal - CLCK_FAC_Al changed to FAC_Al as a result of ACI enum change*/
		sAT_PlusCLCK(CMD_SRC_LCL,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);
	//x0pleela 11 June, 2006  DR:OMAPS00079692
	 //changed from CPHS_OK to MFW_CPHS_OK
		if (retVal == MFW_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;
}

#ifdef FF_CPHS_REL4

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

 $Function:     item_flag_isMWISFilePresent

 $Description:  return 0 if MWIS file is present else 1

*******************************************************************************/
int item_flag_isMWISFilePresent(struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi)
{
  TRACE_FUNCTION("item_flag_isMBDNFilePresent");
  if(isMWISFilePresent())
  	return 0;
  else
  	return 1;
}

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

 $Function:     item_flag_isMBDNFileNotPresent

 $Description:  return 1 if MBDN file is present else 0

*******************************************************************************/
int item_flag_isMBDNFileNotPresent(struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi)
{
  TRACE_FUNCTION("item_flag_isMBDNFilePresent");
  if(isMBDNFilePresent())
  	return 1;
  else
  	return 0;
}
/*******************************************************************************

 $Function:     item_flag_isMBDNFilePresent

 $Description:  return 0 if MBDN file is present else 1

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

int item_flag_isMBDNFilePresent(struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi)
{
  TRACE_FUNCTION("item_flag_isMBDNFileNotPresent");
  if(isMBDNFilePresent())
  	return 0;
  else
  	return 1;
}


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

 $Function:	       mmi_msp_interrogate_done

 $Description:	       Interrogation is finished.

 $Returns:		void

 $Arguments:	       void

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

void mmi_msp_interrogate_done(void)
{
	TRACE_FUNCTION("mmi_msp_interrogate_done()");

	/*a0393213 cphs rel4*/
	if(isCFISFilePresent())
	cphs_get_divert_status();

	/*invalidate the local cache of mbi and mbdn*/
	cphs_rel4_mbi.valid=0x00;
	cphs_rel4_mbdn.valid=0x00;
}

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

 $Function:	       mmi_msp_interrogate

 $Description:	       Start MSP interrogation

 $Returns:		void

 $Arguments:	       void

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

void mmi_msp_interrogate(void)
{
	char actstr[8];
	TRACE_FUNCTION("mmi_msp_interrogate()");

	interrogate = 1;
	strcpy(actstr, "*#59#");
       ss_execute_transaction((UBYTE*)actstr, 0);
}

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

 $Function:	       msp_cb

 $Description:	      Window event handler

 $Returns:		status int

 $Arguments:	       event, window handler

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

static int mwis_cb (MfwEvt e, MfwWin *w)    /* yyy window event handler */
{
	TRACE_EVENT ("mwis_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;
}

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

 $Function:	       msp_cb

 $Description:	      Window event handler

 $Returns:		status int

 $Arguments:	       event, window handler

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

static int msp_cb (MfwEvt e, MfwWin *w)    /* yyy window event handler */
{
	TRACE_EVENT ("msp_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;
}

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

 $Function:	       MSPPresent

 $Description:	       MSP is provisioned.

 $Returns:		status USHORT

 $Arguments:	       menu tag, attribute, item tag

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

USHORT MSPPresent( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{
	TRACE_EVENT_P1("MSPPresent - %d ", msp_info->count);
	if(MSP_flag)
		return 0;
	else
		return 1;
}

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

 $Function:	       cphs_select_profile

 $Description:	       Select a profile for registration

 $Returns:		void

 $Arguments:	       profile id

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

void cphs_select_profile(int pf_id)
{
	char seq[6];

	TRACE_EVENT_P1("cphs_select_profile - %d", pf_id);
	strcpy(seq,"*59");
	switch(pf_id)
	{
		case 1:
			strcat(seq,"1");
			break;
		case 2:
			strcat(seq,"2");
			break;
		case 3:
			strcat(seq,"3");
			break;
		case 4:
			strcat(seq,"4");
			break;
		default:
			break;
	}
	strcat(seq,"#");

	msp_register = TRUE;
	msp_reg_profid = pf_id;
	sAT_Dn(CMD_SRC_LCL,seq,-1,-1,-1);
}

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

 $Function:	       msp_menu_destroy

 $Description:	       Destroy menu

 $Returns:		void

 $Arguments:	       window handler

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

static void msp_menu_destroy(MfwHnd window)
{
	T_MFW_WIN     * win_data  = ((T_MFW_HDR *)window)->data;
	T_MSP_INFO * data = (T_MSP_INFO *)win_data->user;

	TRACE_FUNCTION ("msp_menu_destroy");

	if (window == NULL)
	{
		return;
	}

	if (data)
	{
		win_delete(data->msp_win);

		/*
		** Free Memory
		*/
		mfwFree((void *)data, sizeof (T_MSP_INFO));
	}
}

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

 $Function:	       mwis_menu_destroy

 $Description:	       Destroy menu

 $Returns:		void

 $Arguments:	       window handler

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

static void mwis_menu_destroy(MfwHnd window)
{
	T_MFW_WIN     * win_data  = ((T_MFW_HDR *)window)->data;
	T_MWIS_INFO * data = (T_MWIS_INFO *)win_data->user;

	TRACE_FUNCTION ("mwis_menu_destroy");

	if (window == NULL)
	{
		return;
	}

	if (data)
	{
		win_delete(data->mwis_win);

		/*
		** Free Memory
		*/
		mfwFree((void *)data, sizeof (T_MWIS_INFO));
	}
}

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

 $Function:	       MwisList_cb

 $Description:	       Callback for MWIS list

 $Returns:		void

 $Arguments:	       parent window, list data

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

void MwisList_cb(T_MFW_HND * Parent, ListMenuData * ListData)
{
	T_MFW_WIN			*win_data	= ((T_MFW_HDR *)Parent)->data;
	T_MWIS_INFO *data		= (T_MWIS_INFO *)win_data->user;
	TRACE_FUNCTION ("MwisList_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.
		*/
		if (data->menu_list_data != NULL)
		{
			FREE_MEMORY ((void *)data->menu_list_data->List, (U16)(4 * sizeof (T_MFW_MNU_ITEM)));
			FREE_MEMORY ((void *)data->menu_list_data, sizeof (ListMenuData));
		}

		mwis_menu_destroy(data->mwis_win);

	}
}

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

 $Function:	       mwis_exec_cb

 $Description:	       Dialog function to display the mwis list

 $Returns:		void

 $Arguments:	       window handler, event, value and parameter

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

void mwis_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
	T_MWIS_INFO * data = (T_MWIS_INFO*)win_data->user;
	T_MFW_CPHS_REL4_MWIS * mwis_ptr;
	int i;
	char temp[4][50];

	switch (event)
	{
	case E_INIT:

		TRACE_EVENT(">>>> mwis_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;
		}

		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;
		}

			mwis_ptr = get_mwis_stat(prof_sel);

			sprintf(temp[0],"Voice Mesage - %d ", mwis_ptr->voicemail);
			mnuInitDataItem(&data->menu_list_data->List[0]);
			data->menu_list_data->List[0].flagFunc = item_flag_none;
			data->menu_list_data->List[0].str  = temp[0];

			sprintf(temp[1],"Fax Message - %d ", mwis_ptr->fax);
			mnuInitDataItem(&data->menu_list_data->List[1]);
			data->menu_list_data->List[1].flagFunc = item_flag_none;
			data->menu_list_data->List[1].str  = temp[1];

			sprintf(temp[2],"Electronic Message - %d ", mwis_ptr->electronic);
			mnuInitDataItem(&data->menu_list_data->List[2]);
			data->menu_list_data->List[2].flagFunc = item_flag_none;
			data->menu_list_data->List[2].str  = temp[2];

			sprintf(temp[3],"Other Message - %d ", mwis_ptr->other);
			mnuInitDataItem(&data->menu_list_data->List[3]);
			data->menu_list_data->List[3].flagFunc = item_flag_none;
			data->menu_list_data->List[3].str  = temp[3];

		data->menu_list_data->ListLength = 4;
		data->menu_list_data->ListPosition = 0;
		data->menu_list_data->CursorPosition = 0;
		data->menu_list_data->SnapshotSize = 4;
		data->menu_list_data->Font = 0;
		data->menu_list_data->LeftSoftKey = TxtNull;
		data->menu_list_data->RightSoftKey = TxtSoftBack;
		data->menu_list_data->KeyEvents = KEY_RIGHT;
		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)MwisList_cb,0);

		break;
	default:
		break;
		}

}

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

 $Function:	       mmi_build_mwis_menu

 $Description:	       Create mwis menu

 $Returns:		window handler

 $Arguments:	       parent window handler

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

static T_MFW_HND mmi_build_mwis_menu( MfwHnd parent_window)
{
	T_MWIS_INFO *  data = (T_MWIS_INFO *)ALLOC_MEMORY (sizeof (T_MWIS_INFO));
	T_MFW_WIN  * win;
	TRACE_FUNCTION("mmi_build_mwis_menu");

    /*
     * Create window handler
     */

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

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

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

     return data->mwis_win;
}


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

 $Function:	       MspList_cb

 $Description:	       Callback for MSP list

 $Returns:		void

 $Arguments:	       parent window, list data

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

void MspList_cb(T_MFW_HND * Parent, ListMenuData * ListData)
{
	T_MFW_WIN			*win_data	= ((T_MFW_HDR *)Parent)->data;
	T_MSP_INFO *data		= (T_MSP_INFO *)win_data->user;
	TRACE_FUNCTION ("MspList_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.
		*/
		if (data->menu_list_data != NULL)
		{
			FREE_MEMORY ((void *)data->menu_list_data->List, (U16)(msp_info->count * sizeof (T_MFW_MNU_ITEM)));
			FREE_MEMORY ((void *)data->menu_list_data, sizeof (ListMenuData));
		}

		msp_menu_destroy(data->msp_win);
		mwis_flag = FALSE;
	}
	else if(ListData->Reason EQ LISTS_REASON_SELECT)
	  {
		TRACE_EVENT_P1("list position is %d",ListData->ListPosition);
		if(mwis_flag == FALSE)
		cphs_select_profile(ListData->ListPosition);
		else
		{
			T_MFW_HND win;
			T_MFW_HND parent_win = mfw_parent(mfw_header());

			TRACE_FUNCTION("build_mwis_list()");

			mwis_flag = TRUE;
			prof_sel = ListData->ListPosition;
			win = mmi_build_mwis_menu(parent_win);
			if (win NEQ NULL)
			{
				SEND_EVENT (win, E_INIT, 0, 0);
			}
		}
	  }
}


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

 $Function:	       msp_exec_cb

 $Description:	       Dialog function to display the msp list

 $Returns:		void

 $Arguments:	       window handler, event, value and parameter

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

void msp_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
	T_MSP_INFO* data = (T_MSP_INFO*)win_data->user;
	int i;

	switch (event)
	{
	case E_INIT:

		TRACE_EVENT(">>>> msp_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;
		}

		data->menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( msp_info->count * sizeof(T_MFW_MNU_ITEM) );

		if(data->menu_list_data->List == 0)
		{
			TRACE_EVENT("Failed memory alloc 2");
			return;
		}

		for (i = 0; i < msp_info->count; i++)
		{
			mnuInitDataItem(&data->menu_list_data->List[i]);
			data->menu_list_data->List[i].flagFunc = item_flag_none;
			data->menu_list_data->List[i].str  = (char *)msp_info->profile[i].alpha;
		}

		data->menu_list_data->ListLength =msp_info->count;
		data->menu_list_data->ListPosition = 1;
		data->menu_list_data->CursorPosition = 1;
		data->menu_list_data->SnapshotSize = msp_info->count;
		data->menu_list_data->Font = 0;
		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)MspList_cb,0);

		break;
	default:
		break;
		}

}


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

 $Function:	       mmi_build_msp_menu

 $Description:	       Create MSP menu

 $Returns:		window handler

 $Arguments:	       parent window handler

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

static T_MFW_HND mmi_build_msp_menu( MfwHnd parent_window)
{
	T_MSP_INFO *  data = (T_MSP_INFO *)ALLOC_MEMORY (sizeof (T_MSP_INFO));
	T_MFW_WIN  * win;
	TRACE_FUNCTION("mmi_build_msp_menu");

    /*
     * Create window handler
     */

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

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

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

     return data->msp_win;
}

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

 $Function:	       build_profile_list

 $Description:	       generate profile list

 $Returns:		status int

 $Arguments:	       menu, menu item

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

int build_profile_list(MfwMnu* m, MfwMnuItem* i)
{
		T_MFW_HND win;
		T_MFW_HND parent_win = mfw_parent(mfw_header());

		TRACE_FUNCTION("build_profile_list()");

		win = mmi_build_msp_menu(parent_win);
		if (win NEQ NULL)
		{
		SEND_EVENT (win, E_INIT, 0, 0);
		}
		return MFW_EVENT_CONSUMED;
}

int build_profile_list1(MfwMnu* m, MfwMnuItem* i)
{
		T_MFW_HND win;
		T_MFW_HND parent_win = mfw_parent(mfw_header());

		TRACE_FUNCTION("build_profile_list()");

		mwis_flag = TRUE;

		win = mmi_build_msp_menu(parent_win);
		if (win NEQ NULL)
		{
		SEND_EVENT (win, E_INIT, 0, 0);
		}
		return MFW_EVENT_CONSUMED;
}

#endif
/*******************************************************************************

 $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());
	TRACE_FUNCTION("cphs_line1_select");
#ifndef CPHS_PROV_TEST
	if (!ALSPresent(NULL, NULL, NULL))
#endif
	{	cphs_select_line(MFW_SERV_LINE1);
		/*cphs_get_divert_status();*//*a0393213 - the call forward icon is now shown taking both the lines into consideration*/
	}
#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());
	TRACE_FUNCTION("cphs_line2_select");
#ifndef CPHS_PROV_TEST
	if (!ALSPresent(NULL, NULL, NULL))
#endif
	{
		cphs_select_line(MFW_SERV_LINE2);
		/*cphs_get_divert_status();*//*a0393213 - the call forward icon is now shown taking both the lines into consideration*/
	}
#ifndef CPHS_PROV_TEST
	else
		ShowMessage(parent, TxtNotSupported, TxtNull);
#endif
	return MFW_EVENT_CONSUMED;
}

//x0pleela 23 May, 2006  DR: OMAPS00070657
#ifdef FF_CPHS
/*******************************************************************************

 $Function:    	cphs_Line_Edit_cb

 $Description:	Callback function for  Line rename editor

 $Returns:		none

 $Arguments:	win - current window
 				Identifier - unique id
 				reason - event cause
*******************************************************************************/

static void cphs_Line_Edit_cb(T_MFW_HND win, USHORT Identifier, SHORT reason)
{
	T_MFW_WIN   * win_data = ((T_MFW_HDR *) win)->data;
	T_ALS_DATA* data     = (T_ALS_DATA *)win_data->user;
      T_DISPLAY_DATA   display_info;

switch (reason)
	{
	       case INFO_KCD_ALTERNATELEFT:
		case INFO_KCD_LEFT:
                           	{
                           	if( Identifier == LINE1 )
	                           	strcpy(FFS_flashData.line1,(char *)data->edt_buf_name);
				else
					strcpy(FFS_flashData.line2,(char *)data->edt_buf_name);

                           	flash_write();


                           	dlg_initDisplayData_TextId(&display_info, TxtNull, TxtNull,   TxtDone, TxtNull, COLOUR_STATUS_WELCOME);

				dlg_initDisplayData_events( &display_info, NULL, TWO_SECS, KEY_ALL );

		  		info_dialog(win,&display_info);

		  #ifdef NEW_EDITOR
			AUI_edit_Destroy(data->input_number_win);
		#else /* NEW_EDITOR */
			editor_destroy(data->input_number_win);
		#endif /* NEW_EDITOR */
			data->input_number_win = 0;
		//dspl_ClearAll();


		winDelete(win);
		}
            break;
              case INFO_KCD_RIGHT:
		case INFO_KCD_HUP:
				{
		/* SPR#1428 - SH - New Editor changes */
		#ifdef NEW_EDITOR
			AUI_edit_Destroy(data->input_number_win);
		#else /* NEW_EDITOR */
			editor_destroy(data->input_number_win);
		#endif /* NEW_EDITOR */
			data->input_number_win = 0;
		//dspl_ClearAll();
		winDelete(win);

			}
			break;

		default:
			TRACE_EVENT("Err: Default");
			break;


                           }
}

static void cphs_edit_line_exec_cb(T_MFW_HND win, USHORT event, SHORT identifier, void *parameter)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    T_ALS_DATA* data = (T_ALS_DATA *)win_data->user;
#ifdef NEW_EDITOR
	T_AUI_EDITOR_DATA editor_data;	/* SPR#1428 - SH - New Editor data */
#else
	T_EDITOR_DATA editor_data;
#endif
	if( identifier==LINE1 )
		strcpy((char *) data->edt_buf_name,(char*)MmiRsrcGetText(TxtLine1));
	else
		strcpy((char *) data->edt_buf_name,(char*)MmiRsrcGetText(TxtLine2));

	TRACE_FUNCTION ("cphs_edit_line_exec_cb()");

	switch (event)
	{
		case E_INIT:

	#ifdef NEW_EDITOR
			AUI_edit_SetDefault(&editor_data);
			AUI_edit_SetDisplay(&editor_data, PHNO_EDITOR, COLOUR_EDITOR_XX, EDITOR_FONT);
			AUI_edit_SetEvents(&editor_data, identifier, FALSE, FOREVER, (T_AUI_EDIT_CB)cphs_Line_Edit_cb);
			AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtNull, NULL);
			AUI_edit_SetAltTextStr(&editor_data, 1, TxtSoftOK, TRUE, TxtSoftBack);
			AUI_edit_SetMode(&editor_data, ED_MODE_ALPHA, ED_CURSOR_NONE);
			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII,(UBYTE *) data->edt_buf_name, MAX_LINE_NAME_LEN);
			data->input_number_win=AUI_edit_Start(data->win, &editor_data);
#else /* NEW_EDITOR */

			SmsSend_loadEditDefault(&editor_data);

			bookSetEditAttributes( PHNO_EDITOR, COLOUR_EDITOR_XX, 0, edtCurBar1, 0,
			(char *) data->edt_data.NumberBuffer, /*MAX_SEARCH_CHAR*/NUMBER_LENGTH, &editor_data.editor_attr);
			editor_data.editor_attr.text     = (char *)data->edt_buf_name;

			editor_data.editor_attr.size     = MAX_LINE_NAME_LEN;

			editor_data.TextId               = TxtNull;
			editor_data.LeftSoftKey          = TxtSoftOK;
			editor_data.AlternateLeftSoftKey = TxtSoftOK;
			editor_data.RightSoftKey         = TxtDelete;
			editor_data.Identifier           = identifier ;
			editor_data.mode				 = E_EDIT_DIGITS_MODE;
			editor_data.Callback             = (T_EDIT_CB)cphs_Line_Edit_cb;
			editor_data.destroyEditor		 = FALSE;
			data->input_number_win =editor_start(data->win, &editor_data);  /* start the editor */


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

#endif

			break;
		default:
			TRACE_EVENT("Err: Default");
			break;
	}
}

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

 $Function:    	cphs_edit_line_create

 $Description:	Create a window for entering the text

 $Returns:		window handle

 $Arguments:	parent_window - parent window.

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


static T_MFW_HND cphs_edit_line_create(MfwHnd parent_window)
{
	T_ALS_DATA* data = (T_ALS_DATA *)ALLOC_MEMORY (sizeof (T_ALS_DATA));
	T_MFW_WIN  * win;

	TRACE_FUNCTION ("cphs_edit_line_create()");

	// Create window handler
	data->win = win_create (parent_window, 0, E_WIN_VISIBLE, NULL);
	if (data->win EQ NULL)
	{
		return NULL;
	}

	// connect the dialog data to the MFW-window
	data->mmi_control.dialog = (T_DIALOG_FUNC)cphs_edit_line_exec_cb;
	data->mmi_control.data   = data;
	win                      = ((T_MFW_HDR *)data->win)->data;
	win->user                = (MfwUserDataPtr)data;
	data->parent_win             = parent_window;

	winShow(data->win);
	return data->win;
}

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

 $Function:	cphs_edit_line1

 $Description:	edit line name from menu

 $Returns:		status int

 $Arguments:	menu, tag (not used)

*******************************************************************************/
int  cphs_edit_line1(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND parent_win = mfw_parent(mfw_header());
	T_MFW_HND win = cphs_edit_line_create(parent_win);
	SEND_EVENT(win,E_INIT,LINE1,0);
	/* a0393213 (WR - missing return statement at end of non-void function "cphs_edit_line1")*/
	return MFW_EVENT_CONSUMED;
}


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

 $Function:	cphs_edit_line2

 $Description:	edit line name from menu

 $Returns:		status int

 $Arguments:	menu, tag (not used)

*******************************************************************************/
int  cphs_edit_line2(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND parent_win = mfw_parent(mfw_header());
	T_MFW_HND win = cphs_edit_line_create(parent_win);
	SEND_EVENT(win,E_INIT,LINE2,0);
	/* a0393213 (WR - missing return statement at end of non-void function "cphs_edit_line2")*/
	return MFW_EVENT_CONSUMED;
}
#endif  /*FF_CPHS*/

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

 $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;

	TRACE_FUNCTION("menu_cphs_call_mailbox_number");

	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;

	TRACE_FUNCTION("menu_cphs_edit_mailbox_number");
	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;
}


#ifdef FF_CPHS_REL4
/*******************************************************************************

 $Function:	menu_cphs_rel4_show_mailbox_number

 $Description:	menu handler function for any item in MailBox menu

*******************************************************************************/
int menu_cphs_rel4_show_mailbox_number(MfwMnu* m, MfwMnuItem* i)
{
  if(cphs_rel4_mbi.valid==1)
  	{
  	/*already cached - no need to read SIM*/
       	sendCPHSSignal(E_CPHS_REL4_GET_MBI,&cphs_rel4_mbi );
  	}
  else
  	{
  	/*local copy not valid - read from SIM*/
         UBYTE msp_id=mfw_cphs_get_reg_profile();
         T_DISPLAY_DATA   display_info;
         TRACE_FUNCTION("menu_cphs_rel4_show_mailbox_number");
         switch (m->lCursor[m->level])
         	{
         	case 0:
       		TRACE_EVENT("voice selected");
       		mailbox_type=T_MFW_CPHS_REL4_MAILBOX_VOICE;
       		break;
       	case 1:
       		TRACE_EVENT("fax selected");
       		mailbox_type=T_MFW_CPHS_REL4_MAILBOX_FAX;
       		break;
       	case 2:
       		TRACE_EVENT("electronic selected");
       		mailbox_type=T_MFW_CPHS_REL4_MAILBOX_ELECTRONIC;
       		break;
       	case 3:
       		TRACE_EVENT("other selected");
       		mailbox_type=T_MFW_CPHS_REL4_MAILBOX_OTHER;
       		break;
       	default:
       		TRACE_ERROR("menu index out of range");
       		break;
         	}
          qAT_PercentMBI(CMD_SRC_LCL,msp_id);

	    dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, TxtPleaseWait, TxtNull, COLOUR_STATUS_WAIT);
	    dlg_initDisplayData_events( &display_info, NULL, FOREVER, 0 );

          mailbox_waiting_dialog=info_dialog (mfw_parent(mfwFocus), &display_info);

  	}
}
#endif
/*******************************************************************************

 $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()
{
	//x0pleela 11 June, 2006  DR:OMAPS00079692
	 //changed from CPHS_OK to MFW_CPHS_OK
	if (cphs_status == MFW_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;

	TRACE_FUNCTION("CphsMailboxPresent");
	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().

#ifndef FF_CPHS
	T_ACI_ALS_MOD ALSmode = (T_ACI_ALS_MOD)0;  // RAVI
#endif

//x0pleela 23 May, 2006  DR: OMAP00070657
//Returning the status of ALS based on CSP data
#ifdef FF_CPHS
	if( mmi_cphs_get_als_value() )
		return 0;
	else
		return 1;
#else

	tAT_PercentALS( CMD_SRC_NONE, &ALSmode );
	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.
#endif
}

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

 $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,len;
	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***********************/
	len = strlen((char*)customer_service_profile.csp); /* x0039928 - Lint warning fix */
	for(i=0; i<len; 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:	GetCphsRel4DivertStatus

 $Description:	get current call forwarding status
 $Arguments:	none

*******************************************************************************/
#ifdef FF_CPHS_REL4
T_MFW_CPHS_REL4_DV_STAT GetCphsRel4DivertStatus()
{
	TRACE_FUNCTION("GetCphsRel4DivertStatus()");
	return call_forwarding_status_rel4;
}


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

 $Function:	isCFISFilePresent

 $Description:	says whether the file is allocated and activated or not
 $Arguments:	none
 $Returns	    : TRUE - if present
 			FALSE - if absent

*******************************************************************************/
BOOL isCFISFilePresent()
{
	TRACE_FUNCTION("isCFISFilePresent()");
	if(sim_serv_table_check((UBYTE)SRV_No_55) == ALLOCATED_AND_ACTIVATED)
	{
		TRACE_EVENT("CFIS PRESENT");
		TRUE;
	}
	else
	{
		TRACE_EVENT("CFIS NOT PRESENT");
		FALSE;
	}
}

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

 $Function:	isMWISFilePresent

 $Description:	says whether the file is allocated and activated or not
 $Arguments:	none
 $Returns	    : TRUE - if present
 			FALSE - if absent

*******************************************************************************/
BOOL isMWISFilePresent(void)
{
	TRACE_FUNCTION("isMWISFilePresent()");
	if(sim_serv_table_check((UBYTE)SRV_No_54) == ALLOCATED_AND_ACTIVATED)
	{
		TRACE_EVENT("MWIS PRESENT");
		TRUE;
	}
	else
	{
		TRACE_EVENT("MWIS NOT PRESENT");
		FALSE;
	}

}

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

 $Function:	isMBDNFilePresent

 $Description:	says whether the file is allocated and activated or not
 $Arguments:	none
 $Returns	    : TRUE - if present
 			FALSE - if absent

*******************************************************************************/
BOOL isMBDNFilePresent(void)
{
	TRACE_FUNCTION("isMWISFilePresent()");
	if(sim_serv_table_check((UBYTE)SRV_No_53) == ALLOCATED_AND_ACTIVATED)
	{
		TRACE_EVENT("MBDN PRESENT");
		TRUE;
	}
	else
	{
		TRACE_EVENT("MBDN NOT PRESENT");
		FALSE;
	}

}
#endif

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

 $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 );
}


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

 $Function:	mmi_cphs_wait_dialog
 $Description:	Displays the "Pls. wait" Dialog
 $Returns:	Nothing
 $Arguments:	parent window

*******************************************************************************/
void mmi_cphs_wait_dialog(T_MFW_HND win)
{

	cphs_wait_dialog_win = NULL;
	memset( (void *)&mmi_cphs_wait_dialog_data, 0, sizeof(T_DISPLAY_DATA) );

	/* Initialise the dialog control block with default information
	*/
	dlg_initDisplayData_TextId( &mmi_cphs_wait_dialog_data, TxtNull,  TxtNull, TxtPleaseWait, NULL , COLOUR_STATUS);
	dlg_initDisplayData_events( &mmi_cphs_wait_dialog_data, NULL, FOREVER, KEY_MAX );

	/* Show the dialog */
	cphs_wait_dialog_win = info_dialog( win, &mmi_cphs_wait_dialog_data );
}


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

 $Function:	mmi_cphs_wait_dialog_destroy
 $Description:	Deletes the "Pls. wait" Dialog
 $Returns:	Nothing
 $Arguments:	None

*******************************************************************************/
void mmi_cphs_wait_dialog_destroy(void)
{
	if ( cphs_wait_dialog_win != NULL )
	{
		SEND_EVENT( cphs_wait_dialog_win, DIALOG_DESTROY, 0, &mmi_cphs_wait_dialog_data );
	}

	cphs_wait_dialog_win = NULL;
	memset( (void *)&mmi_cphs_wait_dialog_data, 0, sizeof(T_DISPLAY_DATA) );
}


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

			     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;
	}
}
/*******************************************************************************

 $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());

	TRACE_FUNCTION("show_cphs_mb_numbers");

	{
		win = buildInfoNumberMenu(parent_win);

		if (win NEQ NULL)
		{
			SEND_EVENT (win, E_INIT, 0, 0);
		}
	}
}
static UBYTE* temp_ed;

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

 $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[MFW_CPHS_VM_NUMBER_MAXLEN - 10];

TRACE_FUNCTION("show_cphs_mb_number");

	memset( temp_number, 0, (MFW_CPHS_VM_NUMBER_MAXLEN - 10) );

	//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
		strncat(temp_number, (char*)mb_number->number, (PHB_MAX_LEN - 1) );
		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);

	temp_ed = (UBYTE *)mb_number->number;

	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 */
	return 1;
}

#ifdef FF_CPHS_REL4
/*******************************************************************************

 $Function:	show_cphs_rel4_mb_number
 $Description:	Show the passed cphs rel4 mailbox number in editor
 $Returns:		status int
 $Arguments:	mailbox number entry

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

int show_cphs_rel4_mb_number(T_MFW_MBDN* 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[MAX_MB_NUM_LEN];

TRACE_FUNCTION("show_cphs_mb_number");

	memset(temp_number, 0, MAX_MB_NUM_LEN);

	//if it's an international number without a '+'
	if (mb_number->type.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, MAX_MB_NUM_LEN-1);
	AUI_edit_SetMode(&editor_data, ED_MODE_READONLY, ED_CURSOR_NONE);
	AUI_edit_SetDisplay(&editor_data, 0, COLOUR_EDITOR, EDITOR_FONT);
	AUI_edit_SetEvents(&editor_data, 0, TRUE, FOREVER, NULL);
	switch(mailbox_type)
		{
		case T_MFW_CPHS_REL4_MAILBOX_VOICE:
			AUI_edit_SetTextStr(&editor_data, TxtSoftOK, NULL, TxtVoice, NULL);
			break;
		case T_MFW_CPHS_REL4_MAILBOX_FAX:
			AUI_edit_SetTextStr(&editor_data, TxtSoftOK, NULL, TxtFax, NULL);
			break;
		case T_MFW_CPHS_REL4_MAILBOX_ELECTRONIC:
			AUI_edit_SetTextStr(&editor_data, TxtSoftOK, NULL, TxtElectronic, NULL);
			break;
		case T_MFW_CPHS_REL4_MAILBOX_OTHER:
			AUI_edit_SetTextStr(&editor_data, TxtSoftOK, NULL, TxtOther, NULL);
			break;
		}
	AUI_edit_Start(parent_win, &editor_data);
#else /* NEW_EDITOR */
	editor_attr_init(&editor_data.editor_attr, 0, edtCurNone, NULL, (char*)mb_number->number, MAX_MB_NUM_LEN-1, COLOUR_EDITOR);
	editor_data_init(&editor_data, NULL, TxtSoftOK, NULL, 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
}
#endif

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

 $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)
{
	T_MFW set_mailbox_errcode = MFW_CPHS_OK;
	UBYTE write_error_number[MFW_CPHS_VM_NUMBER_MAXLEN];

	TRACE_FUNCTION("mailbox_edit_cb()");
	switch (reason )
    {
		case INFO_KCD_LEFT:
		{
			memcpy( (void *)&write_error_number[0], (void *)&cphs_voicemail_num.number[0], MFW_CPHS_VM_NUMBER_MAXLEN );
			memset ( (void *)&cphs_voicemail_num.number[0], 0, MFW_CPHS_VM_NUMBER_MAXLEN );
			memcpy ( (void *)&cphs_voicemail_num.number[0], (void *)temp_ed, MFW_CPHS_VM_NUMBER_MAXLEN );

			set_mailbox_errcode = cphs_set_mailbox(&cphs_voicemail_num);

			if ( set_mailbox_errcode == MFW_CPHS_OK )
			{
				mmi_cphs_wait_dialog(win); /* Display the "Pls. wait" Dialog as SIM Write consumes quite some time */
			}
			else
			{
				memcpy( (void *)&cphs_voicemail_numbers.entries[cphs_voicemail_num.list_index].number[0],
					    (void *)&write_error_number[0], MFW_CPHS_VM_NUMBER_MAXLEN);
			}

			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
	TRACE_FUNCTION("cphs_mfw_cb");
	switch(event)
	{	case E_CPHS_IND:
			TRACE_EVENT("Getting cphs status");
			if(para != NULL)
			{	cphs_status =(* (T_MFW_CPHS_STATUS*)para);
				//x0pleela 11 June, 2006  DR:OMAPS00079692
				 //changed from CPHS_OK to MFW_CPHS_OK
				if (cphs_status != MFW_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:
                     //x0012849: Jagannatha  26 May, 2006  ER: OMAPS00079607 -Support AOC in CPHS
			TRACE_EVENT("case: E_CPHS_OP_NAME");
			if(para != NULL)
			{
			       int csp_status; //x0012849: Jagannatha  26 May, 2006  ER: OMAPS00079607 - No need to include this under FF_CPHS flag.
				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");
                      //x0012849: Jagannatha  26 May, 2006  ER: OMAPS00079607 -Support AOC in CPHS
			csp_status = cphs_get_csp();
                      //x0012849: Jagannatha  26 May, 2006  ER: OMAPS00079607 -Support AOC in CPHS
                      // In case if cphs_get_csp returns less than 'MFW_CPHS_OK' then either CPHS is not present or CPS is not allocated or activated in serice table.
                     #ifdef FF_CPHS
					 	//x0pleela 11 June, 2006  DR:OMAPS00079692
	 			//changed from CPHS_OK to MFW_CPHS_OK
			if( csp_status < MFW_CPHS_OK)
			{
 		           TRACE_EVENT("E_CPHS_OP_NAME : AOC is set to TRUE");
                         setAOCflag(TRUE);
			}
			#endif
			}
 		       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;
		#ifdef FF_CPHS_REL4
		case E_CPHS_REL4_GET_MBI:
			if(para!=NULL)
				{
				/*update local cache*/
					memcpy(&cphs_rel4_mbi,para,sizeof(T_MFW_CPHS_REL4_MBI));
				/*get mbdn*/
				switch(mailbox_type)
					{
					case T_MFW_CPHS_REL4_MAILBOX_VOICE:
						if(cphs_rel4_mbdn.valid & 0x01)
							cphs_mfw_cb(E_CPHS_REL4_GET_MBDN,&(cphs_rel4_mbdn.mailbox_numbers[0]));
						else
							cphs_rel4_get_mailbox_no( cphs_rel4_mbi.voice);
						break;
					case T_MFW_CPHS_REL4_MAILBOX_FAX:
						if(cphs_rel4_mbdn.valid & 0x02)
							cphs_mfw_cb(E_CPHS_REL4_GET_MBDN,&(cphs_rel4_mbdn.mailbox_numbers[1]));
						else
							cphs_rel4_get_mailbox_no(cphs_rel4_mbi.fax);
						break;
					case T_MFW_CPHS_REL4_MAILBOX_ELECTRONIC:
						if(cphs_rel4_mbdn.valid & 0x04)
							cphs_mfw_cb(E_CPHS_REL4_GET_MBDN,&(cphs_rel4_mbdn.mailbox_numbers[2]));
						else
							cphs_rel4_get_mailbox_no(cphs_rel4_mbi.electronic);
						break;
					case T_MFW_CPHS_REL4_MAILBOX_OTHER:
						if(cphs_rel4_mbdn.valid & 0x08)
							cphs_mfw_cb(E_CPHS_REL4_GET_MBDN,&(cphs_rel4_mbdn.mailbox_numbers[3]));
						else
							cphs_rel4_get_mailbox_no( cphs_rel4_mbi.other);
						break;
					}
				}
			break;
		case E_CPHS_REL4_GET_MBDN:
			/*destroy the dialog showing waiting*/
			SEND_EVENT(mailbox_waiting_dialog, DIALOG_DESTROY, 0, 0);
			if(para!=NULL)
				{

				/*update local cache and show mailbox number*/
				switch(mailbox_type)
					{
					case T_MFW_CPHS_REL4_MAILBOX_VOICE:
							memcpy(&cphs_rel4_mbdn.mailbox_numbers[0],para,sizeof(T_MFW_MBDN));
							cphs_rel4_mbdn.valid|=0x01;
							show_cphs_rel4_mb_number(&cphs_rel4_mbdn.mailbox_numbers[0]);
						break;
					case T_MFW_CPHS_REL4_MAILBOX_FAX:
							memcpy(&cphs_rel4_mbdn.mailbox_numbers[1],para,sizeof(T_MFW_MBDN));
							cphs_rel4_mbdn.valid|=0x02;
							show_cphs_rel4_mb_number(&cphs_rel4_mbdn.mailbox_numbers[1]);
						break;
					case T_MFW_CPHS_REL4_MAILBOX_ELECTRONIC:
							memcpy(&cphs_rel4_mbdn.mailbox_numbers[2],para,sizeof(T_MFW_MBDN));
							cphs_rel4_mbdn.valid|=0x04;
							show_cphs_rel4_mb_number(&cphs_rel4_mbdn.mailbox_numbers[2]);
						break;
					case T_MFW_CPHS_REL4_MAILBOX_OTHER:
 						       memcpy(&cphs_rel4_mbdn.mailbox_numbers[3],para,sizeof(T_MFW_MBDN));
							cphs_rel4_mbdn.valid|=0x08;
							show_cphs_rel4_mb_number(&cphs_rel4_mbdn.mailbox_numbers[3]);
						break;
					}

				}
			break;
		#endif
		 case E_CPHS_SET_VC_NUM:
		{		//result of writing mailbox number
			UBYTE write_result;
			if(para != NULL)
			{	write_result = *(UBYTE*)para;
				mmi_cphs_wait_dialog_destroy(); /* Delete the "Pls. wait" screen */
				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

			 	/*a0393213 cphs rel4 - the parameter sent are of different type for CPHS Rel4 and non-CPHS Rel4*/
				#ifdef FF_CPHS_REL4
			 	if(!isMWISFilePresent() )
			 	{
			 	#endif
				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)
					{
					//x0pleela 01 June, 2006  DR: OMAPS00079692
					//Commented below line to avoid displaying a popup msg showing the line #
					//Idle screen will be updated with the voice mail icon
    					       //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)
					{
					//x0pleela 01 June, 2006  DR: OMAPS00079692
					//Commented below line to avoid displaying a popup msg showing the line #
					//Idle screen will be updated with the voice mail icon
						//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);
    				      }
				}
				#ifdef FF_CPHS_REL4
				}
				else
				{
					if(is_message_waiting())
					{
						iconsSetState(iconIdVoice);
					}
					else
					{
						iconsDeleteState(iconIdVoice);
					}

				}
				#endif

			 }
			 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:
			 {
			 	/*a0393213 cphs rel4 - the parameter sent are of different type for CPHS Rel4 and non-CPHS Rel4*/
				#ifdef FF_CPHS_REL4
			 	if(!isCFISFilePresent() )
			 	{
			 	#endif
					UBYTE line;
					//check for divert on active line
					line = GetAlsLine();

					TRACE_EVENT_P4("cphs_mfw_cb():E_CPHS_GET_DV_STAT %d %x %x %x", ((T_MFW_CPHS_DV_STAT*)para)->result,
						                   ((T_MFW_CPHS_DV_STAT*)para)->line1,((T_MFW_CPHS_DV_STAT*)para)->line2,line);

					/* 30th May,2006     OMAPS00079650     a0393213 (R.Prabakar)
					    Description : CPHS Call Forwarding feature implementation
					    Solution     : call_forwarding_status is updated. The data is not written into flash as it would be done
					    in E_CPHS_SET_DV_STAT. However the present code is not disturbed*/

					#ifdef FF_CPHS
						if(((T_MFW_CPHS_DV_STAT*)para)->result == MFW_SIMOP_READ_ERR)
						{

						if(FFS_flashData.CFState==TRUE)
							{
							if (line == MFW_SERV_LINE2)
							   ((T_MFW_CPHS_DV_STAT*)para)->line2=MFW_CFLAG_SET;
							else
								((T_MFW_CPHS_DV_STAT*)para)->line1=MFW_CFLAG_SET;

							}
						else
							{
							if (line == MFW_SERV_LINE2)
							   ((T_MFW_CPHS_DV_STAT*)para)->line2=MFW_CFLAG_NOTSet;
							else
								((T_MFW_CPHS_DV_STAT*)para)->line1=MFW_CFLAG_NOTSet;
							}
						}
					#endif
					if(para != NULL)
						memcpy(&call_forwarding_status, para, sizeof(T_MFW_CPHS_DV_STAT));
					{

						//check if current outgoing line diverted
					/*a0393213 - the call forward icon is now shown taking both the lines into consideration*/
					/*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 ((GetCphsDivertStatus(MFW_SERV_LINE1)==MFW_CFLAG_SET) ||
					    (GetCphsDivertStatus(MFW_SERV_LINE2)==MFW_CFLAG_SET))
						{
							iconsSetState(iconIdCallFor);
							#ifndef FF_CPHS
								//  Jun 23, 2004        REF: CRR MMI-SPR-13599  Rashmi C N(Sasken)
								//              Setting the Current state of CF in Flash
				                         FFS_flashData.CFState=TRUE;
							#endif
						}
						//gid rid of call forwarding icon
					if ((GetCphsDivertStatus(MFW_SERV_LINE1)==MFW_CFLAG_NOTSet) &&
					    (GetCphsDivertStatus(MFW_SERV_LINE2)==MFW_CFLAG_NOTSet))
						{
							iconsDeleteState(iconIdCallFor);
							#ifndef FF_CPHS
								//  Jun 23, 2004        REF: CRR MMI-SPR-13599  Rashmi C N(Sasken)
								//              Setting the Current state of CF in Flash
				                        FFS_flashData.CFState=FALSE;
							#endif
						}

				            #ifndef FF_CPHS
							//  Jun 23, 2004        REF: CRR MMI-SPR-13599  Rashmi C N(Sasken)
							//              Writng the Current state of CF into ffs
							flash_write();
					      #endif
					}
					#ifdef FF_CPHS_REL4
					 	}
						else
						{
							/*store info in call_forwarding_status_rel4*/
							memcpy(&call_forwarding_status_rel4, para, sizeof(T_MFW_CPHS_REL4_DV_STAT));
							if(((T_MFW_CPHS_REL4_DV_STAT*)para)->voice==MFW_CFLAG_SET)
								iconsSetState(iconIdCallFor);
							else
								iconsDeleteState(iconIdCallFor);
						}
						if(isMWISFilePresent())
							cphs_rel4_get_mailbox_status();
					#endif
			 }
			 break;
			 case E_CPHS_SET_DV_STAT:
			 {
			 	//result of setting divert status
				// UBYTE write_result;  // RAVI
				/* 30th May,2006     OMAPS00079650     a0393213 (R.Prabakar)
				    Description : CPHS Call Forwarding feature implementation
				    Solution     : CF status is written into flash if sim write had failed*/
				#ifdef FF_CPHS_REL4
				if(!isCFISFilePresent() )
					{
				#endif
					#ifdef FF_CPHS
	                			if(para != NULL)
						{
					   		UBYTE write_result;
					    		write_result = *(UBYTE*)para;
							if (write_result == MFW_SIMOP_WRITE_OK)
								TRACE_EVENT("cphs_mfw_cb:Call forward flag set in sim");
							if (write_result == MFW_SIMOP_WRITE_ERR)
								{
								TRACE_EVENT("cphs_mfw_cb:Unable to set call forward flag in sim");

								if(ss_data.cfu_services&0x01)
									{
									FFS_flashData.CFState=TRUE;
									}
								else
									{
									FFS_flashData.CFState=FALSE;
									}
								flash_write();
								}
						}
					#endif

						cphs_get_divert_status(); //refresh divert status
				#ifdef FF_CPHS_REL4
					}
				else/*a0393213 cphs rel4 supported*/
					{
					if(call_forwarding_status_rel4.voice==MFW_CFLAG_SET)
						iconsSetState(iconIdCallFor);
					else
						iconsDeleteState(iconIdCallFor);
					}
				#endif

			 }
			 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)
						{
						TRACE_EVENT("cphs_mfw_cb() : ALS status written into flash");
						ShowMessage(parent, TxtChanged, TxtNull);
						}
					if (write_result == MFW_SIMOP_WRITE_ERR)
						{
						TRACE_EVENT("cphs_mfw_cb() : ALS status not written into flash");
						ShowMessage(parent, TxtWriteError, TxtNull);//display "Write Error"
						}
				}
#ifdef FF_CPHS
				mmi_cphs_get_als_info();
#else
				cphs_get_als_info(&als_status);//refresh current line
#endif
				/*cphs_get_divert_status(); //refresh divert status*//*a0393213 - the call forward icon is now shown taking both the lines into consideration*/
			 }
			 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:
			 {
                            #ifdef FF_CPHS
                            //x0012849: Jagannatha  26 May, 2006  ER: OMAPS00079607 -Support AOC in CPHS
                            int i;
                            #endif
			      TRACE_EVENT("Reached 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***********************/

                                   //x0012849: Jagannatha  26 May, 2006  ER: OMAPS00079607 -Support AOC in CPHS
			              #ifdef FF_CPHS
			              TRACE_EVENT_P2("AOC : Service group code =%d  value =%d",
			                  customer_service_profile.csp[4], customer_service_profile.csp[5]);
                                    // No need to check if Aoc_flag is already set to TRUE.

				 	 /*check for Byte 1 service group code =03 and Byte2 bit 6 =1*/
					 for (i=0;i<20; i++)
					 {
					 //check for AOC bit
					 	if( customer_service_profile.csp[i] EQ 0x03)
				 		{
							if(i == 19) break;  /* x0039928 - Lint warning fix */
							i++;
				 			if( customer_service_profile.csp[i] & 0x20)
				 			{
             					              TRACE_EVENT("E_CPHS_GET_CSP: AOC flag is SET in CPHS ");
                                                        setAOCflag(TRUE);
				 				break;
				 			}
				 			else {
                                                     TRACE_EVENT("E_CPHS_GET_CSP: AOC flag is NOT SET in CPHS ");
                                                     setAOCflag(FALSE);
                                                 }
				 		}
						//check for ALS bit
						else if( customer_service_profile.csp[i] == 0x06)
					  	{
   					  		if(i == 19) break;  /* x0039928 - Lint warning fix */
						    i++;
						    if( customer_service_profile.csp[i] & 0x80 )
						    {
							mmi_cphs_set_als_value( TRUE);
						      break;
						    }
						    else
						      mmi_cphs_set_als_value( FALSE);
				  		}
						else
							i++;
				 	 }

				       #endif
				       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
					      /* x0045876, 14-Aug-2006 (WR - assignment in condition)*/
					       info_numbers[info_num_level] = (T_MFW_CPHS_INFONUM_LIST*) ALLOC_MEMORY(sizeof(T_MFW_CPHS_INFONUM_LIST));
						if (info_numbers[info_num_level])
							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;
#ifdef FF_CPHS_REL4
			    case E_CPHS_MSP_IND:
				{
					if(para != NULL)
					{
						msp_info = mfw_cphs_get_msp();
						TRACE_EVENT_P1("E_CPHS_MSP_IND - mspcount %d",msp_info->count);
						if(msp_info->count < 2)
						{
						MSP_flag = FALSE;
						#ifdef FF_CPHS
							mmi_cphs_get_als_info();
						#else
							cphs_get_als_info(&als_status);
						#endif
						return TRUE;
						}
						else
						{
							MSP_flag = TRUE;
							mfw_cphs_set_default_profile(1);
							mfw_cphs_set_reg_profile(1);
							mmi_msp_interrogate();
						}
					}
			    	}
				break;
#endif
			 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;
	TRACE_FUNCTION("buildInfoNumberMenu");

    /*
     * 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;
}


//x0012849: Jagannatha  01 June, 2006  ER: OMAPS00079607 -To Support AcC and Info numbers
/*******************************************************************************
 $Function:	info_num_msg_cb
 $Description:	Dialogue callback function of the information Numbers message window
 $Returns:		none
 $Arguments:	win - window handler, dialogue id, key pressed

*******************************************************************************/
#ifdef FF_CPHS
void info_num_msg_cb(T_MFW_HND win, USHORT identifier, UBYTE reason)
{

    T_MFW_HND parent = mfwParent( mfw_header());
    TRACE_FUNCTION ("info_num_msg_cb");
    switch (reason)
    {
        case INFO_KCD_LEFT:
            // This code is not executed for the case - If mobile is in roaming and service is Network specific.
            if (info_numbers[info_num_level-1]->entry[identifier].entryStat & 0x80) //if bit 8 set/*a0393213 warnings removal - Dialog.Identifier changed to identifier*/
            {
                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);
                 }
            }
            break;

        default:
            break;
    }
}
#endif
/*******************************************************************************
 $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


	MmiRsrcGetText(TxtLine1);
	MmiRsrcGetText(TxtLine2);
	MmiRsrcGetText(TxtFax);
	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;

	case LISTS_REASON_VISIBLE:
	case LISTS_REASON_RESUME:
	{
		dspl_ClearAll();	// sbh - clear screen before update

		if (type_of_list == MAILBOX_LIST)
		{
			softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, COLOUR_LIST_SUBMENU);
		}
		else if (type_of_list == MAILBOX_LIST_CALL)
		{
			softKeys_displayId( TxtSoftCall, TxtSoftBack, 0, COLOUR_LIST_SUBMENU);
		}

		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

TRACE_FUNCTION("InfonumList_cb");
	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
		{
			cphs_voicemail_numbers.entries[ListData->ListPosition].list_index = ListData->ListPosition;

			if (type_of_list == MAILBOX_LIST)
			{	/*If we're editing*/
				TRACE_FUNCTION_P2("List Posn2: %d, MBN: %s", ListData->ListPosition, cphs_voicemail_numbers.entries[ListData->ListPosition].number );
				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[MFW_CPHS_VM_NUMBER_MAXLEN];

				memcpy(&cphs_voicemail_num, &cphs_voicemail_numbers.entries[ListData->ListPosition], sizeof(T_MFW_CPHS_ENTRY));
				memset(temp_number, 0, MFW_CPHS_VM_NUMBER_MAXLEN);

				/*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
					strncat(temp_number, (char*)cphs_voicemail_num.number, strlen((char*)cphs_voicemail_num.number));
					memset((void*)cphs_voicemail_num.number, 0, MFW_CPHS_VM_NUMBER_MAXLEN);
					strncpy((char*)cphs_voicemail_num.number, temp_number, strlen((char *)temp_number));
				}

				callNumber(cphs_voicemail_num.number);

			}


		}
		else
		{
#ifdef FF_CPHS
			T_DISPLAY_DATA Dialog;
                     //x0012849: Jagannatha  01 June, 2006  ER: OMAPS00079607 -To Support AcC and Info numbers
                     UBYTE inRoaming;
                     inRoaming = getRoamingStatus();
                     TRACE_EVENT_P1("Roaming status = %d", inRoaming);
#endif
                    //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***********************/
                            //x0012849: Jagannatha  01 June, 2006  ER: OMAPS00079607 -To Support AcC and Info numbers
                            //0x20 in Binary  0010 0000  - If bit 6 is set to 1 that indicates that service is specific to network.
#ifdef FF_CPHS
				if( (current_info_num.entryStat & 0x20) && inRoaming )
				{
					dlg_initDisplayData_TextStr( &Dialog, TxtSoftOK,  TxtSoftBack, (char*)MmiRsrcGetText(TxtNotAvailable), NULL, COLOUR_STATUS);
					dlg_initDisplayData_events( &Dialog, (T_VOID_FUNC) info_num_msg_cb, THREE_SECS, KEY_RIGHT|KEY_CLEAR );
					Dialog.Identifier = (USHORT)ListData->ListPosition;
					info_dialog( Parent, &Dialog );
				}
                            //x0012849: Jagannatha  01 June, 2006  ER: OMAPS00079607 -To Support AcC and Info numbers
                            //0x10 in Binary  0001 0000  - If bit 5 is set to 1 that indicates that service is charged at premium rate.
				else if(current_info_num.entryStat & 0x10)
				{
					dlg_initDisplayData_TextStr( &Dialog, TxtSoftOK,  TxtSoftBack, (char*)"Charging will be done at a", (char*)"Premium Rate", COLOUR_STATUS);
					dlg_initDisplayData_events( &Dialog, (T_VOID_FUNC) info_num_msg_cb, FOREVER, KEY_LEFT|KEY_RIGHT|KEY_CLEAR );
					Dialog.Identifier = (USHORT)ListData->ListPosition;
					info_dialog( Parent, &Dialog );
				}
				else
				{
#endif
					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);
						}
					}
#ifdef FF_CPHS
				}
#endif

		}

	}


}

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

 $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 ) || ( 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;
			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;
}



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

 $Function:	mmi_cphs_get_als_info

 $Description:	Returns the current Line enabled

 $Returns:		none

 $Arguments:

*******************************************************************************/
//x0pleela 23 May, 2006  DR: OMAPS00070657
#ifdef FF_CPHS
void mmi_cphs_get_als_info()
{
	int nALS_line_data;

	nALS_line_data= mfw_cphs_get_als_info();
	TRACE_EVENT_P1("mmi_cphs_get_als_info() : %d",nALS_line_data);
	switch (nALS_line_data)
    	{
	      	case ALS_MOD_SPEECH:
			als_status.selectedLine = MFW_SERV_LINE1;
			break;

	      case ALS_MOD_AUX_SPEECH:
			als_status.selectedLine = MFW_SERV_LINE2;
			break;
	      default:
			als_status.selectedLine = MFW_SERV_NotPresent;
			break;
    }
}


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

 $Function:	mmi_cphs_set_als_value

 $Description:	Set the Als flag based on the CSP data read from CPHS enabled SIM

 $Returns:		none

 $Arguments:

*******************************************************************************/
//x0pleela 29 May, 2006  DR: OMAPS00070657

void mmi_cphs_set_als_value( UBYTE als_val)
{
	TRACE_FUNCTION("mmi_cphs_set_als_value()");
	Als_flag = als_val;
}

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

 $Function:	mmi_cphs_get_als_value

 $Description:	Returns the Als flag value

 $Returns:		none

 $Arguments:

*******************************************************************************/
//x0pleela 29 May, 2006  DR: OMAPS00070657

UBYTE  mmi_cphs_get_als_value( void )
{
	TRACE_EVENT_P1("mmi_cphs_get_als_value() %d",Als_flag);
	return Als_flag;
}

#ifdef FF_CPHS_REL4
UBYTE  mmi_cphs_get_msp_value( void )
{
	TRACE_EVENT_P1("mmi_cphs_get_msp_value - MSP_flag - %d", MSP_flag);
	return MSP_flag;
}
#endif
/*******************************************************************************

 $Function:	mmi_get_als_selectedLine

 $Description:	Returns the current Line enabled

 $Returns:		none

 $Arguments:

*******************************************************************************/
//x0pleela 30 May, 2006  DR: OMAPS00070657
T_MFW_LINE_INDEX mmi_get_als_selectedLine( void)
{
	return als_status.selectedLine;
}
#endif /* FF_CPHS */