diff -r 000000000000 -r 8466d47a6819 emailcontacts/remotecontactlookup/engine/inc/cpbkxrclserviceuicontextimpl.h --- /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 + +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& 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& 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 iWaitObjects; + + // Wait dialog. Owned. + CAknWaitDialog* iWaitDialog; + + // Search result dialog. Owned. + CPbkxRclSearchResultDlg* iSearchResultDialog; + + // Result information dialog. Owned. + CPbkxRclResultInfoDlg* iResultInfoDialog; + + // Remote contact query results. Owned. + RPointerArray iSearchResults; + + // Contact cards from the results. Not owned. + RPointerArray 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