diff -r 000000000000 -r 5f000ab63145 phoneapp/phoneuiview/src/cphonequerycontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuiview/src/cphonequerycontroller.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,1047 @@ +/* +* Copyright (c) 2005 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: Implementation of CPhoneQueryController class. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include // for CAknGlobalNote + +#include "phoneui.hrh" +#include "cphonequerycontroller.h" +#include "tphonecommandparam.h" +#include "tphonecmdparamreconnectquery.h" +#include "tphonecmdparamstring.h" +#include "phonelogger.h" +#include "cphonequerydialog.h" +#include "tphonecmdparamboolean.h" +#include "cphonedtmfnumberlistquery.h" +#include "cphonelistquerydialog.h" +#include "cphonetimer.h" + +// ================= MEMBER FUNCTIONS ======================= +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneQueryController::CPhoneQueryController( CEikonEnv& aEikEnv ) + : CActive ( EPriorityUserInput ), + iQueryDeleted( ETrue ), + iEikEnv( aEikEnv ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::NewL() +// Two-phased constructor +// (other items were commented in a header). +// --------------------------------------------------------- +CPhoneQueryController* CPhoneQueryController::NewL( CEikonEnv& aEikEnv ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::NewL( ) "); + CPhoneQueryController* self = + new( ELeave ) CPhoneQueryController( aEikEnv ); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CPhoneQueryController::~CPhoneQueryController() + { + DestroyQuery(); + ClearTimer(); + DestroyGlobalQuery(); + DestroyGlobalMsgQuery(); + + if( iCommandAsync ) + { + delete iCommandAsync; + iCommandAsync = NULL; + } + iQueryPreviousText.Close(); + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateNoteL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateQueryL( + TPhoneCommandParam* aCommandParam ) + { + __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneQueryController::CreateQueryL()" ); + + // Cancel previous note. This prevents scheduler crashes. + // Canceling must be done here since iActiveAvkonQuery may be overwritten. + Cancel(); + + TPhoneCmdParamQuery& params = *static_cast( aCommandParam ); + iCommandId = NULL; + iNoConnectedCalls = EFalse; + switch( params.ParamId() ) + { + case TPhoneCommandParam::EPhoneParamIdQuery: + case TPhoneCommandParam::EPhoneParamIdVideoCallSetupFailedCreateVoiceCallToTheSameContactQuery: + case TPhoneCommandParam::EPhoneParamIdUnattendedTransferAcceptanceQuery: + case TPhoneCommandParam::EPhoneParamIdGlobalWaitNote: + CreateDefaultQueryL( params ); + break; + + case TPhoneCommandParam::EPhoneParamIdReconnectQuery: + CreateReconnectQueryL( aCommandParam ); + break; + + case TPhoneCommandParam::EPhoneParamRebootQuery: + { + TRequestStatus status = KRequestPending; + CAknGlobalConfirmationQuery* query = CAknGlobalConfirmationQuery::NewLC(); + query->ShowConfirmationQueryL( + status, params.QueryPrompt(), params.DefaultCba(), R_QGN_NOTE_INFO_ANIM ); + User::WaitForRequest( status ); + CleanupStack::PopAndDestroy( query ); + } + break; + + default: + break; + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::DestroyQuery +// --------------------------------------------------------- +// +void CPhoneQueryController::DestroyQuery() + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::DestroyQuery( ) "); + + // Delete the query if it exists + if ( iQuery ) + { + delete iQuery; + iQuery = NULL; + } + + iQueryNoteText.Close(); + iQueryPrompt.Close(); + + if( iCallUiReconnectQuery ) + { + delete iCallUiReconnectQuery; + iCallUiReconnectQuery = NULL; + } + + if ( iDtmfNumberListQuery && !iQueryDeleted ) + { + delete iDtmfNumberListQuery; + iDtmfNumberListQuery = NULL; + } + + if ( iTextQuery ) + { + delete iTextQuery; + iTextQuery = NULL; + } + + if ( iListQuery && !iQueryDeleted ) + { + delete iListQuery; + iListQuery = NULL; + } + + if( iTextQueryDisplayer ) + { + delete iTextQueryDisplayer; + iTextQueryDisplayer = NULL; + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::DestroyGlobalQuery +// --------------------------------------------------------- +// +void CPhoneQueryController::DestroyGlobalQuery() + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::DestroyGlobalQuery( ) "); + + if ( iGlobalConfirmationQuery ) + { + iGlobalConfirmationQuery->CancelConfirmationQuery(); + + delete iGlobalConfirmationQuery; + iGlobalConfirmationQuery = NULL; + } + DestroyGlobalWaitNote(); + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateQueryDialogL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateQueryDialogL( + const TPhoneCmdParamQuery& aParams ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateQueryDialogL( ) "); + + // Delete the existing query + DestroyQuery(); + + iQueryParam = aParams; + + // Create the query + iQuery = CPhoneQueryDialog::NewL(); + + if ( iQuery ) + { + // Set the prompt if specified + if ( aParams.QueryPrompt().Length() ) + { + iQueryPrompt.Close(); + iQueryPrompt.Create( aParams.QueryPrompt() ); + iQuery->SetPromptL( iQueryPrompt ); + } + + // Display the query + TInt buttonId = iQuery->ExecuteLD( aParams.QueryResourceId() ); + iQuery = NULL; + + if( buttonId != EPhoneCmdDoNothing ) + { + if ( iQueryParam.QueryCommandObserver() ) + { + // Let observer handle command. + iQueryParam.QueryCommandObserver()->ProcessCommandL( + iStatus.Int() ); + return; + } + else + { + // Forward pressed CBA to the framework so that we can handle it + // in our active state + static_cast( iEikEnv.EikAppUi() ) + ->ProcessCommandL( buttonId ); + } + } + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateTextQueryDialogL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateTextQueryDialogL( + const TPhoneCmdParamQuery& aParams, + TInt aEikBidOkCmd ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateTextQueryDialogL( ) "); + + // Delete the existing query + DestroyQuery(); + + iQueryNoteText.Create( *aParams.DataText() ); + + iTextQuery = new( ELeave ) CPhoneTextQuery( + *this, + iQueryNoteText, + aParams.DefaultCba(), + aParams.ContentCba(), + aParams.SendKeyEnabled(), + aEikBidOkCmd ); + + // Set the prompt if specified + if ( aParams.QueryPrompt().Length() ) + { + iQueryPrompt.Create( aParams.QueryPrompt() ); + iTextQuery->SetPromptL( iQueryPrompt ); + } + + // Cut the call stack so that Phone UI is responsive + iTextQueryDisplayer = CIdle::NewL( EPriorityNormal ); + iTextQueryDisplayer->Start( TCallBack( DisplayTextQueryCallBack, this ) ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::SetNoConnectedCalls +// --------------------------------------------------------- +// +void CPhoneQueryController::SetNoConnectedCalls( TPhoneCommandParam* aCommandParam ) + { + TPhoneCmdParamBoolean* booleanParam = + static_cast( aCommandParam ); + iNoConnectedCalls = booleanParam->Boolean(); + __PHONELOG1( EBasic, EPhoneUIView, + "CPhoneQueryController::SetNoConnectedCalls(%d)", + iNoConnectedCalls ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::DisplayTextQueryCallBackL +// --------------------------------------------------------- +// +TInt CPhoneQueryController::DisplayTextQueryCallBack( TAny* aCPhoneQueryController ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::DisplayTextQueryCallBack( ) "); + + // Display the query + CPhoneQueryController* queryController = + static_cast( aCPhoneQueryController ); + + TInt leaveError = KErrNone; + TInt retVal = KErrNone; + + TRAP( leaveError, ( + retVal = queryController->iTextQuery->ExecuteLD( queryController->iQueryParam.QueryResourceId() ) ) ); + + queryController->iTextQuery = NULL; + + // If iCommandId is EPhoneCmdEnd(User has pressed end dismiss DTMF query&dialog) or if iNoConnectedCalls + // is TRUE it is an indication that remote party has terminated call and there is no connected call in device + // therefore we dont need to reopen EPhoneInCallCmdDtmfListQuery. + if ( retVal == KErrNone && + leaveError == KErrNone && + queryController->iQueryParam.QueryType() == EPhoneDtmfTextQuery && + queryController->iCommandId != EPhoneCmdEnd && + !queryController->iNoConnectedCalls ) + { + //User has exited DMTF query with cancel, rule says that + //we need to activate DTMF list query dialog. + + // Forward pressed CBA to the framework so that we can handle it + // in our active state + TRAP_IGNORE( static_cast( queryController->iEikEnv.EikAppUi() ) + ->ProcessCommandL( EPhoneInCallCmdDtmfListQuery ) ); + } + + queryController->iNoConnectedCalls = EFalse; + return KErrNone; + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateListQueryL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateListQueryL( TInt aDialogResourceId, + const RArray& aCommands ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateListQueryL( ) "); + DestroyQuery(); + + if ( !iListQuery ) + { + iListQuery = new (ELeave) + CPhoneListQueryDialog( + static_cast( *iEikEnv.EikAppUi() ), + *this, aCommands ); + } + iQueryDeleted = EFalse; + iCommandHandled = EFalse; + iListQuery->ExecuteLD( aDialogResourceId ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateCustomListQueryL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateCustomListQueryL( + const TPhoneCmdParamQuery& aParams ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateCustomListQueryL( ) "); + DestroyQuery(); + RArray commands; + CleanupClosePushL( commands ); + const_cast(aParams).ItemTextArrayForListQuery(); + + MDesCArray* itemArray = aParams.ItemTextArrayForListQuery(); + + if ( NULL == itemArray ) + { + User::Leave( KErrArgument ); + } + + for ( TInt i = 0; i < itemArray->MdcaCount(); i++ ) + { + commands.Append( i ); + } + + if ( !iListQuery ) + { + iListQuery = new (ELeave) + CPhoneListQueryDialog( + static_cast( *iEikEnv.EikAppUi() ), + *this, commands ); + } + + iListQuery->PrepareLC( aParams.QueryResourceId() ); + + + iListQuery->SetItemTextArray( itemArray ); + iListQuery->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iListQuery->SetTone( aParams.Tone() ); + + iQueryDeleted = EFalse; + iCommandHandled = EFalse; + + iListQuery->RunLD(); + + CleanupStack::PopAndDestroy( &commands ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateDtmfListQueryL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateDtmfListQueryL( TInt aDialogResourceId ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateDtmfListQueryL( ) "); + DestroyQuery(); + + if ( !iDtmfNumberListQuery ) + { + iDtmfNumberListQuery = CPhoneDtmfNumberListQuery::NewL( + static_cast( *iEikEnv.EikAppUi() ), + *this, + iResultBuffer ); + } + iQueryDeleted = EFalse; + iDtmfNumberListQuery->ExecuteLD( aDialogResourceId ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::GetTextQueryContentL +// --------------------------------------------------------- +// +void CPhoneQueryController::GetTextQueryContentL( + TPhoneCommandParam* aCommandParam ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::GetTextQueryContentL( ) "); + + TPhoneCmdParamString* stringParam = + static_cast( aCommandParam ); + + if ( iQueryPreviousText.Length() ) + { + *stringParam->String() = iQueryPreviousText; + iQueryPreviousText.Close(); + } + else if ( iTextQuery ) + { + iTextQuery->GetContent( *stringParam->String() ); + } + else if ( iResultBuffer ) + { + stringParam->String()->Append( iResultBuffer->Des() ); + delete iResultBuffer; + iResultBuffer = NULL; + } + + __PHONELOG1( EBasic, EPhoneUIView, + "CPhoneQueryController::GetTextQueryContentL(%S)", + stringParam->String() ); + + AknTextUtils::ConvertDigitsTo( *stringParam->String(), EDigitTypeWestern ); + + __PHONELOG1( EBasic, EPhoneUIView, + "CPhoneQueryController::GetTextQueryContentL(%S)", + stringParam->String() ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::SetQueryDeletedFlag +// --------------------------------------------------------- +// +void CPhoneQueryController::SetQueryDeletedFlag( TBool aQueryDeleted ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::SetQueryDeletedFlag( ) "); + switch( iActiveAvkonQuery ) + { + case EPhoneContactsListQuery: + case EPhoneCustomListQueryDialog: + { + iListQuery = NULL; + + if ( iQueryParam.QueryCommandObserver() && + !iCommandHandled ) + { + ReportQueryCompleteAsync( EAknSoftkeyCancel ); + } + } + break; + case EPhoneDtmfListQueryDialog: + { + iDtmfNumberListQuery = NULL; + } + break; + default: + break; + } + iQueryDeleted = aQueryDeleted; + } + + +// --------------------------------------------------------- +// CPhoneQueryController::CreateDefaultQueryL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateDefaultQueryL( const TPhoneCmdParamQuery& aParams ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateDefaultQueryL( ) "); + + iQueryParam = aParams; + iActiveAvkonQuery = aParams.QueryType(); + + switch( iActiveAvkonQuery ) + { + case EPhoneQueryDialog: + CreateQueryDialogL( aParams ); + break; + + case EPhoneTextQueryDialog: + CreateTextQueryDialogL( aParams ); + break; + + case EPhoneDtmfTextQuery: + case EPhoneGenericTextQuery: + CreateTextQueryDialogL( aParams, + EPhoneCmdDtmfOk ); + break; + + case EPhoneGlobalQueryDialog: + { + if ( aParams.ParamId() == + TPhoneCommandParam::EPhoneParamIdVideoCallSetupFailedCreateVoiceCallToTheSameContactQuery ) + { + iVideoCallSetupFailedQuery = ETrue; + } + else + { + iVideoCallSetupFailedQuery = EFalse; + } + // Use timeout if defined + TTimeIntervalMicroSeconds32 timeout = aParams.TimeOut() * 1000000; + if ( timeout.Int() > 0 && !iTimer ) + { + iTimer = CPhoneTimer::NewL(); + // Start timer. + iTimer->After( timeout, this ); + } + // Create query + CreateGlobalQueryDialogL( aParams ); + break; + } + case EPhoneCustomListQueryDialog: + { + CreateCustomListQueryL( aParams ); + } + break; + case EPhoneDtmfListQueryDialog: + CreateDtmfListQueryL( + aParams.QueryResourceId() ); + break; + + case EPhoneContactsListQuery: + { + RArray commands; + CleanupClosePushL( commands ); + commands.Append( EPhoneNumberAcqCmdSave ); + commands.Append( EPhoneNumberAcqCmdAddToName ); + CreateListQueryL( aParams.QueryResourceId(), commands ); + CleanupStack::PopAndDestroy(); // CleanupClosePushL + } + break; + case EPhoneGlobalMsgQuery: + { + iTransferAcceptanceQuery = ( aParams.ParamId() == + TPhoneCommandParam::EPhoneParamIdUnattendedTransferAcceptanceQuery ); + + CreateGlobalMsgQueryL( aParams ); + break; + } + case EPhoneGlobalWaitNote: + { + CreateGlobalWaitNoteL( aParams ); + break; + } + + default: + return; + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateReconnectQueryL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateReconnectQueryL( TPhoneCommandParam* aCommandParam ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateReconnectQueryL( ) "); + + TPhoneCmdParamReconnectQuery* queryParam = + static_cast( aCommandParam ); + + if( !iCallUiReconnectQuery ) + { + iCallUiReconnectQuery = + CCaUiReconnectQuery::NewL( + queryParam->ReconnectQueryObserver()); + } + + iCallUiReconnectQuery->ShowL( queryParam->PhoneNumber(), + queryParam->IncludeVideoCallOption() ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateGlobalQueryDialogL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateGlobalQueryDialogL( const TPhoneCmdParamQuery& aParams ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateGlobalQueryDialogL( ) "); + + // Delete the existing global query + DestroyGlobalQuery(); + + iGlobalConfirmationQuery = CAknGlobalConfirmationQuery::NewL(); + iGlobalConfirmationQuery->ShowConfirmationQueryL( + iStatus, + aParams.QueryPrompt(), + aParams.DefaultCba(), + R_QGN_NOTE_QUERY_ANIM, + KNullDesC, + 0, + 0, + CAknQueryDialog::TTone(aParams.Tone() ) ); + + SetActive(); + } + + +// --------------------------------------------------------------------------- +// CPhoneQueryController::ReportQueryCompleteAsync +// --------------------------------------------------------------------------- +// +void CPhoneQueryController::ReportQueryCompleteAsync( TInt aCommand ) + { + iCommandHandled = ETrue; + Cancel(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aCommand ); + SetActive(); + } + +// --------------------------------------------------------- +// CPhoneQueryController::RunL +// EAknSoftkeyYes and EAknSoftkeyNo need to be used with +// CAknGlobalConfirmationQuery. Others does not work +// --------------------------------------------------------- +// +void CPhoneQueryController::RunL() + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::RunL( ) "); + TInt buttonId( KErrNone ); + + if ( iQueryParam.QueryCommandObserver() ) + { + // Let observer handle command. + iQueryParam.QueryCommandObserver()->ProcessCommandL( + iStatus.Int() ); + return; + } + + if ( iActiveAvkonQuery == EPhoneContactsListQuery || + iActiveAvkonQuery == EPhoneDtmfListQueryDialog ) + { + buttonId = iStatus.Int(); + } + else if ( iActiveAvkonQuery == EPhoneGlobalQueryDialog ) + { + if ( iStatus.Int() == EAknSoftkeyYes ) + { + if ( iVideoCallSetupFailedQuery ) + { + buttonId = EPhoneCmdYesVideoFailedNoMemorySwitchToVoice; + } + else + { + buttonId = EPhoneCmdYesBtDisconnectQuery; + } + } + else if ( iStatus.Int() == EAknSoftkeyNo ) + { + if ( iVideoCallSetupFailedQuery ) + { + buttonId = EPhoneCmdNoVideoFailedNoMemorySwitchToVoice; + } + else + { + buttonId = EPhoneCmdNoBtDisconnectQuery; + } + } + ClearTimer(); + iVideoCallSetupFailedQuery = EFalse; + DestroyGlobalQuery(); + } + else if ( iActiveAvkonQuery == EPhoneGlobalMsgQuery ) + { + buttonId = iQueryParam.CbaCommandMapping( iStatus.Int() ); + if ( iTransferAcceptanceQuery ) + { + iTransferAcceptanceQuery = EFalse; + } + + ClearTimer(); + DestroyGlobalMsgQuery(); + } + else if ( iActiveAvkonQuery == EPhoneGlobalWaitNote ) + { + // If note is destroyed through DestroyGlobalQuery() then KErrCancel + // is not mapped to any command. + if ( iStatus.Int() == KErrCancel && + !iGlobalWaitNote ) + { + ClearTimer(); + return; + } + else + { + buttonId = iQueryParam.CbaCommandMapping( iStatus.Int() ); + } + + ClearTimer(); + DestroyGlobalWaitNote(); + } + // Forward pressed CBA to the framework so that we can handle it + // in our active state + static_cast( iEikEnv.EikAppUi() ) + ->ProcessCommandL( buttonId ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::RunError +// --------------------------------------------------------- +// +TInt CPhoneQueryController::RunError( TInt aError ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::RunError( ) "); + + if ( aError ) + { + __PHONELOG1( EBasic, EPhoneUIView, + "CPhoneQueryController::RunError: error: %d", + aError ); + } + return aError; + } + +// --------------------------------------------------------- +// CPhoneQueryController::DoCancel +// --------------------------------------------------------- +// +void CPhoneQueryController::DoCancel() + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::DoCancel( ) "); + + if ( iActiveAvkonQuery == EPhoneGlobalQueryDialog ) + { + ClearTimer(); + DestroyGlobalQuery(); + if ( iVideoCallSetupFailedQuery ) + { + iVideoCallSetupFailedQuery = EFalse; + TRAP_IGNORE( + static_cast( iEikEnv.EikAppUi() ) + ->ProcessCommandL( + EPhoneCmdNoVideoFailedNoMemorySwitchToVoice ) ) + } + else if ( iQueryParam.QueryCommandObserver() ) + { + // Let observer handle command. + TRAP_IGNORE( iQueryParam.QueryCommandObserver()->ProcessCommandL( + EAknSoftkeyCancel ) ); + } + } + if ( EPhoneGlobalMsgQuery == iActiveAvkonQuery ) + { + ClearTimer(); + DestroyGlobalMsgQuery(); + + TInt buttonId = 0; + TInt result = iQueryParam.GetCustomCommandForTimeOut( buttonId ); + if ( KErrNone == result && iTransferAcceptanceQuery ) + { + // timeout equals reject of unattended transfer request + iTransferAcceptanceQuery = EFalse; + TRAP_IGNORE( + static_cast( iEikEnv.EikAppUi() ) + ->ProcessCommandL( buttonId ) ) + } + } + + if ( EPhoneGlobalWaitNote == iActiveAvkonQuery ) + { + ClearTimer(); + TInt buttonId = 0; + TInt result = iQueryParam.GetCustomCommandForTimeOut( buttonId ); + if ( KErrNone == result && iGlobalWaitNote ) + { + DestroyGlobalWaitNote(); + + TRAP_IGNORE( + static_cast( iEikEnv.EikAppUi() ) + ->ProcessCommandL( buttonId ) ) + } + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::IsQueryActive +// --------------------------------------------------------- +// +void CPhoneQueryController::IsQueryActive( TPhoneCommandParam* aCommandParam ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::IsQueryActive() "); + TPhoneCmdParamBoolean* booleanParam = + booleanParam = static_cast( aCommandParam ); + + if ( iQuery || + iTextQuery || + iGlobalConfirmationQuery || + !iQueryDeleted ) + { + booleanParam->SetBoolean( ETrue ); + } + else + { + booleanParam->SetBoolean( EFalse ); + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::IsDTMFQueryVisible +// --------------------------------------------------------- +// +TBool CPhoneQueryController::IsDTMFQueryVisible() + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::IsDTMFQueryVisible() "); + TBool dtmfVisible(EFalse); + if( ( iTextQuery && iQueryParam.QueryType() == EPhoneDtmfTextQuery ) || + ( iDtmfNumberListQuery && iQueryParam.QueryType() == EPhoneDtmfListQueryDialog ) ) + { + dtmfVisible = ETrue; + } + __PHONELOG1( EBasic, EPhoneUIView, + "CPhoneQueryController::IsDTMFQueryVisible :%d", + dtmfVisible ); + return dtmfVisible; + } + +// --------------------------------------------------------- +// CPhoneQueryController::SetListQueryStringL +// --------------------------------------------------------- +// +void CPhoneQueryController::SetListQueryStringL( TPhoneCommandParam* aCommandParam ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::SetListQueryStringL() "); + //Create new object if needed + if ( !iDtmfNumberListQuery ) + { + iDtmfNumberListQuery = CPhoneDtmfNumberListQuery::NewL( + static_cast( *iEikEnv.EikAppUi() ), + *this, + iResultBuffer ); + } + TPhoneCmdParamString* stringParam = + static_cast( aCommandParam ); + iDtmfNumberListQuery->AppendStringToArrayL( *stringParam->String() ); + } + +// ----------------------------------------------------------------------------- +// CPhoneQueryController::HandleTimeOutL +// ----------------------------------------------------------------------------- +// +void CPhoneQueryController::HandleTimeOutL() + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::HandleTimeOutL()"); + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CPhoneQueryController::ClearTimer +// ----------------------------------------------------------------------------- +// +void CPhoneQueryController::ClearTimer() + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::ClearTimer()"); + if ( iTimer ) + { + if ( iTimer->IsActive() ) + { + iTimer->Cancel(); + } + delete iTimer; + iTimer = NULL; + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateGlobalMsgQueryL +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateGlobalMsgQueryL( + const TPhoneCmdParamQuery& aParams ) + { + iQueryNoteText.Close(); + iQueryNoteText.Create( *aParams.DataText() ); + iQueryPrompt.Close(); + iQueryPrompt.Create( aParams.QueryPrompt() ); + + // use timeout if defined + const TInt KSecToUsFactor = 1000000; + TTimeIntervalMicroSeconds32 timeout = aParams.TimeOut() * KSecToUsFactor; + if ( 0 < timeout.Int() && !iTimer ) + { + iTimer = CPhoneTimer::NewL(); + iTimer->After( timeout, this ); + } + + DestroyGlobalMsgQuery(); + iGlobalMsgQuery = CAknGlobalMsgQuery::NewL(); + + const TInt KNoImage = 0; + const TInt KNoImageMask = -1; + + iGlobalMsgQuery->ShowMsgQueryL( iStatus, iQueryNoteText, aParams.DefaultCba(), + iQueryPrompt, KNullDesC(), KNoImage, KNoImageMask, + static_cast( aParams.Tone() ) ); + SetActive(); + } + +// --------------------------------------------------------- +// CPhoneQueryController::DestroyGlobalMsgQuery +// --------------------------------------------------------- +// +void CPhoneQueryController::DestroyGlobalMsgQuery() + { + if ( iGlobalMsgQuery ) + { + iGlobalMsgQuery->CancelMsgQuery(); + + delete iGlobalMsgQuery; + iGlobalMsgQuery = NULL; + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::CreateGlobalWaitNote +// --------------------------------------------------------- +// +void CPhoneQueryController::CreateGlobalWaitNoteL( + const TPhoneCmdParamQuery& aParams ) + { + __LOGMETHODSTARTEND(EPhoneUIView, + "CPhoneQueryController::CreateGlobalWaitNote()"); + if ( aParams.DataText()->Length() > 0 ) + { + iWaitNoteText.Close(); + iWaitNoteText.Create( *aParams.DataText() ); + // use timeout if defined + const TInt KSecToUsFactor = 1000000; + TTimeIntervalMicroSeconds32 timeout = aParams.TimeOut() * KSecToUsFactor; + if ( 0 < timeout.Int() && !iTimer ) + { + iTimer = CPhoneTimer::NewL(); + iTimer->After( timeout, this ); + } + + DestroyGlobalWaitNote(); + iGlobalWaitNote = CAknGlobalNote::NewL(); + iGlobalWaitNote->SetSoftkeys( aParams.DefaultCba() ); + // Show the global note + iGlobalWaitNote->ShowNoteL( iStatus, EAknGlobalWaitNote, *aParams.DataText() ); + + SetActive(); + } + } + +// --------------------------------------------------------- +// CPhoneQueryController::DestroyGlobalWaitNote +// --------------------------------------------------------- +// +void CPhoneQueryController::DestroyGlobalWaitNote() + { + __LOGMETHODSTARTEND(EPhoneUIView, + "CPhoneQueryController::DestroyGlobalWaitNote()"); + if ( iGlobalWaitNote ) + { + ClearTimer(); + TRAP_IGNORE( iGlobalWaitNote->CancelNoteL( KErrCancel ) ); + + delete iGlobalWaitNote; + iGlobalWaitNote = NULL; + } + iWaitNoteText.Close(); + } + +// --------------------------------------------------------- +// CPhoneQueryController::ProcessCommand +// --------------------------------------------------------- + +void CPhoneQueryController::ProcessCommandL( TInt aCommandId ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::ProcessCommandL()"); + + iCommandId = aCommandId; + + if ( iTextQuery ) + { // Store text for next content getting + iQueryPreviousText.Close(); + iQueryPreviousText.Create( KPhoneMaxCharsInNote ); + iTextQuery->GetContent( iQueryPreviousText ); + } + + iCommandAsync = CIdle::NewL( EPriorityNormal ); + iCommandAsync->Start( TCallBack( ProcessCommandCallBack, this ) ); + } + +// --------------------------------------------------------- +// CPhoneQueryController::ProcessCommandCallBack +// --------------------------------------------------------- +// +TInt CPhoneQueryController::ProcessCommandCallBack( TAny* aCPhoneQueryController ) + { + __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::ProcessCommandCallBack() "); + + CPhoneQueryController* queryController = + static_cast( aCPhoneQueryController ); + + delete queryController->iCommandAsync; + queryController->iCommandAsync = NULL; + + TRAP_IGNORE( static_cast( queryController->iEikEnv.EikAppUi() ) + ->ProcessCommandL( queryController->iCommandId ) ); + + return KErrNone; + } + + +// end of file +