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

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


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

					TI (Shanghai)

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

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

 $Project name:	TISHMMS Project                                                     
 $Project code:	BMI (6349)                                                           
 $Module:		MMS
 $File:		    mmimmsbox.h
 $Revision:		1.0                                                       
                                                                              
 $Author:		Yan Bin(bin-yan@ti.com)                                                         
 $Date:		    28/08/03                                                     
                                                                               
********************************************************************************
                                                                              
 Description:
 
    This module provides definitions of the types and
    constants which are shared across the MMS
    application modules.
   
********************************************************************************
 $History: MmiMmsBox.c

     xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
     Play mms error restart rectified. Removing unwanted screens in the callback of the "New mms"
     dialog screen.
	xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
	Changed from static allocations for g_mmstopic and g_mmsstatus to dynamic allocation.

    Nov 05, 2005	REF: OMAPS00049502   Sumanth Kumar. C
    Description:	MMS: During MMS Reply, Enter Number shows Empty.
    Solution:		Senders number is extracted from the Message Header and is displayed.

  	Nov 02, 2005    REF:ER OMAPS00039044  xdeepadh
	Description:   Mp3 Ringer Implementation
	Solution: The Midi Ringer application has been enhanced to support mp3 as ringer.
	The interface  function names have been modified.
	
     May 11 2005  REF:  MMI-SPR-29887  x0012849
     To Implement the deferred MMS retrieval.
    Apr 07 2005  REF:  MMI-SPR-27826  x0012849
    To avoid crash when a user replies to the MMS which is there in Inbox

    xrashmic 08 Feb, 2005 MMI-SPR-27853
     Added more parameters to the information_dialog function
       
 	Apr 05, 2005    REF: ENH 29994 xdeepadh
   	Description: Implementation of Generic Midi Ringer and Modification of existing Midi Test Application
   	Solution: Generic Midi Ringer and Midi Test Application were implemented.
 
    xreddymn Jan-31-2004 MMI-SPR-28483: Support for MIDI objects

     x0012849 Feb-03-2005 MMI-SPR-28224 :
     To allow the user to scroll up and down while creating, reading or forwarding MMS .   
     
    xrashmic 14 Dec, 2004 MMI-SPR-23921
    Implementing the forward functionality for MMS  

    
    xreddymn Dec-20-2004 MMI-SPR-27382
    (1) Added "Please Wait" screen when deleting messages from a folder.
    This prevents the user from navigating menus during the process.
    (2) Modified inbox refresh to occur only when inside the inbox list screen.

    MMI-SPR-27384: Dec-17-2004 - xreddymn
    Changes for MMS/EMS Inbox/Sent/Unsent folder presentation

    xrashmic 7 Dec, 2004 MMI-SPR-23965
    Description: Not able to extract the objects in EMS message
    Solution: Extract and store the objects in the Object Manager
    
    MMI-SPR-23981: Nov-30-2004 - xreddymn
    Modified delete message behaviour. 
    Fixed "Play MMS Error" message that appears when trying to read messages

    MMI-SPR-25278: Nov-29-2004 - xreddymn
    Implemented FFS limits for MMS/EMS storage

    CRR 24456: 19 Oct 2004 - xpradipg
    Description: On opening MMS with PNG image "Play MMS Error" is displayed.
    On pressing Back D-sample resets.
    Solution: The EPlayModeStop was posted even if the EPlayModeRun was not 
    posted. The EPlayModeStop event posting is controled.
 
    CRR: 25291 - xrashmic 14 Oct 2004
    Description: The sent EMS is stored in unsent folder.
    Solution: The Outbox has been removed, instead we now have Sent folder for the sent EMS 

    MMI-SPR-25273: Oct-14-2004 - xreddymn
    Description: EMS forward not working
    Solution: Added changes to implement the EMS forward feature

    CRR 25268: 13 Oct 2004 - xpradipg
    Description: Unable to see the Number / name and the status read/unread of
    the received EMS/MMS
    Solution: The status of each message is updated as soon as the Message is 
    read, and "old"/"new" is appended based on the status flag
    
    CRR 25270: 13 Oct 2004 - xpradipg
    Description: EMS: Titles such as "no name" is added to EMSs with no titles
    Solution: The corresponding name is retrieved from the phone book for the
    number from which EMS is received, if name is not present number is 
    displayed in Inbox

    CRR 25277: 06 Oct 2004 - xpradipg
    Description: Recieving an ems when inbox is open
    Solution: A refresh event is sent to the Inbox list which inturn updates 
    the list

    MMI-SPR-25148: Sep-24-2004 - xreddymn
    Changes to map object index correctly to displayed list index
    in case of extractable object list.

    xrashmic 22 Sep, 2004 MMI-SPR-25032
    To play the buzzer when there are sound objects in EMS message

    MMI-SPR-24735: Sep-16-2004 - xreddymn
    Changes related to EMS screen flickering issue

    MMI-SPR-23962 (TII_MMS31): Aug-20-2004 - xreddymn
    Extract objects modified not to include text and unknown objects

    MMI-SPR-23933 (TII_MMS17): Aug-17-2004 - xreddymn
    Display a more meaningful error message when playback fails.

    MMI-SPR-23972 (TII_MMS41) Aug-27-2004 - xreddymn
    Correctly close message session when extracting objects or reading the message	

    MMI-SPR-23926 (TII_MMS12) and  MMI-SPR-24115 (TII_MMS55): Aug-26-2004 - xreddymn
    Keep track of MMS/EMS display

    CRR 23963: xpradipg 26 Aug 2004
    Description: Remove "Reply" option from Unsent folder
    Solution: The current selected folder is stored in a variable and depending on the selected folder
    the menu item display is controled.
    
    CRR 23959: xpradipg 26 Aug 2004
    Description: List not updated after deleting the messages in Unsent/Inbox folder
    Solution: The list is refreshed everytime the user returns from the options menu
   
    xrashmic 26 Aug, 2004 MMI-SPR-23931
    Only the complete message will be displayed in the inbox, outbox, unsent folders

    Bug Id 19 : 		13 Aug, 2004 - xrashmic  
    Description: MMS compose is displayed when reply option is selected 
    for an EMS message
    Solution: 	When reply is selected for a message from the inbox, we need to display corresponding 
    compose screen i.e either EMS compose or MMS compose screen

	17/01/04			Replace mfw edit with AUI edit.	
	28/08/03			Original TI(Shanghai) BMI version.	
	   
 $End

*******************************************************************************/
#define MMI_MMSBOX_C

#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.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"
#include "mfw_edt.h"
#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 "psa_util.h"

#include "dspl.h"
// #include "unicode_types.h"

#include "MmiMain.h"
#include "MmiDummy.h"
//#include "MmiLists.h"
#include "MmiMmi.h"
#include "mmiCall.h"//GW 29/11/01 for 'callNumber'

#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiMenu.h"
#include "MmiSoftKeys.h"

#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 "MmiBookShared.h" // MZ 
#include "mmimmsmenu.h"
#include "mmimmsbox.h"
#include "mfw_ffs.h"
#include "mmiwindow.h"

#include "cus_aci.h"

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

#include "aci_cmh.h"	//GW 29/11/01 added for types in aci_fd.h
#include "aci_fd.h"		//GW 29/11/01 added for types in 'cmh.h'
#include "cmh.h" 		//GW 29/11/01 added for types in 'cmh_phb.h'
#include "cmh_phb.h"	//GW 29/11/01 added for cmhPHB_getAdrStr

#include "mmiColours.h"
//xrashmic 22 Sep, 2004 MMI-SPR-25032
#include "audio.h"


#include "mg4def.h"
#include "evtdefs.h"
#include "mg4stu.h"
#include "Mg4Dal.h"
#include "mg4devif.h"
#include "dalevt.h"
#include "evif.h"
#include "mg4str.h"
#include "mmif.h"
#include "mg4mem.h"
//Apr 05, 2005    REF: ENH 29994 xdeepadh
#ifdef FF_MIDI_RINGER 
#include "mfw_midi.h"
#include "MmiSounds.h"
#endif
//xrashmic 14 Dec, 2004 MMI-SPR-23921
#include "mmimmscreate.h"
extern int MMSactive;


//xreddymn Aug-26-2004 MMI-SPR-23926 (TII_MMS12) and  MMI-SPR-24115 (TII_MMS55): To keep track of MMS display
extern BOOL g_M4_display_active;

//CRR 25270: 13 Oct 2004 - xpradipg
extern T_idle idle_data;
extern int bookFindNameInPhonebook( const char *p_pszNumber, T_MFW_PHB_ENTRY *p_pEntry );
int MMS_Is_Unread_Msgs_Inbox(void);

//CRR 23959: xpradipg 26 Aug 2004
//CRR 23963: xpradipg 26 Aug 2004
//Holdsthe current selected folder value. Default is set to 0xFF - 
//indicating no folder is assigned
UBYTE folder=0xFF;
// May 12 2005  REF:  MMI-SPR-29887  
// is_deferdownload will be TRUE when Deferred retrieval of MMS starts
BOOL is_deferdownload = FALSE;  
#define MMS_RECEIVE_PROGRESS -27
// May 12 2005  REF:  MMI-SPR-29887
//Used to check whther control went to DeviceEndAck while Retrieving the MMS
// If that is the case then dont display NewNotificaion dialog.
BOOL is_notifyResponse = FALSE;  
// Jun 23 2005  REF:  MMI-SPR-29887  x0012849
extern BOOL is_downloadcancelled;  
extern UBYTE rtvprogressValue; 
//CRR 25277: xpradipg 06 Oct 2004
extern MfwHnd mmsboxwinhnd;
//GW 29/11/01 - added header file - removed extern void callNumber(UBYTE* number);
MfwWin* getWinData( MfwHnd win);

// xreddymn Nov-29-2004: Added externals
//xrashmic 08 Feb, 2005 MMI-SPR-27853
extern T_MFW_HND information_dialog(USHORT TxtId1, USHORT TxtId2,char* Txt1, char* Txt2, USHORT SoftKeyTxtId1, USHORT SoftKeyTxtId2, int timer, T_MFW_EVENT keyEvents, T_VOID_FUNC callback);

extern T_MFW_HND g_inSaveModeWin;

// xreddymn Nov-30-2004 MMI-SPR-23981
T_MFW_HND g_OptionsWin;
T_MFW_HND g_MmsBoxWin;
//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
T_MFW_HND g_MmsReadWin;
T_MFW_HND g_MmsExtractEdtWin;
// xreddymn Dec-20-2004 MMI-SPR-27382
T_MFW_HND g_MmsBoxWinSavedHnd;
T_MFW_HND g_MmsPleaseWaitWin;

//xrashmic 7 Dec, 2004 MMI-SPR-23965
int attachmentInEMS=0;
EV_S_EXTRACTABLE_IN_MESSAGE apExtractableInMessage;
PP_S_OBJECT_DATA  *appObj;

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

				 DYNAMIC MENU WINDOW. DECLARATION

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

/* xreddymn Dec-16-2004 MMI-SPR-27384: MMS/EMS message list is now displayed as a two line per item list */
static MfwMnuAttr MmsBox_menuAttrib =
{
    &melody_menuArea,
    MNU_LEFT | MNU_LIST_2_LINE | MNU_CUR_LINE, /* double line menu       */
    -1,                                 /* use default font         */
    NULL,                               /* with these items         */
    0,                                   /* number of items     */
	COLOUR_LIST_XX, TxtNull, MNUATTRSPARE

};

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

};

static int MMSBox_OPTexeRead(MfwMnu* m, MfwMnuItem* i);
// May 12 2005  REF:  MMI-SPR-29887  x0012849
//Prototyes of the functions. START
static int MMSBox_OPTexeDeferDownload(MfwMnu* m, MfwMnuItem* i); 
static void  DeferDownloadMsg(MM_MESSAGE_ID msgId); 
void  MMSDownLoadNow(MM_MESSAGE_ID msgId);
static ESTATUS DeferDownloadMsgCallback(EVENT_ID		aeId,  
		          EVENT_TYPE	aeType,
				  MESSAGE_PARAM	ampParam,
				  EVT_HANDLE	evtHandle);
// May 12 2005  REF:  MMI-SPR-29887  x0012849
//Prototyes of the functions. END
static int MMSBox_OPTexeExtract(MfwMnu* m, MfwMnuItem* i);
static int MMSBox_OPTexeForward(MfwMnu* m, MfwMnuItem* i);
static int MMSBox_OPTexeDelete(MfwMnu* m, MfwMnuItem* i);
static int MMSBox_OPTexeReply(MfwMnu* m, MfwMnuItem* i);
//CRR 23963: xpradipg 26 Aug 2004
USHORT MMSBox_Is_Unsent( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi );
// May 12 2005  REF:  MMI-SPR-29887  x0012849
//Prototyes of the function
USHORT MMSBox_Is_NotRetrieved( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi );
// May 12 2005  REF:  MMI-SPR-29887  x0012849
//Prototyes of the function
USHORT MMSBox_Is_Retrieved( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi );
void MMSBox_Extract_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);


static MfwMnuItem MMSBox_OPTItems [] =
{
    // May 11 2005  REF:  MMI-SPR-29887  x0012849
    //Choose either of one Read or Retrieve based on the type of MMS.
    {0,0,0,(char *)TxtRead,0,(MenuFunc)MMSBox_OPTexeRead,MMSBox_Is_Retrieved}, 
    // May 11 2005  REF:  MMI-SPR-29887  x0012849
    //Retrieve will be showed in case if the MMS is not complete
    {0,0,0,(char *)TxtRetrieve,0,(MenuFunc)MMSBox_OPTexeDeferDownload,MMSBox_Is_NotRetrieved},		
    {0,0,0,(char *)TxtExtract,0,(MenuFunc)MMSBox_OPTexeExtract,MMSBox_Is_Retrieved},
     //CRR 23963: xpradipg 26 Aug 2004
     //added MMSBox_Is_Unsent which controls the display of the menu item
    {0,0,0,(char *)TxtReply,0,(MenuFunc)MMSBox_OPTexeReply,MMSBox_Is_Unsent},
    {0,0,0,(char *)TxtForward,0,(MenuFunc)MMSBox_OPTexeForward,MMSBox_Is_Retrieved},
    {0,0,0,(char *)TxtDelete,0,(MenuFunc)MMSBox_OPTexeDelete,item_flag_none},
};

//xrashmic 7 Dec, 2004 MMI-SPR-23965
// Separate options list for the EMS message. The extract menu item is removed from this list
static MfwMnuItem EMSBox_OPTItems [] =
{
    {0,0,0,(char *)TxtRead,0,(MenuFunc)MMSBox_OPTexeRead,item_flag_none},
     //CRR 23963: xpradipg 26 Aug 2004
     //added MMSBox_Is_Unsent which controls the display of the menu item
    {0,0,0,(char *)TxtReply,0,(MenuFunc)MMSBox_OPTexeReply,MMSBox_Is_Unsent},
    {0,0,0,(char *)TxtForward,0,(MenuFunc)MMSBox_OPTexeForward,item_flag_none},
    {0,0,0,(char *)TxtDelete,0,(MenuFunc)MMSBox_OPTexeDelete,item_flag_none},
};

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

};
//xrashmic 7 Dec, 2004 MMI-SPR-23965
// Separate options list for the EMS message. The extract menu item is removed from this list
static MfwMnuAttr EMSBox_OPTAttrib =
{
    &SmsRead_R_OPTArea,
    MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu       */
    -1,                                 /* use default font         */
    EMSBox_OPTItems,                      /* with these items         */
    sizeof(EMSBox_OPTItems)/sizeof(MfwMnuItem), /* number of items     */
    COLOUR_LIST_SMS,	TxtNull, MNUATTRSPARE

};

#define MMS_BOX_LISTALLMMS_BEGIN

/* pointer used to get mms list */
MM_S_MESSAGE_HEADER_LIST*	g_pMessageHeaderList	= NULL;
int g_currentMessage=0;

//CRR 25270 & CRR 25268: 14 Oct 2004 - xpradipg 
// xreddymn Dec-16-2004 MMI-SPR-27384: Modified string lengths for Inbox/Unsent/Sent presentation
#define MMS_BOX_LIST_STRING_MAX_LENGTH  72
#define MMS_BOX_LIST_LINE_MAX_LENGTH    36
#define MMS_BOX_LIST_SUB_MAX_LENGTH     28
//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
//Changed the static allocation to dynamic for the following variables
char *g_mmstopic;
char *g_mmsstatus;

static ListMenuData *box_menu_list_data=NULL;
static ListMenuData *extra_menu_list_data=NULL;

// xreddymn Sep-24-2004 MMI-SPR-25148 : An array that maps displayed index to an index in the list of objects extracted
static S16 *extra_menu_list_indices=NULL;

//CRR 24456: 19 Oct 2004 - xpradipg
//flag to control the posting of EPlayModeStop
static int MmsReadStatus =ENoError;
void M4_FreeListFolderMemory(void)
{
	/* If there is any data */
	if (g_pMessageHeaderList != NULL)
	{
		g_pMessageHeaderList->memHdr.freeFunc(g_pMessageHeaderList);
        
		g_pMessageHeaderList = NULL;
	}

	return;
}
//CRR 23963: xpradipg 26 Aug 2004
/*******************************************************************************

 $Function:     MMSBox_Is_Unsent

 $Description:  decides if the Reply menu item needs to be displayed or not

 $Returns:    False if it should be displayed

 $Arguments:
*******************************************************************************/
USHORT MMSBox_Is_Unsent( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{
    // May 11 2005  REF:  MMI-SPR-29887  x0012849
    if(folder == MMS_UNSENT ||(g_pMessageHeaderList->ppList[g_currentMessage].complete == FALSE ))
    {
  	return 1;
     }		
  return 0;
}
 // May 11 2005  REF:  MMI-SPR-29887  x0012849
 // New Function added
/*******************************************************************************
 $Function:     MMSBox_Is_NotRetrieved
 $Description:  decides whether Retrieve option need to be displayed or not 
 $Returns:    False if it should be displayed
 $Arguments:
*******************************************************************************/
USHORT MMSBox_Is_NotRetrieved( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{
    if(g_pMessageHeaderList->ppList[g_currentMessage].complete == FALSE)
    {
  	return 0;
     }		
  return 1;
}
 // May 11 2005  REF:  MMI-SPR-29887  x0012849
 // New Function added
/*******************************************************************************
 $Function:     MMSBox_Is_Retrieved
 $Description:  decides whether Read options need to be displayed or not
 $Returns:    False if it should be displayed
 $Arguments:
*******************************************************************************/
USHORT MMSBox_Is_Retrieved( struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi )
{
   if(g_pMessageHeaderList->ppList[g_currentMessage].complete == TRUE)
    {
  	return 0;
     }		
  return 1;
}

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

 $Function:     MMSBoxList_cb

 $Description:  Callback function for the melody list.

 $Returns:    none

 $Arguments:  Parent - parent window.
        ListData - Menu item list
*******************************************************************************/

void MMSBoxList_cb(T_MFW_HND * Parent, ListMenuData * ListData)
{
	T_MFW_HND    win  = mfwParent(mfw_header());

	TRACE_EVENT_P1("MMSBoxList_cb : %d", ListData->Reason);
	if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR)
		|| (ListData->Reason EQ LISTS_REASON_HANGUP))	// sbh - added hangup key
	{
		listsDestroy(ListData->win);
		MMI_DestoryWindow(Parent);
	}
	else if(ListData->Reason EQ LISTS_REASON_SELECT)
	{
		g_currentMessage=ListData->CursorPosition;
		MMSBox_OPT_start(ListData->win,0);
	}
}

static void MMSBox_info_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
	TRACE_FUNCTION("MMSBox_info_cb");
	switch (reason)
	{
	case INFO_KCD_LEFT:
		MMI_DestoryWindow(win);
	    	break;
	case INFO_KCD_HUP:
	case INFO_KCD_RIGHT:
	case INFO_KCD_CLEAR:
		MMI_DestoryWindow(win);
    	break;
	default:
    	break;
    }
}

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

 $Function:    	MMSBox_DT_string

 $Description:  Forms a string from a date/time structure
 
 $Returns:      none

 $Arguments:    s - String into which the output is written.
                Must be sufficiently large: Doesn't perform any bounds check.
                t - MMS time stamp structure

                xreddymn Dec-16-2004

*******************************************************************************/
void MMSBox_DT_string(char *s,MM_S_TIME_STAMP *t)
{
	sprintf(s,"%02d/%02d %02d:%02d",t->day,t->month,t->hour,t->min);
}

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

 $Function:    	MMSBox_exec_cb

 $Description:	Exec callback function of the MMS Create window 
 
 $Returns:		none

 $Arguments:	win - window handler
 				event - mfw event
 				parameter - optional data.
 
*******************************************************************************/
void MMSBox_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;
	int i;
	ESTATUS eStatus=0;
	MM_LIST_PARAM listParams = 0;
       //CRR 25270 && CRR 25268: 13 Oct 2004 - xpradipg
       //moved the declaration to the start of the function
       int lenSub=0;
       T_MFW_PHB_ENTRY phonebook_entry;
     // May 17 2005  REF:  MMI-SPR-29887  xreddymn
     //list_size will give the value - No of Messages presently in the list
	int list_size;                   
	TRACE_FUNCTION ("MMSBox_exec_cb()");
	
	switch (event)
	{
	//CRR 23963: xpradipg 26 Aug 2004
	//New case added, this is invoked when ever the user returns back from the 
	//options screen. This cleans the list of messages and re-populates the list
	case MWM_REDRAW:
		// we delete the list - free the list - before actually allocating and drawing.
		list_size = box_menu_list_data->ListLength;
		if(box_menu_list_data->win)
			listsDestroy(box_menu_list_data->win);
		if(box_menu_list_data)
		{
			if(box_menu_list_data->List && g_pMessageHeaderList)
			{
                           // May 17 2005  REF:  MMI-SPR-29887  xreddymn
                           // Use list_size to while freeing the memory
				FREE_MEMORY((void*)(box_menu_list_data->List), list_size * sizeof(T_MFW_MNU_ITEM ));
			}
			FREE_MEMORY((void*)(box_menu_list_data),sizeof(ListMenuData));
		}
		//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
		//Freeing the allocated memory on exiting the list screen
		if(g_mmsstatus)
			FREE_MEMORY((void*)g_mmsstatus,MMS_BOX_LIST_STRING_MAX_LENGTH);
		if(g_mmstopic)
			FREE_MEMORY((void*)g_mmstopic,MMS_BOX_LIST_STRING_MAX_LENGTH*g_pMessageHeaderList->size);

		//CRR 23963: xpradipg 26 Aug 2004
		//the break; is omitted intentionally, since the list is recreated using the below code
	case MWM_CREATE:
              //CRR 25277: xpradipg 06 Oct 2004
              //the display needs to be refreshed forcibly
               dspl_Enable(0);
		/* initialization of administrative data */
		TRACE_EVENT(" Event: MWM_CREATE");
		//yanbin:  call magic4 function to create MMS list
		/* make sure g_pMessageHeaderList be freed if not free */
		M4_FreeListFolderMemory();
		box_menu_list_data=NULL;
		//CRR 23963: xpradipg 26 Aug 2004
		//CRR 23963: xpradipg 26 Aug 2004
		//check if no folder number is assigned before assigning
		if(folder == 0xFF)
			folder = (UBYTE)parameter;
		else
			parameter=(void*)folder;
		TRACE_EVENT_P1("the value of folder is %d",folder);
		//parameter=(folder==0xFF)?parameter:(void*)folder;
		if (parameter == (void *)MMS_INBOX)
		{
			//xrashmic 26 Aug, 2004 MMI-SPR-23931
			//added MM_LIST_COMPLETE so that the list does not contain 
			//incomplete messages
			//listParams  = MM_LIST_INBOX|MM_LIST_COMPLETE; 			
                     //May 17 2005  REF:  MMI-SPR-29887  x0012849
                     //To Implement the deferred MMS retrieval.
			listParams  = MM_LIST_INBOX|MM_LIST_NOT_RETRIEVED;
		}
		//CRR: 25291 - xrashmic 14 Oct 2004
		//To display a list of the sent messages.
		else if (parameter == (void *)MMS_SENT)
		{
			// xreddymn May-18-2005 MMI-SPR-29887: Removed MM_LIST_COMPLETE
			// as it causes messages from Inbox to be listed, with the new MMS library
			listParams  = MM_LIST_SENT;
		}
		else
		{
			// xreddymn May-18-2005 MMI-SPR-29887: Removed MM_LIST_COMPLETE
			// as it causes messages from Sent to be listed, with the new MMS library
	    	listParams  = MM_LIST_DRAFT;
		}
		
		eStatus = DAL_ListMessagesByParam(&g_pMessageHeaderList, listParams);

		if(eStatus != ENoError)
		{
			//M4_DebugStringMessage("MMSBox_exec_cb: eStatus != ENoError",sizeof("MMSBox_exec_cb: eStatus != ENoError"),0);
		}

		if(g_pMessageHeaderList == NULL || g_pMessageHeaderList->size ==0 )
		{
			T_DISPLAY_DATA display_info;
			//M4_DebugStringMessage("g_pMessageHeaderList->size==0",sizeof("g_pMessageHeaderList->size==0"),0);
			if(g_pMessageHeaderList != NULL) M4_FreeListFolderMemory();
			
			dlg_initDisplayData_TextId( &display_info,  TxtNull, TxtSoftBack,TxtEmptyList, TxtNull, COLOUR_STATUS);
			dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)MMSBox_info_cb, FOREVER, KEY_RIGHT|KEY_CLEAR|KEY_HUP);
			display_info.Identifier=0;
			info_dialog (win, &display_info);
			dspl_Enable(1);
			break;
		}
		
		box_menu_list_data =(ListMenuData *) ALLOC_MEMORY(sizeof(ListMenuData));
		box_menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( g_pMessageHeaderList->size * sizeof(T_MFW_MNU_ITEM) );
		//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
		//dynamically allocating memory for g_mmstopic. Total size = max size of one string in the list X total number of mms
		g_mmstopic=(char*)ALLOC_MEMORY(MMS_BOX_LIST_STRING_MAX_LENGTH*g_pMessageHeaderList->size);
		g_mmsstatus=(char*)ALLOC_MEMORY(MMS_BOX_LIST_STRING_MAX_LENGTH);

		// xreddymn Dec-15-2004 MMI-SPR-27384: Modifications for Inbox/Unsent/Sent box presentation
		// xrashmicn OMAPS00050170
		for (i = 0; (i < g_pMessageHeaderList->size) ; i++)
		{
			//CRR 25270: xpradipg    
			mnuInitDataItem(&box_menu_list_data->List[i]);
			box_menu_list_data->List[i].flagFunc = item_flag_none;
			//CRR 25270 && CRR 25268: 14 Oct 2004 - xpradipg
			//the temporary buffer is reset after every iteration
			memset(g_mmsstatus,'\0',MMS_BOX_LIST_STRING_MAX_LENGTH);

			//CRR 25270 & CRR 25268: 13 Oct 2004 - xpradipg
			//Set the title to Saved if the folder being listed is Unsent
			//Otherwise append thestring "New"/"Old" depending on the 
			//status of the read flag in the message header
			if(!(listParams & MM_LIST_DRAFT))
			{
				//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
				//Changed from static allocations for g_mmstopic and g_mmsstatus to dynamic allocation.
				if(g_pMessageHeaderList->ppList[i].read== TRUE)
					strcpy(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],"Old: ");
				else
					strcpy(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],"New: ");
			}
			else
			{
				//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
				//Changed from static allocations for g_mmstopic and g_mmsstatus to dynamic allocation.
				strcpy(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],"Saved: ");
				box_menu_list_data->List[i].str  = &g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH];
				// continue;
			}
			//CRR 25270 & CRR 25268: 13 Oct 2004 - xpradipg
			//The Topic is displayed for the mms, if the topic is not present
			//then the name is searched for corresponding to the number from
			//which the message was received. For EMS only the number /name is 
			//displayed
			if(g_pMessageHeaderList->ppList[i].type!=EMtSms)
			{
				lenSub=GetStringBytes(g_pMessageHeaderList->ppList[i].messageTypeHeader.mmsHeader.pSubject);
				//CRR 25270: xpradipg 
				if(lenSub==0)
				{
					// xreddymn Dec-15-2004 MMI-SPR-27384
					switch((UBYTE)parameter)
					{
						case MMS_INBOX:
							lenSub=GetStringBytes(g_pMessageHeaderList->ppList[i].messageTypeHeader.mmsHeader.pFrom);		
							break;
						case MMS_SENT:
							lenSub=GetStringBytes(g_pMessageHeaderList->ppList[i].messageTypeHeader.mmsHeader.pToList);
							break;
						default:
							lenSub=0;
							break;
					}
					if(lenSub==0)
					{
						strcpy(g_mmsstatus,"No name");
					}
					else
					{
						if(lenSub>MMS_BOX_LIST_SUB_MAX_LENGTH) lenSub=MMS_BOX_LIST_SUB_MAX_LENGTH;
						// xreddymn Dec-15-2004 MMI-SPR-27384
						switch((UBYTE)parameter)
						{
							case MMS_INBOX:
								ConvertUcs2To8BitString(g_pMessageHeaderList->ppList[i].messageTypeHeader.mmsHeader.pFrom, lenSub, (MByte*)g_mmsstatus);
								break;
							case MMS_SENT:
								ConvertUcs2To8BitString(g_pMessageHeaderList->ppList[i].messageTypeHeader.mmsHeader.pToList, lenSub, (MByte*)g_mmsstatus);
								break;
							default:
								strcpy(g_mmsstatus,"");
								break;
						}
						if (bookFindNameInPhonebook( g_mmsstatus, &phonebook_entry ))
						{
							if (phonebook_entry.name.len >0)
							{
								strncpy(g_mmsstatus,(const char*)phonebook_entry.name.data,lenSub);
							}
						}
					}
				}
				else
				{
					if(lenSub>MMS_BOX_LIST_SUB_MAX_LENGTH) lenSub=MMS_BOX_LIST_SUB_MAX_LENGTH;
					ConvertUcs2To8BitString(g_pMessageHeaderList->ppList[i].messageTypeHeader.mmsHeader.pSubject, lenSub, (MByte*)g_mmsstatus);
				}
				//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
				//Changed from static allocations for g_mmstopic and g_mmsstatus to dynamic allocation.
				strcat(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],g_mmsstatus);
				/* Dec-15-2004 MMI-SPR-27384: Insert the time stamp information */
				MMSBox_DT_string((char*)g_mmsstatus,&g_pMessageHeaderList->ppList[i].timestamp);
				strcat(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],"\n");
				strcat(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],g_mmsstatus);
			}
			//CRR 25270 & CRR 25268: 13 Oct 2004 - xpradipg
			//retrieve the number from the ems and look for the
			//corresponding entry in the phonebook, populate the
			//name if present else display the number
			else
			{
				lenSub=GetStringBytes(g_pMessageHeaderList->ppList[i].messageTypeHeader.smsHeader.pszAddress);
				if(lenSub>0)
				{
					if(lenSub>MMS_BOX_LIST_SUB_MAX_LENGTH) lenSub=MMS_BOX_LIST_SUB_MAX_LENGTH;
					ConvertUcs2To8BitString(g_pMessageHeaderList->ppList[i].messageTypeHeader.smsHeader.pszAddress, lenSub, (MByte*)g_mmsstatus);
					if (bookFindNameInPhonebook( g_mmsstatus, &phonebook_entry ))
					{
						if (phonebook_entry.name.len >0)
						{
							strncpy(g_mmsstatus,(const char*)phonebook_entry.name.data,lenSub);
						}
					}
				}
				//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
				//Changed from static allocations for g_mmstopic and g_mmsstatus to dynamic allocation.
				strcat(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],g_mmsstatus);
				/* Dec-15-2004 MMI-SPR-27384: Insert the time stamp information */
				MMSBox_DT_string((char*)g_mmsstatus,&g_pMessageHeaderList->ppList[i].timestamp);
				strcat(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],"\n");
				strcat(&g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH],g_mmsstatus);
			}
			box_menu_list_data->List[i].str  = &g_mmstopic[i*MMS_BOX_LIST_STRING_MAX_LENGTH];
		}

		box_menu_list_data->ListLength =g_pMessageHeaderList->size;
		box_menu_list_data->ListPosition = 1;
		box_menu_list_data->CursorPosition = 1;
		box_menu_list_data->SnapshotSize = g_pMessageHeaderList->size;
		box_menu_list_data->Font = 0;
		box_menu_list_data->LeftSoftKey = TxtSoftSelect;
		box_menu_list_data->RightSoftKey = TxtSoftBack;
		box_menu_list_data->KeyEvents = KEY_ALL;
		box_menu_list_data->Reason = 0;
		box_menu_list_data->Strings = TRUE;
		box_menu_list_data->Attr   = &MmsBox_menuAttrib;
		box_menu_list_data->autoDestroy    = FALSE;
		listDisplayListMenu(win,box_menu_list_data,(ListCbFunc)MMSBoxList_cb,0);
		//CRR 25277: xpradipg 06 Oct 2004
		//the display needs to be refreshed forcibly
		dspl_Enable(1);
		break;
		
	case MWM_DESTORY:
		TRACE_EVENT(" Event: MWM_DESTORY");
		if(box_menu_list_data)
		{
			if(box_menu_list_data->List && g_pMessageHeaderList)
			{
				FREE_MEMORY((void*)(box_menu_list_data->List),g_pMessageHeaderList->size * sizeof(T_MFW_MNU_ITEM ));
			}
			FREE_MEMORY((void*)(box_menu_list_data),sizeof(ListMenuData));
		}
		//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
		//Freeing the allocated memory on exiting the list screen
		if(g_mmsstatus)
			FREE_MEMORY((void*)g_mmsstatus,MMS_BOX_LIST_STRING_MAX_LENGTH);
		if(g_mmstopic)
			FREE_MEMORY((void*)g_mmstopic,MMS_BOX_LIST_STRING_MAX_LENGTH*g_pMessageHeaderList->size);
		
		//CRR 23963: xpradipg 26 Aug 2004
		//reset the folder value to default
		folder = 0xFF;
                //CRR 25277: xpradipg 06 Oct 2004
                //set the handle to NULL on destroying the window
                mmsboxwinhnd=NULL;
				g_MmsBoxWin=NULL;//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
		//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
		//M4_FreeListFolderMemory frees the memory for g_pMessageHeaderList. But g_pMessageHeaderList->size is used to
		//free memory for various dynamically allocated pointers eg. g_mmstopic. Hence this should be done at the end .
		M4_FreeListFolderMemory();
		break;
	case MWM_ONDRAW:
		TRACE_EVENT(" Event: MWM_ONDRAW");
		displaySoftKeys(TxtSoftOptions,TxtSoftBack);
		break;

	// xreddymn Dec-20-2004 MMI-SPR-27382: Save the handle to Inbox window
	case MWM_SUSPEND:
		g_MmsBoxWinSavedHnd=mmsboxwinhnd;
		mmsboxwinhnd=NULL;
		break;

	// xreddymn Dec-20-2004 MMI-SPR-27382: Restore the handle to Inbox window
	case MWM_RESUME:
		if(!mmsboxwinhnd)
		{
			mmsboxwinhnd=g_MmsBoxWinSavedHnd;
		}
		break;
		
	default:
	    break;
	}

	return;
}


/**/

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

 $Function:    	MMSBox_start

 $Description:	Start the creation of the main window for Create MMS
 
 $Returns:		mfw window handler 

 $Arguments:	parent_window - Parent window handler
 				menuAttr	  - Menu attributes.
 
*******************************************************************************/
T_MFW_HND MMSBox_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr)
{
	TRACE_FUNCTION ("MMSBox_start()");
	mmeBackLight(64);
	// xreddymn Nov-30-2004 MMI-SPR-23981: Retain the handle to the Message List menu window
	g_MmsBoxWin=MMI_CreateWindow(parent_window, (T_DIALOG_FUNC)MMSBox_exec_cb,(void*)menuAttr,(T_MFW_CB)0,0,0);
	return g_MmsBoxWin;
}


#define MMS_BOX_EXTERACT_MEDIA
#define MWM_EXTRACT_MEDIA_LIST	(MWM_USER+1)
#define MWM_EXTRACT_MEDIA_NONE	(MWM_USER+2)
#define MMS_EXTRACT_MEDIA_ERROR	(MWM_USER+3)

#if 1

PP_MESSAGE_HANDLE msgHandle = PP_MESSAGE_HANDLE_INVALID;

PP_S_OBJECT_DATA *pObjData = NULL;

PP_S_OBJECT_ATTRIB *pObjAttrib = NULL;

PP_S_MIME_OBJECT_ARRAY	*pObjArray = NULL;

M4_S_OBJECT_ITEM *pItem = NULL;

M4_S_OBJECT_ATTRIB *pAttrib = NULL;

UCS2 medianame[32]={'p','i','c','0',0};
int len_medianame=10;


void M4_FreeAttrib(void * block)	/*Pointer to function used to free this block of memory*/
{
	if(block)
		FREE_MEMORY((void*)block,sizeof(M4_S_OBJECT_ATTRIB));
}
void M4_FreeItem(void * block)	/*Pointer to function used to free this block of memory*/
{
	if(block)
		FREE_MEMORY((void*)block,sizeof(M4_S_OBJECT_ITEM));
}

/*****************************************************************************
 * Func : SaveObjectDone
 * Desc : It is the callback function indicating the result of saving object.
 *****************************************************************************/
ESTATUS M4_SaveObjectDone(EVENT_ID			aeId,
		       EVENT_TYPE		aeType,
			   MESSAGE_PARAM	ampParam,
			   EVT_HANDLE		evtHandle)
{
	switch(aeId)
	{
		case(EMG4_FileOpDone):
			{
				/* NOTES:
				 * Object storing is done
				 */

				/* 
				 * Further notification to upper layer if necessary
				 */
				DAL_PostMessage(EMG4_FileOpDone,
						        EVENT_REACTIVE,
								0,
								evtHandle->parentEvtHandle);
				// xreddymn Nov-26-2004 MMI-SPR-25278
				winDelete(g_inSaveModeWin);
                            //xrashmic 08 Feb, 2005 MMI-SPR-27853
                            //Added few more parameters for this function
				information_dialog(TxtSaved,TxtNull,NULL,NULL, TxtNull,TxtSoftBack,FOREVER,KEY_CLEAR|KEY_RIGHT|KEY_HUP,NULL);
			}
			break;

		case(EMG4_OpError):
		// xreddymn Nov-26-2004 MMI-SPR-25278
		winDelete(g_inSaveModeWin);
              //xrashmic 08 Feb, 2005 MMI-SPR-27853
              //Added few more parameters for this function
		information_dialog(TxtFailed,TxtFatalError,NULL,NULL,TxtNull,TxtSoftBack,FOREVER,KEY_CLEAR|KEY_RIGHT|KEY_HUP,NULL);
		default:
			break;
	}

	if(evtHandle)
	{
		FREE_MEMORY((void*)evtHandle,sizeof(*evtHandle));
	}
	// xreddymn Aug-26-2004, MMI-SPR-24113 (TII_MMS53) and MMI-SPR-23972 (TII_MMS41)
	// Removed the following lines since this is done in MWM_DESTROY of MMSBox_Extract_exec_cb
#if(0)
	/* NOTES:
	 * The PP Session must be closed 
	 */
	DAL_CloseMessageSession(msgHandle);

	/* Free the memory allocated before */
	pObjArray->oms.freeFunc(pObjArray);
	pObjData->oms.freeFunc(pObjData);
#endif
	return ENoError;
}
/*****************************************************************************
 * Func : SaveObject
 * Desc : User selects the object being saved
 *****************************************************************************/
ESTATUS M4_SaveObject(PP_OBJECT_ID	objId, EVT_HANDLE parentHandle)
{
	ESTATUS 	status = ENoError;
	EVT_HANDLE 	evtHandle = NULL;

	// xreddymn Nov-26-2004 MMI-SPR-25278
        //xrashmic 08 Feb, 2005 MMI-SPR-27853
        //Added few more parameters for this function
	g_inSaveModeWin=information_dialog(TxtPleaseWait,TxtNull,NULL,NULL,TxtNull,TxtNull,FOREVER,0,NULL);

	status = DAL_GetObjectByID(msgHandle, objId, &pObjData);
	TRACE_EVENT_P1("DAL_GetObjectByID :%d", status);

	if(ENoError != status)
	{
		return status;
	}

	status = DAL_GetObjectAttributes(msgHandle, objId, &pObjAttrib);
	TRACE_EVENT_P1("DAL_GetObjectAttributes :%d", status);

	if(ENoError != status)
	{
		pObjData->oms.freeFunc(pObjData);
		return status;
	}	

	pItem = (M4_S_OBJECT_ITEM *)ALLOC_MEMORY(sizeof(M4_S_OBJECT_ITEM));

	pAttrib = (M4_S_OBJECT_ATTRIB *)ALLOC_MEMORY(sizeof(M4_S_OBJECT_ATTRIB));

	evtHandle = (EVT_HANDLE)ALLOC_MEMORY(sizeof(EVT_STRUCT));

	if((NULL == evtHandle) || (NULL == pItem) || (NULL == pAttrib))
	{
		if(pItem)
		{
			FREE_MEMORY((void*)pItem,sizeof(*pItem));
		}

		if(pAttrib)
		{
			FREE_MEMORY((void*)pAttrib,sizeof(*pAttrib));
		}

		if(evtHandle)
		{
			FREE_MEMORY((void*)evtHandle,sizeof(*evtHandle));
		}
		return EOutOfMemory;
	}

	memset((void*)pItem, 0x00, sizeof(M4_S_OBJECT_ITEM));
	memset((void*)pAttrib, 0x00, sizeof(M4_S_OBJECT_ATTRIB));
	memset((void*)evtHandle, 0x00, sizeof(EVT_STRUCT));

	/* NOTES:
	 * Copy the information into appropriate structure
	 */
	pItem->memHdr.freeFunc = M4_FreeItem;/* Object free function */
	pItem->objectSize = pObjData->lObjectDataSize;
	pItem->pData = pObjData->objData.pByteData;

	pAttrib->memHdr.freeFunc = M4_FreeAttrib;/* Object free function */
	pAttrib->type = pObjAttrib->contentType/* Object Type: EMtMimeWbmp, etc*/;
	pAttrib->objectSize = pObjData->lObjectDataSize;
	pAttrib->drmInfo =  EDrmNotSet; /* DRM info */
	pAttrib->objectFile.fileNameLen = len_medianame; /* User Input FileName Size */ ;
	pAttrib->objectFile.pFileName = medianame;  /* User Input File Name */;

		
	/* NOTES:
	 * Setup the event handler
	 */

	evtHandle->handler = M4_SaveObjectDone;
	evtHandle->pData = pObjData;
	evtHandle->parentEvtHandle = parentHandle;

	status = DAL_StoreObjectAsync(evtHandle, pItem, pAttrib);
	TRACE_EVENT_P1("DAL_StoreObjectAsync :%d", status);

	return status;
}

/*****************************************************************************
 * Func: PPOpenMessageCallback
 * Desc: 
 *****************************************************************************/
ESTATUS M4_PPOpenMessageCallback(EVENT_ID			aeId,
		              EVENT_TYPE		aeType,
					  MESSAGE_PARAM		ampParam,
					  EVT_HANDLE		evtHandle)
{
	ESTATUS	status = ENoError;
	PP_OBJECT_ID 			objId;
	T_MFW_HND    win  = mfwParent(mfw_header());
	//M4_DebugStringMessage("M4_PPOpenMessageCallback", sizeof("M4_PPOpenMessageCallback"), 0);

	switch(aeId)
	{
		case(EMG4_FileOpDone):
			{
				/* 
				 * The PP Session is ready for listing objects available
				 */
				msgHandle = (PP_MESSAGE_HANDLE)ampParam;
				
				status = DAL_ListMessageObjects(msgHandle, &pObjArray);

				/* User use the this information to display the associated objects
				 * in this message
				 */
				//M4_DebugStringMessage("DAL_ListMessageObjects", sizeof("DAL_ListMessageObjects"), 0);
				M4_DebugMessage(status);
				//M4_DebugStringMessage("pObjArray->numOfObjects", sizeof("pObjArray->numOfObjects"), pObjArray->numOfObjects);
				M4_DebugMessage(pObjArray->numOfObjects);
				if(pObjArray==NULL || pObjArray->numOfObjects==0)
				{
					//SEND_EVENT(win, MWM_EXTRACT_MEDIA_NONE, 0, 0);
					MMSBox_Extract_exec_cb (win, MWM_EXTRACT_MEDIA_NONE, 0, 0);
				}else
				{
					// SEND_EVENT(win, MWM_EXTRACT_MEDIA_LIST, 0, 0);
					MMSBox_Extract_exec_cb (win, MWM_EXTRACT_MEDIA_LIST, 0, 0);
				}
			}
			break;

		case(EMG4_OpError):
			// xreddymn Aug-20-2004 MMI-SPR-23962 (TII_MMS31): Added error handling
			//SEND_EVENT(win, MMS_EXTRACT_MEDIA_ERROR, 0, 0);
			MMSBox_Extract_exec_cb (win, MMS_EXTRACT_MEDIA_ERROR, 0, 0);
			break;

		default:
			break;
	}

	if(evtHandle)
	{
		FREE_MEMORY ((void *)evtHandle, sizeof (EVT_STRUCT));
	}
	
	return ENoError;
}

ESTATUS M4_ExtractMedia(MM_MESSAGE_ID selectedMsgId, EVT_HANDLE parentHandle)
{
	EVT_HANDLE	evtHandler = NULL;
	ESTATUS		status = ENoError;

	evtHandler = (EVT_HANDLE)ALLOC_MEMORY(sizeof(EVT_STRUCT));

	if(NULL == evtHandler)
	{
		/* Error */
		return EOutOfMemory;
	}
	
	memset((void*)evtHandler, 0x00, sizeof(EVT_STRUCT));

	evtHandler->handler = M4_PPOpenMessageCallback;
	evtHandler->parentEvtHandle = parentHandle;

	/* 
	 * Open the PP session & wait for EMG4_FileOpDone
	 */
	
	status = DAL_OpenMessageAsync(evtHandler, selectedMsgId);
	TRACE_EVENT_P1("DAL_OpenMessageAsync :%d", status);
	if(ENoError != status)
	{
		FREE_MEMORY ((void *)evtHandler, sizeof (EVT_STRUCT));
	}
	return status;
}

ESTATUS DeleteMsgCallback(EVENT_ID		aeId,
		          EVENT_TYPE	aeType,
				  MESSAGE_PARAM	ampParam,
				  EVT_HANDLE	evtHandle)
{
	switch(aeId)
	{
		case(EMG4_FileOpDone):
			/*
			 * Msg Delete Successful
			 */
			// xreddymn Dec-20-2004 MMI-SPR-27382: Remove the "Please wait" screen
			winDelete(g_MmsPleaseWaitWin);
			// xreddymn Nov-30-2004 MMI-SPR-23981: Reload the message list
			MMI_DestoryWindow(g_OptionsWin);
			SEND_EVENT (g_MmsBoxWin, MWM_REDRAW, 0,(void *)folder);
			break;

		case(EMG4_OpError):
			/*
			 * Msg Delete Fail with error code in ampParam
			 */
			// xreddymn Dec-20-2004 MMI-SPR-27382: Remove the "Please wait" screen
			winDelete(g_MmsPleaseWaitWin);
			// xreddymn Nov-30-2004 MMI-SPR-23981: Display an error dialog
			MMI_DestoryWindow(g_OptionsWin);
			SEND_EVENT (g_MmsBoxWin, MWM_REDRAW, 0,(void *)folder);
			break;
		default:
			break;
	}

	if(evtHandle)
	{
		FREE_MEMORY ((void *)evtHandle, sizeof (EVT_STRUCT));

	}
}
/*****************************************************************************
 *
 *****************************************************************************/
ESTATUS DeleteMsg(MM_MESSAGE_ID msgId)
{
	EVT_HANDLE evtHandle = NULL;

	evtHandle = (EVT_HANDLE)ALLOC_MEMORY(sizeof(EVT_STRUCT));

	if(NULL == evtHandle)
	{
		return EOutOfMemory;
	}

	memset((void*)evtHandle, 0x00, sizeof(EVT_STRUCT));

	evtHandle->handler = DeleteMsgCallback;
	
	(void)DAL_DeleteMessageAsync(evtHandle, msgId);

	return ENoError;
}


#endif

static T_MFW_HND l_extractwin=NULL;
static char topic[16];


static void MMSBox_ExtractMedia_edit_cb( T_MFW_HND win, USHORT Identifier,UBYTE reason)
{
	T_MFW_WIN	        * win_data = ((T_MFW_HDR *) win)->data;
	T_DISPLAY_DATA display_info;
    	ESTATUS status;

	TRACE_EVENT_P1("MMSBox_ExtractMedia_edit_cb() %d", Identifier);

	switch (reason)
    {
	case INFO_KCD_LEFT:  // confirm (press LEFT soft key)
        { 


		MMS_ConvertStringToUcs2((const MByte *)(topic), 
                                            strlen(topic),
                                            medianame);

		len_medianame=2*(strlen(topic)+1);
		status=M4_SaveObject((PP_OBJECT_ID)Identifier, 0);
		if(status==ENoError)
		{
		}else if(status==EObjectAlreadyExists)
		{
			
		}else
		{
		}
        }
    	break;

	case INFO_KCD_RIGHT:
	case INFO_KCD_HUP:
    		//xreddymn Aug-20-2004 MMI-SPR-24114 (TII_MMS54)
    		//MMI_DestoryWindow(win);
    	break;
	default:
    		TRACE_EVENT("Err: Default");
    	break;
    }
    g_MmsExtractEdtWin=NULL;//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
}

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

 $Function:     MMSBoxList_ExtractMedia_cb

 $Description:  Callback function for the melody list.

 $Returns:    none

 $Arguments:  Parent - parent window.
        ListData - Menu item list
*******************************************************************************/

void MMSBoxList_ExtractMedia_cb(T_MFW_HND * Parent, ListMenuData * ListData)
{
	TRACE_EVENT_P1("MMSBoxList_ExtractMedia_cb : %d", ListData->Reason);
	TRACE_EVENT_P2("ExtractMedia win parent: %x, l_extractwin: %x", Parent,l_extractwin);
	
	if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR)
		|| (ListData->Reason EQ LISTS_REASON_HANGUP))	// sbh - added hangup key
	{
		listsDestroy(ListData->win);
		MMI_DestoryWindow(l_extractwin);
	}
	else if(ListData->Reason EQ LISTS_REASON_SELECT)
	{
		T_AUI_EDITOR_DATA editor_data;

		AUI_edit_SetDefault(&editor_data);
		AUI_edit_SetDisplay(&editor_data, CENTRE_EDITOR, COLOUR_EDITOR_XX, EDITOR_FONT);

		//xreddymn Sep-24-2004 MMI-SPR-25148 : Modified this to get the object index from the array of indices
//		AUI_edit_SetEvents(&editor_data, (USHORT)( pObjArray->pMsgObject[ListData->CursorPosition].objId),
//			TRUE, FOREVER, (T_AUI_EDIT_CB)MMSBox_ExtractMedia_edit_cb);
		AUI_edit_SetEvents(&editor_data, (USHORT)( pObjArray->pMsgObject[extra_menu_list_indices[ListData->CursorPosition]].objId),
			TRUE, FOREVER, (T_AUI_EDIT_CB)MMSBox_ExtractMedia_edit_cb);
		AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtTopics, NULL);
		AUI_edit_SetAltTextStr(&editor_data, 0, TxtNames, TRUE, TxtSoftBack);
              //AUI_edit_SetMode(&editor_data,ED_MODE_ALL, ED_CURSOR_UNDERLINE);
		AUI_edit_SetMode(&editor_data,ED_MODE_ALPHA, ED_CURSOR_UNDERLINE);
		AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE*)topic, 16);
		g_MmsExtractEdtWin = AUI_edit_Start(ListData->win, &editor_data);//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
	}
}

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

 $Function:    	MMSBox_Extract_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.
 			
*******************************************************************************/

/* xreddymn Aug-20-2004, MMI-SPR-23962 (TII_MMS31), Changes start:
 * Set to 1 for information display using dialog box
 * Set to 0 for information display using direct calls to display functions
 */
#define MMS_DIALOG_DISPLAY	1

/* In some cases, after object extraction, we may get an empty list. For such cases,
 * MMSBox_Extract_exec_list will be set to FALSE.
 */
BOOL MMSBox_Extract_exec_list=FALSE;

/* Keeps track of the window used to display the list or empty dialog */
T_MFW_HND MMSBox_Extract_exec_win;

/* Default key handler for MMIWindow. Control would be passed to this
 * in case a list menu is displayed, otherwise, a custom key handler will be called
 */
extern int MMIWindow_kbd_cb (MfwEvt e, MfwKbd *k);

#if(MMS_DIALOG_DISPLAY)
/* Call back function for the "Empty List" information dialog */
static void MMSBox_extract_info_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
	switch (reason)
	{
	case INFO_KCD_HUP:
	case INFO_KCD_RIGHT:
	case INFO_KCD_CLEAR:
		MMI_DestoryWindow(MMSBox_Extract_exec_win);
		break;
	default:
		break;
	}
}
#endif // MMS_DIALOG_DISPLAY

/* Key handler: In case of list menu, control is passed to the default key handler */
int MMSBox_Extract_exec_kbd_cb (MfwEvt e, MfwKbd *k)
{
	if(MMSBox_Extract_exec_list == TRUE)
	{
		return MMIWindow_kbd_cb(e, k);
	}
	else
	{
		switch (k->code)
		{
		case KCD_HUP:
		case KCD_RIGHT:
		case KCD_CLEAR:
		 	MMI_DestoryWindow(MMSBox_Extract_exec_win);
			return MFW_EVENT_CONSUMED;
		    break;
		default:
		    return MFW_EVENT_CONSUMED;
		}
	}
}

/* xreddymn Aug-20-2004, MMI-SPR-23962 (TII_MMS31): Changes end */

void MMSBox_Extract_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
    /* callback handler for events sent to to trigger execution */
{
	int i, count;
	TRACE_FUNCTION ("MMSBox_Extract_exec_cb()");
	//M4_DebugStringMessage("MMSBox_Extract_exec_cb", sizeof("MMSBox_Extract_exec_cb"),0);
	
	switch (event)
	{
	case MWM_CREATE:
		TRACE_EVENT(" Event: MWM_CREATE");
		/* initialization of data */
		msgHandle = PP_MESSAGE_HANDLE_INVALID;
		pObjData = NULL;
		pObjAttrib = NULL;
		pObjArray = NULL;
		pItem = NULL;
		pAttrib = NULL;
		M4_ExtractMedia(g_pMessageHeaderList->ppList[g_currentMessage].id, 0);
		break;
	case MWM_EXTRACT_MEDIA_NONE:
		{
			T_DISPLAY_DATA display_info;
			T_MFW_HND *win_handle;
			//M4_DebugStringMessage("pObjArray->numOfObjects==0",sizeof("pObjArray->numOfObjects==0"),0);
			//xreddymn Aug-17-2004, MMI-SPR-23962 (TII_MMS31): Moved back functionality to RSK
			dspl_Enable(0);
			dlg_initDisplayData_TextId( &display_info, TxtNull, TxtSoftBack, TxtEmptyList, TxtNull, COLOUR_STATUS);
			dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)MMSBox_info_cb, FOREVER, KEY_RIGHT|KEY_CLEAR|KEY_HUP);
			display_info.Identifier=0;
			win_handle=info_dialog (win, &display_info);
			win_show(win_handle);
			dspl_Enable(1);
		}
		break;
	// xreddymn Aug-20-2004 MMI-SPR-23962 (TII_MMS31): Added error handling
	case MMS_EXTRACT_MEDIA_ERROR:
		{
			T_DISPLAY_DATA display_info;
			T_MFW_HND *win_handle;
			dspl_Enable(0);
			dlg_initDisplayData_TextId( &display_info, TxtNull, TxtSoftBack, TxtFailed, TxtNull, COLOUR_STATUS);
			dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)MMSBox_extract_info_cb, FOREVER, KEY_RIGHT|KEY_CLEAR|KEY_HUP);
			display_info.Identifier=0;
			win_handle=info_dialog (win, &display_info);
			win_show(win_handle);
			dspl_Enable(1);
		}
		break;
	case MWM_EXTRACT_MEDIA_LIST:
		//M4_DebugStringMessage("MWM_EXTRACT_MEDIA_LIST", sizeof("MWM_EXTRACT_MEDIA_LIST"), pObjArray->numOfObjects);
		M4_DebugMessage(pObjArray->numOfObjects);
		extra_menu_list_data =(ListMenuData *) ALLOC_MEMORY(sizeof(ListMenuData));
		// xreddymn Aug-09-2004: MMI-SPR-23920 (TII_MMS7), If the object list is empty, then break out
		if(extra_menu_list_data==NULL)
		{
			//M4_DebugStringMessage("extra_menu_list_data Alloc memory fail", sizeof("extra_menu_list_data Alloc memory fail"), 0);
			break;
		}
		extra_menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( pObjArray->numOfObjects* sizeof(T_MFW_MNU_ITEM) );
		if(extra_menu_list_data->List==NULL)
		{
			break;
		}
		// xreddymn Sep-24-2004, MMI-SPR-25148 : Allocate memory for the list of indices
		extra_menu_list_indices = (S16*) ALLOC_MEMORY(pObjArray->numOfObjects * sizeof(S16));
		if(extra_menu_list_indices==NULL)
		{
			break;
		}
		/* xreddymn Aug-18-2004, MMI-SPR-23962 (TII_MMS31): i is now used to index into
		 * extra_menu_list_data->List[] and count is used to index into pObjArray->pMsgObject[]
		 * On exit of the loop, count will contain the total objects listed
		 */
		for (count = 0, i=0; i < pObjArray->numOfObjects; count++, i++)
		{
			mnuInitDataItem(&extra_menu_list_data->List[count]);
			
			extra_menu_list_data->List[count].flagFunc = item_flag_none;
			M4_DebugMessage(pObjArray->pMsgObject[i].contentType);
			//xreddymn Sep-24-2004 MMI-SPR-25148 : Insert object index into the list of indices
			extra_menu_list_indices[count]=i;
			switch(pObjArray->pMsgObject[i].contentType)
			{
			case EMtMimeJpeg:
				extra_menu_list_data->List[count].str  = "Jpeg picture";
				break;
			case EMtMimeGif:
				extra_menu_list_data->List[count].str  = "Gif picture";
				break;
			case EMtMimeBmp:
				extra_menu_list_data->List[count].str  = "Bmp picture";
				break;
			case EMtMimeWbmp:
				extra_menu_list_data->List[count].str  = "WBmp picture";
				break;
			case EMtMimePng:
				extra_menu_list_data->List[count].str  = "Png picture";
				break;
			case EMtTextPlain:
				//xreddymn Aug-17-2004 MMI-SPR-23962 (TII_MMS31): Disabled text extraction
				//extra_menu_list_data->List[i].str  = "Plain text";
				--count;
				break;
			case EMtTextPhoneNumber:
				extra_menu_list_data->List[count].str  = "Phone Number";
				break;
			case EMtTextEmail:
				extra_menu_list_data->List[count].str  = "Email";
				break;
			//xreddymn Aug-23-2004 MMI-SPR-23962 (TII_MMS31): Audio AMR included for listing
			case EMtMimeAmr:
				extra_menu_list_data->List[count].str  = "Audio AMR";
				break;
			//xreddymn Jan-31-2004 MMI-SPR-28483: Audio MIDI included for listing
			case EMtMimeMidi:
				extra_menu_list_data->List[count].str  = "Audio MIDI";
				break;
			default:
				//xreddymn Aug-17-2004 MMI-SPR-23962 (TII_MMS31): Disabled Unknown object extraction
				//extra_menu_list_data->List[i].str  = "Unknown";
				--count;
			}
		}
		// xreddymn Aug-09-2004: MMI-SPR-23962 (TII_MMS31), Display a dialog if there are no objects to extract
		if(count<=0)
		{
			MMSBox_Extract_exec_list=FALSE;
#if(MMS_DIALOG_DISPLAY)
			{
			/* Display information using a dialog box */
			T_DISPLAY_DATA display_info;
			T_MFW_HND *win_handle;
			dspl_Enable(0);
 			dlg_initDisplayData_TextId( &display_info, TxtNull, TxtSoftBack, TxtEmptyList, TxtNull, COLOUR_STATUS);
			dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)MMSBox_extract_info_cb, FOREVER, KEY_RIGHT|KEY_CLEAR|KEY_HUP);
			display_info.Identifier=0;
			win_handle=info_dialog (win, &display_info);
			win_show(win_handle);
			dspl_Enable(1);
			}
#else // MMS_DIALOG_DISPLAY
			{
			/* Display information directly */
			char *str=MmiRsrcGetText(TxtEmptyList);
			dspl_Enable(0);
			dspl_SetBgdColour(COL_White);
			dspl_ClearAll();
			dspl_SetFgdColour(COL_Black);
			dspl_TextOut(0,32,0,str);
			displaySoftKeys(TxtNull,TxtSoftBack);
			dspl_Enable(1);	
			}
#endif // MMS_DIALOG_DISPLAY
			break;
		}
		extra_menu_list_data->ListLength = count;
		extra_menu_list_data->ListPosition = 1;
		extra_menu_list_data->CursorPosition = 1;
		extra_menu_list_data->SnapshotSize = count;
		extra_menu_list_data->Font = 0;
		extra_menu_list_data->LeftSoftKey = TxtSoftSelect;
		extra_menu_list_data->RightSoftKey = TxtSoftBack;
		extra_menu_list_data->KeyEvents = KEY_ALL;
		extra_menu_list_data->Reason = 0;
		extra_menu_list_data->Strings = TRUE;
		extra_menu_list_data->Attr   = &MmsBox_ExtractMedia_menuAttrib;
		extra_menu_list_data->autoDestroy    = FALSE;
		listDisplayListMenu(win,extra_menu_list_data,(ListCbFunc)MMSBoxList_ExtractMedia_cb,0);
		dspl_Enable(1);
		break;
	case MWM_DESTORY:
		TRACE_EVENT(" Event: MWM_DESTORY");
		if(extra_menu_list_data)
		{
			if(extra_menu_list_data->List && pObjArray)
			{
				FREE_MEMORY((void*)(extra_menu_list_data->List), pObjArray->numOfObjects* sizeof(T_MFW_MNU_ITEM ));
			}
			FREE_MEMORY((void*)(extra_menu_list_data),sizeof(ListMenuData));
		}
		//xreddymn Sep-24-2004 MMI-SPR-25148 : Free memory for list of indices
		if(extra_menu_list_indices)
		{
			FREE_MEMORY((void*)extra_menu_list_indices, pObjArray->numOfObjects * sizeof(S16));
		}
		if(pObjArray) pObjArray->oms.freeFunc(pObjArray);
		//xreddymn Aug-24-2004 MMI-SPR-23972 (TII_MMS41) and MMI-SPR-24113 (TII_MMS53): Close the message session if it hasn't been already done
		if(pObjData) pObjData->oms.freeFunc(pObjData);
		if(msgHandle!=PP_MESSAGE_HANDLE_INVALID)
		{
			DAL_CloseMessageSession(msgHandle);
			msgHandle=PP_MESSAGE_HANDLE_INVALID;
		}
		MMSBox_Extract_exec_win=NULL;//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
		break;
	case MWM_ONDRAW:
		TRACE_EVENT(" Event: MWM_ONDRAW");
		// xreddymn Aug-20-2004, MMI-SPR-23962 (TII_MMS31): Removed direct display for now
#if(MMS_DIALOG_DISPLAY)
		// Dialog display to be added
#else // MMS_DIALOG_DISPLAY
		dspl_ClearAll();
		dspl_TextOut(0,32,0,"Please Wait");
		displaySoftKeys(TxtSoftOK,TxtSoftBack);
#endif // MMS_DIALOG_DISPLAY
		break;
	default:
	    return;
	}
}

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

 $Function:    	MMSBox_Extract_start

 $Description:	Start the creation of the main window for Create MMS
 
 $Returns:		mfw window handler 

 $Arguments:	parent_window - Parent window handler
 				menuAttr	  - Menu attributes.
 
*******************************************************************************/
T_MFW_HND MMSBox_Extract_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr)
{
	TRACE_FUNCTION ("MMSBox_Extract_start()");
	// xreddymn Aug-20-2004, MMI-SPR-23962 (TII_MMS31): Initialization
	MMSBox_Extract_exec_list=TRUE;
	MMSBox_Extract_exec_win=MMI_CreateWindow(parent_window, (T_DIALOG_FUNC)MMSBox_Extract_exec_cb,(void*)menuAttr,(T_MFW_CB)MMSBox_Extract_exec_kbd_cb,0,0);
	return MMSBox_Extract_exec_win;
}


#define MMS_BOX_OPTION_BEGIN


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

 $Function:    	MMSBox_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 MMSBox_OPT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
    /* callback handler for events sent to to trigger execution */
{
	TRACE_FUNCTION ("MMSBox_OPT_exec_cb()");

	switch (event)
	{
	case MWM_CREATE:
		TRACE_EVENT(" Event: MWM_CREATE");
		/* initialization of administrative data */
		winShow(win);
		break;
	case MWM_DESTORY:
		TRACE_EVENT(" Event: MWM_DESTORY");
		// xreddymn Nov-30-2004 MMI-SPR-23981: Moved this from MMSBox_Read_exec_cb
		//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
		//Only for Inbbox this check for new ems messages are necessary not for other folders
		if(folder==MM_LIST_INBOX)
		{
			if( MMS_Is_Unread_Msgs_Inbox())
			{
				idle_data.ems = TRUE;
			}
			else
			{
				idle_data.ems = FALSE;
			}
		}
              //xrashmic 20 Dec, 2004  MMI-SPR-23921
              // On deleting the window, set the handler to NULL
              g_OptionsWin=NULL;
		break;
	case MWM_ONDRAW:
		TRACE_EVENT(" Event: MWM_ONDRAW");
		dspl_ClearAll();
		displaySoftKeys(TxtSoftOK,TxtSoftBack);
		break;
	default:
	    return;
	}
}


extern void EMS_RetriveSendMsg(UINT32 MsgId);
// xrashmic 13 Aug, 2004 Bug: 19
extern T_MFW_HND EMSCreate_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr);

//CRR 23963: xpradipg 26 Aug 2004
/*******************************************************************************

 $Function:    	MMSBox_OPT_kbd_cb

 $Description:	Keyboard handler for the options menu
 
 $Returns:	if event consumed or not

 $Arguments:	 
 
*******************************************************************************/

static int MMSBox_OPT_kbd_cb(MfwEvt e, MfwKbd *k)
{
  T_MFW_HND    win  = mfwParent(mfw_header());
    T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
    T_MMIWINDOW      * data = (T_MMIWINDOW *)win_data->user;

    TRACE_FUNCTION ("MMIWindow_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 */
			{
				T_MFW_HND    pWin  = data->parent ;
				T_MFW_WIN  * pwin_data = ((T_MFW_HDR *)pWin)->data;
    				T_MMIWINDOW      * pdata = (T_MMIWINDOW *)pwin_data->user;

				mnuEscape(data->menu);
				if (pdata NEQ NULL)
				{
					SEND_EVENT (pdata->parent, MWM_REDRAW, 0,(void *)folder);
				}
			}
		     break;
		default: /* no response to all other keys */
		    return MFW_EVENT_CONSUMED;
		}
	}
    return MFW_EVENT_CONSUMED;
}


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

 $Function:    	MMSBox_OPT_start

 $Description:	Start the creation of the main window for Create MMS
 
 $Returns:		mfw window handler 

 $Arguments:	parent_window - Parent window handler
 				menuAttr	  - Menu attributes.
 
*******************************************************************************/
T_MFW_HND MMSBox_OPT_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr)
{
	TRACE_FUNCTION ("MMSBox_OPT_start()");
	//CRR 23963: xpradipg 26 Aug 2004
	//keyboard handler added for the options menu
	// xreddymn Nov-30-2004 MMI-SPR-23981: Retain handle to Message Options sub-menu window
    if(g_pMessageHeaderList->ppList[g_currentMessage].type==EMtSms)
    {
        //xrashmic 7 Dec, 2004 MMI-SPR-23965
        // Separate Option list for EMS. 
        g_OptionsWin=MMI_CreateWindow(parent_window, (T_DIALOG_FUNC)MMSBox_OPT_exec_cb,(void*)menuAttr,(T_MFW_CB)MMSBox_OPT_kbd_cb,&EMSBox_OPTAttrib,0);    
    }
    else
    {
        g_OptionsWin=MMI_CreateWindow(parent_window, (T_DIALOG_FUNC)MMSBox_OPT_exec_cb,(void*)menuAttr,(T_MFW_CB)MMSBox_OPT_kbd_cb,&MMSBox_OPTAttrib,0);
    }       
    return g_OptionsWin;    
}
//menu call back
static int MMSBox_OPTexeRead(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    MMSBox_Read_start(win, NULL);
}
 // May 11 2005  REF:  MMI-SPR-29887  x0012849
 // New Function which is called when tried to retrieve the incomplete MMS.
/*******************************************************************************
 $Function:    	MMSBox_OPTexeDeferDownload
 $Description:	Starts the retrieval of MMS from the server
 $Returns:		
 $Arguments:	
*******************************************************************************/
extern T_idle idle_data;	
static int MMSBox_OPTexeDeferDownload(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND dlg_win = NULL;  
    TRACE_EVENT("MMSBox_OPTexeDeferDownload");
    MMSactive = TRUE ; 
    if (idle_data.search)
    {
         dlg_win= information_dialog(TxtNotConnected,TxtNull,NULL,NULL, TxtNull,TxtNull,TWO_SECS,0,NULL);
 	  return 1;	
    }
    DeferDownloadMsg(g_pMessageHeaderList->ppList[g_currentMessage].id);
    return 0;	
}
  // May 12 2005  REF:  MMI-SPR-29887  x0012849
 // New Function which is called when tried to retrieve the incomplete MMS.
/*******************************************************************************
 $Function:    	DeferDownloadMsg
 $Description:	Starts the retrieval of MMS from the server
 $Returns:	 return the status of the operation.	
 $Arguments: msgID  - For which the MMS body need to be retrieved	 
*******************************************************************************/

void DeferDownloadMsg(MM_MESSAGE_ID msgId)
{

     MM_S_MESSAGE_HEADER *appMessageHeader;
	TRACE_FUNCTION ("DeferDownloadMsg()");
       // Jun 23 2005  REF:  MMI-SPR-29887  x0012849
	 is_downloadcancelled=FALSE; 	 
        is_deferdownload = TRUE; 
   	 AUI_mms_status_notify(MMS_RECEIVE_PROGRESS);       
       MMSDownLoadNow(msgId);
       // May 11 2005  REF:  MMI-SPR-29887  xrashmi
      AUI_retrievemms_gprs_set_callback();
}

 // May 12 2005  REF:  MMI-SPR-29887  x0012849
 // New Function which is called when tried to retrieve the incomplete MMS.
/*******************************************************************************
 $Function:    	MMSDownLoadNow
 $Description:	Starts the download of MMS  from the server
 $Returns:	 return the status of the operation.	
 $Arguments: msgID  - For which the MMS body need to be retrieved	 
*******************************************************************************/

 void MMSDownLoadNow(MM_MESSAGE_ID msgId)
{
   EVT_HANDLE evtHandle = NULL;
   ESTATUS status;
TRACE_FUNCTION ("MMSDownLoadNow()"); 
   evtHandle = (EVT_HANDLE)ALLOC_MEMORY(sizeof(EVT_STRUCT));
   if(NULL == evtHandle)    
       return;    
   is_deferdownload = TRUE;  
   is_notifyResponse= TRUE;   
   // Jun 23 2005  REF:  MMI-SPR-29887  x0012849
   rtvprogressValue=0;                    
   memset((void*)evtHandle, 0x00, sizeof(EVT_STRUCT));
   evtHandle->handler = DeferDownloadMsgCallback;
   status = DAL_GetMessageAsync(evtHandle, msgId);    
   }

 // May 12 2005  REF:  MMI-SPR-29887  x0012849
 // New Function which is called when tried to retrieve the incomplete MMS.
/*******************************************************************************
 $Function:    	 DeferDownloadMsgCallback
 $Description:	Starts the retrieval of MMS from the server
 $Returns:	status of the operation	
 $Arguments: 	 
*******************************************************************************/

static ESTATUS DeferDownloadMsgCallback(EVENT_ID		aeId,
		          EVENT_TYPE	aeType,
				  MESSAGE_PARAM	ampParam,
				  EVT_HANDLE	evtHandle)
{
                               
    
    BOOL deferdownload_finish = FALSE;
   TRACE_FUNCTION ("DeferDownloadMsgCallback()");       
    switch(aeId)
    {
        case(EMG4_NetworkOpDone):
            deferdownload_finish = TRUE;		 	   
           break;
       case(EMG4_OpProgress):
	   deferdownload_finish = FALSE;
         // Jun 23 2005  REF:  MMI-SPR-29887  x0012849
         // Whenever there is a progress while retrieving MMS, update the display with the value..
        if(FALSE== is_downloadcancelled   &&  (ampParam > ( rtvprogressValue +5 )) )	 	
        	{ 

                if(ampParam < 0)
  		    rtvprogressValue=0;
		  else if(ampParam > 95 )
                   rtvprogressValue=100;	    	 	
		  else
                   rtvprogressValue=ampParam; 
		  AUI_mms_status_notify(MMS_RECEIVE_PROGRESS );
        	}
          break;
      case(EMG4_OpError):
	    deferdownload_finish = TRUE;	   		 
           break;
      default:			
           break;
   }
   if(deferdownload_finish == TRUE)
   {        
        if(evtHandle)
        {
            FREE_MEMORY ((void *)evtHandle, sizeof (EVT_STRUCT));
        }

     }                       
}
static int MMSBox_OPTexeExtract(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    l_extractwin=MMSBox_Extract_start(win, NULL);
}

// xreddymn Oct-14-2004 MMI-SPR-25273
extern char EmsNumber[];
extern BOOL gEmsForward;
extern UINT32 gEmsMsgId;

static int MMSBox_OPTexeForward(MfwMnu* m, MfwMnuItem* i)
{
// xreddymn Oct-14-2004 MMI-SPR-25273: Re-implemented this function
	// xreddymn Oct-14-2004 MMI-SPR-25273: Added forward feature for EMS messages
	if(g_pMessageHeaderList->ppList[g_currentMessage].type==EMtSms)
	{
#ifdef FF_MMI_EMS
		T_MFW_HND win = mfwParent(mfw_header());
		gEmsForward=TRUE;
		gEmsMsgId = g_pMessageHeaderList->ppList[g_currentMessage].id;
/* 1 -> Insert existing phone number into the editor
 * 0 -> Start with blank phone number editor
 */
#if(0)
	{
		U16 *data;
		S32	length;
		data=(U16*)(g_pMessageHeaderList->ppList[g_currentMessage].messageTypeHeader.smsHeader.pszAddress);
		length=GetStringBytes((const UCS2 *)data);
		if(length>0)
		{
			ConvertUcs2To8BitString((const UCS2 * const)g_pMessageHeaderList->ppList[g_currentMessage].messageTypeHeader.smsHeader.pszAddress,
				length,(MByte*)EmsNumber);
		}
		else /* If the number is not valid, then start with blank number and ask the user to input */
		{
			strcpy((char*)EmsNumber,"");
		}
	}
#else // if(0)
		// Clear the number - Start with a blank number on the phone number input screen
		strcpy((char*)EmsNumber,"");
#endif // if(0)
		EMSCreate_start(win, 0);
#endif // FF_MMI_EMS
	}
//xrashmic 14 Dec, 2004 MMI-SPR-23921
// Added forward feature for MMS messages
       else
       {        
                 MMSactive=TRUE;
                 MMSFwd_start();
       }

}

//    Nov 05, 2005	REF: OMAPS00049502   Sumanth Kumar. C
//    Fix:		An external variable to store the Mms Number extracted from the message header.
extern char MmsNumber[];

static int MMSBox_OPTexeReply(MfwMnu* m, MfwMnuItem* i)
{
	T_MFW_HND    win  = mfwParent(mfw_header());
	//Nov 05, 2005	REF: OMAPS00049502   Sumanth Kumar. C
       //Fix:		A local variable to store the length of the senders address.
	S32	length;

	// xrashmic 13 Aug, 2004 Bug: 19
	// When reply is selected for a message from the inbox, we need to display corresponding 
	// compose screen i.e either EMS compose or MMS compose screen
	// TRACE_EVENT("Message Type = %d",g_pMessageHeaderList->ppList[g_currentMessage].type);
	if(g_pMessageHeaderList->ppList[g_currentMessage].type==EMtSms)
	{
#ifdef FF_MMI_EMS
		EMSCreate_start(win, 0);
#endif
	}
	else
	{
#ifdef FF_MMI_MMS
              //Nov 05, 2005	REF: OMAPS00049502   Sumanth Kumar. C
              //Fix:	Extraction of Senders number from the message header in the form of Unicode and converting it to 8bit string.
		length=GetStringBytes((const UCS2 *)g_pMessageHeaderList->ppList[g_currentMessage].messageTypeHeader.mmsHeader.pFrom);
		if(length>0)
		{
			ConvertUcs2To8BitString((const UCS2 * const)g_pMessageHeaderList->ppList[g_currentMessage].messageTypeHeader.mmsHeader.pFrom,
				length,(MByte*)MmsNumber);
		}
		else /* If the number is not valid, then start with blank number and ask the user to input */
		{
			strcpy((char*)MmsNumber,"");
		}

                // Apr 07 2005  REF:  MMI-SPR-27826  x0012849
               // To avoid crash when a user replies to the MMS which is there in Inbox 
               // If it is not set to TRUE , ATB_wap_content() will display the windows saying downloading data.
               MMSactive=TRUE;          
		MMSCreate_start(win, 0);
#endif
	}
}

static void MMSBox_Delete_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{

	TRACE_FUNCTION("MMSBox_Delete_cb");

	switch (reason)
	{
	case INFO_KCD_LEFT:
		//yanbin: Call magic4 function to delete text
		DeleteMsg(g_pMessageHeaderList->ppList[g_currentMessage].id);
		// xreddymn Dec-20-2004 MMI-SPR-27382: Display a "Please Wait" screen while deleting a message
		{
			T_DISPLAY_DATA display_info;
			T_MFW_HND    win  = mfwParent(mfw_header());

			dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, TxtPleaseWait, TxtNull, COLOUR_STATUS);
			dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)MMSBox_Delete_cb, FOREVER, 0);
			g_MmsPleaseWaitWin=info_dialog (win, &display_info);
		}
		break;
	case INFO_KCD_HUP:
	case INFO_KCD_RIGHT:
	case INFO_KCD_CLEAR:
		//return back
		break;
	default:
		break;
	}
}
static int MMSBox_OPTexeDelete(MfwMnu* m, MfwMnuItem* i)
{
	T_DISPLAY_DATA display_info;
	T_MFW_HND    win  = mfwParent(mfw_header());
	dlg_initDisplayData_TextId( &display_info, TxtSoftOK, TxtSoftBack, TxtPressOk, TxtDelete, COLOUR_STATUS);
	dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)MMSBox_Delete_cb, FOREVER, KEY_LEFT |KEY_RIGHT|KEY_CLEAR|KEY_HUP);
	info_dialog (win, &display_info);
}



#define PLAY_CURRENT_MMS_BEGIN
/*
void M4_DebugMessage_Pn ( char *format, ... )
{
	char trace_buf[128];
	va_list varpars;

	va_start (varpars, format);      
	vsprintf(trace_buf,format,varpars);
	va_end (varpars);             
	//M4_DebugStringMessage(trace_buf,strlen(trace_buf), 0);
}
*/
ESTATUS M4_PlayMessageEventHandlerFunc(EVENT_ID aeId, EVENT_TYPE aeType, MESSAGE_PARAM ampParam, EVT_HANDLE evtHandle)
{
//	M4_DebugMessage_Pn("M4_PlayMessageEventHandlerFunc() aeId: %d,aeType: %d,ampParam:%d",aeId,aeType,ampParam);
	switch(aeId)
	{
		case EMG4_FileOpDone:
//			M4_DebugMessage_Pn("EMG4_FileOpDone");
			DAL_PostMessage(EMG4_Resume,EMG4_Type_NotUsed,0,NULL);
			
			DAL_PostMessage(EMG4_PlayMode,EMG4_Type_NotUsed,EPlayModeRun,NULL);

			break;
			
		case EMG4_End:
			{
//				M4_DebugMessage_Pn("EMG4_End");
				/* Message has finished */
				FREE_MEMORY((U8*)evtHandle, sizeof(EVT_STRUCT));
			}
			break;
		case EMG4_PlayComplete:
//			M4_DebugMessage_Pn("EMG4_PlayComplete");
			
			/* TODO */
			break;
		case EMG4_OpProgress:
//			M4_DebugMessage_Pn("EMG4_OpProgress");
			dspl_TextOut(16, 16, 0,"Please wait!");
			break;
		case EMG4_OpError:
			{
				int type;
				int module;
				int status;
//				M4_DebugMessage_Pn("EMG4_OpError");

				status = (ampParam & 0x3FFF);
				module = (ampParam >> 22) & 0x1F;
				type   = (ampParam >> 28) & 0x1F;
				//M4_ActionError(status);
				dspl_TextOut(16, 16, 0,"Play MMS Error!");
				//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
				//To display the specific errors encountered
				switch(status)
				{
					case EFileNotFound:
						dspl_TextOut(16, 40, 0,"File not found");
						break;
					case EInvalidMediaType:
						dspl_TextOut(16, 40, 0,"Media Not Supported");
						break;
					case EMsgInComplete:
						 dspl_TextOut(16, 40, 0,"Incomplete Message");
						break;
					case EInvalidMsgId:
						 dspl_TextOut(16, 40, 0,"InvalidMsgID");
						break;

				}
				
                            MmsReadStatus = status;
				dspl_Enable(1);

				FREE_MEMORY((U8*)evtHandle, sizeof(EVT_STRUCT));

			}
			break;
	}

	return ENoError;
}

void M4_PlayMessage(MM_MESSAGE_ID aMessageID)
{
	EVT_HANDLE evtHandler;
	TRACE_EVENT("M4_PlayMessage");

	/* Create the event handler */
       evtHandler  = (EVT_HANDLE)ALLOC_MEMORY(sizeof(EVT_STRUCT));
	
	if (evtHandler == NULL)
	{
		//M4_DebugStringMessage("M4_PlayMessage: can not alloc message!", sizeof("M4_PlayMessage: can not alloc message!"), 0);
		return;
	}

	memset(evtHandler, 0x00, sizeof(EVT_STRUCT));				/* Reset the structure */
	evtHandler->handler = M4_PlayMessageEventHandlerFunc;	/* Set the event handler function */
	
	DAL_PlayMessage(evtHandler, aMessageID);
}


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

 $Function:    	MMSBox_read_exec_cb

 $Description:	Exec callback function of the MMS Create window 
 
 $Returns:		none

 $Arguments:	win - window handler
 				event - mfw event
 				parameter - optional data.
 
*******************************************************************************/
void MMSBox_Read_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
    /* callback handler for events sent to to trigger execution */
{
	TRACE_FUNCTION ("MMSBox_read_exec_cb()");

	switch (event)
	{
	case MWM_CREATE:
		TRACE_EVENT(" Event: MWM_CREATE");
		//xreddymn Aug-26-2004 MMI-SPR-23926 (TII_MMS12) and  MMI-SPR-24115 (TII_MMS55): M4 client will now use the display
		g_M4_display_active=TRUE;
		break;
	case MWM_ONDRAW:
		TRACE_EVENT(" Event: MWM_ONDRAW");
		dspl_Enable(0);
		dspl_SetBgdColour(COL_White);
		dspl_ClearAll();
		//yanbin: here call Magic4 functions to play MMS slides
		M4_PlayMessage(g_pMessageHeaderList->ppList[g_currentMessage].id);
              //CRR 25270 & CRR 25268: 13 Oct 2004 - xpradipg 
              //the status of the message is not updated if it is already in the read state
              //else the header of the message is edited and the flag is set to true
              if(g_pMessageHeaderList->ppList[g_currentMessage].read!=TRUE)
		{
        	     MM_BeginUpdateHeader(g_pMessageHeaderList->ppList[g_currentMessage].id);
        	     MM_UtilSetRead(g_pMessageHeaderList->ppList[g_currentMessage].id, TRUE);
                   MM_CommitUpdateHeaderAsync(NULL, g_pMessageHeaderList->ppList[g_currentMessage].id);
                 // xreddymn Nov-30-2004 MMI-SPR-23981: Update g_pMessageHeaderList
                 g_pMessageHeaderList->ppList[g_currentMessage].read=TRUE;
                 }
		//xmzhou_trace_string_value("MMSBox_Read_win_cb: M4_PlayMessage with id = ",  g_pMessageHeaderList->ppList[g_currentMessage].id);
              // xrashmic 7 Dec, 2004 MMI-SPR-23965
              if(g_pMessageHeaderList->ppList[g_currentMessage].type==EMtSms)
		displaySoftKeys(TxtExtract,TxtSoftBack);
		else
		displaySoftKeys(NULL,TxtSoftBack);    
		dspl_Enable(1);
		break;
	case MWM_DESTORY:
		TRACE_EVENT(" Event: MWM_DESTORY");
		//xreddymn Sep-16-2004: Changes related to MMI-SPR-24735
		dspl_Enable(1);
              //CRR 24456: 19 Oct 2004 - xpradipg
              //check if the error has occurred while playing the message if
              //post the EPlayModeStop event else reset the error
              if(MmsReadStatus == ENoError)
                {
			DAL_PostMessage(EMG4_PlayMode,EMG4_Type_NotUsed, EPlayModeStop,NULL);
			//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
			//EMG4_Exit should be done for only MMS that are sucessfully played.
			//For MMS which throw EMG4_OpError when DAL_PlayMessage is called, 
			//EMG4_Exit should not be done
			DAL_PostMessage(EMG4_Exit, EMG4_Type_NotUsed, 0, NULL);
                }
              else
                {
                    MmsReadStatus = ENoError;
                }
		
// xreddymn Nov-30-2004 MMI-SPR-23981: Moved this to MMSBox_OPT_exec_cb
#if(0)
              if(MMS_Is_Unread_Msgs_Inbox())
                idle_data.ems = TRUE;
              else
                idle_data.ems = FALSE;
#endif
		//xreddymn Aug-26-2004 MMI-SPR-23926 (TII_MMS12) and  MMI-SPR-24115 (TII_MMS55): BMI will now use the display
		g_M4_display_active=FALSE;
		g_MmsReadWin=NULL;//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
		break;
	case MWM_SUSPEND:
		TRACE_EVENT("MWM_SUSPEND");
		//xreddymn Sep-16-2004: Changes related to MMI-SPR-24735
		dspl_Enable(1);
		//xreddymn Aug-27-2004 MMI-SPR-23926 (TII_MMS12) and  MMI-SPR-24115 (TII_MMS55): BMI will now use the display
		g_M4_display_active=FALSE;
		DAL_PostMessage(EMG4_Suspend,EMG4_Type_NotUsed,0,NULL);
		DAL_PostMessage(EMG4_PlayMode,EMG4_Type_NotUsed, EPlayModeStop,NULL);
		break;
	case MWM_RESUME:
		TRACE_EVENT("MWM_RESUME");
		//xreddymn Aug-27-2004 MMI-SPR-23926 (TII_MMS12) and  MMI-SPR-24115 (TII_MMS55): M4 client will now use the display
		g_M4_display_active=TRUE;
		DAL_PostMessage(EMG4_Resume,EMG4_Type_NotUsed,0,NULL);
		DAL_PostMessage(EMG4_Refresh, EMG4_Type_NotUsed, 0, 0);
		break;
	default:
	    break;
	}
}

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

 $Function:    	    extractEMSObjects

 $Description:	    To extract user defined objects in EMS
                         xrashmic 7 Dec, 2004 MMI-SPR-23965

 $Returns:	    none

 $Arguments:	    none
*******************************************************************************/
void extractEMSObjects(void)
{
    ESTATUS status;
    attachmentInEMS=0;
    EV_GetExtractableList(EAllMessage, &apExtractableInMessage);
    if(apExtractableInMessage.NumOfAttachments)
    {
        EV_ReadExtractableItem(&apExtractableInMessage.pAttachmentsInMessage[attachmentInEMS],&appObj);
        status = M4_StoreExtractedObject((char *)appObj->objData.pByteData, appObj->lObjectDataSize, appObj->contentType);
    }
    else 
    {
        apExtractableInMessage.omh.freeFunc(&apExtractableInMessage);
        //xrashmic 08 Feb, 2005 MMI-SPR-27853
        //Added few more parameters for this function   
        information_dialog(TxtNoObjects, TxtExtractable, NULL,NULL, TxtNull, TxtSoftBack, 0, KEY_RIGHT, NULL); 
    }   
}
/*******************************************************************************

 $Function:    	MMSBox_Read_kbd_cb

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

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

int MMSBox_Read_kbd_cb (MfwEvt e, MfwKbd *k)
    /* SmsRead_R_OPT keyboard event handler */
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    TRACE_FUNCTION ("MMSBox_Read_kbd_cb()");

    if (e & KEY_LONG)
	{
	    switch (k->code)
		{
		case KCD_HUP: /* back to previous menu */
			MMI_DestoryWindow(win);
		    break;
            case  KCD_MNUUP:
                DAL_PostMessage(EVT_StartOfMessage, EMG4_Type_NotUsed, 0, NULL);
                 break;
             case KCD_MNUDOWN:
                 DAL_PostMessage(EVT_EndOfMessage, EMG4_Type_NotUsed, 0, NULL);
                 break;
             case KCD_MNULEFT:
                 DAL_PostMessage(EVT_StartOfLine, EMG4_Type_NotUsed, 0, NULL);
                 break;
             case KCD_MNURIGHT:
                 DAL_PostMessage(EVT_EndOfLine, EMG4_Type_NotUsed, 0, NULL);
                 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 */
		   //x0012849 Feb-03-2005 MMI-SPR-28224
		   //send scrollUp Event instead of cursorup
                   DAL_PostMessage(EMG4_ScrollUp,EMG4_Type_NotUsed,0,NULL);                		 			
                   break;
             case KCD_MNUDOWN:
		   //x0012849 Feb-03-2005 MMI-SPR-28224 	
		   //send scroDown Event instead of cursordown
		   DAL_PostMessage(EMG4_ScrollDown,EMG4_Type_NotUsed,0,NULL);		
                 break;
             case KCD_MNULEFT:
                 DAL_PostMessage(EMG4_CursorLeft, EMG4_Type_NotUsed, 0, NULL);
                 break;
             case KCD_MNURIGHT:
                 DAL_PostMessage(EMG4_CursorRight, EMG4_Type_NotUsed, 0, NULL);
		    break;
		case KCD_MNUSELECT:
                break;
		case KCD_LEFT: /* activate this entry */
                        // xrashmic 7 Dec, 2004 MMI-SPR-23965
                        // Allows the user to extract objects in the EMS message. For extracting the objects,  
                        // the editor has to be initialized.
                        if(g_pMessageHeaderList->ppList[g_currentMessage].type==EMtSms)
                            extractEMSObjects();
		    break;
		case KCD_HUP: /* back to previous menu */
		case KCD_RIGHT: /* back to previous menu */
			MMI_DestoryWindow(win);
		    break;
		default: /* no response to all other keys */
		    return MFW_EVENT_CONSUMED;
		}
	}
    return MFW_EVENT_CONSUMED;
}

/**/

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

 $Function:    	MMSBox_Read_start

 $Description:	Start the creation of the main window for Create MMS
 
 $Returns:		mfw window handler 

 $Arguments:	parent_window - Parent window handler
 				menuAttr	  - Menu attributes.
 
*******************************************************************************/
T_MFW_HND MMSBox_Read_start(T_MFW_HND parent_window, MfwMnuAttr *menuAttr)
{
	TRACE_FUNCTION ("MMSBox_Read_start()");
	//xrashmic 23 Nov, 2005 MMI-SPR-OMAPS00047637
	g_MmsReadWin= MMI_CreateWindow(parent_window, (T_DIALOG_FUNC)MMSBox_Read_exec_cb,(void*)menuAttr,(T_MFW_CB)MMSBox_Read_kbd_cb,0,0);

	return g_MmsReadWin;
}



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

 $Function:    	MMS_ConvertStringToUcs2

 $Description:	converting string to ucs2
 
 $Returns:		

 $Arguments:	
 				
 
*******************************************************************************/
UCS2 * MMS_ConvertStringToUcs2 (const MByte * const p8BitString,
                                           const MUint uLength,
                                           UCS2        * pUcs2String)
{
    if ((UCS2 *) NULL == pUcs2String)
    {
        pUcs2String = (UCS2 *)MM_MALLOC(sizeof(UCS2) * (1 + uLength));
    }

    if ((UCS2 *)NULL != pUcs2String)
    {
        register MUint uIndex;
        for (uIndex = 0; uIndex < uLength; ++uIndex)
        {
            pUcs2String[uIndex] = (UCS2)p8BitString[uIndex];
        }
        pUcs2String[uIndex] = NULLCHAR;
    }

    return pUcs2String;
}

//xrashmic 22 Sep, 2004 MMI-SPR-25032
// To play the buzzer when there are sound objects in EMS message
//Apr 05, 2005    REF: ENH 29994 xdeepadh
//To Play the default midi file when there are sound objects in EMS message.
void playBuzzerForEMS(void)
{

#ifdef FF_MIDI_RINGER  
	T_AS_PLAYER_TYPE player_type;
#ifdef FF_MIDI_LOAD_FROM_MEM
	T_MELODY melody_data;
#else
	char* midi_file;

#endif
//Nov 02, 2005    REF:ER OMAPS00039044  xdeepadh
#ifdef FF_MIDI_LOAD_FROM_MEM
	melody_data=sounds_midi_return_memory_location(0);
	player_type=mfw_ringer_deduce_player_type(melody_data.melody_name);
	mfw_player_start_memory(player_type,(UINT32*)melody_data.melody,melody_data.melody_size,AS_VOLUME_MEDIUM,FALSE,sounds_midi_player_start_cb);
#else
	midi_file=sounds_midi_return_file_name(0);
	player_type=mfw_ringer_deduce_player_type(midi_file);
	mfw_player_start_file(player_type,midi_file,AS_VOLUME_MEDIUM,FALSE,sounds_midi_player_start_cb);
#endif 		
#else
    UBYTE currentVoiceTone; 
    currentVoiceTone = getcurrentVoiceTone();
    audio_PlaySoundID( AUDIO_BUZZER, currentVoiceTone, 200, AUDIO_PLAY_ONCE );
#endif
}

//CRR 25270 & CRR 25268: 13 Oct 2004 - xpradipg
/*******************************************************************************

 $Function:    	MMS_Is_Unread_Msgs_Inbox

 $Description:	Lists out all the messages in the inbox and returns true if the status of one of the 
                     message is not set to read = true
  $Returns:		

 $Arguments:	
 				
*******************************************************************************/

int MMS_Is_Unread_Msgs_Inbox(void)
{
    //xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
    //Inbox listing params were changed in MMI-SPR-29887
    MM_LIST_PARAM listParams = MM_LIST_INBOX|MM_LIST_NOT_RETRIEVED;
    ESTATUS eStatus=0;
    int i;
	//xrashmic 29 Nov, 2005 MMI-SPR-OMAPS00050170
	//g_pMessageHeaderList will be populated again, hence need to release the memory already allocated to it
	if(g_pMessageHeaderList != NULL) 
		M4_FreeListFolderMemory();
	eStatus = DAL_ListMessagesByParam(&g_pMessageHeaderList, listParams);
    for(i=0;i<g_pMessageHeaderList->size;i++)
     {   if(g_pMessageHeaderList->ppList[i].read == FALSE)
            return TRUE;
      }
    return FALSE;
}
#undef MMI_MMSBOX_C