view src/ui/bmi/mmiCPHS.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents fbe284e160c1
children
line wrap: on
line source

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

                    CONDAT (UK)

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

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

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

 $Project name: Basic MMI
 $Project code: BMI (6349)
 $Module:       CPHS
 $File:         MmiCPHS.c
 $Revision:     1.0

 $Author:       Condat(UK)
 $Date:         25/01/02

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

 Description

    This module provides the CPHS functionality


********************************************************************************
 $History: MmiCall.c
    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 */