emailcontacts/remotecontactlookup/engine/src/cpbkxrclserviceuicontextimpl.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 11 0396474f30f5
child 13 8592a65ad3fb
--- a/emailcontacts/remotecontactlookup/engine/src/cpbkxrclserviceuicontextimpl.cpp	Mon Mar 15 12:39:10 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1478 +0,0 @@
-/*
-* Copyright (c) 2007 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 the class CPbkxRclServiceUiContextImpl.
-*
-*/
-
-
-#include "emailtrace.h"
-#include <pbkxrclengine.rsg>
-#include <cntfldst.h>
-#include <StringLoader.h>
-#include <CPbkContactEngine.h>
-#include <bautils.h>
-#include <textresolver.h>
-//<cmail>
-#include "fsccontactactionservicedefines.h"
-//</cmail>
-#include <data_caging_path_literals.hrh>
-#include <AknsUtils.h>
-#include <hlplch.h>
-
-#include "cpbkxrclserviceuicontextimpl.h"
-#include "pbkxremotecontactlookuppanic.h"
-#include "cpbkxremotecontactlookupprotocolsession.h"
-#include "cpbkxrclprotocolenvimpl.h"
-#include "cpbkxremotecontactlookupprotocoladapter.h"
-#include "cpbkxremotecontactlookupprotocolaccount.h"
-
-#include "cpbkxrclsearchresultdlg.h"
-#include "cpbkxrclresultinfodlg.h"
-#include "cpbkxrclqueryeditor.h"
-#include "cpbkxrclactionservicewrapper.h"
-
-#include "pbkxrclutils.h"
-#include "pbkxrclengineconstants.h"
-
-#include "engine.hrh"
-#include <aknnotewrappers.h>
-
-// own macro to handle errors in traps
-// <cmail> Do not use, produces Codescanner warnings
-//#define EXIT_IF_ERROR( xxx ) { TRAPD( err, xxx ); if ( err != KErrNone ) HandleError( err ); }
-// </cmail>
-
-/// Unnamed namespace for local definitions
-namespace {
-const TInt KTwoMinutesTimerInterval(120000000);
-} /// namespace
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::NewL
-// ---------------------------------------------------------------------------
-//
-CPbkxRclServiceUiContextImpl* CPbkxRclServiceUiContextImpl::NewL(
-    TPbkxRemoteContactLookupProtocolAccountId aId,
-    TMode aMode )
-    {
-    FUNC_LOG;
-    CPbkxRclServiceUiContextImpl* context = 
-        CPbkxRclServiceUiContextImpl::NewLC( aId, aMode );
-    CleanupStack::Pop( context );
-    return context;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::NewLC
-// ---------------------------------------------------------------------------
-//
-CPbkxRclServiceUiContextImpl* CPbkxRclServiceUiContextImpl::NewLC(
-    TPbkxRemoteContactLookupProtocolAccountId aId,
-    TMode aMode )
-    {
-    FUNC_LOG;
-    CPbkxRclServiceUiContextImpl* context = 
-        new ( ELeave ) CPbkxRclServiceUiContextImpl( aId, aMode );
-    CleanupStack::PushL( context );
-    context->ConstructL();
-    return context;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::CPbkxRclServiceUiContextImpl
-// ---------------------------------------------------------------------------
-//
-CPbkxRclServiceUiContextImpl::CPbkxRclServiceUiContextImpl(
-    TPbkxRemoteContactLookupProtocolAccountId aId,
-    TMode aMode ) : 
-    iAccountId( aId ), iMode( aMode ), iSelectedIndex( KErrNotFound )
-    {
-    FUNC_LOG;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::~CPbkxRclServiceUiContextImpl
-// ---------------------------------------------------------------------------
-//
-CPbkxRclServiceUiContextImpl::~CPbkxRclServiceUiContextImpl()
-    {
-    FUNC_LOG;
-
-    if( iTimer )
-        {
-        iTimer->Cancel();
-        }
-    delete iTimer;
-
-    iQueryText.Close();
-    iQueryCriteria.Close();
-
-    CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset );
-
-    iContactCards.Reset();
-    iSearchResults.ResetAndDestroy();
-    iWaitObjects.ResetAndDestroy();
-    delete iContactEngine;
-
-    delete iActionServiceWrapper;
-
-    delete iAccount;
-    delete iSession;
-    delete iAdapter;
-    delete iEnvImpl;
-
-    delete iEventScheduler;
-    
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::ConstructL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::ConstructL()
-    {
-    FUNC_LOG;
-
-    CCoeEnv* coeEnv = CCoeEnv::Static();
-
-    TFileName dllFileName;
-    Dll::FileName( dllFileName );
-      
-    TParse parse;
-    parse.Set( KResourceFile, &KDC_APP_RESOURCE_DIR, &dllFileName );
-    TFileName resourceFile = parse.FullName();
-    BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resourceFile );
-
-    TRAPD( status,
-           iResourceFileOffset = coeEnv->AddResourceFileL( resourceFile ) );
-    
-    if( status != KErrNone )
-        {
-    	PbkxRclPanic( EPbkxRclPanicGeneral );		
-        }
-	else 
-        {
-        }
-
-    // create default contact engine to use to create CPbkContactItems
-    iContactEngine = CPbkContactEngine::NewL();
-
-    // create actions service wrapper used by UI views
-    iActionServiceWrapper = CPbkxRclActionServiceWrapper::NewL( *iContactEngine );
-
-    iActionServiceWrapper->SetContactSelectorMode( 
-        iMode == EModeContactSelector );
-
-    // Create objects needed for executing the search
-    iEnvImpl = CPbkxRclProtocolEnvImpl::NewL();
-    
-    iAdapter = CPbkxRemoteContactLookupProtocolAdapter::NewL( 
-        iAccountId.iProtocolUid, 
-        *iEnvImpl );
-
-    iAccount = iAdapter->NewProtocolAccountL( iAccountId );
-
-    if ( iAccount == NULL )
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    iSession = iAdapter->NewSessionL();
-    iSession->InitializeL( *this, iAccountId );
-
-    iEventScheduler = CPbkxRclEventScheduler::NewL( *this );
-    
-    iTimer = CPeriodic::NewL( CActive::EPriorityIdle );
-
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::GetSelectedContactL
-// ---------------------------------------------------------------------------
-//
-CContactItem* CPbkxRclServiceUiContextImpl::GetSelectedContactL()
-    {
-    FUNC_LOG;
-    __ASSERT_ALWAYS( iSelectedIndex >= 0 && iSelectedIndex < iContactCards.Count(),
-                     PbkxRclPanic( EPbkxRclPanicGeneral ) );
-    CContactCard* selected = iContactCards[iSelectedIndex];
-    CContactCard* copy = CContactCard::NewL( selected );
-    return copy;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::GetResultByIndex
-// ---------------------------------------------------------------------------
-//
-CPbkxRemoteContactLookupProtocolResult* 
-CPbkxRclServiceUiContextImpl::GetResultByIndex( TInt aIndex )
-    {
-    __ASSERT_ALWAYS( aIndex >= 0 && aIndex < iContactCards.Count(), 
-                     PbkxRclPanic( EPbkxRclPanicGeneral ) );
-  
-    CContactCard* card = iContactCards[aIndex];
-    CPbkxRemoteContactLookupProtocolResult* result = NULL;
-    for ( TInt i = 0; i < iSearchResults.Count(); i++ )
-        {
-        if ( card == &( iSearchResults[i]->ContactItem() ) )
-            {
-            result = iSearchResults[i];
-            break;
-            }
-        }
-
-    __ASSERT_ALWAYS( result != NULL, PbkxRclPanic( EPbkxRclPanicGeneral ) );
-
-    return result;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::ExecuteL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::ExecuteL( const TDesC& aQueryText, TResult& aResult )
-    {
-    FUNC_LOG;
-
-    // set state as initial
-    ResetState();
-    SetState( EInitial );
-    iExitCode = KErrNone;
-
-    iSearchResults.ResetAndDestroy();
-
-    iQueryCriteria.Close();
-    iQueryCriteria.CreateL( KRclQueryTextMaxLength );
-    iQueryCriteria = aQueryText.Left( KRclQueryTextMaxLength );
-
-    iResult = &aResult;
-
-    TOperation op = ( iMode != EModeExistingCriteria ) ? 
-        EOpenSearchQueryDefault : EExecuteSearchWithNoQuery;
-    
-    AddOperation( op );
-        
-    StartActiveWaitL( EMainWait );
-
-    
-    HandleContextExitL();
-
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::LooseSearchCompleted
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::LooseSearchCompleted(
-    TInt aStatus,
-    RPointerArray<CPbkxRemoteContactLookupProtocolResult>& aResults )
-    {
-    FUNC_LOG;
-
-    // <cmail>
-    TRAPD( err, DoLooseSearchCompletedL( aStatus, aResults ) );
-    if ( err != KErrNone )
-        {
-        HandleError( err );
-        }
-    // </cmail>
-    
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::ContactFieldsRetrievalCompleted
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::ContactFieldsRetrievalCompleted( TInt aStatus )
-    {
-    FUNC_LOG;
-
-    // <cmail>
-    TRAPD( err, DoContactFieldsRetrievalCompletedL( aStatus ) );
-    if ( err != KErrNone )
-        {
-        HandleError( err );
-        }
-    // </cmail>
-
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::RetrieveDetailsL
-// ---------------------------------------------------------------------------
-//
-CContactCard* CPbkxRclServiceUiContextImpl::RetrieveDetailsL( 
-    TInt aContactIndex,
-    const TDesC& aWaitNoteText )
-    {
-    FUNC_LOG;
-
-    CPbkxRemoteContactLookupProtocolResult* result = GetResultByIndex( aContactIndex );
-
-    CContactCard* card = static_cast<CContactCard*>( &result->ContactItem() );
-
-    if ( !result->IsComplete() )
-        {
-        
-        RPointerArray<CPbkxRemoteContactLookupProtocolResult> array;
-        CleanupClosePushL( array );
-        array.AppendL( result );
-
-        iSession->RetrieveContactFieldsL( array );
-
-        // Start time for time out event
-        iTimer->Start(
-        		KTwoMinutesTimerInterval, KTwoMinutesTimerInterval, 
-            TCallBack(TimerCallBack, this));
-        
-        DisplayWaitDialogL( R_RCL_SEARCH_WAIT_DIALOG_CANCEL, aWaitNoteText );
-
-        // Start active wait. When contact retrieval is completed, 
-        // ContactFieldsRetrievalCompleted is called. If user cancels
-        // retrieval, DialogDismissedL is called. TimeOut is called when time is out.
-        StartActiveWaitL( EContactRetrievalWait );
-        
-        CleanupStack::PopAndDestroy( &array );
-        
-
-        // if contact retrieval was canceledor retrieval failed, 
-        // result is not yet complete
-        if ( !result->IsComplete() )
-            {
-            card = NULL;
-            }
-        
-        }
-
-    return card;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::ContactCount
-// ---------------------------------------------------------------------------
-//
-TInt CPbkxRclServiceUiContextImpl::ContactCount() const
-    {
-    FUNC_LOG;
-    return iContactCards.Count();
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::SetSelectedContact
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::SetSelectedContactL( TInt aIndex )
-    {
-    FUNC_LOG;
-    iSearchResultDialog->SetCurrentItemIndexL( aIndex );
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::EventTriggered
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::EventTriggered()
-    {
-    FUNC_LOG;
-
-    // <cmail>
-    TRAPD( err, DoHandleOperationL() );
-    if ( err != KErrNone )
-        {
-        HandleError( err );
-        }
-    // </cmail>
-
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::ProcessCommandL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::ProcessCommandL( TInt aCommandId )
-    {
-    FUNC_LOG;
-   
-    // some commands are handled the same way no matter which dialog is on top
-    TBool handled = ETrue;
-
-    switch ( aCommandId )
-        {
-        case ERclCmdVoiceCall:
-            iActionServiceWrapper->ExecuteActionL( 
-                KFscAtComCallGSM );
-            break;
-        case ERclCmdVideoCall:
-            iActionServiceWrapper->ExecuteActionL( 
-                KFscAtComCallVideo );
-            break;
-        case ERclCmdVoip:
-            iActionServiceWrapper->ExecuteActionL(
-                KFscAtComCallVoip );
-            break;
-        case ERclCmdSendMsg:
-            iActionServiceWrapper->ExecuteActionL( 
-                KFscAtComSendMsg );
-            break;
-          
-        case ERclCmdSendEmail:
-            iActionServiceWrapper->ExecuteActionL( 
-                KFscAtComSendEmail );
-            break;
-            
-        case ERclCmdSendMeetingReq:
-            iActionServiceWrapper->ExecuteActionL( 
-                KFscAtComSendCalReq );
-            break;
-        case ERclCmdSendAudioMsg:
-            iActionServiceWrapper->ExecuteActionL( 
-                KFscAtComSendAudio );
-            break;
-        case ERclCmdToContact:
-            iActionServiceWrapper->ExecuteActionL(
-                KFscAtComCallPoc );
-            break;
-        case ERclCmdHelp:
-            {
-            CCoeAppUi* appUi = CCoeEnv::Static()->AppUi();
-            CArrayFix<TCoeHelpContext>* contexts = appUi->AppHelpContextL();
-            HlpLauncher::LaunchHelpApplicationL( 
-                CCoeEnv::Static()->WsSession(), 
-                contexts );
-            }
-            break;
-        default:
-            handled = EFalse;
-            break;
-        }
-    
-    if ( !handled )
-        {
-        if ( IsStateSet( EResultDlgOnTop ) )
-            {
-            switch ( aCommandId )
-                {
-                case ERclCmdAddAsRecipient:
-                    // close the dialog, selected contact is stored in iSelectedContact
-                    AddOperation( ECloseSearchResultDlg );
-                    SetState( EReturnToCaller );
-                    SetState( EResultSelected );
-                    break;
-                case ERclCmdViewDetails:
-                    AddOperation( EOpenResultInfoDlg );
-                    break;
-                case ERclCmdNewSearch:
-                    // open empty search query
-                    AddOperation( EOpenSearchQueryEmpty );
-                    break;
-                case ERclCmdSendBusinessCard:
-                    {
-                    // first fetch details if they are not already
-                    // fetched
-                    HBufC* waitNoteText = StringLoader::LoadLC(
-                        R_QTN_RCL_RETRIEVAL_WAIT_NOTE );
-                    if ( RetrieveDetailsL(
-                             iSearchResultDialog->CurrentItemIndex(),
-                             *waitNoteText ) != NULL )
-                        {
-                        iSearchResultDialog->SendBusinessCardL();
-                        }
-                    CleanupStack::PopAndDestroy( waitNoteText );
-                    }
-                    break;
-                case ERclCmdSaveToContacts:
-                    {
-                    // first retrieve all the details
-                    HBufC* waitNoteText = StringLoader::LoadLC(
-                        R_QTN_RCL_SAVING_WAIT_NOTE );
-                    if ( RetrieveDetailsL( 
-                             iSearchResultDialog->CurrentItemIndex(),
-                             *waitNoteText ) != NULL )
-                        {
-                        
-                        iActionServiceWrapper->ExecuteActionL( 
-                            KFscAtManSaveAs );
-                        
-                        // in contact selector mode, return to the calling 
-                        // application
-                        if ( iMode == EModeContactSelector )
-                            {
-                            AddOperation( ECloseSearchResultDlg );
-                            SetState( EReturnToCaller );
-                            SetState( EResultSelected );
-                            }
-                        }
-                    CleanupStack::PopAndDestroy( waitNoteText );
-                    }
-                    break;
-                case EAknCmdExit:
-                    iResult->iExitReason = TResult::EExitApplication;
-                    AddOperation( ECloseSearchResultDlg );
-                    SetState( EReturnToCaller );
-                    break;
-                default:
-                    break;
-                }
-            }
-        else if ( IsStateSet( EInfoDlgOnTop ) )
-            {
-            switch ( aCommandId )
-                {
-                case ERclCmdAddAsRecipient:
-                    // close both dialogs, selected contact is in iSelectedContact
-                    AddOperation( ECloseResultInfoDlg );
-                    AddOperation( ECloseSearchResultDlg );
-                    SetState( EResultSelected );
-                    SetState( EReturnToCaller );
-                    break;
-                case ERclCmdSendCallbackReq:
-                    iResultInfoDialog->SendCallbackRequestL();
-                    break;
-                case ERclCmdCreateNew:
-                    iActionServiceWrapper->ExecuteActionL(
-                        KFscAtManSaveAs );
-                    // in contact selector mode, return to the calling
-                    // application
-                    if ( iMode == EModeContactSelector )
-                        {
-                        AddOperation( ECloseResultInfoDlg );
-                        AddOperation( ECloseSearchResultDlg );
-                        SetState( EReturnToCaller );
-                        SetState( EResultSelected );
-                        }
-                    break;
-                case ERclCmdUpdateExisting:
-                    {
-                    HBufC* resultText = 
-                        iResultInfoDialog->UpdateExistingContactL();
-                    if ( resultText != NULL )
-                        {
-                        CleanupStack::PushL( resultText );
-                        DisplayNoteDialogL(
-                            R_RCL_CONFIRMATION_NOTE,
-                            *resultText,
-                            ETrue );
-                        CleanupStack::PopAndDestroy( resultText );
-                        }
-                    }
-                    break;
-                case ERclCmdSendBusinessCard:
-                    iResultInfoDialog->SendBusinessCardL();
-                    break;
-                case EAknCmdExit:
-                    // again close both dialogs
-                    AddOperation( ECloseResultInfoDlg );
-                    AddOperation( ECloseSearchResultDlg );
-                    SetState( EReturnToCaller );
-                    iResult->iExitReason = TResult::EExitApplication;
-                    break;
-                default:
-                    break;
-                }
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DialogDismissedL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::DialogDismissedL( TInt aButtonId )
-    {
-    FUNC_LOG;
-
-    if ( aButtonId == EAknSoftkeyCancel )
-        {
-        
-        // Action was canceled. Don't need to inform about errors
-        iExitCode = KErrNone;
-    	// cancel search or detail retrieval
-    	if (iSession)
-    		{
-    		iSession->Cancel();
-    		}
-    	
-    	// cancel time out timer
-        if (iTimer)
-    		{
-    		iTimer->Cancel();
-    		}
-        
-        // do actions based on state
-        if ( IsStateSet( EInitial ) )
-            {
-            if ( iMode != EModeExistingCriteria )
-                {
-                // show new search query dialog
-                AddOperation( EOpenSearchQueryDefault );
-                }
-            else
-                {
-                // with existing criteria, exit
-                AddOperation( EExit );
-                }
-            }
-        else if ( IsStateSet( EResultDlgOnTop ) )
-            {
-            if ( iWaitObjects.Count() == EContactRetrievalWait + 1 )
-                {
-                // contact retrieval was in progress
-                StopActiveWait( EContactRetrievalWait );
-                } // else new search was in progress, no actions needed
-            }
-        else if ( IsStateSet( EInfoDlgOnTop ) )
-            {
-            // details retrieval was in progress, stop active wait 
-            StopActiveWait( EContactRetrievalWait );
-            }
-        
-        }
-    else
-        {
-        // wait dialog closed by itself. exit now if exiting
-        if ( IsStateSet( EReturnToCaller ) &&
-                ( IsStateSet( EResultSelected ) || IsStateSet( EInitial ) ) )
-            {
-            AddOperation( EExit );
-            }
-        
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::ExecuteSearchL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::ExecuteSearchL( 
-    TBool aShowQueryDialog,
-    const TDesC& aQueryText )
-    {
-    FUNC_LOG;
-
-
-    iQueryText.Close();
-    iQueryText.CreateMaxL( KRclQueryTextMaxLength );
-    iQueryText = aQueryText;
-
-    TBool result = EFalse;
-    if ( aShowQueryDialog )
-        {
-        CPbkxRclQueryEditor* queryEditor = CPbkxRclQueryEditor::NewL( 
-            iAccount->Name(), 
-            iQueryText );
-        result = queryEditor->ExecuteDialogLD();
-        
-        // save initial query text given by user
-        if ( !IsStateSet( EResultDlgOnTop ) )
-            {
-            iQueryCriteria = iQueryText;
-            }
-        }
-    else
-        {
-        result = ETrue;
-        }
-
-    if ( result )
-        {
-        
-        // Start time for time out event
-        iTimer->Start(
-            KTwoMinutesTimerInterval, KTwoMinutesTimerInterval, 
-            TCallBack(TimerCallBack, this));
-        
-        // execute search based on query text
-        // use KMaxMatches + 1 to be able to catch "too many results error"
-        iSession->LooseSearchL( iQueryText, KMaxMatches + 1 );
-        HBufC* text = StringLoader::LoadLC( R_QTN_RCL_SEARCH_WAIT_NOTE, iQueryText );
-        DisplayWaitDialogL( R_RCL_SEARCH_WAIT_DIALOG_CANCEL, *text );
-        CleanupStack::PopAndDestroy( text );
-        }
-    else
-        {
-        if ( !IsStateSet( EResultDlgOnTop ) )
-            {
-            AddOperation( EExit );
-            } // otherwise just return to search result dlg
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DisplayWaitDialogL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::DisplayWaitDialogL(
-    TInt aDialogResourceId,
-    const TDesC& aText )
-    {
-    FUNC_LOG;
-
-    iWaitDialog = new ( ELeave ) CAknWaitDialog( NULL, ETrue );
-    iWaitDialog->SetTextL( aText );
-    iWaitDialog->SetCallback( this );
-    iWaitDialog->ExecuteLD( aDialogResourceId );
-
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DisplayNoteDialogL
-// ---------------------------------------------------------------------------
-//
-TBool CPbkxRclServiceUiContextImpl::DisplayNoteDialogL(
-    TInt aDialogResourceId, 
-    const TDesC& aText,
-    TBool aTimeout )
-    {
-    FUNC_LOG;
-    CAknNoteDialog* dialog = NULL;
-    
-    if ( aTimeout )
-        {
-        dialog = new ( ELeave ) CAknNoteDialog( 
-            CAknNoteDialog::ENoTone, 
-            CAknNoteDialog::ELongTimeout );
-        }
-    else
-        {
-        dialog = new ( ELeave ) CAknNoteDialog();
-        }
-
-    dialog->PrepareLC( aDialogResourceId );
-    dialog->SetTextL( aText );
-        
-    TBool ret = ( TBool )dialog->RunLD();
-    
-
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DisplayQueryDialogL
-// ---------------------------------------------------------------------------
-//
-//Fix for: EASV-7KFGG3
-TBool CPbkxRclServiceUiContextImpl::DisplayQueryDialogL(
-    TInt aDialogResourceId, 
-    const TDesC& aText )
-    {
-    FUNC_LOG;
-    CAknQueryDialog* dialog = NULL;
-    
-    dialog = new ( ELeave ) CAknQueryDialog();
-    dialog->PrepareLC( aDialogResourceId );
-    dialog->SetPromptL( aText );
-        
-    TBool ret = ( TBool )dialog->RunLD();
-    
-
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::CloseWaitDialogL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::CloseWaitDialogL()
-    {
-    FUNC_LOG;
-    iWaitDialog->ProcessFinishedL();
-    iWaitDialog = NULL;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DisplaySearchResultDialogL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::DisplaySearchResultDialogL()
-    {
-    FUNC_LOG;
-
-    if ( iSearchResultDialog == NULL )
-        {
-        // no search result dialog on screen, show new one
-
-        // result array holds list box items and it is filled inside search
-        // result dialog
-        CDesCArrayFlat* resultArray = 
-            new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
-        CleanupStack::PushL( resultArray );
-        
-        TBool contactSelectorEnabled = iMode == EModeContactSelector;
-        
-        iSearchResultDialog = CPbkxRclSearchResultDlg::NewL(
-            iSelectedIndex,
-            resultArray,
-            this,
-            iContactCards,
-            *iContactEngine,
-            *iActionServiceWrapper,
-            contactSelectorEnabled );
-        
-        UnsetState( EInitial );
-        SetState( EResultDlgOnTop );
-    
-        // set action service mode
-        iActionServiceWrapper->SetActionMenuMode( ETrue );
-    
-        iSearchResultDialog->ExecuteLD();
-        
-        iActionServiceWrapper->SetActionMenuMode( EFalse );
-
-
-        iSearchResultDialog = NULL;
-        
-        CleanupStack::PopAndDestroy( resultArray );
-
-        HandleSearchResultDialogExitL();
-
-        UnsetState( EResultDlgOnTop );
-        SetState( EInitial );
-        }
-    else
-        { // iSearchResultDialog != NULL
-        
-        
-        iSearchResultDialog->UpdateDialogL();
-        }
-    }
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DisplayResultInfoDialogL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::DisplayResultInfoDialogL()
-    {
-    FUNC_LOG;
-    
-    // items array holds the list box items in result info dialog and it is filled
-    // result info dialog
-    CDesCArrayFlat* items = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
-    CleanupStack::PushL( items );
-    
-    TInt index = 0;
-    
-    TBool contactSelectorEnabled = iMode == EModeContactSelector;
-
-    TInt itemIndex = iSearchResultDialog->CurrentItemIndex();
-
-    // creation fails if item details cannot be retrieved or user cancels
-    // retrieval
-    iResultInfoDialog = CPbkxRclResultInfoDlg::NewL(
-        index,
-        items,
-        this,
-        this,
-        *iContactEngine,
-        *iActionServiceWrapper,
-        contactSelectorEnabled,
-        itemIndex );
-    
-    UnsetState( EResultDlgOnTop );
-    SetState( EInfoDlgOnTop );
-    
-     // set action service mode
-    iActionServiceWrapper->SetActionMenuMode( EFalse );
-    
-    //Fix for: PKAO-7NNCJ2
-    if ( iSearchResultDialog )
-        {
-        iSearchResultDialog->InfoDlgVisible( ETrue );
-        }
-    
-    iResultInfoDialog->ExecuteLD();
-    
-    // update action service since now search result dialog is on top
-    iActionServiceWrapper->SetActionMenuMode( ETrue );
-
-    if ( !IsStateSet( EReturnToCaller ) && iResult->iExitReason != TResult::EExitApplication )
-    	{
-    	iSearchResultDialog->SetCurrentContactToActionServiceL();
-    	}
-    
-    //Fix for: PKAO-7NNCJ2
-    if ( iSearchResultDialog )
-        {
-        iSearchResultDialog->InfoDlgVisible( EFalse );
-        }
-    
-    iResultInfoDialog = NULL;
-    
-    UnsetState( EInfoDlgOnTop );
-    SetState( EResultDlgOnTop );
-        
-    CleanupStack::PopAndDestroy( items );
-    
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::CreateContactCardArray
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::CreateContactCardArray()
-    {
-    FUNC_LOG;
-
-    // remove possible old contact cards
-    iContactCards.Reset();
-    
-
-    for ( TInt i = 0; i < iSearchResults.Count(); i++ )
-        {
-        CContactItem& item = iSearchResults[i]->ContactItem();
-        CContactCard* card = dynamic_cast<CContactCard*>( &item );
-        if ( card != NULL )
-            {
-            iContactCards.Append( card );
-            }
-        }
-
-
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DoLooseSearchCompletedL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::DoLooseSearchCompletedL( 
-    TInt aStatus,
-    RPointerArray<CPbkxRemoteContactLookupProtocolResult>& aResults )
-    {
-    FUNC_LOG;
-	
-    // cancel time out timer
-    if (iTimer)
-		{
-		iTimer->Cancel();
-		}
-    
-    CloseWaitDialogL();
-
-    if ( aStatus == KErrNone )
-        {
-        if ( aResults.Count() > KMaxMatches )
-            {
-            
-            HBufC* text = StringLoader::LoadLC( 
-                R_QTN_RCL_TOO_MANY_RESULTS_NOTE, 
-                KMaxMatches );
-
-            TBool ret = DisplayQueryDialogL(
-                R_RCL_CONFIRMATION_NOTE_OK_REFINE,
-                *text );
-            
-            CleanupStack::PopAndDestroy( text );
-            
-            if ( !ret )
-                {
-                // user wants new search
-                AddOperation( EOpenSearchQueryDefault );
-
-                // reset the old results
-                aResults.ResetAndDestroy();
-                return;
-                }
-            }
-        
-        // delete old results
-        iSearchResults.ResetAndDestroy();
-        TInt count = aResults.Count() <= KMaxMatches ? aResults.Count() : KMaxMatches;
-        for ( TInt i = 0; i < count; i++ )
-            {
-            iSearchResults.AppendL( aResults[i] );
-            }
-
-        // delete the extra results
-        for ( TInt j = aResults.Count() - 1; j >= KMaxMatches; j-- )
-            {
-            delete aResults[j];
-            aResults.Remove( j );
-            }
-        
-        CreateContactCardArray();
-        TLinearOrder<CContactCard> sort( CPbkxRclServiceUiContextImpl::Sort );
-        iContactCards.Sort( sort );
-        
-        AddOperation( EOpenSearchResultDlg );
-        }
-    else
-        {
-
-        // reset the array just in case
-        aResults.ResetAndDestroy();
-
-        // remote contact lookup failed, exit
-        HandleError( aStatus );
-        
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DoContactFieldsRetrievalCompletedL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::DoContactFieldsRetrievalCompletedL( TInt aStatus )
-    {
-    FUNC_LOG;
-
-	// cancel time out timer
-    if (iTimer)
-		{
-		iTimer->Cancel();
-		}
-    
-    StopActiveWait( EContactRetrievalWait );
-
-    CloseWaitDialogL();
-
-    if ( aStatus != KErrNone )
-        {
-        // error occurred, so contact is not complete. this is checked
-        // in RetrieveContactDetailsL method and it returns NULL
-        // to the caller
-
-        // exit application
-        HandleError( aStatus );
-        }
-    
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::DoHandleOperationL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::DoHandleOperationL()
-    {
-    FUNC_LOG;
-
-    if ( iOperations.Count() > 0 )
-        {
-        TOperation operation = iOperations.Pop();
-        
-        
-        switch ( operation )
-            {
-            case EOpenSearchResultDlg:
-                DisplaySearchResultDialogL();
-                break;
-            case EOpenResultInfoDlg:
-                DisplayResultInfoDialogL();
-                break;
-            case ECloseSearchResultDlg:
-                if ( iSearchResultDialog != NULL )
-                    {
-                    iSearchResultDialog->Close();
-                    }
-                break;
-            case ECloseResultInfoDlg:
-                if ( iResultInfoDialog != NULL )
-                    {
-                    iResultInfoDialog->Close();
-                    }
-                break;
-            case EOpenSearchQueryDefault:
-                ExecuteSearchL( ETrue, iQueryCriteria );
-                break;
-            case EOpenSearchQueryEmpty:
-                ExecuteSearchL( ETrue, KNullDesC );
-                break;
-            case EExecuteSearchWithNoQuery:
-                ExecuteSearchL( EFalse, iQueryCriteria );
-                break;
-            case EExit:
-                StopActiveWait( EMainWait );
-                break;
-            default:
-                PbkxRclPanic( EPbkxRclPanicGeneral );
-                break;
-            }
-        
-        if ( iOperations.Count() > 0 )
-            {
-            iEventScheduler->TriggerEvent();
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::HandleSearchResultDialogExitL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::HandleSearchResultDialogExitL()
-    {
-    FUNC_LOG;
-
-    // this flag is set if wait dialog on the screen and we cannot exit before
-    // wait dialog is closed itself
-    TBool waitDlgOnScreen = EFalse;
-    
-    if ( IsStateSet( EResultSelected ) )
-        {
-        // if contact details are not retrieved, we must do that before exiting
-        CPbkxRemoteContactLookupProtocolResult* result = GetResultByIndex( iSelectedIndex );
-        if ( !result->IsComplete() )
-            {
-            HBufC* text = StringLoader::LoadLC( R_QTN_RCL_RETRIEVAL_WAIT_NOTE );
-            RetrieveDetailsL( iSelectedIndex, *text );
-            CleanupStack::PopAndDestroy( text );
-            
-            // if wait dialog is NULL, it is closed by CloseWaitDialogL method
-            // and not by user. so it is still on the screen
-            waitDlgOnScreen = iWaitDialog == NULL;
-            
-            // make sure we succeeded in detail retrieving. if not, return nothing.
-            if ( result->IsComplete() )
-                {
-                iResult->iSelectedContactItem = GetSelectedContactL();
-                }
-            }
-        else
-            {
-            iResult->iSelectedContactItem = GetSelectedContactL();
-            }
-        }
-    
-    if ( !waitDlgOnScreen )
-        {
-        // exit
-
-        AddOperation( EExit );
-        }
-
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::HandleContextExitL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::HandleContextExitL()
-    {
-    FUNC_LOG;
-
-    // set exit reason
-    if ( iResult->iExitReason == TResult::EExitUndefined )
-        {
-        if ( iExitCode != KErrNone )
-            {
-            iResult->iExitReason = TResult::EExitError;
-            }
-        else if ( iResult->iSelectedContactItem != NULL )
-            {
-            iResult->iExitReason = TResult::EExitContactSelected;
-            }
-        else
-            {
-            iResult->iExitReason = TResult::EExitUserClosed;
-            }
-        }
-
-    if ( iExitCode != KErrNone )
-        {
-        // show error note
-        CTextResolver* resolver = CTextResolver::NewLC( *( CCoeEnv::Static() ) );
-    
-        // on return, contains information about the loaded error text
-        TUint textFlags;
-        TInt textId;
-
-        const TDesC& errorText = resolver->ResolveErrorString( 
-            iExitCode,
-            textId,
-            textFlags,
-            CTextResolver::ECtxNoCtxNoSeparator );
-        
-        if ( textFlags & EErrorResBlankErrorFlag ||
-             textFlags & ETextResolverUnknownErrorFlag )
-            {
-            // show general error message, because there was no good error 
-            // message available
-            HBufC* text = StringLoader::LoadLC( R_QTN_RCL_ERROR_NOTE );
-            DisplayNoteDialogL( R_RCL_WARNING_NOTE, *text, ETrue );
-            CleanupStack::PopAndDestroy( text );
-            }
-        else
-            {
-            DisplayNoteDialogL( R_RCL_WARNING_NOTE, errorText, ETrue );
-            }
-        CleanupStack::PopAndDestroy( resolver );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::StartActiveWaitL
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::StartActiveWaitL( TWaitObjectIndex aIndex )
-    {
-    FUNC_LOG;
-
-    if ( aIndex != iWaitObjects.Count() )
-        {
-        // wait object index invalid, panic
-        PbkxRclPanic( EPbkxRclPanicGeneral );
-        }
-    
-    // starts new active wait and appends it in the list of wait objects
-    CActiveSchedulerWait* wait = new ( ELeave ) CActiveSchedulerWait();
-    CleanupStack::PushL( wait );
-    iWaitObjects.AppendL( wait );
-    CleanupStack::Pop( wait );
-    wait->Start();
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::StopActiveWait
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::StopActiveWait( TWaitObjectIndex aIndex )
-    {
-    FUNC_LOG;
-    if ( iWaitObjects.Count() != aIndex + 1 )
-        {
-        // invalid wait object count, panic
-        PbkxRclPanic( EPbkxRclPanicGeneral );
-        }
-    
-    // stops active wait of the most recently started wait
-    CActiveSchedulerWait* wait = iWaitObjects[aIndex];
-    iWaitObjects.Remove( aIndex );
-    wait->AsyncStop();
-    delete wait;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::SetState
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::SetState( TState aState )
-    {
-    FUNC_LOG;
-    iState |= aState;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::UnsetState
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::UnsetState( TState aState )
-    {
-    FUNC_LOG;
-    iState &= ~aState;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::IsStateSet
-// ---------------------------------------------------------------------------
-//
-TBool CPbkxRclServiceUiContextImpl::IsStateSet( TState aState )
-    {
-    FUNC_LOG;
-    return ( iState & aState ) != 0;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::ResetState
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::ResetState()
-    {
-    FUNC_LOG;
-    iState = 0;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::AddOperation
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::AddOperation( TOperation aOperation )
-    {
-    FUNC_LOG;
-    iOperations.Add( aOperation );
-    iEventScheduler->TriggerEvent();
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::HandleError
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::HandleError( TInt aError )
-    {
-    FUNC_LOG;
-    iExitCode = aError;
-    SetState( EReturnToCaller );
-    if ( IsStateSet( EInfoDlgOnTop ) )
-        {
-        AddOperation( ECloseResultInfoDlg );
-        AddOperation( ECloseSearchResultDlg );
-        }
-    else if ( IsStateSet( EResultDlgOnTop ) )
-        {
-        AddOperation( ECloseSearchResultDlg );
-        }
-    
-	// If dialog is NULL and state is EInitial & EReturnToCaller
-	// EExit operation is added in DialogDismissedL callback
-	if ( !iWaitDialog && IsStateSet( EInitial ) && IsStateSet( EReturnToCaller ) )
-        { 
-        return;
-        }
-	else 
-	    {
-	    AddOperation( EExit );
-	    }
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::Sort
-// ---------------------------------------------------------------------------
-//
-TInt CPbkxRclServiceUiContextImpl::Sort( 
-    const CContactCard& aFirst, 
-    const CContactCard& aSecond )
-    {
-    FUNC_LOG;
-    
-    TPtrC lastName1 = PbkxRclUtils::FieldText( &aFirst, KUidContactFieldFamilyName );
-    TPtrC lastName2 = PbkxRclUtils::FieldText( &aSecond, KUidContactFieldFamilyName );
-
-    TInt ret = 0;
-    if ( lastName1 < lastName2 )
-        {
-        ret = -1;
-        }
-    else if ( lastName1 > lastName2 )
-        {
-        ret = 1;
-        }
-    return ret;
-    }
-
-// ----------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::TimerCallBack
-// ----------------------------------------------------------------------------
-//
-TInt CPbkxRclServiceUiContextImpl::TimerCallBack(TAny* aAny)
-	{
-    FUNC_LOG;
-	CPbkxRclServiceUiContextImpl* self = static_cast<CPbkxRclServiceUiContextImpl*>( aAny );
-	self->TimeOut();
-	return KErrNone;
-	}
-
-// ----------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::TimeOut
-// ----------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::TimeOut()
-	{
-    FUNC_LOG;
-	iTimer->Cancel();
-	
-	if (iSession)
-		{
-		iSession->Cancel();
-		}
-	
-	if (IsStateSet( EInfoDlgOnTop ) || IsStateSet( EResultDlgOnTop ))
-		{
-		StopActiveWait( EContactRetrievalWait );
-		}
-	
-	TRAP_IGNORE( CloseWaitDialogL() );	
-	HandleError( KErrTimedOut );
-	}
-
-//////////////////////////////////////////////////////////////////////////////
-// TOperationQueue class definition
-//////////////////////////////////////////////////////////////////////////////
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::TOperationQueue::TOperationQueue
-// ---------------------------------------------------------------------------
-//
-CPbkxRclServiceUiContextImpl::TOperationQueue::TOperationQueue() : 
-    iCurrent( 0 ), iCount( 0 )
-    {
-    FUNC_LOG;
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::TOperationQueue::Add
-// ---------------------------------------------------------------------------
-//
-void CPbkxRclServiceUiContextImpl::TOperationQueue::Add( TOperation aOperation )
-    {
-    FUNC_LOG;
-    if ( iCount == KMaxOperations )
-        {
-        PbkxRclPanic( EPbkxRclPanicGeneral );
-        }
-    
-    TBool exists = EFalse;
-    for ( TInt i = iCurrent, count = 0; 
-          count < iCount; 
-          ( ++i ) % KMaxOperations, count++ )
-        {
-        if ( iOperations[i] == aOperation )
-            {
-            exists = ETrue;
-            break;
-            }
-        }
-
-    if ( !exists )
-        {
-        TInt newIndex = ( iCurrent + iCount ) % KMaxOperations;
-        iOperations[newIndex] = aOperation;
-        iCount++;
-        }
-    
-    }
-
-// ---------------------------------------------------------------------------
-// CPbkxRclServiceUiContextImpl::TOperationQueue::Pop
-// ---------------------------------------------------------------------------
-//
-CPbkxRclServiceUiContextImpl::TOperation 
-CPbkxRclServiceUiContextImpl::TOperationQueue::Pop()
-    {
-    if ( iCount > 0 )
-        {
-        TOperation op = iOperations[iCurrent];
-        iOperations[iCurrent] = ENoOperation;
-        iCount--;
-        
-        if ( iCount > 0 )
-            {
-            iCurrent = ( ++iCurrent ) % KMaxOperations;
-            }
-        else
-            {
-            iCurrent = 0;
-            }
-        return op;
-        }
-    else
-        {
-        return ENoOperation;
-        }
-    }
-
-TInt CPbkxRclServiceUiContextImpl::TOperationQueue::Count() const
-    {
-    FUNC_LOG;
-    return iCount;
-    }
-
-