emailcontacts/remotecontactlookup/engine/inc/cpbkxrclserviceuicontextimpl.h
changeset 0 8466d47a6819
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailcontacts/remotecontactlookup/engine/inc/cpbkxrclserviceuicontextimpl.h	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,604 @@
+/*
+* 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:  Definition of the class CPbkxRclServiceUiContext
+*
+*/
+
+#ifndef CPBKXRCLSERVICEUICONTEXTIMPL_H
+#define CPBKXRCLSERVICEUICONTEXTIMPL_H
+
+#include "cpbkxremotecontactlookupserviceuicontext.h"
+#include "tpbkxremotecontactlookupprotocolaccountid.h"
+#include "mpbkxremotecontactlookupprotocolsessionobserver.h"
+#include "mpbkxrclcontactretrieval.h"
+#include "cpbkxrcleventscheduler.h"
+
+#include <AknWaitDialog.h>
+
+class CPbkxRclSearchResultDlg;
+class CPbkxRclResultInfoDlg;
+class CPbkxRemoteContactLookupProtocolSession;
+class CCoeEnv;
+class CPbkContactEngine;
+class CPbkxRemoteContactLookupProtocolAdapter;
+class CPbkxRclProtocolEnvImpl;
+class CPbkxRemoteContactLookupProtocolAccount;
+class CPbkxRclActionServiceWrapper;
+
+/**
+* Implementation class of service ui context.
+*
+* This class implements the RCL search logic and UI flow.
+*
+* @lib pbkxrclengine.lib
+* @since S60 3.1
+*/
+
+class CPbkxRclServiceUiContextImpl : 
+    public CPbkxRemoteContactLookupServiceUiContext,
+    public MPbkxRemoteContactLookupProtocolSessionObserver,
+    public MPbkxRclContactRetrieval,
+    public MPbkxRclEventHandler,
+    public MEikCommandObserver,
+    public MProgressDialogCallback
+    {
+
+public: // constructors and destructor
+
+  /**
+    * Constructs new object.
+    *
+    * @param aId Acccount id.
+    * @param aMode Mode in which context operates.
+    * @return Created object.
+    */
+
+    static CPbkxRclServiceUiContextImpl* NewL(
+        TPbkxRemoteContactLookupProtocolAccountId aId,
+        TMode aMode );
+
+  /**
+    * Constructs new object.
+    *
+    * Constructed object is leaved in cleanup stack.
+    *
+    * @param aId Acccount id.
+    * @param aMode Mode in which context operates.
+    * @return Created object.
+    */
+    static CPbkxRclServiceUiContextImpl* NewLC(
+        TPbkxRemoteContactLookupProtocolAccountId aId,
+        TMode aMode );
+ 
+
+  /**
+    * Destructor.
+    */
+    virtual ~CPbkxRclServiceUiContextImpl();
+
+
+public: // methods from CPbkxRemoteContactLookupServiceUiContext
+
+   /**
+     * Execute UI flow.
+     *
+     * @param aQueryText loose query text     
+     * @param aResult remote lookup results
+     */
+    virtual void ExecuteL( const TDesC& aQueryText, TResult& aResult );
+
+
+public: // from MPbkxRemoteContactLookupProtocolSessionObserver
+
+    /**
+     * Notifies that the loose search has been completed.
+     * 
+     * @param aStatus error code that tells how search went
+     * @param aResults search results, ownership is moved to the caller of the
+     * loose search.
+     */
+
+    virtual void LooseSearchCompleted( 
+        TInt aStatus, 
+        RPointerArray<CPbkxRemoteContactLookupProtocolResult>& aResults );
+  
+    /**
+     * Notifies that the contact fields retrieval has been completed.
+     * 
+     * @param aStatus error code that tells how retrieval went
+     */
+
+    virtual void ContactFieldsRetrievalCompleted( TInt aStatus );
+
+public: // from MPbkxRclContactRetrieval
+
+    /**
+    * Retrieves details of the contact with given index.
+    *
+    * @param aContactIndex Index of the contact for which details are retrieved.
+    * @param aWaitNoteText Text shown in wait note.
+    * @return ContactCard with details retrieved or NULL. NULL is returned
+    *         when either contact retrieval failed or user cancelled
+    *         contact retrieval.
+    */
+
+    virtual CContactCard* RetrieveDetailsL( 
+        TInt aContactIndex, 
+        const TDesC& aWaitNoteText );
+
+    /**
+    * Returns the number of contacts.
+    *
+    * @return The number of contacts.
+    */
+
+    virtual TInt ContactCount() const;
+
+    /**
+    * Sets the index of currently selected contact.
+    *
+    * @param aIndex Index of the currently selected contact.
+    */
+
+    virtual void SetSelectedContactL( TInt aIndex );
+
+public: // from MPbkxRclEventHandler
+
+    /**
+    * Callback method from event scheduler.
+    *
+    * Operation is executed each time this method is called.
+    */
+
+    virtual void EventTriggered();
+
+public: // methods from MEikCommandObserver
+
+    /**
+    * Processes command from search result view or result information view.
+    *
+    * @param aCommand Command id.
+    */
+
+    virtual void ProcessCommandL( TInt aCommandId );
+
+public: // from MProgressDialogCallback
+
+    /**
+    * This method is called when wait note closed by either user pressing
+    * cancel or dialog closed by code.
+    */
+    virtual void DialogDismissedL( TInt aButtonId );
+
+private: // enumerations used internally
+
+
+    // Possible operations for context.
+
+    enum TOperation
+        {
+        ENoOperation,              // No operation
+        EOpenSearchResultDlg,      // Opens search result dialog
+        EOpenResultInfoDlg,        // Opens result info dialog
+        ECloseSearchResultDlg,     // Closes search result dialog
+        ECloseResultInfoDlg,       // Closes result info dialog
+        EOpenSearchQueryDefault,   // Opens default search query
+        EOpenSearchQueryEmpty,     // Opens empty search query
+        EExecuteSearchWithNoQuery, // Executes search without prompting query
+        EExit                      // Stop context execution
+        };
+  
+    // Possible state values for context.
+
+    enum TState
+        {
+        EInitial = 0x1,          // Initial state
+        EResultDlgOnTop = 0x2,   // Result dialog topmost
+        EInfoDlgOnTop = 0x4,     // Info dialog topmost
+        EResultSelected = 0x8,   // Result is selected
+        EReturnToCaller = 0x10   // Return to the calling application    
+        };
+
+
+    // Wait object indexes.
+
+    enum TWaitObjectIndex
+        {
+        EMainWait = 0,              // Main wait loop.
+        EContactRetrievalWait = 1   // Contact retrieval wait loop
+        };
+
+private: // methods used internally
+
+    /**
+    * Executes search.
+    *
+    * @param aShowQueryDialog Flag indicating whether search query dialog is 
+    *        shown.
+    * @param aQueryText Default value for query text.
+    */
+
+    void ExecuteSearchL( TBool aShowQueryDialog, const TDesC& aQueryText );
+
+    /**
+    * Displays wait dialog.
+    *
+    * @param aDialogResourceId Dialog resource id.
+    * @param aText Text shown in wait dialog.
+    */
+
+    void DisplayWaitDialogL( TInt aDialogResourceId, const TDesC& aText );
+
+    /**
+    * Displays note dialog.
+    *
+    * @param aDialogResourceId Dialog resource id.
+    * @param aText Text shown in dialog.
+    * @param aTimeout Flag indicating whether note has timeout.
+    * @return Possible return value from note.
+    */
+
+    TBool DisplayNoteDialogL( 
+        TInt aDialogResourceId, 
+        const TDesC& aText,
+        TBool aTimeout = EFalse );
+
+    /**
+    * Displays query dialog.
+    *
+    * @param aDialogResourceId Dialog resource id.
+    * @param aText Text shown in dialog.
+    * @return Possible return value from note.
+    */
+    //Fix for: EASV-7KFGG3
+    TBool DisplayQueryDialogL(        
+        TInt aDialogResourceId, 
+        const TDesC& aText );
+
+    /**
+    * Closes wait dialog.
+    */
+
+    void CloseWaitDialogL();
+
+    /**
+    * Displays search result dialog.
+    */
+
+    void DisplaySearchResultDialogL();
+
+    /**
+    * Displays result info dialog.
+    */
+
+    void DisplayResultInfoDialogL();
+
+
+    /**
+    * Creates contact card array.
+    *
+    * Contact items are casted to contact cards.
+    */
+
+    void CreateContactCardArray();
+
+    /**
+    * Does actions after loose search has been completed.
+    * 
+    * @param aStatus Status returned from adapter.
+    * @param aResults Search results.
+    */
+
+    void DoLooseSearchCompletedL(
+        TInt aStatus,
+        RPointerArray<CPbkxRemoteContactLookupProtocolResult>& aResults );
+
+
+    /**
+    * Does actions after contact field retrieval has been completed.
+    *
+    * @param aStatus Status received from adapter.
+    */
+
+    void DoContactFieldsRetrievalCompletedL( TInt aStatus );
+
+
+    /**
+    * Executes operation.
+    */
+
+    void DoHandleOperationL();
+
+  
+
+    /**
+    * Handles actions after search result dialog is closed based
+    * on state of the context.
+    */
+
+    void HandleSearchResultDialogExitL();
+
+
+    /**
+    * This method is called when we are about to exit the context.
+    *
+    * Exit reason is set and possible error note is shown.
+    */
+
+    void HandleContextExitL();
+
+
+    /**
+    * Creates new contact item of the selected contact item.
+    *
+    * Ownership is transferred.
+    *
+    * @return Selected contact item.
+    */
+
+    CContactItem* GetSelectedContactL();
+
+
+    /**
+    * Searches for a result which corresponding contact item has given index.
+    *
+    * This method is needed because contact items are sorted and they are
+    * in different order as results. So we must find a result which contains
+    * the contact item with given index.
+    *
+    * Ownership is not transferred.
+    *
+    * @param aIndex Index of the contact item which result is searched.
+    * @return Protocol result.
+    */
+
+    CPbkxRemoteContactLookupProtocolResult* GetResultByIndex( TInt aIndex );
+
+    /**
+    * Starts active wait.
+    *
+    * Execution is halted until corresponding stop is called.
+    *
+    * @param aIndex Index of the wait object to be started.
+    */
+
+    void StartActiveWaitL( TWaitObjectIndex aIndex );
+    
+
+    /**
+    * Stops active wait with given index.
+    *
+    * @param aIndex Index of the wait object to be stopped.
+    */
+
+    void StopActiveWait( TWaitObjectIndex aIndex );
+
+
+    /**
+    * Changes the state of the context.
+    *
+    * @param aState The state in which context is set.
+    */
+
+    void SetState( TState aState );
+  
+
+    /**
+    * Unsets state.
+    *
+    * @param aState State to be unset.
+    */
+
+    void UnsetState( TState aState );
+
+
+    /**
+    * Returns ETrue if given state is set.
+    *
+    * @param aState State which status is checked.
+    * @return ETrue if context is in given state, EFalse otherwise.
+    */
+
+    TBool IsStateSet( TState aState );
+
+
+    /**
+    * Resets all state flags of context.
+    */
+
+    void ResetState();
+
+    /**
+    * Adds new operation to be executed.
+    *
+    * @param aOperation Operation to be added.
+    */
+
+    void AddOperation( TOperation aOperation );
+
+
+    /**
+    * Handles fatal error based on current state.
+    *
+    * @param aError Occurred error.
+    */
+
+    void HandleError( TInt aError );
+
+
+    /**
+    * Sorts contacts based on last name.
+    */
+
+    static TInt Sort( const CContactCard& aFirst, const CContactCard& aSecond );
+    
+	/**
+	* Static callback for CPeriodic timer
+	*/
+    static TInt TimerCallBack(TAny* aAny);
+    
+    /**
+	* This method is called in TimerCallBack() when time is out
+	*/
+    void TimeOut();
+
+private: // constructors
+
+    /**
+    * Constructors.
+    *
+    * @param aId Protocol account id.
+    * @param aMode Mode.
+    */
+
+    CPbkxRclServiceUiContextImpl( 
+        TPbkxRemoteContactLookupProtocolAccountId aId,
+        TMode aMode );
+
+    /**
+    * Second-phase constructor.
+    */
+
+    void ConstructL();
+
+private: // data structure used internally
+
+    class TOperationQueue
+        {
+    public: // constructor
+
+        /**
+        * Constructor.
+        */
+
+        TOperationQueue();
+
+    public: // new methods
+
+        /**
+        * Adds new operation to queue.
+        *
+        * @param aOperation Operation to be added.
+        */
+
+        void Add( TOperation aOperation );
+
+        /**
+        * Pops operation to be executed from the queue.
+        *
+        * @return Operation to be executed.
+        */
+
+        TOperation Pop();
+
+
+        /**
+        * Returns number of the operations in the queue.
+        */
+
+        TInt Count() const;
+
+    private: // data
+        
+        // Maximum number of operations.
+        static const TInt KMaxOperations = 10;
+
+        // Current operation index.
+        TInt iCurrent;
+
+        // Count of operations.
+        TInt iCount;
+
+        // Fixed size operation array.
+        TOperation iOperations[KMaxOperations];
+        };
+
+
+private: // data
+
+    // Account id.
+    TPbkxRemoteContactLookupProtocolAccountId iAccountId;
+
+    // State in which context is in.
+    TInt iState;
+
+    // Resource file offset.
+    TInt iResourceFileOffset;
+
+    // Original query criteria given to context. Owned.
+    RBuf iQueryCriteria;
+
+    // Query text given to execute. Owned.
+    RBuf iQueryText;
+
+    // Search mode.
+    TMode iMode;
+
+    // Selected contact index.
+    TInt iSelectedIndex;
+
+    // For waiting asynchronous operations to finish. Owned.
+    RPointerArray<CActiveSchedulerWait> iWaitObjects;
+
+    // Wait dialog. Owned.
+    CAknWaitDialog* iWaitDialog;
+
+    // Search result dialog. Owned.
+    CPbkxRclSearchResultDlg* iSearchResultDialog;
+
+    // Result information dialog. Owned.
+    CPbkxRclResultInfoDlg* iResultInfoDialog;
+
+    // Remote contact query results. Owned.
+    RPointerArray<CPbkxRemoteContactLookupProtocolResult> iSearchResults;
+
+    // Contact cards from the results. Not owned.
+    RPointerArray<CContactCard> iContactCards;
+
+    // Adapter used in searches. Owned.
+    CPbkxRemoteContactLookupProtocolAdapter* iAdapter;
+
+    // Session used to execute remote searches. Owned.
+    CPbkxRemoteContactLookupProtocolSession* iSession;
+
+    // Protocol environment given to adapter. Owned.
+    CPbkxRclProtocolEnvImpl* iEnvImpl;
+
+    // Account which is used. Owned.
+    CPbkxRemoteContactLookupProtocolAccount* iAccount;
+
+    // Search result. Not owned.
+    TResult* iResult;
+
+    // Contact engine used to help create phone book contact items. Owned.
+    CPbkContactEngine* iContactEngine;
+
+    // Action service wrapper used by search result dialog and
+    // result information dialog. Owned.
+    CPbkxRclActionServiceWrapper* iActionServiceWrapper;
+
+    // For generating timed events. Owned.
+    CPbkxRclEventScheduler* iEventScheduler;
+
+    // Operation queue.
+    TOperationQueue iOperations;
+
+    // Context exit code. If something goes wrong, this code is set.
+    TInt iExitCode;
+
+    // Timer for generating time out event 
+    CPeriodic* iTimer;
+    };
+
+#endif