satengine/SatServer/SatInternalClient/src/CSatCSetUpMenuHandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:09 +0200
changeset 0 ff3b6d0fd310
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2002-2008 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  This is the handler for the SIM Application Toolkit
*                Set Up Menu proactive command.
*
*/



// INCLUDE FILES
#include    <e32base.h>
#include    <e32svr.h>
#include    "RSatUiSession.h"
#include    "MSatUiObserver.h"
#include    "SatSOpcodes.h"
#include    "CSatCSetUpMenuHandler.h"
#include    "SatLog.h"

// CONSTANTS
const TInt8 KMenuItemPop( 3 );

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CSatCSetUpMenuHandler::CSatCSetUpMenuHandler
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CSatCSetUpMenuHandler::CSatCSetUpMenuHandler(
    TInt aPriority,
    RSatUiSession* aSession ) :
    CActive( aPriority ),
    iSession( aSession ),
    iSetUpMenuData(),
    iSetUpMenuPckg( iSetUpMenuData ),
    iSetUpMenuRsp(),
    iSetUpMenuRspPckg( iSetUpMenuRsp )
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCSetUpMenuHandler::CSatCSetUpMenuHandler calling" )

    // Add to active scheduler.
    CActiveScheduler::Add( this );

    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCSetUpMenuHandler::CSatCSetUpMenuHandler exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCSetUpMenuHandler::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CSatCSetUpMenuHandler* CSatCSetUpMenuHandler::NewL(
    RSatUiSession* aSat )
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::NewL calling" )

    // Perform the construction.
    CSatCSetUpMenuHandler* self =
        new ( ELeave ) CSatCSetUpMenuHandler( EPriorityLow, aSat );

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::NewL exiting" )
    return self;
    }

// Destructor
CSatCSetUpMenuHandler::~CSatCSetUpMenuHandler()
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCSetUpMenuHandler::~CSatCSetUpMenuHandler calling" )

    // Cancel any outstanding requests.
    Cancel();
    iSession = NULL;

    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCSetUpMenuHandler::~CSatCSetUpMenuHandler exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCSetUpMenuHandler::Start
// Starts the handler.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//

void CSatCSetUpMenuHandler::Start()
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::Start calling" )

    // Empty the IPC data
    RSat::TSetUpMenuV2 temp;
    iSetUpMenuData = temp;
    RSat::TSetUpMenuRspV1 temp2;
    iSetUpMenuRsp = temp2;

    // Request Set Up Menu notification.
    TIpcArgs arguments( &iSetUpMenuPckg );

    // Pass the Set Up Menu IPC package.
    iSession->CreateRequest( ESatSProactiveSetUpMenu, arguments, iStatus );

    // Set this handler to active so that it can receive requests.
    SetActive();

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::Start exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCSetUpMenuHandler::RunL
// Handles the command.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CSatCSetUpMenuHandler::RunL()
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::RunL calling" )

    // Check the status of the asnychronous operation
    if ( KErrNone != iStatus.Int() )
        {
        LOG2(
            SIMPLE,
            "SATINTERNALCLIENT: CSatCSetUpMenuHandler::RunL exiting, error: %d",
            iStatus.Int() )
        }
    else 
        {
        // Save the contents of the data for envelope Menu Selection.
        iOldSetUpMenuData = iSetUpMenuData;

        // Create the menu item array.
        CDesCArrayFlat* menuItems = new( ELeave ) CDesCArrayFlat( 1 );
        CleanupStack::PushL( menuItems );

        // Create the next action indicator array.
        CArrayFixFlat<TSatAction>* menuActions =
            new( ELeave ) CArrayFixFlat<TSatAction>( 1 );
        CleanupStack::PushL( menuActions );

        // Create the menu item icon array.
        CArrayFixFlat<TInt>* menuIcons =
            new( ELeave ) CArrayFixFlat<TInt>( 1 );
        CleanupStack::PushL( menuIcons );

        // Fetch all the menu items.
        // Note that the indexing starts from 1 in SIM item lists.
        const TInt menuItemCount(
            static_cast<TInt>( iSetUpMenuData.NumberOfItems() ) );
        LOG2( SIMPLE,
        "SATINTERNALCLIENT: CSatCSetUpMenuHandler::RunL menuItemCount: %d",
        menuItemCount )
        for ( TInt currentItem = 1;
              currentItem <= menuItemCount;
              currentItem++ )
            {
            RSat::TItem item;
            TInt action;
            TInt icon( KErrNotFound );

            // Fetch all data for this index.
            iSetUpMenuData.GetItem( static_cast<TUint>( currentItem ),
                                    item,
                                    action,
                                    icon );

            // Save the item name
            menuItems->AppendL( item.iItemString );

            // Save icon identifier.
            // icon will be KErrNotFound (-1) if it is not present in the
            // SAT menu.
            menuIcons->AppendL( icon );
            
            if ( KErrNotFound != action )
                {
                LOG2( SIMPLE,
                "SATINTERNALCLIENT: CSatCSetUpMenuHandler::RunL action: %d", action )
                // Save the next action indicator, if found.
                menuActions->AppendL( STATIC_CAST( TSatAction, action ) );
                }
            }

        // Indicates whether help is available
        TBool helpIsAvailable( EFalse );
        if ( RSat::EHelpAvailable == iSetUpMenuData.iHelp )
            {
            LOG( SIMPLE, 
            "SATINTERNALCLIENT: CSatCSetUpMenuHandler::RunL EHelpAvailable" )
            helpIsAvailable = ETrue;
            }

        // Has to be casted to TInt before casting to TSatIconQualifier,
        // because gcc warns about the direct cast.
        const struct TSatIconId iconId = { iSetUpMenuData.iIconId.iIdentifier,
            static_cast<TSatIconQualifier>(
                static_cast<TInt>( iSetUpMenuData.iIconId.iQualifier ) ) };

        const enum TSatIconQualifier iconListQualifier(
            static_cast<TSatIconQualifier>(
                static_cast<TInt>( iSetUpMenuData.iIconListQualifier ) ) );

        const enum TSatSelectionPreference selectionPreference(
            static_cast<TSatSelectionPreference>(
                static_cast<TInt>( iSetUpMenuData.iPreference ) ) );

        // Notify the registered client and save the response.
        TSatUiResponse response(
            iSession->SatUiObserver()->SetUpMenuL(
            iSetUpMenuData.iAlphaId.iAlphaId,
            *menuItems,
            menuActions,
            helpIsAvailable,
            iconId,
            menuIcons,
            iconListQualifier,
            selectionPreference ) );
            
        LOG2( SIMPLE,
        "SATINTERNALCLIENT: CSatCSetUpMenuHandler::RunL response: %x", response )
        // Examine the client response.
        switch ( response )
            {
            case ESatSuccess:
                {
                break;
                }
            case ESatFailure:
                {
                iSession->Panic( ESatSetUpMenuFailure );
                break;
                }
            case ESatSessionTerminatedByUser:
            case ESatBackwardModeRequestedByUser:
            case ESatNoResponseFromUser:
            case EHelpRequestedByUser:
            case EPCmdNotAcceptedByUser:
            case ESatCmdDataNotUnderstood:
            default:
                {
                iSession->Panic( ESatInvalidResponse );
                break;
                }
            }

        // Destroy the array objects: menuIcons, menuActions, menuItems.
        CleanupStack::PopAndDestroy( KMenuItemPop, menuItems );
        }

    // Renew the service request.
    Start();

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::RunL exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCSetUpMenuHandler::DoCancel
// Cancels the pending request.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CSatCSetUpMenuHandler::DoCancel()
    {
    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::DoCancel calling" )

    // Complete the request with cancel code.
    TRequestStatus* requestStatus = &iStatus;
    User::RequestComplete( requestStatus, KErrCancel );

    LOG( SIMPLE, "SATINTERNALCLIENT: CSatCSetUpMenuHandler::DoCancel exiting" )
    }

// -----------------------------------------------------------------------------
// CSatCSetUpMenuHandler::OldSetUpMenuData
// Returns a pointer to a old the command data object.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
RSat::TSetUpMenuV2 CSatCSetUpMenuHandler::OldSetUpMenuData() const
    {
    LOG( SIMPLE,
        "SATINTERNALCLIENT: CSatCSetUpMenuHandler::OldSetUpMenuData calling-exiting" )
    return iOldSetUpMenuData;
    }

//  End of File