phoneapp/phoneuiview/src/cphonequerycontroller.cpp
changeset 0 5f000ab63145
--- /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 <AknGlobalConfirmationQuery.h>
+#include <eikenv.h>
+#include <StringLoader.h>
+#include <ccauireconnectquery.h>
+#include <mcauireconnectqueryobserver.h>
+#include <AknGlobalMsgQuery.h>
+#include <AknGlobalNote.h> // 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<TPhoneCmdParamQuery*>( 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<MEikCommandObserver*>( 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<TPhoneCmdParamBoolean*>( 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<CPhoneQueryController*>( 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<MEikCommandObserver*>( queryController->iEikEnv.EikAppUi() )
+            ->ProcessCommandL( EPhoneInCallCmdDtmfListQuery ) );
+        }
+
+    queryController->iNoConnectedCalls = EFalse;
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CPhoneQueryController::CreateListQueryL
+// ---------------------------------------------------------
+//
+void CPhoneQueryController::CreateListQueryL( TInt aDialogResourceId,
+                                              const RArray<TInt>& aCommands )
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::CreateListQueryL( ) ");
+    DestroyQuery();
+
+    if ( !iListQuery )
+       {
+       iListQuery = new (ELeave)
+                CPhoneListQueryDialog(
+                static_cast<MEikCommandObserver&>( *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<TInt> commands;
+    CleanupClosePushL( commands );
+    const_cast<TPhoneCmdParamQuery&>(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<MEikCommandObserver&>( *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<MEikCommandObserver&>( *iEikEnv.EikAppUi() ),
+                                               *this,
+                                               iResultBuffer );
+        }
+    iQueryDeleted = EFalse;
+    iDtmfNumberListQuery->ExecuteLD( aDialogResourceId );
+    }
+
+// ---------------------------------------------------------
+// CPhoneQueryController::GetTextQueryContentL
+// ---------------------------------------------------------
+//
+void CPhoneQueryController::GetTextQueryContentL(
+    TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::GetTextQueryContentL( ) ");
+
+    TPhoneCmdParamString* stringParam =
+        static_cast<TPhoneCmdParamString*>( 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<TInt> 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<TPhoneCmdParamReconnectQuery*>( 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<MEikCommandObserver*>( 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<MEikCommandObserver*>( 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<MEikCommandObserver*>( 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<MEikCommandObserver*>( iEikEnv.EikAppUi() )
+                    ->ProcessCommandL( buttonId ) )
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneQueryController::IsQueryActive
+// ---------------------------------------------------------
+//
+void CPhoneQueryController::IsQueryActive( TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneQueryController::IsQueryActive() ");
+    TPhoneCmdParamBoolean* booleanParam =
+        booleanParam = static_cast<TPhoneCmdParamBoolean*>( 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<MEikCommandObserver&>( *iEikEnv.EikAppUi() ),
+                                           *this,
+                                           iResultBuffer );
+        }
+    TPhoneCmdParamString* stringParam =
+        static_cast<TPhoneCmdParamString*>( 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<CAknQueryDialog::TTone>( 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<CPhoneQueryController*>( aCPhoneQueryController );
+
+    delete queryController->iCommandAsync;
+    queryController->iCommandAsync = NULL;
+
+    TRAP_IGNORE( static_cast<MEikCommandObserver*>( queryController->iEikEnv.EikAppUi() )
+        ->ProcessCommandL( queryController->iCommandId ) );
+
+    return KErrNone;
+    }
+
+
+// end of file
+