diff src/aci2/bmi/MmiDialogs.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/aci2/bmi/MmiDialogs.c	Mon Sep 26 00:29:36 2016 +0000
@@ -0,0 +1,1595 @@
+
+/*******************************************************************************
+
+					CONDAT (UK)
+
+********************************************************************************                                                                              
+
+ This software product is the property of Condat (UK) Ltd and may not be
+ disclosed to any third party without the express permission of the owner.                                 
+                                                                              
+********************************************************************************
+
+ $Project name:	Basic MMI                                                      
+ $Project code:	BMI (6349)                                                           
+ $Module:		MmiDialogs
+ $File:		    MmiDialogs.c
+ $Revision:		1.0                                                       
+                                                                              
+ $Author:		Condat(UK)                                                         
+ $Date:		    25/10/00                                                      
+                                                                               
+********************************************************************************
+                                                                              
+ Description:MMI Information dialogue handling.
+ 
+
+                        
+********************************************************************************
+
+ $History: MmiDialogs.c
+
+	Mar 11, 2006   REF:DR:OMAPS00061467  x0035544
+	Description:   27.22.4.13.3 SET UP CALL (display of icons) fails.
+	Solution: Assigned the default values for icon data  for the structure display_info in the function 
+	dlg_zeroDisplayData(). copied icon data in to the structure data->IconData and provided functionality 
+	in the function dialog_info_win_resize_cb() to display icon data appropriately on the dialog screen for SAT
+	call setup.
+	
+       Sep 06 2005  REF:  MMI-SPR-33548  x0012849 Jagan
+       Description : A dialog  with long message  is not displayed properly.
+       Solution : The no of lines in a dialog is increased from 4 to 15.
+       
+ 	Feb 24, 2005 REF: CRR MMI-SPR-29102 xnkulkar
+       Description: The phone resets when user presses the ''End All' key while the SMSs are being deleted. 
+       Solution: As the user has already confirmed that all SMS messages are to be deleted, ''End All' key 
+       		press is ignored till the delete operation is over.
+            xrashmic 08 Feb, 2005 MMI-SPR-27853
+       Moved the T_dialog_info structure from MmiDialogs.c to MmiDialogs.h     
+
+
+       xrashmic 08 Feb, 2005 MMI-SPR-27853
+       Moved the T_dialog_info structure from MmiDialogs.c to MmiDialogs.h     
+
+	Aug 25, 2004    REF: CRR 24904   Deepa M.D
+	Bug:cleanup compile switches used for Go-lite
+	Fix:COLOURDISPLAY compiler switch has been added to the functions which are 
+	used only for the normal color build.
+
+	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
+
+
+	Sep 01, 2004    REF: CRR 21380  Deepa M.D 
+	Bug:Not getting proper display, When Messages Memory is Full.
+	Fix:Assigning TextId and TextString will not display both the messages.
+	Hence we need to use TextId and TextString2 or TextId2 and TextString
+
+	Jun 04,2004 CRR:13601 xpradipg - SASKEN
+	Description: CFO interrogation display : Timer to long
+	Fix: Timer is enabled for the information dialog. It times out after 5 seconds from the last key
+	press.
+	25/10/00			Original Condat(UK) BMI version.	
+	   
+ $End
+
+*******************************************************************************/
+
+
+/*******************************************************************************
+                                                                              
+                                Include Files
+                                                                              
+*******************************************************************************/
+#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 "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 "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 "dspl.h"
+
+#include "ksd.h"
+#include "psa.h"
+
+#include "MmiMain.h"
+#include "MmiDummy.h"
+//JVJE #include "MmiMsgsEdit.h"
+//#include "MmiLists.h"
+#include "MmiMmi.h"
+
+#include "MmiDialogs.h"
+#include "MmiLists.h"
+#include "MmiMenu.h"
+#include "MmiSoftKeys.h"
+
+/* JF Modified
+*/
+#include "MmiBookController.h"
+#include "cus_aci.h"
+
+#include "prim.h"
+#ifndef PCM_2_FFS
+#include "pcm.h"
+#endif
+
+
+#include "mmiColours.h"
+
+void dlg_initDisplayData_type( T_DISPLAY_DATA *displayInfo, U32 displayCol, int dlgType, T_BITMAP* dlgBitmap , int dlgSKFormat );
+
+/*
+ * START NEW PART
+ */
+
+static T_MFW_HND   dialog_info_create    (T_MFW_HND  parent_win);
+static void        dialog_info           (T_MFW_HND  win,
+                                          USHORT event, SHORT value, void * parameter);
+
+static int         dialog_info_win_cb    (T_MFW_EVENT event, T_MFW_WIN * win);
+static int 	dialog_info_win_resize_cb (T_MFW_EVENT event, T_MFW_WIN * win);
+
+static T_MFW_CB    dialog_info_tim_cb    (T_MFW_EVENT event, T_MFW_TIM * tc);
+static int         dialog_info_kbd_cb    (T_MFW_EVENT event, T_MFW_KBD * keyboard);
+static int         dialog_info_kbd_long_cb (T_MFW_EVENT event, T_MFW_KBD * keyboard);
+void mmi_dialogs_insert_animation_CB (T_MFW_EVENT event, T_MFW_TIM *tc);
+void mmi_dialogs_animation_new_CB (T_MFW_EVENT event, T_MFW_TIM *tc);
+
+
+MfwRect calcLayout( int dlgType, int dataSx, int dataSy, int bmpSx, int bmpSy)
+{
+	MfwRect area;
+	int px,py;
+	int sx,sy;
+
+	TRACE_EVENT_P5("dlgType,= %d, dataSx = %d, dataSy = %d, bmpSx = %d, bmpSy = %d", dlgType, dataSx, dataSy, bmpSx, bmpSy);
+
+	/*Adjust area available for drawing by the border */
+	switch (dlgType & DLG_BORDER_VERTICAL)
+	{
+		case DLG_BORDER_VERTICAL_0:	sx =bmpSx;			break;
+		case DLG_BORDER_VERTICAL_1:	sx =bmpSx*6/8;		break;
+		case DLG_BORDER_VERTICAL_2:	sx =bmpSx*4/8;		break;
+		case DLG_BORDER_VERTICAL_3:	sx =bmpSx*3/8;		break;
+	}
+	if (sx < dataSx)
+		sx = dataSx;
+	px = 0;
+
+	switch (dlgType & DLG_BORDER_HORIZONTAL)
+	{
+		case DLG_BORDER_HORIZONTAL_0:	sy =bmpSy;			break;
+		case DLG_BORDER_HORIZONTAL_1:	sy =bmpSy*6/8;		break;
+		case DLG_BORDER_HORIZONTAL_2:	sy =bmpSy*4/8;		break;
+		case DLG_BORDER_HORIZONTAL_3:	sy =bmpSy*3/8;		break;
+	}
+	if (sy < dataSy)
+		sy = dataSy;
+	py = 0;
+
+	switch (dlgType & (DLG_INFO_LAYOUT_LEFT	| DLG_INFO_LAYOUT_RIGHT))
+	{
+		case DLG_INFO_LAYOUT_CENTRE:	//display info in centre of display
+			px = px + (sx-dataSx)/2;
+			sx = dataSx;
+			break;
+		case DLG_INFO_LAYOUT_RIGHT:	//all info is displayed at the foot of trhe display
+			px = px+(sx-dataSx);
+			sx = dataSx;
+			break;
+		case DLG_INFO_LAYOUT_LEFT:		//display all info at the top of the bitmap
+			sx = dataSx;
+			break;
+		default:						//display info over entire area					
+			break;
+	}
+	
+	switch (dlgType & (DLG_INFO_LAYOUT_BOTTOM	| DLG_INFO_LAYOUT_TOP))
+	{
+		case DLG_INFO_LAYOUT_CENTRE:							//display info in centre of display
+			py = py + (sy-dataSy)/2;
+			sy = dataSy;
+			break;
+		case DLG_INFO_LAYOUT_BOTTOM:	//all info is displayed at the foot of trhe display
+			py = py+(sy-dataSy);
+			sy = dataSy;
+			break;
+		case DLG_INFO_LAYOUT_TOP:		//display all info at the top of the bitmap
+			sy = dataSy;
+			break;
+		default:						//display info over entire area					
+			break;
+	}
+	area.px = px;	area.py = py;
+	area.sx = sx;	area.sy = sy;	//Area sx/sy must be no smaller than dataSx/Sy
+	return (area);
+}
+
+
+/*******************************************************************************
+
+ $Function:    	info_dialog
+
+ $Description:	Common information dialog
+ 
+ $Returns:		Dialogue info win
+
+ $Arguments:	parent win, display info
+ 
+*******************************************************************************/
+T_MFW_HND info_dialog (T_MFW_HND        parent_win,
+                       T_DISPLAY_DATA * display_info)
+{
+  T_MFW_HND win;				
+  display_info->SoftKeyStrings = FALSE;
+  
+  win = dialog_info_create (parent_win);  			
+
+  if (win NEQ NULL)
+  {
+    SEND_EVENT (win, DIALOG_INIT, 0, display_info);
+  }
+  return win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	info_dialog_softkeystrings
+
+ $Description:	Common information dialog, sets "softkeystrings" to TRUE
+ 
+ $Returns:		Dialogue info win
+
+ $Arguments:	parent win, display info, leftsoftkey, rightsoftkey
+ 
+*******************************************************************************/
+T_MFW_HND info_dialog_softkeystrings (T_MFW_HND parent_win, T_DISPLAY_DATA * display_info)
+{
+  T_MFW_HND win;
+
+  display_info->SoftKeyStrings = TRUE;
+  win = dialog_info_create (parent_win);
+
+  if (win NEQ NULL)
+  {
+    SEND_EVENT (win, DIALOG_INIT, 0, display_info);
+  }
+  return win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	dialog_info_create
+
+ $Description:	Creation of an information dialog
+ 
+ $Returns:		Dialogue info win
+
+ $Arguments:	parent win
+ 
+*******************************************************************************/
+static T_MFW_HND dialog_info_create (T_MFW_HND parent_win)
+{
+  T_MFW_WIN     * win_data;
+  T_dialog_info *  data = (T_dialog_info *)ALLOC_MEMORY (sizeof (T_dialog_info));
+  TRACE_FUNCTION ("dialog_info_create()");
+
+  data->info_win = win_create (parent_win, 0, E_WIN_VISIBLE, (T_MFW_CB)dialog_info_win_resize_cb);
+
+  if (data->info_win EQ 0)
+    return 0;
+
+  /*
+   * Create window handler
+   */
+  data->mmi_control.dialog   = (T_DIALOG_FUNC)dialog_info;
+  data->mmi_control.data     = data;
+  data->parent_win           = parent_win;
+  win_data                   = ((T_MFW_HDR *)data->info_win)->data;
+  win_data->user             = (void *)data;
+
+  /*
+   * return window handle
+   */
+  return data->info_win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	dialog_info_destroy
+
+ $Description:	Destruction of an information dialog
+ 
+ $Returns:		void
+
+ $Arguments:	win
+ 
+*******************************************************************************/
+void dialog_info_destroy (T_MFW_HND own_window)
+{
+  T_MFW_WIN     * win  = ((T_MFW_HDR *)own_window)->data;
+  T_dialog_info * data = (T_dialog_info *)win->user;
+
+  TRACE_FUNCTION ("dialog_info_destroy()");
+
+  if (own_window == NULL)
+  {
+	TRACE_EVENT ("Error :- Called with NULL Pointer");
+	return;
+  }
+	
+  if (data)
+  {
+    /*
+     * Exit TIMER & KEYBOARD Handle
+     */
+    kbd_delete (data->info_kbd);
+    tim_delete (data->info_tim);
+
+    if(data->animation_timer != 0)
+    {
+    	timDelete(data->animation_timer);
+
+    	if (data->icon != 0)
+    		icnDelete(data->icon);
+    }
+
+    /*
+     * Delete WIN Handler
+     */
+    win_delete (data->info_win);
+    /*
+     * Free Memory
+     */
+    FREE_MEMORY ((void *)data, sizeof (T_dialog_info));
+  }
+}
+
+void dlg_zeroDisplayData( T_DISPLAY_DATA *displayInfo)
+{
+
+	TRACE_EVENT("dlg_zeroDisplayData()");
+	if (displayInfo == NULL)
+		return;
+	memset (displayInfo, 0x00, sizeof(T_DISPLAY_DATA));
+	
+	displayInfo->LeftSoftKey 	= 0;
+	displayInfo->RightSoftKey 	= 0;
+	displayInfo->LSKString 		= NULL;
+	displayInfo->RSKString 		= NULL;
+	displayInfo->TextString 	= NULL;
+	displayInfo->TextString2 	= NULL;
+	
+    	displayInfo->WrapStrings 	= 0;
+	
+    	displayInfo->TextId       	= 0;
+    	displayInfo->TextId2      	= 0;
+    
+	displayInfo->SoftKeyStrings	= FALSE;
+	
+    	displayInfo->Identifier   	= 0;
+	displayInfo->anim_time		= 0;
+	displayInfo->number_of_frames	= 0;
+	displayInfo->current_frame		= 0;
+//x0035544 Feb 07, 2006 DR:OMAPS00061467
+#ifdef FF_MMI_SAT_ICON
+       displayInfo->IconData.width 	= 0;
+       displayInfo->IconData.height	= 0;
+	displayInfo->IconData.dst 		= NULL;
+	displayInfo->IconData.selfExplanatory 	= FALSE;
+#endif	
+	dlg_initDisplayData_events( displayInfo, NULL, 0, 0);
+    
+ 	/* GW#2294 COLOUR_STATUS has been used for all popups - change this to default instead of COLOUR_POPUP .*/
+ 	dlg_initDisplayData_type( displayInfo, COLOUR_STATUS, 0, NULL, 0 );
+
+	/* GW #2294 02/07/03 - The default bitmap is set-up here to allow us to disable it for some dialogs (if required) */
+	displayInfo->bgdBitmap = icon_getBgdBitmap(BGD_CLOUD);
+    
+}
+
+void dlg_initDisplayData_TextId( T_DISPLAY_DATA *displayInfo, int lsk, int rsk, int str1, int str2, int colId)
+{
+	if (displayInfo == NULL)
+		return;
+	dlg_zeroDisplayData(displayInfo);
+	displayInfo->LeftSoftKey	= (USHORT)lsk;
+	displayInfo->RightSoftKey	= (USHORT)rsk;
+	displayInfo->TextId 		= str1;
+	displayInfo->TextId2 		= str2;
+	displayInfo->displayCol 	= colId ;
+	
+}
+
+void dlg_initDisplayData_TextStr( T_DISPLAY_DATA *displayInfo, int lsk, int rsk,char *str1, char *str2, int colId)
+{
+	if (displayInfo == NULL)
+		return;
+	dlg_zeroDisplayData(displayInfo);
+	displayInfo->LeftSoftKey 	= (USHORT)lsk;
+	displayInfo->RightSoftKey 	= (USHORT)rsk;
+	displayInfo->TextString 	= str1;
+	displayInfo->TextString2 	= str2;
+	displayInfo->displayCol 	= colId ;
+}
+
+void dlg_initDisplayData_events( T_DISPLAY_DATA *displayInfo, T_VOID_FUNC callback, int timer, T_MFW_EVENT keyEvents)
+{
+	displayInfo->Callback 		= callback;
+	displayInfo->Time			= timer;
+	displayInfo->KeyEvents		= keyEvents;
+}
+
+void dlg_initDisplayData_type( T_DISPLAY_DATA *displayInfo, U32 displayCol, int dlgType, T_BITMAP* dlgBitmap, int dlgSkFormat )
+{
+	displayInfo->displayCol	= displayCol;
+	displayInfo->dlgType	= dlgType;
+	displayInfo->bgdBitmap	= dlgBitmap;
+}
+
+/*******************************************************************************
+
+ $Function:    	dialog_info
+
+ $Description:	Dialog function for information dialog
+ 
+ $Returns:		void
+
+ $Arguments:	win, window handle event, value, parameter
+
+*******************************************************************************/
+void dialog_info (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+  T_MFW_WIN      * win_data     = ((T_MFW_HDR *)win)->data;
+  T_dialog_info  * data         = (T_dialog_info *)win_data->user;
+  T_DISPLAY_DATA * display_info = (T_DISPLAY_DATA *)parameter;  
+  TRACE_FUNCTION ("dialog_info()");
+
+  switch (event)
+  {
+    case DIALOG_INIT:
+      /*
+       * Initialize dialog
+       */
+#if defined (WIN32)
+      {
+		  /***************************Go-lite Optimization changes Start***********************/
+		  
+		  //Aug 16, 2004    REF: CRR 24323   Deepa M.D
+		  TRACE_EVENT_P1( "Identifier %d", display_info->Identifier);
+		  /***************************Go-lite Optimization changes end***********************/
+
+      }
+#endif
+      /*
+       * Create timer and keyboard handler
+       */
+    data->info_tim             = tim_create (win, display_info->Time, (T_MFW_CB)dialog_info_tim_cb);
+	data->info_kbd             = kbd_create (win, KEY_ALL, (T_MFW_CB)dialog_info_kbd_cb);
+    data->info_kbd_long		   = kbd_create(win,KEY_ALL|KEY_LONG,(MfwCb)dialog_info_kbd_long_cb);
+
+      /*
+       * Store any other data
+       */
+      data->KeyEvents			 = display_info->KeyEvents;
+	  data->TextString           = display_info->TextString;
+      data->LeftSoftKey          = display_info->LeftSoftKey;
+      data->RightSoftKey         = display_info->RightSoftKey;
+      data->SoftKeyStrings		= display_info->SoftKeyStrings;	// SH - TRUE if using strings rather than IDs
+      data->LSKString			= display_info->LSKString;		// Text for left soft key
+      data->RSKString			= display_info->RSKString;		// Text for right soft key
+      data->TextId               = display_info->TextId;
+      data->Identifier           = display_info->Identifier;
+      data->Callback             = display_info->Callback;
+      data->TextString2          = display_info->TextString2;
+      data->TextId2              = display_info->TextId2;
+	  data->WrapStrings			= display_info->WrapStrings;	//GW-SPR#762
+
+	  data->dlgCol				= display_info->displayCol;
+	  data->dlgType				= display_info->dlgType;
+	  data->dlgBgdBitmap		= display_info->bgdBitmap;
+	  data->dlgSkFormat			= 0;
+	  data->current_frame		= display_info->current_frame;
+	  data->number_of_frames	= display_info->number_of_frames;
+	  data->icon_array			= (MfwIcnAttr*)display_info->icon_array;
+	  data->animation_timer		= 0;
+//x0035544 Feb 07, 2006 DR:OMAPS00061467
+#ifdef FF_MMI_SAT_ICON
+     if(display_info->IconData.dst != NULL)
+	{
+         data->IconData.width		= display_info->IconData.width;
+         data->IconData.height	= display_info->IconData.height;
+         data->IconData.dst 	= display_info->IconData.dst;	
+	  data->IconData.selfExplanatory 	= display_info->IconData.selfExplanatory;
+	}
+    else
+ 	{	
+	  data->IconData.dst = NULL;
+	  data->IconData.selfExplanatory = FALSE;
+	  data->IconData.width =0;
+	  data->IconData.height =0;
+       }	  
+#endif 
+
+	  TRACE_EVENT_P1("anim_time = %d", display_info->anim_time);
+	  TRACE_EVENT_P1("data->anim_time = %d", data->anim_time);
+	  
+	  if(display_info->anim_time != 0)
+	  {
+	  	data->animation_timer = timCreate(win,display_info->anim_time,(MfwCb)mmi_dialogs_animation_new_CB);
+		timStart(data->animation_timer);
+	  }
+
+      if (display_info->Time NEQ FOREVER)
+        tim_start (data->info_tim);
+      win_show (win);
+      break;
+    case DIALOG_DESTROY:
+		dialog_info_destroy(win);
+	break;
+  }
+}
+
+/*******************************************************************************
+
+ $Function:    	dialog_info_win_cb
+
+ $Description:	Callback function for information dialog
+ 
+ $Returns:		void
+
+ $Arguments:	window handle event, win
+*******************************************************************************/
+//GW-SPR#762-Added code to wraps txtString2 if there is room on the display to allow 
+//very long numbers to be displayed.
+#define MAX_LINE_CHAR MAX_LINE
+static int dialog_info_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
+{
+    T_dialog_info * data = (T_dialog_info *)win->user;
+	char buffer[MAX_LINE_CHAR+1];
+	int yPos,bufPos,nLines;
+
+    TRACE_FUNCTION ("dialog_info_win_cb()");
+
+
+    if (data EQ 0)
+	return 1;
+
+    switch (event)
+	{
+	case E_WIN_VISIBLE:
+	    if (win->flags & E_WIN_VISIBLE)
+		{
+		    /*
+		     * Print the information dialog
+		     */
+
+		    /*
+		     * Clear Screen
+		     */
+		    dspl_ClearAll();
+
+		    /*
+		     * Print softkeys
+		     */
+			icnShow(data->icon);
+		    if (data->SoftKeyStrings)
+		    	displayCustSoftKeys(data->LSKString, data->RSKString);	// SH - display text softkeys
+		    else
+				displaySoftKeys(data->LeftSoftKey, data->RightSoftKey);	// display ID softkeys
+		    
+		    /*
+		     * Print information
+		     */
+		    /*MC SPR 1257, having to shift everything up 1 line as string wrapping for second
+		    string causes softkey overwrite when in Chinese*/
+		    if (data->TextId NEQ 0)
+			{
+			    ALIGNED_PROMPT(LEFT,0,DSPL_TXTATTR_CURRENT_MODE, data->TextId);
+			}
+		    else if (data->TextString NEQ NULL)
+			{
+#ifdef EASY_TEXT_ENABLED			
+			    if (data->TextString[0] == 0x80) //MC if this is a unicode string
+					displayAlignedText(LEFT, 0, DSPL_TXTATTR_UNICODE, &data->TextString[2]);
+			    else
+#endif
+			    	displayAlignedText(LEFT, 0, DSPL_TXTATTR_NORMAL, data->TextString);
+			}
+
+		    if (data->TextId2 NEQ 0)
+			{
+			    ALIGNED_PROMPT(LEFT,Mmi_layout_first_line()/*MC*/,DSPL_TXTATTR_CURRENT_MODE, data->TextId2);
+			}
+		    else if (data->TextString2 NEQ NULL)
+			{	
+#ifdef EASY_TEXT_ENABLED	
+				if (data->TextString2[0] == 0x80 ) //MC if this is a unicode string
+					displayAlignedText(LEFT, Mmi_layout_first_line()/*MC*/, DSPL_TXTATTR_UNICODE, &data->TextString2[2]);
+			    else
+#endif
+			{
+				if ((data->WrapStrings & WRAP_STRING_2) && (strlen(data->TextString2) > MAX_LINE_CHAR))
+				{	//Display text over a number of lines
+					yPos = Mmi_layout_first_line();/*MC*/
+					bufPos = 0;
+					nLines = Mmi_number_of_lines_without_icons_on_top()-2;//starting on 2nd line
+					while ((bufPos <strlen(data->TextString2)) && (nLines >=0))
+					{
+						memcpy(buffer,&data->TextString2[bufPos],MAX_LINE_CHAR);						
+						bufPos = bufPos + MAX_LINE_CHAR;
+						buffer[MAX_LINE_CHAR] = 0x00;
+				    	displayAlignedText(LEFT, yPos, 0, buffer);
+				    	yPos = yPos + Mmi_layout_line_height();
+				    	nLines--;
+					}
+				}
+				else
+				{
+			    	displayAlignedText(LEFT, Mmi_layout_second_line(),DSPL_TXTATTR_NORMAL, data->TextString2);
+				}
+			}
+		}
+	  }
+	    break;
+
+	default:
+	    return 0;
+	}
+    return 1;
+}
+/*******************************************************************************
+
+ $Function:    	dialog_info_win_cb
+
+ $Description:	Callback function for information dialog
+ 
+ $Returns:		void
+
+ $Arguments:	window handle event, win
+
+GW SPR#2294 02/07/03 -	Removed Unicode specific code as the 'display' routines called to calculate 
+				the string length and output the text should correctly handle the 0x80 unicode tag 
+				at the start.
+				Modified the display code to wrap the text in the second text string.
+				Modified the window drawing code so that if the text will not fit in the dialog box
+				with the background bitmap, a pop-up 'box' will be drawn instead. If this will still 
+				not be large enough, the entire screen is used.
+				For the C-sample, there is no bitmap.
+				Modified the code to use an array of values to position the text output.
+GW SPR#2294 08/07/03 - Added code to expand the dialog box to include the animation (if any).
+	
+*******************************************************************************/
+// Allow 4 lines of text (0..3) for dialogs
+// Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+// To display a dialog properly when it contain lengthy message - No of lines increased.
+#define MAX_DLG_LINES   (15)  
+//Allow up to 40 chars of text on a dialog line
+#define MAX_WRAP_CHAR  (42)
+//Allow us to wrap text from line 2 to lines 2,3 and 4 lines
+#define MAX_WRAP_LINES (MAX_DLG_LINES-1)
+
+#define DLG_USE_BITMAP			0x0001		//use bitmap if present
+#define DLG_USE_RECTANGLE		0x0002		//use a rectangle	
+#define DLG_USE_FULL_SCREEN		0x0004		//use full-screen
+
+#define DLG_LINE1 0
+#define DLG_LINE2 1
+static int dialog_info_win_resize_cb (T_MFW_EVENT event, T_MFW_WIN * win)
+{
+    T_dialog_info * data = (T_dialog_info *)win->user;
+//     T_DISPLAY_DATA * display_info;   // RAVI
+    int xPos[MAX_DLG_LINES];
+    int yPos[MAX_DLG_LINES];
+    // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+    //The  size of array  str and strlen are increased by 1, so that the last elements holds data 
+    // which is used while wrapping the text.
+    char* str[MAX_DLG_LINES+1];  
+    int strLen[MAX_DLG_LINES+1]; 
+	int i;
+	char* lskStr,*rskStr;
+	int wx = 0;  //,wy,sx=0,sy=0; // RAVI
+	int wy = 0;   // RAVI
+	int sx = 0;     // RAVI
+	int sy = 0;     // RAVI
+	int fullScreen = DLG_USE_RECTANGLE;
+	int yOfs;
+	int yBmpOfs = 0;
+	MfwRect skArea;
+	//x0035544 Feb 15, 2006. DR:OMAPS00061467
+#ifdef FF_MMI_SAT_ICON
+	USHORT		titleIconWidth = 0;	
+#endif
+    MfwRect area;
+	int scrWidth = 0; //available width for the display // RAVI - Assignment to 0.
+    // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+    // temp_ptr  is used  while wrapping the text.
+    // Now str2[][] is not required.
+    char *temp_ptr;     
+	int nChar;
+
+	t_font_bitmap bmp;
+//	t_font_bitmap* bmpPtr = &bmp;  // RAVI - Not Referenced.
+	
+	int drawWinType;
+	int nLines;
+
+	int linePos=0;
+	int lineLen = 0;
+	int wrapLine = 1; /*GW #2294*/
+
+	const int charWidth = dspl_GetTextExtent("0",1);
+    TRACE_FUNCTION ("dialog_info_win_cb()");	 
+//x0035544 Feb 15, 2006. DR:OMAPS00061467
+#ifdef FF_MMI_SAT_ICON
+       if (data->IconData.dst != NULL)
+	{
+		if (data->IconData.width > TITLE_ICON_WIDTH) 
+		{
+			titleIconWidth = TITLE_ICON_WIDTH;
+		}
+		else
+		{
+			titleIconWidth = data->IconData.width ;
+		}
+	}			
+	else
+	{
+		titleIconWidth = 0;
+	}
+	
+#endif   	
+    if (data EQ 0)
+	return 1;
+
+    switch (event)
+	{
+	case E_WIN_VISIBLE:
+	    if (win->flags & E_WIN_VISIBLE)
+		{
+		    /*
+		     * Print the information dialog
+		     */
+		    for (i=0;i<MAX_DLG_LINES;i++)
+		    {
+		    	xPos[i]=0;
+			    yPos[i] = Mmi_layout_line_height()*i;
+			    str[i]=NULL;
+			    strLen[i]=0;
+		    }
+                // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+                // Assign the values to last elments of the array str and strLen
+                str[MAX_DLG_LINES] = NULL; 
+                strLen[MAX_DLG_LINES] = 0;
+			yOfs = Mmi_layout_line_height()/4;
+			if (data->TextId != 0)
+			    str[DLG_LINE1] = MmiRsrcGetText(  data->TextId);
+		    else 
+				str[DLG_LINE1] = data->TextString;
+			
+			if (data->TextId2 != 0)
+			    str[DLG_LINE2] = MmiRsrcGetText(  data->TextId2);
+				else
+				str[DLG_LINE2] = data->TextString2;			
+
+		    if (data->SoftKeyStrings!=0)
+		    {
+		     	lskStr = data->LSKString;
+		     	rskStr = data->RSKString;
+		    }
+		    else
+		    {
+		    	if (data->LeftSoftKey != TxtNull)
+					lskStr = MmiRsrcGetText(data->LeftSoftKey);
+				else
+					lskStr = NULL; 
+				
+		    	if (data->RightSoftKey != TxtNull)
+					rskStr = MmiRsrcGetText(data->RightSoftKey);
+				else
+					rskStr = NULL; 	
+		    }
+
+		    if ((str[DLG_LINE1]!= NULL) || (str[DLG_LINE2]!=NULL))
+		    {	//Draw a window for status info
+		    	if (str[DLG_LINE2] == NULL)
+		     	{
+		     		sy = Mmi_layout_line_height()+yOfs*2; // 18 or 12
+		     		
+		     	}
+		     	else
+		     	{
+		     		sy = Mmi_layout_line_height()*2+yOfs*3; // 33 or 22
+		     	}
+		     	
+		     	//MC, if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE)	 
+		     	{	//calculate longest string - use this to calc width of window
+			     	sx = 0;
+			     	if ((lskStr!=NULL) || (rskStr!=NULL))
+			     	{
+			     		sy = sy+Mmi_layout_softkeyHeight()+yOfs*2; 
+			     		sx = sx + 10;
+				     	if (lskStr != NULL) 
+				     	{
+	    					sx = sx + dspl_GetTextExtent(lskStr, 0);
+				     	}
+				     	if (rskStr != NULL) 
+				     	{
+	    					sx = sx + dspl_GetTextExtent(rskStr,0);
+				     	}
+				     	
+			     	}
+					for (i=DLG_LINE1;i<=DLG_LINE2;i++)
+		     		{	
+			     		strLen[i] = dspl_GetTextExtent(str[i],0);
+		     		}
+					
+			     	/* Work out the desired width of the dialog. If we can wrap line 2 and it is long, wrap it */
+			     	if (data->WrapStrings & WRAP_STRING_2)
+			     		nLines = MAX_WRAP_LINES;
+		     		else 
+			     		nLines = 1;
+#ifdef COLOURDISPLAY
+					if (data->dlgBgdBitmap!=NULL)
+					{
+				     	//we only have room to split line 2 into 'max_lines_dlg_popup' lines in the pop-up.
+				     	//NB this should be calculated depending on the height of the popup bitmap.
+						const int max_lines_dlg_popup=2;
+				     	if (nLines>max_lines_dlg_popup)
+							nLines = max_lines_dlg_popup; 
+						scrWidth = (data->dlgBgdBitmap->area.sx * 3)/4; //the max width is about 3/4 of the pop-up
+						if ( (strLen[DLG_LINE2] > (scrWidth-charWidth)*nLines) || 
+							(strLen[DLG_LINE1] > scrWidth))
+						{
+							//recalculate width below.
+					     	if (data->WrapStrings & WRAP_STRING_2)
+					     		nLines = MAX_WRAP_LINES;
+							fullScreen = DLG_USE_RECTANGLE;	
+		     		}
+		     		else
+						{
+							fullScreen = DLG_USE_BITMAP;
+							//Leave width as is
+						}
+					}
+#else
+					//On a C-sample, limit pop-up lines to 2 extra (any more - use entire screen)
+					{
+						const int max_lines_dlg_popup=2;
+				    	if (nLines>max_lines_dlg_popup)
+							nLines = max_lines_dlg_popup; 
+					}
+
+#endif
+					if (fullScreen == DLG_USE_RECTANGLE) 
+					{	
+						//see if we can display as a pop-up
+						if (SCREEN_SIZE_X < 128)
+							scrWidth = SCREEN_SIZE_X-6;
+						else
+				  			scrWidth = (SCREEN_SIZE_X*7)/8;   	
+						if ( strLen[DLG_LINE2] > (scrWidth-charWidth)*nLines)
+						{
+							//Cannot fit in as a pop-up - use full screen
+							fullScreen = DLG_USE_FULL_SCREEN;
+							scrWidth = SCREEN_SIZE_X;
+						}
+		     		else
+		     		{
+							//We can fit it in - but we may want to reduce the width for a nicer look.
+						}
+					}
+					
+				    /*
+				     * Wrap second text line (e.g. for long phone numbers.)
+				     */
+                                  if (strLen[DLG_LINE2] > scrWidth-charWidth)
+                                  {
+                                      //If we can fit the string on 2 lines - do it.
+                                      if (data->WrapStrings & WRAP_STRING_2)
+                                      {
+                                          if (str[DLG_LINE2][0] != 0x80) //not unicode
+                                          {
+                                               wrapLine = 0;
+                                               lineLen = strlen(str[DLG_LINE2]);
+                                              // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+                                              // memset is not required any more .
+                                              //Now the last element of the str[] will point to the second string of the dialog
+                                             str[MAX_DLG_LINES] = str[DLG_LINE2];  // Now move the second  line of text to the last element of the arrya
+                                             strLen[MAX_DLG_LINES] = strLen[DLG_LINE2];// put the right value for the length of the string
+                                             str[DLG_LINE2] = NULL ;  // Assign NULL to the second element of the array.
+                                             while ((wrapLine < MAX_WRAP_LINES) && (linePos<lineLen))								
+                                             {
+                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+                                                 // Instead of DLG_LINE2 use MAX_DLG_LINES 
+                                                 nChar = dspl_GetNcharToFit (&str[MAX_DLG_LINES][linePos], (USHORT)scrWidth);  
+                                                 if (nChar > MAX_WRAP_CHAR)
+                                                     nChar = MAX_WRAP_CHAR;
+                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+                                                 // Allocate MAX_WRAP_CHAR no of bytes 
+                                                 temp_ptr = (char*)mfwAlloc(MAX_WRAP_CHAR); 
+                                                 if(NULL == temp_ptr)
+                                                     return 0;									  	 
+                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+                                                 // Now the destination of memcpy is temp_ptr instead of str2[wrapLine] and the source is str[MAX_DLG_LINES] instead of str[DLG_LINE2]
+                                                 memcpy(temp_ptr,&str[MAX_DLG_LINES][linePos],nChar);  // Now the source data is from the last element of the array.
+                                                 linePos = linePos+nChar;
+                                                 ////GW - even if we cannot display the entire string - it is better than what we would have otherwise 
+                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+                                                // Assign the value of pointer temp_ptr to str[]
+                                                str[DLG_LINE2+wrapLine] = temp_ptr;
+                                                temp_ptr = NULL; 
+                                                strLen[DLG_LINE2 + wrapLine] = dspl_GetTextExtent(str[DLG_LINE2+wrapLine],0);
+                                                wrapLine++;
+                                             }
+								
+								}
+		     			else
+							{
+								//Unicode is more problematic - we need the 0x80 at the front of the string
+								//for the call to 'dspl_GetNcharToFit'. This will involve copying the entire remainder 
+								//of 'str2' into a temporary buffer. At the moment, we only wrap numbers so this
+								//code will wait until it is required.
+							//	str[3] = "Code not written!!";	//issue warning
+							//	strLen[3] = dspl_GetTextExtent(str[3],0);
+						     	fullScreen = DLG_USE_FULL_SCREEN; //error - use full screen			
+							}
+						}
+					}
+					
+					//Calculate longest line of text (including softkeys - sx already set to the softkey width)
+					for (i=0;i< MAX_DLG_LINES;i++)
+			     	{
+			     		if (strLen[i]>sx) 
+			     			sx = strLen[i];
+					}
+		     		if (sx > SCREEN_SIZE_X-charWidth)
+		     			sx = SCREEN_SIZE_X;
+		     		else
+		     		{
+		     			if (sx > SCREEN_SIZE_X/2)
+			     			sx = sx + charWidth;
+		     			else
+			     			sx = sx + charWidth*2;
+		     		}
+		     		if (sy> sx) 
+		     			sx = sy;
+		     		wx = (SCREEN_SIZE_X-sx)/2;
+		     		if (wx<0)
+		     			wx=0;
+		     	}
+
+		     	if (sy > SCREEN_SIZE_Y)
+		     		wy = 0;
+		     	else if (SCREEN_SIZE_Y > 2*sy)  
+		     		wy = (SCREEN_SIZE_Y*2/3-sy)/2; //display in middle of top 2/3 of screen
+		     	else 
+		     		wy = (SCREEN_SIZE_Y-sy)/2; //display in middle of screen
+				if (wy < 10)
+					wy = wy/2;
+		     		
+		     	if ((wx == 0) || (wy==0))
+				{	//not enough room to display as a window - use whole screen
+					fullScreen = DLG_USE_FULL_SCREEN;
+		     }
+
+#ifdef COLOURDISPLAY
+					if ((data->icon_array != NULL) && (fullScreen != DLG_USE_BITMAP))
+					{	//The dialog has an animation - we must make the pop-up large enough to support this  
+						if (sx < data->icon_array[0].area.sx)
+							sx = data->icon_array[0].area.sx;
+						yBmpOfs = data->icon_array[0].area.py + data->icon_array[0].area.sy;
+						wy = data->icon_array[0].area.py;
+						sy = sy + data->icon_array[0].area.sy;
+					}
+#endif
+		    }
+			else
+			{	
+				//We have no strings to display - clear entire screen
+				fullScreen = DLG_USE_FULL_SCREEN;
+			}
+
+
+		    /******************************
+		     * Draw window (full screen/pop-up)
+		     *****************************/
+			if (fullScreen != DLG_USE_FULL_SCREEN)
+				dspl_unfocusDisplay();
+			area.px = 0;
+			area.py = 0;
+			area.sx = sx;
+			area.sy = sy;
+		    resources_setColour(data->dlgCol);
+			drawWinType = DSPL_WIN_CENTRE;
+			
+		     if (fullScreen!=DLG_USE_FULL_SCREEN)
+		     {
+				t_font_bitmap bmp;
+				t_font_bitmap* bmpPtr = NULL;
+
+				for (i=0;i<MAX_DLG_LINES;i++)
+				{
+		     		//centre text
+			     	xPos[i] = wx+(sx-strLen[i])/2;
+			     	yPos[i] = wy+yOfs+yBmpOfs+Mmi_layout_line_height()*i;
+				}
+				
+#ifdef COLOURDISPLAY
+				if ((data->dlgBgdBitmap != NULL) && (fullScreen==DLG_USE_BITMAP))
+				{
+			     	bmp.format = data->dlgBgdBitmap->icnType;
+			     	bmp.height = data->dlgBgdBitmap->area.sy;
+			     	bmp.width = data->dlgBgdBitmap->area.sx;
+			     	bmp.bitmap = data->dlgBgdBitmap->icons;
+			     	bmpPtr = &bmp;
+					area = calcLayout(data->dlgType, sx, sy, bmp.width, bmp.height);
+
+					//Adjust size of available area depending on bitmap properties/dlgType.
+					//dlgType== 0 =>display info in centre of bitmap
+					if (data->dlgType == 0)
+			     	{
+			     		//If the bmp is bigger than the data we will move the bmp to
+			     		//lie over the centre of the data
+			     		area.px = area.px - (bmp.width - sx)/2;
+			     		area.py = area.py - (bmp.height- sy)/2;
+			     	}
+					for (i=0;i<MAX_DLG_LINES;i++)
+					{
+						xPos[i] = xPos[i]  + area.px;
+			     		yPos[i] = yPos[i]  + area.py;
+					}
+
+					TRACE_EVENT_P3("wy = %d, yOfs = %d, area.py = %d",wy,yOfs,area.py);					
+					if( data->dlgBgdBitmap->icnType != ICON_TYPE_1BIT_UNPACKED )				
+						dspl_SetBgdColour( COL_TRANSPARENT );
+						
+					
+				}
+				else
+				{
+					sy = sy + (wrapLine-2)*Mmi_layout_line_height();
+					area.sy = sy;
+				}
+#else
+				if (wrapLine>1)
+				{
+					sy = sy + (wrapLine-1)*Mmi_layout_line_height();
+					area.sy = sy;
+				}				
+#endif
+                    // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+                    //If  length of the dialog is bigger than screen then start the dialog from the top corner.
+                   if(sy+wy >= SCREEN_SIZE_Y && sy < SCREEN_SIZE_Y)
+                       if(wy>0 && wy < sy)
+                       {                     
+                            wy = (SCREEN_SIZE_Y - sy ) /2 ;// centre  the dialog
+                            if(wy < 0)
+                                wy=0;		
+                            for (i=0;i<MAX_DLG_LINES;i++)		     		
+                                yPos[i] = wy+yOfs+yBmpOfs+Mmi_layout_line_height()*i;
+                       }           
+		     	  dspl_DrawWin( wx,wy,sx,sy, drawWinType , bmpPtr);
+		     }
+		     else
+		     {
+			    dspl_ClearAll();		     
+		    	sx = 84;
+				for (i=0;i<MAX_DLG_LINES;i++)
+		     	{
+		     		xPos[i] = 0;
+			     	yPos[i] = Mmi_layout_line(i+1);
+		     }
+		     }
+		    /******************************
+		     * Print softkeys
+		     *****************************/
+			icnShow(data->icon);
+			if ((lskStr != NULL) || (rskStr != NULL))
+			{
+				if (fullScreen==DLG_USE_FULL_SCREEN)
+					Mmi_layout_softkeyArea( &skArea );
+				else
+				{
+					skArea.px = area.px+wx;
+				    skArea.sx = area.sx;
+				    skArea.py = area.py+wy+area.sy-Mmi_layout_softkeyHeight()-1;
+				    skArea.sy = Mmi_layout_softkeyHeight();					
+				}
+				softKeys_displayStrXY(lskStr, rskStr, data->dlgSkFormat, data->dlgCol, &skArea);							
+		     }
+
+		    /******************************
+		     * Print dialog text
+		     *****************************/
+			for (i=0;i<MAX_DLG_LINES;i++)
+			{	 /* GW#2294 No need to draw zero length strings .*/					
+			    if ((str[i] != NULL) && (strLen[i] > 0))
+				    {				   
+			   //x0035544 Feb 15, 2006. DR:OMAPS00061467    
+			   #ifdef FF_MMI_SAT_ICON	
+			              if(data->IconData.selfExplanatory == FALSE)			   	
+			   		dspl_TextOut(xPos[i] + titleIconWidth, yPos[i], DSPL_TXTATTR_NORMAL, str[i] );
+			   #else
+			   		dspl_TextOut(xPos[i] , yPos[i], DSPL_TXTATTR_NORMAL, str[i] );
+			   #endif		          				   	
+			    	     }
+			}
+		  //x0035544 Feb 15, 2006. DR:OMAPS00061467	
+		 #ifdef FF_MMI_SAT_ICON
+		 if(data->IconData.dst != NULL)
+		 {		 
+		  if(str[DLG_LINE2] == NULL)
+		 	{
+		 	 if ((data->IconData.width > TITLE_ICON_WIDTH) || 
+			 	(data->IconData.height > TITLE_ICON_HEIGHT))
+		          {
+			  	dspl_BitBlt2(xPos[0], yPos[0], 8, 
+					    10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
+		 	   }	
+
+		      	 else		    
+		       	dspl_BitBlt2(xPos[0], yPos[0], data->IconData.width, 
+			      		 data->IconData.height, (void*)data->IconData.dst, 0, BMP_FORMAT_256_COLOUR);
+		 	}
+		 else
+		 	{
+		 	if ((data->IconData.width > TITLE_ICON_WIDTH) || 
+			 	(data->IconData.height > TITLE_ICON_HEIGHT))
+		          {
+		       dspl_BitBlt2(xPos[DLG_LINE2], yPos[DLG_LINE2], 8, 
+					    10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
+		 	    }
+			else
+				dspl_BitBlt2(xPos[DLG_LINE2], yPos[DLG_LINE2],data->IconData.width, 
+			      		 data->IconData.height, (void*)data->IconData.dst, 0, BMP_FORMAT_256_COLOUR);
+		 	}
+				
+		 }		               
+		 #endif
+
+			
+		     resources_restoreColour();	
+		}
+	    break;
+
+	default:
+	    return 0;
+	} 
+     // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
+     // Now free the allocated memory	 
+    if (strLen[MAX_DLG_LINES] > scrWidth-charWidth)					
+        if (data->WrapStrings & WRAP_STRING_2)					
+            if (str[MAX_DLG_LINES][0] != 0x80) 
+            {
+                 for(i=DLG_LINE2;i<MAX_DLG_LINES;i++)
+                 {
+                      if(NULL != str[i] && strLen[i] > 0)			 	
+   	                   mfwFree((U8*)str[i],MAX_WRAP_CHAR);
+      	           }
+	           str[MAX_DLG_LINES]=NULL;		  
+	      }
+
+    return 1;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	dialog_info_tim_cb
+
+ $Description:	Callback function for the dialog info timer.
+
+ 
+ $Returns:		MFW event handler
+
+ $Arguments:	window handle event, timer control block
+
+*******************************************************************************/
+static T_MFW_CB dialog_info_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc)
+{
+  T_MFW_HND       win  = mfw_parent (mfw_header());
+  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
+  T_dialog_info * data = (T_dialog_info *)win_data->user;
+
+  T_MFW_HND       parent_win = data->parent_win;
+  USHORT          Identifier = data->Identifier;
+  void (* Callback)() = data->Callback;
+
+#if defined (WIN32)
+      {
+		  /***************************Go-lite Optimization changes Start***********************/
+
+        //Aug 16, 2004    REF: CRR 24323   Deepa M.D
+        TRACE_EVENT_P1 ("Identifier %d", data->Identifier););
+		/***************************Go-lite Optimization changes end***********************/
+
+      }
+#endif
+
+  /*
+  ** SPR#1744 NDH
+  ** Move the dialog destory in front of the Callback to make the processing consistent
+  ** with the Right Keypress and Hangup Processing. Also to ensure that the dialog is 
+  ** removed when the screen is redrawn.
+  */
+  dialog_info_destroy (win);
+
+  if (Callback)
+     (Callback) (parent_win, Identifier, INFO_TIMEOUT);
+
+  return 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	dialog_info_kbd_cb
+
+ $Description:	Keyboard event handler
+
+ $Returns:		status int
+
+ $Arguments:	window handle event, keyboard control block
+
+*******************************************************************************/
+
+static int dialog_info_kbd_cb (T_MFW_EVENT event, T_MFW_KBD *keyboard)
+{
+  T_MFW_HND       win  = mfw_parent (mfw_header());
+  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
+  T_dialog_info * data = (T_dialog_info *)win_data->user;
+  T_MFW_HND       parent_win = data->parent_win;
+  USHORT          Identifier = data->Identifier;
+  void (* Callback)() = data->Callback;
+
+  TRACE_FUNCTION("dialog_info_kbd_cb");
+
+  switch (keyboard->code)
+  {
+    case KCD_LEFT:
+		if (data->KeyEvents & KEY_LEFT )		
+		{
+			dialog_info_destroy (win);
+			if (Callback)
+			(Callback) (parent_win, Identifier, INFO_KCD_LEFT);
+		}
+       break;
+
+    case KCD_RIGHT:
+		if (data->KeyEvents & KEY_RIGHT)		
+		{
+			dialog_info_destroy (win);
+	       if (Callback)
+		     (Callback) (parent_win, Identifier, INFO_KCD_RIGHT);
+		}
+       break;
+
+    case KCD_HUP:
+		if (data->KeyEvents & KEY_HUP  || data->KeyEvents & INFO_KCD_ALL)
+		{
+	       dialog_info_destroy (win);
+		   if (Callback)
+			 (Callback) (parent_win, Identifier, INFO_KCD_HUP);
+		}
+       break;
+    case KCD_MNUUP:
+    	
+		if (data->KeyEvents & KEY_MNUUP)
+		{
+		   if (Callback)
+			 (Callback) (parent_win, Identifier, INFO_KCD_UP);
+		}
+		
+       break;
+    case KCD_MNUDOWN:
+    	
+		if (data->KeyEvents & KEY_MNUDOWN)
+		{
+		  if (Callback)
+			 (Callback) (parent_win, Identifier, INFO_KCD_DOWN);
+		}
+		
+       break;
+       //MZ 7/3/01 used to start a call.
+    case KCD_CALL:
+    	if (data->KeyEvents & KEY_CALL ) 		
+   		{
+	       dialog_info_destroy (win);
+		   if (Callback)
+			 (Callback) (parent_win, Identifier, INFO_KCD_OFFHOOK);
+    		}
+		   break;
+    default:
+		if (data->KeyEvents & INFO_KCD_ALL)
+		{
+		/*
+		Note: The variable Identifier is overwritten with the
+		keycode of the dialog;
+		we need it only for the Multicall Control !!
+		*/
+		   Identifier = keyboard->code;
+	       dialog_info_destroy (win);
+	       if (Callback)
+	         (Callback) (parent_win, Identifier, INFO_KCD_ALL);
+	    }
+       break;
+
+  }
+  return MFW_EVENT_CONSUMED;
+}
+
+static int dialog_info_kbd_long_cb(T_MFW_EVENT event, T_MFW_KBD *keyboard){
+	return MFW_EVENT_CONSUMED;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:    	mmi_dialog_information_screen
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+
+*******************************************************************************/
+
+T_MFW_HND mmi_dialog_information_screen(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_ALL );
+	//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
+	//Assigning TextId and TextString will not display both the messages.
+	//Hence we need to use TextId and TextString2 or TextId2 and TextString
+	display_info.TextString2   = text; 
+	display_info.Identifier   = identifier;
+	return info_dialog(parent_win,&display_info); //information screen
+		
+}
+
+T_MFW_HND mmi_dialog_information_screen_forever(MfwHnd win,int TextId, char* TextStr, int colour)
+{
+	T_DISPLAY_DATA DisplayInfo;
+	dlg_initDisplayData_TextId( &DisplayInfo, TxtNull, TxtNull, TextId,  TxtNull, colour);
+	dlg_initDisplayData_events( &DisplayInfo, NULL, FOREVER, KEY_HUP );
+	DisplayInfo.TextString 	= TextStr;
+   return info_dialog(win, &DisplayInfo);
+}
+
+/*******************************************************************************
+
+ $Function:    	mmi_dialogs_insert_icon
+
+ $Description:	Displays one icon in a dialog 
+
+ $Returns:		none
+
+ $Arguments:	win, pointer to an icon
+
+*******************************************************************************/
+void mmi_dialogs_insert_icon (T_MFW_HND win_dialog ,MfwIcnAttr *icon)
+{
+  T_MFW_WIN      * win_data     = ((T_MFW_HDR *)win_dialog)->data;
+  T_dialog_info  * data         = (T_dialog_info *)win_data->user;
+
+
+		data->icon = icnCreate(win_dialog,icon,E_ICN_VISIBLE,NULL);			
+		icnUnhide(data->icon);
+		winShow(win_dialog);
+		
+}
+
+/*******************************************************************************
+
+ $Function:    	mmi_dialogs_insert_animation
+
+ $Description:	starts an animation in a dialog
+
+ $Returns:		none
+
+ $Arguments:	win, animation time, pointer to an icon, number of frames
+
+*******************************************************************************/
+void mmi_dialogs_insert_animation (T_MFW_HND win_dialog , S32 anim_time ,MfwIcnAttr *icon ,UBYTE number_of_frames)
+{
+  T_MFW_WIN      * win_data     = ((T_MFW_HDR *)win_dialog)->data;
+  T_dialog_info  * data         = (T_dialog_info *)win_data->user;
+
+
+		data->number_of_frames = number_of_frames;
+		data->current_frame = 0;
+		data->icon_array = icon;  
+		data->current_icon = data->icon_array;
+		data->icon = icnCreate(win_dialog,data->current_icon,E_ICN_VISIBLE,NULL);			
+		icnUnhide(data->icon);
+
+    	data->animation_timer = timCreate(win_dialog,anim_time,(MfwCb)mmi_dialogs_insert_animation_CB);
+		timStart(data->animation_timer);
+		winShow(win_dialog);
+		
+}
+
+/*******************************************************************************
+
+ $Function:    	mmi_dialogs_insert_animation_CB
+
+ $Description:	destroys the current icon and starts the next icon
+
+ $Returns:		none
+
+ $Arguments:	timer event, timer control block
+
+*******************************************************************************/
+void mmi_dialogs_insert_animation_CB (T_MFW_EVENT event, T_MFW_TIM *tc)
+{
+  T_MFW_HND       win  = mfw_parent (mfw_header());
+  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
+  T_dialog_info * data = (T_dialog_info *)win_data->user;
+
+  
+		icnDelete(data->icon);
+		if (data->current_frame < (data->number_of_frames-1))
+		{
+				data->current_frame++;
+				data->current_icon++;				
+		}
+		else				    	
+		{
+				data->current_frame = 0;
+				data->current_icon = data->icon_array;
+		}
+		data->icon = icnCreate(win,data->current_icon,E_ICN_VISIBLE,NULL);			
+		icnUnhide(data->icon);
+		timStart(data->animation_timer);
+		winShow(win);
+						
+}
+/***************************Go-lite Optimization changes Start***********************/
+
+//Aug 25, 2004    REF: CRR 24904   Deepa M.D
+//This function is used only for the Color build.Hence it is put under the 
+//COLOURDISPLAY compiler switch
+#ifdef COLOURDISPLAY 
+void mmi_dialogs_insert_animation_new (T_DISPLAY_DATA *animateInfo , S32 anim_time ,MfwIcnAttr* icon ,UBYTE number_of_frames)
+{
+	TRACE_EVENT("mmi_dialogs_insert_animation_new()");
+
+		animateInfo->number_of_frames = number_of_frames;
+		animateInfo->current_frame = 0;
+		animateInfo->icon_array = icon;
+		animateInfo->anim_time = anim_time;
+		
+}
+#endif
+/***************************Go-lite Optimization changes end***********************/
+
+void mmi_dialogs_animation_new_CB (T_MFW_EVENT event, T_MFW_TIM *tc)
+{
+  T_MFW_HND	win = mfw_parent (mfw_header());
+  T_MFW_WIN     * 	win_data = ((T_MFW_HDR *)win)->data;
+  T_dialog_info *   data = (T_dialog_info *)win_data->user;
+  char * idData;
+  int px, py, sx, sy;
+  MfwIcnAttr* icn_array;
+  MfwIcnAttr* icn;
+
+  TRACE_EVENT("mmi_dialogs_insert_animation_new_CB()");
+
+    
+
+  data->current_frame = (data->current_frame +1) % data->number_of_frames; 
+  TRACE_EVENT_P1("data->current_frame = %d", data->current_frame);  
+  TRACE_EVENT_P1("number_of_frames = %d", data->number_of_frames);
+  
+  icn_array = (MfwIcnAttr*)data->icon_array;
+  TRACE_EVENT_P1("data->icon_array = %x", (int)data->icon_array);
+  
+  icn = &icn_array[data->current_frame];
+ 
+  px = icn->area.px;
+  py = icn->area.py;
+  sx = icn->area.sx;
+  sy = icn->area.sy;
+  
+  TRACE_EVENT_P4("px = %d, py = %d, sx = %d, sy = %d", icn->area.px,icn->area.py,icn->area.sx,icn->area.sy);
+	
+  idData = icn->icons;
+	
+  dspl_BitBlt2(px,py,sx,sy,(void*)idData,0,0x02);
+  timStart(data->animation_timer);
+
+}
+//Jun 04,2004 CRR:13601 xpradipg - SASKEN
+/*******************************************************************************
+
+ $Function:    	InfoDialogTimRestart
+
+ $Description:	restarts the information dialog timer
+
+ $Returns:		none
+
+ $Arguments:	window handler
+
+*******************************************************************************/
+
+void InfoDialogTimRestart(T_MFW_HND win)
+{
+	T_MFW_WIN * win_data;
+        T_dialog_info * data;
+	
+        win_data = ((T_MFW_HDR *)win)->data;
+        data     = (T_dialog_info *)win_data->user;
+
+	tim_stop(data->info_tim);
+	tim_start(data->info_tim);
+}
+
+// Feb 24, 2005 CRR:29102 xnkulkar - SASKEN
+// As the user has already confirmed that all SMS messages are to be deleted, KEY_HUP is not
+// registered.
+/*******************************************************************************
+
+ $Function:    	mmi_dialog_information_screen_delete_all
+
+ $Description:	Displays the information screen during "Delete All" operation
+
+ $Returns:	Handle of information dialog
+
+ $Arguments:	window handle, text id, text string and generic status window
+
+*******************************************************************************/
+T_MFW_HND mmi_dialog_information_screen_delete_all(MfwHnd win,int TextId, char* TextStr, int colour)
+{
+	T_DISPLAY_DATA DisplayInfo;
+	
+	dlg_initDisplayData_TextId( &DisplayInfo, TxtNull, TxtNull, TextId,  TxtNull, colour);
+	dlg_initDisplayData_events( &DisplayInfo, NULL, FOREVER, NULL ); 
+	DisplayInfo.TextString 	= TextStr;
+	
+   	return info_dialog(win, &DisplayInfo);
+}
+