/** 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"// CONSTANTSconst 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; }// DestructorCSatCSetUpMenuHandler::~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