diff src/aci2/bmi/mmiSmsIdle.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/mmiSmsIdle.c	Mon Sep 26 00:29:36 2016 +0000
@@ -0,0 +1,1325 @@
+/*******************************************************************************
+
+					CONDAT (UK)
+
+********************************************************************************                                                                              
+
+ This software product is the property of Condat (UK) Ltd and may not be
+ disclosed to any third party without the express permission of the owner.                                 
+                                                                              
+********************************************************************************
+
+ $Project name:	Basic MMI                                                      
+ $Project code:	BMI                                                            
+ $Module:		SMS
+ $File:		    MmiSmsIdle.c
+ $Revision:		1.0                                                       
+                                                                              
+ $Author:		Condat(UK)                                                         
+ $Date:		    25/10/00                                                      
+                                                                               
+********************************************************************************
+                                                                              
+ Description: Implementation for MMI smsidle unsolicited event handling
+ 
+   
+                        
+********************************************************************************
+
+ $History: MmiSmsIdle.c
+
+	25/10/00			Original Condat(UK) BMI version.
+
+	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 27, 2005    MMI-FIX-29869 x0018858
+   	Description: There is a limitation on the number of messages that can be downloaded from 
+   	server even though there is space on the sim.
+   	Solution: The limitation has been removed and the number of messages that can be dowloaded
+   	has been modified to the maximum number that can be stored.
+
+	Jun 14, 2005 REF: MMI-FIX-30439 x0018858
+   	Description: The homezone/cityzone tags were not being displayed properly.
+   	Solution: Modified to save the tags properly in caches and also made the 
+	appropriate modifications to update the same properly during mobility.	
+
+	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. 
+
+	x0018858 24 Mar, 2005 MMI-FIX-11321
+	Issue Description :- If the inbox is full and a new message is receivd, no indication is received.
+	Fix: Added support for handling indication when message box is full and
+	there is a pending message.
+
+     	Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
+  	Issue description:  BMI: using the tool nowSMS the voicemail indication via sms does not work
+  	Solution: Instead of identifying voice using addr[0] and pid, we use dcs. Also, messages belonging
+  	              to group "1100" are deleted when voicemail icon is displayed.
+	
+	Apr 27, 2004    REF: CRR 21336  Deepa M.D 
+	Bug:SMSMT UCS2 Class0 message content not displayed.
+	Fix:The alphabet bits(UCS2) of DCS were not decoded properly.
+	   
+ $End
+
+*******************************************************************************/
+
+#define ENTITY_MFW
+
+/* includes */
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined (NEW_FRAME)
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "pei.h"
+#include "custom.h"
+#include "gsm.h"
+
+#else
+
+#include "STDDEFS.H"
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+
+#endif
+#include "prim.h"
+
+
+#include "mfw_sys.h"
+
+#include "mfw_mfw.h"
+#include "mfw_win.h"
+#include "mfw_kbd.h"
+/* SPR#1428 - SH - New Editor changes */
+#ifndef NEW_EDITOR
+#include "mfw_edt.h"
+#endif
+#include "mfw_lng.h"
+#include "mfw_icn.h"
+#include "mfw_phb.h"
+#include "mfw_sim.h"
+#include "mfw_nm.h"
+
+#include "ksd.h"
+#include "psa.h"
+#include "mfw_sms.h"
+#include "mfw_smsi.h"
+#include "mfw_mnu.h"
+#include "mfw_sat.h"
+#include "mfw_tim.h"
+#include "mfw_mme.h"
+
+#include "dspl.h"
+
+#include "MmiMmi.h"
+#include "MmiDummy.h"
+#include "MmiDialogs.h"
+#include "MmiLists.h"
+
+#include "MmiMain.h"
+#include "MmiStart.h"
+#include "MmiPins.h"
+#include "MmiMenu.h"
+#include "MmiSoftKeys.h"
+#include "MmiSounds.h"
+#include "mmiCall.h"
+
+#include "MmiBookController.h"
+
+
+#include "MmiIdle.h"
+#include "Mmiicons.h"
+#include "mmiSmsIdle.h"
+#include "mmiSmsBroadcast.h"
+
+/* SPR759 - SH */
+#ifdef MMI_HOMEZONE_ENABLED
+#include "MmiHomezone.h"
+#endif
+#include "mmiSmsRead.h"  /*SPR 2512*/
+#include "cus_aci.h"
+
+#include "prim.h"
+#ifndef PCM_2_FFS
+#include "pcm.h"
+#endif
+
+#include "gdi.h"
+#include "audio.h"
+
+// Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
+extern BOOL invalidVm; 
+//Apr 05, 2005    REF: ENH 29994 xdeepadh
+#ifdef FF_MIDI_RINGER  
+#include "mfw_midi.h"
+#endif
+
+/*********************************************************************
+**********************************************************************
+
+				 STATIC MENU WINDOW. DECLARATION
+
+*********************************************************************
+**********************************************************************/
+
+typedef struct
+{
+    /* administrative data */
+
+    T_MMI_CONTROL   mmi_control;
+    T_MFW_HND       win;
+    SHORT           id;
+    T_MFW_HND       parent;
+
+    /* associated handlers */
+
+    T_MFW_HND       sms;
+
+    /* internal data */
+
+    BOOL sms_initialised;
+    BOOL sms_store_free;
+} T_smsidle;
+//Apr 05, 2005    REF: ENH 29994 xdeepadh
+#ifdef FF_MIDI_RINGER  
+extern T_call call_data;
+#endif
+/*********************************************************************
+
+						External Function Prototypes
+
+**********************************************************************/						
+extern UBYTE getcurrentSMSTone(void);
+extern UBYTE getcurrentVoiceTone(void);
+extern UBYTE Delete_1_2_1_vm_icon;
+extern UBYTE Display_1_2_1_vm_icon;
+/* cq15633 Access function returning incoming call alert window status. 23-03-04. MZ */
+extern BOOL  call_IsAlertScreenActive( void );
+//	May 27, 2005    MMI-FIX-29869 x0018858 - Extern function 
+#ifdef FF_MMI_SMS_DYNAMIC
+extern Check_max_sms_allowed(void);
+#endif
+/*********************************************************************
+
+						Function Prototypes
+						
+**********************************************************************/
+// ADDED BY RAVI - 28-11-2005
+EXTERN UBYTE getCurrentRingerSettings(void);
+extern UBYTE sms_check_message_pending(void);
+// END RAVI - 28-11-2005
+ 
+static SHORT smsidle_get_new_cb_messages_count(void);
+static T_smsidle smsidle_data;
+static int smsidle_sr_status_to_text_id(UBYTE status); /* Marcus: Issue 1170: 07/10/2002 */
+
+
+// Used to count the number of deleted messages in delete all
+SHORT g_ListLength2;
+static char status_report[160]; /* Marcus: Issue 1170: 07/10/2002 */
+
+static T_MFW_HND smsidle_create (T_MFW_HND parent);
+static void smsidle_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
+int smsidle_sms_cb (MfwEvt e, MfwWin *w);
+
+/*******************************************************************************
+
+ $Function:    	smsidle_start
+
+ $Description:	This function will be call once.It is create a static sms handle
+ 
+ $Returns:		mfw window handler 
+
+ $Arguments:	parent_window - Parent window handler
+ 				param - optional data
+ 
+*******************************************************************************/
+
+T_MFW_HND smsidle_start(T_MFW_HND parent_window, void *param)
+{
+    T_MFW_HND win;
+
+    TRACE_FUNCTION ("smsidle_start()");
+
+    win = smsidle_create (parent_window);
+
+    if (win NEQ NULL)
+	{
+	    SEND_EVENT (win, E_INIT, 0, NULL);
+	}
+    return win;
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_create
+
+ $Description:	Create sms Idle window
+ 
+ $Returns:		mfw window handler 
+
+ $Arguments:	parent_window - Parent window handler
+ 
+*******************************************************************************/
+static T_MFW_HND smsidle_create(MfwHnd parent_window)
+{
+    T_smsidle  * data = &smsidle_data;
+    T_MFW_WIN  * win;
+
+    TRACE_FUNCTION ("smsidle_create()");
+
+    /*
+     * Create window handler
+     */
+
+    if (data->win EQ NULL)
+	{
+	    data->win = 
+		win_create (parent_window, 0, 0, NULL);
+	    if (data->win EQ NULL)
+		{
+		    return NULL;
+		}
+	}
+    else
+	{
+	    TRACE_EVENT ("smsidle_create() called twice");
+	    return NULL;
+	}
+
+    /* 
+     * connect the dialog data to the MFW-window
+     */
+
+    data->mmi_control.dialog = (T_DIALOG_FUNC)smsidle_exec_cb;
+    data->mmi_control.data   = data;
+    win                      = (T_MFW_WIN *)((T_MFW_HDR *)data->win)->data;
+    win->user                = (void *)data;
+    data->parent             = parent_window;
+
+    /*
+     * return window handle
+     */
+
+    win_show(data->win);
+    return data->win;
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_destroy
+
+ $Description:	Destroy the sms Idle window.
+ 
+ $Returns:		none
+
+ $Arguments:	none
+ 
+*******************************************************************************/
+void smsidle_destroy(void)
+{
+    T_MFW_WIN     * win_data;
+    MfwHnd          own_window;
+    T_smsidle     * data;
+
+    own_window = smsidle_data.win;
+
+    TRACE_FUNCTION ("smsidle_destroy()");
+
+    if (own_window)
+	{
+	    win_data = (T_MFW_WIN *)((T_MFW_HDR *)own_window)->data;
+	    data = (T_smsidle *)win_data->user;
+
+	    if (data)
+		{
+		    /*
+		     * Delete WIN handler
+		     */ 
+		    win_delete (data->win);
+
+		    /*     
+		     * Free Memory
+		     */
+		    /* Memory is static! */
+		}
+	    else
+		{
+		    TRACE_EVENT ("smsidle_destroy() called twice");
+		    return;
+		}
+	}
+}
+
+
+
+/*******************************************************************************
+
+ $Function:    	smsidle_exec_cb
+
+ $Description:	Call back function for the sms Idle window.
+ 
+ $Returns:		none
+
+ $Arguments:	win - current window
+ 				event - window event
+ 				value - unique id
+ 				parameter - pointer to optional data.
+ 
+*******************************************************************************/
+
+void smsidle_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_WIN *)((T_MFW_HDR *) win)->data;
+    T_smsidle      * data     = (T_smsidle *)win_data->user;
+    T_MFW_EVENT    smsEvents;
+
+    TRACE_FUNCTION ("smsidle_exec_cb()");
+
+    switch (event)
+	{
+	case E_INIT:
+	    /* initialization of administrative data */
+	    data->id = value;
+
+	    /* initialization of the dialog data */
+
+	    sms_init(); /* startup sms in MFW */
+	    
+	    smsEvents = 
+			      E_SMS_MO_AVAIL | E_SMS_CMD_AVAIL | E_SMS_SAVE_AVAIL
+				| E_SMS_MT       | E_SMS_MO        | E_SMS_MT_RECEIVED | E_SMS_STATUS
+				| E_SMS_MEM      | E_SMS_OK        | E_SMS_ERR         | E_SMS_BUSY   
+				| E_SMS_MEM_FULL | E_SMS_MEM_FREE  | E_SMS_RECEIVED    | E_SMS_CB
+				| E_SMS_READY    | E_SMS_CB_RECEIVED;
+
+		
+	    data->sms = sms_create(win, smsEvents, (T_MFW_CB) smsidle_sms_cb);
+
+        /* "sms_initialised"  indicates that the SMS is ready or not */
+        /*api - 10-05-02 - Set To True so the SMS can be recieved (Event not Generated) */
+	    data->sms_initialised  = FALSE;	/* SMS not ready yet */
+
+	    /* "sms_store_free"  indicates that the SMS Memory is full or not */
+        /* Set default to True !*/
+	    data->sms_store_free   = TRUE; // ??? 
+
+	    break;
+	case E_BACK:
+	case E_ABORT:
+	case E_EXIT:
+	    smsidle_destroy(); /* there's no default reaction */
+	    sms_delete(data->sms);
+	    sms_exit(); /* ??? implementation of routine is actually empty */
+	    break;
+	default:
+	    TRACE_EVENT("unhandled event in smsidle_exec_cb()");
+	    return;
+	}
+}
+/*******************************************************************************
+
+ $Function:    	smsidle_message_to_text
+
+ $Description:	function to format message information into a text string. SPR2363
+ 
+ $Returns:		none
+
+ $Arguments:	message data structure, text buffer(should be at least MAX_EDITOR_LEN 
+ 				chars long)
+ 
+*******************************************************************************/
+
+void smsidle_message_to_text(T_MFW_SMS_MT* SmsMt, char* text_buffer)
+{
+	T_MFW_PHB_ENTRY pb_entry;
+//	UBYTE input_type, output_type;   // RAVI
+	char sms_text_buffer[STANDARD_EDITOR_SIZE];
+	UBYTE index=0;
+//	UBYTE msg_len;   // RAVI
+	T_ATB_TEXT main_text, temp_text;
+	
+
+
+	/*clear buffers*/
+	memset(sms_text_buffer, 0, STANDARD_EDITOR_SIZE);
+	memset(text_buffer, 0, MAX_EDITOR_LEN);
+
+
+
+	
+			
+/*, if new editor use nice string-handling functions*/
+
+			main_text.data = (UBYTE*)text_buffer;
+/*set up text data stucture for main display string*/
+			if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
+				main_text.dcs = ATB_DCS_UNICODE;
+			else
+				main_text.dcs = ATB_DCS_ASCII;
+			ATB_string_Length(&main_text);  		
+
+
+/*SPR 2539, if new editor use nice string-handling functions*/
+		/*see if the sender is in the phonebook*/
+		if (bookFindNameInPhonebook((const char*)SmsMt->orig_addr.number, &pb_entry) !=0)
+		{	char temp_string[PHB_MAX_LEN];
+
+				memset(temp_string, 0, PHB_MAX_LEN);
+				/*copy name into a text data structure*/
+				if ((pb_entry.name.dcs&0xC0) == MFW_DCS_UCS2 ||pb_entry.name.data[0] == 0x80 )
+					temp_text.dcs = ATB_DCS_UNICODE;
+				else
+					temp_text.dcs = ATB_DCS_ASCII;
+				if (temp_text.dcs != ATB_DCS_UNICODE)
+				{	
+					temp_text.data = (UBYTE*)pb_entry.name.data;	
+				}
+				
+				else
+				{	pb_entry.name.len-=2;
+					memcpy(temp_string, &pb_entry.name.data[2], pb_entry.name.len);
+					temp_text.data = (UBYTE*)temp_string;
+				}
+				ATB_string_Length(&temp_text);
+				/*add name text into main display string*/
+				ATB_string_Concat(&main_text, &temp_text);
+		}
+
+
+
+					sms_text_buffer[index++]='\n';
+				
+					sms_text_buffer[index++]='0'+SmsMt->sctp.day[0];
+					sms_text_buffer[index++]='0'+SmsMt->sctp.day[1];
+					sms_text_buffer[index++]='/';
+					sms_text_buffer[index++]='0'+SmsMt->sctp.month[0];
+					sms_text_buffer[index++]='0'+SmsMt->sctp.month[1];
+					sms_text_buffer[index++]='/';
+					sms_text_buffer[index++]='0'+SmsMt->sctp.year[0];
+					sms_text_buffer[index++]='0'+SmsMt->sctp.year[1];
+					sms_text_buffer[index++]=',';
+					sms_text_buffer[index++]='\n';
+					
+					sms_text_buffer[index++] ='0'+SmsMt->sctp.hour[0];
+					sms_text_buffer[index++]='0'+SmsMt->sctp.hour[1];
+					sms_text_buffer[index++]=':';
+					sms_text_buffer[index++]='0'+SmsMt->sctp.minute[0];
+					sms_text_buffer[index++]='0'+SmsMt->sctp.minute[1];
+					sms_text_buffer[index++]='\n';	
+
+/* if new editor use nice string-handling functions*/
+				
+				temp_text.dcs = ATB_DCS_ASCII;
+				temp_text.data = (UBYTE*)sms_text_buffer;
+				ATB_string_Length(&temp_text);
+				ATB_string_Concat(&main_text, &temp_text);
+				//	Apr 27, 2004    REF: CRR 21336 Deepa M.D 
+				//Check for the  Alphabet bits(2nd and 3rd bits) in the DCS.(GSM 03.38 version 5.6.1,Section 4) 
+				//Bit 3 and 2 are equal to 1 &0 indicates UCS2 coding
+				if ((SmsMt->dcs&0x0C) == MFW_DCS_UCS2)
+					temp_text.dcs = ATB_DCS_UNICODE;
+				else
+					temp_text.dcs = ATB_DCS_ASCII;
+				temp_text.data = (UBYTE*)SmsMt->sms_msg;
+				ATB_string_Length(&temp_text);
+				/*Add date and time to main display string*/
+				ATB_string_Concat(&main_text, &temp_text);
+				
+
+
+	}
+			
+
+/*******************************************************************************
+
+ $Function:    	smsidle_sms_cb
+
+ $Description:	Call back function for the sms Idle window.
+ 
+ $Returns:		none
+
+ $Arguments:	event - window event
+ 				w - current window 
+*******************************************************************************/
+int smsidle_sms_cb (MfwEvt event, MfwWin *w)
+    /* smsidle's sms event handler */
+{
+    T_MFW_HND    win      = mfwParent((MfwHdr *)mfw_header());
+    T_MFW_WIN  * win_data = (T_MFW_WIN *)((T_MFW_HDR *)win)->data;
+    T_smsidle  * data     = (T_smsidle *)win_data->user;
+	UBYTE currentSMSTone;
+	UBYTE currentVoiceTone; /*CQ 10586 - API - 19/06/03 */
+
+	/*cq 15633 get current ringer settings */
+	UBYTE currentRinger = getCurrentRingerSettings();
+
+	/*JVJ SPR1298 Converted to dynamic variable */
+	//May 27, 2005    MMI-FIX-29869 x0018858
+#ifdef FF_MMI_SMS_DYNAMIC
+	T_MFW_SMS_IDX* msg_list;
+	T_MFW_SMS_IDX* urd_msg_list;
+#else
+    T_MFW_SMS_IDX* msg_list= (T_MFW_SMS_IDX*)ALLOC_MEMORY(MAX_MESSAGES*sizeof(T_MFW_SMS_IDX));
+    T_MFW_SMS_IDX* urd_msg_list=  (T_MFW_SMS_IDX*)ALLOC_MEMORY(MAX_MESSAGES*sizeof(T_MFW_SMS_IDX));
+#endif
+	SHORT urd_count;
+//	UBYTE alphabet;    // RAVI
+    /*JVJ SPR1298 Converted to dynamic variable */
+    char* temp_buffer = NULL;
+    int result = MFW_EVENT_CONSUMED;
+
+	//May 27, 2005    MMI-FIX-29869 x0018858
+#ifdef FF_MMI_SMS_DYNAMIC
+	Check_max_sms_allowed();
+
+	msg_list = (T_MFW_SMS_IDX*)ALLOC_MEMORY(g_max_messages*sizeof(T_MFW_SMS_IDX));
+	urd_msg_list = (T_MFW_SMS_IDX*)ALLOC_MEMORY(g_max_messages*sizeof(T_MFW_SMS_IDX));	
+#endif
+
+    TRACE_EVENT ("smsidle_sms_cb()");
+
+    switch (event)
+	{
+	case E_SMS_READY: 
+	    TRACE_EVENT ("E_SMS_READY");
+		/* now sms is now ready for using */
+	    data->sms_initialised = TRUE;	   
+  		sms_set_mt_ind(MT_IND_IDX); 	/* MMI-FIX-17223. Needed for class 0 messages not to be stored in SIM */  
+	    	sms_cb_init();    /*SPR 2470  initialise cell broadcast now SMS has initialised*/
+		smscb_getCBsettings();  /* Get CB info from SIM or phone */
+#ifdef MMI_HOMEZONE_ENABLED
+		//Jun 14, 2005 REF: MMI-FIX-30439 x0018858
+		//Commented the function call,
+		//homezoneActivateCB();	/* SPR759 - SH - Activate Cell Broadcast channel for homezone */
+#endif
+   		
+	    break;
+	case E_SMS_MT_RECEIVED: /* new SMS received, automatically saved     */
+	case E_SMS_MT:          /* new SMS received, NOT automatically saved */
+	{
+
+	     /*SPR#1408 - DS - Take the SMS data from MFW. Port of 1669 */
+	    T_MFW_SMS_MT *Message = (T_MFW_SMS_MT *) w;
+
+		// check for SMS indicating voice mail.
+	//May 27, 2005    MMI-FIX-29869 x0018858
+#ifdef FF_MMI_SMS_DYNAMIC
+		urd_count = sms_index_list(MFW_SMS_UNREAD,urd_msg_list,g_max_messages);
+		
+		sms_index_list(MFW_SMS_VOICE,msg_list,g_max_messages);
+#else
+		urd_count=sms_index_list(MFW_SMS_UNREAD,urd_msg_list,MAX_MESSAGES);
+		
+		sms_index_list(MFW_SMS_VOICE,msg_list,MAX_MESSAGES);
+#endif
+        TRACE_EVENT_P4("urd_count %d urd_msg_list-> index %d stat %d msg_type %d",
+                        urd_count,urd_msg_list[0].index,urd_msg_list[0].stat,urd_msg_list[0].msg_type);
+
+        TRACE_EVENT_P2("msg_type: %d, Message->voicemail: %d", msg_list[0].msg_type, Message->voicemail);
+        
+		//Check SMS indicating voice mail is the received SMS, by checking index is the same.
+		/*SPR#1408 - DS - Added check for voicemail flag. 
+		  *For E_SMS_MT_RECEIVED messages the MFW flags the message as a voicemail by setting the 
+		  *msg_type to MFW_SMS_VOICE. For E_SMS_MT messages the MFW flags as a voicemail by
+		  *setting a boolean in the SMS MT structure. Port of 1669 (then modified).
+		  */
+		if ( ( (event == E_SMS_MT_RECEIVED) && (msg_list[0].msg_type == MFW_SMS_VOICE) ) || 
+		    ( (event == E_SMS_MT) && (Message->voicemail == TRUE) ) )
+		{	
+			if(iconsGetState(iconIdVoice) == ICON_VISIBLE || (Delete_1_2_1_vm_icon == TRUE))
+			{
+				if (iconsGetState(iconIdVoice) == ICON_VISIBLE && Display_1_2_1_vm_icon == TRUE)
+				{
+					// one-2-one only functionality, do nothing as icon is already being displayed.
+					break;
+				}
+				else 
+				{
+					Delete_1_2_1_vm_icon  = FALSE;
+					Display_1_2_1_vm_icon = FALSE;
+					iconsDeleteState(iconIdVoice); 
+				}
+			}
+			else
+			{	
+				iconsSetState(iconIdVoice);      /*  display voice mail icon.*/
+//Apr 05, 2005    REF: ENH 29994 xdeepadh	
+//Nov 02, 2005    REF:ER OMAPS00039044  xdeepadh
+//Play the SMS tone alert
+#ifdef FF_MIDI_RINGER  
+	mfw_ringer_start(AS_RINGER_MODE_SMS,false,sounds_midi_ringer_start_cb);
+#else
+				/*CQ 10586 - API - 19/06/03 - Play Adio buzzer when new voice mail received*/
+				currentVoiceTone = getcurrentVoiceTone();
+#ifdef FF_MMI_RINGTONE /* MSL SMS Tone Play */
+                           audio_PlaySoundID( AUDIO_BUZZER, SMSTONE_SELECT, 200, AUDIO_PLAY_ONCE );
+#else
+			    	/* RAVI - 20-1-2006 */
+#ifdef NEPTUNE_BOARD
+                            audio_PlaySoundID( AUDIO_BUZZER, currentVoiceTone, 200, 
+                                                              AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#else
+			    	audio_PlaySoundID( AUDIO_BUZZER, currentVoiceTone, 200, AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#endif
+
+#endif
+#endif
+				mme_backlightEvent(BL_INCOMING_SMS);
+			}
+			idleEvent(IdleUpdate);		/*  update the idle screen.*/
+	    	
+	    		// Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
+	    		// Check if this voice mail sms is marked for deletion (belonging to group "1100") 
+	    		if(msg_list[0].stat == MFW_SMS_VOICEMSG_DELETE)
+	    		{
+	    			//Delete this voice mail sms and set 'invalidVm' flag to FALSE
+				sms_msg_delete(msg_list[0].index);
+				invalidVm = FALSE;
+	    		}
+		}
+		else if(urd_count > 0 && urd_msg_list[0].stat == MFW_SMS_UNREAD && (event != E_SMS_MT))
+		{
+		    /* set the status: The sms icon and  the string*/
+	    	/* "message(s) received" will be displayed     */
+	    	iconsSetState(iconIdSMS);      /* Indicate SMS delivery to MS-User. */
+		    idleEvent(IdleNewSmsMessage);
+//Apr 05, 2005    REF: ENH 29994 xdeepadh	
+//Nov 02, 2005    REF:ER OMAPS00039044  xdeepadh
+//Play the SMS tone alert
+//If SMS is recieved , while in call screen,dont play the tone.
+#ifdef FF_MIDI_RINGER  
+
+if((!(call_data.calls.numCalls)))
+{
+	mfw_ringer_start(AS_RINGER_MODE_SMS,false,sounds_midi_ringer_start_cb);
+}
+#else
+		    currentSMSTone = getcurrentSMSTone();
+#ifdef FF_MMI_RINGTONE /* MSL SMS Tone Play */
+                  audio_PlaySoundID( AUDIO_BUZZER, SMSTONE_SELECT, 200, AUDIO_PLAY_ONCE ); 	
+#else
+          	    /* RAVI - 20-1-2006 */
+#ifdef NEPTUNE_BOARD
+                  audio_PlaySoundID( AUDIO_BUZZER, currentSMSTone,
+                                                    getCurrentVoulmeSettings(), AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */	
+#else
+          	    audio_PlaySoundID( AUDIO_BUZZER, currentSMSTone, 200, AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */	
+#endif
+
+#endif
+#endif
+		   /* cq15633 If the Incoming call alert screen is active continue with the incoming call ringer after playing the
+		        the SMS received tone. 23-03-04 MZ. */
+//Apr 05, 2005    REF: ENH 29994 xdeepadh			        
+#ifndef FF_MIDI_RINGER  
+		   if(TRUE == call_IsAlertScreenActive())
+		   {
+#ifdef FF_MMI_RINGTONE /* MSL SMS Tone Play */
+                            audio_PlaySoundID(AUDIO_BUZZER, SMSTONE_SELECT, 0 , AUDIO_PLAY_INFINITE);
+#else
+				/* RAVI - 20-1-2006 */		   	
+/* Silent Implementation */
+#ifdef NEPTUNE_BOARD
+                            audio_PlaySoundID(AUDIO_BUZZER, currentRinger, 
+                                                             getCurrentVoulmeSettings(), AUDIO_PLAY_INFINITE);
+#else
+				audio_PlaySoundID(AUDIO_BUZZER, currentRinger, 0 , AUDIO_PLAY_INFINITE);
+#endif
+/* END RAVI */
+
+#endif
+		   }
+#endif
+		   
+			mme_backlightEvent(BL_INCOMING_SMS);
+		}	
+		/*NM p029*/
+		/* API - Implemented NM changes from 3.3.3 mainline to show class 0 SMS on idle screen */
+		else if(event == E_SMS_MT) /* this sms identifier "E_SMS_MT" is not saved on the SIM */
+		{
+			/* take the SMS data from MFW  */
+            T_MFW_SMS_MT *Message = (T_MFW_SMS_MT *) w;
+			char* temp_buffer_sms = (char*)ALLOC_MEMORY(MAX_EDITOR_LEN);
+            /* Marcus: Issue 1650: 28/01/2003: Start */
+            TRACE_EVENT ("E_SMS_MT");
+            /* check for the class 0 message */
+            TRACE_EVENT_P1("dcs: 0x%02X", Message->dcs);
+			/*if memory allocation successful*/
+			
+			if (temp_buffer_sms != NULL)
+			{
+	            if ((Message->dcs & TEXT_CLASS_GIVEN) &&
+	                ((Message->dcs & TEXT_CLASS_MASK) == TEXT_CLASS_0))
+	            {
+	                TRACE_EVENT ("Class 0 message");
+
+					/*
+					** SPR#1745 NDH Text from ACI may be compressed. if so
+					** the text will need to be converted to ASCII before it can
+					** be displayed properly
+					*/
+					if (Message->dcs & TEXT_COMPRESSED)
+					{			 
+					    
+						TRACE_EVENT ("text_compressed");	
+
+						/*
+						ACI already (in case of 7bit-dcs!) extract the 7 bit to 8 bit,
+						so this is what we get and we have just only to decode from
+						7Bit-Default to ASCII
+						*/   
+		
+				   /*SPR 2512, convert message into a text string and then send to idle for display*/
+					smsidle_message_to_text(Message, temp_buffer_sms);
+					addCBCH(temp_buffer_sms, IdleNewSmsMessage);	
+
+
+
+						
+					}
+					else
+					{  
+						TRACE_EVENT ("text_uncompressed");
+
+						
+					/*SPR 2512, convert message into a text string and then send to idle for display*/
+					smsidle_message_to_text(Message, temp_buffer_sms);
+									addCBCH(temp_buffer_sms, IdleNewSmsMessage);	
+
+					
+					}
+					/*
+					** SPR#1745 - End
+					*/
+				    /*CQ10826 - API - 27/06/03 - Add audio indication for class 0 SMS*/
+//Apr 05, 2005    REF: ENH 29994 xdeepadh		
+//Nov 02, 2005    REF:ER OMAPS00039044  xdeepadh
+#ifdef FF_MIDI_RINGER  
+	mfw_ringer_start(AS_RINGER_MODE_SMS,false,sounds_midi_ringer_start_cb);
+#else
+				    currentSMSTone = getcurrentSMSTone();
+#ifdef FF_MMI_RINGTONE /* MSL SMS Tone Play */
+                                audio_PlaySoundID( AUDIO_BUZZER, SMSTONE_SELECT, 200, AUDIO_PLAY_ONCE ); 
+#else
+				  /* RAVI - 20-1-2006 */
+#ifdef NEPTUNE_BOARD
+                                 audio_PlaySoundID( AUDIO_BUZZER, currentSMSTone, 
+                                                                   getCurrentVoulmeSettings(), AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#else
+				    audio_PlaySoundID( AUDIO_BUZZER, currentSMSTone, 200, AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#endif
+/* END RAVI */
+
+#endif
+#endif
+				    mme_backlightEvent(BL_INCOMING_SMS);
+				    /*CQ10826 - END*/
+					
+	            }
+
+
+            /*temp_buffer_sms will be freed in editor callback*/
+    
+		}
+       }
+		/*NM p029 end*/
+	}
+	    break;
+	case E_SMS_CB: /* new CBCH received */
+	{
+		// USHORT i;  // RAVI
+		SHORT geograhical_scope = (SHORT)0xC000;
+
+		T_MFW_SMS_CB *Message = (T_MFW_SMS_CB *)w;
+
+	    TRACE_EVENT ("E_SMS_CB");
+
+		temp_buffer = (char*)ALLOC_MEMORY(MAX_CBMSG_LEN);
+		memset(temp_buffer, '\0', MAX_CBMSG_LEN);
+
+		//check: does the incoming CB indicates a immediate scope
+		if (! (Message->sn & geograhical_scope) )
+	     {
+		 //Immediate scope
+		 // API - 859 - German characters were not visable in the CB message
+		 TRACE_EVENT("Immediate Scope");
+
+		 // API - 859 - Convert the the incoming GSM Text to ASCII
+		 /*SPR2175, use new function for conversion*/
+		 ATB_convert_String(Message->cb_msg, MFW_DCS_8bits, Message->msg_len,
+								  temp_buffer, MFW_ASCII, MAX_CBMSG_LEN, FALSE);
+	     	
+			/*	SPR 2429, removed search for terminating character*/
+
+#ifdef MMI_HOMEZONE_ENABLED		// SH 11/12/01
+			/* SPR759 - SH - Homezone: check to see if CB gives us the coordinates of the centre of the current cell */
+
+			if (Message->msg_id==HZ_IDENTIFIER)
+			{
+				homezoneCBData(Message->cb_msg);
+			}
+			else
+			{
+#endif // HOMEZONE
+
+		     //display now on the idle screen
+		     
+		     addCBCH(temp_buffer, IdleNewCBImmediateMessage);
+		    statusCBCH(TRUE);
+#ifdef MMI_HOMEZONE_ENABLED
+			} /* SPR759 - SH */
+#endif
+		}
+		else //Normal scope
+		{
+			TRACE_EVENT("Normal Scope");
+			//only for single- and the last page of mulitpages
+			//other pages have not the termination "0x00D"
+			
+			// API - 859 - Convert the the incoming GSM Text to ASCII
+			/*SPR2175, use new function for conversion*/
+			ATB_convert_String(Message->cb_msg, MFW_DCS_8bits, Message->msg_len,
+					temp_buffer, MFW_ASCII, MAX_MSG_LEN, FALSE);
+
+			memcpy(Message->cb_msg, temp_buffer, MAX_CBMSG_LEN);
+			
+			/*	SPR 2429, removed search for terminating character*/
+			{
+				Message->cb_msg[MAX_CBMSG_LEN - 1 ]='\0';  // RAVI - Changed as MAX_CBMSG_LEN - 1.
+			}
+
+			//indicate on the idle screen the new incoming cb
+		    addCBCH( NULL, IdleNewCBNormalMessage );
+			statusCBCH(TRUE);
+			
+			//save the incoming cb messages in the fifo
+			sms_new_incoming_cb (Message);
+			
+		}
+	    FREE_MEMORY((void*)temp_buffer,MAX_CBMSG_LEN);
+	}
+	break;
+
+  case E_SMS_MEM_FULL:
+        /* the memory of SMS is FULL !!*/
+	    data->sms_store_free = FALSE;
+	    
+	    /* 	    sendevent IDLE_UPDATE; */
+	    SEND_EVENT(idle_get_window(),IDLE_UPDATE,0,0);
+	    break;
+	case E_SMS_MEM_FREE:
+	    /* the memory of SMS is FREE */
+ 	    data->sms_store_free = TRUE;
+ 	    
+	    /* 	    sendevent IDLE_UPDATE; */
+	    SEND_EVENT(idle_get_window(),IDLE_UPDATE,0,0);
+		/* ??? */
+
+	    break;
+	case E_SMS_STATUS: /* status report from service center */
+	     /* Marcus: Issue 1170: 07/10/2002: Start */
+	    {
+	        T_MFW_SMS_STATUS *sms_status = (T_MFW_SMS_STATUS *)w;
+    	    TRACE_EVENT("E_SMS_STATUS");
+//Apr 05, 2005    REF: ENH 29994 xdeepadh	
+//Nov 02, 2005    REF:ER OMAPS00039044  xdeepadh
+//Play the SMS tone alert for status report indication
+#ifdef FF_MIDI_RINGER  
+	mfw_ringer_start(AS_RINGER_MODE_SMS,false,sounds_midi_ringer_start_cb);
+#else
+ 		    currentSMSTone = getcurrentSMSTone();
+#ifdef FF_MMI_RINGTONE /* MSL SMS Tone Play */
+                  audio_PlaySoundID( AUDIO_BUZZER, SMSTONE_SELECT, 200, AUDIO_PLAY_ONCE );
+#else
+		   /* RAVI - 20-1-2006 */
+#ifdef NEPTUNE_BOARD
+                  audio_PlaySoundID( AUDIO_BUZZER, currentSMSTone, 
+                                                   getCurrentVoulmeSettings(), AUDIO_PLAY_ONCE );
+#else
+		    audio_PlaySoundID( AUDIO_BUZZER, currentSMSTone, 200, AUDIO_PLAY_ONCE );
+#endif
+/* END RAVI */
+
+#endif
+#endif
+		    
+      	    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
+    	    {
+    	        /*
+    	         * There is no support for Chinese in the addCBCH function,
+    	         * so will be problems with class 0 SMS messages and with cell
+    	         * broadcast messages that need to be addressed anyway.
+    	         * A new issue will be raised to handle this problem.
+    	         */
+    	    }
+    	    else
+    	    {
+    	        memset(status_report, '\0', sizeof(status_report));
+    	        strcpy(status_report, MmiRsrcGetText(TxtSRR));
+    	        strcat(status_report, ": ");
+     	        strcat(status_report, MmiRsrcGetText(TxtStatus));
+    	        strcat(status_report, ": ");
+     	        strcat(status_report, MmiRsrcGetText(smsidle_sr_status_to_text_id(sms_status->status)));
+     	        sprintf(&status_report[strlen(status_report)], " (%u): ", sms_status->status);
+#ifdef NO_ASCIIZ
+                if (sms_status->addr.len)
+                {
+                    memcpy(&status_report[strlen(status_report)], sms_status->addr.tag, sms_status->addr.len);
+        	        strcat(status_report, " ");
+                }
+#else
+                if (strlen(sms_status->addr.tag))
+                {
+                    strcat(status_report, sms_status->addr.tag);
+        	        strcat(status_report, " ");
+                }
+#endif
+                if (sms_status->addr.ton == MFW_TON_INTERNATIONAL)
+                    strcat(status_report, "+");
+
+                strcat(status_report, sms_status->addr.number);
+                sprintf(&status_report[strlen(status_report)],
+                    ": %0u%0u/%0u%0u/%0u%0u %0u%0u:%0u%0u:%0u%0u (%s %u)",
+                    sms_status->rctp.day[0],
+                    sms_status->rctp.day[1],
+                    sms_status->rctp.month[0],
+                    sms_status->rctp.month[1],
+                    sms_status->rctp.year[0],
+                    sms_status->rctp.year[1],
+                    sms_status->rctp.hour[0],
+                    sms_status->rctp.hour[1],
+                    sms_status->rctp.minute[0],
+                    sms_status->rctp.minute[1],
+                    sms_status->rctp.second[0],
+                    sms_status->rctp.second[1],
+                    MmiRsrcGetText(TxtMessage),
+                    sms_status->msg_ref);
+                   
+				addCBCH(status_report, IdleNewSmsMessage);
+
+    		    //display now on the idle screen
+    			statusCBCH(TRUE);
+       	    }
+    	}
+	    /* Marcus: Issue 1170: 07/10/2002: End */
+
+	    break;
+	case E_SMS_MEM: /* indicates status of memory */
+	    /* not used */
+	    break;
+	case E_SMS_MO: /* SMS sending has started */
+	    /* not used */
+	case E_SMS_OK:
+		/* Only happens when an SMS message is deleted. */
+
+		break;
+    case E_SMS_BUSY:
+	    TRACE_EVENT ("E_SMS_BUSY");    
+		break;
+	case E_SMS_SAVE_AVAIL:
+		break;
+	case E_SMS_CMD_AVAIL:
+		break;
+    case E_SMS_ERR:
+	    TRACE_EVENT ("E_SMS_ERR");    
+	    break;
+        default:
+	    TRACE_EVENT("unhandled event in smsidle_sms_cb()");
+        result = MFW_EVENT_PASSED;
+	    break;
+	}
+	//May 27, 2005    MMI-FIX-29869 x0018858
+#ifdef FF_MMI_SMS_DYNAMIC
+    FREE_MEMORY((void*)msg_list,g_max_messages*sizeof(T_MFW_SMS_IDX));
+    FREE_MEMORY((void*)urd_msg_list,g_max_messages*sizeof(T_MFW_SMS_IDX));
+#else
+    FREE_MEMORY((void*)msg_list,MAX_MESSAGES*sizeof(T_MFW_SMS_IDX));
+    FREE_MEMORY((void*)urd_msg_list,MAX_MESSAGES*sizeof(T_MFW_SMS_IDX));
+#endif
+
+    return result;
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_get_memory_full
+
+ $Description:	Call back function for the sms Idle window.
+ 
+ $Returns:		sms memory status.
+
+ $Arguments:	none
+ 
+*******************************************************************************/
+
+BOOL smsidle_get_memory_full(void)
+{
+    return (!smsidle_data.sms_store_free);
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_get_new_cb_messages_count
+
+ $Description:	Call back function for the sms Idle window.
+ 
+ $Returns:		sms count.
+
+ $Arguments:	none
+*******************************************************************************/
+
+SHORT smsidle_get_new_cb_messages_count(void)
+{
+    if (smsidle_get_ready_state())
+	{
+	    return smscb_get_new_cb_messages_count();
+	}
+    else
+	{
+	    return 0;
+	}
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smsidle_get_ready_state
+
+ $Description:	This function can be call from anywhere to get the information 
+            	about the "sms_initialised"
+ 
+ $Returns:		sms status
+
+ $Arguments:	none
+ 
+*******************************************************************************/
+BOOL smsidle_get_ready_state(void)
+{
+    return (smsidle_data.sms_initialised);
+}
+
+//GW SPR#1035 - Added SAT changes
+/*******************************************************************************
+
+ $Function:    	smsidle_unset_ready_state
+
+ $Description:	this unset the flat "sms_initialised"
+ 
+ $Returns:		sms status
+
+ $Arguments:	none
+ 
+*******************************************************************************/
+void smsidle_unset_ready_state(void)
+{
+    smsidle_data.sms_initialised = FALSE;
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_get_unread_sms_available
+
+ $Description:	This function allows an external process to determine the
+            	received and unread SMS PP message status.
+ 
+ $Returns:		sms status.
+
+ $Arguments:	none
+ 
+*******************************************************************************/
+BOOL smsidle_get_unread_sms_available(void)
+{	SHORT unread_sms_count;
+
+	//May 27, 2005    MMI-FIX-29869 x0018858
+#ifdef FF_MMI_SMS_DYNAMIC
+    	//begin
+	qAT_PlusCPMS(CMD_SRC_LCL);
+	Check_max_sms_allowed();
+	//End
+#endif
+	TRACE_FUNCTION("smsidle_get_unread_sms_available() ");
+    if (smsidle_get_ready_state())
+    {
+    	//API - 14-01-03 - 1403 - Remove the call to iconsSetState(iconIdSMS) to indicate new SMS incall
+		unread_sms_count = sms_message_count(MFW_SMS_UNREAD);
+
+		return (unread_sms_count > 0 && (unread_sms_count > sms_message_count(MFW_SMS_VOICE)));
+	}
+    else
+	{
+
+    	iconsDeleteState(iconIdSMS);
+		return FALSE;
+	}
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_display_sms_status
+
+ $Description:	Interogates the SMS unread message count and displays
+	            the result using the SMS icon and an information text.
+ 
+ $Returns:		id of text string to be displayed 
+
+ $Arguments:	noOfMsgs - returns number of unread messages (or 0 if there are no
+					messages or the memory is full).
+
+  GW 02/10/01 - Modified code to work with chinese unicode text.
+*******************************************************************************/
+int smsidle_display_sms_status(int* noOfMsgs)
+{
+    SHORT SmsMsgCount;
+    SHORT SmsVmailCount;
+	int txtMsg;
+
+	TRACE_FUNCTION("smsidle_display_sms_status()  ");
+	*noOfMsgs = 0;
+	txtMsg = TxtNull;
+	
+    if (smsidle_get_ready_state())
+	{
+	    SmsVmailCount = sms_message_count(MFW_SMS_VOICE);
+
+
+	    SmsMsgCount = sms_message_count (MFW_SMS_UNREAD);
+
+	    /* Envelope icon and text only appear if a non-Voicemail SMS exists. */
+
+	    if (smsidle_get_memory_full())
+		{
+			/* x0018858 24 Mar, 2005 MMI-FIX-11321
+			Added a condition to check for any pending message.
+			*/
+			//begin -x0018858 24 Mar, 2005 MMI-FIX-11321		
+			if( TRUE == sms_check_message_pending())
+			{
+				txtMsg = TxtSmsWaiting;
+			}//end. x0018858 24 Mar, 2005 MMI-FIX-11321
+			else
+			{
+				txtMsg =  TxtSmsListFull;
+			}
+		} 
+	    else if ((SmsMsgCount > 0) && (SmsMsgCount > SmsVmailCount))
+		{
+			txtMsg = TxtNewMessage;
+			*noOfMsgs = SmsMsgCount;
+
+		}
+	    else
+		{
+		    iconsDeleteState(iconIdSMS);   /* Turn off SMS icon. */
+			txtMsg = TxtNull;
+		}
+
+	    iconsShow();
+	}
+	return (txtMsg);
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_get_unread_smscb_available
+
+ $Description:	This function allows an external process to determine the
+            	received SMS CB message status.
+ 
+ $Returns:		execution status
+
+ $Arguments:	none
+ 
+*******************************************************************************/
+BOOL smsidle_get_unread_smscb_available(void)
+{
+    if (smsidle_get_ready_state())
+	return (smsidle_get_new_cb_messages_count() > 0);
+    else
+	return FALSE;
+}
+
+/*******************************************************************************
+
+ $Function:    	smsidle_display_smscb_status
+
+ $Description:	Interogates the SMS CB message received status and
+            	returns the resulting string to the caller.
+ 
+ $Returns:		none
+
+ $Arguments:	TextString - Text String
+*******************************************************************************/
+void smsidle_display_smscb_status(char *TextString)
+{
+	SHORT count;
+
+	/* count the unread cb messagesc */
+	count = smsidle_get_new_cb_messages_count();
+
+
+	/* the unread CB should have a high priority than */
+	/* the class 0 CB	                              */
+    if (count > 0)
+	{
+	    sprintf(TextString, "%d %s\0",count, GET_TEXT(TxtNewCbMessage));
+        iconsSetState(iconIdSMS);      /* Indicate SMS delivery to MS-User. */
+
+	}
+}
+/* Marcus: Issue 1170: 07/10/2002: Start */
+/*******************************************************************************
+
+ $Function:    	smsidle_sr_status_to_text_id
+
+ $Description:	Returns the text ID for the given status report status
+ 
+ $Returns:		int : text ID
+
+ $Arguments:	UBYTE: SMS-STATUS-REPORT status
+*******************************************************************************/
+static int smsidle_sr_status_to_text_id(UBYTE status)
+{
+    int ret = TxtError;
+    UBYTE group = ((status & 0x60) >> 5);
+    UBYTE value = (status & 0x1F);
+    switch (group)
+    {
+        case 0:  // Short message transaction completed
+            if ((value >= 3) && (value <= 0x0F))
+                ret = TxtError;
+            else
+                ret = TxtDelivered;
+            break;
+
+        case 1: // Temporary error, SC still trying to transfer SM
+            if ((value >= 6) && (value <= 0x0F))
+                ret = TxtError;
+            else
+                ret = TxtTempError;
+            break;
+
+        case 2: // Permanent error, SC is not making any more transfer attempts
+        case 3: // Temporary error, SC is not making any more transfer attempts
+            ret = TxtError;
+            break;
+    }
+    return ret;
+}
+/* Marcus: Issue 1170: 07/10/2002: End */
+
+
+
+
+
+