view src/ui/bmi/mmiGprs.c @ 222:c336ed5691a5

FCHG: clear BCICTL2 on boot for extra safety
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Apr 2021 22:04:10 +0000
parents abaee5bdfdc9
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;
}