view src/aci2/bmi/mmiSmsIdle.c @ 632:d968a3216ba0

new tangomdm build target TCS211/Magnetite built for target leonardo runs just fine on the Tango-based Caramel board, but a more proper tangomdm build target is preferable in order to better market these Tango modems to prospective commercial customers. The only differences are in GPIO and MCSI config: * MCSI is enabled in the tangomdm build config. * GPIO 1 is loudspeaker amplifier control on Leonardo, but on Tango platforms it can be used for anything. On Caramel boards this GPIO should be configured as an output driving high. * GPIO 2 needs to be configured as Calypso input on Leonardo, but on Tango platforms it can be used for anything. On Caramel boards this GPIO should be configured as an output, either high or low is OK.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 04 Jan 2020 19:27:41 +0000
parents 93999a60b835
children
line wrap: on
line source

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

					CONDAT (UK)

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

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

 $Project name:	Basic MMI                                                      
 $Project code:	BMI                                                            
 $Module:		SMS
 $File:		    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 */