view src/ui/bmi/mmiSmsMenu.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 44d6af34c75a
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
 $Module:   SMS
 $File:     MmiSmsMenu.c
 $Revision: 1.0

 $Author:   Condat(UK)
 $Date:     25/10/00

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

 Description:

    Implementation SMS dynamic menu handling

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

 $History: MmiSmsMenu.c

      Feb 28, 2007 OMAPS00109953 a0393213(R.Prabakar)
      Description : Need to be able to store SMS in SIM/ME
      Solution     : Earlier, index alone was sufficient to identify messages. Now memory should also be taken care of.

	May 27, 2005    MMI-FIX-29869 x0018858
   	Description: There is a limitation on the number of messages that can be downloaded from
   	server even though there is space on the sim.
   	Solution: The limitation has been removed and the number of messages that can be dowloaded
   	has been modified to the masimum number that can be stored.

      	March 31, 2005    REF: CRR MMI-SPR-24511   x0012852
	Bug:The phone crashes when the user selects the 'Delete All' option
       almost the same time as there's an incoming message.
       Fix:Check added for part message before deleting all messages.

 	Feb 24, 2005 REF: CRR MMI-SPR-29102 xnkulkar
       Description: The phone resets when user presses the ''End All' key while the SMSs are being deleted.
       Solution: As the user has already confirmed that all SMS messages are to be deleted, ''End All' key
       		press is ignored till the delete operation is over.

	Jul 13, 2004    REF: CRR 21615  Deepa M.D
	Bug:Message once entered into message editor not storing in memory.
	Fix:When a SMS is typed in the Editor, it is stored in a temporary buffer.
	When the user accesses the editor,the temporary buffer is copied back into
	the Editor .

	Mar 29, 2004    REF: CRR 12722  Deepa M.D
	Mar 24, 2004    REF: CRR 15746  Deepa M.D
	25/10/00      Original Condat(UK) BMI version.

 $End


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

#define MMI_SMSMENU_C

#define ENTITY_MFW

/* 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 "prim.h"

#include "mfw_mfw.h"
#include "mfw_win.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_smsi.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 "dspl.h"

#include "MmiMain.h"
#include "MmiDummy.h"
#include "MmiMmi.h"

#include "MmiDialogs.h"
#include "MmiLists.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 "mmiSmsRead.h"
#include "mmismssend.h"
#include "mmiSmsIdle.h"
#include "mmiSmsBroadcast.h"	/* reqd for info_screen function prototype */

#include "cus_aci.h"

#include "mfw_ffs.h"
//#include "pcm.h"

#include "mmiColours.h"

//May 27, 2005    MMI-FIX-29869 x0018858
#ifdef FF_MMI_SMS_DYNAMIC
int g_max_messages = 0;
#endif


/* =================================================== */
/* BEGIN ADD: Sumit: Locosto: eZiText */
T_MFW_HND eZiTextWin;
/* END ADD: Sumit: Locosto: eZiText */
/* =================================================== */

extern T_MFW_HND SmsRead_R_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr);

// Start functions of the windows
T_MFW_HND M_SND_SAV_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr);
T_MFW_HND M_DEL_ALL_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr);
T_MFW_HND M_DEL_ALL_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr);
T_MFW_HND V_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr);

// Standard callback function for temporary dialog window
int SmsMenu_StandardDialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason);
static void SmsMenu_StandardEditor_cb (T_MFW_HND win, USHORT Identifier, SHORT reason);

/* x0039928 - Lint warning fix */
int SmsMenu_sms_delete_all(T_MFW_HND win);

/* This structure is used by 'Delete All' function that is common for SMS and SMS-CB */
typedef enum SmsType
{
  SMS_TYPE, /* interfered with macro -> renamed SMS to SMS_TYPE */
  SMSCB_TYPE
} MySmsType;

/* ID of the different windows (used in SEND_EVENT function to provide the callee the ID of the caller) */
typedef enum
{
  /* Logical frames */
  M_DEL_ALL_ID,
  M_SND_SAV_ID,
  V_ID_SET,
  V_ID_CALL,
  V_NUM_ID,
  /* Dialog windows */
  SMSMENU_ID_NOTREADY,
  SMSMENU_ID_DELETEALL,
  SMSMENU_ID_DELOK,
  SMSMENU_ID_DELERR,
  SMSMENU_ID_NOMESSAGES,
  SMSMENU_ID_WAIT
} sms_menu_id;

typedef enum              /* numbering plan identifier */
{
  MFW_MB_LINE1      = 1,
  MFW_MB_LINE2      = 2,
  MFW_MB_FAX        = 3,
  MFW_MB_DATA       = 4
} T_MFW_MAILBOX_ID;


typedef enum
{
  SMS_DELETING,
  SMS_DISPLAY,
  SMS_READY
} T_SmsMenu_state;

typedef struct
{
    /* administrative data */

    T_MMI_CONTROL   mmi_control;
    T_MFW_HND       win;
    SHORT           id;
    T_MFW_HND       parent;

    /* associated handlers */

    T_MFW_HND       kbd;
    T_MFW_HND       kbd_long;
    T_MFW_HND       menu;

    /* internal data */

    T_SmsUserData * user_data; // text and phone number of the message
} T_M_SND_SAV;

typedef struct
{
    /* administrative data */

    T_MMI_CONTROL   mmi_control;
    T_MFW_HND       win;
    SHORT           id;
    T_MFW_HND       parent;
    T_MFW_HND       waiting_win;

    /* associated handlers */
    T_MFW_HND       sms_hnd;         /* MFW sms handler      */

    /* internal data */

    MySmsType  type; // The type of the SMS to delete (SMS or SMS-CB)
    //May 27, 2005    MMI-FIX-29869 x0018858
#ifdef FF_MMI_SMS_DYNAMIC
    T_MFW_SMS_MSG *g_SmsMenu_messages;
#else
    T_MFW_SMS_MSG g_SmsMenu_messages[MAX_MESSAGES];
#endif
    T_MFW_HND   child_dialog;
} T_M_DEL_ALL;

typedef struct
{
    /* administrative data */

    T_MMI_CONTROL   mmi_control;
    T_MFW_HND       win;
    SHORT           id;
    T_MFW_HND       parent;

    /* associated handlers */

    T_MFW_HND       kbd;
    T_MFW_HND       kbd_long;
    T_MFW_HND       menu;
} T_V;


typedef struct
{
    /* administrative data */

    T_MMI_CONTROL   mmi_control;
    T_MFW_HND       win;
    SHORT           id;
    T_MFW_HND       parent;

    /* associated handlers */

    /* internal data */
    UBYTE voice_number_buffer[NUMBER_LENGTH];
} T_V_NUM;

static T_MFW_HND M_SND_SAV_create (T_MFW_HND parent);
static void M_SND_SAV_destroy (T_MFW_HND window);
static void M_SND_SAV_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int M_SND_SAV_win_cb (MfwEvt e, MfwWin *w);
static int M_SND_SAV_kbd_cb (MfwEvt e, MfwKbd *k);
static int M_SND_SAV_mnu_cb (MfwEvt e, MfwMnu *m);

static int ExeSms_sendM_SND_SAV(MfwMnu *, MfwMnuItem *);

static T_MFW_HND M_DEL_ALL_create (T_MFW_HND parent);
static void M_DEL_ALL_destroy (T_MFW_HND window);
static void M_DEL_ALL_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int M_DEL_ALL_mfw_cb (MfwEvt event, void *parameter);
static int M_DEL_ALL_win_cb (MfwEvt e, MfwWin *w);

static T_MFW_HND V_create (T_MFW_HND parent);
static void V_destroy (T_MFW_HND window);
static void V_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int V_win_cb (MfwEvt e, MfwWin *w);
static int V_kbd_cb (MfwEvt e, MfwKbd *k);
static int V_mnu_cb (MfwEvt e, MfwMnu *m);


/* SPR#1428 - SH - New Editor: not required */
#ifndef NEW_EDITOR
void SmsMenu_loadEditDefault(T_EDITOR_DATA *editor_data);
#endif

// State of the SMS menu management
T_SmsMenu_state g_SmsMenu_state = SMS_DISPLAY;
MfwHnd g_ChildWindow2;
UBYTE g_CenterNumber[NUMBER_LENGTH];
//Jul 13, 2004    REF: CRR 21615  Deepa M.D
UBYTE TempTextBuffer[MAX_MSG_LEN_ARRAY]; //Temporary buffer to store the SMS content

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

 $Function:     M_exeSendNew

 $Description:  This function is called when the user press Send in the
        main SMS menu.

 $Returns:    Execution status

 $Arguments:  m - menu handler
        i - Menu item selected

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

int M_exeSendNew(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND       win  = eZiTextWin;// SUMIT: mfwParent(mfw_header());
    T_SmsUserData   SmsData;

    /* Copy the number and name information to the SMS buffer
    */
    /*MC SPR 1257, clear whole buffer in case of Unicode entry*/

    /*SPR 2587, check that SMS has been initialised*/
    if (!smsidle_get_ready_state() || phb_get_mode() == PHB_LOADING)
    {
	mmi_dialog_information_screen(0, TxtPleaseWait, NULL, NULL, NULL);
	return 0;
    }
    //	Jul 13, 2004    REF: CRR 21615  Deepa M.D
    //  Copy the content from the temporary buffer into the editor,so that the
    //  previously typed content is retained.
#ifdef TI_PS_FF_CONC_SMS
    if(FFS_flashData.ConcatenateStatus == TRUE)
    {
	memset(SmsData.TextBuffer, '\0', MAX_MSG_LEN);
	memcpy(SmsData.TextBuffer, TempTextBuffer,MAX_MSG_LEN);
    }
    else
#endif /*TI_PS_FF_CONC_SMS*/
    {
	memset(SmsData.TextBuffer, '\0', MAX_MSG_LEN_SGL);
	//Copy only 160 characters ofthe message.
	memcpy(SmsData.TextBuffer, TempTextBuffer,MAX_MSG_LEN_SGL-1);
    }

    SmsData.NumberBuffer[0]='\0'; //set the number to null.
    SmsData.called_from_reply_item = FALSE;

    SmsSend_SEND_start(win, (void *) &SmsData);
    return 1;
}

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

 $Function:     M_exeRead

 $Description:  This function is called when the user press Read in the
          main SMS menu

 $Returns:    Execution status

 $Arguments:  m - menu handler
        i - Menu item selected

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

int M_exeRead(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND       win  = mfwParent(mfw_header());
    T_MFW_SMS_STAT  sms_list_type = MFW_SMS_ALL;

    /* Call the function that manages SMS reading */
    SmsRead_R_start(win, (MfwMnuAttr*)&sms_list_type);

    return 1;
}

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

 $Function:     M_exeDelAll

 $Description:  This function is called when the user press Delete all in the
          main SMS menu

 $Returns:    Execution status

 $Arguments:  m - menu handler
        i - Menu item selected

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

int M_exeDelAll(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND       win  = mfwParent(mfw_header());
    MySmsType sms_type;

    sms_type = SMS_TYPE;
    // Here we have to pass the type of sms to delete (SMS or SMS-CB)
    M_DEL_ALL_start(win, (void *)&sms_type);

    return 1;
}

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

 $Function:     M_exeSendSaved

 $Description:  This function is called when the user press Saved messages
          in the main SMS menu

 $Returns:    Execution status

 $Arguments:  m - menu handler
        i - Menu item selected

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

int M_exeSendSaved(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND       win  = mfwParent(mfw_header());

    M_SND_SAV_start(win, 0);

    return 1;
}


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

 $Function:     voice_mail_init

 $Description:  initialization the voice mail buffer

 $Returns:

 $Arguments:

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

int voice_mail_init (void)
{
  //nm, later have to read the voice mail number from FFS after switching-on the mobile

  //to clear the buffer is only temporary until we are able to save on Flash
  //memset(voice_mail, '\0', sizeof(voice_mail));

  return 1;
}


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

 $Function:     M_exeVoice

 $Description:  This function is called when the user press Voice Mail
          in the main SMS menu

 $Returns:    Execution status

 $Arguments:  m - menu handler
        i - Menu item selected

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

int M_exeVoice(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND win;

    T_MFW_HND     parent_window  = mfwParent(mfw_header());

    TRACE_FUNCTION ("M_exeVoice()");

    win = V_create (parent_window);

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


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

 $Function:     M_callVoice

 $Description:  This function is called when the user press set Voice Mail
          in the main SMS menu

 $Returns:    Execution status

 $Arguments:  m - menu handler
        i - Menu item selected

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

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

    TRACE_FUNCTION ("M_callVoice()");

    win = V_create (parent_win);

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

    return 1;
}


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

 $Function:     M_SND_SAV_start

 $Description:  Start the creation of the saved SMS menu window

 $Returns:    Execution status

 $Arguments:  parent_window - parent window
        menuAttr - Menu attributes.

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

T_MFW_HND M_SND_SAV_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr)
{
    T_MFW_HND win;

    TRACE_FUNCTION ("M_SND_SAV_start()");

    win = M_SND_SAV_create (parent_window);

    if (win NEQ NULL)
    {
	SEND_EVENT (win, E_INIT, M_SND_SAV_ID, (void *)menuAttr);
    }
    return win;
}

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

 $Function:     M_SND_SAV_create

 $Description:  Create the saved SMS menu window

 $Returns:    Execution status

 $Arguments:  parent_window - parent window

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

static T_MFW_HND M_SND_SAV_create(MfwHnd parent_window)
{
    T_M_SND_SAV      * data = (T_M_SND_SAV *)ALLOC_MEMORY (sizeof (T_M_SND_SAV));
    T_MFW_WIN  * win;

    TRACE_FUNCTION ("M_SND_SAV_create()");

    /*
     * Create window handler
     */

    data->win =
      win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)M_SND_SAV_win_cb);

    if (data->win EQ NULL)
    {
	return NULL;
    }

    /*
     * connect the dialog data to the MFW-window
     */
    data->mmi_control.dialog = (T_DIALOG_FUNC)M_SND_SAV_exec_cb;
    data->mmi_control.data   = data;
    win                      = ((T_MFW_HDR *)data->win)->data;
    win->user                = (void *)data;
    data->parent             = parent_window;

    /*
     * return window handle
     */

    return data->win;
}

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

 $Function:     M_SND_SAV_destroy

 $Description:  Destroy the saved SMS menu window

 $Returns:    none

 $Arguments:  own_window - current window

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

static void M_SND_SAV_destroy(MfwHnd own_window)
{
    T_MFW_WIN * win_data;
    T_M_SND_SAV     * data;

    TRACE_FUNCTION ("M_SND_SAV_destroy()");

    if (own_window)
    {
	win_data = ((T_MFW_HDR *)own_window)->data;
	data = (T_M_SND_SAV *)win_data->user;

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

	    /*
	     * Free Memory
	     */
	    FREE_MEMORY ((void *)data->user_data, sizeof (T_SmsUserData));
	    FREE_MEMORY ((void *)data, sizeof (T_M_SND_SAV));
	}
	else
	{
	    TRACE_EVENT ("M_SND_SAV_destroy() called twice");
	}
    }
}

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

 $Function:     M_SND_SAV_exec_cb

 $Description:  Exec callback for the saved SMS menu window

 $Returns:    none

 $Arguments:  win - current window
        event - window event id
        value - Unique Id
        parameter - optional data.

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

void M_SND_SAV_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
    /* callback handler for events sent to to trigger execution */
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    T_M_SND_SAV          * data = (T_M_SND_SAV *)win_data->user;
    T_MFW_HND      * l_parent;
    SHORT            l_id;

    TRACE_FUNCTION ("M_SND_SAV_exec_cb()");

    switch (event)
    {
    case E_INIT:
	/* initialization of administrative data */
	data->id = value;
	data->user_data = (T_SmsUserData *)ALLOC_MEMORY (sizeof (T_SmsUserData));
	/*MC SPR 1257, clear whole buffer in case of Unicode entry*/
#ifdef TI_PS_FF_CONC_SMS
	if(FFS_flashData.ConcatenateStatus == TRUE)
		memset( data->user_data->TextBuffer, '\0', MAX_MSG_LEN_SGL);
	else
#endif /*TI_PS_FF_CONC_SMS*/
	    memset( data->user_data->TextBuffer, '\0', MAX_MSG_LEN);
	data->user_data->NumberBuffer[0] = '\0';

	/* initialization of the dialog data */

	/* create the dialog handler */
	data->kbd =      kbdCreate(data->win,KEY_ALL,         (MfwCb)M_SND_SAV_kbd_cb);
	data->kbd_long = kbdCreate(data->win,KEY_ALL|KEY_LONG,(MfwCb)M_SND_SAV_kbd_cb);

	/* put the (new) dialog window on top of the window stack */
	mnuUnhide(data->menu);
	winShow(win);
	break;

    case E_ABORT:
    case E_EXIT:
	l_parent = data->parent;
	l_id = data->id;
	M_SND_SAV_destroy(data->win);
	SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
	break;

    case E_RETURN:
    default:
	return;
    }
}

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

 $Function:     M_SND_SAV_win_cb

 $Description:  Window callback for the saved SMS menu window

 $Returns:    Execution status

 $Arguments:  e - event id
        m - window handle

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

static int M_SND_SAV_win_cb (MfwEvt e, MfwWin *w)
    /* M_SND_SAV window event handler */
{
    TRACE_FUNCTION ("M_SND_SAV_win_cb()");

    switch (e)
    {
    case MfwWinVisible:  /* window is visible  */
	displaySoftKeys(TxtSoftSelect,TxtSoftBack);
	break;
    case MfwWinFocussed: /* input focus / selected   */
    case MfwWinDelete:   /* window will be deleted   */
    default:
	return MFW_EVENT_REJECTED;
    }
    return MFW_EVENT_CONSUMED;
}

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

 $Function:     M_SND_SAV_kbd_cb

 $Description:  Keyboard callback for the saved SMS menu window

 $Returns:    Execution status

 $Arguments:  e - event id
        k - keyboard info

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

static int M_SND_SAV_kbd_cb (MfwEvt e, MfwKbd *k)
    /* M_SND_SAV keyboard event handler */
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
    T_M_SND_SAV      * data = (T_M_SND_SAV *)win_data->user;

    TRACE_FUNCTION ("M_SND_SAV_kbd_cb()");

    if (e & KEY_LONG)
    {
	switch (k->code)
	{
	case KCD_HUP: /* back to previous menu */
		mnuEscape(data->menu);
		break;
	case KCD_RIGHT: /* Power Down */
		return MFW_EVENT_REJECTED; /* handled by idle */
	default: /* no response to all other keys */
		return MFW_EVENT_CONSUMED;
	}
    }
    else
    {
	switch (k->code)
	{
	case KCD_MNUUP: /* highlight previous entry */
		mnuUp(data->menu);
		winShow(win);
		break;
	case KCD_MNUDOWN: /* highlight next entry */
		mnuDown(data->menu);
		winShow(win);
		break;
	case KCD_LEFT: /* activate this entry */
		mnuSelect(data->menu);
		break;
	case KCD_HUP: /* back to previous menu */
	case KCD_RIGHT: /* back to previous menu */
		mnuEscape(data->menu);
		break;
	default: /* no response to all other keys */
		return MFW_EVENT_CONSUMED;
	}
    }
    return MFW_EVENT_CONSUMED;
}


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

 $Function:     M_DEL_ALL_start

 $Description:  Start the delete all window dialog.

 $Returns:    window handler

 $Arguments:  parent_window - parent window
        menuAttr - Menu attributes.

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

T_MFW_HND M_DEL_ALL_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr)
{
    T_MFW_HND win;

    TRACE_FUNCTION ("M_DEL_ALL_start()");

    win = M_DEL_ALL_create (parent_window);

    if (win NEQ NULL)
    {
	SEND_EVENT (win, E_INIT, M_DEL_ALL_ID, (void *)menuAttr);
    }
    return win;
}

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

 $Function:     M_DEL_ALL_create

 $Description:  Create the delete all window

 $Returns:    window handler

 $Arguments:  parent_window - parent window

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

static T_MFW_HND M_DEL_ALL_create(MfwHnd parent_window)
{
    T_M_DEL_ALL      * data = (T_M_DEL_ALL *)ALLOC_MEMORY (sizeof (T_M_DEL_ALL));
    T_MFW_WIN  * win;

    TRACE_FUNCTION ("M_DEL_ALL_create()");

    /*
     * Create window handler
     */

    data->win =
      win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)M_DEL_ALL_win_cb);

    if (data->win EQ NULL)
    {
	return NULL;
    }

    /*
     * connect the dialog data to the MFW-window
     */
    data->mmi_control.dialog = (T_DIALOG_FUNC)M_DEL_ALL_exec_cb;
    data->mmi_control.data   = data;
    win                      = ((T_MFW_HDR *)data->win)->data;
    win->user                = (void *)data;
    data->parent             = parent_window;

    /*
     * return window handle
     */

    return data->win;
}

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

 $Function:     M_DEL_ALL_destroy

 $Description:  Destroy the delete all window

 $Returns:    none

 $Arguments:  own_window - current window

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

static void M_DEL_ALL_destroy(MfwHnd own_window)
{
    T_MFW_WIN * win_data;
    T_M_DEL_ALL     * data;

    TRACE_FUNCTION ("M_DEL_ALL_destroy()");

    if (own_window)
    {
	win_data = ((T_MFW_HDR *)own_window)->data;
	data = (T_M_DEL_ALL *)win_data->user;

	if (data)
	{
	    /*
	     * Delete WIN handler
	     */

	    if  (data->waiting_win)
	    {
		SEND_EVENT(data->waiting_win,DIALOG_DESTROY,0,0 );
		data->waiting_win = 0;
	    }

	    win_delete (data->win);

	    /*
	     * Free Memory
	     */
	    FREE_MEMORY ((void *)data, sizeof (T_M_DEL_ALL));
	}
	else
	{
	    TRACE_EVENT ("M_DEL_ALL_destroy() called twice");
	}
    }
}

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

 $Function:     M_DEL_ALL_exec_cb

 $Description:  Exec callback function for the Delete All window

 $Returns:    none

 $Arguments:  win - current window
        event - event id
        value - Unique id
        parameter - optional data.

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

void M_DEL_ALL_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
    /* callback handler for events sent to to trigger execution */
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    T_M_DEL_ALL    * data = (T_M_DEL_ALL *)win_data->user;
    T_MFW_EVENT      MfwEvents;

    T_DISPLAY_DATA  DisplayInfo;

    TRACE_FUNCTION ("M_DEL_ALL_exec_cb()");

    switch (event)
    {
    case E_INIT:
	/* initialization of administrative data */
	data->id = value;

	/* initialization of the dialog data */
	data->type = (MySmsType)(int)parameter;  /* x0039928 - Lint warning fix */

	/*SPR2139, initialise sms handle to NULL*/
	data->sms_hnd = NULL;

	/* create the dialog handler */
	// Display the dialog window to delete all the SMS
	SmsMenu_loadDialogDefault(&DisplayInfo);

	//NM 29.8 Check before deleting, is SIM ready ?!  */
	if (!smsidle_get_ready_state())
	{
	    DisplayInfo.TextId     = TxtWaiting;
	    DisplayInfo.Identifier = SMSMENU_ID_NOTREADY;
	}
	else
	{
	    /*SPR 2139, if there are no SMSs on the SIM*/
	    if ( sms_message_count(MFW_SMS_ALL) == 0)
	    {	/*tell user*/
		DisplayInfo.TextId     = TxtEmptyList;
      		DisplayInfo.Identifier = SMSMENU_ID_NOMESSAGES;
	    }
	    else
	    { 	/*SPR 2139, only create an SMS event handler if sms initialised and sms list is not empty*/
		MfwEvents = E_SMS_MO_AVAIL | E_SMS_ERR | E_SMS_OK;
    		data->sms_hnd = sms_create(data->win,MfwEvents,(MfwCb)M_DEL_ALL_mfw_cb);

     	 	DisplayInfo.TextId       = TxtOkToDelete;
      		DisplayInfo.Time         = FIVE_SECS;
      		DisplayInfo.KeyEvents    = KEY_RIGHT|KEY_LEFT|KEY_CLEAR;
     		DisplayInfo.Identifier   = SMSMENU_ID_DELETEALL;
      		DisplayInfo.LeftSoftKey  = TxtSoftOK;
      		DisplayInfo.RightSoftKey = TxtSoftBack;
	    }
	}
	// Generic function for info messages

        (void) info_dialog(win, &DisplayInfo);

	winShow(win);

	break;

    case E_ABORT:
    case E_EXIT:
	M_DEL_ALL_destroy (data->win);
	break;

    case E_RETURN:
    default:
	return;
    }
}

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

 $Function:     M_DEL_ALL_win_cb

 $Description:  Window callback function for the delete all window

 $Returns:    none

 $Arguments:  e - current window
        w - event id

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

static int M_DEL_ALL_win_cb (MfwEvt e, MfwWin *w)
    /* V window event handler */
{
    TRACE_FUNCTION ("M_DEL_ALL_win_cb()");

    switch (e)
    {
    case MfwWinVisible:  /* window is visible  */
	displaySoftKeys(TxtSoftSelect,TxtSoftBack);
	break;
    case MfwWinFocussed: /* input focus / selected   */
    case MfwWinDelete:   /* window will be deleted   */
    default:
	return MFW_EVENT_REJECTED;
    }
    return MFW_EVENT_CONSUMED;
}

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

 $Function:     M_DEL_ALL_mfw_cb

 $Description:  Exec callback function for the DEL_ALL window

 $Returns:    none

 $Arguments:  event - event id
        parameter - optional data.

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

int M_DEL_ALL_mfw_cb (MfwEvt event, void *parameter)
{
    T_MFW_HND         win       = mfwParent((MfwHdr *)mfw_header());
    T_MFW_WIN   * win_data = ((T_MFW_HDR *)win)->data;
    T_M_DEL_ALL     * data = (T_M_DEL_ALL *)win_data->user;

  // T_MFW_EVENT       MfwEvents;  // RAVI

    T_DISPLAY_DATA DisplayInfo;

    TRACE_FUNCTION ("M_DEL_ALL_ACK_mfw_cb()");

    switch (event)
    {

    case E_SMS_ERR:

	g_SmsMenu_state = SMS_READY;

	SmsMenu_loadDialogDefault(&DisplayInfo);
	DisplayInfo.Identifier = SMSMENU_ID_DELERR;
	DisplayInfo.TextId     = TxtFailed;
	info_dialog(win,&DisplayInfo);
	break;

    case E_SMS_OK:

	TRACE_EVENT("Event: E_SMS_OK");

    //        March 31, 2005    REF: CRR MMI-SPR-24511   x0012852
    //  	 Check added for part message before deleting all messages.
    if((g_ListLength2 > 0) && (!((data->g_SmsMenu_messages[g_ListLength2-1].concat_status == MFW_SMS_CONC_PART)
     && (data->g_SmsMenu_messages[g_ListLength2-1].index == data->g_SmsMenu_messages[g_ListLength2-1].first_index)
     && (data->g_SmsMenu_messages[g_ListLength2-1].mem== data->g_SmsMenu_messages[g_ListLength2-1].first_mem) /*a0393213 OMAPS00109953*/
	)))
    {
   	  g_ListLength2--;
	  /*a0393213 OMAPS00109953 - memory passed as parameter*/
	  sms_msg_delete(data->g_SmsMenu_messages[g_ListLength2].index,data->g_SmsMenu_messages[g_ListLength2].mem);
    }
    else
    {

      /* there is now anymore sms to delete !! */
      g_SmsMenu_state = SMS_READY;

	/* cq16875 Destroy the previous info dialog if there is one before displaying the new dialog.
	    When a concatenated message is deleted using the "Delete All" menu option the E_SMS_OK
	    event is received for each Concat message part that is deleted.
	    12-02-04 MZ. */
	if(data->child_dialog != NULL)
	{
		SEND_EVENT (data->child_dialog, DIALOG_DESTROY, 0,NULL);
		data->child_dialog = NULL;
	}

      SmsMenu_loadDialogDefault(&DisplayInfo);
      DisplayInfo.Identifier = SMSMENU_ID_DELOK;
      DisplayInfo.TextId     = TxtDeleted;
	 /*SPR2139, removed sms_delete() from here, this is now donw in dialog callback*/
	 /*cq16875  Store the info dialog handler 12-02-04 MZ. */
       data->child_dialog = info_dialog(win,&DisplayInfo);
    }

    break;

  default:
      return MFW_EVENT_REJECTED;

  }
    return MFW_EVENT_CONSUMED;

}

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

 $Function:     V_start

 $Description:  Start the voice mailbox dialog window.

 $Returns:    window handle

 $Arguments:  parent_window - parent window handle
        menuAttr - Menu attributes

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

T_MFW_HND V_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr)
{
    T_MFW_HND win;

    TRACE_FUNCTION ("V_start()");

    win = V_create (parent_window);

    if (win NEQ NULL)
    {
	SEND_EVENT (win, E_INIT, V_ID_SET, (void *)menuAttr);
    }
    return win;
}

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

 $Function:     V_create

 $Description:  create the voice mailbox window

 $Returns:    window handle

 $Arguments:  parent_window - parent window handle

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

static T_MFW_HND V_create(MfwHnd parent_window)
{
    T_V      * data = (T_V *)ALLOC_MEMORY (sizeof (T_V));
    T_MFW_WIN  * win;

    TRACE_FUNCTION ("V_create()");

    /*
     * Create window handler
     */

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

    /*
     * connect the dialog data to the MFW-window
     */
    data->mmi_control.dialog = (T_DIALOG_FUNC)V_exec_cb;
    data->mmi_control.data   = data;
    win                      = ((T_MFW_HDR *)data->win)->data;
    win->user                = (void *)data;
    data->parent             = parent_window;

    /*
     * return window handle
     */

    return data->win;
}

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

 $Function:     V_destroy

 $Description:  Destroy the voice mailbox window

 $Returns:    none

 $Arguments:  own_window - current window

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

static void V_destroy(MfwHnd own_window)
{
    T_MFW_WIN * win_data;
    T_V     * data;

    TRACE_FUNCTION ("V_destroy()");

    if (own_window)
    {
	win_data = ((T_MFW_HDR *)own_window)->data;
	data = (T_V *)win_data->user;

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

	    /*
	     * Free Memory
	     */
	    FREE_MEMORY ((void *)data, sizeof (T_V));
	}
	else
	{
	    TRACE_FUNCTION ("V_destroy() called twice");
	}
    }
}

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

 $Function:     V_exec_cb

 $Description:  Exec callback function for the voice mailbox window

 $Returns:    none

 $Arguments:  win - current window
        event - event id
        value - Unique id
        parameter - optional data.

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

void V_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
    /* callback handler for events sent to to trigger execution */
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    T_V          * data = (T_V *)win_data->user;

 // char mail_alpha[10+1] = ""; // size hard coded in pcm.h   // RAVI

#ifdef NEW_EDITOR
    T_AUI_EDITOR_DATA editor_data;	/* SPR#1428 - SH - New Editor data */
#else
    T_EDITOR_DATA editor_data;
#endif

    TRACE_FUNCTION ("V_exec_cb()");

  switch (event)
  {
    // On exit from the editor, we try again to call the number
    case E_INIT:

      if ( (FFS_flashData.voice_mail[0] EQ '\0') || (value EQ V_ID_SET) )
      {
      /* initialization of administrative data */
      data->id = value;

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

#ifdef NEW_EDITOR
		AUI_edit_SetDefault(&editor_data);
		AUI_edit_SetDisplay(&editor_data, ZONE_FULL_SK_TITLE, COLOUR_EDITOR_XX, EDITOR_FONT);
		AUI_edit_SetEvents(&editor_data, value, TRUE, FOREVER, (T_AUI_EDIT_CB)SmsMenu_StandardEditor_cb);
		AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtVoiceMail, NULL); /* SPR#2141 - DS - Changed RSK to "Delete". */
		// Change by Sasken ( Deepa M.d) on March 29th 2004
		// Issue Number : MMI-SPR-12722
		// Subject: Right softkey should be "Back" when the editor is empty
		// Bug : Right softkey should be "Back" when the editor is empty
		// Solution : Added alternative string for the right softkey tobe displayed when the editor is empty

		AUI_edit_SetAltTextStr(&editor_data, 0, NULL, TRUE, TxtSoftBack);
		AUI_edit_SetMode(&editor_data, 0, ED_CURSOR_UNDERLINE);
		AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE *)FFS_flashData.voice_mail, PHB_MAX_LEN);

		 /* SPR#2141 - DS - Set RSK to "Back" when the editor is empty. */
             AUI_edit_SetAltTextStr(&editor_data, 1, NULL, TRUE, TxtSoftBack);

        	AUI_edit_Start(win, &editor_data);
#else /* NEW_EDITOR */
        SmsMenu_loadEditDefault(&editor_data);

        editor_data.editor_attr.text    = (char *)FFS_flashData.voice_mail;
        editor_data.editor_attr.size    = PHB_MAX_LEN;
        editor_data.TextId          = TxtVoiceMail;
        editor_data.LeftSoftKey       = TxtSoftOK;
		// Change by Sasken ( Deepa M.d) on March 29th 2004
		// Issue Number : MMI-SPR-12722
		// Subject: Right softkey should be "Back" when the editor is empty
		// Bug : Right softkey should be "Back" when the editor is empty
		// Solution : Added alternative string for the right softkey tobe displayed when the editor is empty

		editor_data.RightSoftKey         = TxtSoftBack;
        editor_data.Identifier        = value;

        editor_start(win,&editor_data);  /* start the editor */
#endif /* NEW_EDITOR */

        winShow(win);
      }
      else
      {
        if (value EQ V_ID_CALL)
        {
          callNumber(FFS_flashData.voice_mail);
          V_destroy(win);
        }
      }

      break;

    case E_ABORT:
        V_destroy(win);
        break;

    case E_RETURN:
    case E_EXIT:

    default:
        return;
  }
}

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

 $Function:     V_win_cb

 $Description:  Window callback function for the voice mailbox window

 $Returns:    Execution status

 $Arguments:  e - event id
        w - mfw window handle

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

static int V_win_cb (MfwEvt e, MfwWin *w)
    /* V window event handler */
{
    TRACE_FUNCTION ("V_win_cb()");

    switch (e)
    {
    case MfwWinVisible:  /* window is visible  */
	displaySoftKeys(TxtSoftSelect,TxtSoftBack);
	break;
    case MfwWinFocussed: /* input focus / selected   */
    case MfwWinDelete:   /* window will be deleted   */
    default:
	return MFW_EVENT_REJECTED;
    }
    return MFW_EVENT_CONSUMED;
}


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

 $Function:     SmsMenu_standard_dialog_cb

 $Description:  Handler function for standard dialogs in smsmenu module

 $Returns:    Execution status

 $Arguments:    win - current window
        Identifier - unique id
        Reason- event id

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

int SmsMenu_standard_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    T_M_DEL_ALL    * data = (T_M_DEL_ALL *)win_data->user;

    TRACE_FUNCTION ("SmsMenu_standard_dialog_cb()");

  switch (Identifier)
  {
  case SMSMENU_ID_DELETEALL:

    switch (Reason)
    {
    // User want to delete the SMS
    case INFO_KCD_LEFT:
      // Trigger the deletion
      SmsMenu_sms_delete_all(win);
      break;

    case INFO_KCD_RIGHT:
    case INFO_KCD_HUP:
    case INFO_TIMEOUT:
	  // API - 17-01-03 - 1571 - Add this call to sms_delete() to free memory
      sms_delete(data->sms_hnd);
	  data->sms_hnd = NULL;
      /* Destroy the owner of the dialog box */
      M_DEL_ALL_destroy(win);
      /* Send E_RETURN event to parent of M_DEL_ALL */
     /*SPR2139 removed the sending of a destroy event to parent window*/
      break;

    default:
      return MFW_EVENT_REJECTED;
    }
    break;
    /*SPR 2139, if no messages or sms not initialised, just destroy the delete all window*/
  case SMSMENU_ID_NOMESSAGES:
  case SMSMENU_ID_NOTREADY:
  	    M_DEL_ALL_destroy(win);
    break;

  case SMSMENU_ID_DELOK:
  case SMSMENU_ID_DELERR:
/*SPR2139 Add this call to sms_delete() to free memory*/
      sms_delete(data->sms_hnd);
	  data->sms_hnd = NULL;
    /* Destroy the owner of the dialog box */
    M_DEL_ALL_destroy(win);
    break;

  case SMSMENU_ID_WAIT:
    // No reaction to any event (wait to be destroyed when MFW event received)
    break;

  default:
    return MFW_EVENT_REJECTED;
  }
  return MFW_EVENT_CONSUMED;
}


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

 $Function:     SmsMenu_loadDialogDefault

 $Description:  Loads standard default data for SMS information dialogs.

 $Returns:    Execution status

 $Arguments:    DisplayInfo - display settings

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

void SmsMenu_loadDialogDefault(T_DISPLAY_DATA * DisplayInfo)
{
	dlg_initDisplayData_TextId( DisplayInfo, TxtNull, TxtNull, TxtNull,  TxtNull, COLOUR_STATUS);
	dlg_initDisplayData_events( DisplayInfo, (T_VOID_FUNC)SmsMenu_standard_dialog_cb, THREE_SECS, KEY_CLEAR);
	DisplayInfo->Identifier   = DIALOGS_REASON_NULL;
}


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

 $Function:     SmsMenu_call_voice

 $Description:  dummy function.

 $Returns:    none

 $Arguments:    none

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

void SmsMenu_call_voice(void)
{
    TRACE_FUNCTION ("call_voice");
}

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

 $Function:     SmsMenu_startcall

 $Description:  dummy function.

 $Returns:    Execution status

 $Arguments:    DisplayInfo - display settings

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

void SmsMenu_startcall(UBYTE * VoiceNumber)
{
    TRACE_FUNCTION ("startcall");
}

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

 $Function:     SmsMenu_sms_delete_all

 $Description:  Delete all SMS messages.

 $Returns:    Execution status

 $Arguments:    win - current window.

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

int SmsMenu_sms_delete_all(T_MFW_HND win)
{
    //T_MFW_HND  win  = mfw_parent (mfw_header());
    //  T_DISPLAY_DATA DisplayInfo;
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    T_M_DEL_ALL    * data = (T_M_DEL_ALL *)win_data->user;

    TRACE_FUNCTION("SmsMenu_sms_delete_all()");
    //May 27, 2005    MMI-FIX-29869 x0018858
#ifdef FF_MMI_SMS_DYNAMIC
	data->g_SmsMenu_messages = (T_MFW_SMS_MSG*)ALLOC_MEMORY (g_max_messages * sizeof(T_MFW_SMS_MSG)  );
	g_ListLength2 = sms_message_list(MFW_SMS_ALL, data->g_SmsMenu_messages, g_max_messages);
#else
    g_ListLength2 = sms_message_list(MFW_SMS_ALL, data->g_SmsMenu_messages, MAX_MESSAGES);
#endif
    //NM 22.8 msgsLoadInfoDefaults2(&DisplayInfo);

    if (g_ListLength2 > 0)
    {
    	/* Display "Please wait" on the screen*/
    	/* it is start now to delete sms*/
   	/* SPR 2139, Removed call to dialog handler, as not needed*/

	// Feb 24, 2005 REF: CRR MMI-SPR-29102 xnkulkar
	// As the user has already confirmed that all SMS messages are to be deleted, ''End All' key
	// press is to be ignored. Call function mmi_dialog_information_screen_delete_all() instead of
	// mmi_dialog_information_screen_forever().

	// data->waiting_win = mmi_dialog_information_screen_forever(win,TxtPleaseWait, NULL, COLOUR_STATUS_WAIT);

	data->waiting_win = mmi_dialog_information_screen_delete_all(win,TxtPleaseWait, NULL, COLOUR_STATUS_WAIT);

	/* delete now the first sms and than wait */
      	/* for the MFW EVENT "E_SMS_OK"           */

    	g_ListLength2 --;
	/*a0393213 OMAPS00109953 - memory passed as parameter*/
    	sms_msg_delete(data->g_SmsMenu_messages[g_ListLength2].index,data->g_SmsMenu_messages[g_ListLength2].mem);
    }

    //May 27, 2005    MMI-FIX-29869 x0018858
#ifdef FF_MMI_SMS_DYNAMIC
    if (g_ListLength2 == 0)
	FREE_MEMORY((U8*)data->g_SmsMenu_messages, g_max_messages * sizeof(T_MFW_SMS_MSG));
#endif
    /*SPR 2139, don't need "else" as empty list case handled earlier*/
    return 1;
}

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

 $Function:     SmsRead_convertMailbox

 $Description:

 $Returns:

 $Arguments:

*******************************************************************************/
UBYTE SmsRead_convertMailbox(T_MFW_MAILBOX_ID i, char *mail_number, char *mail_alpha)
{
//  USHORT max_rcd;  // RAVI
    USHORT nlen;

    char *international = mail_number; // Used to add '+' to the number if international

    TRACE_FUNCTION ("SmsRead_convertMailbox()");

    // If international number, add the '+' symbol
    if (FFS_flashData.mbn_numTp & 0x10)
    {
      international[0] = '+';
      international[1] = '\0';
      international ++;
    }
    // Convert BCD number into string
    cmhPHB_getAdrStr(international, PHB_MAX_LEN - 1, FFS_flashData.mbn_Num, FFS_flashData.mbn_len);

    // If the same number then we get the alpha identifier
    cmhPHB_getMfwTagNt((UBYTE*)FFS_flashData.mbn_AlphId, 10, (UBYTE*)mail_alpha, &nlen);

    mail_alpha[nlen] = '\0';

    return TRUE;
}

static void SmsMenu_StandardEditor_cb (T_MFW_HND win, USHORT Identifier, SHORT reason)
{
 // T_MFW_WIN   * win_data = ((T_MFW_HDR *) win)->data;   // RAVI
//  T_V     * voice_data = (T_V *)win_data->user; // RAVI

  TRACE_FUNCTION ("SmsMenu_StandardEditor_cb()"); //Marcus: Issue 1490: 13/12/2002

  switch (reason)
  {
    case INFO_KCD_LEFT:

      if (Identifier EQ V_ID_CALL )
      {
        callNumber(FFS_flashData.voice_mail);
        flash_write(); /*SPR#1929 - DS - Store voicemail number in flash. Port of 1888 */
      }
      /* Marcus: Issue 1490: 13/12/2002: Start */
      else if (Identifier EQ V_ID_SET)
      {
      	  /*
      	  ** There is no need to copy the value entered into FFS_flashData.voicemail as the editor
      	  ** has already put the value there.
      	  */
  	  flash_write();
      }
      /* Marcus: Issue 1490: 13/12/2002: End */
      V_destroy(win);
      break;

    case INFO_KCD_RIGHT:
    case INFO_KCD_CLEAR:
    case INFO_KCD_HUP:
    V_destroy(win);
    default:
      break;
  }
}

#ifdef TI_PS_FF_CONC_SMS
/*******************************************************************************

 $Function:     Concatenate_Status

 $Description:  Displays the Concatenation Satus

 $Returns:    MFW_EVENT_CONSUMED.

 $Arguments:  None.

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

int Concatenate_Status(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND win = mfwParent(mfw_header());

	USHORT TextId2;

	// change by Sasken on March 24th 2004
	// Issue Number : SPR#15746
	// TextId2 string changed to TxtActivated from TxtActivate

	if (FFS_flashData.ConcatenateStatus ==  TRUE )
		TextId2    = TxtActivated;
	else
		TextId2    = TxtDeActivated;

	/*
	** Display a standard dialog, with no keys processed, for 3 secs
	*/
	info_screen(win, TxtConcat, TextId2, (T_VOID_FUNC) NULL);

	return MFW_EVENT_CONSUMED;
}


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

 $Function:     ConcatenateDeActivate

 $Description:  Deactivates the Concatenation Switch

 $Returns:    MFW_EVENT_CONSUMED.

 $Arguments:  None.

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

int Concatenate_DeActivate(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND win = mfwParent(mfw_header());
//	T_DISPLAY_DATA display_info;   // RAVI

	FFS_flashData.ConcatenateStatus =  FALSE;
	flash_write();

	/*
	** Display a standard dialog, with no keys processed, for 3 secs
	*/
	info_screen(win, TxtConcat, TxtDeActivated, (T_VOID_FUNC) NULL);

	return MFW_EVENT_CONSUMED;
}


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

 $Function:     ConcatenateActivate

 $Description:  Deactivates the Concatenation Switch

 $Returns:    MFW_EVENT_CONSUMED.

 $Arguments:  None.

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

int Concatenate_Activate(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND win = mfwParent(mfw_header());
//	T_DISPLAY_DATA display_info;   // RAVI

	FFS_flashData.ConcatenateStatus =  TRUE;
	flash_write();

	/*
	** Display a standard dialog, with no keys processed, for 3 secs
	*/
	info_screen(win, TxtConcat, TxtActivated, (T_VOID_FUNC) NULL);

	return MFW_EVENT_CONSUMED;
}
#endif /*TI_PS_FF_CONC_SMS*/

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

 $Function:     ConcatenateDisplay

 $Description:  Returns the status whether to display the menu item or not

 $Returns:    .

 $Arguments:  None.

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

USHORT ConcatenateDisplay( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{
#ifdef TI_PS_FF_CONC_SMS
  return 0;
#else /*TI_PS_FF_CONC_SMS*/
  return 1;
#endif /*TI_PS_FF_CONC_SMS*/
}
#undef MMI_SMSMENU_C