view src/ui3/bmi/mmiGprs.c @ 663:cf1cfe12a54a

AT@SPENH command implemented in aci3
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 24 May 2020 06:53:25 +0000
parents 6a4d9f47793e
children
line wrap: on
line source

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

					CONDAT (UK)

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

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

 $Project name:	                                                      
 $Project code:	                                                           
 $Module:		
 $File:		    MmiGprs.c
 $Revision:		                                                      
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		                                                          
                                                                               
********************************************************************************
                                                                              
 Description:
 	GPRS handling for MMI.
    
                        
********************************************************************************

 $History: MmiGprs.c

       Oct 18,2006 REF:DR OMAPS00099409 x0047075
       Description:TC2.1.5(BMI/MFW) - GPRS - GPRS Detach error
       Solution : The response P_CGREG_STAT_NOT_REG from the lower layer is now translated as GPRS_OFF by BMI.

       May 29,2006 REF: DR OMAPS00078997 x0043641
       Description: GPRS - DETACH (ERROR)
       Solution: A condition is added when not regeistered, no searching the gprs status
       is updated as not attached.

	Feb 24, 2006 REF:DR OMAPS00068976 x0035544
	Description: GPRS attach icon - MMI follow up issue of OMAPS00051034
	solution: a Check is added for the idle mode display and querry the GPRS status of 
	network registration and update the GPRS  state and attach icon display accordingly.
	
	15/05/2003 - SPR#1983 - SH - Updated to latest from 1.6.3 version.

	Dec 02, 2005 REF: DR OMAPS00048551    x0039928
   	Description: MMI Cloud displays ""GPRS Detached"" in place 
   	of ""GPRS Not Attached"" when unable to attach..
   	Solution: A condition is added to check if the request is for attach and then display 
   	"GPRS Not Attached" in case it fails.
	
	Dec 01, 2005 REF: DR OMAPS00048530   x0039928
   	Description: After the GPRS detach the MMI shows it is attached.
   	Solution: A check is made to display "GPRS Attached" only when an GPRS attach is
   	requested but not when GPRS detach is request.

	Jun 14, 2005 REF: MMI-FIX-30439 x0018858
   	Description: The homezone/cityzone tags were not being displayed properly.
   	Solution: Modified to save the tags properly in caches and also made the 
	appropriate modifications to update the same properly during mobility.
	   
 $End

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

#define ENTITY_MFW

/* Switch for tracing*/
#define TRACE_MMIGPRS

#ifdef TRACE_MMIGPRS
#define trace(x)			TRACE_EVENT(x)
#define tracefunction(x)	TRACE_FUNCTION(x)
#define trace_P1(x,a)		TRACE_EVENT_P1(x,a)
#define trace_P2(x,a,b)		TRACE_EVENT_P2(x,a,b)
#define trace_P3(x,a,b,c)	TRACE_EVENT_P3(x,a,b,c)
#define trace_P4(x,a,b,c,d)	TRACE_EVENT_P4(x,a,b,c,d)
#define trace_P5(x,a,b,c,d,e)   TRACE_EVENT_P5(x,a,b,c,d,e)
#define trace_P6(x,a,b,c,d,e,f)  TRACE_EVENT_P6(x,a,b,c,d,e,f)
#else
#define trace(x)			/* */
#define tracefunction(x)	/* */
#define trace_P1(x,a)		/* */
#define trace_P2(x,a,b)		/* */
#define trace_P3(x,a,b,c)	/* */
#define trace_P4(x,a,b,c,d)	/* */
#define trace_P5(x,a,b,c,d,e)   /* */
#define trace_P6(x,a,b,c,d,e,f)  /* */
#endif

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif
#include "mfw_sys.h"

#include "cus_aci.h"

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
/* New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_lng.h"
#include "mfw_tim.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_phb.h"
#include "mfw_cm.h"
#include "mfw_sim.h"
#include "mfw_nm.h"
#include "mfw_sat.h"
#include "mfw_ss.h" /*for convert*/
#include "mfw_phb.h"
#include "ksd.h"
#include "psa.h"
#include "mfw_sms.h"
#include "mfw_cphs.h"
#include "mfw_sat.h"
#include "message.h"
#include "prim.h"
#include "aci_all.h"
#include "aci_cmh.h"  /* include types declared in ACI              */
#include "ati_cmd.h"
#include "aci_cmd.h"
#include "aci.h"
#include "dti_conn_mng.h"
#include "dti_cntrl_mng.h"
#include "gaci.h" /* include types declared in GACI             */
#include "gaci_cmh.h"

#ifdef FF_2TO1_PS
#include "aci_all.h"
#include "ati_cmd.h"
#include "aci_cmd.h"
#include "aci.h"
#include "dti_conn_mng.h"
#include "dti_cntrl_mng.h"
#include "gaci.h" /* include types declared in GACI             */
#endif
#include "mfw_ss.h" /*for convert*/
#include "mfw_cphs.h"
#include "mfw_sat.h"
#include "mfw_gprs.h"
#include "dspl.h"

#include "MmiGprs.h"
#include "MmiBookShared.h"

#include "Mmiicons.h"		/* Including this header allows us to access the global icon status, for the GPRS icon.*/
#include "mmiSmsBroadcast.h"  /* Including this to get the info_screen function */
/* New Editor changes.  Need editor for counter display */
#ifdef NEW_EDITOR
#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"
#else
#include "MmiEditor.h"
#endif
#include "MmiBookUtils.h"
#include "MmiBookMenuWindow.h"		/* So we can use bookMenuStart() to create our own menus */

#include "mmiColours.h"

#ifdef NEPTUNE_BOARD
#define GPRS_ICON_SET    1
#define EDGE_ICON_SET    2
#endif

static T_MMI_GPRS_DATA *gprs_data=NULL;

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

 $Function:    	GPRS_Data

 $Description:	Initialise GPRS

 $Returns:		Handler for MFW GPRS events.

 $Arguments:	None.

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

T_MMI_GPRS_DATA *GPRS_Data(void)
{
	if (gprs_data==NULL)
	{
		TRACE_EVENT("***ERROR*** MMI GPRS not initialised properly");
	}
	
	return gprs_data;
}

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

 $Function:    	GPRS_Init

 $Description:	Initialise GPRS

 $Returns:		Handler for MFW GPRS events.

 $Arguments:	None.

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

void GPRS_Init(void)
{
	T_MMI_GPRS_DATA *data;
	
	tracefunction("GPRS_Init()");

	gprs_init();

	/* Allocate memory for mmi data */
	data = (T_MMI_GPRS_DATA *)ALLOC_MEMORY(sizeof(T_MMI_GPRS_DATA));
	gprs_data = data;
	memset(data, 0, sizeof(T_MMI_GPRS_DATA));

	data->mfw_gprs = gprs_create(0, E_MFW_GPRS_ALL_EVENTS, (MfwCb)GPRS_MfwCb);
	data->cid = GPRS_CID_OMITTED;
	data->uplink_counter = 0;
	data->downlink_counter = 0;
	data->sms_service = SMS_SERVICE_OMITTED;
	data->display = FALSE;
	data->notify_win = NULL;
	data->callback = NULL;
	data->reg_status = GPRS_OFF;
	
	return;
}


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

 $Function:    	GPRS_SetCallback

 $Description:	Specify a callback function, where GPRS connection information will
 				be sent, or NULL to switch off notification.

 $Returns:		None.

 $Arguments:	win - window handler, or NULL
 				callback - callback function, or NULL

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

void GPRS_SetCallback(T_MFW_HND win, T_GPRS_CB callback)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();

	tracefunction("GPRS_SetCallback()");

	if (!data)
	{
		return;
	}

	data->notify_win = win;
	data->callback = callback;

	return;
}


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

 $Function:    	GPRS_Exit

 $Description:	Exit GPRS

 $Returns:		None.

 $Arguments:	None.

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

void GPRS_Exit(void)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();

	tracefunction("GPRS_Exit()");

	if (data)
	{	
		/* Delete any remaining please wait window (just in case!)*/
		GPRS_PleaseWaitDestroy();

		/* Delete the MFW module */
		if (data->mfw_gprs)
		{
			gprs_delete(data->mfw_gprs);
		}
		
		/* Delete MMI data */
		FREE_MEMORY((void *)data, sizeof(T_MMI_GPRS_DATA));
		gprs_data = NULL;
	}
	
	gprs_exit();
	return;
}


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

 $Function:    	GPRS_Status

 $Description:	Return status of GPRS.

 $Returns:		GPRS_OFF, GPRS_NOT_ATTACHED, GPRS_ATTACHED

 $Arguments:	None.

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

int GPRS_Status(void)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_MFW_GPRS *gprs;
	int result;
	
#ifdef NEPTUNE_BOARD
	int iStatus = 0;
	int iDisplayIcn = 0;
#endif

	tracefunction("GPRS_Status()");

	if (!data)
	{
		return GPRS_OFF;
	}
	
	/* Keeps track of last status value, so we only need to call callback when a change occurs.
	 * Default state is GPRS OFF */

	iconsDeleteState(iconIdGPRSOn);
	
#ifdef NEPTUNE_BOARD
	/* OMAPS00074454 - For Edge Icon Display */
      iconsDeleteState(iconIdEdgeOn);
	/* END */
#endif	
	result = GPRS_OFF;

	/* Check if searching or attached */

	if (data->mfw_gprs)
	{
	 	gprs = ((T_MFW_HDR *)data->mfw_gprs)->data;
//x0035544 Feb 23, 2006 DR:OMAPS00068976
        /* Check for the idle mode and querry the status of network registration 
         *and update the GPRS  state  and attach icon display accordingly */
		if (gprs && (idleIsFocussed() ||data->menu_win == NULL) ) 
		{	
#ifdef NEPTUNE_BOARD                         
		   iDisplayIcn = mfw_gprs_edge_status (&iStatus); 

                 /* Status is obtained from AT command and assigned. */
   		   gprs->data.Reg_state.p_reg_State = (T_P_CGREG_STAT) iStatus;

		   if ((gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_SEARCHING) &&
		       (iDisplayIcn == GPRS_ICON_SET))
		   {
		  	result = GPRS_SEARCHING;
		   }

		   else if((gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_SEARCHING) && 
		       	 (iDisplayIcn == EDGE_ICON_SET))
   		   {
		  	result = EDGE_SEARCHING;
		   }
			
		   /* Check regState and iDisplayIcn For display of GPRS*/
		  else if ((gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_HOME || 
		   	         gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_ROAM ) && 
				  (iDisplayIcn == GPRS_ICON_SET))
		  {
		 	iconsSetState(iconIdGPRSOn);
			result = GPRS_ATTACHED;
		  }

       	  /* Check regState and iDisplayIcn For display of EDGE*/
     		  else if ((gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_HOME || 
     			     gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_ROAM ) && 
     			     (iDisplayIcn == EDGE_ICON_SET))
     		  {
     		       iconsSetState(iconIdEdgeOn);	
     			result = EDGE_ATTACHED;
     		  }
                else if ((gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_NO_CELL || 
			    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_LIMITED ||
			    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_UNKN || 
			    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_DEN  ) &&
			    (iDisplayIcn == EDGE_ICON_SET))
                {
			iconsDeleteState(iconIdGPRSOn );
			result = GPRS_ERROR;                     
                }
                else if ((gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_NO_CELL || 
				    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_LIMITED ||
				    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_UNKN || 
				    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_DEN ) &&
				    (iDisplayIcn == EDGE_ICON_SET))
                {
				iconsDeleteState(iconIdEdgeOn );
				result = EDGE_ERROR;                     
                }
                /* May 29, 2006 Ref bug OMAPS00078997 */
                else if (gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_NOT_REG )
                {
                       iconsDeleteState(iconIdGPRSOn );
                       iconsDeleteState(iconIdEdgeOn );
                       result = GPRS_OFF;
                }
		  else
		  {
                          iconsDeleteState(iconIdGPRSOn);
		            iconsDeleteState(iconIdEdgeOn);
		  }
					 
#else

			gprs->data.Reg_state.p_reg_State = p_gprs_status();

			trace_P1("GPRS_Status: p_regState = %d", gprs->data.Reg_state.p_reg_State);

			if (gprs->data.Reg_state.p_reg_State ==P_CGREG_STAT_SEARCHING)
			{
				result = GPRS_SEARCHING;
			}

			/* Check regState rather than attached to find GPRS status */

			else if (gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_HOME || 
				     gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_ROAM )
			{
				iconsSetState(iconIdGPRSOn);
				result = GPRS_ATTACHED;
			}
			else if(gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_NO_CELL || 
				    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_LIMITED || 
				    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_UNKN || 
				    gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_REG_DEN)
				     
			{
				iconsDeleteState(iconIdGPRSOn );
				result = GPRS_ERROR;
			}
                     //Oct 18,2006 REF:DR OMAPS00099409 x0047075
                    // Description:TC2.1.5(BMI/MFW) - GPRS - GPRS Detach error
                    //Solution : The response P_CGREG_STAT_NOT_REG from the lower layer is now translated as GPRS_OFF by BMI.
			else if (gprs->data.Reg_state.p_reg_State == P_CGREG_STAT_NOT_REG )
                    {
                       iconsDeleteState(iconIdGPRSOn );
                       result = GPRS_OFF;
                     }
#endif 
				
		}
		else if (gprs )
		{

#ifdef NEPTUNE_BOARD
			iDisplayIcn = mfw_gprs_edge_status (&iStatus);

                      /* Status is obtained from AT command and assigned. */
			/* x0045876, 14-Aug-2006 (WR - enumerated type mixed with another type) */
			/* gprs->data.Reg_state.regState = iStatus; */
   		       gprs->data.Reg_state.regState = (T_CGREG_STAT) iStatus;

			if ((gprs->data.Reg_state.regState==CGREG_STAT_SEARCHING) && 
			     (iDisplayIcn == GPRS_ICON_SET))
			{
				result = GPRS_SEARCHING;
			}

			else if((gprs->data.Reg_state.regState==CGREG_STAT_SEARCHING) && 
				    (iDisplayIcn == EDGE_ICON_SET))
			{
				result = EDGE_SEARCHING;
			}
			
			/* Check regState and iDisplayIcn For display of GPRS*/
			else if ((gprs->data.Reg_state.regState==CGREG_STAT_REG_HOME || 
				       gprs->data.Reg_state.regState==CGREG_STAT_REG_ROAM) && 
				       (iDisplayIcn == GPRS_ICON_SET))
			{
				iconsSetState(iconIdGPRSOn);
				result = GPRS_ATTACHED;
			}

			/* Check regState and iDisplayIcn For display of EDGE*/
			else if ((gprs->data.Reg_state.regState==CGREG_STAT_REG_HOME || 
				       gprs->data.Reg_state.regState==CGREG_STAT_REG_ROAM) && 
				      (iDisplayIcn == EDGE_ICON_SET))
			{
 			       iconsSetState(iconIdEdgeOn);	
				result = EDGE_ATTACHED;
			}
#else

			//x0035544 Feb 23, 2006 DR:OMAPS00068976
			gprs->data.Reg_state.regState = gprs_status();

			trace_P1("GPRS_Status: regState = %d", gprs->data.Reg_state.regState);
			//x0035544 Feb 23, 2006 DR:OMAPS00068976
			if (gprs->data.Reg_state.regState==CGREG_STAT_SEARCHING)
			{
				result = GPRS_SEARCHING;
			}

			/* Check regState rather than attached to find GPRS status */
			//x0035544 Feb 23, 2006 DR:OMAPS00068976
			else if (gprs->data.Reg_state.regState==CGREG_STAT_REG_HOME ||
				     gprs->data.Reg_state.regState ==CGREG_STAT_REG_ROAM)
			{
				iconsSetState(iconIdGPRSOn);
				result = GPRS_ATTACHED;
			}
#endif			
		}
	}
	
	/* If status has changed, notify */
	if (data->callback!=NULL && result!=data->reg_status)
	{
		data->callback(result);
	}

	data->reg_status = result;

	return result;
}

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

 $Function:    	GPRS_ResultScreen

 $Description:	Displays a result and returns GPRS to idle status

 $Returns:		None.

 $Arguments:	parent_win - the parent window
 				TextId1	- the first text string to be shown
 				TextId2  - the second text string to be shown
 
 [afo 03/10/03] Moved function to an earlier location in the file and changed 
			the return type to void. We were taking liberties with C which we 
			got away with using the TI compiler but which Visual C flagged as 
			an error.
			
			We seem to be a bit slack on function scope and return values in 
			some cases in this file.

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

static void GPRS_ResultScreen(T_MFW_HND parent_win, USHORT TextId1, USHORT TextId2)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	
	tracefunction("GPRS_ResultScreen()");

	if (!data)
	{
		return;
	}
	
	GPRS_PleaseWaitDestroy();	
	
	info_screen(parent_win, TextId1, TextId2, NULL);

	data->display = FALSE;

	return;
}

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

 $Function:    	GPRS_Attach

 $Description:	Attempts an attach to the GPRS network.

 $Returns:		MMI_GPRS_STATUS_ATTACHING or MMI_GPRS_STATUS_IDLE

 $Arguments:	win - Parent window - if this is provided, status dialogues will be shown

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

int GPRS_Attach(T_MFW_HND win)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();

	tracefunction("GPRS_Attach()");

	if (!data)
	{
		/* x0045876, 14-Aug-2006 (WR - non-void function "GPRS_Attach" should return a value) */
		/* return; */
		return 0;
	}
	
	data->status = MMI_GPRS_STATUS_ATTACHING;

	if (win)
	{
		GPRS_PleaseWait(win, TxtPleaseWait, NULL);
	}

	/* Perform the attach */
	
	if (gprs_attach(CGATT_STATE_ATTACHED)==MFW_RES_OK)
	{
		trace("GPRSAttach executing, awaiting confirmation.");
	}
	else
	{
		/* Show result */
		if (win)
		{
			GPRS_ResultScreen(win, TxtFailed, TxtNull);
		}
		data->status = MMI_GPRS_STATUS_IDLE;
	}

	return data->status;
}


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

 $Function:    	GPRS_Detach

 $Description:	Detach from the GPRS network.

 $Returns:		MMI_GPRS_STATUS_DETACHING or MMI_GPRS_STATUS_IDLE

 $Arguments:	None

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

int GPRS_Detach(T_MFW_HND win)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();

	tracefunction("GPRS_Detach()");

	if (!data)
	{
		/* x0045876, 14-Aug-2006 (WR - non-void function "GPRS_Detach" should return a value) */
		/* return; */
		return 0;
	}

	data->status = MMI_GPRS_STATUS_DETACHING;

	if (win)
	{
		GPRS_PleaseWait(win, TxtPleaseWait, NULL);
	}
	
	if (gprs_attach(CGATT_STATE_DETACHED)==MFW_RES_OK)
	{
		trace("GPRSDetach executing, awaiting confirmation.");
	}
	else
	{
		if (win)
		{
			GPRS_ResultScreen(win, TxtFailed, TxtNull);
		}
		data->status = MMI_GPRS_STATUS_IDLE;
	}

	return data->status;
}


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

 $Function:    	GPRS_ContextDefine

 $Description:	Define a PDP context

 $Returns:		TRUE if successful, FALSE otherwise

 $Arguments:	cid - Context ID
 				IPAddress - IP address of context
 				APN - Access Point Name of context

*******************************************************************************/
#ifdef FF_2TO1_PS
int GPRS_ContextDefine(SHORT cid, char *IPAddress, char *APN)
{
	static T_PDP_CONTEXT context;
	
	strcpy(context.pdp_apn, APN);
	strcpy(context.pdp_type, "IP");
	strcpy((char*)context.pdp_addr.ip_address.ipv4_addr.a4, (char*)IPAddress);

  	context.pdp_addr.ctrl_ip_address = NAS_is_ipv4;

  	/* x0045876, 14-Aug-2006 (WR - integer conversion resulted in a change of sign) */
	/*
	context.d_comp = CGDCONT_D_COMP_OMITTED;
	context.h_comp = CGDCONT_H_COMP_OMITTED;
	*/
	context.d_comp = (U8) CGDCONT_D_COMP_OMITTED;
	context.h_comp = (U8) CGDCONT_H_COMP_OMITTED;
	
//	memset(&context.qos,0,sizeof(T_PS_qos));
//	memset(&context.min_qos,0,sizeof(T_PS_qos));

	if (gprs_definePDPContext(cid, &context)!=MFW_RES_OK)
	{
		return FALSE;
	}

	return TRUE;
}
#else
int GPRS_ContextDefine(SHORT cid, char *IPAddress, char *APN)
{
	static T_PDP_CONTEXT context;
	
	strcpy(context.pdp_apn, APN);
	strcpy(context.pdp_type, "IP");
	strcpy((char*)context.pdp_addr.ip_address.ipv4_addr.a4, (char*)IPAddress);
	context.pdp_addr.ctrl_ip_address = NAS_is_ipv4;
	context.d_comp = (U8)CGDCONT_D_COMP_OMITTED;
	context.h_comp = (U8)CGDCONT_H_COMP_OMITTED;
//	memset(&context.qos,0,sizeof(T_QOS));
//	memset(&context.min_qos,0,sizeof(T_QOS));

	if (gprs_definePDPContext(cid, &context)!=MFW_RES_OK)
	{
		return FALSE;
	}

	return TRUE;
}
#endif


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

 $Function:    	GPRS_ContextActivate

 $Description:	Activates a PDP context

 $Returns:		TRUE if successful, FALSE otherwise

 $Arguments:	cid - Context ID

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

int GPRS_ContextActivate(SHORT cid)
{
	SHORT cids[2];

	tracefunction("GPRS_ContextActivate()");
	
	cids[0] = cid;
	cids[1] = 0;
	
	if (gprs_contextActivation(CGACT_STATE_ACTIVATED, cids)==MFW_RES_OK)
	{
		trace("GPRS_ContextActivate: Failed.");
 		return FALSE;
	}

	trace("GPRS_ContextActivate: Executing, awaiting confirmation.");
	return TRUE;
}


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

 $Function:    	GPRS_ContextDeactivate

 $Description:	Dectivates a PDP context

 $Returns:		TRUE if successful, FALSE otherwise

 $Arguments:	cid - Context ID

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

int GPRS_ContextDeactivate(SHORT cid)
{
	SHORT cids[2];

	tracefunction("GPRS_ContextDeactivate()");
	
	cids[0] = cid;
	cids[1] = 0;
	
	if (gprs_contextActivation(CGACT_STATE_DEACTIVATED, cids)==MFW_RES_OK)
	{
		trace("GPRS_ContextDeactivate: Failed.");
 		return FALSE;
	}

	trace("GPRS_ContextDeactivate: Executing, awaiting confirmation.");
	return TRUE;
}


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

 $Function:    	GPRS_SetQOS

 $Description:	Set quality of service

 $Returns:		TRUE if succeeded, FALSE if failed

 $Arguments:	cid - context ID
 				preced...etc. - quality of service parameters

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

#ifdef FF_2TO1_PS
int GPRS_SetQOS(SHORT cid, UBYTE preced, UBYTE delay, UBYTE relclass, UBYTE peak, UBYTE mean)
{
	T_PS_qos QOS;

	tracefunction("GPRS_SetQOS()");

	QOS.qos_r97.preced = preced;
	QOS.qos_r97.delay = delay;
	QOS.qos_r97.relclass = relclass;
	QOS.qos_r97.peak = peak;
	QOS.qos_r97.mean = mean;
	
	if (gprs_setQOS(cid, &QOS)!=MFW_RES_OK)
	{
		trace("GPRS_MenuSetQOS: Failed");
		return FALSE;
	}

	trace("GPRS_MenuSetQOS: OK");
	
	return TRUE;
}
#else
int GPRS_SetQOS(SHORT cid, UBYTE preced, UBYTE delay, UBYTE relclass, UBYTE peak, UBYTE mean)
{
	T_PS_qos QOS;

	tracefunction("GPRS_SetQOS()");

	QOS.qos_r97.preced = preced;
	QOS.qos_r97.delay = delay;
	QOS.qos_r97.relclass = relclass;
	QOS.qos_r97.peak = peak;
	QOS.qos_r97.mean = mean;
	
	
	if (gprs_setQOS(cid, &QOS)!=MFW_RES_OK)
	{
		trace("GPRS_MenuSetQOS: Failed");
		return FALSE;
	}

	trace("GPRS_MenuSetQOS: OK");
	
	return TRUE;
}
#endif

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

 $Function:    	GPRS_SetMinQOS

 $Description:	Set minimum quality of service

 $Returns:		TRUE if succeeded, FALSE if failed

 $Arguments:	cid - context ID
 				preced...etc. - quality of service parameters

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

#ifdef FF_2TO1_PS
int GPRS_SetMinQOS(SHORT cid, UBYTE preced, UBYTE delay, UBYTE relclass, UBYTE peak, UBYTE mean)
{
	T_PS_qos QOS;

	tracefunction("GPRS_SetMinQOS()");

	QOS.qos_r97.preced = preced;
	QOS.qos_r97.delay = delay;
	QOS.qos_r97.relclass = relclass;
	QOS.qos_r97.peak = peak;
	QOS.qos_r97.mean = mean;
	
	if (gprs_setQOSMin(cid, &QOS)!=MFW_RES_OK)
	{
		trace("GPRS_MenuSetMinQOS: Failed");
		return FALSE;
	}

	trace("GPRS_MenuSetMinQOS: OK");
	
	return TRUE;
}
#else
int GPRS_SetMinQOS(SHORT cid, UBYTE preced, UBYTE delay, UBYTE relclass, UBYTE peak, UBYTE mean)
{
	T_PS_qos QOS;

	tracefunction("GPRS_SetMinQOS()");

	QOS.qos_r97.preced = preced;
	QOS.qos_r97.delay = delay;
	QOS.qos_r97.relclass = relclass;
	QOS.qos_r97.peak = peak;
	QOS.qos_r97.mean = mean;
	
	if (gprs_setQOSMin(cid, &QOS)!=MFW_RES_OK)
	{
		trace("GPRS_MenuSetMinQOS: Failed");
		return FALSE;
	}

	trace("GPRS_MenuSetMinQOS: OK");
	
	return TRUE;
}
#endif

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

 $Function:    	GPRS_SmsService

 $Description:	Return SMS Service type

 $Returns:		SMS_SERVICE_xxx

 $Arguments:	None.

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

UBYTE GPRS_SmsService(void)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();

	tracefunction("GPRS_SmsService");

	if (!data)
	{
		return SMS_SERVICE_OMITTED;
	}
	
	return data->sms_service;
}


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

 $Function:    	GPRS_SetSmsService

 $Description:	Set SMS Service type

 $Returns:		TRUE if set proceeded OK

 $Arguments:	None.

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

UBYTE GPRS_SetSmsService(UBYTE service)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_CGSMS_SERVICE ACISmsService;
	UBYTE old_service = 0; /* Warning Correction - 29-11-2005 */
	tracefunction("GPRS_SetSmsService");
	trace_P1("Service: %d", service);
	
	switch(service)
	{
		case SMS_SERVICE_GPRS:
			ACISmsService = CGSMS_SERVICE_GPRS;
			break;
		case SMS_SERVICE_CS:
			ACISmsService = CGSMS_SERVICE_CS;
			break;
		case SMS_SERVICE_GPRS_PREF:
			ACISmsService = CGSMS_SERVICE_GPRS_PREFERRED;
			break;
		case SMS_SERVICE_CS_PREF:
			ACISmsService = CGSMS_SERVICE_CS_PREFERRED;
			break;
		default:
			ACISmsService = CGSMS_SERVICE_CS;
			break;
	}

	if (data)
	{
		old_service = data->sms_service;
		data->sms_service = service;
	}
	
	if (gprs_setServiceSMS(ACISmsService) != MFW_RES_OK)
	{
		trace("gprs_setServiceSMS failed");
		/* Failed - set service back to old value */
		if (data)
		{
			data->sms_service = old_service;
		}
		return FALSE;
	}
	
	return TRUE;
}


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

 $Function:    	GPRS_MfwCb

 $Description:	Callback function for MFW GPRS events.

 $Returns:

 $Arguments:	Event number and generic parameter.

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

static int GPRS_MfwCb(T_MFW_EVENT event, void* para)
{

	T_MMI_GPRS_DATA	*data = GPRS_Data();
	T_MFW_HND 			win			= mfwParent( mfw_header());
	T_MFW_GPRS_DATA		*gprs_data	= (T_MFW_GPRS_DATA *)para;				// Structure that stores data from mfw
	USHORT				textId;
	int result;
	
	tracefunction("GPRS_MfwCb()");

	if (!data)
	{
		return FALSE; /* Warning Correction - provide return value */
	}

	/* Result of GPRS_NOTHING will not be sent */
	
	result = GPRS_NOTHING;

	/* Find GPRS status */
	
	if (idleIsFocussed())
	{
		/* Update idle screen icons to show any change in GPRS status */
		iconsShow();
	}
	else
	{
		/* iconsShow calls GPRS_Status; if we don't call that, call this on its own */
		GPRS_Status();
	}
	
	switch(event)
	{
		case E_MFW_GPRS_S_CNTXT:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_CNTXT");
			break;

		case E_MFW_GPRS_S_ATT:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_ATT");
			
		// Dec 01, 2005 REF: DR OMAPS00048530   x0039928
		// Fix : Set the current status to attaching or detaching depending on the request.
			if (data->reg_status!= GPRS_ATTACHED)
				data->status = MMI_GPRS_STATUS_ATTACHING;
			else
				data->status = MMI_GPRS_STATUS_DETACHING;
			
			if (data->display)
			{
				if (data->reg_status!= GPRS_ATTACHED)
				{
					/* Previous please wait will be destroyed and this new message shown */
					GPRS_PleaseWait(win, TxtGPRS, TxtAttaching);
				}
				else
				{
					/* MZ cq10952  Info string */
					GPRS_PleaseWait(win, TxtGPRS, TxtDetaching);
				}
			}
			break;

		case E_MFW_GPRS_S_ACT:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_ACT");

			/* Notify of context activation */
			result = GPRS_CONTEXT_ACTIVATE;			
			break;

		case E_MFW_GPRS_R_ACT:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_ACT");

			/* Notify of context activation */
			result = GPRS_CONTEXT_ACTIVATE;
			break;

		case E_MFW_GPRS_S_DATA:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_DATA");
			break;

		case E_MFW_GPRS_R_DATA:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_DATA");
			break;

		case E_MFW_GPRS_S_QOS:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_QOS");
			break;

		case E_MFW_GPRS_R_QOS:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_QOS");
			break;

		case E_MFW_GPRS_S_QOS_MIN:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_QOS_MIN");
			break;

		case E_MFW_GPRS_S_CLASS:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_CLASS");
			break;

		case E_MFW_GPRS_S_PDPADDR:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_PDPADDR");
			break;

		case E_MFW_GPRS_S_AUTORESP:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_AUTORESP");
			break;

		case E_MFW_GPRS_S_ANS:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_ANS");
			break;

		case E_MFW_GPRS_R_ANS:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_ANS");
			break;

		case E_MFW_GPRS_S_EREP:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_EREPG");
			break;

		case E_MFW_GPRS_R_EREP_RJ:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_EREP_RJ");
			
			/* Notify of context deactivation */

			result = GPRS_CONTEXT_DEACTIVATE;
			break;

		case E_MFW_GPRS_R_EREP_ATT:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_EREP_ATT");

			/* Attach status has changed, display message as appropriate */
					
			if (data->display)
			{
				if (data->reg_status==GPRS_ATTACHED)
					textId = TxtAttached;
				else
					textId = TxtNotAttached;
				
				/* Show result */	
				GPRS_ResultScreen(win, TxtGPRS, textId);
			}
			data->status = MMI_GPRS_STATUS_IDLE;

			break;

		case E_MFW_GPRS_R_EREP_ACT:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_EREP_ACT");

			/* Notify of context activation */
			result = GPRS_CONTEXT_ACTIVATE;
			break;

		case E_MFW_GPRS_R_EREP_DEACT:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_EREP_DEACT");

			/* Notify of context deactivation */
			result = GPRS_CONTEXT_DEACTIVATE;
			break;

		case E_MFW_GPRS_R_EREP_CLASS:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_EREP_CLASS");
			break;

		case E_MFW_GPRS_R_REG:
			trace("GPRS_MfwCb: E_MFW_GPRS_R_REG");
			//x0035544 Feb 23, 2006 DR:OMAPS00068976
			trace_P1("regState: %d", gprs_data->Reg_state.p_reg_State);

			switch (data->reg_status)
			{
				case GPRS_ATTACHED:
#ifdef MMI_HOMEZONE_ENABLED
					//Jun 14, 2005 REF: MMI-FIX-30439 x0018858
					//begin 30439
					/* Cell reselection for homezone */
					homezoneUpdate(gprs_data->lac, gprs_data->ci, 0);
					//end 30439
#endif
	// Dec 01, 2005 REF: DR OMAPS00048530   x0039928
	// Fix : Display GPRS attached only if the request is for attaching.
					if(data->status == MMI_GPRS_STATUS_ATTACHING)	
					{
						/* Show result */
						if (data->display)
						{
							GPRS_ResultScreen(win, TxtGPRS, TxtAttached);
						}
					}
					data->status = MMI_GPRS_STATUS_IDLE;
					break;
				
				case GPRS_OFF:
#ifdef MMI_HOMEZONE_ENABLED
					//Jun 14, 2005 REF: MMI-FIX-30439 x0018858
					//begin 30439
					/* Cell reselection for homezone */
					homezoneUpdate(0,0,0);
					//end 30439
#endif
					// Dec 02, 2005 REF: DR OMAPS00048551    x0039928
					// Fix : Display GPRS not attached if gprs attach fails
					// and the current status is attaching.
					if(data->status == MMI_GPRS_STATUS_ATTACHING)
					{
						/* Show result */
						if (data->display)
						{
							GPRS_ResultScreen(win, TxtGPRS, TxtNotAttached);
						}
					}
					else
					{
						/* Show result */
						if (data->display)
						{
							GPRS_ResultScreen(win, TxtGPRS, TxtDetached);
						}
					}
					data->status = MMI_GPRS_STATUS_IDLE;
					break;

				case GPRS_SEARCHING:       /* not registered, searching */
#ifdef MMI_HOMEZONE_ENABLED
					//Jun 14, 2005 REF: MMI-FIX-30439 x0018858
					//begin 30439
					/* Cell reselection for homezone */
					homezoneUpdate(0, 0, 0);
					//end 30439
#endif
					data->status = MMI_GPRS_STATUS_ATTACHING;
					if (data->display)
					{
						GPRS_PleaseWait(win, TxtGPRS, TxtSearching);	/* SPR#1986 */
					}
					break;

				default:
					data->status = MMI_GPRS_STATUS_IDLE;
					/* Show result */
					if (data->display)
					{
						GPRS_ResultScreen(win, TxtGPRS, TxtError);
					}
					break;	
			}
			
			break;

		case E_MFW_GPRS_S_SMSSERV:
			trace("GPRS_MfwCb: E_MFW_GPRS_S_SMSSERV");
			trace_P1("Service: %d", data->sms_service);

			data->status = MMI_GPRS_STATUS_IDLE;
								
			/* Display "Using <service>" */

			if (data->display)
    		{
    		    USHORT TxtId2, TxtId1 = TxtUsing;
    		    switch(data->sms_service)
    		    {
                    case SMS_SERVICE_GPRS:           /* GPRS */
                        TxtId2 = TxtGPRS;
                        break;
                    case SMS_SERVICE_CS:             /* circuit switched */
                        TxtId2 = TxtCSD;
                        break;
                    case SMS_SERVICE_GPRS_PREF: /* GPRS preferred */
                        TxtId2 = TxtGPRSPreferred;
                        break;
                    case SMS_SERVICE_CS_PREF:   /* circuit switched preferred */
                        TxtId2 = TxtCSDPreferred;
                        break;
                    default:                           /* Shouldn't happen, but... */
                        TxtId1 = TxtFailed;
                        TxtId2 = TxtNull;
                        break;
    			}
    			
				/* Show result */	
				GPRS_ResultScreen(win, TxtId1, TxtId2);
    		}
			break;

		case E_MFW_GPRS_OK:
			trace("GPRS_MfwCb: E_MFW_GPRS_OK");
			break;

		case E_MFW_GPRS_ERROR:
			trace("GPRS_MfwCb: E_MFW_GPRS_ERROR");

			data->status = MMI_GPRS_STATUS_IDLE;
								
			/* Display "GPRS Error" */

			if (data->display)
			{
				/* Delete please wait window */
				GPRS_PleaseWaitDestroy();		
			
				/* Show result */	
				GPRS_ResultScreen(win, TxtGPRS, TxtFailed);
			}

			/* Notify of error */
			result = GPRS_ERROR;
			break;

		case E_MFW_GPRS_CONNECT:
			trace("GPRS_MfwCb: E_MFW_GPRS_CONNECT");

			data->status = MMI_GPRS_STATUS_IDLE;
			
			if (data->display)
			{
				/* Delete please wait window */
				GPRS_PleaseWaitDestroy();		
				
				/* Display "CONNECTED" window */
				info_screen(win, TxtGPRS, TxtConnected, NULL);
			}
			break;

		case E_MFW_GPRS_ERR_CONNECT:
			trace("GPRS_MfwCb: E_MFW_GPRS_ERR_CONNECT");

			data->status = MMI_GPRS_STATUS_IDLE;
								
			/* Display "GPRS No Answer" */
			if (data->display)
			{
				/* Show result */	
				GPRS_ResultScreen(win, TxtGPRS, TxtNoAnswer);
			}
			break;

		case E_MFW_GPRS_COUNTER:
			trace("GPRS_MfwCb: E_MFW_GPRS_COUNTER");

			/* Add values returned from ACI
			 * to total counter */
			 
			data->uplink_counter += (ULONG)(gprs_data->counter.octets_uplink);
			data->downlink_counter += (ULONG)(gprs_data->counter.octets_downlink);

			/* Only display counter if user has requested it */
								
			if (data->display)
			{
				data->display = FALSE;
				/* Delete please wait window */
				GPRS_PleaseWaitDestroy();
				
				GPRS_ShowCounter(win);
			}
			break;

		default:
			trace_P1("GPRS_MfwCb: event = %d", event);
			break;
	}

	/* Send a notification if appropriate */
	
	if (data->callback!=NULL && result!=GPRS_NOTHING)
	{
		data->callback(result);
	}
	
	return TRUE;
}


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

 $Function:    	GPRS_MenuAttach

 $Description:	Attempts an attach to the GPRS network.

 $Returns:		TRUE if proceeding, FALSE if failed

 $Arguments:	Standard menu option parameters

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

int GPRS_MenuAttach(MfwMnu* m, MfwMnuItem* i)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_MFW_HND win = mfw_parent(mfw_header());
/*	int gprsStatus; */ /* Warning Correction */
	
	tracefunction("GPRS_MenuAttach()");

	if (!data)
	{
		return FALSE;
	}

	if (!data->mfw_gprs)
	{
		data->mfw_gprs = gprs_create(0, E_MFW_GPRS_ALL_EVENTS, (MfwCb)GPRS_MfwCb);
		/* Set CID to 0; on increment will become 1. */
		data->cid = GPRS_CID_OMITTED;
	}

	if (data->reg_status==(int)GPRS_ATTACHED)
	{
		/* Show result */	
		GPRS_ResultScreen(win, TxtAlreadyAttached, TxtAttached);
		return FALSE;
	}

	GPRS_Attach(win);

	return TRUE;
}


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

 $Function:    	GPRS_MenuDetach

 $Description:	Attempts a detach from the GPRS network.

 $Returns:		TRUE if proceeding, FALSE if failed

 $Arguments:	Standard menu option parameters

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

int GPRS_MenuDetach(MfwMnu* m, MfwMnuItem* i)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_MFW_HND win = mfw_parent(mfw_header());
/*	int gprsStatus; */ /* Warning Correction */

	tracefunction("GPRS_MenuDetach()");

	if (!data)
	{
		return FALSE;
	}
	
	/* Check to make sure gprs handle exists */

	if (!data->mfw_gprs)
	{
		/* Show result */	
		GPRS_ResultScreen(win, TxtNotAttached, TxtNull);
		return FALSE;
	}

	if (data->reg_status==(int)GPRS_OFF)
	{
		GPRS_ResultScreen(win, TxtNotAttached, TxtNull);
		return FALSE;
	}

	if (data->reg_status==(int)GPRS_SEARCHING)
	{
		GPRS_ResultScreen(win, TxtGPRS, TxtNotAvailable);
		return FALSE;
	}

	/* Try to detach */

	GPRS_Detach(win);
	
	return TRUE;
}


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

 $Function:    	GPRS_MenuIncomingDataCount

 $Description:	Show data counter for last incoming call

 $Returns:		TRUE if proceeding, FALSE if failed

 $Arguments:	Standard menu option parameters

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

int GPRS_MenuIncomingDataCount(MfwMnu* m, MfwMnuItem* i)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_MFW_HND		win = mfw_parent(mfw_header());
	T_MFW_RES		result;

	tracefunction("GPRS_MenuIncomingDataCount()");

	if (!data)
	{
		return FALSE;
	}
	
	data->counter_type = MMI_GPRS_COUNTER_DOWNLINK;	/* SPR#1875 - SH - Now DOWNLINK */
	data->display = TRUE;
	data->status = MMI_GPRS_STATUS_DATA_COUNTER;
	GPRS_PleaseWait(win, TxtPleaseWait, NULL); /* SPR#1986 */
	
	/* If a data call is in progress, counter is now reset every
	 * time we check it - MMI keeps track of total.
	 * If a data call is not in progress, display current total from MMI */
	 
	result = gprs_counter(TRUE);

	switch(result)
	{
		/* Waiting for rAT_PercentSNCNT callback, don't update display yet */
		
		case MFW_RES_OK:		
			trace("gprs_counter executing, awaiting confirmation.");
			break;

		/* We're not connected - display current total */
		
		case MfwResDone:
			GPRS_PleaseWaitDestroy();
			data->display = FALSE;
			GPRS_ShowCounter(win);
			break;

		/* Error has occurred */
		
		default:
			GPRS_PleaseWaitDestroy();
			data->display = FALSE;
			info_screen(win, TxtGPRS,TxtError, NULL);
			break;
	}
	
	return TRUE;
}


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

 $Function:    	GPRS_MenuOutgoingDataCount

 $Description:	Show data counter for last incoming call

 $Returns:		TRUE if proceeding, FALSE if failed

 $Arguments:	Standard menu option parameters

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

int GPRS_MenuOutgoingDataCount(MfwMnu* m, MfwMnuItem* i)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_MFW_HND		win = mfw_parent(mfw_header());
	T_MFW_RES		result;

	tracefunction("GPRS_MenuOutgoingDataCount()");

	if (!data)
	{
		return FALSE;
	}
	
	data->counter_type = MMI_GPRS_COUNTER_UPLINK;	/* SPR#1875 - SH - Now UPLINK */
	data->display = TRUE;
	data->status = MMI_GPRS_STATUS_DATA_COUNTER;
	GPRS_PleaseWait(win, TxtPleaseWait, NULL); /* SPR#1986 */

	/* If a data call is in progress, counter is now reset every
	 * time we check it - MMI keeps track of total.
	 * If a data call is not in progress, display current total from MMI */
	 
	result = gprs_counter(TRUE);

	switch(result)
	{
		/* Waiting for rAT_PercentSNCNT callback, don't update display yet */
		
		case MFW_RES_OK:
			trace("gprs_counter executing, awaiting confirmation.");
			break;

		/* We're not connected - display current total */
		
		case MfwResDone:
			GPRS_PleaseWaitDestroy();
			data->display = FALSE;
			GPRS_ShowCounter(win);
			break;

		/* Error has occurred */
		
		default:
			GPRS_PleaseWaitDestroy();
			data->display = FALSE;
			info_screen(win, TxtGPRS,TxtError, NULL);
			break;
	}
	
	return TRUE;
}



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

 $Function:    	GPRS_MenuSelectSms

 $Description:	Sets cursor position for this menu based on the current settings

 $Returns:		TRUE if proceeding, FALSE if failed

 $Arguments:	menu		- pointer to the current menu
 				item		- pointer to the current menu item

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

int GPRS_MenuSelectSms(MfwMnu* menu, MfwMnuItem* item)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_MFW_HND win	= mfwParent( mfw_header()); /* GPRS menu window */
/*	T_MFW_GPRS *gprs; */  /* Warning Correction */

	tracefunction("GPRS_MenuSelectSms()");

	if (!data)
	{
		return FALSE;
	}

	data->menu_win = bookMenuStart(win, SMSServiceAttributes(), 0);

	SEND_EVENT(data->menu_win, DEFAULT_OPTION, NULL, &data->sms_service); // Add our own callback

	return TRUE;
}


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

 $Function:    	GPRS_MenuSelectSms_set

 $Description:	Send SMS by GPRS/CSD

 $Returns:		TRUE if proceeding, FALSE if failed

 $Arguments:	menu		- pointer to the current menu
 				item		- pointer to the current menu item

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

int GPRS_MenuSelectSms_set(MfwMnu* menu, MfwMnuItem* item)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_MFW_HND win = mfwParent( mfw_header());	 /* GPRS menu window */

	tracefunction("GPRS_MenuSelectSms_set()");
	trace_P1("Menu level: %d", menu->lCursor[menu->level]);

	if (!data)
	{
		return FALSE;
	}

	if (!data->mfw_gprs)
	{
		TRACE_EVENT("** No MFW gprs **");
		return FALSE;
	}
	
	data->display = TRUE;

	if(!GPRS_SetSmsService(menu->lCursor[menu->level]))
	{
		info_screen(win, TxtFailed, NULL, NULL);
	}
	
	return TRUE;
}


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

 $Function:    	GPRS_PleaseWait

 $Description:	Creates a "Please Wait" message that will hang around until an "OK" or
 				"Error" message is received by GPRS_MfwCb

 $Returns:		Pointer to the created window

 $Arguments:	parent_win - the parent window
 				TextId1	- the first text string to be shown
 				TextId2  - the second text string to be shown

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

static T_MFW_HND GPRS_PleaseWait(T_MFW_HND parent_win, USHORT TextId1, USHORT TextId2)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_DISPLAY_DATA display_info;

	tracefunction("GPRS_PleaseWait()");

	if (!data)
	{
		return NULL;
	}
	
	/* Delete any previous window */
	GPRS_PleaseWaitDestroy();

	dlg_initDisplayData_TextId( &display_info, TxtNull, TxtCancel, TextId1, TextId2, COLOUR_STATUS);
	dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)GPRS_PleaseWaitCb, PLEASEWAIT_TIMEOUT, KEY_HUP | KEY_RIGHT );

	data->display = TRUE;							/* Allow OK and Fail messages to appear. */
	data->menu_win = parent_win;					/* Store parent window */

	/* Show information screen, storing window pointer */
	data->pleasewait_win = info_dialog(parent_win,&display_info);

	return data->pleasewait_win;
}


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

 $Function:    	GPRS_PleaseWaitCb

 $Description:	Please wait window callback function.

 $Returns:		None

 $Arguments:	win - the parent window
 				identifier - not used
 				reason - the reason for the callback

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

static void GPRS_PleaseWaitCb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	
	tracefunction("GPRS_PleaseWaitCb()");

	if (!data)
	{
		return;
	}
	
	/* Dialog already destroyed by this point */

	data->pleasewait_win = NULL;
	
	switch(reason)
	{
		case INFO_TIMEOUT:
		
			/* Delete window */
			
			info_screen(data->menu_win, TxtTimedOut, NULL, NULL);
			data->status = MMI_GPRS_STATUS_IDLE;
			break;
		
		case INFO_KCD_HUP:
		case INFO_KCD_RIGHT:
		
			/*Cancel current operation */
			
			switch(data->status)
			{
				case MMI_GPRS_STATUS_ATTACHING:
				case MMI_GPRS_STATUS_DETACHING:
					gprs_attach_abort();
					data->status = MMI_GPRS_STATUS_IDLE;
					data->display = FALSE;
					break;
				case MMI_GPRS_STATUS_DATA_COUNTER:
					gprs_counter_abort();
					data->status = MMI_GPRS_STATUS_IDLE;
					data->display = FALSE;
					break;
			}
			break;
	}
	
	return;
}


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

 $Function:    	GPRS_PleaseWaitDestroy

 $Description:	Check to see if the "Please Wait" window is present, and destroys it
 				if so.

 $Returns:		None.

 $Arguments:	None.

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

static void GPRS_PleaseWaitDestroy(void)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	
	tracefunction("GPRS_PleaseWaitDestroy()");

	if (!data)
	{
		return;
	}
	
	if (data->pleasewait_win)
	{
		SEND_EVENT(data->pleasewait_win, DIALOG_DESTROY, NULL, NULL);
		data->pleasewait_win = NULL;
	}
	
	return;
}


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

 $Function:    	GPRS_ShowCounter

 $Description:	Generic counter displaying function

 $Returns:

 $Arguments:	Standard menu option parameters

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

static void GPRS_ShowCounter(T_MFW_HND win)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
#ifdef NEW_EDITOR
	T_AUI_EDITOR_DATA	editor_data;
#else
	T_EDITOR_DATA	editor_data;
#endif
/*	T_MFW_GPRS		*gprs;  */ /* Warning Correction */
	USHORT			titleId;

	tracefunction("GPRS_ShowCounter()");

	if (!data)
	{
		return;
	}
	
	/* Destroy old editor if it exists */
	
	if (data->edit_win)
	{
		GPRS_DestroyCounter();
	}

	/* Set appropriate title string (corrected) */
	
	switch(data->counter_type)
	{
		case MMI_GPRS_COUNTER_DOWNLINK:
			titleId = TxtIncomingData;
			break;
		
		case MMI_GPRS_COUNTER_UPLINK:
			titleId = TxtOutgoingData;
			break;

		default:
			titleId = TxtNull;
			break;
	}

	data->counterstring = (char *)ALLOC_MEMORY(ULONG_SIZE_IN_DECIMAL);
	GPRS_UpdateCounter();

	/* New Editor */
#ifdef NEW_EDITOR
	AUI_edit_SetDefault(&editor_data);
	AUI_edit_SetDisplay(&editor_data, ZONE_FULL_SK_TITLE, COLOUR_EDITOR_XX, EDITOR_FONT);
	AUI_edit_SetEvents(&editor_data, data->counter_type, FALSE, FOREVER, (T_AUI_EDIT_CB)GPRS_ShowCounterCb);
	AUI_edit_SetTextStr(&editor_data, TxtReset, TxtSoftBack, titleId, NULL);
	AUI_edit_SetMode(&editor_data, ED_MODE_READONLY, ED_CURSOR_NONE);
	AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE *)data->counterstring, ULONG_SIZE_IN_DECIMAL);

	data->edit_win = AUI_edit_Start(win, &editor_data);
#else /* NEW_EDITOR */
	editor_data.TextString			= NULL;
	editor_data.LeftSoftKey			= TxtSoftOK;
	editor_data.RightSoftKey		= TxtReset;
	editor_data.AlternateLeftSoftKey	= NULL;
	editor_data.Callback			= (T_EDIT_CB)GPRS_ShowCounterCb;
	editor_data.Identifier			= data->counter_type;
	editor_data.hide				= FALSE;
	editor_data.mode				= READ_ONLY_MODE;
	editor_data.timeout           	= FOREVER;
	editor_data.min_enter			= 0;
	editor_data.destroyEditor		= FALSE;
	editor_data.editor_attr.win.px	= 0;
	editor_data.editor_attr.win.py	= Mmi_layout_line(1)+4;
	editor_data.editor_attr.win.sx	= SCREEN_SIZE_X;
	editor_data.editor_attr.win.sy	= Mmi_layout_line(2)+4;
	editor_data.editor_attr.edtCol	= COLOUR_EDITOR_XX;
	editor_data.editor_attr.font	= 0;
	editor_data.editor_attr.mode	= edtCurNone;
	editor_data.editor_attr.controls	= 0;
    editor_data.editor_attr.size	= ULONG_SIZE_IN_DECIMAL;
	editor_data.TextId				= titleId;

	editor_data.editor_attr.text = data->counterstring;

	/* Create the dialog handler */
	
	data->edit_win = editor_start(win, &editor_data);  /* start the editor */
#endif /* NEW_EDITOR */

	return;
}


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

 $Function:    	GPRS_ShowCounterCb

 $Description:	Change text string for the counter we've just changed

 $Returns:		nothing.

 $Arguments:	win		- the editor window
 				identifier - the type of counter we're updating
 				reason	- the event that caused the callback

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

static void GPRS_ShowCounterCb(T_MFW_HND win, USHORT identifier, USHORT reason)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	T_DISPLAY_DATA display_info;
	
	tracefunction("GPRS_ShowCounterCb()");

	if (!data)
	{
		return;
	}
	
	switch(reason)
	{
		/* Prompt whether to reset */
		 
		case INFO_KCD_LEFT:
			dlg_initDisplayData_TextId(&display_info, TxtCancel, TxtReset, TxtDataCounterReset, TxtNull, COLOUR_STATUS);
			dlg_initDisplayData_events(&display_info, (T_VOID_FUNC) GPRS_ResetCounter, TEN_SECS, KEY_HUP|KEY_CLEAR|KEY_LEFT|KEY_RIGHT );

		    info_dialog(win, &display_info);
			break;

		/* Press hangup key or select OK
		 * Calls GPRS_DestroyCounter to destroy window */
		case INFO_KCD_RIGHT:
		case INFO_KCD_HUP:
			GPRS_DestroyCounter();
			break;
	}

	return;
}


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

 $Function:    	GPRS_ResetCounter

 $Description:	Callback from dialogue prompting whether to reset the data counter

 $Returns:		None

 $Arguments:	Standard callback parameters
 
*******************************************************************************/

static void GPRS_ResetCounter(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();

	tracefunction("GPRS_ResetCounter()");

	if (!data)
	{
		return;
	}
	
	switch(reason)
	{
		/* RSK - Reset counter */
		
		case INFO_KCD_RIGHT:
			if (data->counter_type==MMI_GPRS_COUNTER_UPLINK)
			{
				data->uplink_counter = 0;
			}
			else
			{
				data->downlink_counter = 0;
			}
					
			GPRS_ShowCounter(win);
			break;
			
		/* LSK or HUP - cancel without resetting */
		
		case INFO_KCD_LEFT:
		case INFO_KCD_HUP:
			break;
	}
	
	return;
}


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

 $Function:    	GPRS_DestroyCounter

 $Description:	Destroy counter display

 $Returns:		None

 $Arguments:	None
 
*******************************************************************************/

static void GPRS_DestroyCounter()
{
	T_MMI_GPRS_DATA *data = GPRS_Data();

	tracefunction("GPRS_DestroyCounter()");
	
	if (!data)
	{
		return;
	}
	
	if (data->edit_win)
	{

	/* New Editor */
	
#ifdef NEW_EDITOR
		AUI_edit_Destroy(data->edit_win);
#else
		editor_destroy(data->edit_win);
#endif
		FREE_MEMORY((void *)data->counterstring, ULONG_SIZE_IN_DECIMAL);
		data->counterstring = NULL;
		data->edit_win = NULL;
	}
	
	return;
}

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

 $Function:    	GPRS_UpdateCounter

 $Description:	Change text string for the counter we've just changed

 $Returns:		None

 $Arguments:	None

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

static void GPRS_UpdateCounter(void)
{
	T_MMI_GPRS_DATA *data = GPRS_Data();
	ULONG counter;

	tracefunction("GPRS_UpdateCounter()");

	if (!data)
	{
		return;
	}
	
	counter = 0;
	
	switch(data->counter_type)
	{
		case MMI_GPRS_COUNTER_UPLINK:
			counter = data->uplink_counter;
			break;
		
		case MMI_GPRS_COUNTER_DOWNLINK:
			counter = data->downlink_counter;
			break;
	}

	if (counter<1024)
	{
		sprintf(data->counterstring, "%d bytes",counter);		// Counter is <1K, display bytes
	}
	else
	{
		counter = counter/KILOBYTE;
		if (counter<1024)
			sprintf(data->counterstring, "%dKB",counter);		// Counter is <1M, display Kbytes
		else
		{
			counter = counter/KILOBYTE;
			sprintf(data->counterstring, "%dMB",counter);		// Display Mbytes
		}
	}

	return;
}