view src/ui/bmi/mmiLists.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 65f0ce5bd32f
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:         MmiLists.c
 $Revision:     1.0

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

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

 Description:


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

 $History: MmiLists.c

    July 10, 2007    REF:  DRT OMAPS00135679  x0073106
    Description:MM: Board freezes while choosing settings menu in File management.
    Solution: Hang-up key is mapped properly while going back from audio list window.

    Mar 30, 2007    REF: OMAPS00122691  x0039928
    Description: COMBO: No melody heard on parsing over different volums in tones menu
    Solution: E_MELODY_START event is sent to play the melody.

    xrashmic 8 Sep 2006, OMAPS00091618
    Removed redundant code introduced during integration

    June 19, 2006    REF: DRT OMAPS00076378  x0012849 : Jagannatha
    Description: MIDI files should play while browsing
    Solution: Event will be generated upon press of Menu up and down key.

    June 05, 2006 REF:OMAPS00060424 x0045876
    Description: Header Toggling
    Solution: Implemented the toggling of header when displaying the length text in SELECT ITEM and SET UP MENU

    May 18, 2006    REF: DRT OMAPS00076438  xdeepadh
    Description: Scrolling not implemented in Imageviewer
    Solution: The support for scrolling has been provided.

        May 03, 2006    REF: DRT OMAPS00076439  xdeepadh
    Description: Image viewer back not working
    Solution: The Preview List will be repopulated, when the list window is
    resumed.

        May 03, 2006    REF: DRT OMAPS00076376  xdeepadh
    Description: File Viewer-N5.12 issues (very unstable)
    Solution: The keys are blocked until the view or preview is completed.

    Dec 22, 2005    REF: ENH  xdeepadh
    Description: Image Viewer Application
    Solution: Implemeted the Image Viewer  to view the jpeg images

       xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
       Using the MenuSelect Key for requesting the help info in STK menu. Storing the info that
       MenuSelectKey was pressed in a list view.

    May 24, 2005    REF: CRR 29358  x0021334
    Description: CT_PTCRB 27.22.4.9.8 fails: wrong terminal response
    Fix:    The implementation is now based on timer. After the specified timeout period
           the control comes back to SAT main menu, if there is no selection done by the user.

    25/10/00            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 "gdi.h"
#include "audio.h"

#include "pconst.cdg"
#include "mconst.cdg"
#include "message.h"
#include "ccdapi.h"
#include "prim.h"
#include "cus_aci.h"
#include "cnf_aci.h"
#include "mon_aci.h"

#include "tok.h"

#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif


#include "mfw_sys.h"

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
#include "mfw_lng.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_tim.h"

#include "mfw_sim.h"
#include "mfw_cm.h"
#include "mfw_nm.h"
#include "mfw_phb.h"
#include "mfw_mme.h"
#include "mfw_sat.h"
#include "mfw_sms.h"

#include "dspl.h"

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

#include "MmiMain.h"
#include "MmiBookController.h"
#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiLists.h"


#include "MmiMenu.h"
#include "mmiCall.h"
#include "Mmiicons.h"
#include "MmiIdle.h"

#include "MmiSoftKeys.h"
#include "MmiSounds.h"
#include "MmiIdle.h"
#include "MmiNetwork.h"
#include "mmiSat_i.h"
#include "MmiAoc.h"


#include "cus_aci.h"
#include "mfw_ffs.h"
#include "MmiTimers.h"


#include "mmiColours.h"


#ifndef MFW_EVENT_PASSED
#define MFW_EVENT_PASSED 0
#endif

/* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
MfwHnd g_win;

extern MfwHnd g_title_timer;
/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */

extern MfwRect menuArea;               /* menus display area      */
extern BOOL getMelodyListStatus(void);

typedef enum
{
    E_INIT,
    E_BACK,
    E_RETURN,
    E_ABORT,
    E_EXIT
} e_lists_events;


/*-----------------------------------------------------------------------------
*
* List menu handling functions:
*
*-----------------------------------------------------------------------------*/
// ADDED BY RAVI - 28-11-2005
EXTERN UBYTE mnuDCSType (MfwHnd m, UBYTE listLanguageType);
EXTERN BOOL getScrollStatus(void);
// END RAVI - 28-11-2005


static int listsKeyEvent(MfwEvt event, MfwKbd *keyboard);
static int listsWinEvent(MfwEvt e, MfwWin *w);
static int listsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle);
static void lists_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int listsIconsKeyEvent(MfwEvt event, MfwKbd *keyboard);
static int listsIconsWinEvent(MfwEvt e, MfwWin *w);
static int listsIconsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle);
static void listsIcons_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);


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

 $Function:  listIconsDisplayListMenu

 $Description:   Creates a list menu from data stored in NVRAM.

 $Returns:      none.

 $Arguments:

*******************************************************************************/
 MfwHnd winIconsLists;
T_MFW listIconsDisplayListMenu (MfwHnd Parent, ListMenuData *Data, ListCbFunc cbFunc,int inUnicode)
{
    // UBYTE i;  // RAVI - Not Used.
    MfwWin * win;
    MfwHnd winLists;
    T_MFW Status = LISTS_OK;

    TRACE_FUNCTION ("listIconsDisplayListMenu() Start");

    winLists = winCreate(Parent, 0, E_WIN_VISIBLE |E_WIN_RESUME|E_WIN_SUSPEND, (MfwCb)listsIconsWinEvent);
    winIconsLists=winLists;
    if (winLists == NULL)
    {
        Status = LISTS_FAIL;                /* Inform caller of failure. */
        TRACE_EVENT ("win creation fails");
    }
    else
    {
        ListIconsWinInfo * ListData = (ListIconsWinInfo *)ALLOC_MEMORY (sizeof (ListIconsWinInfo));

        if (!ListData)
            {
                /* cq12719. if insufficient memory for listdata then delete window and Free allocated memory.16-03-04.MZ */
                if(NULL != winLists)
                    winDelete(winLists);

                 TRACE_EVENT ("(ListIconsWinInfo *)ALLOC_MEMORY fails");
                 return LISTS_FAIL;
            }

        ListData->mmi_control.dialog = (T_DIALOG_FUNC)lists_exec_cb;
        ListData->mmi_control.data   = ListData;
        win = ((MfwHdr *)winLists)->data;
        win->user = (void *) ListData;

        ListData->Parent = Parent;
        ListData->Callback = cbFunc;
        ListData->winLists = winLists;
        ListData->kbdLists =      kbdCreate(winLists,Data->KeyEvents|KEY_MAKE,(MfwCb)listsIconsKeyEvent);
        ListData->kbdLists_long = kbdCreate(winLists,Data->KeyEvents|KEY_LONG,(MfwCb)listsIconsKeyEvent);

        if ((ListData->kbdLists == NULL) || (ListData->kbdLists_long == NULL))
        {
            Status = LISTS_FAIL;
            TRACE_EVENT ("ListData->kbdLists fails");
        }
        else
        {
            /* Create initial list menu for display. */

            /*
             * set menu list from outside
             */
            ListData->MenuListsAttr = *Data->Attr; /* copy contents */

            /* SPR#2492 - DS - Do not overwrite mode settings unless mode is zero */
            if (ListData->MenuListsAttr.mode == 0x0000) /* Mode not yet setup */
                    ListData->MenuListsAttr.mode = MNU_LEFT | MNU_LIST | MNU_CUR_LINE;
            else
                    ListData->MenuListsAttr.mode |= Data->Attr->mode;

            ListData->MenuListsAttr.font = Data->Font;
            ListData->MenuListsAttr.items = Data->List;
            ListData->MenuListsAttr.nItems = Data->ListLength;

            /* START: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */
            ListData->MenuListsAttr.header_toggle = Data->Attr->header_toggle;
            if (ListData->MenuListsAttr.header_toggle)
		g_win = winLists;
            /* END: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */


            /*
             * Intialize List Menu Data
             */
            ListData->MenuData = Data; /* copy contents */
            ListData->MenuData->listCol = COLOUR_LIST_XX; //Set-up colour
            ListData->MenuData->Attr = &ListData->MenuListsAttr; /* copy data*/
            ListData->MenuLists = mnuCreate(winLists, &ListData->MenuListsAttr,
                            E_MNU_SELECT | E_MNU_ESCAPE| E_MNU_POSTDRAW,
                            (MfwCb)listsIconsListCbMenu);
            ListData->MenuData->win = winLists;
            Data->win = winLists;
            mnuScrollMode(ListData->MenuLists,0);
            if (Data->Strings)
                mnuLang (ListData->MenuLists,0);
            else
                mnuLang (ListData->MenuLists,mainMmiLng);

            /* SPR#1983 - SH - Set up whether menu is in unicode or not */
            if (inUnicode != 0)
            {
                mnuDCSType(ListData->MenuLists, inUnicode); /* Unicode display */
            }
            mnuChooseVisibleItem(ListData->MenuLists, Data->ListPosition-1);
            mnuUnhide(ListData->MenuLists);
            displaySoftKeys(ListData->MenuData->LeftSoftKey,ListData->MenuData->RightSoftKey);
            winShow(winLists);

        }
    }
    return Status;
}

static int listsIconsKeyEvent (MfwEvt e, MfwKbd *k)
    /* list keyboard event handler */
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
    ListIconsWinInfo      * data = (ListIconsWinInfo *)win_data->user;
    MfwMnu *MenuHandle;

    /* This trace function was added inside the fflag by vinoj to remove compilation error: 2/6/06*/
    TRACE_FUNCTION("listsIconsKeyEvent() start");
    {
        //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
       //Initialize selectKey to FALSE here. It will be set to TRUE only when a key event for KCD_MNUSELECT occurs.
       data->MenuData->selectKey = FALSE;
    if (!(e & KEY_MAKE))
    {
        return MFW_EVENT_CONSUMED;
    }
    if(data->MenuData->block_keys == TRUE)
    {
        return MFW_EVENT_CONSUMED;
    }
    if (e & KEY_LONG)
    {
        switch (k->code)
        {
        case KCD_HUP: /* back to previous menu */
            mnuEscape(data->MenuLists);
            break;
        case KCD_RIGHT: /* Power Down */
            return MFW_EVENT_PASSED; /* handled by idle */
        default: /* no response to all other keys */
            return MFW_EVENT_CONSUMED;
        }
    }
    else
    {
        switch (k->code)
        {
        case KCD_MNUUP: /* highlight previous entry */
            mnuUp(data->MenuLists);
              {
              MenuHandle = mfwControl(data->MenuLists);
                data->MenuData->Reason = LISTS_REASON_SCROLL;
                data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
                data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level];
                  // Send event to indicate that the user has scrolled list items
                  SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);
              }

            break;
        case KCD_MNUDOWN: /* highlight next entry */
            mnuDown(data->MenuLists);
              {
              MenuHandle = mfwControl(data->MenuLists);
                data->MenuData->Reason = LISTS_REASON_SCROLL;
                data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
                data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level];
                  // Send event to indicate that the user has scrolled list items
                  SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);
              }
            break;
        case KCD_MNUSELECT:
                //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
                //Menu Select Key was pressed, storing this for future use.
                data->MenuData->selectKey = TRUE;
                //Break is delibrately not used here. The control should pass through the KCD_LEFT case.
        case KCD_LEFT: /* activate this entry */
            MenuHandle = mfwControl(data->MenuLists);
               data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
            mnuSelect(data->MenuLists);
            break;
        case KCD_CALL: /* press send key */
            data->ExitReason = LISTS_REASON_SEND;
            data->MenuData->Reason = LISTS_REASON_SEND;
            MenuHandle = mfwControl(data->MenuLists);
            data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
            data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */

            /* SPR998 - SH - check if callback exists before calling it! */
            if (data->Callback)
                data->Callback(data->Parent, data->MenuData);

            if (data->MenuData->autoDestroy)
            {
                /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                if (data->MenuListsAttr.header_toggle)
                {
                    if (g_title_timer)
                    {
                        tim_delete(g_title_timer);
                            g_title_timer = NULL;
                    }
                }
                /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                winDelete (win);
                    FREE_MEMORY ((void*)data, sizeof (ListIconsWinInfo));
                }
        break;
        case KCD_HUP: /* back to previous menu */
            data->ExitReason = LISTS_REASON_HANGUP;
            data->MenuData->Reason = LISTS_REASON_HANGUP;
            /*NM, p023 */

            MenuHandle = mfwControl(data->MenuLists);
            data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
            data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
            /*NM, p023 end */
             data->Callback(data->Parent, data->MenuData);
            //July 10, 2007    REF:  DRT OMAPS00135679  x0073106
            /*if (data->MenuData->autoDestroy)
            {*/
                   /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                if (data->MenuListsAttr.header_toggle)
                {
                    if (g_title_timer)
                    {
                        tim_delete(g_title_timer);
                            g_title_timer = NULL;
                    }
                }
                /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                /*  winDelete (win);
                        FREE_MEMORY ((void*)data, sizeof (ListIconsWinInfo));
            }*/
            break;
        case KCD_RIGHT: /* back to previous menu */
            mnuEscape(data->MenuLists);
            break;
        default: /* no response to all other keys */
            return MFW_EVENT_CONSUMED;
        }
    }
        }
    return MFW_EVENT_CONSUMED;
}

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

 $Function:  listsWinEvent

 $Description:   window event handler

 $Returns:      none.

 $Arguments:

*******************************************************************************/
static int listsIconsWinEvent(MfwEvt e, MfwWin *w)
{
    ListIconsWinInfo * ListData = (ListIconsWinInfo *)w->user;

    TRACE_FUNCTION("listsIconsWinEvent() start");
    TRACE_EVENT_P1("ListData->Parent %x",ListData->Parent);
    switch (e)
    {
        case E_WIN_VISIBLE:
            SEND_EVENT(ListData->Parent,LISTS_REASON_VISIBLE,0,(void*)ListData);
            break;
        case MfwWinResume:
            SEND_EVENT(ListData->Parent,LISTS_REASON_RESUME,0,(void*)ListData);
            break;
        case MfwWinSuspend:
            SEND_EVENT(ListData->Parent,LISTS_REASON_SUSPEND,0,(void*)ListData);
            break;
    }
    return MFW_EVENT_CONSUMED;
}
/*a0393213 lint warning removal - This function is not used currently. So it's put under the flag. If it is required just remove the flag.*/
#ifdef MMI_LINT_WARNING_REMOVAL
static void listsIcons_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    ListIconsWinInfo    * ListData = (ListIconsWinInfo *)win_data->user;
    T_MFW_HND      * l_parent;
    SHORT            l_id;

    TRACE_FUNCTION ("listsIcons_exec_cb() start");

    switch (event)
    {
    case E_INIT:
    case E_BACK:
    case E_RETURN:
    case E_ABORT:
    case E_EXIT:
        /* defaultreaction */
        l_parent = ListData->Parent;
        l_id = ListData->id;

        /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
        if (ListData->MenuListsAttr.header_toggle)
        {
            if (g_title_timer)
            {
                tim_delete(g_title_timer);
                g_title_timer = NULL;
            }
        }
        /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
        winDelete (win);
        FREE_MEMORY ((void*) ListData, sizeof (ListIconsWinInfo));
        SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
        break;
    default:
        return;
    }
}
#endif


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

 $Function:  listsListCbMenu

 $Description:   List menu handler. (mfw callback function)

 $Returns:      none.

 $Arguments:

*******************************************************************************/
int listsIconsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle)
{
    int Status = LISTS_OK;
    T_MFW_HND   win      = mfw_parent (mfw_header());
    T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
    ListIconsWinInfo* ListData = (ListIconsWinInfo *)win_data->user;

    TRACE_FUNCTION("listsIconsListCbMenu() ");
    switch (EventCode)
    {
    case E_MNU_SELECT:
        ListData->ExitReason = E_MNU_SELECT;
        ListData->MenuData->Reason = LISTS_REASON_SELECT;// MZ 14/2/01 E_MNU_SELECT;
        ListData->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
        ListData->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
        /* SPR998 - SH - check if callback exists before calling it! */
        if (ListData->Callback)
            ListData->Callback(ListData->Parent, ListData->MenuData);
        break;
    case E_MNU_ESCAPE:
        ListData->ExitReason = LISTS_REASON_BACK;
        ListData->MenuData->Reason = LISTS_REASON_BACK;
        /*NM, p023*/
        ListData->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
        ListData->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
        /*NM, p023*/

        /* SPR998 - SH - check if callback exists before calling it! */
        if (ListData->Callback)
            ListData->Callback(ListData->Parent, ListData->MenuData);

        break;
    case E_MNU_POSTDRAW:
    {
        T_MFW_WIN * winIconsLists_data = ((T_MFW_HDR *)winIconsLists)->data;
        ListIconsWinInfo* winIconsListsData = (ListIconsWinInfo *)winIconsLists_data->user;
            winIconsListsData->ExitReason = LISTS_REASON_DRAWCOMPLETE;
        winIconsListsData->MenuData->Reason = LISTS_REASON_DRAWCOMPLETE;
        winIconsListsData->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
        winIconsListsData->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
        winIconsListsData->MenuData->lineHeight=  MenuHandle->lineHeight;
        if (winIconsListsData->Callback)
            winIconsListsData->Callback(winIconsListsData->Parent, winIconsListsData->MenuData);
    }
        break;
    default:
        Status = LISTS_FAIL;
        break;
    }

    return Status;
}

void listsIconsDestroy(T_MFW_HND win)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    ListIconsWinInfo * ListData = (ListIconsWinInfo *)win_data->user;
    TRACE_EVENT_P1("listsIconsDestroy %x",win);

    /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
    if (ListData->MenuListsAttr.header_toggle)
    {
        if(g_title_timer)
        {
            tim_delete(g_title_timer);
            g_title_timer = NULL;
        }
    }
        /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */

    winDelete (win);
    FREE_MEMORY ((void*) ListData, sizeof (ListIconsWinInfo));
}

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

 $Function:  listDisplayListMenu

 $Description:   Creates a list menu from data stored in NVRAM.

 $Returns:      none.

 $Arguments:

*******************************************************************************/
T_MFW listDisplayListMenu (MfwHnd Parent, ListMenuData *Data, ListCbFunc cbFunc,int inUnicode)
{
    // UBYTE i;  // RAVI - Not Used.
    MfwWin * win;
    MfwHnd winLists;
    T_MFW Status = LISTS_OK;

    TRACE_FUNCTION ("listDisplayListMenu() Start");

    winLists = winCreate(Parent, 0, E_WIN_VISIBLE |E_WIN_RESUME|E_WIN_SUSPEND, (MfwCb)listsWinEvent);

    if (winLists == NULL)
    {
        Status = LISTS_FAIL;                /* Inform caller of failure. */
        TRACE_EVENT ("win creation fails");
    }
    else
    {
        ListWinInfo * ListData = (ListWinInfo *)ALLOC_MEMORY (sizeof (ListWinInfo));

        if (!ListData)
            {
                /* cq12719. if insufficient memory for listdata then delete window and Free allocated memory.16-03-04.MZ */
                if(NULL != winLists)
                    winDelete(winLists);

                 TRACE_EVENT ("(ListWinInfo *)ALLOC_MEMORY fails");
                 return LISTS_FAIL;
            }

        ListData->mmi_control.dialog = (T_DIALOG_FUNC)lists_exec_cb;
        ListData->mmi_control.data   = ListData;
        win = ((MfwHdr *)winLists)->data;
        win->user = (void *) ListData;

        ListData->Parent = Parent;
        ListData->Callback = cbFunc;
        ListData->winLists = winLists;
        ListData->kbdLists =      kbdCreate(winLists,Data->KeyEvents|KEY_MAKE,         (MfwCb)listsKeyEvent);
        ListData->kbdLists_long = kbdCreate(winLists,Data->KeyEvents|KEY_LONG,(MfwCb)listsKeyEvent);

        if ((ListData->kbdLists == NULL) || (ListData->kbdLists_long == NULL))
        {
            Status = LISTS_FAIL;
            TRACE_EVENT ("ListData->kbdLists fails");
        }
        else
        {
            /* Create initial list menu for display. */

            /*
             * set menu list from outside
             */
            ListData->MenuListsAttr = *Data->Attr; /* copy contents */

            /* SPR#2492 - DS - Do not overwrite mode settings unless mode is zero */
            if (ListData->MenuListsAttr.mode == 0x0000) /* Mode not yet setup */
                    ListData->MenuListsAttr.mode = MNU_LEFT | MNU_LIST | MNU_CUR_LINE;
            else
                    ListData->MenuListsAttr.mode |= Data->Attr->mode;

            ListData->MenuListsAttr.font = Data->Font;
            ListData->MenuListsAttr.items = Data->List;
            ListData->MenuListsAttr.nItems = Data->ListLength;

            /* START: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */
            ListData->MenuListsAttr.header_toggle = Data->Attr->header_toggle;
            if (ListData->MenuListsAttr.header_toggle)
		g_win = winLists;
            /* END: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */


            /*
             * Intialize List Menu Data
             */
            ListData->MenuData = *Data; /* copy contents */
            ListData->MenuData.listCol = COLOUR_LIST_XX; //Set-up colour
            ListData->MenuData.Attr = &ListData->MenuListsAttr; /* copy data*/
            ListData->MenuLists = mnuCreate(winLists, &ListData->MenuListsAttr,
                            E_MNU_SELECT | E_MNU_ESCAPE,
                            (MfwCb)listsListCbMenu);
            ListData->MenuData.win = winLists;
            Data->win = winLists;
            mnuScrollMode(ListData->MenuLists,1);
            if (Data->Strings)
                mnuLang (ListData->MenuLists,0);
            else
                mnuLang (ListData->MenuLists,mainMmiLng);

            /* SPR#1983 - SH - Set up whether menu is in unicode or not */
            if (inUnicode != 0)
            {
                mnuDCSType(ListData->MenuLists, inUnicode); /* Unicode display */
            }
            mnuChooseVisibleItem(ListData->MenuLists, Data->ListPosition-1);
            mnuUnhide(ListData->MenuLists);
            TRACE_EVENT ("mmiList winShow()");
            winShow(winLists);
        }
    }

    return Status;
}


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

 $Function:  listsKeyEvent

 $Description:   Keyboard event handler

 $Returns:      none.

 $Arguments:

*******************************************************************************/
static int listsKeyEvent (MfwEvt e, MfwKbd *k)
    /* list keyboard event handler */
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
    ListWinInfo      * data = (ListWinInfo *)win_data->user;
    MfwMnu *MenuHandle;

    /* This trace function was added inside the fflag by vinoj to remove compilation error: 2/6/06*/

    {
        //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
       //Initialize selectKey to FALSE here. It will be set to TRUE only when a key event for KCD_MNUSELECT occurs.
       data->MenuData.selectKey = FALSE;
    if (!(e & KEY_MAKE))
    {
        return MFW_EVENT_CONSUMED;
    }


    if (e & KEY_LONG)
    {
        switch (k->code)
        {
        case KCD_HUP: /* back to previous menu */
            mnuEscape(data->MenuLists);
            break;
        case KCD_RIGHT: /* Power Down */
            return MFW_EVENT_PASSED; /* handled by idle */
        default: /* no response to all other keys */
            return MFW_EVENT_CONSUMED;
        }
    }
    else
    {
        switch (k->code)
        {
        case KCD_MNUUP: /* highlight previous entry */
            mnuUp(data->MenuLists);
//GW Not needed?            winShow(win);
            // Only required in melody list selection.
          /*  Mar 30, 2007    REF: OMAPS00122691  x0039928 */
            /*  This event will be used to play the selected file. */

             if(getMelodyListStatus()== TRUE)
            {
                    MenuHandle = mfwControl(data->MenuLists);

                    data->MenuData.Reason = LISTS_REASON_SCROLL;
                data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
                data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level];
                SEND_EVENT(data->Parent,E_START_MELODY,0,(void*)data);
            }

            if(getScrollStatus() == TRUE)
            {
                // Send event to indicate that the user has scrolled list items
                SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);
            }
            break;
        case KCD_MNUDOWN: /* highlight next entry */
            mnuDown(data->MenuLists);
//GW Not needed?            winShow(win);
          /*  Mar 30, 2007    REF: OMAPS00122691  x0039928 */
            /*  This event will be used to play the selected file. */

                 if(getMelodyListStatus()== TRUE)
            {
                MenuHandle = mfwControl(data->MenuLists);

                data->MenuData.Reason = LISTS_REASON_SCROLL;
                data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
                data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level];
                       SEND_EVENT(data->Parent,E_START_MELODY,0,(void*)data);
             }

              if(getScrollStatus() == TRUE)
              {
                  // Send event to indicate that the user has scrolled list items
                  SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);
              }
            break;
        case KCD_MNUSELECT:
                //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
                //Menu Select Key was pressed, storing this for future use.
                data->MenuData.selectKey = TRUE;
                //Break is delibrately not used here. The control should pass through the KCD_LEFT case.
        case KCD_LEFT: /* activate this entry */
            mnuSelect(data->MenuLists);
            MenuHandle = mfwControl(data->MenuLists);
            if ((MenuHandle != NULL) && // Marcus: Issue 1810: 12/03/2003
                (MenuHandle->curAttr != NULL) &&
                winIsFocussed(win))
            {
                    softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, MenuHandle->curAttr->mnuColour);
            }
            break;
        case KCD_CALL: /* press send key */
            data->ExitReason = LISTS_REASON_SEND;
            data->MenuData.Reason = LISTS_REASON_SEND;
            MenuHandle = mfwControl(data->MenuLists);
            data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
            data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */

            /* SPR998 - SH - check if callback exists before calling it! */
            if (data->Callback)
                data->Callback(data->Parent, &data->MenuData);

            if (data->MenuData.autoDestroy)
            {
                /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                if (data->MenuListsAttr.header_toggle)
                {
                    if (g_title_timer)
                    {
                        tim_delete(g_title_timer);
                            g_title_timer = NULL;
                    }
                }
                /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                winDelete (win);
                    FREE_MEMORY ((void*)data, sizeof (ListWinInfo));
                }
        break;
        case KCD_HUP: /* back to previous menu */
            data->ExitReason = LISTS_REASON_HANGUP;
            data->MenuData.Reason = LISTS_REASON_HANGUP;
            /*NM, p023 */
            MenuHandle = mfwControl(data->MenuLists);
            data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
            data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
            /*NM, p023 end */
            data->Callback(data->Parent, &data->MenuData);
            if (data->MenuData.autoDestroy)
            {
                   /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                if (data->MenuListsAttr.header_toggle)
                {
                    if (g_title_timer)
                    {
                        tim_delete(g_title_timer);
                            g_title_timer = NULL;
                    }
                }
                /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
                    winDelete (win);
                        FREE_MEMORY ((void*)data, sizeof (ListWinInfo));
            }
            break;
        case KCD_RIGHT: /* back to previous menu */
            mnuEscape(data->MenuLists);
            break;
        default: /* no response to all other keys */
            return MFW_EVENT_CONSUMED;
        }
    }
        }
    TRACE_FUNCTION("listsKeyEvent()-end");
    return MFW_EVENT_CONSUMED;
}

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

 $Function:  listsWinEvent

 $Description:   window event handler

 $Returns:      none.

 $Arguments:

*******************************************************************************/
static int listsWinEvent(MfwEvt e, MfwWin *w)
{
    ListWinInfo * ListData = (ListWinInfo *)w->user;

    TRACE_FUNCTION("listsWinEvent()");

    switch (e)
    {
        case E_WIN_VISIBLE:
            SEND_EVENT(ListData->Parent,LISTS_REASON_VISIBLE,0,(void*)ListData);
            break;
        case MfwWinResume:
            SEND_EVENT(ListData->Parent,LISTS_REASON_RESUME,0,(void*)ListData);
            break;
        case MfwWinSuspend:
            SEND_EVENT(ListData->Parent,LISTS_REASON_SUSPEND,0,(void*)ListData);
            break;
    }
    return MFW_EVENT_CONSUMED;
}

static void lists_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    ListWinInfo    * ListData = (ListWinInfo *)win_data->user;
    T_MFW_HND      * l_parent;
    SHORT            l_id;

    TRACE_FUNCTION ("lists_exec_cb()");

    switch (event)
    {
    case E_INIT:
    case E_BACK:
    case E_RETURN:
    case E_ABORT:
    case E_EXIT:
        /* defaultreaction */
        l_parent = ListData->Parent;
        l_id = ListData->id;

        /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
        if (ListData->MenuListsAttr.header_toggle)
        {
            if (g_title_timer)
            {
                tim_delete(g_title_timer);
                g_title_timer = NULL;
            }
        }
        /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
        winDelete (win);
        FREE_MEMORY ((void*) ListData, sizeof (ListWinInfo));
        SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
        break;
    default:
        return;
    }
}


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

 $Function:  listsListCbMenu

 $Description:   List menu handler. (mfw callback function)

 $Returns:      none.

 $Arguments:

*******************************************************************************/
int listsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle)
{
    int Status = LISTS_OK;
    T_MFW_HND   win      = mfw_parent (mfw_header());
    T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
    ListWinInfo* ListData = (ListWinInfo *)win_data->user;

    TRACE_FUNCTION("listsCbMenu()");

    switch (EventCode)
    {
        case E_MNU_SELECT:
        ListData->ExitReason = E_MNU_SELECT;
        ListData->MenuData.Reason = LISTS_REASON_SELECT;// MZ 14/2/01 E_MNU_SELECT;
        ListData->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
        ListData->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
        /* SPR998 - SH - check if callback exists before calling it! */
        if (ListData->Callback)
            ListData->Callback(ListData->Parent, &ListData->MenuData);
        break;

        case E_MNU_ESCAPE:
        ListData->ExitReason = LISTS_REASON_BACK;
        ListData->MenuData.Reason = LISTS_REASON_BACK;
        /*NM, p023*/
        ListData->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
        ListData->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
        /*NM, p023*/

        /* SPR998 - SH - check if callback exists before calling it! */
        if (ListData->Callback)
            ListData->Callback(ListData->Parent, &ListData->MenuData);
        break;

        default:
        Status = LISTS_FAIL;
        TRACE_EVENT("Activation 77 error");
        break;
    }

    /*
     * Free all allocated memory and handler
     */
    if (ListData->MenuData.autoDestroy)
    {
        /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
        if (ListData->MenuListsAttr.header_toggle)
        {
            if (g_title_timer)
            {
                tim_delete(g_title_timer);
                g_title_timer = NULL;
            }
        }
        /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
            winDelete (win);
            FREE_MEMORY ((void*) ListData, sizeof (ListWinInfo));
    }
    return Status;
}

void listsDestroy(T_MFW_HND win)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    ListWinInfo * ListData = (ListWinInfo *)win_data->user;

    /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
    if (ListData->MenuListsAttr.header_toggle)
    {
        if(g_title_timer)
        {
            tim_delete(g_title_timer);
            g_title_timer = NULL;
        }
    }
    /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */

    winDelete (win);
    FREE_MEMORY ((void*) ListData, sizeof (ListWinInfo));
}