diff g23m/condat/ms/src/bmi/mmiSmsBroadcast.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/mmiSmsBroadcast.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,4351 @@
+
+/*******************************************************************************
+
+					CONDAT (UK)
+
+********************************************************************************                                                                              
+
+ This software product is the property of Condat (UK) Ltd and may not be
+ disclosed to any third party without the express permission of the owner.                                 
+                                                                              
+********************************************************************************
+
+ $Project name:	Basic MMI                                                      
+ $Project code:	BMI (6349)                                                           
+ $Module:		SMS Cell Broadcast
+ $File:		    MmiSmsBroadcast.c
+ $Revision:		1.0                                                       
+                                                                              
+ $Author:		Condat(UK)                                                         
+ $Date:		    22/02/01                                                      
+                                                                               
+********************************************************************************
+                                                                              
+ Description:
+
+  Implementation of MMI SMS Cell Broadcast dynamic menu handling
+
+********************************************************************************
+
+ $History: MmiSmsBroadcast.c
+
+	Dec 22, 2004 REF: CRR MFW-SPR-27847 xnkulkar
+       Description: MFW memory size variable changed from U16 -> U32
+       Solution: In function 'smscb_setCBsettings' variable 'd' is checked for limit and
+                     duplication is removed. This was the reason for crash.
+ 
+	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	Bug:Clenup of sprintf used for tracing
+	Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX
+
+	25/10/00			Original Condat(UK) BMI version.	
+	Issue Number : SPR#12722 on 29/03/04 by Deepa M.D
+	Apr 29, 2004    REF: CRR 11630  Deepa M.D
+	Fix:When a new entry channelId is added ,the whole list of channelIds are refreshed, 
+	and the corresponding names are displayed in the list.
+	   
+ $End
+*******************************************************************************/
+
+
+/*******************************************************************************
+                                                                              
+                                Include Files
+                                                                              
+*******************************************************************************/
+
+#define ENTITY_MFW
+
+/* includes */
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "pei.h"
+#include "custom.h"
+#include "gsm.h"
+
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+#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_mnu.h"
+#include "mfw_sat.h"
+#include "mfw_tim.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 "MmiBookController.h"
+
+#include "mmiSmsBroadcast.h"
+#include "mmiSmsIdle.h"
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+#include "ATBCommon.h"
+#include "ATBDisplay.h"
+#include "ATBEditor.h"
+#include "AUIEditor.h"
+#else
+#include "MmiEditor.h"
+#endif
+#include "MmiIdle.h"
+
+#include "cus_aci.h"
+
+#include "mmiColours.h"
+
+/* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/
+#ifndef NEPTUNE_BOARD
+/* END ADD: Sumit : Req ID: : 31-Mar-2005*/
+#include "ffs/ffs.h" /*SPR 1920*/
+/* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/
+#else
+#include "ffs.h"
+#endif
+/* END ADD: Sumit : Req ID: : 31-Mar-2005*/
+
+#ifdef DEBUG_SMS_CB
+#include "MmiHomezone.h"
+#endif
+#include "MmiSettings.h"
+
+
+
+#define MENU_TEXT_LENGTH 16 /* count of chars to be displayed in one list entry */
+
+/* SH - moved to .h file */
+
+/*MC SPR 1920,FFS CB Topic name data structure*/
+typedef struct
+{
+	uint8 name[CB_TAG_LENGTH]; 
+
+} T_SMSCB_TOPIC_TAG;
+
+/* storage for Cell Broadcast lists */
+typedef struct 
+{
+    T_SMSCB_ATT 		 cb_attributes[MAX_MIDS];     /* list of attributes of messages stored in fifo */
+	/*SPR 1920, replaced cb_buffer with an array of dynically allocated strings */
+	char*				messages[MAX_STORED_PAGES];
+	ListMenuData     	 *cb_list_attributes; 		//atttributes for the menu list
+
+    T_SMSCB_STATUS		current_status;       	       /*read status for all messages    */
+    
+	UBYTE found_mid;    //indicate the already existing cb in the fifo
+	UBYTE clear_mid;     //indicate the deleting process
+	UBYTE result_used;	//to update the used-pointer, after deleting the cb message
+	UBYTE total_number;  //this include the total number of messages in the fifo; need for Menu-list
+
+	UBYTE multipage_number;  //this include the total page of a particular multipage; need for showing msg.
+	UBYTE *multipage;        //pointer to the first page of multipage
+	UBYTE start_used;	//indicate the start point of the multipage, used for the searching
+	UBYTE end_used;     //indicate the end point of the multipage, used for the searching
+
+	UBYTE used_pointer;  //start point of the free space link list
+	UBYTE free_pointer;   //start point of the data link list
+
+	
+} T_SMSCB_DATA;
+
+
+
+T_SMSCB_DATASTORE g_smscb_data; /* storage for Cell Broadcast Info lists */
+T_SMSCB_DATA smscb_data; /* storage for Cell Broadcast  Message lists */
+
+
+
+//Attributes of the list menu
+static const MfwMnuAttr sms_cb_menuAttrib =
+{
+    &smscb_M_CBArea,
+    MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu       */
+    -1,                                 /* use default font         */
+    NULL,                               /* with these items         */
+    0,                                   /* number of items     */
+    COLOUR_LIST_SMS, TxtNull, NULL, MNUATTRSPARE
+
+};
+
+
+#define OFFSET(index) (index*CB_PAGE_LENGTH)
+
+//this shows traces of some variable
+//#define DEBUG_SMS_CB 
+
+#ifdef DEBUG_SMS_CB
+	UBYTE DEBUG;
+#endif
+
+char* ffs_cb_tag_name(int channel_num, char* name);/*SPR1920, new function header*/
+//these prototypes belongs to saving cb_messages in the fifo
+UBYTE sms_cb_count_messages ( void );
+UBYTE sms_cb_count_unread_messages ( void );
+UBYTE sms_cb_delete_message (USHORT mid);
+UBYTE sms_cb_find_termination (UBYTE *used);
+UBYTE sms_cb_update_free_pointer (UBYTE temp);
+UBYTE sms_cb_search_mid (USHORT mid, SHORT sn);
+UBYTE sms_cb_store_message (T_MFW_SMS_CB *Message);
+ UBYTE sms_cb_find_endpoint (USHORT mid, UBYTE end_used);
+UBYTE sms_cb_find_startpoint (USHORT mid, UBYTE end_used);
+UBYTE sms_cb_give_position_of_msg (UBYTE used, UBYTE positon);
+UBYTE sms_cb_overwrite_old_message (T_MFW_SMS_CB *Message);
+
+
+void sms_cb_show_cb_message(UBYTE link_list_position);
+static ListMenuData * sms_cb_create_list (UBYTE number);
+/*SPR 1920, removed header for function sms_cb_select_read*/
+static void sms_cb_list_cb(T_MFW_HND win, ListMenuData * ListData);
+void   sms_cb_store_attributes (UBYTE position, T_MFW_SMS_CB *Message);
+static void sms_cb_editor_cb (T_MFW_HND win, USHORT Identifier, SHORT reason);
+
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+void sms_cb_loadEditDefault (T_AUI_EDITOR_DATA *editor_data);
+#else /* NEW_EDITOR */
+void sms_cb_loadEditDefault (T_EDITOR_DATA *editor_data);
+#endif /* NEW_EDITOR */
+
+
+/*********************************************************************
+**********************************************************************
+
+			cell broadcast declaration
+
+*********************************************************************
+**********************************************************************/
+
+typedef struct
+{
+    int index; /* index of selected item in list */
+} T_CB_index_param; 
+
+typedef struct
+{
+    int index; /* index of selected item in list */
+    char name[CB_TAG_LENGTH]; /* buffer for name to be associated with topic */
+    char number[CB_MID_LENGTH]; /* buffer for channel number of topic */
+} T_CB_EDT_MIDEDT_param;
+
+typedef struct
+{
+    int index; /* index of selected item in list */
+    char text[CB_TAG_LENGTH]; /* buffer for name to be associated with topic ??? size is dummy */
+    char number[CB_MID_LENGTH]; /* buffer for channel number of topic ??? size is dummy */
+} T_S_param; /* ??? T_S_param not to be defined here, but in "mmiSmsSend.h"! */
+
+
+/* IDs used for identification of sources of events */
+enum {
+    smscb_M_CB_ID,
+    smscb_M_CB_ACT_ID,
+    smscb_M_CB_TOP_ID,
+    smscb_M_CB_TOP_CONS_ID,
+    smscb_M_CB_TOP_CONS_SEL_ID,
+    smscb_CB_ID,
+    smscb_CB_TEXTEDT_ID,
+    smscb_CB_OPT_ID,
+    smscb_CB_OPT_DEL_NOACK_ID,
+    smscb_CB_EDT_TEXTEDT_ID,
+    smscb_CB_EDT_MIDEDT_ID
+} smscb_ID;
+
+
+
+void msgsExtractPhoneNumber(UBYTE *InputString, UBYTE *Buffer);
+/* forward declaration of local start routines */
+/*SPR 1920 removed  header for smscb_M_CB_ACT_start()*/
+static T_MFW_HND smscb_M_CB_TOP_start(T_MFW_HND parent_window, void *dummy);
+static T_MFW_HND smscb_M_CB_TOP_CONS_start(T_MFW_HND parent_window, void *dummy);
+static T_MFW_HND smscb_M_CB_TOP_CONS_SEL_start(T_MFW_HND parent_window, T_CB_index_param * parameter);
+static T_MFW_HND smscb_CB_start(T_MFW_HND parent_window, void *dummy);
+static T_MFW_HND smscb_CB_TEXTEDT_start(T_MFW_HND parent_window, T_CB_index_param * parameter);
+static T_MFW_HND smscb_CB_OPT_start(T_MFW_HND parent_window, T_CB_index_param * parameter);
+static T_MFW_HND smscb_CB_OPT_DEL_NOACK_start(T_MFW_HND parent_window, T_CB_index_param * parameter);
+static T_MFW_HND smscb_CB_EDT_TEXTEDT_start(T_MFW_HND parent_window, T_CB_index_param * parameter);
+static T_MFW_HND smscb_CB_EDT_MIDEDT_start(T_MFW_HND parent_window, T_CB_EDT_MIDEDT_param * parameter);
+
+
+void info_screen (T_MFW_HND win, USHORT TextId, USHORT TextId2, T_VOID_FUNC  Callback)
+    /* present info <TextId> for 3 seconds in a simple infoscreen */
+{
+
+    T_DISPLAY_DATA display_info;
+
+    TRACE_FUNCTION ("info_screen()");
+
+	dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, TextId,  TextId2 , COLOUR_STATUS);
+	dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)Callback, THREE_SECS, 0 );
+    display_info.Identifier   = 0;
+
+    info_dialog (win, &display_info); 
+}
+
+/*********************************************************************
+**********************************************************************
+
+			cell broadcast routines DECLARATION
+
+*********************************************************************
+**********************************************************************/
+static T_MFW smscb_delete_topic(UBYTE MidOffset);
+/*SPR 1920, removed function temp_smscb_M_CB_ExeRead()*/
+/* SH moved prototype to header file */
+
+static void listCreate(MfwHnd Parent, MfwMnuAttr *a , MfwEvt e, ListCbFunc cbFunc)
+{
+
+    ListMenuData list_menu_data;
+
+    /* initialization of the dialog data */
+    list_menu_data.Attr           = a;
+    list_menu_data.List           = a->items;
+    list_menu_data.ListLength     = a->nItems;/* Number of entries in list menu.    */
+    list_menu_data.ListPosition   = 1;/* True cursor position in list menu. */
+    list_menu_data.CursorPosition = 1;/* Cursor position in list snapshot.  */
+    list_menu_data.SnapshotSize   = 4;/* Number of list entries to view.    */
+    list_menu_data.Font           = 0;
+    list_menu_data.LeftSoftKey    = TxtSoftSelect;
+    list_menu_data.RightSoftKey   = TxtSoftBack;
+    /* SPR1428 - SH - Accept menu select key */
+    list_menu_data.KeyEvents      = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN | KEY_MNUSELECT;
+    list_menu_data.Reason         = 0;
+    list_menu_data.Strings        = FALSE;
+	list_menu_data.autoDestroy    = TRUE;
+
+    listDisplayListMenu(Parent, &list_menu_data, cbFunc,0);
+
+}
+// end c020 rsa
+/*SPR1920, removed declarations and functions for menu-handling*/
+
+
+
+
+/*********************************************************************
+**********************************************************************
+
+		M_CB_ACT	     DYNAMIC MENU WINDOW. CONTENTS BEHAVIOUR
+
+*********************************************************************
+**********************************************************************/
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_ACT_ExeNo
+
+ $Description:	
+
+ $Returns:		none.
+
+ $Arguments:	
+ 
+*******************************************************************************/
+int smscb_M_CB_ACT_ExeNo(MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND       win  = mfwParent((MfwHdr *)mfw_header());
+	/*SPR 1920, removed unneccessary variables*/
+	/*GW SPR#2470 Call 'smscb_setCBsettings' so that sAT_PlusCSCB is also called.*/
+
+	settingsSetStatus(SettingsCBDisable, SET_SETTING );/*Remember settings in FFS*/
+	//	sms_set_mt_ind(MT_CB_NO_IDX);
+	smscb_setCBsettings(SMSCB_SWITCH_OFF);
+
+    info_screen(win, TxtDeActivated,TxtNull, NULL); 
+
+
+    statusCBCH(FALSE);
+
+	/* SPR 1920, removed window destruction code*/ 
+    return MFW_EVENT_CONSUMED;
+}
+
+#ifdef DEBUG_SMS_CB
+	T_MFW_HND timer;
+
+ int test_tim_cb(MfwEvt event, MfwTim *timer_info)
+ {	
+	int i;
+ 
+	test_function_to_send_cb ();
+	tim_delete(timer);
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	for (i=0; i<MAX_STORED_PAGES ; i++)	
+	{
+			TRACE_EVENT_P2("free_index: %d, i:%d", smscb_data.cb_attributes[i].next_link,i); 
+	}
+	/***************************Go-lite Optimization changes end***********************/
+	TRACE_EVENT_P1("count of messages:%d", sms_cb_count_messages ()); 
+
+	for (i=0; i<MAX_STORED_PAGES ; i++)	
+	{
+	
+		TRACE_EVENT_P2("start_page: %d, i:%d", smscb_data.cb_attributes[i].start_page,i); 
+	}
+
+	
+	TRACE_EVENT_P1("smscb_data.used_pointer%d", smscb_data.used_pointer); 
+	TRACE_EVENT_P1("smscb_data.free_pointer%d", smscb_data.free_pointer); 
+
+	return MFW_EVENT_CONSUMED;
+ }
+
+#endif 
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_ACT_ExeYes
+
+ $Description:	
+
+ $Returns:		none.
+
+ $Arguments:	
+ 
+*******************************************************************************/
+int smscb_M_CB_ACT_ExeYes(MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND       win  = mfwParent((MfwHdr *)mfw_header());
+  	/*SPR 1920, removed unneccessary variables*/
+	/*GW SPR#2470 Call 'smscb_setCBsettings' so that sAT_PlusCSCB is also called.*/
+  	
+	settingsSetStatus(SettingsCBDisable, CLEAR_SETTING );/*Remember settings in FFS*/
+	//sms_set_mt_ind(MT_CB_MSG);
+	smscb_setCBsettings(SMSCB_SWITCH_ON);
+
+    info_screen(win, TxtActivated,TxtNull, NULL); 
+
+
+/*SPR1959, removed declarations and functions for menu-handling*/
+#ifdef DEBUG_SMS_CB
+    timer = tim_create(NULL, 5000, (MfwCb)test_tim_cb);
+    tim_start(timer);
+    
+
+
+
+
+#endif //DEBUG_SMS_CB
+    return MFW_EVENT_CONSUMED;
+}
+
+
+
+
+
+/*********************************************************************
+**********************************************************************
+
+		M_CB_TOP	     DYNAMIC MENU WINDOW. CONTENTS BEHAVIOUR
+
+*********************************************************************
+**********************************************************************/
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_ExeConsult
+
+ $Description:	
+
+ $Returns:		none.
+
+ $Arguments:	
+ 
+*******************************************************************************/
+int smscb_M_CB_TOP_ExeConsult(MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND       win      = mfwParent((MfwHdr *)mfw_header());
+   	/*SPR 1920, removed unneccessary variables*/
+
+
+#ifdef DEBUG_SMS_CB
+    UBYTE ii;
+   	for (ii = 0; ii < MAX_MIDS; ii++)
+	{
+		/***************************Go-lite Optimization changes Start***********************/
+		//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+		TRACE_EVENT_P2 ("g_smscb_data.CBTopics.entry[0].msg_id:%d, i:%d", g_smscb_data.CBTopics.entry[ii].msg_id,ii);
+		/***************************Go-lite Optimization changes end***********************/
+	}
+#endif
+
+
+	if (!smsidle_get_ready_state())
+	{
+	    info_screen(0, TxtSimNot, TxtReady, NULL); 
+	    TRACE_EVENT ("SIM is not ready !!");
+		return;
+	}		
+	
+	if (g_smscb_data.CBTopics.length EQ 0) 
+	{
+	    info_screen(0, TxtEmptyList,TxtNull, NULL); 
+
+	    TRACE_EVENT ("CellBroadcast Topic-list is empty !!");
+		return;
+	}
+
+    //	selection "Consult": menucreate M_CB_TOP_CONS
+    return (int)smscb_M_CB_TOP_CONS_start (win, NULL);
+}
+T_CB_index_param CB_index_param;/*MC SPR1920 added global variable*/
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_ExeAddNew
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+int smscb_M_CB_TOP_ExeAddNew(MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND      win      = mfwParent((MfwHdr *)mfw_header());
+ 	/*SPR 1920, removed unneccessary variables*/
+    int            index;
+
+    //	selection "Add": call sms_cb_edit_topic(List=CBTopics, Index=ADD)
+    index = g_smscb_data.CBTopics.length;/* get the index of the next free entry in list CBTopics */
+
+    if (index > MAX_MIDS)
+	{
+	    /* all entries are already used */
+	    info_screen (win, TxtFull /* ??? */,TxtNull, NULL);
+	    return MFW_EVENT_CONSUMED;
+	}
+    else
+	{
+
+
+	    CB_index_param.index = index; 
+	    return (int)smscb_CB_EDT_TEXTEDT_start(win, &CB_index_param);
+	}
+}
+
+
+/*********************************************************************
+**********************************************************************
+
+			M_CB_TOP_CONS	 DYNAMIC MENU WINDOW. DECLARATION
+
+*********************************************************************
+**********************************************************************/
+typedef struct
+{
+    /* administrative data */
+
+    T_MMI_CONTROL   mmi_control;
+    T_MFW_HND       win;
+    SHORT           id;
+    T_MFW_HND       parent;
+
+    /* associated handlers */
+
+    /* internal data */
+    T_CB_index_param CB_index_param; /* parameter for called submenus (index in list) */
+    MfwMnuItem      menuItems[MAX_MIDS]; /* List=CBTopics */
+    ListMenuData    list_menu_data;
+} T_M_CB_TOP_CONS;
+
+static T_MFW_HND smscb_M_CB_TOP_CONS_create (T_MFW_HND parent);
+static void smscb_M_CB_TOP_CONS_destroy (T_MFW_HND window);
+static void smscb_M_CB_TOP_CONS_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * dummy);
+static void smscb_M_CB_TOP_CONS_listmnu_cb (T_MFW_HND * win, ListMenuData * ListData);
+
+
+static const MfwMnuAttr smscb_M_CB_TOP_CONSAttrib =
+{
+    &smscb_M_CB_TOP_CONSArea,
+    MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu       */
+    -1,                                 /* use default font         */
+    NULL,                               /* with these items         */
+    0,                                   /* number of items     */
+	COLOUR_LIST_SMS,	TxtNull, NULL, MNUATTRSPARE
+
+};
+
+/*********************************************************************
+**********************************************************************
+
+			M_CB_TOP_CONS	DYNAMIC MENU WINDOW. IMPLEMENTATION
+
+*********************************************************************
+**********************************************************************/
+
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_CONS_start
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+T_MFW_HND smscb_M_CB_TOP_CONS_start(T_MFW_HND parent_window, void *dummy)
+{
+    T_MFW_HND win;
+
+    TRACE_FUNCTION ("smscb_M_CB_TOP_CONS_start()");
+
+    win = smscb_M_CB_TOP_CONS_create (parent_window);
+
+    if (win NEQ NULL)
+	{
+	    SEND_EVENT (win, E_INIT, smscb_M_CB_TOP_CONS_ID, NULL);
+	}
+    return win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_CONS_create
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static T_MFW_HND smscb_M_CB_TOP_CONS_create(MfwHnd parent_window)
+{
+    T_M_CB_TOP_CONS      * data = (T_M_CB_TOP_CONS *)ALLOC_MEMORY (sizeof (T_M_CB_TOP_CONS));
+    T_MFW_WIN  * win;
+
+    TRACE_FUNCTION ("smscb_M_CB_TOP_CONS_create()");
+
+    /*
+     * Create window handler
+     */
+
+    data->win = 
+	win_create (parent_window, 0, 0, NULL);
+    if (data->win EQ NULL)
+	{
+	    return NULL;
+	}
+
+    /* 
+     * connect the dialog data to the MFW-window
+     */
+
+    data->mmi_control.dialog = (T_DIALOG_FUNC)smscb_M_CB_TOP_CONS_exec_cb;
+    data->mmi_control.data   = data;
+    win                      = ((T_MFW_HDR *)data->win)->data;
+    win->user                = (void *)data;
+    data->parent             = parent_window;
+
+    /*
+     * return window handle
+     */
+
+    winShow(data->win);
+    return data->win;
+}
+
+static void smscb_M_CB_TOP_CONS_destroy(MfwHnd own_window)
+{
+    T_MFW_WIN * win_data;
+    T_M_CB_TOP_CONS     * data;
+
+    TRACE_FUNCTION ("smscb_M_CB_TOP_CONS_destroy()");
+
+    if (own_window)
+	{
+	    win_data = ((T_MFW_HDR *)own_window)->data;
+	    data = (T_M_CB_TOP_CONS *)win_data->user;
+
+	    if (data)
+		{
+		    /*
+		     * Delete WIN handler
+		     */ 
+		    win_delete (data->win);
+
+		    /*     
+		     * Free Memory
+		     */
+		    FREE_MEMORY ((void *)data->list_menu_data.List, MAX_MIDS * sizeof (MfwMnuItem)); // c017 rsa
+		    FREE_MEMORY ((void *)data, sizeof (T_M_CB_TOP_CONS));
+		}
+	    else
+		{
+		    TRACE_EVENT ("smscb_M_CB_TOP_CONS_destroy() called twice");
+		}
+	}
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_CONS_recreate
+
+ $Description:	
+
+ $Returns:		
+ 
+ $Arguments:	
+ 
+*******************************************************************************/
+static void smscb_M_CB_TOP_CONS_recreate(T_M_CB_TOP_CONS *data)
+{
+    int i;
+   // int len;   // RAVI
+
+#ifdef DEBUG_SMS_CB
+    UBYTE ii;
+	   TRACE_EVENT ("before create a list !"); 
+	for (ii = 0; ii < MAX_MIDS; ii++)
+	{
+	   	   TRACE_EVENT_P2 (" 01 midlist:%d, i:%d", g_smscb_data.CBTopics.entry[ii].msg_id,ii);
+	}
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	TRACE_EVENT_P2 (" 01 midlist:%d, i:%d", g_smscb_data.CBTopics.entry[ii].msg_id,ii);
+	/***************************Go-lite Optimization changes end***********************/
+#endif
+
+    //on RECREATE|INIT: menucreate dynamiclist (List=CBTopics, SoftLeft=SELECT, SoftRight=BACK) /* show: 1. Name 2. MID */ 
+
+    // c017 rsa
+    /* allocate sufficient memory to hold the maximum list of menu items */
+    data->list_menu_data.List = (MfwMnuItem *)ALLOC_MEMORY (MAX_MIDS * sizeof (MfwMnuItem));
+    // end c017 rsa
+
+    for (i=0; i < g_smscb_data.CBTopics.length; i++) /* Fill Menu List */
+	{
+		mnuInitDataItem(&data->list_menu_data.List[i]);
+
+
+	    /* get the correct entry in list of CBTopics */
+	    data->list_menu_data.List[i].str = g_smscb_data.CBTopics.entry[i].name; 
+	    data->list_menu_data.List[i].flagFunc = item_flag_none;
+
+
+	}
+
+	//actual number of entries in list menu
+	data->list_menu_data.ListLength = g_smscb_data.CBTopics.length; 
+
+	data->list_menu_data.autoDestroy    = TRUE;
+
+    listDisplayListMenu(data->win, &data->list_menu_data, (ListCbFunc)smscb_M_CB_TOP_CONS_listmnu_cb,0);
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_CONS_exec_cb
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+void smscb_M_CB_TOP_CONS_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * dummy)
+    /* callback handler for events sent to to trigger execution */
+{
+
+    T_MFW_WIN         * win_data = ((T_MFW_HDR *) win)->data;
+    T_M_CB_TOP_CONS   * data = (T_M_CB_TOP_CONS *)win_data->user;
+    T_MFW_HND         * l_parent;
+    SHORT               l_id;
+//   UBYTE i;   // RAVI.
+
+    TRACE_FUNCTION ("smscb_M_CB_TOP_CONS_exec_cb()");
+
+    switch (event)
+	{
+	case E_INIT:
+	    /* initialization of administrative data */
+	    data->id = value;
+
+	    /* initialization of the dialog data */
+	    data->list_menu_data.ListPosition   = 1;/* True cursor position in list menu. */
+	    data->list_menu_data.CursorPosition = 1;/* Cursor position in list snapshot.  */
+	    data->list_menu_data.SnapshotSize   = 4;/* Number of list entries to view.    */
+	    data->list_menu_data.Font           = 0;
+	    data->list_menu_data.LeftSoftKey    = TxtDelete;
+	    data->list_menu_data.RightSoftKey   = TxtSoftBack;
+	    data->list_menu_data.KeyEvents      = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN;
+	    data->list_menu_data.Reason         = 0;
+	    data->list_menu_data.Strings        = TRUE; // c020 rsa
+	    data->list_menu_data.Attr           = (MfwMnuAttr*)&smscb_M_CB_TOP_CONSAttrib;
+        data->list_menu_data.autoDestroy    = TRUE;
+
+	    /* NOBREAK */
+	case E_RETURN: 
+	case E_EXIT: /* terminate EXIT from CB_EDT_MIDEDT|M_CB_TOP_CONS_SEL here */
+	    /* (re)create the dialog handler */
+        TRACE_FUNCTION ("EXIT in M_CB_TOP_CONS_exec_cb");	    
+
+        //the special case : if the user deleted the last CB item
+        //check if there is any more CB in the list when not
+        //give a infoscreen and go back to the CB menu
+		if (g_smscb_data.CBTopics.length EQ 0) 
+ 		{
+		    info_screen(0, TxtEmptyList,TxtNull, NULL); 
+		    l_parent = data->parent;
+		    l_id = data->id;
+		    smscb_M_CB_TOP_CONS_destroy(data->win);
+		    SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
+
+		}
+		else
+		{
+		    smscb_M_CB_TOP_CONS_recreate(data);
+
+		    /* put the (new) dialog window on top of the window stack */
+    	    /* winUpdate(data->win); c021 rsa */
+    	}
+	    break;
+	case E_ABORT: /* defaultreaction */
+	    TRACE_EVENT ("ABORT in M_CB_TOP_CONS_exec_cb");	    
+
+	    l_parent = data->parent;
+	    l_id = data->id;
+	    smscb_M_CB_TOP_CONS_destroy(data->win);
+	    SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
+	    break;
+	default:
+	    return;
+	}
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_CONS_listmnu_cb
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static void smscb_M_CB_TOP_CONS_listmnu_cb (T_MFW_HND * win, ListMenuData * ListData)
+    /* smscb_M_CB_TOP_CONS menu event handler */
+{
+    T_MFW_WIN            * win_data = ((T_MFW_HDR *)win)->data;
+    T_M_CB_TOP_CONS      * data = (T_M_CB_TOP_CONS *)win_data->user;
+    T_MFW_HND            * l_parent;
+    SHORT                  l_id;
+    int index;
+
+    TRACE_FUNCTION ("smscb_M_CB_TOP_CONS_listmnu_cb()");
+
+    switch (ListData->Reason)
+        {
+	case LISTS_REASON_SELECT:
+	    //on SELECT: menucreate M_CB_TOP_CONS_SEL(Index=selection)
+	    index = ListData->ListPosition;
+	    data->CB_index_param.index = index;
+
+	  	smscb_M_CB_TOP_CONS_SEL_ExeDelete(win);
+
+	    break;
+	case LISTS_REASON_BACK: /* back to previous menu */
+	    l_parent = data->parent;
+	    l_id = data->id;
+	    smscb_M_CB_TOP_CONS_destroy(data->win);
+	    SEND_EVENT (data->parent, E_RETURN, data->id, NULL); // c007 rsa
+	    break;
+	default:
+	    return;
+        }
+    return;
+}
+
+
+void ExeDelete_infoscreen_cb (T_MFW_HND win, USHORT identifier, UBYTE reason);
+
+/*********************************************************************
+**********************************************************************
+
+			  M_CB_TOP_CONS_SEL   DYNAMIC MENU WINDOW. CONTENTS BEHAVIOUR
+
+*********************************************************************
+**********************************************************************/
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_M_CB_TOP_CONS_SEL_ExeDelete
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static int smscb_M_CB_TOP_CONS_SEL_ExeDelete(T_MFW_HND * win)
+{
+    T_MFW_WIN          * win_data = ((T_MFW_HDR *)win)->data;
+    T_M_CB_TOP_CONS    * data = (T_M_CB_TOP_CONS *)win_data->user;
+//    T_MFW_HND          * l_parent;  // RAVI
+//    SHORT                l_id;  // RAVI
+    int index;
+
+    //index is the selected MID
+    index = data->CB_index_param.index;
+
+    //delete now the user selected Topic MID
+    smscb_delete_topic((UBYTE) index);
+
+    //show infoscreen ("Deleted"); 
+    info_screen(win, TxtDeleted, TxtNull, (T_VOID_FUNC) ExeDelete_infoscreen_cb); 
+
+
+	//save the updated Topic list on the SIM
+	smscb_setCBsettings(SMSCB_SWITCH_ON);
+
+    //selfdestroy; sendevent EXIT
+
+
+    return MFW_EVENT_CONSUMED;
+}
+
+void ExeDelete_infoscreen_cb (T_MFW_HND win , USHORT identifier, UBYTE reason)
+{
+    T_MFW_WIN          * win_data = ((T_MFW_HDR *)win)->data;
+    T_M_CB_TOP_CONS    * data     = (T_M_CB_TOP_CONS *)win_data->user;
+    SHORT                l_id;
+
+    l_id     = data->id;
+
+   //nm go back and recreate the CB list
+   SEND_EVENT (win, E_EXIT, l_id, NULL);
+   
+}
+
+/*********************************************************************
+**********************************************************************
+
+			CB_EDT_TEXTEDT	 DYNAMIC 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       editor;
+
+    /* internal data */
+    T_CB_index_param * param; /* pointer to parameter space in parent (index in list) */
+#ifdef NEW_EDITOR
+	T_AUI_EDITOR_DATA editor_info;	/* SPR#1428 - SH - New Editor data */
+#else
+    T_EDITOR_DATA   editor_info; /* storage for editor attributes */
+#endif
+    T_CB_EDT_MIDEDT_param CB_EDT_MIDEDT_param; /* parameter space for buffer for editing */
+} T_CB_EDT_TEXTEDT;
+
+static T_MFW_HND smscb_CB_EDT_TEXTEDT_create (T_MFW_HND parent);
+static void smscb_CB_EDT_TEXTEDT_destroy (T_MFW_HND window);
+static void smscb_CB_EDT_TEXTEDT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
+static void smscb_CB_EDT_TEXTEDT_editor_cb (T_MFW_HND win, USHORT Identifier, USHORT event);
+
+/*********************************************************************
+**********************************************************************
+
+			CB_EDT_TEXTEDT	DYNAMIC MENU WINDOW. IMPLEMENTATION
+
+*********************************************************************
+**********************************************************************/
+
+T_MFW_HND smscb_CB_EDT_TEXTEDT_start(T_MFW_HND parent_window, T_CB_index_param * parameter)
+{
+    T_MFW_HND win;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_TEXTEDT_start()");
+
+    win = smscb_CB_EDT_TEXTEDT_create (parent_window);
+
+    if (win NEQ NULL)
+	{
+	    SEND_EVENT (win, E_INIT, smscb_CB_EDT_TEXTEDT_ID, (void *)parameter);
+	}
+    return win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_TEXTEDT_create
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static T_MFW_HND smscb_CB_EDT_TEXTEDT_create(MfwHnd parent_window)
+{
+    T_CB_EDT_TEXTEDT      * data = (T_CB_EDT_TEXTEDT *)ALLOC_MEMORY (sizeof (T_CB_EDT_TEXTEDT));
+    T_MFW_WIN             * win;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_TEXTEDT_create()");
+
+    /*
+     * Create window handler
+     */
+
+    data->win = 
+	win_create (parent_window, 0, 0, NULL);
+    if (data->win EQ NULL)
+	{
+	    return NULL;
+	}
+
+    /* 
+     * connect the dialog data to the MFW-window
+     */
+
+    data->mmi_control.dialog = (T_DIALOG_FUNC)smscb_CB_EDT_TEXTEDT_exec_cb;
+    data->mmi_control.data   = data;
+    win                      = ((T_MFW_HDR *)data->win)->data;
+    win->user                = (void *)data;
+    data->parent             = parent_window;
+
+    /*
+     * return window handle
+     */
+
+    winShow(data->win);
+    return data->win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_TEXTEDT_destroy
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static void smscb_CB_EDT_TEXTEDT_destroy(MfwHnd own_window)
+{
+    T_MFW_WIN            * win_data;
+    T_CB_EDT_TEXTEDT     * data;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_TEXTEDT_destroy()");
+
+    if (own_window)
+	{
+	    win_data = ((T_MFW_HDR *)own_window)->data;
+	    data     = (T_CB_EDT_TEXTEDT *)win_data->user;
+
+	    if (data)
+		{
+		    /*
+		     * Delete WIN handler
+		     */ 
+		    win_delete (data->win);
+
+		    /*     
+		     * Free Memory
+		     */
+		    FREE_MEMORY ((void *)data, sizeof (T_CB_EDT_TEXTEDT));
+		}
+	    else
+		{
+		    TRACE_EVENT ("smscb_CB_EDT_TEXTEDT_destroy() called twice");
+		}
+	}
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_TEXTEDT_exec_cb
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+void smscb_CB_EDT_TEXTEDT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+    /* callback handler for events sent to to trigger execution */
+{
+
+
+    T_MFW_WIN            * win_data = ((T_MFW_HDR *) win)->data;
+    T_CB_EDT_TEXTEDT     * data = (T_CB_EDT_TEXTEDT *)win_data->user;
+    T_MFW_HND            * l_parent;
+    SHORT                  l_id;
+    int      
+   	index;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_TEXTEDT_exec_cb()");
+
+    switch (event)
+	{
+	case E_INIT:
+	    /* initialization of administrative data */
+	    data->id = value;
+	    data->param = (T_CB_index_param *)parameter; /* store the pointer to the parameter for later use */
+
+
+#ifdef DEBUG_SMS_CB
+		/***************************Go-lite Optimization changes Start***********************/
+		//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+		TRACE_EVENT_P1( "the index is %d", data->param->index);
+		/***************************Go-lite Optimization changes end***********************/
+#endif
+
+	    /* initialization of the dialog data */
+	    index = data->param->index;
+	    data->CB_EDT_MIDEDT_param.index = index; /* copy the index to parameter space of next menu */
+
+data->CB_EDT_MIDEDT_param.name[0] = '\0'; /* provide empty entry */
+
+	    //on INIT: exec "copy params to dynamic memory <data>"; RECREATE
+	    /* NOBREAK */
+	case E_RETURN:    //on RETURN: RECREATE  // recreate editor if back from options
+
+		/* SPR#1428 - SH - New Editor changes */
+		
+#ifdef NEW_EDITOR
+		AUI_edit_SetDefault(&data->editor_info);
+		AUI_edit_SetDisplay(&data->editor_info, ZONE_FULL_SK_TITLE, COLOUR_EDITOR_XX, EDITOR_FONT);
+		AUI_edit_SetEvents(&data->editor_info, value, TRUE, TEN_SECS,  (T_AUI_EDIT_CB)smscb_CB_EDT_TEXTEDT_editor_cb);
+		AUI_edit_SetTextStr(&data->editor_info, TxtSoftOK, TxtDelete, TxtEnterName, NULL);
+		// Change by Sasken ( Deepa M.d) on March 29th 2004
+		// Issue Number : MMI-SPR-12722
+		// Subject: Right softkey should be "Back" when the editor is empty
+		// Bug : Right softkey should be "Back" when the editor is empty
+		// Solution : Added alternative string for the right softkey tobe displayed when the editor is empty
+		
+		AUI_edit_SetAltTextStr(&data->editor_info, 0, NULL, TRUE, TxtSoftBack);
+		AUI_edit_SetBuffer(&data->editor_info, ATB_DCS_ASCII, (UBYTE *)data->CB_EDT_MIDEDT_param.name, CB_TAG_LENGTH);
+		AUI_edit_SetMode(&data->editor_info, ED_MODE_ALPHA, ED_CURSOR_BAR);
+
+	    data->editor = AUI_edit_Start(data->win,&data->editor_info);  /* start the editor */
+#else /* NEW_EDITOR */
+	/*MC SPR 1488, got rid of hardcoded editor dimensions*/
+	    data->editor_info.editor_attr.win.px   = 0;
+	    data->editor_info.editor_attr.win.py   = Mmi_layout_line(2);
+	    data->editor_info.editor_attr.win.sx   =SCREEN_SIZE_X;
+	    data->editor_info.editor_attr.win.sy   =  2*Mmi_layout_line_height();
+		data->editor_info.editor_attr.edtCol	= COLOUR_EDITOR_XX;
+	    data->editor_info.editor_attr.font     = 0;
+	    data->editor_info.editor_attr.mode     = edtCurBar1;
+	    data->editor_info.editor_attr.controls = 0;
+	    data->editor_info.editor_attr.text     = data->CB_EDT_MIDEDT_param.name;  /* buffer to be edited */
+	    data->editor_info.editor_attr.size     = CB_TAG_LENGTH;
+	    data->editor_info.LeftSoftKey       = TxtSoftOK;	    
+	    data->editor_info.RightSoftKey      = TxtDelete;
+	    data->editor_info.TextId            = TxtEnterName;
+	    data->editor_info.Identifier        = value;  /* optional */
+	    data->editor_info.mode              = ALPHA_MODE;
+	    data->editor_info.Callback          = (T_EDIT_CB)smscb_CB_EDT_TEXTEDT_editor_cb;
+		data->editor_info.destroyEditor		= TRUE;
+	    data->editor_info.hide                 = FALSE;
+		// Change by Sasken ( Deepa M.d) on March 29th 2004
+		// Issue Number : MMI-SPR-12722
+		// Subject: Right softkey should be "Back" when the editor is empty
+		// Bug : Right softkey should be "Back" when the editor is empty
+		// Solution : Added alternative string for the right softkey tobe displayed when the editor is empty
+		data->editor_info.AlternateLeftSoftKey = TxtSoftBack;
+	    data->editor_info.TextString           = NULL;
+	    data->editor_info.min_enter            = 0;
+	    data->editor_info.timeout              = TEN_SECS;
+
+	    /* create the dialog handler */
+	    data->editor = editor_start(data->win,&data->editor_info);  /* start the editor */
+#endif /* NEW_EDITOR */
+
+	    break;
+	case E_ABORT:
+	case E_EXIT: /* defaultreaction */
+	    l_parent = data->parent;
+	    l_id = data->id;
+	    smscb_CB_EDT_TEXTEDT_destroy(data->win);
+		/*SPR 1920, removed sending of exit event to parent, no longer needed*/
+	    break;
+	default:
+	    return;
+	}
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_TEXTEDT_editor_cb
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static void smscb_CB_EDT_TEXTEDT_editor_cb (T_MFW_HND win, USHORT Identifier, USHORT event)
+    /* smscb_CB_EDT_TEXTEDT editor event handler */
+{
+    T_MFW_WIN    * win_data = ((T_MFW_HDR *)win)->data;
+    T_CB_EDT_TEXTEDT * data = (T_CB_EDT_TEXTEDT *)win_data->user;
+    T_MFW_HND    * l_parent;
+    SHORT          l_id;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_TEXTEDT_editor_cb()");
+
+    switch(event)
+    	{
+	case INFO_KCD_LEFT:
+	    //on OK: menucreate CB_EDT_MIDEDT(data)
+	    smscb_CB_EDT_MIDEDT_start (win, &data->CB_EDT_MIDEDT_param);
+	    break;
+	case INFO_KCD_RIGHT:
+	case INFO_KCD_HUP: /* defaultreaction */
+	    l_parent = data->parent;
+	    l_id = data->id;
+	    smscb_CB_EDT_TEXTEDT_destroy(data->win);
+	    SEND_EVENT (l_parent, E_RETURN, l_id, NULL); // c007 rsa
+	    break;
+	default:
+	    break;
+    	}
+    return;
+}
+/*********************************************************************
+**********************************************************************
+
+			CB_EDT_MIDEDT	 DYNAMIC 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       editor;
+
+    /* internal data */
+    T_CB_EDT_MIDEDT_param * param; /* pointer to parameter space in parent (buffer for editing) */
+#ifdef NEW_EDITOR
+	T_AUI_EDITOR_DATA editor_info;	/* SPR#1428 - SH - New Editor data */
+#else
+    T_EDITOR_DATA   editor_info; /* storage for editor attributes */
+#endif
+} T_CB_EDT_MIDEDT;
+
+static T_MFW_HND smscb_CB_EDT_MIDEDT_create (T_MFW_HND parent);
+static void smscb_CB_EDT_MIDEDT_destroy (T_MFW_HND window);
+static void smscb_CB_EDT_MIDEDT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
+static void smscb_CB_EDT_MIDEDT_editor_cb (T_MFW_HND win, USHORT Identifier, USHORT event);
+
+/*********************************************************************
+**********************************************************************
+
+			CB_EDT_MIDEDT	DYNAMIC MENU WINDOW. IMPLEMENTATION
+
+*********************************************************************
+**********************************************************************/
+
+T_MFW_HND smscb_CB_EDT_MIDEDT_start(T_MFW_HND parent_window, T_CB_EDT_MIDEDT_param * parameter)
+{
+    T_MFW_HND win;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_MIDEDT_start()");
+
+    win = smscb_CB_EDT_MIDEDT_create (parent_window);
+
+    if (win NEQ NULL)
+	{
+	    SEND_EVENT (win, E_INIT, smscb_CB_EDT_MIDEDT_ID, (void *)parameter);
+	}
+    return win;
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_MIDEDT_create
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static T_MFW_HND smscb_CB_EDT_MIDEDT_create(MfwHnd parent_window)
+{
+    T_CB_EDT_MIDEDT      * data = (T_CB_EDT_MIDEDT *)ALLOC_MEMORY (sizeof (T_CB_EDT_MIDEDT));
+    T_MFW_WIN  * win;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_MIDEDT_create()");
+
+    /*
+     * Create window handler
+     */
+
+    data->win = win_create (parent_window, 0, 0, NULL);
+    
+    if (data->win EQ NULL)
+	{
+	    return NULL;
+	}
+
+    /* 
+     * connect the dialog data to the MFW-window
+     */
+
+    data->mmi_control.dialog = (T_DIALOG_FUNC)smscb_CB_EDT_MIDEDT_exec_cb;
+    data->mmi_control.data   = data;
+    win                      = ((T_MFW_HDR *)data->win)->data;
+    win->user                = (void *)data;
+    data->parent             = parent_window;
+
+    /*
+     * return window handle
+     */
+
+    winShow(data->win);
+    return data->win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_MIDEDT_destroy
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static void smscb_CB_EDT_MIDEDT_destroy(MfwHnd own_window)
+{
+    T_MFW_WIN           * win_data;
+    T_CB_EDT_MIDEDT     * data;
+
+
+    TRACE_FUNCTION ("smscb_CB_EDT_MIDEDT_destroy()");
+
+    if (own_window)
+	{
+	    win_data = ((T_MFW_HDR *)own_window)->data;
+	    data     = (T_CB_EDT_MIDEDT *)win_data->user;
+
+	    if (data)
+		{
+		    /*
+		     * Delete WIN handler
+		     */ 
+		    win_delete (data->win);
+
+		    /*     
+		     * Free Memory
+		     */
+		    FREE_MEMORY ((void *)data, sizeof (T_CB_EDT_MIDEDT));
+		}
+	    else
+		{
+		    TRACE_EVENT ("smscb_CB_EDT_MIDEDT_destroy() called twice");
+		}
+	}
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_MIDEDT_exec_cb
+
+ $Description:	
+ 
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+void smscb_CB_EDT_MIDEDT_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+    /* callback handler for events sent to to trigger execution */
+{
+
+    T_MFW_WIN          * win_data = ((T_MFW_HDR *) win)->data;
+    T_CB_EDT_MIDEDT    * data     = (T_CB_EDT_MIDEDT *)win_data->user;
+    T_MFW_HND          * l_parent;
+    SHORT                l_id;
+    int                  index;
+
+    TRACE_FUNCTION ("smscb_CB_EDT_MIDEDT_exec_cb()");
+
+    switch (event)
+	{
+	case E_INIT:
+	    /* initialization of administrative data */
+	    data->id = value;
+	    data->param = (T_CB_EDT_MIDEDT_param *)parameter; /* store the pointer to the parameter for later use */
+
+	    /* initialization of the dialog data */
+	    index = data->param->index;
+	    if (g_smscb_data.CBTopics.entry[index].msg_id NEQ NO_MID)
+		{
+		    data->param->number[0] = '\0'; /* provide empty entry */
+
+		}
+	    else
+		{
+		    data->param->number[0] = '\0'; /* provide empty entry */
+		}
+	    //on INIT: call editor (Type=numeric, Length=3, Prompt="Enter MID Number", 
+	    //                      Number=data->List.Number[data->ListIndex], SoftLeft=OK, SoftRight=BACK)
+
+		/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+		AUI_edit_SetDefault(&data->editor_info);
+		AUI_edit_SetDisplay(&data->editor_info, ZONE_FULL_SK_TITLE, COLOUR_EDITOR, EDITOR_FONT);
+		AUI_edit_SetEvents(&data->editor_info, value, TRUE, TEN_SECS,  (T_AUI_EDIT_CB)smscb_CB_EDT_MIDEDT_editor_cb);
+		AUI_edit_SetTextStr(&data->editor_info, TxtSoftOK, TxtDelete, TxtEnterMid, NULL);
+		AUI_edit_SetAltTextStr(&data->editor_info, 1, TxtNull, TRUE, TxtSoftBack);
+		AUI_edit_SetBuffer(&data->editor_info, ATB_DCS_ASCII, (UBYTE *)data->param->number, CB_MID_LENGTH);
+		AUI_edit_SetMode(&data->editor_info, 0, ED_CURSOR_BAR);
+
+	    data->editor = AUI_edit_Start(data->win,&data->editor_info);  /* start the editor */
+#else /* NEW_EDITOR */
+		editor_attr_init(&data->editor_info.editor_attr, ZONE_SMALL_EDITOR, edtCurBar1, 0, data->param->number, CB_MID_LENGTH, COLOUR_EDITOR );
+	    editor_data_init(&data->editor_info,(T_EDIT_CB)smscb_CB_EDT_MIDEDT_editor_cb,TxtSoftOK,TxtDelete,TxtEnterMid,1 ,DIGITS_MODE, TEN_SECS);
+		data->editor_info.destroyEditor		= TRUE;
+		data->editor_info.Identifier		= value;
+	    data->editor_info.hide                 = FALSE;
+	    data->editor_info.TextString           = NULL;
+
+	    /* create the dialog handler */
+	    data->editor = editor_start(data->win,&data->editor_info);  /* start the editor */ 
+#endif /* NEW_EDITOR */
+	    break;
+	case E_ABORT:
+	case E_EXIT: /* defaultreaction */
+	    l_parent = data->parent;
+	    l_id = data->id;
+	    smscb_CB_EDT_MIDEDT_destroy(data->win);
+        SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
+	    break;
+	default:
+	    return;
+	}
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_CB_EDT_MIDEDT_editor_cb
+
+ $Description:	
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static void smscb_CB_EDT_MIDEDT_editor_cb (T_MFW_HND win, USHORT Identifier, USHORT event)
+    /* smscb_CB_EDT_MIDEDT editor event handler */
+{
+    T_MFW_WIN       * win_data = ((T_MFW_HDR *)win)->data;
+    T_CB_EDT_MIDEDT * data = (T_CB_EDT_MIDEDT *)win_data->user;
+    T_MFW_HND       * l_parent;
+    SHORT             l_id;
+    int               index;
+	UBYTE			ll;
+    T_SMSCB_TOPIC_TAG ffs_tag;/*SPR1920*/
+    char file_name[20];
+    int val;
+#ifdef DEBUG_SMS_CB
+	UBYTE ii;
+#endif
+
+    TRACE_FUNCTION ("smscb_CB_EDT_MIDEDT_editor_cb()");
+
+    l_parent = data->parent;
+    l_id     = data->id;
+
+    switch(event)
+    	{
+	case INFO_KCD_LEFT:
+	    index = data->param->index;
+
+		//nm "-1"the zero is counted as well
+	    if (index < MAX_MIDS -1 )
+		{
+		    /* add a new entry */
+
+
+		    memcpy (g_smscb_data.CBTopics.entry[index].name, data->param->name, CB_TAG_LENGTH);
+		    g_smscb_data.CBTopics.entry[index].msg_id = atoi(data->param->number);
+			/*SPR1959, save name to FFS*/
+		      memcpy(ffs_tag.name, data->param->name, CB_TAG_LENGTH);
+		    {	 val = ffs_fwrite((const char*)ffs_cb_tag_name(g_smscb_data.CBTopics.entry[index].msg_id, file_name),  (void*)&ffs_tag, sizeof(T_SMSCB_TOPIC_TAG));
+
+				TRACE_EVENT_P1("CB tag name write status:%d", val);
+ 			}
+			
+#ifdef DEBUG_SMS_CB
+			/***************************Go-lite Optimization changes Start***********************/
+			//	Aug 16, 2004    REF: CRR 24323   Deepa M.D		
+			TRACE_EVENT_P1 ( "the index is %d", index);
+			/***************************Go-lite Optimization changes end***********************/
+#endif
+			
+			/* add a new entry */
+			index += 1;
+			g_smscb_data.CBTopics.length = index;
+			
+			smscb_setCBsettings(SMSCB_SWITCH_ON); /* save in SIM */ 
+			
+			info_screen(win, TxtSaved ,TxtNull, NULL); 
+			
+		}
+		else
+		{
+			info_screen (win, TxtFull, TxtNull, NULL);
+		}
+		
+		//  Apr 29, 2004    REF: CRR 11630  Deepa M.D
+		//	Refresh the list,so that if a name exists for a channelId in FFS, it is displayed.
+		for(ll = 0; ll < g_smscb_data.CBTopics.length; ll++)
+		{
+			if (g_smscb_data.CBTopics.entry[ll].msg_id EQ NO_MID)
+			{
+				break;
+			}
+			
+			/* Set default tag string, until we get the saved name from PCM */
+			g_smscb_data.CBTopics.entry[ll].name[0] = '\0'; 
+			/*attempt to read channel name from FFS file*/
+			val = ffs_fread(ffs_cb_tag_name(g_smscb_data.CBTopics.entry[ll].msg_id, file_name),  &ffs_tag, sizeof(T_SMSCB_TOPIC_TAG));
+			/*if reading successful, copy name to data structure*/
+			
+			if (val == sizeof(ffs_tag))
+			{
+				memcpy(g_smscb_data.CBTopics.entry[ll].name, ffs_tag.name, CB_TAG_LENGTH);
+			}
+			/*  update here g_smscb_data.CBTopics.entry[i].name from PCM */
+			if (g_smscb_data.CBTopics.entry[ll].name[0] EQ '\0')
+			{
+				/* but if it's empty substitute it by the channel number */
+				sprintf (g_smscb_data.CBTopics.entry[ll].name,"Ch%d,ID:%d",ll,g_smscb_data.CBTopics.entry[ll].msg_id);
+			}
+			
+		}
+		
+		
+#ifdef DEBUG_SMS_CB
+		/***************************Go-lite Optimization changes Start***********************/
+		//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+		TRACE_EVENT ("after add a new one !"); 
+		for (ii = 0; ii < MAX_MIDS; ii++)
+		{
+			
+			TRACE_EVENT_P2 (" 04 midlist:%d, i:%d", g_smscb_data.CBTopics.entry[ii].msg_id,ii);
+		}
+		
+		TRACE_EVENT_P1 ("04 midlist:%d", g_smscb_data.CBTopics.length); 
+		
+		/***************************Go-lite Optimization changes end***********************/
+#endif
+
+
+
+    
+	    smscb_CB_EDT_MIDEDT_destroy(data->win);
+	    SEND_EVENT (l_parent, E_EXIT, l_id, NULL);
+	    break;
+	case INFO_KCD_RIGHT:
+	case INFO_KCD_HUP: /* defaultreaction */
+	    smscb_CB_EDT_MIDEDT_destroy(data->win);
+	    SEND_EVENT (l_parent, E_RETURN, l_id, NULL); // c007 rsa
+	    break;
+	default:
+	    break;
+    	}
+    return;
+}
+
+/*********************************************************************
+**********************************************************************
+
+
+			cell broadcast routines IMPLEMENTATION
+
+*********************************************************************
+**********************************************************************/
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_InitData
+
+ $Description:	Initialises CB message storage
+
+ $Returns:		none.
+
+ $Arguments:	
+ 
+*******************************************************************************/
+void smscb_InitData (void)
+{
+    UBYTE i;
+
+    g_smscb_data.CBTopics.length = 0;
+    for (i = 0; i < MAX_MIDS; i++)
+	{
+	    g_smscb_data.CBTopics.entry[i].msg_id = NO_MID; /* Set MID list default values. */
+	    g_smscb_data.CBTopics.entry[i].name[0] = '\0';
+	    g_smscb_data.CBTopics.entry[i].dcs = 0;
+	}
+
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_delete_topic
+
+
+
+ $Description: : This function is used to delete an MID from the
+            current list <g_smscb_data.CBTopics>.
+
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static T_MFW smscb_delete_topic(UBYTE MidOffset)
+{
+    SHORT Mid;
+    UBYTE MidCount;
+    UBYTE i;
+
+#ifdef DEBUG_SMS_CB
+    UBYTE ii;
+#endif
+
+    Mid = g_smscb_data.CBTopics.entry[MidOffset].msg_id;
+
+    /* Find out how many messages are stored. 
+     * set MidCount to first entry which contains NO_MID or 
+     * set MidCount to MAX_MIDS if list is full
+     */
+	// 
+    MidCount = g_smscb_data.CBTopics.length + 1;
+
+    /* Move the MID data up one. */
+    while (MidOffset < (MidCount)) //c005 rsa avoid copying from behind the array
+	{
+	    g_smscb_data.CBTopics.entry[MidOffset] = g_smscb_data.CBTopics.entry[MidOffset + 1];  
+	    MidOffset++;
+	}
+    //c005 rsa but assign NO_MID behind the last entry
+    if (MidCount > 0)
+        g_smscb_data.CBTopics.entry[MidCount].msg_id = NO_MID; 
+    else
+        g_smscb_data.CBTopics.entry[0].msg_id = NO_MID;
+    //end c005 rsa
+    
+    g_smscb_data.CBTopics.length--;
+
+    /* Delete any message in FIFO bearing the MID. */
+    /*MC SPR 1920, I have a suspicion this does nothing, but have replaced references
+    to removed structure members with references to data stored for topics list*/
+    i = 0;
+    while ((i < MAX_MIDS) && (g_smscb_data.CBTopics.entry[i].msg_id != Mid))
+        i++;
+
+
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+    TRACE_EVENT_P1 ("i is %d", i);
+	/***************************Go-lite Optimization changes end***********************/
+#endif
+	
+	
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	   TRACE_EVENT ("after deleting !"); 
+	   for (ii = 0; ii < MAX_MIDS; ii++)
+	   {
+		   
+		   TRACE_EVENT_P2 (" 03 midlist:%d, i:%d", g_smscb_data.CBTopics.entry[ii].msg_id,ii);
+	   }
+	   
+	   TRACE_EVENT_P1 ("03 midlist:%d", g_smscb_data.CBTopics.length); 
+	   /***************************Go-lite Optimization changes end***********************/
+#endif
+
+
+
+    return 1;
+}
+
+/*******************************************************************************
+
+ $Function:    	ffs_cb_tag_name
+
+ $Description: generates a filename string for the pathname of an FFS CB Topic tag file
+i.e./MMI/cbtagXX where XX is the channel number.
+Added for issue1920
+
+ $Returns:	filename string	
+
+ $Arguments: channel number, pointer to allocated string	
+ 
+*******************************************************************************/
+char* ffs_cb_tag_name(int channel_num, char* name)
+{
+	sprintf(name,"/mmi/cbtag%d",channel_num);
+	return name;
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_getCBsettings
+
+ $Description: This function allows the MS-User to examine the
+            current list of MIDs being used to filter CB messages.
+
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+T_MFW smscb_getCBsettings(void)
+{
+    T_MFW status;
+    UBYTE i,d=0;
+    /*MC SPR 1920, need to allocate this as large data structure*/
+	T_MFW_SMS_CB_INFO*   SmsCbInfo = (T_MFW_SMS_CB_INFO*)ALLOC_MEMORY(sizeof(T_MFW_SMS_CB_INFO));
+    T_SMSCB_TOPIC_TAG ffs_tag;/*SPR1920*/
+    char file_name[20];/*SPR1920*/
+    int val;/*SPR1920*/
+
+#ifdef FF_2TO1_PS
+    return MFW_SMS_FAIL;
+#endif
+
+#ifdef DEBUG_SMS_CB  
+    TRACE_EVENT (" get the list from sim");
+#endif
+
+	//clear the Topic list 
+	smscb_InitData();
+
+	//get the Topic list from the SIM
+    status = sms_get_cell_broadcast_info(SmsCbInfo);    
+
+	//set to default
+	g_smscb_data.CBTopics.length = 0xFF;
+
+	
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+    for (i = 0; i <= 19; i++)
+	{
+		TRACE_EVENT_P2("DATA from mfw %d i:%d", SmsCbInfo->msg_id[i],i);
+	}
+	/***************************Go-lite Optimization changes end***********************/
+#endif
+
+
+    for (i = 0; i < MAX_MIDS; i++)
+	{
+	    /* Update MID list from SIM data. */
+	    g_smscb_data.CBTopics.entry[i].msg_id = SmsCbInfo->msg_id[d];
+	    
+	    g_smscb_data.CBTopics.entry[i].dcs = SmsCbInfo->dcs[d]; 
+
+	    if (g_smscb_data.CBTopics.entry[i].msg_id EQ NO_MID)
+		{
+		    break;
+		}
+	    else
+		{
+		    g_smscb_data.CBTopics.length = i; 
+		}
+
+	    /* Set default tag string, until we get the saved name form PCM */
+	    g_smscb_data.CBTopics.entry[i].name[0] = '\0'; 
+		/*SPR1920*/
+		/*attempt to read channel name from FFS file*/
+ 		 val = ffs_fread(ffs_cb_tag_name(g_smscb_data.CBTopics.entry[i].msg_id, file_name),  &ffs_tag, sizeof(T_SMSCB_TOPIC_TAG));
+		/*if reading successful, copy name to data structure*/
+	    if (val == sizeof(ffs_tag))
+	    {
+	        memcpy(g_smscb_data.CBTopics.entry[i].name, ffs_tag.name, CB_TAG_LENGTH);
+	    }
+ 		/*SPR1920, end*/
+	    /* ??? update here g_smscb_data.CBTopics.entry[i].name from PCM */
+	    if (g_smscb_data.CBTopics.entry[i].name[0] EQ '\0')
+		{
+		    /* but if it's empty substitute it by the channel number */
+		    sprintf (g_smscb_data.CBTopics.entry[i].name,"Ch%d,ID:%d",i,g_smscb_data.CBTopics.entry[i].msg_id);
+		}
+
+		d+=2;
+
+#ifdef DEBUG_SMS_CB
+		/***************************Go-lite Optimization changes Start***********************/
+		//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+		TRACE_EVENT_P2 ( "02 midlist:%d, i:%d", g_smscb_data.CBTopics.entry[i].msg_id,i);
+		/***************************Go-lite Optimization changes end***********************/
+#endif   
+
+	}
+
+
+	if (g_smscb_data.CBTopics.length EQ 0xFF)
+	{
+		//list is empty
+		g_smscb_data.CBTopics.length = 0;
+	}
+	else
+	{
+		//+1 because the "0" was counted as well
+		g_smscb_data.CBTopics.length +=1;	
+	}
+
+
+
+	/*SPR 1920, end of function, deallocate memory*/
+	FREE_MEMORY((void*)SmsCbInfo,sizeof(T_MFW_SMS_CB_INFO));
+    return status;
+}
+
+/*******************************************************************************
+
+ $Function:    	smscb_setCBsettings
+
+ $Description: This function is used to activated/de-activate the CB
+            feature and to submit MIDs for filter list control.
+
+            When the CB feature is switched ON, the stored message
+            index MIDs are set to invalid, i.e ready for incoming CB
+            messages and the MID list is initialised. On switch OFF,
+            the MID list parameters are refreshed before the switch
+            OFF command is issued, to ensure that the most recent
+            MID list is used. It is not necessary to handle the
+            stored message index MIDs as they will be dealt with
+            next time the feature is activated.
+	    usage:
+                 Status = smscb_setCBsettings(SMSCB_SWITCH_OFF);
+                 Status = smscb_setCBsettings(SMSCB_SWITCH_ON);
+ 
+
+ $Returns:		none.
+
+ $Arguments:	
+ 
+*******************************************************************************/
+T_MFW smscb_setCBsettings(UBYTE State)
+{
+/* SPR759 - SH - removed 'static' so function can be called by Homezone */
+
+    UBYTE i,d=0;
+    T_MFW Status;
+    /*MC SPR 1920, need to allocate this as large data structure*/
+    T_MFW_SMS_CB_INFO*   SmsCbInfo = (T_MFW_SMS_CB_INFO*)ALLOC_MEMORY(sizeof(T_MFW_SMS_CB_INFO));
+
+#ifdef FF_2TO1_PS
+    return MFW_SMS_FAIL;
+#endif
+
+/* SH - moved up here otherwise does not execute*/
+//nm 
+	if (State EQ SMSCB_SWITCH_ON )
+		sms_set_mt_ind(MT_CB_MSG);
+	else
+		sms_set_mt_ind(MT_CB_NO_IDX);
+
+
+    /* copy local list to SIM */
+   SmsCbInfo->mode = State;
+
+
+	for (i = 0; i < MAX_MIDS; i++)
+	{
+	    SmsCbInfo->msg_id[i] = NO_MID; /* Set MID list default values. */
+	    SmsCbInfo->dcs[i]    = 0xFF;
+	}
+
+//    Dec 22, 2004 REF: CRR MFW-SPR-27847 xnkulkar
+//    Description: MFW memory size variable changed from U16 -> U32
+//    Solution: 'd' is checked against 'MAX_IDENTS' to restrict increment beyond limit
+    for (i = 0; (i < g_smscb_data.CBTopics.length) && (d < MAX_IDENTS); i++)
+	{
+
+	    SmsCbInfo->msg_id[d] = g_smscb_data.CBTopics.entry[i].msg_id;
+	    /* ??? update here PCM with g_smscb_data.CBTopics.entry[i].name */
+	   SmsCbInfo->dcs[d] = (char)g_smscb_data.CBTopics.entry[i].dcs;
+
+		d++;
+
+//    Dec 22, 2004 REF: CRR MFW-SPR-27847 xnkulkar
+//    Description: MFW memory size variable changed from U16 -> U32
+//    Solution: Duplication removed
+		
+//	   SmsCbInfo->msg_id[d] = g_smscb_data.CBTopics.entry[i].msg_id;
+//	    /* ??? update here PCM with g_smscb_data.CBTopics.entry[i].name */
+//	   SmsCbInfo->dcs[d] = (char)g_smscb_data.CBTopics.entry[i].dcs;
+
+//	   d++;
+
+	    
+	}
+
+
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+    for (i = 0; i <= 25; i++)
+	{
+		TRACE_EVENT_P2 ("SAVING..SmsCbInfo.msg_id[i] %d  i:%d", SmsCbInfo->msg_id[i],i);
+	}
+	/***************************Go-lite Optimization changes end***********************/
+#endif
+
+	Status = sms_set_cell_broadcast_info(State, SmsCbInfo);
+
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+    TRACE_EVENT_P1 ("SAVING.Status is %d", Status);
+	/***************************Go-lite Optimization changes end***********************/
+#endif
+		/*SPR 1920, end of function, deallocate memory*/
+		FREE_MEMORY((void*)SmsCbInfo,sizeof(T_MFW_SMS_CB_INFO));
+    return Status;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	smscb_get_new_cb_messages_count
+
+ $Description:	Calls from the MainMenu
+
+ $Returns:		none.
+
+ $Arguments:	
+ 
+*******************************************************************************/
+SHORT smscb_get_new_cb_messages_count(void)
+{
+    int j;
+    int count;
+
+    count = 0;
+    /*SPR 1920, use cb_attributes list as smsCBList removed*/
+    for (j=0; j<MAX_MIDS; j++)
+	{
+	    if (smscb_data.cb_attributes[j].status== UNREAD_MESSAGE)
+		{
+		    count++; /* found an unread message */
+		}
+	}
+    return count;
+}
+
+/*******************************************************************************
+
+ $Function:    	msgsExtractPhoneNumber
+
+ $Description:	 This function extracts a phone number within quotes, which
+            is embedded in a text message.
+
+ $Returns:		
+ $Arguments:	
+ 
+*******************************************************************************/
+void msgsExtractPhoneNumber(UBYTE *InputString, UBYTE *Buffer)
+{
+    UBYTE i;
+    CHAR * FirstQuote;
+    CHAR * SecondQuote;
+
+    FirstQuote = strchr((const char *)InputString, (int)"\"");
+
+    if (FirstQuote != '\0')
+    {
+        SecondQuote = strchr((const char *)FirstQuote++, (int)"\"");
+
+        if (SecondQuote != '\0')
+        {
+            for (i = 0; FirstQuote != SecondQuote; i++)
+                Buffer[i] = FirstQuote[i];
+        }
+
+        if (ss_check_ss_string((UBYTE *)Buffer) != MFW_SS_DIAL)
+            Buffer[0] = '\0';
+    }
+}
+#ifdef DEBUG_SMS_CB
+void handle_dummy_message(T_MFW_SMS_CB* Message)
+{
+		USHORT i;
+		SHORT geograhical_scope = (SHORT)0xC000;
+		char temp_buffer[MAX_CBMSG_LEN];
+
+	    TRACE_EVENT ("E_SMS_CB");
+
+		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");
+
+
+	     	
+			 for(i=0;i <= Message->msg_len;i++)
+			 {
+				//check now for the termination "0x00D"
+				//the message is NOT terminated with '\0'
+				if (Message->cb_msg[i] EQ 0x0d)
+				{
+					Message->cb_msg[i]='\0';
+				 }
+			 }
+		 // API - 859 - Convert the the incoming GSM Text to ASCII
+		 ATB_convert_String(Message->cb_msg, MFW_DCS_8bits, Message->msg_len,
+								  temp_buffer, MFW_ASCII, MAX_CBMSG_LEN, FALSE);
+#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
+
+			{
+				Message->cb_msg[MAX_CBMSG_LEN-1]='\0';
+			}
+			ATB_convert_String(Message->cb_msg, MFW_DCS_8bits, Message->msg_len,
+					temp_buffer, MFW_ASCII, /*MAX_MSG_LEN*/MAX_CBMSG_LEN, FALSE);
+			memcpy(Message->cb_msg, temp_buffer, MAX_CBMSG_LEN);
+			//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);
+			
+		}
+
+	}
+/*******************************************************************************
+
+ $Function:    	test_function_to_send_cb
+
+ $Description:	This function is only for simulation of incoming cb messages
+
+ $Returns:		
+ $Arguments:	
+ 
+*******************************************************************************/
+
+
+void test_function_to_send_cb (void)
+{
+	T_MFW_SMS_CB Message;
+	UBYTE i;
+
+	
+	DEBUG = FALSE;
+
+// for testing only
+//#if 0
+TRACE_EVENT("Testcase");
+Message.sn = 60;
+Message.msg_id = 60;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "60 Toronto Blue Jays to a 4-0 victory Tuesday ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = 61;
+Message.msg_id = 61;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "61 Toronto Blue Jays to a 4-0 victory Tuesday");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = 62;
+Message.msg_id = 61;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "61/2 Toronto Blue Jays to a 4-0 victory Tuesday");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 55;
+Message.msg_id = 55;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " 55 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ");
+Message.msg_len= strlen(Message.cb_msg);
+Message.dcs = MFW_DCS_8bits;
+handle_dummy_message (&Message);
+
+
+
+Message.sn = /*56*/0xC038;
+Message.msg_id = 55;
+Message.page = 1;
+Message.pages = 2;
+strcpy (Message.cb_msg, "55/2 1/2  Toronto Blue Jays to a 4-0 victory Tuesday Multipage");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = /*56*/0xC038;
+Message.msg_id = 56;
+Message.page = 2;
+Message.pages = 2;
+strcpy (Message.cb_msg, "56 2/2 Toronto Blue Jays to a 4-0 victory Tuesday Multipage");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 58;
+Message.msg_id = 58;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "58 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = /*56*/0xC038;
+Message.msg_id = 56;
+Message.page = 2;
+Message.pages = 2;
+strcpy (Message.cb_msg, "56 2/2 Toronto Blue Jays to a 4-0 victory Tuesday Multipage");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 45;
+Message.msg_id = 45;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "45 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+//#if 0
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 1;
+Message.pages = 15;
+strcpy (Message.cb_msg, "58 1/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 2;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 2/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 3;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 3/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 4;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 4/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 5;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 5/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 6;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 6/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 7;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 7/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 8;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 8/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 9;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 9/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 10;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 10/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 11;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 11/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 12;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 12/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 13;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 13/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 14;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 14/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 16384;
+Message.msg_id = 59;
+Message.page = 15;
+Message.pages = 15;
+strcpy (Message.cb_msg, "59 15/15 Toronto Blue Jays to a 4-0 victory Tuesday Multipage ***");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+//#endif
+
+#if 0
+
+
+
+
+Message.sn = 63;
+Message.msg_id = 63;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "63 Toronto Blue Jays to a 4-0 victory Tuesday");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+Message.sn = 64;
+Message.msg_id = 64;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "64 Toronto Blue Jays to a 4-0 victory Tuesday");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 65;
+Message.msg_id = 65;
+Message.page = 1;
+Message.pages = 3;
+strcpy (Message.cb_msg, "65 1/3 Toronto Blue Jays to a 4-0 victory Tuesday");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+Message.sn = 65;
+Message.msg_id = 65;
+Message.page = 2;
+Message.pages = 3;
+strcpy (Message.cb_msg, "65 2/3 Toronto Blue Jays to a 4-0 victory Tuesday 65");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+Message.sn = 65;
+Message.msg_id = 65;
+Message.page = 3;
+Message.pages = 3;
+strcpy (Message.cb_msg, "65 3/3 Toronto Blue Jays to a 4-0 victory Tuesday 65");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+Message.sn = 66;
+Message.msg_id = 66;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, "66 Toronto Blue Jays to a 4-0 victory Tuesday");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 67;
+Message.msg_id = 67;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 67");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 68;
+Message.msg_id = 68;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 68 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+Message.sn = 72;
+Message.msg_id = 72;
+Message.page = 1;
+Message.pages = 4;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 72:1 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 72;
+Message.msg_id = 72;
+Message.page = 2;
+Message.pages = 4;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 72:2 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 72;
+Message.msg_id = 72;
+Message.page = 3;
+Message.pages = 4;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 72:3 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 72;
+Message.msg_id = 72;
+Message.page =4;
+Message.pages = 4;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 72:4 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 73;
+Message.msg_id = 73;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 73 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+Message.sn = 74;
+Message.msg_id = 74;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 74");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 75;
+Message.msg_id = 75;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 75 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 77;
+Message.msg_id = 77;
+Message.page = 1;
+Message.pages = 2;
+strcpy (Message.cb_msg, "1/2 Toronto Blue Jays to a 4-0 victory Tuesday 77:1");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 77;
+Message.msg_id = 77;
+Message.page = 2;
+Message.pages = 2;
+strcpy (Message.cb_msg, "2/2 Toronto Blue Jays to a 4-0 victory Tuesday 77:2 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+//
+Message.sn = 78;
+Message.msg_id = 78;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 78");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 16386;
+Message.msg_id = 79;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 79 ");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 80;
+Message.msg_id = 80;
+Message.page = 1;
+Message.pages = 3;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 80:1");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+
+Message.sn = 80;
+Message.msg_id = 80;
+Message.page = 3;
+Message.pages = 3;
+strcpy (Message.cb_msg, "80 2/3 Yoronto Blue Jays to a 4-0 Tuesday:3");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+Message.sn = 80;
+Message.msg_id = 80;
+Message.page = 2;
+Message.pages = 3;
+strcpy (Message.cb_msg, "80 1/3 Toronto Blue Jays to Tuesday:2");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+
+DEBUG = TRUE;
+
+Message.sn = 83;
+Message.msg_id = 83;
+Message.page = 1;
+Message.pages = 1;
+strcpy (Message.cb_msg, " Toronto Blue Jays to a 4-0 victory Tuesday 83");
+Message.msg_len= strlen(Message.cb_msg);
+handle_dummy_message (&Message);
+#endif
+}
+
+#endif
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_init
+
+ $Description:	This is initialize the CB fifo and the attributes after switch on the mobile
+
+ $Returns:		
+ $Arguments:	
+ 
+*******************************************************************************/
+void sms_cb_init (void)
+{
+
+//for tracing
+#ifdef DEBUG_SMS_CB
+	 char buf [100];
+#endif 
+
+
+	UBYTE i;
+
+	
+	//set to the default, "FF" -> no CB messages stored
+	smscb_data.used_pointer = 0xFF;
+
+	//set to the default, "0" -> free spaces on the first index in fifo
+	smscb_data.free_pointer = 0;
+
+
+	//set the fifo to the default
+	for (i=0; i<MAX_STORED_PAGES -1 ; i++)	
+	{
+		smscb_data.cb_attributes[i].next_link = i + 1;
+	}
+
+	for (i=0; i<MAX_STORED_PAGES ; i++)	
+	{
+		smscb_data.cb_attributes[i].start_page = 0; 
+		smscb_data.cb_attributes[i].header = NULL;/* SPR 1920,ensure unalloacted pointers set to NULL*/
+	}
+
+
+
+	//"FF" on the last entry means end of the free spaces list
+	smscb_data.cb_attributes[MAX_STORED_PAGES-1].next_link  = 0xFF;
+	smscb_getCBsettings();
+	
+	if (settingsGetStatus(SettingsCBDisable))
+		smscb_setCBsettings(SMSCB_SWITCH_OFF);
+	else
+		smscb_setCBsettings(SMSCB_SWITCH_ON);
+//for tracing
+
+
+
+
+
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_exit
+
+ $Description:	This deallocates any memory. MC added for SPR 1920
+
+ $Returns:		
+ $Arguments:	
+ 
+*******************************************************************************/
+void sms_cb_exit (void)
+{
+	int i;
+	/*for each storage space*/
+	for (i=0;i<MAX_STORED_PAGES;i++)
+	{	/*if memory allocated, deallocate it*/
+		if(smscb_data.messages[i] != NULL)
+		{	mfwFree((U8*)smscb_data.messages[i], CB_PAGE_LENGTH);
+			smscb_data.messages[i] = NULL;
+		}
+	}
+	for(i=0; i<MAX_MIDS;i++)
+	{	if (smscb_data.cb_attributes[i].header != NULL)
+		{	FREE_MEMORY((void*)smscb_data.cb_attributes[i].header,sizeof(char)*25);
+			smscb_data.cb_attributes[i].header = NULL;
+		}
+	}
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_new_incoming_cb
+
+ $Description:	This function will be call after each NEW incoming cb messages.
+				It checks for free spaces and organize to save the cb messages
+				in the right order.
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+void sms_new_incoming_cb (T_MFW_SMS_CB *Message)
+{
+
+//only for tracing
+#ifdef DEBUG_SMS_CB
+	UBYTE i, test;
+#endif
+
+
+	//set to default
+	UBYTE result =0;
+	smscb_data.found_mid = FALSE;
+	smscb_data.clear_mid = FALSE;
+
+
+//only for tracing
+#ifdef DEBUG_SMS_CB
+	TRACE_EVENT("--------------start------------");
+#endif //DEBUG_SMS_CB
+
+
+	//search the new MID with the MID's in the fifo.
+	//used_pointer EQ 0xFF means there is no message in the fifo
+	if (smscb_data.used_pointer NEQ 0xFF)
+	{
+		result = sms_cb_search_mid (Message->msg_id, Message->sn);
+	}
+
+
+	//error: in searching mid
+	if (result EQ 0xAA)
+	{
+		TRACE_EVENT("sms cb ERROR, in searching mid");
+		return;
+	}
+
+
+	// does the message with the same MID already exist in the fifo ?
+	if(smscb_data.found_mid)
+	{
+		TRACE_EVENT("MID already exist");
+
+		sms_cb_delete_message (Message->msg_id);
+
+		
+		smscb_data.clear_mid = TRUE;
+	}
+
+
+	// does we have free space ?
+	if (smscb_data.free_pointer EQ 0xFF)
+	{
+		//no free spaces -> means overwrite the oldest message
+		sms_cb_overwrite_old_message (Message);
+		
+	}
+	else // does we have free space ?
+	{
+		//still free spaces 
+		sms_cb_store_message (Message);
+
+	}
+
+
+
+//only for tracing
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	TRACE_EVENT_P1("5 smscb_data.used_pointer %d ", smscb_data.used_pointer); 
+	
+	TRACE_EVENT_P1("5 smscb_data.free_pointer %d ", smscb_data.free_pointer); 
+	/***************************Go-lite Optimization changes end***********************/
+	TRACE_EVENT("--------------finish------------");
+	
+	
+#endif //DEBUG_SMS_CB
+
+}
+
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_store_message
+
+ $Description:	This function will be call when we have still free space for saving
+                 new incoming cb messages.
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_store_message (T_MFW_SMS_CB *Message)
+{
+
+	TRACE_FUNCTION("sms_cb_store_message");
+
+
+	//it is only for the first time
+	if (smscb_data.used_pointer EQ 0xFF)
+	{
+		// request for a free space
+		smscb_data.used_pointer = smscb_data.free_pointer;
+	}
+
+
+	//save the new message in the fifo
+	/*MC  SPR 1920 if memory not alloacted for message, allocate some*/
+	TRACE_EVENT_P1("Allocating memory to slot %d for CB message", smscb_data.free_pointer); 
+
+	if (smscb_data.messages[smscb_data.free_pointer] == NULL)
+		if ((smscb_data.messages[smscb_data.free_pointer] = (char*) mfwAlloc(sizeof(char)*CB_PAGE_LENGTH)) != NULL)
+			memcpy(smscb_data.messages[smscb_data.free_pointer], Message->cb_msg,CB_PAGE_LENGTH);
+
+	/*MC end*/
+	//save the attributes of the new cb
+	sms_cb_store_attributes (smscb_data.free_pointer, Message);
+
+	//set the status of the message
+	smscb_data.cb_attributes[smscb_data.free_pointer].status = UNREAD_MESSAGE;
+
+	//was it the last free space ?
+	if (smscb_data.cb_attributes[smscb_data.free_pointer].next_link EQ 0xFF)
+	{
+		//no more free space available
+
+		UBYTE temp, result;
+		
+
+		//keep the link-value for later
+		temp = smscb_data.used_pointer;
+
+		//find the termination in the link list
+		result = sms_cb_find_termination (&smscb_data.used_pointer);			
+		
+		//error: couldnt find the termination ?!
+		if (result EQ 0xAA)
+		{
+			TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+			return 0;   // RAVI
+		}
+
+
+		//update the link-list
+		smscb_data.cb_attributes[smscb_data.used_pointer].next_link = smscb_data.free_pointer;
+
+		//no more free space
+		smscb_data.free_pointer = 0xFF;
+
+		//update the used pointer
+		smscb_data.used_pointer = temp;
+
+		//did it clear before ?
+		if (smscb_data.clear_mid)
+		{
+			smscb_data.used_pointer = smscb_data.result_used;
+		}
+
+
+	}
+	else //was it the last free space ?
+	{
+		//no, still free space available
+
+		UBYTE temp, temp_2, result;
+
+		//keep the usedpointer-value for later
+		temp_2 = smscb_data.used_pointer;
+
+
+		//keep the link-value for later
+		temp = smscb_data.cb_attributes[smscb_data.free_pointer].next_link;
+
+
+		//terminate the used list
+		smscb_data.cb_attributes[smscb_data.free_pointer].next_link = 0xFF;
+
+
+		//find the termination in the link list
+		result = sms_cb_find_termination (&smscb_data.used_pointer);			
+
+		//error: couldnt find the termination ?!
+		if (result EQ 0xAA)
+		{
+			TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+			return 0;
+		}
+
+
+		//update the use pointer
+		if (smscb_data.used_pointer NEQ smscb_data.free_pointer)
+		{
+			smscb_data.cb_attributes[smscb_data.used_pointer].next_link = smscb_data.free_pointer;
+		}
+
+	
+		// update the free pointer as well
+		smscb_data.free_pointer = temp;
+
+
+		//did it clear before ?
+		if (smscb_data.clear_mid)
+		{
+			smscb_data.used_pointer = smscb_data.result_used;
+		}
+		else
+		{
+			//update the used pointer
+			 smscb_data.used_pointer = temp_2 ;
+		}
+	
+
+	}
+	//ADDED BY RAVI- 28-11-2005
+	return 1;
+	//END RAVI - 28-11-2005
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_overwrite_old_message
+
+ $Description:	This function will be call when we don't have free space for saving
+                 new incoming cb messages. The new cb just overwrite the 
+                 oldest cb in the fifo.
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_overwrite_old_message (T_MFW_SMS_CB *Message)
+{
+//	UBYTE temp, temp_2, result;   // RAVI
+
+//only tracing
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	TRACE_EVENT_P1("used_pointer= %d ", smscb_data.used_pointer); 			
+	TRACE_EVENT_P1("pages = %d, ", smscb_data.cb_attributes[smscb_data.used_pointer].pages); 			
+	TRACE_EVENT_P1("page = %d ", smscb_data.cb_attributes[smscb_data.used_pointer].page); 			
+	TRACE_EVENT_P1( "mid = %d ", smscb_data.cb_attributes[smscb_data.used_pointer].mid); 
+	/***************************Go-lite Optimization changes end***********************/
+#endif //DEBUG_SMS_CB
+
+
+	TRACE_EVENT("sms_cb_overwrite_old_message");
+
+	//keep the value for later
+//	temp = smscb_data.used_pointer;
+
+
+	//find the page in the fifo with the same MID number & delete them
+	sms_cb_delete_message (smscb_data.cb_attributes[smscb_data.used_pointer].mid);
+
+
+	//now we have free space to store the new incoming cb message	
+	sms_cb_store_message (Message);
+
+	return 1;    // ADDED BY RAVI - 28-11-2005
+
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_store_attributes
+
+ $Description:	Store the attributes of the new incoming cb 
+
+				Attributes are stored seperatly from the message text
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+
+void sms_cb_store_attributes (UBYTE position, T_MFW_SMS_CB *Message)
+{
+	smscb_data.cb_attributes[position].sn	= Message->sn;
+	smscb_data.cb_attributes[position].mid	= Message->msg_id;
+	smscb_data.cb_attributes[position].dcs	= Message->dcs;
+	smscb_data.cb_attributes[position].page	= Message->page;
+	smscb_data.cb_attributes[position].pages      = Message->pages;
+	smscb_data.cb_attributes[position].msg_len    = Message->msg_len;	
+
+}
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_search_mid
+
+ $Description:	This function searchs the new incoming message in the 
+                fifo for the already existing stored messages.
+                If true, the stored messages in the fifo will be removed 
+
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_search_mid (USHORT mid ,SHORT sn)
+{
+	UBYTE temp, i=0;
+	SHORT update_number_mask = 0x0F;
+
+	temp = smscb_data.used_pointer;
+
+
+	if (smscb_data.cb_attributes[temp].mid EQ mid)
+	{
+		//found the mid in the fifo
+		TRACE_EVENT("Matching MID");
+		if ((smscb_data.cb_attributes[temp].sn & update_number_mask) NEQ
+			(sn & update_number_mask) )
+		{
+		   //the new cb is the update of the existing one 
+			smscb_data.found_mid = TRUE;
+   		   TRACE_EVENT("found = True, return");
+			return temp;
+		}
+		/*SPR 2429, return this index as otherwise there will be two
+		copies of the same message*/
+		TRACE_EVENT("Serial numbers match");
+		return temp;
+	}
+
+
+	while (smscb_data.cb_attributes[temp].next_link NEQ 0xFF)
+	{
+		
+		// going through the link list
+		temp = smscb_data.cb_attributes[temp].next_link;
+
+
+		if (smscb_data.cb_attributes[temp].mid EQ mid)
+		{
+			//found the mid in the fifo
+			TRACE_EVENT_P1("Matching MID at location:%d", temp);
+			if ((smscb_data.cb_attributes[temp].sn & update_number_mask) NEQ
+				(sn & update_number_mask) )
+			{
+
+			   //the new cb is the update of the existing one in the fifo
+				smscb_data.found_mid = TRUE;
+				return temp;
+				
+				
+			}
+		/*SPR 2429, return this index as otherwise there will be two
+		copies of the same message*/
+			TRACE_EVENT("Serial numbers match");
+			return temp;/*SHould just replace old one with new one anyway*/
+		}
+		
+
+		// only to be sure there is a ever ending loop
+		i++;
+		if (i > MAX_STORED_PAGES)	
+			return 0xAA;
+	}
+	
+	return temp;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_delete_message
+
+ $Description:	This function delete the messages in the fifo, even for multipages
+           
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_delete_message (USHORT mid)
+{
+
+//only tracing
+#ifdef DEBUG_SMS_CB
+	char buf[100];
+#endif 
+
+	UBYTE temp, temp_2, result;   // , i=0;  // RAVI
+
+	TRACE_EVENT("sms_cb_delete_message");
+
+
+	//keep the value for later
+	temp_2 = smscb_data.used_pointer;
+
+
+	// keep the value for later
+	smscb_data.start_used = smscb_data.used_pointer;
+
+	//search for the first page of the multipages
+	smscb_data.start_used = sms_cb_find_startpoint (mid, smscb_data.used_pointer);
+
+	//error: couldnt find the termination ?!
+	if (smscb_data.start_used EQ 0xAA)
+	{
+		TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+		return 0;  // RAVI
+	}
+
+
+	//found immediately ?
+	if (smscb_data.start_used EQ smscb_data.used_pointer)
+	{
+		//is in the OLDEST position in the fifo
+
+		TRACE_EVENT("message in oldest position in FIFO");		
+		
+		//keep the value for later
+		temp = smscb_data.used_pointer;
+
+		//search for the last page 
+		smscb_data.end_used = sms_cb_find_endpoint (mid, smscb_data.used_pointer);
+
+
+		//error: couldnt find the termination ?!
+		if (smscb_data.end_used EQ 0xAA)
+		{
+			TRACE_EVENT("sms cb ERROR");
+			return 0;  // RAVI
+		}
+
+
+
+		if ( (smscb_data.cb_attributes[smscb_data.used_pointer].next_link EQ 0xFF) &&
+				(smscb_data.cb_attributes[smscb_data.used_pointer].mid EQ mid) ) 
+		{
+			//it is the oldest cb and also the only one in the fifo
+			TRACE_EVENT("oldest position and the only one in the list");
+
+
+			//deleted messages -> now more space availabe -> update the free pointer
+			result = sms_cb_update_free_pointer (temp);
+
+			//terminate the free pointer list 
+			//smscb_data.cb_attributes[smscb_data.end_used].next_link = 0xFF;
+
+			//error: couldnt find the termination ?!
+			if (result EQ 0xAA)
+			{
+				TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+				return 0;
+			}
+
+			//no anymore cb message in the fifo
+			//terminate the use list
+			smscb_data.used_pointer = 0xFF;
+
+			smscb_data.result_used = result;
+
+		}
+		else
+		{
+			//deleted messages -> now more space availabe -> update the free pointer
+			result = sms_cb_update_free_pointer (temp);
+
+			//terminate the free pointer list 
+			smscb_data.cb_attributes[smscb_data.end_used].next_link = 0xFF;
+
+
+			//error: couldnt find the termination ?!
+			if (result EQ 0xAA)
+			{
+				TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+				return 0;	
+			}
+
+		}
+	
+	
+	}
+	else //found immediately ?
+	{
+
+		//keep the value for later
+		temp = smscb_data.used_pointer;
+
+		//search for the last page of the multipages
+		smscb_data.end_used = sms_cb_find_endpoint (mid, smscb_data.used_pointer);
+
+		if (smscb_data.start_used EQ 0xAA)
+		{
+			TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+			return 0;
+		}
+
+
+		if (smscb_data.cb_attributes[smscb_data.used_pointer].next_link EQ 0xFF &&
+			smscb_data.cb_attributes[smscb_data.used_pointer].mid EQ mid)
+		{
+			//is in the the latest position in the fifo
+
+			TRACE_EVENT("multipage is in the latest position");
+			
+			//terminate the position where the multipage began
+			smscb_data.cb_attributes[smscb_data.start_used].next_link= 0xFF;
+
+
+			//deleted messages -> now more space availabe -> update the free pointer
+			result = sms_cb_update_free_pointer (temp);
+
+			//terminate the free pointer list 
+			smscb_data.cb_attributes[smscb_data.used_pointer].next_link = 0xFF;
+
+
+			//error: couldnt find the termination ?!
+			if (result EQ 0xAA)
+			{
+				TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+				return 0;
+			}
+
+			smscb_data.result_used = temp_2;
+			smscb_data.used_pointer = temp_2;
+
+			
+		}
+		else
+		{
+			//is in the middle position in the fifo
+
+			TRACE_EVENT("multipage is in the middle position");
+			
+			//update the link list
+			smscb_data.cb_attributes[smscb_data.start_used].next_link = smscb_data.used_pointer;		
+
+			//deleted messages -> now more space availabe -> update the free pointer
+			result = sms_cb_update_free_pointer (temp);
+
+			//terminate the free pointer list 
+			smscb_data.cb_attributes[smscb_data.end_used].next_link = 0xFF;
+
+
+
+		
+
+
+			//error: couldnt find the termination ?!
+			if (result EQ 0xAA)
+			{
+				TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+				return 0;
+			}
+
+
+			smscb_data.result_used = temp_2;		
+
+		}
+			
+
+	}
+       return 1;   // ADDED BY RAVI - 28-11-2005
+
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_find_startpoint
+
+ $Description:	find the startpoint of the multipage. It is also used for singlepage.
+
+           
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_find_startpoint (USHORT mid, UBYTE start_used)
+{
+	UBYTE i = 0;
+
+//only tracing
+#ifdef DEBUG_SMS_CB
+//	char buf[100];
+
+	TRACE_EVENT("in sms_cb_find_startpoint ");	
+#endif //DEBUG_SMS_CB
+
+
+	//search for the first page of the multipages
+	while (smscb_data.cb_attributes[smscb_data.used_pointer].mid NEQ mid)
+	{
+	
+		start_used = smscb_data.used_pointer;
+
+		// going through the link list
+		smscb_data.used_pointer = smscb_data.cb_attributes[smscb_data.used_pointer].next_link;
+	
+			// only to be sure there is a ever ending loop
+			i++;
+			if (i > MAX_STORED_PAGES)	
+				return 0xAA;
+	}
+
+//only tracing
+TRACE_EVENT_P1("start_used: %d", start_used);
+
+	return start_used;
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_find_startpoint
+
+ $Description:	find the lastpage of the multipage.
+ 				It is also used for the singlepage but in this case the 
+ 				end_used will be equal to used_pointer
+           
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_find_endpoint (USHORT mid, UBYTE end_used)
+{
+	UBYTE i = 0;
+
+
+
+	//search for the last page of the multipages
+	while (smscb_data.cb_attributes[smscb_data.used_pointer].mid EQ mid &&
+			smscb_data.cb_attributes[smscb_data.used_pointer].next_link NEQ 0xFF )
+	{
+	
+		end_used = smscb_data.used_pointer;
+
+		// going through the link list
+		smscb_data.used_pointer = smscb_data.cb_attributes[smscb_data.used_pointer].next_link;
+	
+		// only to be sure there is a ever ending loop
+		i++;
+		if (i > MAX_STORED_PAGES)	
+			return 0xAA;
+	}
+
+
+TRACE_EVENT_P1("end_used: %d", end_used);
+
+	return end_used;
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_update_free_pointer
+
+ $Description:	This function is updating the free pointer after deleting 
+		 		cb messages in the fifo (space available !)
+
+           
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_update_free_pointer (UBYTE temp)
+{
+	UBYTE update=0, i=0;
+      
+
+	TRACE_EVENT("sms_cb_update_free_pointer");
+
+
+TRACE_EVENT_P1("temp index:%d", temp); 
+	if (smscb_data.free_pointer EQ 0xFF)
+	{TRACE_EVENT("free pointer = 0xff"); 
+		//take the old used_pointer (before of deleting the messages)
+		smscb_data.free_pointer = temp;
+		/*MC SPR 1920, free the message slot*/
+		mfwFree( (U8*)smscb_data.messages[temp], sizeof(char)*CB_PAGE_LENGTH);
+		smscb_data.messages[temp] = NULL;
+	}
+	else
+	{
+		/*MC SPR 2429 free the message slot here too*/
+		mfwFree( (U8*)smscb_data.messages[temp], sizeof(char)*CB_PAGE_LENGTH);
+		smscb_data.messages[temp] = NULL;
+		
+		//
+		update = smscb_data.free_pointer;
+		TRACE_EVENT_P1("free pointer:%d",smscb_data.free_pointer) ; 
+		//
+		while (smscb_data.cb_attributes[smscb_data.free_pointer].next_link NEQ 0xFF)
+		{
+
+			// going through the link list
+			smscb_data.free_pointer = smscb_data.cb_attributes[smscb_data.free_pointer].next_link;
+			TRACE_EVENT_P1("free pointer:%d",smscb_data.free_pointer) ; 
+		
+			// only to be sure there is a ever ending loop
+			i++;
+			if (i > MAX_STORED_PAGES)	
+				return 0xAA;
+		}
+
+
+		//continue the free pointer link list to the new deleted multipage
+		smscb_data.cb_attributes[smscb_data.free_pointer].next_link = temp;
+
+
+		//show on the first deleted multipage 
+		smscb_data.free_pointer = update;
+
+		
+	}
+
+
+	//indicate that we deleted cb messages
+	smscb_data.clear_mid = TRUE;
+
+
+	//need for later
+	smscb_data.result_used = smscb_data.used_pointer;
+
+TRACE_EVENT_P1("used pointer: %d", smscb_data.used_pointer);
+//only for tracing 
+
+
+	return update;
+
+
+}
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_find_termination
+
+ $Description:	This function search for the termination in the link list.
+ 				It jumps from one link to the another link until he founds 
+ 				the termination "0xFF"
+           
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_find_termination (UBYTE *used)
+{
+	UBYTE i=0;
+	
+	while (smscb_data.cb_attributes[*used].next_link NEQ 0xFF)
+	{
+		// going through the link list
+		*used = smscb_data.cb_attributes[*used].next_link;
+	
+		// only to be sure there is a ever ending loop
+		i++;
+		if (i > MAX_STORED_PAGES)	
+			return 0xAA;
+
+	}
+
+	return *used;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_count_messages
+
+ $Description:	This function counts messages in the fifo.
+ 				! Multipage are counted as one page !
+           
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_count_messages ( void )
+{
+	UBYTE i=0, count=0, used, page, pages, mid, start_flag = 1; //, temp_used;
+
+
+	for (i=0; i<MAX_STORED_PAGES ; i++)	
+	{
+		smscb_data.cb_attributes[i].start_page = 0; 
+	}
+	i=0;
+
+
+	if (smscb_data.used_pointer EQ 0xFF)
+	{
+		//there are no cb messages in the fifo
+		return count;
+	}
+		
+	used =	smscb_data.used_pointer;
+
+	while ( i < MAX_STORED_PAGES)
+	{
+
+		//single or multipage ?
+		if(smscb_data.cb_attributes[used].pages EQ 0x01)
+		{
+			//Singlepage
+
+			start_flag = 1;
+			/***************************Go-lite Optimization changes Start***********************/
+			//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+			TRACE_EVENT_P2("11 : used%d, count%d", used,count); 
+			
+			/***************************Go-lite Optimization changes end***********************/
+			//indicate the first page, even for singlepage
+			smscb_data.cb_attributes[used].start_page = 0x55;
+			
+			TRACE_EVENT_P1("1 set Flag at %d", used); 
+
+			//check, is it the last message in the link list
+			//if yes, not necessary to go through the link list
+			if (smscb_data.cb_attributes[used].next_link NEQ 0xFF)
+			{
+				count ++;
+
+				// going through the link list
+				used = smscb_data.cb_attributes[used].next_link;		
+			}
+
+			//is it the last message in the fifo ?
+			if (smscb_data.cb_attributes[used].next_link EQ 0xFF)
+			{
+				/***************************Go-lite Optimization changes Start***********************/
+				//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+				TRACE_EVENT_P2("1 : used%d,count%d", used,count); 
+				/***************************Go-lite Optimization changes end***********************/
+
+				//indicate the first page, even for singlepage
+				smscb_data.cb_attributes[used].start_page = 0x55;
+					
+				
+				TRACE_EVENT_P1("2 set Flag at %d", used); 
+
+				count ++;	
+				return count;
+			}
+
+			
+		}
+		else //single or multipage ?
+		{
+
+			//Multipage
+			if (start_flag)
+			{
+
+				//indicate the first page, even for singlepage
+				smscb_data.cb_attributes[used].start_page = 0x55;
+/***************************Go-lite Optimization changes Start***********************/
+//	Aug 16, 2004    REF: CRR 24323   Deepa M.D				
+				TRACE_EVENT_P1("3 set Flag at %d", used); 
+/***************************Go-lite Optimization changes end***********************/			
+			}
+				
+			
+			page = 	smscb_data.cb_attributes[used].page;
+			pages = smscb_data.cb_attributes[used].pages;
+			mid = smscb_data.cb_attributes[used].mid;
+
+			//check, is it the last message in the link list
+			//if yes, not necessary to go through the link list
+			if (smscb_data.cb_attributes[used].next_link NEQ 0xFF)
+			{
+				// going through the link list
+				used = smscb_data.cb_attributes[used].next_link;		
+			}
+
+			
+			//is it the last message in the fifo ?
+			if (smscb_data.cb_attributes[used].next_link EQ 0xFF)
+			{
+
+				//The last page, does it still continue or does it complete 
+				//the multipage ?
+				if( smscb_data.cb_attributes[used].pages EQ pages   &&  
+				   smscb_data.cb_attributes[used].page EQ (page+1) &&
+				   smscb_data.cb_attributes[used].page EQ smscb_data.cb_attributes[used].pages)
+				{
+					//this one was the last page of the multipage and 
+					//the last one in the fifo
+					/***************************Go-lite Optimization changes Start***********************/
+					//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+					TRACE_EVENT_P2("5 : used%d,count%d", used,count); 
+					/***************************Go-lite Optimization changes end***********************/
+					start_flag = 0;
+
+					count ++;	
+					return count;
+				}
+				else
+				{
+					//the multipage is not complete yet
+
+					if (smscb_data.cb_attributes[used].mid EQ mid)
+					{
+
+						start_flag = 0;
+						/***************************Go-lite Optimization changes Start***********************/
+						//	Aug 16, 2004    REF: CRR 24323   Deepa M.D	
+						TRACE_EVENT_P2("6 : used%d,count%d", used,count); 
+						/***************************Go-lite Optimization changes end***********************/
+						count ++;
+						
+						return count;
+					}
+					else
+					{
+
+						//this is a different page , it means the multipage before
+						//is uncomplete !
+						
+						start_flag = 0;
+
+
+						//indicate the first page, even for singlepage
+						smscb_data.cb_attributes[used].start_page = 0x55;
+						/***************************Go-lite Optimization changes Start***********************/
+						//	Aug 16, 2004    REF: CRR 24323   Deepa M.D		
+						TRACE_EVENT_P1("4 set Flag at %d", used); 
+						/***************************Go-lite Optimization changes end***********************/
+
+						//the page before is a uncomplete multipage
+						//and the last message is a single page
+						// ->count twice 
+						count+=2;
+						/***************************Go-lite Optimization changes Start***********************/
+						//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+						TRACE_EVENT_P2("7 : used%d,count%d", used,count); 
+						/***************************Go-lite Optimization changes end***********************/
+						return count;
+
+					}
+				}
+		
+			}
+			else
+			{
+				if( smscb_data.cb_attributes[used].pages EQ pages &&  
+				   smscb_data.cb_attributes[used].page EQ (page+1))
+				{
+					//still continue
+					/***************************Go-lite Optimization changes Start***********************/
+					//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+					
+					TRACE_EVENT_P2("3 : used%d,count%d", used,count); 
+					/***************************Go-lite Optimization changes end***********************/
+					start_flag = 0;
+					
+				}
+				else
+				{
+					//there is a new page starting
+
+					
+					start_flag = 1;
+
+					count ++;	
+					/***************************Go-lite Optimization changes Start***********************/
+					//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+					
+					TRACE_EVENT_P2("4 : used%d,count%d", used,count); 
+					/***************************Go-lite Optimization changes end***********************/
+				}
+			}
+			
+		}
+
+
+		// only to be sure there is a ever ending loop
+		i++;
+	}
+
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_count_unread_messages
+
+ $Description:	This function counts the unread messages in the fifo
+           
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+UBYTE sms_cb_count_unread_messages (void)
+{
+	UBYTE i=0, m=0, used;
+
+used = smscb_data.used_pointer;
+	
+	while (smscb_data.cb_attributes[used].next_link NEQ 0xFF)
+	{
+		// count only the unread messages
+		if (smscb_data.cb_attributes[used].status EQ UNREAD_MESSAGE)
+			m ++;
+		
+		// going through the link list
+		used = smscb_data.cb_attributes[used].next_link;
+	
+		// only to be sure there is a ever ending loop
+		i++;
+		if (i > MAX_STORED_PAGES)	
+			return 0xAA;
+
+	}
+
+
+	// have a check of the last one
+	if (smscb_data.cb_attributes[used].status EQ UNREAD_MESSAGE)
+		m ++;
+
+
+#ifdef DEBUG_SMS_CB
+	/***************************Go-lite Optimization changes Start***********************/
+	//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	TRACE_EVENT_P1("count unread %d ", m); 
+	/***************************Go-lite Optimization changes end***********************/
+#endif
+
+	return m;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_give_position_of_msg
+
+ $Description:	You give the position (order of the msg from oldest to the latest)
+ 				and he gives you the real positon of the link list
+           
+ $Returns:		
+
+ $Arguments:	used : current used_pointer
+ 
+*******************************************************************************/
+UBYTE sms_cb_give_position_of_msg (UBYTE used, UBYTE positon)
+{
+	UBYTE i=0, m=0;
+	
+	while ( (smscb_data.cb_attributes[used].next_link NEQ 0xFF)  &&
+		   (i NEQ positon) )
+	{
+
+		// going through the link list
+		used= smscb_data.cb_attributes[used].next_link;
+
+		// only to be sure there is a ever ending loop
+		if (smscb_data.cb_attributes[used].start_page EQ 0x55)
+		{
+			i++;
+		}
+
+
+		
+		if (m > MAX_STORED_PAGES)	
+			return 0xAA;
+
+		m++;
+
+	}
+
+	//return the positon in the link list 
+	return  used;
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_select_read
+
+ $Description:	called by pressing the read item in SMS-Broadcast
+ 
+ $Returns:		
+
+ $Arguments:	
+
+
+ *******************************************************************************/
+int sms_cb_select_read (MfwMnu* m, MfwMnuItem* i)
+{
+
+	sms_cb_read_msg (ALL_MESSAGE);
+    return 1;
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_read_msg
+
+ $Description:	This function prepare to read the cb messages
+ 				It could be call from everywhere.
+ 
+ $Returns:		
+
+ $Arguments:	
+
+
+ *******************************************************************************/
+int sms_cb_read_msg (T_SMSCB_STATUS status)
+{
+	UBYTE result;  //, i;  // RAVI
+
+
+    T_MFW_HND win = mfwParent(mfw_header());
+
+	TRACE_FUNCTION("sms_cb_read_msg");
+
+
+
+	//count the number of the stored messages in the fifo
+
+	result = sms_cb_count_messages ();
+
+	if (result EQ 0x00)
+	{
+		TRACE_EVENT("sms cb ERROR, there are 0 cb messages");
+	}
+
+
+	if((smscb_data.used_pointer EQ 0xFF) || (result EQ 0x00))
+	{
+		TRACE_EVENT("There is no cb message stored");
+
+		info_screen(0, TxtEmptyList ,TxtNull, NULL); 
+	}
+	else
+	{
+/***************************Go-lite Optimization changes Start***********************/
+//	Aug 16, 2004    REF: CRR 24323   Deepa M.D	
+		TRACE_EVENT_P1("Total msg%d ", result);			
+/***************************Go-lite Optimization changes end***********************/
+		if (result EQ 0xAA)
+		{
+			TRACE_EVENT("sms cb ERROR, couldnt find the termination");
+			return 0;  // RAVI
+		}
+
+
+		//keep this value for the callback function from menu-list
+		smscb_data.total_number = result;
+
+		//set the reason of reading
+		//read "all_message" , "unread_message", ..........
+		smscb_data.current_status = status;
+
+		//fill up the menu list attributes
+		smscb_data.cb_list_attributes = sms_cb_create_list (smscb_data.total_number);
+
+
+		//show the menu list on the screen now
+	    listDisplayListMenu (win, smscb_data.cb_list_attributes ,(ListCbFunc)sms_cb_list_cb,0);
+
+	}
+	
+    return 1;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_create_list
+
+ $Description:	Prepare the items for the menu list
+    	     
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+static ListMenuData * sms_cb_create_list (UBYTE number)
+{
+  UBYTE i = 0, used, next_used, number_multipg =1;  // RAVI - Removed - page, pages, variable.  , control_bit=0;
+
+
+  ListMenuData *list_menu_data = (ListMenuData *)ALLOC_MEMORY (sizeof(ListMenuData));
+
+  if (list_menu_data EQ 0)
+  {
+	TRACE_EVENT ("failed to create the list for cb");
+    return NULL;
+  }
+
+
+  list_menu_data->List = (T_MFW_MNU_ITEM *) ALLOC_MEMORY (number * sizeof (T_MFW_MNU_ITEM));
+
+
+  if (list_menu_data->List EQ 0)
+  {
+	TRACE_EVENT ("failed to create the list for cb");
+    return NULL;
+  }
+
+	TRACE_EVENT ("sms_cb_create_list ()");  
+
+
+	//take the current position in the fifo
+	used = smscb_data.used_pointer;
+
+
+  /*
+   * Fill Menu List
+   */
+
+
+  	//until to reach the end of the fifo
+	while ( smscb_data.cb_attributes[used].next_link NEQ 0xFF )
+	{
+
+		if (smscb_data.cb_attributes[used].start_page EQ 0x55)
+		{
+			mnuInitDataItem(&list_menu_data->List[i]);
+
+		   	next_used = used;
+
+			// going through the link list 
+			next_used = smscb_data.cb_attributes[next_used].next_link;
+
+
+
+			//before  we put the item for a multipage, we have to
+			//know how long it is.
+			//This is counting the number of pages belongs to a multipage
+			//Every multipage &singlepage starts with the indication 0x55
+			while(smscb_data.cb_attributes[next_used].start_page NEQ 0x55)
+			{
+				//sprintf(buf, "number_multipg %d in while", number_multipg); 
+				//TRACE_EVENT(buf);			
+				
+				number_multipg++;
+
+				//go out when we reach the end of the link list
+				if (smscb_data.cb_attributes[next_used].next_link EQ 0xFF)
+					break;
+
+				// going through the link list & take the next cb message
+				next_used = smscb_data.cb_attributes[next_used].next_link;
+			}
+
+
+
+			//fill up the header 
+			//"MID" + "available Page" + "Total page"
+			//the user release the uncomplete page about the available page.
+			/*SPR1920, allocate memory for header string*/
+			if (smscb_data.cb_attributes[used].header == NULL)
+				smscb_data.cb_attributes[used].header = (char*)ALLOC_MEMORY(sizeof(char)*25);
+	    	sprintf(smscb_data.cb_attributes[used].header,"MID%d,%d/%d", smscb_data.cb_attributes[used].mid, 
+   								number_multipg, smscb_data.cb_attributes[used].pages);
+		
+	    	list_menu_data->List[i].str =(char *) smscb_data.cb_attributes[used].header;
+
+			//set item to visible
+			if (smscb_data.current_status EQ ALL_MESSAGE)
+			{
+				//show all the cb messages
+		        list_menu_data->List[i].flagFunc = item_flag_none;
+			}
+			else if (smscb_data.current_status EQ UNREAD_MESSAGE)
+			{
+				if (smscb_data.cb_attributes[used].status EQ smscb_data.current_status)
+					list_menu_data->List[i].flagFunc = item_flag_none;
+				else
+					list_menu_data->List[i].flagFunc = item_flag_hide;				
+			}
+
+			i++;
+			number_multipg = 1;
+
+			
+		}
+
+		// going through the link list & take the next cb message
+		used = smscb_data.cb_attributes[used].next_link;
+
+		// only to be sure there is a ever ending loop
+		if (i > MAX_STORED_PAGES)	
+			return NULL;
+	}
+
+
+		number_multipg = 1;
+
+		//fill up the last message of the fifo !!
+		if (smscb_data.cb_attributes[used].start_page EQ 0x55)
+		{
+			mnuInitDataItem(&list_menu_data->List[i]);
+
+			//fill up the header 
+			//"MID" + "available Page" + "Total page"
+			//the user release the uncomplete page about the available page.
+			/*SPR1920, allocate memory for header string*/
+			if (smscb_data.cb_attributes[used].header == NULL)
+				smscb_data.cb_attributes[used].header = (char*)ALLOC_MEMORY(sizeof(char)*25);
+	    	sprintf(smscb_data.cb_attributes[used].header,"MID%d,%d/%d", smscb_data.cb_attributes[used].mid, 
+   								number_multipg, smscb_data.cb_attributes[used].pages);
+
+		
+	    	list_menu_data->List[i].str =(char *) smscb_data.cb_attributes[used].header;
+
+			//set item to visible
+			if (smscb_data.current_status EQ ALL_MESSAGE)
+			{
+				//show all the cb messages
+		        list_menu_data->List[i].flagFunc = item_flag_none;
+			}
+			else if (smscb_data.current_status EQ UNREAD_MESSAGE)
+			{
+				if (smscb_data.cb_attributes[used].status EQ smscb_data.current_status)
+					list_menu_data->List[i].flagFunc = item_flag_none;
+				else
+					list_menu_data->List[i].flagFunc = item_flag_hide;				
+			}
+		}
+
+
+
+
+
+  /*
+   * Fill common parameter for list handling
+   */
+
+
+  list_menu_data->ListLength     = number;
+  list_menu_data->ListPosition     = 1;
+  list_menu_data->CursorPosition  = 1;
+  list_menu_data->SnapshotSize   = number;
+  list_menu_data->Font           = 0;
+  list_menu_data->LeftSoftKey     = TxtSoftSelect;
+  list_menu_data->RightSoftKey    = TxtSoftBack;
+  /* SPR#1428 - SH - Add select key to list */
+  list_menu_data->KeyEvents      = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN | KEY_MNUSELECT;
+  list_menu_data->Reason         = 0;
+  list_menu_data->Strings        = TRUE;
+  list_menu_data->Attr           = (MfwMnuAttr*)&sms_cb_menuAttrib;
+  list_menu_data->autoDestroy    = TRUE; 
+
+  return list_menu_data;
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_list_cb
+
+ $Description:	callback function of the menu list 
+    	     
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+
+static void sms_cb_list_cb(T_MFW_HND win, ListMenuData * ListData)
+{
+	UBYTE number, selected_postion;	
+	int i;/*SPR 1920*/
+
+
+	TRACE_FUNCTION ("sms_cb_list_cb()");
+
+    switch (ListData->Reason)
+    {
+		case LISTS_REASON_SELECT: /*  */
+	
+			
+			//
+			selected_postion = sms_cb_give_position_of_msg (smscb_data.used_pointer, ListData->ListPosition);
+
+			
+			//display the selected message on the scree		
+			sms_cb_show_cb_message (selected_postion);
+			
+
+			//destroy the list menu 
+			listsDestroy(ListData->win);
+
+			//counted the total number of cb msg before created the menu list
+			number = smscb_data.total_number;
+
+			
+			FREE_MEMORY ((UBYTE *)smscb_data.cb_list_attributes->List, number * sizeof (T_MFW_MNU_ITEM));
+			FREE_MEMORY ((UBYTE *)smscb_data.cb_list_attributes, sizeof (ListMenuData));
+			/* SPR 1920 if any memory alloacted for list headers, deallocate it*/
+			for(i=0; i<MAX_MIDS;i++)
+			{	if (smscb_data.cb_attributes[i].header != NULL)
+				{	FREE_MEMORY((void*)smscb_data.cb_attributes[i].header,sizeof(char)*25);
+					smscb_data.cb_attributes[i].header = NULL;
+				}
+			}
+	    break;
+
+		case LISTS_REASON_BACK: /* back to previous menu */
+
+			TRACE_EVENT("pressed Back-key");
+
+			//destroy the list menu 
+			listsDestroy(ListData->win);
+
+			//counted the total number of cb msg before created the menu list
+			number = smscb_data.total_number;
+
+			FREE_MEMORY ((UBYTE *)smscb_data.cb_list_attributes->List, number * sizeof (T_MFW_MNU_ITEM));
+			FREE_MEMORY ((UBYTE *)smscb_data.cb_list_attributes, sizeof (ListMenuData));
+			/* SPR 1920 if any memory alloacted for list headers, deallocate it*/
+			for(i=0; i<MAX_MIDS;i++)
+			{	if (smscb_data.cb_attributes[i].header != NULL)
+				{	FREE_MEMORY((void*)smscb_data.cb_attributes[i].header,sizeof(char)*25);
+					smscb_data.cb_attributes[i].header = NULL;
+				}
+			}
+	    break;
+		default:
+	    return;
+    }
+
+
+
+}
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_list_cb
+
+ $Description:	open a editor to show the cb message
+    	     
+ $Returns:		
+
+ $Arguments:	
+ 
+*******************************************************************************/
+void sms_cb_show_cb_message(UBYTE link_list_position)
+{
+
+    T_MFW_HND win = mfwParent(mfw_header());
+
+#ifdef NEW_EDITOR
+	T_AUI_EDITOR_DATA editor_data;	/* SPR#1428 - SH - New Editor data */
+#else
+	T_EDITOR_DATA editor_data;
+#endif
+
+	UBYTE number_multipg =1, temp, next_used; 
+
+	//char buf[60];
+		
+   	next_used = link_list_position;
+
+	//check : is it the end of the link list
+	//if yes, not necassary to go through the link list
+	if (smscb_data.cb_attributes[next_used].next_link NEQ 0xFF)
+	{
+		// going through the link list 
+		next_used = smscb_data.cb_attributes[next_used].next_link;
+	}
+
+	//if the multipage contain more than one page, find out
+	//how many pages !
+	//This is counting the number of pages belongs to a multipage
+	//Every multipage & singlepge starts with the indication 0x55
+	while(smscb_data.cb_attributes[next_used].start_page NEQ 0x55)
+	{
+		//sprintf(buf, "number_multipg %d", number_multipg); 
+		//TRACE_EVENT(buf);			
+
+		number_multipg++;
+
+		if (smscb_data.cb_attributes[next_used].next_link EQ 0xFF)
+			break;
+
+		// going through the link list & take the next cb message
+		next_used = smscb_data.cb_attributes[next_used].next_link;
+	}
+
+	//sprintf(buf, "number_multipg %d after..", number_multipg); 
+	//TRACE_EVENT(buf);			
+
+	//keep the value for later
+	smscb_data.multipage_number = number_multipg;
+
+	sms_cb_loadEditDefault(&editor_data);
+
+	//buffer for the multipage
+	smscb_data.multipage = (UBYTE *) ALLOC_MEMORY (OFFSET(smscb_data.multipage_number) * sizeof (UBYTE));
+
+   	next_used = link_list_position;
+
+	//fill up the new buffer with the first page
+	/*MC SPR 1920, refer to new message array*/
+	strcat((char *)smscb_data.multipage, smscb_data.messages[next_used]);
+	/*MC end*/
+	//check : is it the end of the link list
+	//if yes, not necassary to go through the link list
+	if (smscb_data.cb_attributes[next_used].next_link NEQ 0xFF)
+	{
+		// going through the link list 
+		next_used = smscb_data.cb_attributes[next_used].next_link;
+	}
+
+	temp = smscb_data.multipage_number;
+
+	//if the multipage contain more than one page, fill up the data
+	//to the new buffer
+	while(temp > 1)
+	{
+		
+		/*MC SPR 1920, refer to new message array*/
+		strcat((char *)smscb_data.multipage, smscb_data.messages[next_used]);
+		/*MC end*/
+
+		// going through the link list & take the next cb message
+		next_used = smscb_data.cb_attributes[next_used].next_link;
+
+		temp --;
+	}
+
+	//set the mark
+	smscb_data.cb_attributes[link_list_position].status = READ_MESSAGE;
+
+	/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+	AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, smscb_data.multipage, OFFSET(smscb_data.multipage_number));
+	AUI_edit_SetEvents(&editor_data, link_list_position, TRUE, FOREVER, (T_AUI_EDIT_CB)sms_cb_editor_cb);
+	AUI_edit_SetTextStr(&editor_data, TxtDelete, TxtSoftBack, 0, NULL);
+	AUI_edit_SetAltTextStr(&editor_data, 0, TxtSoftOptions, FALSE, TxtNull);
+	AUI_edit_SetMode(&editor_data, ED_MODE_READONLY, ED_CURSOR_NONE);
+	AUI_edit_Start(win, &editor_data);
+#else /* NEW_EDITOR */
+	editor_data.editor_attr.text =(char *) smscb_data.multipage;
+
+	editor_data.Identifier            = link_list_position ; //keep the value (selected cb message)
+	editor_data.editor_attr.size     = OFFSET(smscb_data.multipage_number); 
+	editor_data.min_enter		 = 0; 
+	editor_data.LeftSoftKey          = TxtDelete;
+	editor_data.AlternateLeftSoftKey  = TxtSoftOptions;
+	editor_data.RightSoftKey         = TxtSoftBack;
+	editor_data.Callback            = (T_EDIT_CB)sms_cb_editor_cb;
+	editor_data.mode           	 = READ_ONLY_MODE;
+
+	editor_start(win, &editor_data);  /* start the editor */
+#endif /* NEW_EDITOR */
+}
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_loadEditDefault
+
+ $Description:	Configure T_EDITOR_DATA structure with default editor settings.
+
+ $Returns:		none
+ 
+ $Arguments:	editor_data - editor data.
+
+*******************************************************************************/
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+void sms_cb_loadEditDefault (T_AUI_EDITOR_DATA *editor_data)
+{
+	    TRACE_FUNCTION ("sms_cb_loadEditDefault()");
+
+		AUI_edit_SetDefault(editor_data);
+		AUI_edit_SetMode(editor_data, ED_MODE_ALPHA, ED_CURSOR_NONE);
+		AUI_edit_SetTextStr(editor_data, TxtSoftSelect, TxtSoftBack, 0, NULL);
+		AUI_edit_SetDisplay(editor_data, 0, COLOUR_EDITOR, EDITOR_FONT);
+
+		return;
+}
+#else /* NEW_EDITOR */
+
+void sms_cb_loadEditDefault (T_EDITOR_DATA *editor_data)
+{
+	    TRACE_FUNCTION ("sms_cb_loadEditDefault()");
+
+		editor_attr_init(&editor_data->editor_attr, NULL, edtCurNone, 0, 0, 0, COLOUR_EDITOR);
+		editor_data_init(editor_data, NULL, TxtSoftSelect, TxtSoftBack, 0, 1, ALPHA_MODE, FOREVER);
+		editor_data->hide				= FALSE;
+		editor_data->AlternateLeftSoftKey   = TxtNull;
+		editor_data->Identifier			=  0; 
+		editor_data->TextString			= NULL;  
+		editor_data->destroyEditor		= TRUE ; 
+}
+#endif /* NEW_EDITOR */
+
+
+/*******************************************************************************
+
+ $Function:    	sms_cb_editor_cb
+
+ $Description:	callback function of the editor 
+
+ $Returns:		none
+ 
+ $Arguments:	
+
+*******************************************************************************/
+static void sms_cb_editor_cb (T_MFW_HND win, USHORT Identifier, SHORT reason)
+{
+	UBYTE test, i;   // RAVI - result,
+
+//only for tracing 
+#ifdef DEBUG_SMS_CB
+	UBYTE w;
+#endif
+
+	TRACE_FUNCTION ("sms_cb_editor_cb()");
+
+	FREE_MEMORY ((UBYTE *)smscb_data.multipage, OFFSET(smscb_data.multipage_number) * sizeof (UBYTE));
+	
+	switch (reason)
+	{
+		case INFO_KCD_LEFT:
+
+
+			//user selected to delete the message
+			sms_cb_delete_message (smscb_data.cb_attributes[Identifier].mid);
+
+			//update the use_pointer  after deleting
+			smscb_data.used_pointer = smscb_data.result_used;
+
+			if (smscb_data.used_pointer EQ smscb_data.free_pointer)
+			{
+				//no anymore messages stored
+				smscb_data.used_pointer = 0xFF;
+			}
+
+
+			if (smscb_data.current_status EQ ALL_MESSAGE)
+			{
+				//go back to the cb list 
+				sms_cb_read_msg (smscb_data.current_status);
+			}
+			else if (smscb_data.current_status EQ UNREAD_MESSAGE)
+			{
+//				if (sms_cb_count_unread_messages ())
+//					sms_cb_read_msg (smscb_data.current_status);
+		
+			}
+
+
+			
+			break;
+          
+		case INFO_KCD_RIGHT:
+		case INFO_KCD_HUP:
+
+
+//only for tracing 
+#ifdef DEBUG_SMS_CB
+			/***************************Go-lite Optimization changes Start***********************/
+			//	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+			TRACE_EVENT_P1( ".. used_pointer %d ", smscb_data.used_pointer); 
+			TRACE_EVENT_P1("..free_pointer %d ", smscb_data.free_pointer); 
+			for (i=0; i<MAX_STORED_PAGES ; i++)	
+			{
+				TRACE_EVENT_P2("link_index: %d, i:%d", smscb_data.cb_attributes[i].next_link,i); 
+			}
+			test = smscb_data.used_pointer;
+			while (smscb_data.cb_attributes[test].next_link NEQ 0xFF)
+			{
+				//sprintf(buf, "Buffer on %s", &smscb_data.cb_buffer[OFFSET(test)]); 
+				/*MC*/
+				TRACE_EVENT_P1("Buffer on %s", smscb_data.messages[test]); 
+				test = smscb_data.cb_attributes[test].next_link;
+			}
+			//sprintf(buf, "Buffer on %s,i:%d ", &smscb_data.cb_buffer[OFFSET(test)], i); 
+			/*MC*/
+			TRACE_EVENT_P2("Buffer on %s,i:%d ", smscb_data.messages[test], i); 
+			/***************************Go-lite Optimization changes end***********************/
+#endif //DEBUG_SMS_CB
+
+
+
+			if (smscb_data.current_status EQ ALL_MESSAGE)
+			{
+				//go back to the cb list 
+				sms_cb_read_msg (smscb_data.current_status);
+			}
+			else if (smscb_data.current_status EQ UNREAD_MESSAGE)
+			{
+		
+			}
+			break;
+
+		default:
+			TRACE_EVENT("Err: Default");
+			break;
+	}
+}
+
+
+