diff g23m/condat/ms/src/bmi/auiwappush.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/bmi/auiwappush.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,1486 @@
+/*******************************************************************************
+
+					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:                                                   
+ $Project code:	                                                           
+ $Module:		
+ $File:		    AUIWapPush.c
+ $Revision:		                                                      
+                                                                              
+ $Author:		Condat(UK)                                                         
+ $Date:		                                                          
+                                                                               
+********************************************************************************
+                                                                              
+ Description:
+  	The user interface for WAP PUSH.
+                        
+********************************************************************************
+
+ $History: AUIWapPush.c
+
+	xrashmic 11 Jan, 2005 MMI-SPR-OMAPS00063638
+	Ignoring the duplicate push message part received. (The same part 
+	already exists in the push message store)
+				
+	xreddymn Mar-22-2005 MMI-SPR-29767
+	Modified behaviour of SL push message handling in MMI
+
+    xrashmic 9 May, 2005 MMI-SPR-30159
+    Concat PUSH msg are stored and sent to wap client once all parts are received
+
+    xreddymn Jan-10-2005 MMI-SPR-27618: Modified WAP push URL display screen
+             to prevent user from editing the contents.
+
+	21/07/03 - SH - Created
+	   
+ $End
+
+*******************************************************************************/
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+#if defined (NEW_FRAME)
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "pei.h"
+#include "custom.h"
+#include "gsm.h"
+
+#else  /* NEW_FRAME */
+
+#include "STDDEFS.H"
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+
+#endif /* NEW_FRAME */
+
+#include "mfw_sys.h"
+
+#include "mfw_mfw.h"
+#include "mfw_win.h"
+#include "mfw_kbd.h"
+#include "mfw_edt.h"
+#include "mfw_tim.h"
+#include "mfw_phb.h"
+#include "mfw_sms.h"
+#include "mfw_icn.h"
+#include "mfw_mnu.h"
+#include "mfw_lng.h"
+#include "mfw_sat.h"
+#include "mfw_kbd.h"
+#include "mfw_nm.h"
+#include "mfw_cm.h"
+
+#include "dspl.h"
+
+#include "wapmic_types.h"
+
+#include "MmiMmi.h"
+#include "MmiMain.h"
+#include "MmiDummy.h"
+#include "MmiDialogs.h"
+#include "MmiLists.h"
+#include "mmiCall.h"
+
+#include "MmiMenu.h"
+#include "MmiSoftKeys.h"
+#include "MmiResources.h"
+
+#include "MmiBlkLangDB.h"
+#include "MmiBookUtils.h"
+//#include "MmiEditor.h"
+//#include "MmiEditor_i.h"
+#include "MmiBookShared.h"
+#include "ATBData.h"
+#include "ATBWapAUI.h"
+#include "mmiSmsMenu.h"
+#include "mmismssend.h"
+#include "AUIWapext.h"
+#include "AUIWap.h"
+#ifdef MMI_GPRS_ENABLED
+#include "MmiGprs.h"
+#endif
+
+#include "cus_aci.h"
+#include "prim.h"
+#ifndef PCM_2_FFS
+#include "pcm.h"
+#endif
+
+
+#include "mmiColours.h"
+#include "font_bitmaps.h"
+
+//xrashmic 9 May, 2005 MMI-SPR-30159
+#include "conc_sms.h"
+#include "ffs/ffs.h"
+#include "mfw_td.h"
+
+//xrashmic 9 May, 2005 MMI-SPR-30159
+//Maximum number of parts per message
+#define MAX_PUSH_MSG_PARTS 5
+//Maximum PUSH message that can be stored in FFS
+#define MAX_PUSH_MSG_STORAGE 5
+//Maximum duration after which the PUSH message will be deleted from FFS
+#define MAX_DURATION 2 //no of days
+
+typedef struct
+{
+    U16 msg_ref;
+    U8 msg_saved;
+    U8 seq_num;
+    U8 num_msgs;
+    U8 year;
+    U8 month;
+    U8 day;
+}AUI_PUSH_REPOSITORY_TABLE;
+AUI_PUSH_REPOSITORY_TABLE  PUSH_Table[MAX_PUSH_MSG_STORAGE];
+
+enum PUSH_STORAGE
+{
+    MSG_NONE=0,
+    MSG_FFS,
+    MSG_NEW    
+};
+ //xrashmic 11 Jan, 2005 MMI-SPR-OMAPS00063638
+ typedef enum
+{
+    DUPLICATE=-1,
+    NOT_FOUND=0,
+    FOUND
+}PUSHMSG_SEARCH_RESULT;
+typedef struct
+{
+   U8 storage;
+   U8 index;
+}AUI_SORTED_PUSH_REPOSITORY;
+AUI_SORTED_PUSH_REPOSITORY PUSH_Sorted_Parts[MAX_PUSH_MSG_PARTS];
+
+
+static int AUI_wap_mfw_cb(MfwEvt event, MfwHnd hnd);
+static void AUI_wap_push_start_load_SI(UBYTE result);
+
+static void AUI_wap_push_start_cb(UBYTE result);
+static void AUI_wap_push_show_cb(T_MFW_HND win, USHORT identifier, USHORT reason);
+static void AUI_wap_push_list_cb(T_MFW_HND win, ListMenuData *EntryListData);
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_start
+
+ $Description:	Start PUSH
+ 				SPR#2086 - SH - Added
+ 
+ $Returns:		None
+
+ $Arguments:	None
+ 
+*******************************************************************************/
+
+void AUI_wap_push_start()
+{
+
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_start()");
+#endif
+
+	/* Create SMS handler  */
+		
+	AUI_wap_start(WAP_PUSH, (T_WAP_CB)AUI_wap_push_start_cb);
+
+	return;
+}
+
+
+static void AUI_wap_push_start_cb(UBYTE result)
+{
+	T_WAP_DATA *data;
+	
+	TRACE_FUNCTION("AUI_wap_push_start_cb");
+
+	if (!result)
+	{
+		TRACE_EVENT("*** Failed to start up for WAP PUSH ***");
+		return;
+	}
+
+	data = AUI_wap_data();
+	
+	data->PushData = (T_WAP_PUSH_DATA *)AUI_wap_memory_alloc(sizeof(T_WAP_PUSH_DATA));
+	data->PushData->List = NULL;
+	data->PushData->list_created = FALSE;
+	data->PushData->service_indication = -1;
+	memset((void *)data->PushData->list_ids, 0, sizeof(WAP_PUSH_MAX_MESSAGES));
+
+	/* Create SMS handler */
+	data->PushData->Sms_handler = sms_create(0, E_SMS_WAP_MT_RECEIVED, (T_MFW_CB)AUI_wap_mfw_cb);
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_destroy
+
+ $Description:	Start PUSH
+ 				SPR#2086 - SH - Added
+ 
+ $Returns:		None
+
+ $Arguments:	None
+ 
+*******************************************************************************/
+
+void AUI_wap_push_destroy()
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_destroy()");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		return;
+	}
+
+	if (data->PushData->List)
+	{
+		AUI_wap_push_list_destroy();
+	}
+	
+	AUI_wap_memory_free((void *)data->PushData, sizeof(T_WAP_PUSH_DATA));
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_read_PUSH_table
+
+ $Description:	Reads the table from the FFS
+ //xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:		
+
+ $Arguments:	event - The event received
+ 
+*******************************************************************************/
+void AUI_read_PUSH_table(void)
+{
+    T_FFS_OPEN_FLAGS Ffsflags;
+    fd_t FfsFd;
+
+    Ffsflags = FFS_O_RDONLY;
+    FfsFd = ffs_open ("/mmi/concatwappush/table", Ffsflags);
+    if(FfsFd > 0)
+    {
+        ffs_read(FfsFd,(void*)PUSH_Table,sizeof(PUSH_Table)); 
+        ffs_close(FfsFd);
+    }
+    else
+        TRACE_EVENT("Table open failed");
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_store_PUSH_table
+
+  $Description: Stores the table into FFS
+//xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:		
+
+ $Arguments:	event - The event received
+ 
+*******************************************************************************/
+void AUI_store_PUSH_table(void)
+{
+    T_FFS_OPEN_FLAGS Ffsflags;
+    fd_t FfsFd;
+
+    Ffsflags = FFS_O_WRONLY|FFS_O_CREATE;
+    FfsFd = ffs_open("/mmi/concatwappush/table",Ffsflags);
+    if(FfsFd > 0)
+    {
+        ffs_write(FfsFd,(void*)PUSH_Table,sizeof(PUSH_Table));
+        ffs_close(FfsFd);
+    }
+    else
+        TRACE_ERROR("Table write failed");
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_ffs_PUSH_init
+
+ $Description:	Creates the concat push directory and initializes the push table 
+                     and creates a new push table file
+                     //xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:		
+
+ $Arguments:	event - The event received
+ 
+*******************************************************************************/
+void AUI_ffs_PUSH_init(void)
+{
+    T_FFS_RET ffsResult;
+
+    ffsResult = ffs_mkdir("/mmi/concatwappush");
+    if(EFFS_OK == ffsResult)
+    {
+        //Initialize the table
+        memset(PUSH_Table,0,sizeof(PUSH_Table));
+        //write this to FFS
+        AUI_store_PUSH_table();
+    }
+    else
+        TRACE_EVENT("Create Dir Failed");    
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_check_concat_msg
+
+ $Description:	Checks for concat push msg
+ //xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:  TRUE - if it is a concat push message (also the msg ref, seq num and number of msgs are populates in this case)
+                 FALSE - if it is not a concat push message
+
+ $Arguments:	UdhData - UDH data from the sms push message received
+                     UdhLength - UDH length
+                     msg_ref   - Msg ref of the rcvd sms push message
+                     num_msgs - total number of msgs in the concat rcvd sms push message
+                     seq_num - The sequence number of the push message
+ 
+*******************************************************************************/
+BOOL AUI_check_concat_msg( UBYTE* UdhData, UBYTE UdhLength,U16 *msg_ref,U8 *num_msgs,U8 *seq_num)
+{
+    S32 	offset = 0;
+    U8 		IE_ID;
+    U8 		IE_length;
+    BOOL           concatSMS = FALSE;
+    *msg_ref = 0xffff;
+    *num_msgs = 0;
+    *seq_num = 0;
+    while(offset<UdhLength)
+    {
+        IE_ID = UdhData[offset++];
+        IE_length = UdhData[offset++];
+        switch(IE_ID)
+        {
+            case SMS_IEI_CONC_8BIT:	/* 8-bit message reference number */
+                *msg_ref = UdhData[offset+0];
+                *num_msgs = UdhData[offset+1];
+                *seq_num = UdhData[offset+2];
+                concatSMS = TRUE;
+            break;
+
+            case SMS_IEI_CONC_16BIT:	/* 16-bit message reference number */
+                *msg_ref = UdhData[offset+0];
+                *msg_ref|= (UdhData[offset+1] << 8);
+                *num_msgs = UdhData[offset+2];
+                *seq_num = UdhData[offset+3];
+                concatSMS = TRUE;
+            break;
+        }
+        if(TRUE == concatSMS)
+            break;
+        offset+=IE_length;
+    }
+    TRACE_EVENT_P3("Concat Push Msg Ref-%d, Seq-%d, Total-%d",*msg_ref,*seq_num,*num_msgs);
+    return concatSMS;
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_delete_PUSH_msg
+
+ $Description:	Delets the push msg file from the FFS
+ //xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:		
+
+ $Arguments:	Index: index of the messgae to be deleted
+ 
+*******************************************************************************/
+void AUI_delete_PUSH_msg(U8 index)
+{
+    char filename[40]; 
+
+    sprintf(filename,"/mmi/concatwappush/push%d",index); 
+    ffs_remove(filename);
+
+    //Removing the corresponding entry from the table
+    memset(&PUSH_Table[index],0,sizeof(AUI_PUSH_REPOSITORY_TABLE));
+    AUI_store_PUSH_table();
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_cleanup_PUSH_repository
+
+ $Description:	 Deletes the old push msg from the FFS
+ //xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:		
+
+ $Arguments:	msg_ref: Msg ref of the rcvd msgs
+ 
+*******************************************************************************/
+void AUI_cleanup_PUSH_repository(U16 msg_ref)
+{
+    U8 index;
+    T_MFW_DATE *currDate;
+    BOOL deletePUSHMsg;
+   
+    currDate = mfw_td_get_date();
+    
+    //Traverse throught the PUSH table and delete old push msg parts
+    for(index = 0; index < MAX_PUSH_MSG_STORAGE ; index++)
+    {
+        deletePUSHMsg = FALSE;
+        if((MSG_FFS == (int)PUSH_Table[index].msg_saved) &&( PUSH_Table[index].msg_ref != msg_ref))
+        {
+            //Need to take only the last two digits for the year
+            if ( (currDate->year%100) > (USHORT)PUSH_Table[index].year)
+            {
+                //very old one delete it
+                deletePUSHMsg = TRUE;
+            }
+             //Need to take only the last two digits for the year
+            else  if ((currDate->year%100) == (USHORT)PUSH_Table[index].year)
+            {
+                //msg of same year check for the month
+                if ((USHORT)currDate->month >(USHORT) PUSH_Table[index].month)                       
+                {
+                   //older than one month delete it
+                    deletePUSHMsg = TRUE;
+                }
+                else  if ((USHORT)currDate->month == (USHORT) PUSH_Table[index].month)
+                {
+                    //older than MAX_DURATION, delete it
+                    if ((USHORT)currDate->day - (USHORT)PUSH_Table[index].day>MAX_DURATION)
+                        deletePUSHMsg = TRUE;                                
+                }
+            }
+        }            
+        if(TRUE == deletePUSHMsg)
+        {
+           AUI_delete_PUSH_msg(index);
+        }
+    }
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_check_repository
+
+ $Description:	Checks the repository for the complete PUSH msg
+ //xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:		
+
+ $Arguments:	msg_ref: Msg ref of the rcvd msg
+                     num_msgs: total num of parts for the concat msgs
+ 
+*******************************************************************************/
+//xrashmic 11 Jan, 2005 MMI-SPR-OMAPS00063638
+//Added the seq number in the parameter list of this function to check for duplicate push messages
+PUSHMSG_SEARCH_RESULT AUI_check_repository(U16 msg_ref,U8 num_msgs,U8 seq_num)
+{
+    U8 index,parts = 1;
+    for( index = 0; index < MAX_PUSH_MSG_STORAGE ; index++ )
+    {
+        if((MSG_FFS == (int)PUSH_Table[index].msg_saved ) &&( PUSH_Table[index].msg_ref == msg_ref) )
+        {
+		PUSH_Sorted_Parts[PUSH_Table[index].seq_num-1].storage = (U8)MSG_FFS;
+		//Copy the FFS file index 
+		PUSH_Sorted_Parts[PUSH_Table[index].seq_num-1].index = index;
+		//xrashmic 11 Jan, 2005 MMI-SPR-OMAPS00063638
+		//If the same seq number is already present in the repository, then this is a 
+		//duplicate push message and needs to be discarded.
+		if((PUSH_Table[index].seq_num ==seq_num))
+		{
+			return DUPLICATE;
+		}
+		else
+			parts++;
+        }            
+        //All parts found
+        if(parts == num_msgs)
+            return FOUND;
+    }
+    return NOT_FOUND;    
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_store_PUSH_msg
+
+ $Description:	Stores the new PUSH msg into FFS
+ //xrashmic 9 May, 2005 MMI-SPR-30159
+ 
+ $Returns:		
+
+ $Arguments:	message: Structure containing the udh and other msg details
+                     msg_ref: Msg ref of the rcvd msg
+                     num_msgs: total num of parts for the concat msgs
+                     seq_num: Seq number of the rcvd msg
+ 
+*******************************************************************************/
+void AUI_store_PUSH_msg(T_MFW_SMS_MT *message, U16 msg_ref,U8 num_msgs,U8 seq_num)
+{
+    int index=0;
+    char filename[40];
+    T_FFS_OPEN_FLAGS Ffsflags;
+    fd_t FfsFd;
+       
+    //Locate a free space
+    for(index = 0 ; index < MAX_PUSH_MSG_STORAGE; index ++)
+    {
+        if(MSG_NONE == (int)PUSH_Table[index].msg_saved)
+        {
+            //Free space found 
+            break;
+        }
+    }
+    //If space available in the reposiroty store it.
+    if( index < MAX_PUSH_MSG_STORAGE)
+    {
+        //Store the new msg part details into the table
+        PUSH_Table[index].msg_saved = (U8)MSG_FFS;
+        PUSH_Table[index].msg_ref = msg_ref;
+        PUSH_Table[index].num_msgs = num_msgs;
+        PUSH_Table[index].seq_num = seq_num;
+        PUSH_Table[index].year = message->sctp.year[0]*10+message->sctp.year[1];
+        PUSH_Table[index].month = message->sctp.month[0]*10+message->sctp.month[1];
+        PUSH_Table[index].day = message->sctp.day[0]*10+message->sctp.day[1];
+        AUI_store_PUSH_table();
+
+        //Save the msg part into a new file
+        sprintf(filename,"/mmi/concatwappush/push%d",index); 
+        Ffsflags = FFS_O_WRONLY|FFS_O_CREATE;
+        FfsFd = ffs_open (filename, Ffsflags);
+        if(FfsFd > 0)
+        {
+            ffs_write(FfsFd,(void*)message,sizeof(T_MFW_SMS_MT));
+            ffs_close(FfsFd);
+        }
+        else
+            TRACE_EVENT("File open failed");
+    }
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_mfw_cb
+
+ $Description:	MFW callbacks
+ 				SPR#2086 - SH - Added
+ 
+ $Returns:		
+
+ $Arguments:	event - The event received
+ 
+*******************************************************************************/
+static int AUI_wap_mfw_cb(MfwEvt event, MfwHnd hnd)
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	T_MFW_SMS_MT *Message;
+	BOOL concatSMS = FALSE;
+	//xrashmic 11 Jan, 2005 MMI-SPR-OMAPS00063638
+	PUSHMSG_SEARCH_RESULT completeMsg = NOT_FOUND;
+       T_FFS_RET ffsResult;
+       U16 msg_ref;
+       U8 num_msgs, seq_num;
+       T_FFS_OPEN_FLAGS Ffsflags;
+       char filename[40];
+
+	
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_mfw_cb()");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+	
+	switch(event)
+	{
+	    case E_SMS_WAP_MT_RECEIVED:
+           {    
+                Message = (T_MFW_SMS_MT *) hnd;
+                concatSMS = AUI_check_concat_msg(Message->udh,Message->udh_len, &msg_ref, &num_msgs, &seq_num); 
+                if(concatSMS)
+                {  
+                    T_FFS_DIR  dir;
+                    ffsResult = ffs_opendir("/mmi/concatwappush",&dir);                    
+                    if(EFFS_NOTFOUND == ffsResult)
+                        //Directory does not exsists, create it and initialize the table and write it to FFS
+                        AUI_ffs_PUSH_init();
+                    else
+                        //Read the table from ffs.
+                        AUI_read_PUSH_table();
+
+                    //Delete the old PUSH messages in FFS and update repository table
+                    AUI_cleanup_PUSH_repository(msg_ref);
+
+                    memset(PUSH_Sorted_Parts,0,sizeof(PUSH_Sorted_Parts));                    
+                    //update the sorted Array with the new msg index
+                    PUSH_Sorted_Parts[seq_num-1].storage = (U8)MSG_NEW;
+
+                    //check for the complete message in repository and the new one. 
+                    //If present sort and update the index in the PUSH_Sorted_Parts.
+                    completeMsg=AUI_check_repository( msg_ref,num_msgs,seq_num);
+                    
+                    if(FOUND == completeMsg)
+                    {
+                        T_MFW_SMS_MT PUSH_Message;
+                        U8 part = 0;
+                        TRACE_EVENT("Complete Push msg found");
+                        for( part = 0; part < num_msgs ; part++ )                    
+                        {
+                            //retrieve the complete message one by one in the correct order and send to wap client
+                            switch( PUSH_Sorted_Parts[part].storage)                                
+                            {
+                                case MSG_NEW:
+                                    //copy new msg from hnd into the comon buffer
+                                    memcpy(&PUSH_Message,Message,sizeof(T_MFW_SMS_MT));
+                                    break;
+                                case MSG_FFS:
+                                    {
+                                        //copy the stored msg from the ffs into the common buffer
+                                        fd_t FfsFd;
+                                        sprintf(filename,"/mmi/concatwappush/push%d",PUSH_Sorted_Parts[part].index); 
+                                        Ffsflags = FFS_O_RDWR;
+                                        FfsFd = ffs_open (filename, Ffsflags);
+                                        ffs_read(FfsFd,(void*)&PUSH_Message,sizeof(T_MFW_SMS_MT)); 
+                                        ffs_close(FfsFd);
+                                        AUI_delete_PUSH_msg(PUSH_Sorted_Parts[part].index);                                    
+                                        break;
+                                    }
+                            }
+                            //Send the msg part in the common buffer to the wap client
+                            ATB_wap_push_SMS_received(
+                                    (char *)PUSH_Message.sc_addr,
+                                    (UBYTE)MFW_TON_INTERNATIONAL,
+                                    (char *)PUSH_Message.orig_addr.number,
+                                    (UBYTE)PUSH_Message.orig_addr.ton,
+                                    (char *)PUSH_Message.udh,
+                                    (ULONG)PUSH_Message.udh_len,
+                                    (char *)PUSH_Message.sms_msg,
+                                    (ULONG)PUSH_Message.msg_len);
+                        
+                        }
+                    }
+			//xrashmic 11 Jan, 2005 MMI-SPR-OMAPS00063638
+			//Store the new part into the ffs
+                    else if(completeMsg == NOT_FOUND)
+                    {
+                        TRACE_EVENT("Storing the Push msg part to FFS");
+                        //store this in push repository and update repository table
+                        AUI_store_PUSH_msg(Message, msg_ref, num_msgs, seq_num);
+                    }
+			else
+			{
+				//xrashmic 11 Jan, 2005 MMI-SPR-OMAPS00063638
+				//Duplicate part received , ignore/discard it.
+				TRACE_EVENT("Duplicate part received , ignore/discard it");
+			}
+                }
+                else
+                {
+                    //Not a concat, so send it directly
+			ATB_wap_push_SMS_received(
+				(char *)Message->sc_addr,
+				(UBYTE)MFW_TON_INTERNATIONAL,
+				(char *)Message->orig_addr.number,
+				(UBYTE)Message->orig_addr.ton,
+				(char *)Message->udh,
+				(ULONG)Message->udh_len,
+				(char *)Message->sms_msg,
+				(ULONG)Message->msg_len);
+                 }
+		break;
+	    }
+	}
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_show
+
+ $Description:	Push SI viewing screen
+ 				SPR#2086 - SH - Added
+ 
+ $Returns:		void
+
+ $Arguments:	Text		- The text to be displayed
+ 				text_length	- The length of the text to be displayed in Unicode chars
+ 				identifier	- The ID of the SI
+ 				Url			- The URL of the service
+ 				url_length	- The length of the URL in characters
+ 
+*******************************************************************************/
+#if 0
+void AUI_wap_push_show(USHORT *Text, USHORT text_length, SHORT identifier, char *Url, USHORT url_length)
+{
+	T_WAP_DATA 		*data	= AUI_wap_data();
+	T_EDITOR_DATA editor_data;
+
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_show");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		return;
+	}
+
+	strncpy(data->Buffer, Url, url_length);	/* Store URL here for now */
+	data->Buffer[url_length] = 0;
+
+	data->PushData->service_indication = identifier;
+
+	AUI_wap_string_alloc(&data->Message, TEXT_MAX_LEN);
+
+	if (text_length>=TEXT_MAX_LEN)
+	{
+		text_length = TEXT_MAX_LEN-1;
+	}
+	
+	data->Message.text[0] = 0x7F80;
+	ATB_uc_text_copy(&data->Message.text[1], Text, text_length);
+	ATB_uc_text_convert(&data->Message.text[1], text_length);
+	
+	AUI_standard_editor(&editor_data, (char *)data->Message.text, text_length+1, READ_ONLY_MODE, (T_EDIT_CB)AUI_wap_push_show_cb); // Setup standard editor
+	
+	editor_data.destroyEditor = TRUE;
+	editor_data.TextId = TxtMessage;									// Prompt to display above editor	
+	editor_data.LeftSoftKey = TxtGoTo;
+	editor_data.RightSoftKey = TxtExit;
+	data->edit_win = editor_start(data->parent_win,&editor_data); /* SPR#2086 */
+
+	return;
+}
+#endif
+
+void AUI_wap_push_show(USHORT *Text, USHORT text_length, SHORT identifier, char *Url, USHORT url_length)
+{
+	T_WAP_DATA 		*data	= AUI_wap_data();
+#ifdef NEW_EDITOR
+        T_AUI_EDITOR_DATA   editor_data;
+#else
+        T_EDITOR_DATA   editor_data;
+#endif /* NEW_EDITOR */
+
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_show");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		return;
+	}
+
+	strncpy(data->Buffer, Url, url_length);	/* Store URL here for now */
+	data->Buffer[url_length] = 0;
+
+	data->PushData->service_indication = identifier;
+
+	AUI_wap_string_alloc(&data->Message, TEXT_MAX_LEN);
+
+	if (text_length>=TEXT_MAX_LEN)
+	{
+		text_length = TEXT_MAX_LEN-1;
+	}
+	
+	data->Message.text[0] = 0x7F80;
+	ATB_uc_text_copy(&data->Message.text[1], Text, text_length);
+	ATB_uc_text_convert(&data->Message.text[1], text_length);
+    #if 0
+	AUI_standard_editor(&editor_data, (char *)data->Message.text, text_length+1, READ_ONLY_MODE, (T_EDIT_CB)AUI_wap_push_show_cb); // Setup standard editor
+	
+	editor_data.destroyEditor = TRUE;
+	editor_data.TextId = TxtMessage;									// Prompt to display above editor	
+	editor_data.LeftSoftKey = TxtGoTo;
+	editor_data.RightSoftKey = TxtExit;
+	data->edit_win = editor_start(data->parent_win,&editor_data); /* SPR#2086 */
+    #endif
+    
+#ifdef NEW_EDITOR
+        // xreddymn Jan-10-2005 MMI-SPR-27618: Modified editor to read-only
+        AUI_standard_editor(&editor_data, WAP_EDIT_DOWNLOAD, ED_MODE_ALPHA | ED_MODE_READONLY, TxtPushMessages, (T_AUI_EDIT_CB)AUI_wap_push_show_cb);
+        editor_data.RightSoftKey = TxtSoftBack;
+
+       // if (unicode)
+       /* xreddymn Jan-10-2005 MMI-SPR-27618:
+        * data->Buffer holding the URL in this case is ASCII. Changed condition if(TRUE) to if(FALSE)
+        */
+       if (FALSE)
+        {
+            AUI_edit_SetBuffer(&editor_data, ATB_DCS_UNICODE, (UBYTE *)data->Buffer, strlen(data->Buffer)+1);
+        }
+        else
+        {
+            AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE *)data->Buffer, strlen(data->Buffer)+1);
+        }
+        
+        //data->edit_win = AUI_edit_Start(data->win, &editor_data);
+        data->edit_win = AUI_edit_Start(data->parent_win, &editor_data);
+#else /* NEW_EDITOR */
+        AUI_standard_editor(&editor_data, (char *)data->Message.text, text_length+1, READ_ONLY_MODE, (T_EDIT_CB)AUI_wap_push_show_cb); // Setup standard editor
+        
+        editor_data.destroyEditor = TRUE;
+        editor_data.TextId = TxtMessage;                                    // Prompt to display above editor   
+        editor_data.LeftSoftKey = TxtGoTo;
+        editor_data.RightSoftKey = TxtExit;
+        data->edit_win = editor_start(data->parent_win,&editor_data); /* SPR#2086 */
+#endif /* NEW_EDITOR */
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_show_cb
+
+ $Description:	Callback function for push viewing screen.
+ 				SPR#2086 - SH - Added
+ 
+ $Returns:		void
+
+ $Arguments:	win			- the WAP data window
+ 				identifier	- identifier
+ 				reason		- reason for callback
+ 
+*******************************************************************************/
+
+static void AUI_wap_push_show_cb(T_MFW_HND win, USHORT identifier, USHORT reason)
+{
+	T_WAP_DATA 		*data	= AUI_wap_data();
+	T_WAP_VIEW		*View;
+	
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_show_cb");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	/* Editor is destroyed automatically */
+	
+	// xreddymn Jan-10-2005 MMI-SPR-27618: Modified to add "back" function to this screen 
+	// data->edit_win = NULL;
+
+	/* Free message text */
+
+	AUI_wap_string_free(&data->Message);
+	
+	switch (reason)
+	{
+		case INFO_KCD_LEFT:
+
+			// xreddymn Jan-10-2005 MMI-SPR-27618: Leave editor screen when HangUp or Right Softkey is pressed
+			AUI_destroy(EDIT_WIN);
+		
+			/* Check if browsing view exists.  If it doesn't, start WAP for
+			 * browsing and load SI on callback */
+			 
+			View = ATB_wap_get_view(WAP_OBJECT_ID);
+
+			if (!View)
+			{
+				AUI_wap_start(WAP_BROWSER, AUI_wap_push_start_load_SI);
+			}
+			else
+			{
+				AUI_wap_push_start_load_SI(TRUE);
+			}
+			break;
+
+		// xreddymn Jan-10-2005 MMI-SPR-27618: Leave editor screen when HangUp or Right Softkey is pressed
+		case INFO_KCD_HUP:
+		case INFO_KCD_RIGHT:
+			AUI_destroy(EDIT_WIN);
+			break;
+	}
+	
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_load_SL
+
+ $Description:  Loads SL message by launching WAP
+ 
+ $Returns:      void
+
+ $Arguments:    identifier - an integer used to identify the SL message
+                Url - URL to which the WAP browser must be launched into
+                url_length - length of the URL in characters
+
+                xreddymn Mar-16-2005 MMI-SPR-29767
+
+*******************************************************************************/
+
+void AUI_wap_push_load_SL(SHORT identifier, char *Url, USHORT url_length)
+{
+	T_WAP_VIEW		*View;
+	T_WAP_DATA 		*data = AUI_wap_data();
+
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_load_SL");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		return;
+	}
+
+	// The URL is stored in data->Buffer and accessed by 
+	// AUI_wap_push_start_load_SI
+	strncpy(data->Buffer, Url, url_length);
+	data->Buffer[url_length] = 0;
+
+	data->PushData->service_indication = identifier;
+
+	// Check if browsing view exists.  If it doesn't, start WAP for
+	// browsing and load SL on callback.
+
+	View = ATB_wap_get_view(WAP_OBJECT_ID);
+
+	if (!View)
+	{
+		AUI_wap_start(WAP_BROWSER, AUI_wap_push_start_load_SI);
+	}
+	else
+	{
+		AUI_wap_push_start_load_SI(TRUE);
+	}
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_start_load_SI
+
+ $Description:	Callback function for starting push and loading an SI
+ 				SPR#2086 - SH - Added
+ 
+ $Returns:		void
+
+ $Arguments:	result - TRUE if WAP started successfully.
+ 
+*******************************************************************************/
+
+static void AUI_wap_push_start_load_SI(UBYTE result)
+{
+	T_WAP_DATA 		*data	= AUI_wap_data();
+	
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_start_load_SI");
+#endif
+
+	if (!data || !result)
+	{
+		return;
+	}
+
+	/* Create menu */
+
+	if (!data->menu_win)
+	{
+		AUI_menu_create(TRUE);
+	}
+	
+	/* Configure for connection */
+	
+	AUI_prepare_to_connect();
+
+	/* Copy URL into View storage */
+
+	strcpy(data->View->URL, data->Buffer);
+
+	/* Load Service Indication */
+	
+	ATB_wap_push_load_SI(data->View, (SHORT)data->PushData->service_indication);
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_list
+
+ $Description:	Lists all push messages
+ 
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:	menu 	- pointer to current menu
+ 				item 	- pointer to current menu item
+ 
+*******************************************************************************/
+
+int AUI_wap_push_list(MfwMnu* menu, MfwMnuItem* item)
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	USHORT entryIndex;
+
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_list");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		TRACE_EVENT("***ERROR - Push not initialised ***");
+		return;
+	}
+	
+	/* Create the push list menu */
+
+	if (data->PushData->List==NULL)
+	{
+		// xreddymn Jan-10-2005 MMI-SPR-27618: Use WAP_PUSH_TITLE_MAX_LEN instead of CARD_TITLE_MAX_LEN
+		data->PushData->List = ATB_wap_entry_list_create(WAP_PUSH_LIST, WAP_PUSH_MAX_MESSAGES, WAP_PUSH_TITLE_MAX_LEN, FALSE);
+		for (entryIndex=0; entryIndex<WAP_PUSH_MAX_MESSAGES; entryIndex++)
+		{
+			data->PushData->List->Entry[entryIndex] = (char *)AUI_wap_memory_alloc(data->PushData->List->entry_size);
+		}
+	}
+
+	data->PushData->list_created = FALSE;
+	memset(data->PushData->list_ids, 0, WAP_PUSH_MAX_MESSAGES);
+
+	AUI_please_wait(data->parent_win);
+		
+	ATB_wap_push_get_SI_info(-1, WAP_PUSH_SHOW_ALL);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_list_display
+
+ $Description:	The list of pushed messages is ready; display it
+ 
+ $Returns:		None
+
+ $Arguments:	None
+ 
+*******************************************************************************/
+
+void AUI_wap_push_list_display()
+{
+	T_WAP_DATA *data = AUI_wap_data();
+
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_list_display");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+	
+	AUI_entry_list(data->PushData->List, (ListCbFunc) AUI_wap_push_list_cb, 0);
+	if (!data->list_win || data->PushData->List->no_of_entries==0)
+	{
+		AUI_wap_push_list_destroy();
+	}
+	else
+	{
+		data->PushData->list_created = TRUE;
+	}
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_list_destroy
+
+ $Description:	Destroy the push message list
+ 
+ $Returns:		None
+
+ $Arguments:	None
+ 
+*******************************************************************************/
+
+void AUI_wap_push_list_destroy()
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	USHORT entryIndex;
+
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_list_destroy");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		return;
+	}
+	
+	if (!data->PushData->List)
+	{
+		return;
+	}
+
+	/* Create the push list menu */
+
+	for (entryIndex=0; entryIndex<WAP_PUSH_MAX_MESSAGES; entryIndex++)
+	{
+		AUI_wap_memory_free((void *)data->PushData->List->Entry[entryIndex], data->PushData->List->entry_size);
+	}
+	ATB_wap_entry_list_destroy(data->PushData->List);
+	
+	data->PushData->List = NULL;
+	data->PushData->list_created = FALSE;
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_list_cb
+
+ $Description:	Callback for push message list
+ 
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:	win - The current window
+ 				ListMenuData - The current list data
+ 
+*******************************************************************************/
+
+static void AUI_wap_push_list_cb(T_MFW_HND win, ListMenuData *EntryListData)
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	
+	TRACE_FUNCTION("AUI_wap_push_list_cb()");
+
+	if (!data)
+	{
+		return;
+	}
+
+	data->PushData->service_indication = data->PushData->list_ids[EntryListData->ListPosition];
+
+	switch(EntryListData->Reason)
+	{
+		case LISTS_REASON_SEND:
+			ATB_wap_push_get_SI_info(data->PushData->service_indication, 0);
+			break;
+
+		case LISTS_REASON_SELECT:
+			/*  Destroy any previous options menu existing */
+			if (data->options_win)
+			{
+				AUI_destroy(OPTIONS_WIN);
+			}
+            //#ifdef MMI_WAP_PUSH_ENABLED //added by ellen
+			//data->options_win = bookMenuStart(data->parent_win, WAPPushListOptionsAttributes(), 0);
+			data->options_win = bookMenuStart(data->parent_win, WAPPushListOptionsAttributes(), 0);
+            //#endif
+			SEND_EVENT(data->options_win, ADD_CALLBACK, NULL, (void *)AUI_options_cb);
+			break;
+
+		case LISTS_REASON_BACK:
+			AUI_wap_push_list_destroy();
+			AUI_destroy(LIST_WIN);
+			break;
+	}
+
+	return;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_info
+
+ $Description:	Response from WAP Browser, returning information about a push message
+ 
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:	menu 	- pointer to current menu
+ 				item 	- pointer to current menu item
+ 
+*******************************************************************************/
+
+void AUI_wap_push_info(
+	USHORT *Text,
+	USHORT text_length,
+	SHORT id,
+	char *Url,
+	USHORT url_length,
+	UBYTE status,
+	ULONG created,
+	BOOL expired,
+	UBYTE priority)
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	char *newURL;
+
+	TRACE_FUNCTION("AUI_wap_push_info()");
+	
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		return;
+	}
+	
+	if (!data->PushData->List)
+	{
+		return;
+	}
+
+	/* If list is created and we're reading a single SI */
+
+	if (data->PushData->list_created)
+	{
+		AUI_please_wait_destroy();
+		AUI_wap_push_show(Text, text_length, id, Url, url_length);
+		return;
+	}
+	
+	/* If all of list has been sent, create the menu*/
+	
+	if (id==-1)
+	{
+		AUI_please_wait_destroy();
+		AUI_wap_push_list_display();
+	}
+
+	else
+	/* Otherwise, add the menu item to the list */
+	{
+		data->PushData->list_ids[data->PushData->List->no_of_entries] = id;
+		
+		newURL = (char *)AUI_wap_memory_alloc(url_length+1);
+		strncpy(newURL, Url, url_length);
+		newURL[url_length] = 0;
+		
+		if (url_length>data->PushData->List->entry_size)
+		{
+			newURL[data->PushData->List->entry_size] = 0;
+			newURL[data->PushData->List->entry_size-1] = '.';
+			newURL[data->PushData->List->entry_size-2] = '.';
+		}
+		
+		ATB_wap_entry_add(data->PushData->List, newURL);
+
+		AUI_wap_memory_free((void *)newURL, url_length+1);
+	}
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_message_read
+
+ $Description:	Read a push message
+ 				SPR#2086 - Added
+ 
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:	menu 	- pointer to current menu
+ 				item 	- pointer to current menu item
+ 
+*******************************************************************************/
+
+int AUI_wap_push_message_read(MfwMnu* menu, MfwMnuItem* item)
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	
+	TRACE_FUNCTION("AUI_wap_push_message_read()");
+	
+	if (!data)
+	{
+		return;
+	}
+
+	if (!data->PushData)
+	{
+		return;
+	}
+	
+	ATB_wap_push_get_SI_info(data->PushData->service_indication, 0);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_message_delete
+
+ $Description:	Delete a push message
+ 				SPR#2086 - Added
+ 
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:	menu 	- pointer to current menu
+ 				item 	- pointer to current menu item
+ 
+*******************************************************************************/
+
+int AUI_wap_push_message_delete(MfwMnu* menu, MfwMnuItem* item)
+{
+	T_WAP_DATA *data = AUI_wap_data();
+	
+	TRACE_FUNCTION("AUI_wap_push_message_delete()");
+	
+	if (!data)
+	{
+		return;
+	}
+
+	/* Delete the push message */	
+	ATB_wap_push_delete_SI(data->PushData->service_indication, 0);
+	/* Destroy the old list */
+	AUI_destroy(LIST_WIN);
+	/* Save the change */
+	ATB_wap_push_save_to_flash();
+	/* Recreate the list */
+	AUI_list_redraw(WAP_PUSH_LIST, TxtDeleted);
+
+	return MFW_EVENT_CONSUMED;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_showmessages
+
+ $Description:	Setting specifies whether or not to display received push images
+ 				SPR#2086 - Added
+ 
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:	menu 	- pointer to current menu
+ 				item 	- pointer to current menu item
+ 
+*******************************************************************************/
+
+int AUI_wap_push_showmessages(MfwMnu* menu, MfwMnuItem* item)
+{
+	T_WAP_DATA	*data = AUI_wap_data();
+	UBYTE PushMessages;
+	T_MFW_HND setting_win;
+	
+#ifdef TRACE_AUIWAP	
+	TRACE_FUNCTION("AUI_wap_push_showmessages");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	setting_win = bookMenuStart(data->parent_win, WAPPushMessagesAttributes(), 0);
+	PushMessages = ATB_wap_profile_setting(WAP_STATUS_PUSHMESSAGES);	// 1 or 0 depending on flag
+	SEND_EVENT(setting_win, DEFAULT_OPTION, NULL, &PushMessages); // Add our own callback
+
+	return 1;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	AUI_wap_push_showmessages_set
+
+ $Description:	Set showing of push messages on or off
+ 
+ $Returns:		MFW_EVENT_CONSUMED
+
+ $Arguments:	menu		- pointer to the current menu
+ 				item		- pointer to the current menu item
+ 
+*******************************************************************************/
+
+int AUI_wap_push_showmessages_set(MfwMnu* menu, MfwMnuItem* item)
+{
+	T_WAP_DATA 		*data		= AUI_wap_data();
+	
+#ifdef TRACE_AUIWAP
+	TRACE_FUNCTION("AUI_wap_push_showmessages_set");
+#endif
+
+	if (!data)
+	{
+		return;
+	}
+
+	ATB_wap_profile_setting_change(WAP_STATUS_PUSHMESSAGES, menu->lCursor[menu->level]); /* SPR#2086 */
+	
+	ATB_wap_profile_save(data->View);			// Save change to flash
+	AUI_info_dialog(TxtChanged, NULL);  /* SPR#2086 */
+
+	return 1;
+}
+