view src/ui/bmi/AUIPinEditor.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 70ea7526b59e
children
line wrap: on
line source

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

	CONDAT (UK)

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

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

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

 $Project name: Basic MMI
 $Project code: BMI (6349)
 $Module:       MMI
 $File:         AUIPinEditor.c
 $Revision:     1.0

 $Author:       Condat(UK)
 $Date:         22/02/01

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

 Description: Editor for PIN entry


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

 $History: AUIPinEditor.c

    xreddymn 4, Jul, 2006 OMAPS00083495
    Resolved issues reported in PIN and PUK input through BPM.

        xrashmic 1 Jul, 2006 OMAPS00075784
        The password mode to be turned on while entering the gsm string to
        unblock PUK during bootup

    July 09, 2005   REF : MMI - 22565 - a0876501
    Description:    Proper display of IMEI with CD byte.
    Solution:       Increased the IMEI length from 16 to 18.

    June 16, 2005  REF: CRR 31267  x0021334
    Description: Handset ignore the initializtion of the PIN1/PIN2
    Fix:    Cheking is done to ascertain if PIN1/PIN2 are initialised. If not, appropriate
           message is displayed to the user.

    May 02, 2005   REF : LOCOSTO-ENH-30818 - xpradipg
    Description:    IMEI retreival  by posting a call to ACI sAT_xx API
    Solution:       The direct call to cl_get_imeisv() is replaced with the
                    call to the mmi_imei_retrieve() which inturn calls sAT_Dn() and
                    retrieves the IMEI info and stores it onto the global
                    variable "imei"
  14/11/02      Original Condat(UK) BMI version.
 $End

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

#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

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

#else

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

#endif

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "mfw_sms.h"
#include "mfw_ss.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_lng.h"
#include "mfw_sat.h"
#include "mfw_kbd.h"
#include "mfw_nm.h"
#include "mfw_cm.h"
#include "mfw_sim.h"
#include "mfw_ssi.h"

#include "dspl.h"

#include "ksd.h"
#include "psa.h"

#include "MmiDummy.h"
#include "MmiMmi.h"

#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiMenu.h"
#include "MmiSoftKeys.h"
#include "MmiIdle.h"
#include "MmiResources.h"
#include "MmiPins.h"
#include "cus_aci.h"
#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif


#include "mmiColours.h"

#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"
#include "AUITextEntry.h"

#include "AUIPinEditor.h"

//Nov 17, 2005   REF : OMAPS00045901 - a0876501
#define IMEI_DISP_LEN 18    /* IMEI display now includes CD byte. Hence the size has been increased from 16 to 18 */

typedef struct
{
    T_MMI_CONTROL       mmi_control;
    T_MFW_HND           parent;             // The parent window
    T_MFW_HND           win;                // The edit window
    T_MFW_HND           kbd;                // The keyboard handler
    T_MFW_HND           kbd_long;           // The longpress keyboard handler
    T_MFW_HND           timer;              // The timer for timeouts

    T_ED_DATA           *editor;            /* The ATB editor */
    T_AUI_EDITOR_DATA   editor_data;        /* The MMI editor data, provided by caller */
    T_AUI_ENTRY_DATA    *entry_data;        /* The MMI text entry data */

    BOOL                haveTitle;          /* TRUE if a title is supplied */
    T_ATB_TEXT          title;              /* Title of editor */

    BOOL                hidden;

    BOOL                doNextLongPress;    /* Flag used to notice/not notice long keypress */
    BOOL                enteredMinChars;    /* Set to TRUE when at least min_enter characters have been entered */
    BOOL                enteredSomeChars;   /* Set to TRUE if the length of the entered data is non-zero */
    UBYTE               emergency_call;     /* Set to TRUE if number is an emergency call number */
    UBYTE               ss_string;
    char                imei[IMEI_DISP_LEN];/* IMEI display now includes CD byte. Hence the size has been increased from 16 to 18 */
}
T_AUI_PIN_DATA;

#define AUI_MAX_PIN 16

// June 16, 2005  REF: CRR 31267  x0021334
extern BOOL pin1Flag; // This flag will be needed here

typedef struct
{
    U8      pin_id;
    char    puk_code[AUI_MAX_PIN + 1];
    char    new_pin[AUI_MAX_PIN + 1];
    char    cnf_pin[AUI_MAX_PIN + 1];
}
T_AUI_PINS;
/* LOCAL FUNCTION PROTOTYPES */
static T_MFW_HND AUI_pin_Create(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data);
static void AUI_pin_ExecCb(T_MFW_HND win, USHORT event, SHORT value, void *parameter);
static int AUI_pin_WinCb(T_MFW_EVENT event, T_MFW_WIN *win_data);
static int AUI_pin_KbdCb(T_MFW_EVENT event, T_MFW_KBD *keyboard);
static int AUI_pin_KbdLongCb(T_MFW_EVENT event, T_MFW_KBD *keyboard);
static UBYTE AUI_pin_CheckEmergency(T_AUI_PIN_DATA *data);
T_MFW_SS_RETURN AUI_pin_CheckSSString(T_AUI_PIN_DATA *data);
static BOOL AUI_pin_StripSSUnblock(char *cmd_string, T_AUI_PINS *pin_data);


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

 $Function:     AUI_pin_Start

 $Description:  Start the PIN editor.

 $Returns:      None.

 $Arguments:    None.

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

T_MFW_HND AUI_pin_Start(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data)
{
    T_MFW_HND win;

    TRACE_FUNCTION ("AUI_pin_Start()");

    win = AUI_pin_Create(parent, editor_data);

    return win;
}


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

 $Function:     AUI_pin_Create

 $Description:  Create the PIN editor.

 $Returns:      Pointer to the editor's window.

 $Arguments:    parent  -   The parent window.

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

static T_MFW_HND AUI_pin_Create(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data)
{
    T_AUI_PIN_DATA  *data;
    T_MFW_WIN           *win_data;

    TRACE_FUNCTION ("AUI_pin_Create()");
    TRACE_EVENT_P1("Memory left (start): %d", mfwCheckMemoryLeft());

    data = (T_AUI_PIN_DATA *)ALLOC_MEMORY(sizeof (T_AUI_PIN_DATA));
    TRACE_EVENT_P1("Memory left (data): %d", mfwCheckMemoryLeft());

    /* Create window handler */

    data->win = win_create(parent, 0, E_WIN_VISIBLE, (T_MFW_CB)AUI_pin_WinCb);  // Create window
    TRACE_EVENT_P1("Memory left (win): %d", mfwCheckMemoryLeft());

    if (data->win==NULL)                                                        // Make sure window exists
    {
        return NULL;
    }

    /* Connect the dialog data to the MFW-window */

    data->mmi_control.dialog    = (T_DIALOG_FUNC)AUI_pin_ExecCb;                /* Setup the destination for events */
    data->mmi_control.data      = data;
    data->parent                = parent;
    win_data                    = ((T_MFW_HDR *)data->win)->data;
    win_data->user              = (void *)data;

    data->kbd                   = kbd_create(data->win, KEY_ALL,(T_MFW_CB)AUI_pin_KbdCb);
    data->kbd_long              = kbd_create(data->win, KEY_ALL|KEY_LONG,(T_MFW_CB)AUI_pin_KbdLongCb);
    data->editor                = ATB_edit_Create(&data->editor_data.editor_attr,0);
TRACE_EVENT_P1("Memory left (editor): %d", mfwCheckMemoryLeft());
    data->editor_data = *editor_data;
    data->entry_data = AUI_entry_Create(data->win, data->editor, E_PIN_UPDATE);
TRACE_EVENT_P1("Memory left (entry): %d", mfwCheckMemoryLeft());
    SEND_EVENT(data->win, E_PIN_INIT, 0, 0);

    /* Return window handle */

    return data->win;
}


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

 $Function:     AUI_pin_Destroy

 $Description:  Destroy the PIN editor.

 $Returns:      None.

 $Arguments:    window  -   The editor window.

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

void AUI_pin_Destroy(T_MFW_HND win)
{
    T_MFW_WIN       *win_data   = ((T_MFW_HDR *)win)->data;
    T_AUI_PIN_DATA  *data       = (T_AUI_PIN_DATA *)win_data->user;

    TRACE_FUNCTION("AUI_pin_Destroy");
    TRACE_EVENT_P1("Memory left at start: %d", mfwCheckMemoryLeft());

    if (data)
    {
        /* Free memory allocated for title */

        if (data->haveTitle)
        {
            FREE_MEMORY(data->title.data, (data->title.len+1)*ATB_string_Size(&data->title));
            TRACE_EVENT_P1("Memory left (title dest): %d", mfwCheckMemoryLeft());
        }

        /* Free text entry memory */

        AUI_entry_Destroy(data->entry_data);
        TRACE_EVENT_P1("Memory left (entry dest): %d", mfwCheckMemoryLeft());
        /* Delete window */

        win_delete (data->win);
        TRACE_EVENT_P1("Memory left (win dest): %d", mfwCheckMemoryLeft());
        /* Free editor memory */

        ATB_edit_Destroy(data->editor);
        TRACE_EVENT_P1("Memory left (editor dest): %d", mfwCheckMemoryLeft());
        /* Free Memory */

        FREE_MEMORY ((void *)data, sizeof (T_AUI_PIN_DATA));
        TRACE_EVENT_P1("Memory left (data dest): %d", mfwCheckMemoryLeft());
    }

    return;
}


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

 $Function:     AUI_pin_ExecCb

 $Description:  Dialog function for PIN editor.

 $Returns:      None.

 $Arguments:    None.

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

static void AUI_pin_ExecCb(T_MFW_HND win, USHORT event, SHORT value, void *parameter)
{
    T_MFW_WIN           *win_data   = ((T_MFW_HDR *)win)->data;
    T_AUI_PIN_DATA      *data       = (T_AUI_PIN_DATA *)win_data->user;
    T_MFW_HND           parent_win  = data->parent;
    T_ATB_TEXT          text={0,0,NULL};
    /* Store these in case editor is destroyed on callback */
    USHORT              Identifier  = data->editor_data.Identifier;
    T_AUI_EDIT_CB       Callback    = data->editor_data.Callback;
    UBYTE               destroyEditor = data->editor_data.destroyEditor;
    T_AUI_PINS      *pin_unblock_data;

    TRACE_FUNCTION ("AUI_pin_ExecCb()");

    switch (event)
    {
        /* Initialise */

        case E_PIN_INIT:
            TRACE_EVENT("E_PIN_INIT");
            ATB_edit_Init(data->editor);

            data->haveTitle = FALSE;

            /* If we require an output line, shrink editor to fit it at bottom
             * NB TitleString is assumed here to be a numeric string of ascii digits */

            if (data->editor_data.TitleString)
            {
                data->haveTitle = TRUE;
                text.data = data->editor_data.TitleString;
            }

            /* Set up title */

            if (data->editor_data.TitleId!=NULL)
            {
                data->haveTitle = TRUE;
                text.data = (UBYTE *)MmiRsrcGetText(data->editor_data.TitleId);
            }

            /* If title exists, get its dcs and length */

            if (data->haveTitle)
            {
                if (text.data[0]==0x80)
                {
                    text.data += 2;     /* Skip over two unicode indicator bytes */
                    text.dcs = ATB_DCS_UNICODE;
                }
#ifdef EASY_TEXT_ENABLED
                else if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
                {
                    text.dcs = ATB_DCS_UNICODE;
                }
#endif
                else
                {
                    text.dcs = ATB_DCS_ASCII;
                }

                text.len = ATB_string_Length(&text);
                /* Allocate memory for the title and copy the text there */
                data->title.data = (UBYTE *)ALLOC_MEMORY((text.len+1)*ATB_string_Size(&text));
                TRACE_EVENT_P1("Memory left (title): %d", mfwCheckMemoryLeft());
                ATB_string_Copy(&data->title, &text);
            }

            /* Set flag if min_enter characters are in buffer */

            if (data->editor_data.editor_attr.text.len >= data->editor_data.min_enter)
                data->enteredMinChars = TRUE;
            else
                data->enteredMinChars = FALSE;

            /* Set flag if some characters are in the buffer */
            if (data->editor_data.editor_attr.text.len > 0 )
                data->enteredSomeChars = TRUE;
            else
                data->enteredSomeChars = FALSE;

            /* Show the window */
            win_show(data->win);
            break;

        case E_PIN_UPDATE:
            TRACE_EVENT("E_PIN_UPDATE");
            win_show(data->win);
            break;

        case E_PIN_DEINIT:
            TRACE_EVENT("E_PIN_DEINIT");

            if (Callback)
                (Callback) (parent_win, Identifier, value);

            if (destroyEditor)
                AUI_pin_Destroy(data->win);

            break;

        case E_PUK1_COMPLETE:
            TRACE_EVENT("E_PIN_COMPLETE");

            pin_unblock_data = (T_AUI_PINS *)parameter;

            sim_unblock_pin(pin_unblock_data->pin_id,
                             pin_unblock_data->puk_code,
                             pin_unblock_data->new_pin); /* unblock pin1 */

            if (destroyEditor)
                AUI_pin_Destroy(data->win);

            break;

    }

    return;
}

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

 $Function:     AUI_pin_WinCb

 $Description:  PIN editor window event handler.

 $Returns:      None.

 $Arguments:    event   - the event
                win     - the editor window

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

static int AUI_pin_WinCb(T_MFW_EVENT event, T_MFW_WIN *win_data)
{
    T_AUI_PIN_DATA      *data           = (T_AUI_PIN_DATA *)win_data->user;
    T_ED_DATA           *editor         = data->editor;
    T_ATB_WIN_SIZE      *win_size       = &data->editor->attr->win_size;
    T_ATB_TEXT          text;
    T_DS_TEXTFORMAT     format;
  //  USHORT                titleLen;  // RAVI

    if (!data)
        return MFW_EVENT_CONSUMED;

    switch(event)
    {
        case E_WIN_VISIBLE:                                             /* window is visible */
            if (win_data->flags & E_WIN_VISIBLE)
            {
                if (editor->update==ED_UPDATE_TRIVIAL)
                {
                    TRACE_EVENT("Only updating editor.");
                    ATB_edit_Show(data->editor);
                }
                else
                {
                    TRACE_EVENT("Updating whole screen.");

                    ATB_edit_Show(data->editor);

                    /* Set the colour for drawing title */

                    resources_setTitleColour(COLOUR_EDITOR);

                    /* TITLE - only display if update type is FULL or DEFAULT*/

                    if (editor->update!=ED_UPDATE_PARTIAL)
                    {
                        dspl_Clear(0,0, SCREEN_SIZE_X-1, win_size->py-1);

                        if (data->haveTitle)
                        {
                            ATB_display_SetFormatAttr(&format, 0, FALSE);

                            /* Display "Emergency?" prompt in title if emergency call */
                            if (data->emergency_call)
                            {
                                text.dcs = data->title.dcs;
                                text.data = (UBYTE *)MmiRsrcGetText(TxtEmergency);
                                text.len = ATB_string_Length(&text);
                                ATB_display_Text(0,0,&format, &text);
                            }
                            /* Otherwise, show title */
                            else
                            {
                                ATB_display_Text(0,0,&format, &data->title);
                            }
                        }
                    }

                    /* Display Soft Keys */

                    if (data->emergency_call)
                    {
                        displaySoftKeys(TxtSoftCall, data->editor_data.RightSoftKey);
                    }
                    else
                    {
                        if (data->editor_data.editor_attr.text.len < data->editor_data.min_enter)
                        {
                            /* entered less than the required number of chars: Alternate Softkey appears */
                            if (data->editor_data.editor_attr.text.len > 0)
                                displaySoftKeys(data->editor_data.AltLeftSoftKey,data->editor_data.RightSoftKey);
                            else
                                displaySoftKeys(data->editor_data.AltLeftSoftKey,TxtNull);
                        }
                        else
                        {
                            /* entered sufficient number of chars: Normal Softkey appears */

                            if (data->editor_data.editor_attr.text.len > 0)
                                displaySoftKeys(data->editor_data.LeftSoftKey,data->editor_data.RightSoftKey);
                            else
                                displaySoftKeys(data->editor_data.LeftSoftKey, TxtNull);
                        }
                    }
                }
            }
            break;
    }

    data->editor->update = ED_UPDATE_DEFAULT;

    /* x0045876, 14-Aug-2006 (WR - non-void function "AUI_pin_WinCb" should return a value) */
    return MFW_EVENT_CONSUMED ;
}


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

 $Function:     AUI_pin_KbdCb

 $Description:  PIN editor keyboard event handler

 $Returns:      None.

 $Arguments:    event       - the keyboard event
                keyboard

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

static int AUI_pin_KbdCb(T_MFW_EVENT event, T_MFW_KBD *keyboard)
{
    T_MFW_HND           win         = mfw_parent (mfw_header());
    T_MFW_WIN           *win_data   = ((T_MFW_HDR *)win)->data;
    T_AUI_PIN_DATA      *data       = (T_AUI_PIN_DATA *)win_data->user;
//  ED_RES              result;    // RAVI
    UBYTE               *edit_data_buf;
    BOOL                bRetVal;
    T_AUI_PINS          pin_unblock_data;
    T_DISPLAY_DATA      display_info;

    TRACE_FUNCTION("AUI_pin_KbdCb()");

   /* Suppress unwanted long keypresses */

    data->doNextLongPress = TRUE;               /* next Key_long event is correct */
    data->editor->update = ED_UPDATE_DEFAULT;   /* Default behaviour is just to update text */

    switch (keyboard->code)
    {
        case KCD_STAR:
            /* Only possible when the first digit is a '*' */
            if ((data->editor_data.editor_attr.text.len==0) ||
                 (data->ss_string))
            {
                if (data->editor_data.editor_attr.text.len==0)
                {
                    data->hidden = FALSE;
                    data->ss_string = TRUE;
                    /* The string should now be visible on screen */
                    if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
                    {
                        data->hidden = TRUE;
                        ATB_edit_ResetMode(data->editor, ED_MODE_HIDDEN);
                    }
                }

                AUI_entry_EventKey(data->entry_data, event, keyboard);
                win_show(data->win);
            }
            //xrashmic 1 Jul, 2006 OMAPS00075784
                     //The password mode to be turned on while entering the gsm string to
                    //unblock PUK during bootup
            if(data->editor_data.editor_attr.text.len >=4 )
                       {
                            if((strncmp((char*)data->editor_data.editor_attr.text.data, "**05*", 5) == 0) ||
                                (strncmp((char*)data->editor_data.editor_attr.text.data, "**052*", 6) == 0) ||
                                (strncmp((char*)data->editor_data.editor_attr.text.data, "**04*", 5) == 0) ||
                                (strncmp((char*)data->editor_data.editor_attr.text.data, "**042*", 6) == 0))
                            {
                             ATB_edit_SetMode(data->editor, ED_MODE_HIDDEN);
                            }
                       }
            break;

        case KCD_HASH:
            /* Send SS string if we're entering one */
            if(data->ss_string)
            {
                AUI_entry_EventKey(data->entry_data, event, keyboard);
                    //xrashmic 1 Jul, 2006 OMAPS00075784
                            //The password mode to be turned on while entering the gsm string to
                            //unblock PUK during bootup

                            if(ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
                                {
                                     if((strncmp((char*)data->editor_data.editor_attr.text.data, "**05*", 5) == 0) ||
                                     (strncmp((char*)data->editor_data.editor_attr.text.data, "**04*", 5) == 0))
                                     {
                                      strncpy((char*)&data->editor_data.editor_attr.text.data[5],(char*)&data->editor->hiddenText->data[5], data->editor_data.editor_attr.text.len - 5);
                                        }
                                     else if ((strncmp((char*)data->editor_data.editor_attr.text.data, "**052*", 6)== 0) ||
                                     (strncmp((char*)data->editor_data.editor_attr.text.data, "**042*", 6) == 0))
                                     {
                                      strncpy((char*)&data->editor_data.editor_attr.text.data[6],
                                      (char*)&data->editor->hiddenText->data[6], data->editor_data.editor_attr.text.len - 6);
                                     }
                               }

                edit_data_buf = ALLOC_MEMORY(data->editor_data.editor_attr.size);

                strcpy((char *)edit_data_buf, (char *)data->editor_data.editor_attr.text.data);

                switch (AUI_pin_CheckSSString(data))
                {
                    case MFW_SS_MMI:
//  May 02, 2005   REF : LOCOSTO-ENH-30818 - xpradipg
//  replace the call to get_imei() with callNumber
#ifdef FF_MMI_ATC_MIGRATION
                        mmi_imei_retrieve();
#else
                        get_imei((char*)data->imei);
                        showIMEI(win,(char*)data->imei);
#endif
                        ATB_edit_ClearAll(data->editor);

                        /* Set back to the default */
                        data->ss_string = FALSE;

                        if (data->hidden == TRUE)
                        {
                            /* go back in the hide mode */
                            ATB_edit_SetMode(data->editor, ED_MODE_HIDDEN);
                        }

                        FREE_MEMORY((void *)edit_data_buf, data->editor_data.editor_attr.size);
                        win_show(data->win);
                        return MFW_EVENT_CONSUMED;
//                      break;   // RAVI

                    case MFW_SS_SIM_UNBLCK_PIN:
                        bRetVal = AUI_pin_StripSSUnblock((char *)edit_data_buf, &pin_unblock_data);

                        FREE_MEMORY((void *)edit_data_buf, data->editor_data.editor_attr.size);

                        if (bRetVal == FALSE)
                        {
                            /*
                            ** Clear the entered string, reset the editor and display a "failed" dialog
                            */
                            ATB_edit_ClearAll(data->editor);

                            /* Set back to the default */
                            data->ss_string = FALSE;

                            if (data->hidden == TRUE)
                            {
                                /* go back in the hide mode */
                                ATB_edit_SetMode(data->editor, ED_MODE_HIDDEN);
                            }

                            dlg_initDisplayData_TextId(&display_info, TxtNull, TxtNull, TxtFailed, TxtNull, COLOUR_POPUP);
                            dlg_initDisplayData_events(&display_info, NULL, THREE_SECS, 0);
                            info_dialog(0, &display_info);

                        }
                        else
                        {
                            SEND_EVENT (win, E_PUK1_COMPLETE, INFO_KCD_LEFT, &pin_unblock_data);
                        }

                        return MFW_EVENT_CONSUMED;
//                      break;  // RAVI

                    default:
                        /* xreddymn OMAPS00083495 Jul-04-2006
                         * Display error dialog for BPM strings that are not handled.
                         */
                        ATB_edit_ClearAll(data->editor);
                        data->ss_string = FALSE;
                        if (data->hidden == TRUE)
                        {
                            ATB_edit_SetMode(data->editor, ED_MODE_HIDDEN);
                        }
                        dlg_initDisplayData_TextId(&display_info, TxtNull, TxtNull, TxtNotAllowed, TxtNull, COLOUR_POPUP);
                        dlg_initDisplayData_events(&display_info, NULL, THREE_SECS, 0);
                        info_dialog(0, &display_info);
                        FREE_MEMORY((void *)edit_data_buf, data->editor_data.editor_attr.size);
                        break;
                }
                win_show(data->win);

            }
            else if (data->editor_data.editor_attr.text.len >= data->editor_data.min_enter)
            {
                if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
                {
                    ATB_edit_HiddenExit(data->editor);
                }
                SEND_EVENT (win, E_PIN_DEINIT, INFO_KCD_LEFT, NULL);
            }

            break;

#ifdef COLOURDISPLAY
        /* Menu select has same effect as left soft key */
        case KCD_MNUSELECT:
#endif /* COLOURDISPLAY */

        case KCD_LEFT:
            /* Make an emergency call if an appropriate number entered */
            if ( data->emergency_call )
            {
                /* Copy the actual typed text into the buffer */
                if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
                {
                    ATB_edit_HiddenExit(data->editor);
                }
                SEND_EVENT (win, E_PIN_DEINIT, INFO_EMERGENCY, NULL);
            }
            /* Submit PIN if sufficient characters entered */
            else if (data->editor_data.editor_attr.text.len >= data->editor_data.min_enter)
            {
                // June 16, 2005  REF: CRR 31267  x0021334
                // If PIN1/PUK1 =0, Show info dialog that SIM is blocked
                if (pin1Flag EQ TRUE)
                {
                    dlg_initDisplayData_TextId(&display_info,  NULL, NULL, TxtSimBlocked, TxtDealer, COLOUR_STATUS);
                    dlg_initDisplayData_events(&display_info, (T_VOID_FUNC)NULL, THREE_SECS, KEY_LEFT | KEY_RIGHT);
                    info_dialog (NULL, &display_info);
                    break;
                }
                /* Left Softkey is enabled (and entered sufficient number of chars): execute it. */
                /* Copy the actual typed text into the buffer */
                if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
                {
                    ATB_edit_HiddenExit(data->editor);
                }
                SEND_EVENT (win, E_PIN_DEINIT, INFO_KCD_LEFT, NULL);
            }
            break;

        case KCD_HUP:
        break;

        case KCD_CALL:
            /* Make an emergency call if an appropriate number entered */
            if ( data->emergency_call )
            {
                /* Copy the actual typed text into the buffer */
                if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
                {
                    ATB_edit_HiddenExit(data->editor);
                }
                SEND_EVENT (win, E_PIN_DEINIT, INFO_EMERGENCY, NULL);
            }
        break;

        case KCD_RIGHT:
            if(data->editor_data.editor_attr.text.len!=0)
            {
                    //xrashmic 1 Jul, 2006 OMAPS00075784
                             //The password mode to be turned on while entering the gsm string to
                            //unblock PUK during bootup
                    if(ATB_edit_Mode(data->editor, ED_MODE_HIDDEN) &&
                             (((data->editor_data.editor_attr.text.len == 5) &&
                             ((strncmp((char*)data->editor_data.editor_attr.text.data, "**05*", 5) == 0) ||
                             (strncmp((char*)data->editor_data.editor_attr.text.data, "**04*", 5) == 0))) ||
                             ((data->editor_data.editor_attr.text.len == 6) &&
                             ((strncmp((char*)data->editor_data.editor_attr.text.data, "**052*", 6) == 0) ||
                             (strncmp((char*)data->editor_data.editor_attr.text.data, "**042*", 6) == 0)))))
                            {
                                 ATB_edit_ResetMode(data->editor, ED_MODE_HIDDEN);
                            }

                ATB_edit_DeleteLeft(data->editor, TRUE); /* SPR#2342 - SH */

                /* For a SS string */
                if ( !ATB_edit_Mode(data->editor,ED_MODE_HIDDEN) )
                {
                    if (data->editor_data.editor_attr.text.len==0 && data->ss_string)
                    {
                        data->ss_string = FALSE;
                        if (data->hidden == TRUE)
                        {
                            /* The string should not be visible on screen */
                            ATB_edit_SetMode(data->editor, ED_MODE_HIDDEN);
                        }
                    }
                }

                /* is it a  emergency call number ?!*/
                AUI_pin_CheckEmergency(data);
                win_show(data->win);
            }
            break;

        case KCD_0:
        case KCD_1:
        case KCD_2:
        case KCD_3:
        case KCD_4:
        case KCD_5:
        case KCD_6:
        case KCD_7:
        case KCD_8:
        case KCD_9:
            /* xreddymn OMAPS00083495 Jul-04-2006
             * Limit PIN1, PIN2 entries to 8 digits.
             */
            if(((data->editor_data.Identifier==PIN1_REQ) ||
                (data->editor_data.Identifier==PIN2_REQ)) &&
                (data->editor_data.editor_attr.text.len>=8) &&
                (!data->ss_string))
                return MFW_EVENT_CONSUMED;
            else
            {
                AUI_entry_EventKey(data->entry_data, event, keyboard);
                /* is it a  emergency call number ?!*/
                AUI_pin_CheckEmergency(data);
                win_show(data->win);
            }
            break;
        }

    return MFW_EVENT_CONSUMED;
}


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

 $Function:     AUI_pin_KbdLongCb

 $Description:  PIN editor long keypress keyboard event handler

 $Returns:      None.

 $Arguments:    event       - the keyboard event
                keyboard

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

static int AUI_pin_KbdLongCb(T_MFW_EVENT event, T_MFW_KBD *keyboard)
{
    T_MFW_HND           win         = mfw_parent (mfw_header());
    T_MFW_WIN           *win_data   = ((T_MFW_HDR *)win)->data;
    T_AUI_PIN_DATA      *data       = (T_AUI_PIN_DATA *)win_data->user;
    ED_RES              result;

    /* Suppress unwanted long keypresses */

     if ( data->doNextLongPress )
        data->doNextLongPress = FALSE;                  /* mark Key_long event as consumed but do current long press */
    else
        return MFW_EVENT_CONSUMED;              /* don't do current long press */

    switch (keyboard->code)
    {
        case KCD_RIGHT:
            /* Long press of RSK deletes buffer */
            result = ATB_edit_ClearAll(data->editor);

            /* If we've deleted on an empty buffer, exit editor */
            if (result==ED_DONE)
            {
                SEND_EVENT(data->win, E_PIN_DEINIT, INFO_KCD_RIGHT, 0);
            }
            else
            {
                win_show(data->win);
            }
            break;
    }

    return MFW_EVENT_CONSUMED;

}


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

 $Function:     AUI_pin_CheckEmergency

 $Description:  Check number to see if it's an emergency number

 $Returns:      None.

 $Arguments:    data        - The editor data

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

static UBYTE AUI_pin_CheckEmergency(T_AUI_PIN_DATA *data)
{
    UBYTE previous_emergency = data->emergency_call;
    UBYTE previous_entered = data->enteredMinChars;
    UBYTE previous_someentered = data->enteredSomeChars;
    UBYTE emergency_call;

    /*SPR#2235 - DS - If the edit mode is 'hidden' then pass
     *the 'hidden buffer' as the parameter to cm_check_emergency.
     *If the edit mode is not 'hidden' then pass the normal editor
     *text buffer as the parameter.
     */
    if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
        emergency_call = cm_check_emergency(data->editor->hiddenText->data);
    else
        emergency_call = cm_check_emergency(data->editor_data.editor_attr.text.data);

    if(emergency_call == TRUE)
    {
        TRACE_EVENT(" it is a emergency number !");
        data->emergency_call = TRUE;
    }
    else
    {
        data->emergency_call = FALSE;
    }

    /* Check if we've entered min_enter characters */

    if (data->editor_data.editor_attr.text.len >= data->editor_data.min_enter)
        data->enteredMinChars = TRUE;
    else
        data->enteredMinChars = FALSE;

    if (data->editor_data.editor_attr.text.len > 0)
        data->enteredSomeChars = TRUE;
    else
        data->enteredSomeChars = FALSE;

    /* Check if the softkeys have changed */

    if (data->emergency_call!=previous_emergency)
    {
        data->editor->update = ED_UPDATE_FULL;      /* Update softkeys, title and editor */
    }
    else if (data->enteredMinChars!=previous_entered || data->enteredSomeChars!=previous_someentered)
    {
        data->editor->update = ED_UPDATE_PARTIAL;   /* Update softkeys and editor */
    }
    else
    {
        data->editor->update = ED_UPDATE_TRIVIAL;   /* Just update editor */
    }

    return data->emergency_call;
}


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

 $Function:     AUI_pin_CheckSSString

 $Description:  Check number to see if it's an ss string

 $Returns:      None.

 $Arguments:    event       - the keyboard event
                keyboard

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

T_MFW_SS_RETURN AUI_pin_CheckSSString(T_AUI_PIN_DATA *data)
{
    return ss_check_ss_string(data->editor_data.editor_attr.text.data);
}


static BOOL AUI_pin_StripSSUnblock(char *cmd_string, T_AUI_PINS *pin_data)
{
    T_MFW_SS_RETURN retVal;
    char    *rest;
    T_KSD_SEQPARAM ss_params;

    TRACE_EVENT_P2("AUI_pin_StripSSUnblock : &cmd_string = 0x%08lx, &pin_data = 0x%08lx", cmd_string, pin_data);

    /*
    ** The incoming parameters chould not be NULL
    */
    if ((cmd_string == NULL) ||
         (pin_data == NULL))
        return FALSE;

    retVal = ss_decode((UBYTE *)cmd_string, &rest, &ss_params);

    if (retVal == MFW_SS_SIM_UNBLCK_PIN)
    {
        if (ss_params.ublk.ssCd == KSD_SS_PIN1)
        {
            pin_data->pin_id = MFW_SIM_PUK1;
            strcpy(pin_data->puk_code, (char *)ss_params.ublk.puk);
            strcpy(pin_data->new_pin, (char *)ss_params.ublk.pin);
            strcpy(pin_data->cnf_pin, (char *)ss_params.ublk.pin);

            return TRUE;
        }
        else
        {
            TRACE_EVENT("AUI_pin_StripSSUnblock : Not unblocking PIN1");
            return FALSE;
        }
    }
    else
    {
        TRACE_EVENT_P1("AUI_pin_StripSSUnblock : ss_decode returned %d", retVal);
        return FALSE;
    }
}