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

					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:		    MmiSmsSend.c
 $Revision:		1.0                                                       
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		    25/10/00                                                      
                                                                               
********************************************************************************
                                                                              
 Description:
 
    Implementation template for MMI yyy dynamic menu handling
                        
********************************************************************************


 $History: MmiSmsSend.c

	Jan 18, 2006      REF: OMAPS00049169 x0pleela
	Description:  MS sends SMS with RP wrong destination address. Anite TC 34.2.8 was failing.
	Solution: Removed the code where global variable reply_path_bit was reset to 0 in function 
	SmsSend_SEND_mfw_cb(), switch case E_SMS_MO_AVAIL
	
       March 2, 2005    REF: CRR 11536 x0018858
       Description: Reply path not supported while sending a reply.
       Solution: Added menu option for the reply path.

	Feb 02, 2005   REF: CRR 28479   xnkulkar
	Bug: While saving a SMS, if the user presses LSK while the 'Saved' dialog is displayed, the 'Saved' 
	dialog doesn't get dismissed.
	Solution: Only RSK and Hangup keys dismiss the 'Saved' info screen and all other key presses 
       are ignored. 
	              
	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

	Aug 16, 2004    REF: CRR 24281  Deepa M.D 
	Bug:Go-lite  Optimization  Remove the unsed variable  temp_conv_buffer
	Fix:Removed the unused  variable static UBYTE temp_conv_buffer[MAX_MSG_LEN_ARRAY].


    Sep 01, 2004    REF: CRR 21380  Deepa M.D 
	Bug:Not getting proper display, When Messages Memory is Full.
	Fix:A new Dialog displaying "Full Not Saved" will be displayed,
	when memory is full and saving a message fails.




	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 into the 
	Editor back.

	25/10/00			Original Condat(UK) BMI version.	
	   
 $End

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

#define MMI_SMSSEND_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"
#include "mfw_kbd.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "ksd.h"
#include "psa.h"
#include "mfw_sms.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_lng.h"
#include "mfw_sat.h"
#include "mfw_kbd.h"
#include "mfw_nm.h"
#include "mfw_str.h"

#include "dspl.h"

#include "MmiMain.h"
#include "MmiDummy.h"
#include "MmiMmi.h"
#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiMenu.h"
#include "MmiSoftKeys.h"
#include "phb.h"      /* FDN  */
#include "MmiBookUtils.h"
#include "MmiBookShared.h"
#include "mmiSmsMenu.h"
#include "mmismssend.h"
#include "mmiSmsIdle.h"
#include "mmiSat_i.h"
#include "mfw_ffs.h"
#ifdef EASY_TEXT_ENABLED
#include "MmiChineseInput.h"
#endif
/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"
#else /* NEW_EDITOR */
#ifdef EASY_TEXT_ENABLED
#include "MmiLatinPredText.h"
#endif /* EASY_TEXT_ENABLED */
#include "MmiEditor.h"
#endif /* NEW_EDITOR */

#include "cus_aci.h"

#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif


#include "mmiColours.h"

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

				 DYNAMIC MENU WINDOW. DECLARATION

*********************************************************************
**********************************************************************/
/* MZ 10202, 10758   */
static UBYTE* msgBuffer = NULL;

/* General functions */
static void SmsSend_NBEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason);
static int  SmsSend_standard_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason);
/* SPR#1428 - SH - New Editor: no longer required */
#ifndef NEW_EDITOR
void		SmsSend_loadEditDefault(T_EDITOR_DATA * edit_info);
static void SmsSend_loadUCS2EditDefault(T_EDITOR_DATA *editor_data);
#endif

/* prototyps */
static T_MFW_HND SmsSend_SEND_create  (T_MFW_HND parent);
static void      SmsSend_SEND_destroy (T_MFW_HND window);

// Main callback function of the frame window
static void      SmsSend_main_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
// Sub-callback functions of the frame window associated to the different emitters
static void      SmsSend_SEND_exec_cb (T_MFW_HND win, USHORT event, void * parameter);
static void      SmsSend_PHBK_exec_cb (T_MFW_HND win, USHORT event, void * parameter);
static void      SmsSend_TEXTEDIT_exec_cb (T_MFW_HND win, USHORT event, void * parameter);
static void      SmsSend_NBEDIT_exec_cb (T_MFW_HND win, USHORT event, void * parameter);
static void      SmsSend_CENTREEDIT_exec_cb (T_MFW_HND win, USHORT event, void * parameter);

// Callback functions of the various editors
static void		SmsSend_TEXTEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason);
static void		SmsSend_NBEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason);
static void		SmsSend_CENTREEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason);

// Callback function for the MFW events
static int       SmsSend_SEND_mfw_cb  (MfwEvt event, void *data);

// This function initiate the sending of the SMS
static int       SmsSend_send_to_mfw    (T_MFW_HND win);
static T_MFW_HND parentWindow4SMS;

UBYTE SmsSend_set_SrvCntr_number (T_MFW_SMS_INFO *config_data);
UBYTE SmsSend_set_dcs_number (T_MFW_SMS_INFO *config_data);
//Jul 13, 2004    REF: CRR 21615  Deepa M.D 
extern UBYTE TempTextBuffer[MAX_MSG_LEN_ARRAY];

extern UBYTE reply_path_bit ;

/***************************************************
****											****
****		MANAGEMENT OF SMS OPTIONS			****
****											****
***************************************************/


typedef struct
{
    /* administrative data */

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

    /* associated handlers */

    /* !!! **************************************** modify here **************************************** !!!*/
    T_MFW_HND       kbd;
    T_MFW_HND       kbd_long;
    T_MFW_HND       menu;
    /* !!! **************************************** end modify here **************************************** !!! */

    /* internal data */

    /* !!! **************************************** modify here **************************************** !!!*/
    BOOL            answer; /* TRUE == YES, FALSE == NO */
	T_MFW_HND		sms;
    T_MFW_HND       dialog_win;
	T_SEND			*parent_data;
/* !!! **************************************** end modify here **************************************** !!! */
} T_SMSSEND_R_OPT;

typedef struct
{
	/* administrative data */

	T_MMI_CONTROL   mmi_control;
	T_MFW_HND       win;
	T_MFW_HND       parent;
	T_MFW_HND       child_dialog;/* to keep the window of dialog          */    
	T_MFW_HND       sms_handler;
	SHORT           id;
	/*SPR1991, removed edt_data: not needed*/
	   					/* will call from idle or phonebook  */
} T_SAVE;

static T_MFW_HND	SmsSend_SAVE_create  (T_MFW_HND parent);
static void				SmsSend_SAVE_destroy (T_MFW_HND window);
static void				SmsSend_SAVE_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int				SmsSend_SAVE_mfw_cb (MfwEvt event, void *info);

static T_MFW_HND SmsSend_R_OPT_create (T_MFW_HND parent);
static void SmsSend_R_OPT_destroy (T_MFW_HND window);
static void SmsSend_R_OPT_StandardDialog(T_MFW_HND win, char *text, ULONG duration);
static void SmsSend_R_OPT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int SmsSend_R_OPT_win_cb (MfwEvt e, MfwWin *w);
static int SmsSend_R_OPT_mfw_cb (MfwEvt event, void *parameter);
T_MFW_HND SmsSend_OPT_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr);
static int SmsSend_R_OPT_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason);
static void SmsSend_SCNBEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason);
/* !!! **************************************** modify here **************************************** !!!*/
static int SmsSend_R_OPT_kbd_cb (MfwEvt e, MfwKbd *k);
static int SmsSend_R_OPT_mnu_cb (MfwEvt e, MfwMnu *m);
//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
static UBYTE memfull=FALSE; //Variable used check whether E_SMS_MEM_FULL event has been received.
/* !!! **************************************** end modify here **************************************** !!! */



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

			     DYNAMIC MENU WINDOW. CONTENTS DECLARATION

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

/* !!! **************************************** modify here **************************************** !!!*/

static int SmsSend_R_OPTExeSave(MfwMnu* m, MfwMnuItem* i);
static int SmsSend_R_OPTExeSend(MfwMnu* m, MfwMnuItem* i);
static int SmsSend_R_OPTExeDiscard(MfwMnu* m, MfwMnuItem* i);

static const MfwMnuItem SmsSend_R_OPTItems [] =
{
    {0,0,0,(char *)TxtSave,0,(MenuFunc)SmsSend_R_OPTExeSave,item_flag_none},
    {0,0,0,(char *)TxtSend,0,(MenuFunc)SmsSend_R_OPTExeSend,item_flag_none},
    {0,0,0,(char *)TxtDiscard,0,(MenuFunc)SmsSend_R_OPTExeDiscard,item_flag_none}
};

static const MfwMnuAttr SmsSend_R_OPTAttrib =
{
    &SmsSend_R_OPTArea,
    MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu       */
    -1,                                 /* use default font         */
    (MfwMnuItem*)SmsSend_R_OPTItems,                      /* with these items         */
    sizeof(SmsSend_R_OPTItems)/sizeof(MfwMnuItem), /* number of items     */
    COLOUR_LIST_SMS,	TxtNull, NULL, MNUATTRSPARE

};


/*JVJ SPR1298 added a new output parameter to avoid stack overload */
void convertToUnicodeForOutput( UBYTE * ipText,UBYTE* outText, USHORT* outLen)
{

	int i;
    UBYTE* temp_conv_buffer = outText;

	if (ipText[0] == 0x80) 
	{	//skip first 2 chars
		*outLen = 0;
		for (i=0;i<MAX_MSG_LEN/2;i++)
		{	/*SPR 2175, bytes should not be swapped*/
			temp_conv_buffer[i*2+1] =  ipText[i*2+2+1];
			temp_conv_buffer[i*2] =ipText[i*2+2];




			if ((*outLen ==0) && 
				(temp_conv_buffer[i*2] == 0x00) && 
				(temp_conv_buffer[i*2+1] == 0x00))
				*outLen = i*2+2;
		}
		if (*outLen == 0)
		{//Reached end of message without finding 0x0000 - set last word to 0x0000
			*outLen = MAX_MSG_LEN;
			temp_conv_buffer[MAX_MSG_LEN-2] = 0x00;
			temp_conv_buffer[MAX_MSG_LEN-1] = 0x00;


		}
		return;

	}
	else
	{	
		*outLen = strlen((char*)ipText);
		/*MC SPR1319, use string's actual length to convert to GSM alphabet*/
		/*SPR2175, use new function for conversion*/
		ATB_convert_String((char*)ipText, MFW_ASCII, *outLen, (char*)temp_conv_buffer, MFW_DCS_8bits,MAX_MSG_LEN , FALSE);
		return;
	}
}

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

 $Function:    	SmsSend_R_OPTExeSend

 $Description:	Start the creation of the main window for SMS Send.
 
 $Returns:		none

 $Arguments:	m - Menu handle
 				i - Menu item selected.
 
*******************************************************************************/

static int SmsSend_R_OPTExeSend(MfwMnu* m, MfwMnuItem* i)
{	
    T_MFW_HND     	   win      = mfwParent(mfw_header());
    T_MFW_WIN        * win_data = ((T_MFW_HDR *)win)->data;
    T_SMSSEND_R_OPT  * data     = (T_SMSSEND_R_OPT *)win_data->user;
	/* access to data from parent   */
    T_SEND  * parent_data =  (T_SEND *)data->parent_data;

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

	TRACE_EVENT("SmsSend_R_OPTExeSend");
	/* SPR#1428 - SH - New Editor changes */
#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, SMSSEND_ID_NBEDIT, FALSE, FOREVER, (T_AUI_EDIT_CB)SmsSend_NBEDIT_edit_cb);
			AUI_edit_SetTextStr(&editor_data, TxtSend, TxtDelete, TxtSmsEnterNumber, NULL);
			AUI_edit_SetAltTextStr(&editor_data, 1, TxtNames, TRUE, TxtSoftBack);
			AUI_edit_SetMode(&editor_data, 0, ED_CURSOR_UNDERLINE);
			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, parent_data->edt_data.NumberBuffer, PHB_MAX_LEN);
			parent_data->number_editor = AUI_edit_Start(parent_data->win, &editor_data);
#else /* NEW_EDITOR */

			SmsSend_loadEditDefault(&editor_data);

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

			editor_data.editor_attr.size     = PHB_MAX_LEN; 

			editor_data.TextId               = TxtSmsEnterNumber;  				 							  
			editor_data.LeftSoftKey          = TxtSend;
			editor_data.AlternateLeftSoftKey = TxtNames;
			editor_data.RightSoftKey         = TxtDelete;
			editor_data.Identifier           = SMSSEND_ID_NBEDIT ; 
			editor_data.mode				 = E_EDIT_DIGITS_MODE;
			editor_data.Callback             = (T_EDIT_CB)SmsSend_NBEDIT_edit_cb;
			editor_data.destroyEditor		 = FALSE;
			parent_data->number_editor = editor_start(parent_data->win, &editor_data);  /* start the editor */ 
#endif /* NEW_EDITOR */
	return 1;  // ADDED BY RAVI - 28-11-2005

}

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

 $Function:    	SmsSend_R_OPTExeDiscard

 $Description:	
 
 $Returns:		execution status

 $Arguments:	m - Menu handle
 				i - Menu item selected.
 
*******************************************************************************/

static int SmsSend_R_OPTExeDiscard(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND     	   win      = mfwParent(mfw_header());
    T_MFW_WIN        * win_data = ((T_MFW_HDR *)win)->data;
    T_SMSSEND_R_OPT  * data     = (T_SMSSEND_R_OPT *)win_data->user;
	/* access to data from parent   */
    T_SEND  * parent_data =  (T_SEND *)data->parent_data;

	TRACE_EVENT("SmsSend_R_OPTExeDiscard");

	SmsSend_R_OPT_destroy(parent_data->options_win);
#if	defined(CHINESE_MMI) && defined(EASY_TEXT_ENABLED)
	 if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
	 	chinese_input_destroy(parent_data->text_editor);
	 else
#endif
	/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
	AUI_edit_Destroy(parent_data->text_editor);
#else /* NEW_EDITOR */
	editor_destroy(parent_data->text_editor);
#endif /* NEW_EDITOR */
/*SPR2453  check memory allocated before deallocating it */
	  	if (msgBuffer !=NULL)
		{ FREE_MEMORY((void*)msgBuffer,MAX_MSG_LEN_ARRAY);
		  msgBuffer = NULL;
	  	}
	parent_data->text_editor = 0;
	SmsSend_SEND_destroy(parent_data->win);

	
	return 1;
}


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

 $Function:    	SmsSend_R_OPTExeSave

 $Description:	called when the user press Call sender in the Option menu
 
 $Returns:		execution status

 $Arguments:	m - Menu handle
 				i - Menu item selected.
 
*******************************************************************************/

static int SmsSend_R_OPTExeSave(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND       win  = mfwParent(mfw_header());
    T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
    T_SMSSEND_R_OPT         * data = (T_SMSSEND_R_OPT *)win_data->user;

	TRACE_EVENT("SmsRead_R_OPTExeCallSender");

			if (!smsidle_get_ready_state())
			{
				// SMS init processing not ready to access SIM to store the SMS
				mmi_dialog_information_screen(win, 0,"Not Ready", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_SAVE_NOT_READY);
				// Recreate the editor on dialog callback
			}
			else
				//END TB
				// Start a save window and provide it a T_SmsUserData structure (in the future, will allow to save easily text but also number...)
			{
				SmsSend_SAVE_start(data->parent_data->win, &(data->parent_data->edt_data));
				SmsSend_R_OPT_destroy(win);
			}
    return 1;
}

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

 $Function:    	SmsSend_OPT_start

 $Description:	called when the user press Call sender in the Option menu
 
 $Returns:		execution status

 $Arguments:	parent_window -parent window handle
 				menuAttr - Menu attributes.
 
*******************************************************************************/

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

    TRACE_FUNCTION ("SmsSend_OPT_start()");

    win = SmsSend_R_OPT_create (parent_window);

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

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

 $Function:    	SmsSend_R_OPT_create

 $Description:	Create the Option window
 
 $Returns:		mfw window handle

 $Arguments:	parent_window -parent window handle
 			
*******************************************************************************/

static T_MFW_HND SmsSend_R_OPT_create(MfwHnd parent_window)
{
    T_SMSSEND_R_OPT      * data = (T_SMSSEND_R_OPT *)ALLOC_MEMORY (sizeof (T_SMSSEND_R_OPT));
    T_MFW_WIN  * win;

    TRACE_FUNCTION ("SmsSend_R_OPT_create()");

    /*
     * Create window handler
     */

    data->win = 
	win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)SmsSend_R_OPT_win_cb);
    if (data->win EQ NULL)
	{
	    return NULL;
	}
    /* 
     * connect the dialog data to the MFW-window
     */

    data->mmi_control.dialog = (T_DIALOG_FUNC)SmsSend_R_OPT_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:    	SmsSend_R_OPT_destroy

 $Description:	Destroy the Option window
 
 $Returns:		mfw window handle

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

static void SmsSend_R_OPT_destroy(MfwHnd own_window)
{
    T_MFW_WIN * win_data;
    T_SMSSEND_R_OPT     * data;

    TRACE_FUNCTION ("SmsSend_R_OPT_destroy()");

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

	    if (data)
		{
		    /*
		     * Delete WIN handler
		     */ 
			data->parent_data->options_win = 0;
		    win_delete (data->win);

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

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

 $Function:    	SmsSend_R_OPT_exec_cb

 $Description:	Exec callback function for the Option window
 
 $Returns:		none

 $Arguments:	win - current window
 				event - event id
 				value - unique id
 				parameter - optional data.
 			
*******************************************************************************/

void SmsSend_R_OPT_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_SMSSEND_R_OPT  * data     = (T_SMSSEND_R_OPT *)win_data->user;
//    T_MFW_HND      * l_parent;   // RAVI
 //   SHORT            l_id;              // RAVI
    T_MFW_HDR    * parent      =  data->parent;
   	T_MFW_WIN    * win_data2   =  ((T_MFW_HDR *)parent)->data;
    T_SEND  * parent_data =  (T_SEND *)win_data2->user;

//	T_MFW_EVENT         MfwEvents;   // RAVI
	
    TRACE_FUNCTION ("SmsSend_R_OPT_exec_cb()");


    switch (event)
	{
	case E_INIT:
		
		TRACE_EVENT("SmsSend_R_OPT_exec_cb() Event:5.E_INIT");
	    /* initialization of administrative data */
		data->parent_data = parent_data;		
	    data->id = value;
		data->kbd =      kbdCreate(data->win,KEY_ALL,         (MfwCb)SmsSend_R_OPT_kbd_cb);
    	data->kbd_long = kbdCreate(data->win,KEY_ALL|KEY_LONG,(MfwCb)SmsSend_R_OPT_kbd_cb);
    	data->menu =     mnuCreate(data->win,(MfwMnuAttr*)&SmsSend_R_OPTAttrib, E_MNU_ESCAPE, (MfwCb)SmsSend_R_OPT_mnu_cb);
    	mnuLang(data->menu,mainMmiLng);
    	/* put the (new) dialog window on top of the window stack */
    	mnuUnhide(data->menu);
  	    	winShow(win);
	    break;
	default:
	    return;
	}
}

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

 $Function:    	SmsSend_R_OPT_mnu_cb

 $Description:	Menu callback function for the Option window
 
 $Returns:		none

 $Arguments:	e - event id
 				m - menu handle
*******************************************************************************/

static int SmsSend_R_OPT_mnu_cb (MfwEvt e, MfwMnu *m)
    
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
    T_SMSSEND_R_OPT      * data = (T_SMSSEND_R_OPT *)win_data->user;
//    T_MFW_HND  * l_parent;   // RAVI
//    SHORT        l_id;		    // RAVI	

    TRACE_FUNCTION ("SmsRead_R_OPT_mnu_cb()");

    switch (e)
        {
	case E_MNU_ESCAPE: /* back to previous menu */
	    SmsSend_R_OPT_destroy(data->win);
	    break;
	default: /* in mnuCreate() only E_MNU_ESCAPE has been enabled! */
	    return MFW_EVENT_REJECTED;
        }
    return MFW_EVENT_CONSUMED;
}

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

 $Function:    	SmsSend_R_OPT_win_cb

 $Description:	Window callback function for the Option window
 
 $Returns:		execution status

 $Arguments:	e - event id
 				w - window handle 
*******************************************************************************/

static int SmsSend_R_OPT_win_cb (MfwEvt e, MfwWin *w)
{
    TRACE_FUNCTION ("SmsSend_R_OPT_win_cb()");

    switch (e)
	{
        case MfwWinVisible:  /* window is visible  */
		dspl_ClearAll();
	    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:    	SmsSend_R_OPT_kbd_cb

 $Description:	Exec callback function for the Option window
 
 $Returns:		execution status

 $Arguments:	e - event id
 				k - keyboard info
*******************************************************************************/

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

    TRACE_FUNCTION ("SmsSend_R_OPT_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);
		    break;
		case KCD_MNUDOWN: /* highlight next entry */
		    mnuDown(data->menu);
		    break;
		case KCD_MNUSELECT:
		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:    	SmsSend_SEND_start

 $Description:	Create SMS send window
 
 $Returns:		execution status

 $Arguments:	parent_window - parent window.
 				UserData - SMS data
*******************************************************************************/

T_MFW_HND SmsSend_SEND_start(T_MFW_HND parent_window, T_SmsUserData *UserData)
{
	T_MFW_HND win;

	TRACE_FUNCTION ("SmsSend_SEND_start()");
	parentWindow4SMS = parent_window;
	win = SmsSend_SEND_create (parent_window);

	if (win NEQ NULL)
	{
		SEND_EVENT (win, E_INIT, SEND_ID, (void *)UserData);
	}
	return win;
}

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

 $Function:    	SmsSend_SEND_create

 $Description:	Create a window for entering the text
 
 $Returns:		window handle

 $Arguments:	parent_window - parent window.
 				
*******************************************************************************/

static T_MFW_HND SmsSend_SEND_create(MfwHnd parent_window)
{
	T_SEND     * data = (T_SEND *)ALLOC_MEMORY (sizeof (T_SEND));
	T_MFW_WIN  * win;

	TRACE_FUNCTION ("SmsSend_SEND_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)SmsSend_main_exec_cb;
	data->mmi_control.data   = data;
	win                      = ((T_MFW_HDR *)data->win)->data;
	win->user                = (MfwUserDataPtr)data;
	data->parent             = parent_window;
	data->id								 = SEND_ID;

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

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

 $Function:    	SmsSend_SEND_destroy

 $Description:	Destroy the windows for entering the text
 
 $Returns:		none

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

static void SmsSend_SEND_destroy(MfwHnd own_window)
{
  T_MFW_WIN * win_data;
  T_SEND    * data = NULL; 

  TRACE_FUNCTION ("SmsSend_SEND_destroy()");

  if (own_window)
	{
	  win_data = ((T_MFW_HDR *)own_window)->data;
		if (win_data != NULL) 
			data = (T_SEND *)win_data->user;

	  if (data)
		{
			
			// Delete sms handle
			if (data->sms_handler != NULL)
				sms_delete(data->sms_handler);

			if (data->child_dialog != NULL)
			{
				TRACE_EVENT("child_dialog not deleted?");
			}

			if (data->text_editor != NULL)
			{
				TRACE_EVENT("current_editor not deleted?");
				

			}


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

		  // Free Memory
			FREE_MEMORY ((void *)data, sizeof (T_SEND));
			//win_data->user = NULL; 
		}
	  else
		{
			TRACE_EVENT ("SmsSend_SEND_destroy() called twice");
		}
	}
}

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

 $Function:    	SmsSend_main_exec_cb

 $Description:	Main callback handler for events sent to to trigger execution
 
 $Returns:		none

 $Arguments:	win - current window
 				event - event id
 				identifier - unique id
 				parameter - optional data.
*******************************************************************************/

static void SmsSend_main_exec_cb (T_MFW_HND win, USHORT event, SHORT identifier, void * parameter)
{	
	TRACE_FUNCTION ("SmsSend_main_exec_cb()");

	/* In this field we get the identifier of the window sending the event */
	switch (identifier)
	{
		case SEND_ID:
		case SAVE_ID:	// events from the SAVE window are also managed in the SEND callback
		case SMSSEND_ID_SAVE_NOT_READY:
			SmsSend_SEND_exec_cb(win, event, parameter);
			break;
		case PHBK_ID:
			SmsSend_PHBK_exec_cb(win, event, parameter);
			break; 
		case SMSSEND_ID_TEXTEDIT:
			SmsSend_TEXTEDIT_exec_cb(win, event, parameter);
			break;
		case SMSSEND_ID_SC_NOT_READY: 
			/* MZ cq11074 delete the info dialog window. */
			SmsSend_SEND_destroy(win);
			break;
		case SMSSEND_ID_NBEDIT:
			SmsSend_NBEDIT_exec_cb(win, event, parameter);
			break;
		case SMSSEND_ID_CENTREEDIT:
			SmsSend_CENTREEDIT_exec_cb(win, event, parameter);
			break;
		default:
			TRACE_EVENT("Err: Default");
			break;
	}
}

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

 $Function:    	SmsSend_SEND_exec_cb

 $Description:	Callback handler for events sent by the window itself
 
 $Returns:		none

 $Arguments:	win - current window
 				event - event id
 				parameter - optional data.
*******************************************************************************/

static void SmsSend_SEND_exec_cb(T_MFW_HND win, USHORT event, void *parameter)
{
  T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
  T_SEND         * data = (T_SEND *)win_data->user;
  T_MFW_SMS_INFO	sms_parameter;
  T_MFW_EVENT     MfwEvents;
 //  T_DISPLAY_DATA display_info;   // RAVI

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

	TRACE_FUNCTION ("SmsSend_SEND_exec_cb()");

	switch (event)
	{
	case E_INIT:
			/* Create a sms handler to receive events  */
			MfwEvents = E_SMS_ERR | E_SMS_MO_AVAIL;
			data->sms_handler = sms_create(data->win,MfwEvents,(MfwCb)SmsSend_SEND_mfw_cb);
			data->child_dialog = NULL;
			
			/* store NUMBER and TEXT */
			memcpy(&(data->edt_data), (T_SmsUserData *)parameter, sizeof(T_SmsUserData));
      		/* in case of reply the sms we have to 
			   use the service center number from the
			   caller 
			 */
			 TRACE_EVENT_P1("data->edt_data.called_from_reply_item is %d",data->edt_data.called_from_reply_item);
			if (data->edt_data.called_from_reply_item EQ FALSE)
			{
			        TRACE_EVENT("RP false");
				// The SMS center is initialized to '\0'
				data->edt_data.CentreBuffer[0] = '\0';
			}
			else
				{
				TRACE_EVENT("RP true");
				}

		/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
#if defined(CHINESE_MMI) && defined(EASY_TEXT_ENABLED)
		/* If chinese is selected and we're opening up a new message
		 * or a unicode message, use the chinese editor */
		if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE
			&& (data->edt_data.TextBuffer[0]==0x00 || data->edt_data.TextBuffer[0] ==0x80))
		{
			T_CHINESE_DATA chinese_data;
		
			chinese_data.TextString = (char*) data->edt_data.TextBuffer;

			chinese_data.TextString[0] = 0x80;
			chinese_data.TextString[1] = MAX_MSG_LEN;
			chinese_data.Callback = (T_AUI_EDIT_CB)SmsSend_TEXTEDIT_edit_cb;
			chinese_data.Identifier = SMSSEND_ID_TEXTEDIT ;
			chinese_data.LeftSoftKey = TxtSoftOptions;
			chinese_data.DestroyEditor = FALSE;
			if(FFS_flashData.ConcatenateStatus == TRUE)
				chinese_data.EditorSize = (USHORT)((MAX_MSG_LEN_CHI)/2 - 1);
			else
				chinese_data.EditorSize = (USHORT)((MAX_MSG_LEN_SGL_CHI)/2 - 1);
			data->text_editor = chinese_input(win, &chinese_data);
		}
		else
#endif /* CHINESE_MMI && EASY_TEXT_ENABLED */
		/* We're opening up an ascii or unicode latin editor */
		{
			
			AUI_edit_SetDefault(&editor_data);

			/* Set the appropriate mode if easy text is enabled */
#ifdef EASY_TEXT_ENABLED
			AUI_edit_SetMode(&editor_data, ED_MODE_ALPHA | ED_MODE_PREDTEXT, ED_CURSOR_BAR);
#else /* EASY_TEXT_ENABLED */
			AUI_edit_SetMode(&editor_data, ED_MODE_ALPHA, ED_CURSOR_BAR);
#endif /* EASY_TEXT_ENABLED */

			/* Check if concatenated SMS is enabled */
			
			if(FFS_flashData.ConcatenateStatus == TRUE)
				size     = MAX_MSG_LEN;
			else
				size     = MAX_MSG_LEN_SGL;

			/* Set the DCS type of the message */
			
			if (data->edt_data.TextBuffer[0]==0x80)
			{
				TRACE_EVENT("Unicode SMS message starting 0x80");
				AUI_edit_SetBuffer(&editor_data, ATB_DCS_UNICODE, &data->edt_data.TextBuffer[2], size/2);
			}
			else
			{
				TRACE_EVENT("Normal SMS message");
				AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->edt_data.TextBuffer, size);
			}

			AUI_edit_SetDisplay(&editor_data, ZONE_FULL_SK_TITLE_SCROLL, COLOUR_EDITOR, EDITOR_FONT);
			AUI_edit_SetEvents(&editor_data, SMSSEND_ID_TEXTEDIT, FALSE, FOREVER, (T_AUI_EDIT_CB)SmsSend_TEXTEDIT_edit_cb);
			AUI_edit_SetTextStr(&editor_data, TxtSoftOptions, TxtDelete, NULL, NULL);
			AUI_edit_SetAltTextStr(&editor_data, 0, NULL, TRUE, TxtSoftBack);

			data->text_editor = AUI_edit_Start(win,&editor_data);  /* start the editor */
		}
#else /* NEW_EDITOR */

	/* END OF NEW EDITOR CODE */
	
 /*SPR 1434*/
#if defined(CHINESE_MMI) && defined(EASY_TEXT_ENABLED)
/*MC SPR1242, merged section in from b-sample build*/
	if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
	{	T_CHINESE_DATA chinese_data;
	
		chinese_data.TextString = (char*) data->edt_data.TextBuffer;
		/*if empty or unicode string, add unicode tag*/
		if(chinese_data.TextString[0] ==0x00 || chinese_data.TextString[0] ==0x80)
		{	chinese_data.TextString[0] = 0x80;
			chinese_data.TextString[1] = MAX_MSG_LEN;
			
			chinese_data.Callback = (T_EDIT_CB)SmsSend_TEXTEDIT_edit_cb;
		chinese_data.Identifier = SMSSEND_ID_TEXTEDIT ;
		chinese_data.LeftSoftKey = TxtSoftOptions;
		chinese_data.DestroyEditor = FALSE;
		if(FFS_flashData.ConcatenateStatus == TRUE)
			chinese_data.EditorSize = (USHORT)((MAX_MSG_LEN_CHI)/2 - 1);
		else
			chinese_data.EditorSize = (USHORT)((MAX_MSG_LEN_SGL_CHI)/2 - 1);
		data->text_editor = chinese_input(win, &chinese_data);

		}
		else/*if ascii string use ASCII editor rather than converting to unicode, MC, SPR 1292*/
		{	SmsSend_loadEditDefault(&editor_data);
			editor_data.editor_attr.text     = (char *)data->edt_data.TextBuffer;
			//1227 - API - 05/10/02 - Size of Editor dependent on whether Conc_Switch is TRUE or FALSE
			if(FFS_flashData.ConcatenateStatus == TRUE)
				editor_data.editor_attr.size     = MAX_MSG_LEN;
			else
				editor_data.editor_attr.size     = MAX_MSG_LEN_SGL;
			editor_data.min_enter						 = 0; 			 								
			editor_data.LeftSoftKey          = TxtSoftOptions;
			editor_data.AlternateLeftSoftKey = TxtSoftOptions;
			editor_data.RightSoftKey         = TxtDelete;
			editor_data.Identifier           = SMSSEND_ID_TEXTEDIT ; 
			editor_data.Callback             = (T_EDIT_CB)SmsSend_TEXTEDIT_edit_cb;
			editor_data.destroyEditor 		 = FALSE;
			data->text_editor = editor_start(win,&editor_data);  /* start the editor */
		}
	}
else
#endif /* CHINESE_MMI && EASY_TEXT_ENABLED */

{
#ifdef EASY_TEXT_ENABLED
			editor_data.hide									= FALSE;
			editor_data.TextId               = '\0';  
			editor_data.Identifier           =  0; 
			editor_data.TextString           = NULL;  
			editor_data.timeout			  = FOREVER;  // Avoid to return empty strings
			editor_data.mode                 = ALPHA_MODE; 
			editor_attr_init_pred(&editor_data.editor_attr, ZONE_FULL_SK_TITLE, edtCurBar1,  NULL, (char *)data->edt_data.TextBuffer, MAX_MSG_LEN, COLOUR_EDITOR);
#else /* EASY_TEXT_ENABLED */
			SmsSend_loadEditDefault(&editor_data);
			editor_attr_init(&editor_data.editor_attr, ZONE_FULL_SK_TITLE, edtCurBar1, NULL, (char *)data->edt_data.TextBuffer, MAX_MSG_LEN, COLOUR_EDITOR);
#endif /* EASY_TEXT_ENABLED */

			editor_data.editor_attr.text     = (char *)data->edt_data.TextBuffer;
			//1227 - API - 05/10/02 - Size of Editor dependent on whether Conc_Switch is TRUE or FALSE
			if(FFS_flashData.ConcatenateStatus == TRUE)
				editor_data.editor_attr.size     = MAX_MSG_LEN;
			else
				editor_data.editor_attr.size     = MAX_MSG_LEN_SGL;
			editor_data.min_enter						 = 0; 				 								
			editor_data.LeftSoftKey          = TxtSoftOptions;
			editor_data.AlternateLeftSoftKey = TxtSoftOptions;
			editor_data.RightSoftKey         = TxtDelete;

			editor_data.Identifier           = SMSSEND_ID_TEXTEDIT ; 
			editor_data.Callback             = (T_EDIT_CB)SmsSend_TEXTEDIT_edit_cb;
			editor_data.destroyEditor 		 = FALSE;
			data->text_editor = editor_start(win,&editor_data);  /* start the editor */
}
#endif /* NEW_EDITOR */

			/* Marcus: Issue 1170: 07/10/2002: Start */
            /*
             * Set whether status requests are to be indicated according to the
             * value of the srr field of the T_MFW_SMS_INFO structure.
             */
            SmsSend_get_config_data(&sms_parameter);

            switch (sms_parameter.srr)
            {
                case SMS_NOT_REQUESTED_SRR:
                    sms_set_mt_ind(MT_IND_SRR_OFF);
                    break;

                case SMS_REQUESTED_SRR:
                    sms_set_mt_ind(MT_IND_SRR_ON);
                    break;

                default:
                    TRACE_EVENT_P1("default: sms_parameter.srr = %d", sms_parameter.srr);
                    break;
            }
            /* Marcus: Issue 1170: 07/10/2002: Start */

			break;
	case E_RETURN: 
		break;
	case E_EXIT:
		if(data->sc_number_editor != NULL)
		{

			//GW Read config data - then set dcs parameter
			SmsSend_get_config_data(&sms_parameter);

			if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
			{	//We have a chinese text message - set dcs parameter to 
				sms_parameter.dcs = MFW_DCS_UCS2;
    		}
			else
			{
				sms_parameter.dcs = MFW_DCS_7bits;

			}

			// copy the SC number into the sms_parameter variable.
			strcpy((char*)sms_parameter.sc_addr,(char*)data->edt_data.CentreBuffer);
			// store the Service center number into the SIM.
			SmsSend_set_SrvCntr_number (&sms_parameter);
			SmsSend_set_dcs_number (&sms_parameter);

			/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
			AUI_edit_Destroy(data->sc_number_editor);
#else /* NEW_EDITOR */
			editor_destroy(data->sc_number_editor);
#endif /* NEW_EDITOR */
			data->sc_number_editor = NULL;
		}
		
		break;
	default:
		TRACE_EVENT("Err: Default");
		break;
	}
}

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

 $Function:    	SmsSend_PHBK_exec_cb

 $Description:	Callback handler for events sent by the phonebook window
 
 $Returns:		none

 $Arguments:	win - current window
 				event - event id
 				parameter - optional data.
*******************************************************************************/

static void SmsSend_PHBK_exec_cb(T_MFW_HND win, USHORT event, void *parameter)
{
	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
	T_SEND         * data = (T_SEND *)win_data->user;
	/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
	T_ATB_TEXT		text;	/* Used to insert phone numbers into editors */
#endif

	TRACE_FUNCTION ("SmsSend_PHBK_exec_cb()");

	switch (event)
	{
	/* SPR#1428 - SH - New Editor changes.  Insert phone number into editor */
#ifdef NEW_EDITOR
		case SMS_PHBK_NUMBER:		/* Normal phone number */
		case SMSSC_PHBK_NUMBER:		/* Service centre number */
			text.dcs = ATB_DCS_ASCII;
			text.len = strlen((char *)parameter);
			text.data = (UBYTE *)parameter;
			SEND_EVENT(data->number_editor, E_ED_INSERT, 0, (void *)&text);
			break;
#else /* NEW_EDITOR */
		case SMS_PHBK_NUMBER:
			memcpy(data->edt_data.NumberBuffer, (char *)parameter, MINIMUM(sizeof(data->edt_data.NumberBuffer) - 1, strlen((char *)parameter)+1));
			break;
			/* SPR#1428 - SH - Insert service centre number into editor */
		case SMSSC_PHBK_NUMBER:
			memcpy(data->edt_data.CentreBuffer, (char *)parameter, MINIMUM(sizeof(data->edt_data.CentreBuffer) - 1, strlen((char *)parameter)+1));
			break;			
#endif /* NEW_EDITOR */
		default:
			TRACE_EVENT("Err: Default");
			break;
	}
}


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

 $Function:    	SmsSend_TEXTEDIT_exec_cb

 $Description:	Callback handler for events sent by the TEXTEDIT editor
 
 $Returns:		none

 $Arguments:	win - current window
 				event - event id
 				parameter - optional data.
*******************************************************************************/

static void SmsSend_TEXTEDIT_exec_cb(T_MFW_HND win, USHORT event, void *parameter)
{
	TRACE_FUNCTION ("SmsSend_TEXTEDIT_exec_cb()");

	switch (event)
	{
		case E_RETURN:
			// Destroy itself
			SmsSend_SEND_destroy(win);
			break;
		default:
			TRACE_EVENT("Err: Default");
			break;
	}
}

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

 $Function:    	SmsSend_NBEDIT_exec_cb

 $Description:	Callback handler for events sent by the NBEDIT editor

 $Returns:		none

 $Arguments:	win - current window
 				event - event id
 				parameter - optional data.
*******************************************************************************/

static void SmsSend_NBEDIT_exec_cb(T_MFW_HND win, USHORT event, void *parameter)
{	
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    T_SEND         * data = (T_SEND *)win_data->user;
	T_MFW_SMS_INFO sms_parameter;
#ifdef NEW_EDITOR
	T_AUI_EDITOR_DATA editor_data;	/* SPR#1428 - SH - New Editor data */
#else
	T_EDITOR_DATA editor_data;
#endif

	TRACE_FUNCTION ("SmsSend_NBEDIT_exec_cb()");

	switch (event)
	{
		case E_INIT:
			if ((phb_get_mode() EQ PHB_RESTRICTED)
					&& (phb_check_number(data->edt_data.NumberBuffer) EQ MFW_PHB_FAIL))
			{
				mmi_dialog_information_screen(win,TxtNotImplemented, "NOT ALLOWED", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_ALLOWED);
			}
			else
			{
				
				if (!smsidle_get_ready_state())
				{
					// SMS init processing not ready to access SIM to store the SMS
					/* MZ cq11074 do not invoke the editor until SMS Service Centre number has been read, 
					    display info dialog. */
					mmi_dialog_information_screen(win,TxtPleaseWait, "NOT READY", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_SC_NOT_READY );
					return;
				// Recreate the editor on dialog callback
				}
				else
				{
					//END TB
					// First check if the SMS center is specified
					SmsSend_get_config_data(&sms_parameter);

					if(sms_parameter.sc_addr[0] EQ '\0')
					{
						memset(data->edt_data.CentreBuffer,0,NUMBER_LENGTH);
					}
					else
					{
						strncpy((char *)data->edt_data.CentreBuffer, (char *)sms_parameter.sc_addr, NUMBER_LENGTH);
					}
				}
			}

			/* SPR#1428 - SH - New Editor changes */
			
#ifdef NEW_EDITOR
			AUI_edit_SetDefault(&editor_data);
			AUI_edit_SetDisplay(&editor_data, CENTRE_EDITOR, COLOUR_EDITOR_XX, EDITOR_FONT);
			AUI_edit_SetEvents(&editor_data, 0, FALSE, FOREVER, (T_AUI_EDIT_CB)SmsSend_SCNBEDIT_edit_cb);
			AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtServiceCentre, NULL);
			AUI_edit_SetAltTextStr(&editor_data, 1, TxtNames, TRUE, TxtSoftBack);
			AUI_edit_SetMode(&editor_data, 0, ED_CURSOR_UNDERLINE);
			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->edt_data.CentreBuffer, NUMBER_LENGTH);
			data->number_editor = AUI_edit_Start(data->win, &editor_data);
#else /* NEW_EDITOR */

	    	SmsSend_loadEditDefault(&editor_data);

			bookSetEditAttributes( CENTRE_EDITOR, COLOUR_EDITOR_XX,0,edtCurBar1, 0, 
			(char *) data->edt_data.CentreBuffer, NUMBER_LENGTH, &editor_data.editor_attr);
			
			editor_data.TextId            = TxtServiceCentre;  
			editor_data.editor_attr.text     = (char *)data->edt_data.CentreBuffer;  
			editor_data.editor_attr.size     = NUMBER_LENGTH; 
			editor_data.LeftSoftKey        = TxtSoftOK;
			editor_data.AlternateLeftSoftKey = TxtNames;
			editor_data.RightSoftKey       = TxtDelete;
			editor_data.Identifier           = NULL; 
			editor_data.Callback           = (T_EDIT_CB)SmsSend_SCNBEDIT_edit_cb;
			editor_data.mode		    = E_EDIT_DIGITS_MODE;
			editor_data.destroyEditor		 = FALSE;
			data->number_editor = editor_start(data->win,&editor_data);  
#endif /* NEW_EDITOR */

		/* start the editor */ 
			
			break;
		default:
			TRACE_EVENT("Err: Default");
			break;
	}
}

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

 $Function:    	SmsSend_CENTREEDIT_exec_cb

 $Description:	Callback handler for events sent by the CENTREEDIT editor

 $Returns:		none

 $Arguments:	win - current window
 				event - event id
 				parameter - optional data.
*******************************************************************************/

static void SmsSend_CENTREEDIT_exec_cb(T_MFW_HND win, USHORT event, void *parameter)
{	
	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
	T_SEND         * data = (T_SEND *)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

	TRACE_FUNCTION ("SmsSend_CENTREEDIT_exec_cb()");

	switch (event)
	{
	case E_INIT:
			/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
			AUI_edit_SetDefault(&editor_data);
			AUI_edit_SetDisplay(&editor_data, CENTRE_EDITOR, COLOUR_EDITOR_XX, EDITOR_FONT);
			AUI_edit_SetEvents(&editor_data, *(USHORT*)parameter, TRUE, FOREVER, (T_AUI_EDIT_CB)SmsSend_CENTREEDIT_edit_cb);
			AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtServiceCentre, NULL);
			AUI_edit_SetAltTextStr(&editor_data, 1, TxtNull, TRUE, TxtSoftBack);
			AUI_edit_SetMode(&editor_data, 0, ED_CURSOR_UNDERLINE);
			AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, data->edt_data.CentreBuffer, PHB_MAX_LEN);
			data->sc_number_editor = AUI_edit_Start(data->win, &editor_data);
#else /* NEW_EDITOR */

			SmsSend_loadEditDefault(&editor_data);
			bookSetEditAttributes( CENTRE_EDITOR, COLOUR_EDITOR_XX, 0, edtCurBar1, 0, 
			(char *) data->edt_data.CentreBuffer, NUMBER_LENGTH, &editor_data.editor_attr);
			
			editor_data.TextId            = TxtServiceCentre;  
			editor_data.editor_attr.text     = (char *)data->edt_data.CentreBuffer;  
			editor_data.editor_attr.size     = PHB_MAX_LEN; 
			editor_data.LeftSoftKey        = TxtSoftOK;
			editor_data.RightSoftKey       = TxtDelete;
			editor_data.Identifier 	    = *(USHORT*)parameter;
			editor_data.Callback           = (T_EDIT_CB)SmsSend_CENTREEDIT_edit_cb;
			editor_data.mode		    = E_EDIT_DIGITS_MODE;
			editor_data.destroyEditor        = TRUE ; 
			data->sc_number_editor = editor_start(data->win,&editor_data);  
		/* start the Service Centre Number editor */ 
#endif /* NEW_EDITOR */
		break;
		
	case E_RETURN:
		
		break;
	default:
		TRACE_EVENT("Err: Default");
		return;
	}
}

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

 $Function:    	SmsSend_TEXTEDIT_edit_cb

 $Description:	Callback function for the text editor

 $Returns:		none

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

static void SmsSend_TEXTEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason)
{
	T_MFW_WIN			* win_data = ((T_MFW_HDR *) win)->data;
	T_SEND				* data     = (T_SEND *)win_data->user;
	
	TRACE_FUNCTION ("SmsSend_TEXTEDIT_edit_cb()");
	
	//	Jul 13, 2004    REF: CRR 21615  Deepa M.D 
	//Copy the sms content from the editor buffer into the temporary buffer.
	memcpy(TempTextBuffer,data->edt_data.TextBuffer,MAX_MSG_LEN);
	
	switch (reason)
	{
	case INFO_KCD_ALTERNATELEFT:
	case INFO_KCD_LEFT:
		data->options_win = SmsSend_OPT_start(win,(MfwMnuAttr*)&SmsSend_R_OPTAttrib);
		
		/* Create number editor:                                 
		-the editor min length is 1
		*/
		break;
		
	case INFO_KCD_RIGHT:
	case INFO_KCD_HUP:
		// Commit suicide so come back to previous menu
#if	defined(CHINESE_MMI) && defined(EASY_TEXT_ENABLED)
		if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
			chinese_input_destroy(data->text_editor);
		else
#endif
			
			/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
			AUI_edit_Destroy(data->text_editor);
#else /* NEW_EDITOR */
		editor_destroy(data->text_editor);
#endif /* NEW_EDITOR */
		
		data->text_editor = 0;
		SmsSend_SEND_destroy(data->win);
		break;
		
	default:
		TRACE_EVENT("Err: Default");
		break;
	}
}


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

 $Function:    	SmsSend_NBEDIT_edit_cb

 $Description:	Callback function for the number editor

 $Returns:		none

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

static void SmsSend_NBEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason)
{	
	T_MFW_WIN   * win_data = ((T_MFW_HDR *) win)->data;
	T_SEND      * data     = (T_SEND *)win_data->user;

	T_MFW_SMS_INFO	sms_parameter;
	USHORT parameter;
	

	TRACE_FUNCTION ("SmsSend_NBEDIT_edit_cb()");

	
	switch (reason)
	{
		case INFO_KCD_LEFT:
	  		// Check if we can go to the next stage
			if ((phb_get_mode() EQ PHB_RESTRICTED)
					&& (phb_check_number(data->edt_data.NumberBuffer) EQ MFW_PHB_FAIL))
			{
				
				mmi_dialog_information_screen(win,TxtNotImplemented, "NOT ALLOWED", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_ALLOWED);

			}
			else
			{
				
				if (!smsidle_get_ready_state())
				{
					// SMS init processing not ready to access SIM to store the SMS
					mmi_dialog_information_screen(win,TxtPleaseWait, "NOT READY", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_SC_NOT_READY);
				// Recreate the editor on dialog callback
				}
				else
				{
					//END TB
					// First check if the SMS center is specified
					SmsSend_get_config_data(&sms_parameter);

					if(sms_parameter.sc_addr[0] EQ '\0')
					{
						//setup identifier value.
						parameter = SMSSEND_ID_CENTREEDIT;
						SmsSend_CENTREEDIT_exec_cb(win, E_INIT,(void*)&parameter);
					}
					else
					{
						/*NM FTA 34.2.8*/
						if (data->edt_data.called_from_reply_item EQ FALSE)
						{
							TRACE_EVENT("take the own serviceCenternum");
							strcpy((char *)data->edt_data.CentreBuffer, (char *)sms_parameter.sc_addr);

							   {
								   /***************************Go-lite Optimization changes Start***********************/
								   //	Aug 16, 2004    REF: CRR 24323   Deepa M.D
								   TRACE_EVENT_P1("serviceNr:%s",data->edt_data.CentreBuffer);
								   /***************************Go-lite Optimization changes end***********************/
							   }
															
						}
						else
						{
							TRACE_EVENT("from the caller, reply");
						
							/* in case of reply the sms, we took already the 
							   the service center number from the caller !!!*/

								{
									/***************************Go-lite Optimization changes Start***********************/
									//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
									TRACE_EVENT_P1("serviceNr:%s",data->edt_data.CentreBuffer);
									/***************************Go-lite Optimization changes end***********************/
								}
						}
						/*NM FTA 34.2.8*/
						SmsSend_send_to_mfw(win);
					}
				}
			}

			/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
			AUI_edit_Destroy(data->number_editor);
#else /* NEW_EDITOR */
			editor_destroy(data->number_editor);
#endif /* NEW_EDITOR */

			data->number_editor = 0;
			SmsSend_R_OPT_destroy(data->options_win);

		break;
          
		case INFO_KCD_ALTERNATELEFT:
			bookPhonebookStart(win, PhbkFromSms);
			break;
		case INFO_KCD_RIGHT:
		case INFO_KCD_HUP:
		/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
			AUI_edit_Destroy(data->number_editor);
#else /* NEW_EDITOR */
			editor_destroy(data->number_editor);
#endif /* NEW_EDITOR */
			data->number_editor = 0;
			break;

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

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

 $Function:    	SmsSend_CENTREEDIT_edit_cb

 $Description:	Callback function for the center number editor

 $Returns:		none

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

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

	TRACE_FUNCTION ("SmsSend_CENTREEDIT_edit_cb()");
	switch (reason)
	{
	case INFO_KCD_LEFT:
		TRACE_EVENT("SmsSend_CENTREEDIT_edit_cb,INFO_KCD_LEFT ");
		if (Identifier==SMSSEND_ID_CENTREEDIT)
			{
				TRACE_EVENT("SmsSend_CENTREEDIT_edit_cb,INFO_KCD_LEFT Send to mfw ");
				
				//Submit the SMS message to the service centre.
				SmsSend_send_to_mfw(win);
			}
		break;
  
	case INFO_KCD_RIGHT:
	case INFO_KCD_HUP:
		/* send an event that will lead to the display of the number edition window */
	    SEND_EVENT (win, E_RETURN, SMSSEND_ID_CENTREEDIT, NULL);
		break;
	default:
		
		break;
	}
}

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

 $Function:    	SmsSend_SEND_mfw_cb

 $Description:	Callback functyion for handling SMS events from the MFW.

 $Returns:		execution status

 $Arguments:	event - window event id
 				info -  optional info
 				reason - event cause
*******************************************************************************/

static int SmsSend_SEND_mfw_cb (MfwEvt event, void *info)
{
	/* get the top window*/
	T_MFW_HND win         = mfw_parent(mfw_header());
	T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
	T_SEND     * data     = (T_SEND *)win_data->user;


	TRACE_FUNCTION ("SmsSend_SEND_mfw_cb()");

	switch (event)
	{
		case E_SMS_MO_AVAIL:
			TRACE_EVENT ("Sent was successful -> ok");
			/* Sent was successful */ 
			/* abort the current Dialog "Please wait" */ 
			if (data->child_dialog != NULL)
			{
				SEND_EVENT (data->child_dialog, DIALOG_DESTROY, 0, NULL);
				data->child_dialog = NULL; 
			}
			//GW Display sent not send
			/* FTA 34.2.2 - CQ 101443 - API & MZ pass NULL instead of win to the dialog window*/
			//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
			//Second string is same as the TextId .Hence passed NULL.
			mmi_dialog_information_screen(NULL,TxtSent, NULL, (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_SENT);
			data->id = SMSSEND_ID_SENT; 
		
			break;
			
		case E_SMS_ERR:
			// Waiting dialog is destroyed
			if (data->child_dialog != NULL)
			{
				SEND_EVENT (data->child_dialog, DIALOG_DESTROY, 0, NULL);
				data->child_dialog = NULL; 
			}
			// and the status dialog is displayed during 3 secs.
			/* FTA 34.2.2 - CQ 101443 - API & MZ pass NULL instead of win to the dialog window */
			 //Sep 01, 2004    REF: CRR 21380  Deepa M.D 
			//Second string is same as the TextId .Hence passed NULL.
			mmi_dialog_information_screen(NULL,TxtNotSent, NULL, (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_SENT);
			data->id = SMSSEND_ID_NOT_SENT; //TB3
			break;
       	
    default:
			TRACE_EVENT("Err: default");
			return 0;      	   
   	}

	return 1;
}

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

 $Function:    	SmsSend_SAVE_start

 $Description:	Create the Save SMS text window.

 $Returns:		mfw window handle

 $Arguments:	parent_window - parent window 
 				UserData - SMS info

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

T_MFW_HND SmsSend_SAVE_start(T_MFW_HND parent_window, T_SmsUserData *UserData)
{
    T_MFW_HND win;

    TRACE_FUNCTION ("SmsSend_SAVE_start()");

    win = SmsSend_SAVE_create (parent_window);

    if (win NEQ NULL)
	{
	    SEND_EVENT (win, E_INIT, 0, (void *)UserData);
	}
    return win;
}

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

 $Function:    	SmsSend_SAVE_create

 $Description:	Create a window for info dialog

 $Returns:		mfw window handle

 $Arguments:	parent_window - parent window 

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

static T_MFW_HND SmsSend_SAVE_create(MfwHnd parent_window)
{
	T_SAVE     * data = (T_SAVE *)ALLOC_MEMORY (sizeof (T_SAVE));
	T_MFW_WIN  * win;

	TRACE_FUNCTION ("SmsSend_SAVE_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)SmsSend_SAVE_exec_cb;
	data->mmi_control.data   = data;
	win                      = ((T_MFW_HDR *)data->win)->data;
	win->user                = (MfwUserDataPtr)data;
	data->parent             = parent_window;
	data->id				 = SAVE_ID;

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

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

 $Function:    	SmsSend_SAVE_destroy

 $Description:	Destroy the windows for info dialog

 $Returns:		none

 $Arguments:	own_window - current window 

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

static void SmsSend_SAVE_destroy(MfwHnd own_window)
{
  T_MFW_WIN * win_data;
  T_SAVE    * data = NULL; 

  TRACE_FUNCTION ("SmsSend_SAVE_destroy()");

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

	  if (data)
		{
			// Delete sms handle
			if (data->sms_handler != NULL)
				sms_delete(data->sms_handler);

			if (data->child_dialog != NULL)
			{
				TRACE_EVENT("child_dialog not deleted?");
			}

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

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

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

 $Function:    	SmsSend_SAVE_exec_cb

 $Description:	Callback handler for events sent to to trigger execution

 $Returns:		none

 $Arguments:	own_window - current window 

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

void SmsSend_SAVE_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
	T_SAVE         * data = (T_SAVE *)win_data->user;
	T_MFW_SMS_INFO	sms_parameter;
	USHORT outLen;
	T_MFW store_status;
	T_SmsUserData* message_parameter;/*SPR1991, pointer to message text, dest number*/
 	 /*JVJ SPR1298 made dynamic to avoid stack overload in the function convertToUnicodeForOutput*/
	/* MZ 10202 Removed memory declaration and allocation*/

	TRACE_FUNCTION ("SmsSend_SAVE_exec_cb()");

	switch (event)
	{
		case E_INIT:		
			
			/*MZ issue 10202 only alloc memory when you need it */
			if (msgBuffer ==NULL)
				msgBuffer = (UBYTE*)ALLOC_MEMORY(MAX_MSG_LEN_ARRAY);
			
			data->child_dialog = NULL; 

			/* Create a sms handler to receive events  */
			data->sms_handler = sms_create(data->win,
														E_SMS_SAVE_AVAIL | E_SMS_ERR | E_SMS_MEM_FULL
														,(MfwCb)SmsSend_SAVE_mfw_cb);

			//
			/*SPR1991, set local pointer to passed parameter, rather than copying data and
			using up more dynamic memory*/
			message_parameter = parameter;
			if (message_parameter->TextBuffer[0] == 0x80)
			{	//String is unicode - 
				sms_parameter.dcs = MFW_DCS_UCS2;
			}
			else
			{
				sms_parameter.dcs = MFW_DCS_7bits;
			}

			SmsSend_set_dcs_number (&sms_parameter);

			#ifdef NO_ASCIIZ
			{
				// have to add this , later
				    convertToUnicodeForOutput(message_parameter->TextBuffer,msgBuffer, &outLen);
				TRACE_EVENT_P1("Save SMS, length: %d", outLen);

					store_status = sms_store(MFW_SMS_SUBMIT, (char*)message_parameter->NumberBuffer, msgBuffer, outLen, NULL);
			}
			#else		
			{
				convertToUnicodeForOutput(data->edt_data.TextBuffer,msgBuffer, &outLen);
				store_status = sms_store(MFW_SMS_SUBMIT, (char*)message_parameter->NumberBuffer, msgBuffer, outLen, NULL);
				// sbh - added length to the above function call, since '@' characters stored as NULL & will stop
				// strlen from working properly.
			}
			#endif

			/*  display "Please wait" for save sms */
			if (store_status EQ MFW_SMS_OK)
			{
				TRACE_EVENT ("Save operation  -> ok");
				/* show now to user "Please wait" for save*/
				// Do not start please wait if ever the MFW result event as already been received
				if (data->child_dialog == NULL)
				{
					// Feb 02, 2005   REF: CRR 28479   xnkulkar
					// Call function "mmi_dialog_information_screen_save_sms" which has only 
	       			// KEY_RIGHT and  KEY_HUP registered instead of KEY_ALL
					//data->child_dialog = mmi_dialog_information_screen(win,TxtPleaseWait, "SAVING", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_WAIT_SAVE);
					data->child_dialog = mmi_dialog_information_screen_save_sms(win,TxtPleaseWait, "SAVING", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_WAIT_SAVE);
				}
				
			}
			else
			{
				TRACE_EVENT ("Save operation -> failed");
				//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
				//If E_SMS_MEM_FULL event  has already been received, then destroy the Messagefull Dialog
				//and dispaly a new dialog "Full NOT SAVED".
				if(memfull==TRUE)
				{
					// Feb 02, 2005   REF: CRR 28479   xnkulkar
					// Call function "mmi_dialog_information_screen_save_sms" which has only 
	       			// KEY_RIGHT and  KEY_HUP registered instead of KEY_ALL
					//mmi_dialog_information_screen(win, TxtFull,"NOT SAVED", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_SAVED);
					mmi_dialog_information_screen_save_sms(win, TxtFull,"NOT SAVED", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_SAVED);
					memfull=FALSE;//Set the memful flag to False.
					
				}
				// If the saving message failed due to other reason than memory full, display this message
				else if (data->child_dialog == NULL)
				{
					// Feb 02, 2005   REF: CRR 28479   xnkulkar
					// Call function "mmi_dialog_information_screen_save_sms" which has only 
	       			// KEY_RIGHT and  KEY_HUP registered instead of KEY_ALL
					//mmi_dialog_information_screen(win, TxtFailed,"NOT SAVED", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_SAVED);
					mmi_dialog_information_screen_save_sms(win, TxtFailed,"NOT SAVED", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_SAVED);
				}
				
			}
		/*SPr 1991, check memory allocated before deallocatting it*/
		/* MZ 10202 Remove the memory deallocation until later.*/

		break;

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

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

 $Function:    	SmsSend_SAVE_mfw_cb

 $Description:	Handles SMS events from the MFW.

 $Returns:		none

 $Arguments:	event - event id
 				info - optional info

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

static int SmsSend_SAVE_mfw_cb (MfwEvt event, void *info)
{
	/* get the top window*/
	T_MFW_HND win         = mfw_parent(mfw_header());
	T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
	T_SAVE     * data     = (T_SAVE *)win_data->user;

//	T_DISPLAY_DATA display_info;
  
	TRACE_FUNCTION ("SmsSend_SAVE_mfw_cb");

	switch (event)
	{
		/* Save is successful */   
    case E_SMS_SAVE_AVAIL:
		// Waiting dialog is destroyed
		
		if (data->child_dialog != NULL)
		{
			SEND_EVENT (data->child_dialog, DIALOG_DESTROY, 0, NULL);
			data->child_dialog = NULL; 
		}
		//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
		//Second string is same as the TextId .Hence passed NULL.

		// Feb 02, 2005   REF: CRR 28479   xnkulkar
		// Call function "mmi_dialog_information_screen_save_sms" which has only 
	       // KEY_RIGHT and  KEY_HUP registered instead of KEY_ALL
	       
		// mmi_dialog_information_screen(win, TxtSaved,NULL, (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_SAVED);
		mmi_dialog_information_screen_save_sms(win, TxtSaved,NULL, (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_SAVED);
		
		break;
		
	case E_SMS_MEM_FULL:
		//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
		//Flag to check E_SMS_MEM_FULL event has already been received.
		memfull=TRUE;
		TRACE_EVENT ("Memory for sms save is full");
		
		if (data->child_dialog != NULL)
		{
			// Waiting dialog is destroyed
			SEND_EVENT (data->child_dialog, DIALOG_DESTROY, 0, NULL);
			data->child_dialog = NULL; 
		}
		// and the status dialog is displayed during 3 secs.
		// set data->child_dialog as message received before sms_store is ended
		//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
		//Second string is same as the TextId .Hence passed NULL.
		mmi_dialog_information_screen(win,TxtFull, NULL, (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_LIST_FULL);
		return MFW_EVENT_PASSED; /*SPR 2640, pass event along to idle screen*/
	//	break;   // RAVI
		
    case E_SMS_ERR:
		TRACE_EVENT ("Save sms failed -> nok");
		
		if (data->child_dialog != NULL)
		{
			// Waiting dialog is destroyed
			SEND_EVENT (data->child_dialog, DIALOG_DESTROY, 0, NULL);
			data->child_dialog = NULL; 
		}
		// and the status dialog is displayed during 3 secs.
		// set data->child_dialog if message received before sms_store is ended
		mmi_dialog_information_screen(win,TxtFailed, "NOT SAVED", (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_SAVED);
		break;
		
	default:
		TRACE_EVENT("Err: default");
		return 0;
   	}	
	return 1;
}

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

 $Function:    	SmsSend_send_to_mfw

 $Description:	This function sends a SMS message.

 $Returns:		execution status

 $Arguments:	event - current window

 $History
  GW 09/10/01 - Added code to convert unicode strings from 8 bits to 7 bits.

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

static int SmsSend_send_to_mfw (T_MFW_HND win)
{  
	T_MFW_WIN				* win_data = ((T_MFW_HDR *)win)->data;
	T_SEND					* data     = (T_SEND *)win_data->user;
	T_MFW						submit_status;   /* Result of SMS send operation. */
	T_MFW_SMS_INFO	sms_parameter;

	USHORT outLen;

	/*SPR2453 only alloc memory when you need it */
	if (msgBuffer ==NULL)
		msgBuffer = (UBYTE*)ALLOC_MEMORY(MAX_MSG_LEN_ARRAY);
	TRACE_FUNCTION ("SmsSend_send_to_mfw()");
	if (data->edt_data.TextBuffer[0] == 0x80)
	{	//String is unicode - 
		sms_parameter.dcs = MFW_DCS_UCS2;
	}
	else
	{
		sms_parameter.dcs = MFW_DCS_7bits;
	}

	SmsSend_set_dcs_number (&sms_parameter);
	/* Send the SMS */
        
  
	
	#ifdef NO_ASCIIZ
	{

		convertToUnicodeForOutput(data->edt_data.TextBuffer,msgBuffer, &outLen);

	TRACE_EVENT_P1("Send SMS, length: %d", outLen);
			submit_status = sms_submit( MFW_SMS_SUBMIT,                  /* type of the message*/
        				(char *)data->edt_data.NumberBuffer,        /* dest. address      */
								msgBuffer,			                  /* sms message        */
								outLen,          /* lenght of message  */
								(char *)data->edt_data.CentreBuffer);/* sevice center num. */
	}
	#else
	{
		convertToUnicodeForOutput(data->edt_data.TextBuffer,msgBuffer,&outLen);
        #if defined (FF_WAP) && defined (FF_GPF_TCPIP)

    		submit_status = sms_submit( MFW_SMS_SUBMIT,  /* type of the message*/
            			(char *)data->edt_data.NumberBuffer, /* dest. address      */
            			NULL,                                /* don't specify toa for now */
		                msgBuffer,                           /* sms message        */
		                outLen,                             /* SH - added this, see function definition */
		                (char *)data->edt_data.CentreBuffer,    /* sevice center num. */
		                NULL);                              /* don't specify tosca for now */
		#else
    		submit_status = sms_submit( MFW_SMS_SUBMIT,  /* type of the message*/
				(char *)data->edt_data.NumberBuffer, /* dest. address      */
				msgBuffer,							 /* sms message        */
				outLen,								// sbh - added this, see function definition
                (char *)data->edt_data.CentreBuffer);/* sevice center num. */


		#endif

	}
	#endif
		
	

	/*  display "Please wait" for sent sms */
	if (submit_status EQ MFW_SMS_OK)
	{
		T_DISPLAY_DATA display_info;
	
		TRACE_EVENT ("to give SMS to MFW -> ok");
		/* show the use "Please wait" for send sms */
		dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, TxtSending, TxtMessage , COLOUR_STATUS);
		dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)SmsSend_standard_dialog_cb, FOREVER, KEY_LEFT );
		display_info.Identifier   = SMSSEND_ID_WAIT_SEND;

		data->child_dialog = info_dialog(win, &display_info);
		data->id = SMSSEND_ID_SENT;
	}
	else
	{
		TRACE_EVENT ("to give SMS to MFW -> failed");
		/* the result operation of sent was NOT OK*/
		//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
		//Second string is same as the TextId .Hence passed NULL.
		mmi_dialog_information_screen(win,TxtNotSent, NULL, (T_VOID_FUNC)SmsSend_standard_dialog_cb, SMSSEND_ID_NOT_SENT);
		// No forever dialog to be destroyed
		data->child_dialog = NULL;
		data->id = SMSSEND_ID_NOT_SENT;
	}

    /*SPR 2453, don't deallocate memory till sending complete*/
	return 1;
}


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

 $Function:    	SmsSend_get_config_data

 $Description:	Called by external processes to read SMS PP config data.

 $Returns:		execution status

 $Arguments:	config_data - SMS info

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

UBYTE SmsSend_get_config_data (T_MFW_SMS_INFO *config_data)
{
	T_MFW Submit_Status;   /* store theh result of SMS send operation. */

  TRACE_FUNCTION ("SmsSend_get_config_data()");
  // get the current config data from SIM 
	Submit_Status = sms_parameter(config_data, TRUE);

	if (Submit_Status == MFW_SMS_FAIL)
	{
		TRACE_EVENT  ("ret MFW_SMS_FAIL");
		return FALSE;		
	}
	else
	{
		TRACE_EVENT ("ret OK");
		return TRUE;
	}
}
/*******************************************************************************

 $Function:    	SmsSend_set_SrvCntr_number

 $Description:	Called by external processes to write/Set SMS PP config data.

 $Returns:		execution status

 $Arguments:	config_data - SMS info

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

UBYTE SmsSend_set_SrvCntr_number (T_MFW_SMS_INFO *config_data)
{
	T_MFW Submit_Status;   /* store theh result of SMS send operation. */

  TRACE_FUNCTION ("SmsSend_set_SrvCntr_number()");
  // get the current config data from SIM 
	Submit_Status = sms_set_SrvCntr_number(config_data);

	if (Submit_Status == MFW_SMS_FAIL)
	{
		TRACE_EVENT  ("ret MFW_SMS_FAIL");
		return FALSE;		
	}
	else
	{
		TRACE_EVENT ("ret OK");
		return TRUE;
	}
}
UBYTE SmsSend_set_dcs_number (T_MFW_SMS_INFO *config_data)
{
	T_MFW Submit_Status;   /* store theh result of SMS send operation. */

  TRACE_EVENT ("SmsSend_set_dcs_number()");
  // get the current config data from SIM 
	Submit_Status = sms_set_dcs_number(config_data);

	if (Submit_Status == MFW_SMS_FAIL)
	{
		TRACE_EVENT  ("ret MFW_SMS_FAIL");
		return FALSE;		
	}
	else
	{
		TRACE_EVENT ("ret OK");
		return TRUE;
	}
}

/* SPR#1428 - SH - New Editor: no longer required */
#ifndef NEW_EDITOR
/*******************************************************************************

 $Function:    	SmsSend_loadEditDefault

 $Description:	Configure T_EDITOR_DATA structure with default editor settings.

 $Returns:		none
 
 $Arguments:	editor_data - editor data.

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

void SmsSend_loadEditDefault(T_EDITOR_DATA *editor_data)
{
	    TRACE_FUNCTION ("SmsSend_loadEditDefault()");

		editor_attr_init(&editor_data->editor_attr, NULL, edtCurBar1, 0, 0, 0, COLOUR_EDITOR);
		editor_data_init(editor_data, NULL, TxtSoftSelect, TxtSoftBack, 0, 1, ALPHA_MODE, FOREVER);
		editor_data->hide									= FALSE;
		editor_data->AlternateLeftSoftKey = TxtNull;
		editor_data->Identifier           =  0; 
		editor_data->TextString           = NULL;  
		editor_data->destroyEditor        = TRUE ; 
}


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

 $Function:    	SmsSend_loadUCS2EditDefault

 $Description:	Configure T_EDITOR2_DATA structure with default editor settings.

 $Returns:		none
 
 $Arguments:	editor_data - editor data.

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

static void SmsSend_loadUCS2EditDefault(T_EDITOR_DATA *editor_data)
{
	TRACE_FUNCTION ("SmsSend_loadUCS2EditDefault()");

	memset(editor_data, 0, sizeof(T_EDITOR_DATA));
	editor_data->hide							= FALSE; 
	editor_data->LeftSoftKey					= TxtSend;
	editor_data->AlternateLeftSoftKey			= TxtSend;
	editor_data->RightSoftKey					= TxtSave;
	editor_data->Identifier						= SMSSEND_ID_TEXTEDIT;
	editor_data->mode							= ALPHA_MODE;
	editor_data->min_enter						= 0;
	editor_data->timeout						= FOREVER;
	editor_data->Callback						= (T_EDIT_CB)SmsSend_TEXTEDIT_edit_cb;
}
#endif /* NEW_EDITOR */


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

 $Function:    	SmsSend_standard_dialog_cb

 $Description:	Callback function for standard dialogs in smssend module

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

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

static int SmsSend_standard_dialog_cb(T_MFW_HND win, USHORT Identifier, USHORT Reason)
{
	T_MFW_WIN   * win_data		= ((T_MFW_HDR *) win)->data;
	T_SAVE		  * save_data		= NULL;
	T_SEND			* send_data		= NULL;
  	T_MFW_HND   * l_parent		= NULL; 
  
    TRACE_FUNCTION ("SmsSend_standard_dialog_cb()");
	


	switch (Identifier)
	{
	
		case SMSSEND_ID_SAVE_NOT_READY:
		case SMSSEND_ID_SC_NOT_READY:
			// SEND an event to recreate the text editor
			// or to recreate the destination address number editor
			SEND_EVENT (win, E_RETURN, Identifier, NULL);
			break;
			
		case SMSSEND_ID_WAIT_SEND:
			if (win_data != NULL)
				{
					send_data = (T_SEND *)win_data->user;
					// Forever child dialog has been destroyed
					if (send_data != NULL)
						send_data->child_dialog = NULL;
				}
			break;

		case SMSSEND_ID_WAIT_SAVE:
			// There is no way to stop SMS send
			if (win_data != NULL)
				{
					save_data = (T_SAVE *)win_data->user;
					// Forever child dialog has been destroyed
					if (save_data != NULL)
						save_data->child_dialog = NULL;
				}
			break;
		
		// Destroy the window then send the EXIT event to the SEND window->display of the text editor
		case SMSSEND_ID_SENT:
		case SMSSEND_ID_NOT_SENT:
			if ((Reason EQ INFO_KCD_RIGHT) || (Reason EQ INFO_KCD_HUP) || (Reason EQ INFO_TIMEOUT))
				SEND_EVENT(win, E_EXIT, SEND_ID, NULL);
			// Do not reset child dialog handle, as 3s sending dialogs handle are not saved
			break;

		// Destroy the SAVE window and send an E_EXIT event to the parent window (useful if some actions are needed on return like in SEND)
		case SMSSEND_ID_SAVED:
		case SMSSEND_ID_NOT_SAVED:
		case SMSSEND_ID_LIST_FULL:
			if ((Reason EQ INFO_KCD_RIGHT) || (Reason EQ INFO_KCD_HUP) || (Reason EQ INFO_TIMEOUT))
			{
				
				if (win_data != NULL)
				{
					save_data = (T_SAVE *)win_data->user;
					if (save_data != NULL)
					{
						l_parent = save_data->parent;
					}
				}
				// Destroy the window
				SmsSend_SAVE_destroy(win);
				// This will make SEND frame to recreate the text editor
				if (l_parent != NULL)
					SEND_EVENT(l_parent, E_EXIT, SAVE_ID, NULL);
				
			}
			break;


		default:
			TRACE_EVENT("MFW_EVENT_REJECTED");
			return MFW_EVENT_REJECTED;
	}
	return MFW_EVENT_CONSUMED;
}

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

 $Function:    	SmsSend_convert_to_inter

 $Description:	Transform a phone number in T_MFW_SMS_ADDR format to a string 
 				with a '+' character if international number
 				
 $Returns:		none
 
 $Arguments:	source_number - calling number
 				dest_number - called number
*******************************************************************************/

void SmsSend_convert_to_inter(T_MFW_SMS_ADDR *source_number,	// The number to convert
							  char *dest_number)				// The dest number with a '+' if needed
{
	USHORT nb_char;
	USHORT i = 0;
	char *pt_digit = dest_number;

	TRACE_FUNCTION ("SmsSend_convert_to_inter()");

	nb_char = strlen(source_number->number);

	if (source_number->ton == TON_International)
	{
		*pt_digit = '+';
		pt_digit++;
	}

	for (i = 0; i <= nb_char; i++)
		pt_digit[i] = source_number->number[i];
}

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

 $Function:    	SmsSend_R_OPTExeCentreEdit

 $Description:	Create editor for entering the Service center number.
 
 $Returns:		none
 
 $Arguments:	m - menu handler
 				i - menu item selected.
*******************************************************************************/


int SmsSend_R_OPTExeCentreEdit(MfwMnu* m, MfwMnuItem* i) 
{
	T_MFW_HND parent_win = mfw_parent(mfw_header());
	T_MFW_HND win = SmsSend_SEND_create(parent_win);
	SEND_EVENT(win,E_INIT,SMSSEND_ID_NBEDIT,0);
	return 1;   // ADDED BY RAVI-28-11-2005	
}
/*******************************************************************************

 $Function:    	SmsSend_SCNBEDIT_edit_cb

 $Description:	Callback function for the SC number editor.

 $Returns:		none

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

static void SmsSend_SCNBEDIT_edit_cb (T_MFW_HND win, USHORT Identifier, SHORT reason)
{
	T_MFW_WIN   * win_data = ((T_MFW_HDR *) win)->data;
	T_SEND      * data     = (T_SEND *)win_data->user;
	
	T_MFW_SMS_INFO	sms_parameter;


	TRACE_FUNCTION ("SmsSend_SCNBEDIT_edit_cb()");

	
	switch (reason)
	{
		case INFO_KCD_LEFT:
				TRACE_EVENT("INFO_KCD_LEFT");
				//GW Read config data to get value of dcs
				SmsSend_get_config_data(&sms_parameter);
				if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
				{	//We have a chinese text message - set dcs parameter to 
					sms_parameter.dcs = MFW_DCS_UCS2;
    			}
				else
				{
					sms_parameter.dcs = MFW_DCS_7bits;
				}
				//copy the sevice center number into the 
				
				strcpy((char*)sms_parameter.sc_addr,(char*)data->edt_data.CentreBuffer);
				// store the Service center number into the SIM.
				SmsSend_set_SrvCntr_number (&sms_parameter);
				SmsSend_set_dcs_number (&sms_parameter);
				
				/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
				AUI_edit_Destroy(data->number_editor);
#else /* NEW_EDITOR */
				editor_destroy(data->number_editor);
#endif /* NEW_EDITOR */

				SmsSend_SEND_destroy(win);
				data->number_editor = 0;
		
		break;
          
		case INFO_KCD_ALTERNATELEFT:
			TRACE_EVENT("INFO_KCD_ALTERNATELEFT");

			bookPhonebookStart(win, PhbkFromSmsSC);	/* SH - changed from PhbFromSms */
			break;
		case INFO_KCD_RIGHT:
		case INFO_KCD_HUP:
			TRACE_EVENT("INFO_KCD_RIGHT/HUP");
			/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
			AUI_edit_Destroy(data->number_editor);
#else /* NEW_EDITOR */
			editor_destroy(data->number_editor);
#endif /* NEW_EDITOR */

			SmsSend_SEND_destroy(win);
			data->number_editor = 0;
			
			break;

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

// Feb 02, 2005   REF: CRR 28479   xnkulkar
// Bug: While saving a SMS, if the user presses LSK while the 'Saved' dialog is displayed, the 'Saved' 
// dialog doesn't get dismissed.
// Solution: New function "mmi_dialog_information_screen_save_sms" which has only 
// KEY_RIGHT and  KEY_HUP registered instead of KEY_ALL
/*******************************************************************************

 $Function:    	mmi_dialog_information_screen_save_sms

 $Description:	 Function to display SMS "Saved" info screen

 $Returns:	info_dialog	

 $Arguments:	

*******************************************************************************/
T_MFW_HND mmi_dialog_information_screen_save_sms(T_MFW_HND parent_win, int TxtId, char* text, T_VOID_FUNC call_back, USHORT identifier)
{
	T_DISPLAY_DATA display_info;
	dlg_initDisplayData_TextId( &display_info, TxtNull,  TxtNull, TxtId, TxtNull, COLOUR_STATUS);
	dlg_initDisplayData_events( &display_info, call_back, THREE_SECS, KEY_RIGHT | KEY_HUP );
	display_info.TextString2   = text; 
	display_info.Identifier   = identifier;
	return info_dialog(parent_win,&display_info); //information screen
		
}

#undef MMI_SMSSEND_C
