emailuis/emailui/inc/FreestyleEmailUiContactHandler.h
branchRCL_3
changeset 64 3533d4323edc
child 73 c8382f7b54ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/inc/FreestyleEmailUiContactHandler.h	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,465 @@
+/*
+* Copyright (c) 2008 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:  Contact handler interface
+*
+*/
+
+
+#ifndef FREESTYLEEMAILUICONTACTHANDLER_H_
+#define FREESTYLEEMAILUICONTACTHANDLER_H_
+
+#include <e32base.h>
+#include <MVPbkSingleContactOperationObserver.h>
+#include <MVPbkContactStoreListObserver.h>
+#include <AiwCommon.h>
+
+// CCA Launcher view
+#include <mccaconnection.h>
+
+#include <cpbkxremotecontactlookupserviceuicontext.h>
+
+#include "FreestyleEmailUiCLSListsObserver.h"
+
+// Forward declarations
+
+class CFSMailBox;
+class RFs;
+class CFSEmailUiClsListsHandler;
+class CVPbkContactManager;
+class CFSEmailUiClsItem;
+class MVPbkContactOperationBase;
+class MVPbkStoreContact;
+class MFSEmailUiContactHandlerObserver;
+class MVPbkContactLinkArray;
+class CAiwServiceHandler;
+class CContactItem;
+class MPbkGlobalSetting;
+class CEikonEnv;
+
+/** Contact handler commands. */
+enum TContactHandlerCmd
+    {
+    EAddToContactL = 1,
+    EFindAndCallToContactByEmailL,
+    ECallToContact,
+    EShowContactDetailsL,
+    EGetAddressesFromPhonebook,
+    ESearchContacts,
+    ECreateMessage,
+    EIdle
+    };
+
+enum TContactUpdateType
+    {
+    EContactUpdateNumber = 1,
+    EContactUpdateEmail
+    };
+
+enum TContactHandlerState 
+	{
+	EContactHandlerIdle = 1,
+	EContactHandlerSearchMatches,
+	EContactHandlerAddToContacts,
+	EContactHandlerCallToContactByEmail,
+	EContactHandlerGetAddressesFromPhonebook,
+	EContactHandlerGetSmsAddressFromPhonebook,
+	EContactHandlerGetMmsAddressFromPhonebook,
+	EContactHandlerGetVoiceMsgAddressFromPhonebook,
+	EContactHandlerShowContactDetails,
+	EContactHandlerCreateMessage
+	};
+
+enum TContactHandlerRemoteLookupMode
+	{
+	EContactHandlerRemoteSelector = 1,
+	EContactHandlerRemoteNormal,
+	EContactHandlerRemoteQueryGiven
+	};
+
+enum TAddToContactsType
+	{
+	EContactHandlerCreateNewContact = 1,
+	EContactHandlerUpdateExisting
+	};
+
+class CFSEmailUiContactHandler: 
+	public CBase,
+	public MFSEmailUiClsListsObserver,
+	public MVPbkSingleContactOperationObserver,
+	public MVPbkContactStoreListObserver,
+	public MAiwNotifyCallback, 
+	public MCCAObserver
+
+{
+public:
+    static CFSEmailUiContactHandler* NewL( RFs& aSession );
+    static CFSEmailUiContactHandler* NewLC( RFs& aSession );
+    
+	~CFSEmailUiContactHandler();
+	
+	/**
+	 * Implements "Add to Contacts" funcionality. 
+	 * It will launch AIW service (phonebook2) to create those views  
+	 *
+	 * @param aDes = phonenumber/emailaddress to be added
+	 * @param aUpdatetype = EContactUpdateNumber/EContactUpdateEmail
+	 * @param aAddtoContactsType = ECreateNew/EUpdateExisting
+	 * @param aObserver, when AIW service is completed observer operationComplete( EAddToContactL, NULL ) is called
+	 * if there's a error operationError is called. If caller isn't interested of result, this can be left as NULL
+	 */
+	void AddToContactL( const TDesC& aDes, TContactUpdateType aUpdateType,
+						TAddToContactsType aAddtoContactsType,
+	                    MFSEmailUiContactHandlerObserver* aObserver = NULL );
+	/**
+	 * Query whether to create a "new contact" or "update existing"
+	 * @param TAddtoContactsType = ECreateNew/EUpdateExisting
+	 * @return: EFalse if user choosed "cancel" instead of choosing one option
+	 */
+    TBool AddtoContactsQueryL( TAddToContactsType& aType );
+    
+	/**
+	 * Implements "Calling to contact provided by email" funcionality. 
+	 * It will search for the Contact and then launch AIW call service.
+	 *
+	 * @param aEmailAddress = emailaddress of the contact
+	 * @param aCallToDefaultNumber = ETrue, call is made to default phonenumber. EFalse = User is queried of the number.
+	 * @param aObserver, when AIW service is completed observer operationComplete( EFindAndCallToContactByEmailL, NULL ) 
+	 * is called if there's a error operationError is called. If caller isn't interested of result, this can be left as NULL
+	 */	
+	void FindAndCallToContactByEmailL( const TDesC& aEmailAddress, 
+									   CFSMailBox* aMailBox,
+	                                   MFSEmailUiContactHandlerObserver* aObserver = NULL,
+	                                   TBool aCallToDefaultNumber = EFalse );
+	
+	/**
+	 * Implements "Sending message to contact provided by email" funcionality. 
+	 * It will search for the Contact and then launch create message dialog
+	 *
+	 * @param aEmailAddress = emailaddress of the contact
+	 * @param aCallToDefaultNumber = ETrue, call is made to default phonenumber. EFalse = User is queried of the number.
+	 * is called if there's a error operationError is called. If caller isn't interested of result, this can be left as NULL
+	 */	
+	void FindAndCreateMsgToContactByEmailL( const TDesC& aEmailAddress,
+											CFSMailBox* aMailBox );
+
+	
+	/**
+	 * Implements "Show Contact details" funcionality. 
+	 * It will search for the Contact and then launch AIW call service.
+	 *
+	 * @param aAddress = email address of the contact
+	 * @param TContactUpdateType = ETrue, call is made to default phonenumber. EFalse = User is queried of the number.
+	 * @param aObserver, when AIW service is completed observer operationComplete( EShowContactDetailsL, NULL ) 
+	 * is called if there's a error operationError is called. If caller isn't interested of result, this can be left as NULL
+	 */
+	void ShowContactDetailsL( const TDesC& aAddress, TContactUpdateType aType,
+	                          MFSEmailUiContactHandlerObserver* aObserver = NULL );
+	
+	/**
+	 * Implements "Call" funcionality synchronously
+	 * It launches either VoIP or Normal phone according to system setting
+	 *
+	 * @param aContactLink = Link for contact to be called for. If NULL aContactNumber is used
+	 * @param aContactNumber = Phonenumber of the contact, this is ignored if aContactLink
+	 * @param aVoipOverride = Force VoIP call 
+	 */
+	void MakeAiwCallL( MVPbkContactLink* aContactLink, 
+					   const TDesC& aContactNumber, 
+					   TBool aVoipOverride = EFalse );
+
+	/**
+	 * Search for contacts by PCS engine. This is asynchronous call, and results are in
+	 * ArrayUpdated( resultsArray )
+	 *
+	 * @param aText = new search text.
+	 * @param aClsListObserver = observer to collect results
+	 * @param aMailBox = current mailbox, needed to know which MRU list to use
+	 */
+	void SearchMatchesL( const TDesC& aText, MFSEmailUiContactHandlerObserver* aObserver,
+						 CFSMailBox* aMailBox, TInt aMode = -1 );
+	
+	/**
+	 * Reset the status of contact Handlers, cancel all active asynchronous calls. This should be called
+	 * at least when changing view.
+	 */
+	void Reset();
+	
+	/**
+	 * Check whether the language currently is use, is supported by PCS engine. This enables/disables
+	 * ShowContactDetailsL, FindAndCallToContactByEmailL, SearchMatchesL functions.
+	 *
+	 * @return ETrue = is supported  
+	 */
+	TBool IsLanguageSupportedL();
+	
+	/**
+	 * Launch remote contact lookup in selector mode, where user can select contact to be used
+	 * 	 
+	 * @return ETrue = Contact retrieved
+	 * @param aMailbox = from which mailbox do we search for.
+	 * @param aQueryString = search string
+	 * @param aDisplayName = function returns selected contact's display name
+	 * @param aEmailAddress = function returns selected contacts's email address
+	 */
+	TBool GetNameAndEmailFromRemoteLookupL( CFSMailBox& aMailBox, const TDesC& aQueryString,
+							  TDes& aDisplayname, TDes& aEmailAddress );
+
+	/**
+	 * Launch remote contact lookup in selector mode, where user can select contact to be used
+	 * 	 
+	 * @return HBufC* = Display name of the selected contact, NULL if no contact selected
+	 * @param aMailbox = from which mailbox do we search for.
+	 * @param aQuery = search string
+	 * @param aPhoneNumber = function returns selected contact's phonenumber, RBuf will be allocated 
+	 */
+	HBufC* GetNameAndNumberFromRemoteLookupL( CFSMailBox& aMailBox, const TDesC& aQuery, RBuf& aPhoneNumber );
+	
+	/**
+	 * Launch remote contact lookup for selected mailbox
+	 * 	 
+	 * @param aMailbox = from which mailbox do we search for.
+	 */
+	void LaunchRemoteLookupL( CFSMailBox& aMailBox );
+	
+	/**
+	 * Launch remote contact lookup for selected mailbox with given query
+	 * 	 
+	 * @param aMailbox = from which mailbox do we search for.
+	 * @param aQuery = search string to be used
+	 */
+	void LaunchRemoteLookupWithQueryL( CFSMailBox& aMailBox, const TDesC& aQuery );
+
+	/**
+	 * Compare emailAddress to last searched contact's emailaddress and return 
+	 * the display name if they match
+	 * 	 
+	 * @param aEmailAddress = email address to compare
+	 * @return HBufC* = Display name of the contact if addresses match,
+	 * otherwise NULL
+	 */
+	HBufC* GetLastSearchNameL( const TDesC& aEmailAddress );	
+	
+	CVPbkContactManager* GetContactManager();
+	
+	/**
+	 * Lauches multiple item fetch dialog through AIW launcher framework.
+	 * Results are returned to observer
+	 *
+	 * @param aObserver = observer to collect results
+	 */
+	void GetAddressesFromPhonebookL( MFSEmailUiContactHandlerObserver* aObserver );
+	
+    // <cmail> video call
+    /**
+     * Enables/disables video call.
+     *
+     * @param aState ETrue for 'enable', EFalse for 'disable'
+     */
+    void SetVideoCall( TBool aState );
+    // </cmail>
+
+// from base class MFSEmailUiClsListsObserver
+
+    void ArrayUpdatedL( const RPointerArray<CFSEmailUiClsItem>& aMatchingItems );	
+    void OperationErrorL( TInt aErrorCode );
+    
+// from base class MVPbkSingleContactOperationObserver
+
+    void VPbkSingleContactOperationCompleteL(
+    		    MVPbkContactOperationBase& aOperation,
+    		    MVPbkStoreContact* aContact );
+    
+    
+	void VPbkSingleContactOperationComplete(
+	    MVPbkContactOperationBase& aOperation,
+	    MVPbkStoreContact* aContact );
+	
+	void VPbkSingleContactOperationFailedL(
+		    MVPbkContactOperationBase& aOperation, TInt aError );
+	void VPbkSingleContactOperationFailed(
+	    MVPbkContactOperationBase& aOperation, TInt aError );
+
+// from base class MVPbkContactStoreListObserver
+
+     /**
+      * From MVPbkContactStoreListObserver  
+      * Called when the opening process is complete, ie. all stores have been reported
+      * either failed or successfully opened.
+      *
+      * @since S60 v3.2
+      */
+      void OpenComplete();  
+      
+     /**
+      * From MVPbkContactStoreListObserver  
+      * Called when a contact store is ready to use.
+      * @since S60 v3.2
+      */
+      void StoreReady(MVPbkContactStore& aContactStore);
+
+     /**
+      * From MVPbkContactStoreListObserver  
+      * Called when a contact store becomes unavailable.
+      * Client may inspect the reason of the unavailability and decide whether or not
+      * it will keep the store opened (ie. listen to the store events).
+      *
+      * @since S60 v3.2
+      *
+      * @param aContactStore The store that became unavailable.
+      * @param aReason The reason why the store is unavailable.
+      *                This is one of the system wide error codes.
+      */
+      void StoreUnavailable(MVPbkContactStore& aContactStore, TInt aReason);
+
+     /**
+      * From MVPbkContactStoreListObserver  
+      * Called when changes occur in the contact store.
+      * @see TVPbkContactStoreEvent
+      * @param aContactStore The store the event occurred in.
+      * @param aStoreEvent   Event that has occured.
+      */
+      void HandleStoreEventL(
+                MVPbkContactStore& aContactStore, 
+                TVPbkContactStoreEvent aStoreEvent);
+
+//from base class MAiwNotifyCallback
+	
+	TInt HandleNotifyL(
+	            TInt aCmdId,
+	            TInt aEventId,
+	            CAiwGenericParamList& aEventParamList,
+	            const CAiwGenericParamList& aInParamList);
+	
+	void ClearObservers();
+      
+// from MCCAObserver      
+    void CCASimpleNotifyL( TNotifyType aType, TInt aReason );
+      
+private:
+    
+    CFSEmailUiContactHandler( RFs& aSession );
+    
+    void ConstructL( RFs& aSession );
+    
+// <cmail> call observer's MFSEmailUiContactHandlerObserver::OperationErrorL( TContactHandlerCmd aCmd, TInt aError ) 
+    void ObserverOperationErrorL( TContactHandlerCmd aCmd, TInt aErrorCode );
+    
+
+private:
+    
+	TInt SelectBetweenCsAndVoip() const;
+    void HandleCallL( const RPointerArray<CFSEmailUiClsItem>& aMatchingItems );
+    
+	void CreateMessageL( const RPointerArray<CFSEmailUiClsItem>& aMatchingItems );
+	void SendMessageL( CAiwGenericParamList& aEventParamList, TInt aServiceType );
+ 	void GetSmsAddressFromPhonebookAndSendL( MVPbkContactLink* aContactLink );
+	void GetMmsAddressFromPhonebookAndSendL( MVPbkContactLink* aContactLink, TBool aIsVoiceMessage = EFalse );
+ 
+    TBool IsRemoteLookupSupported();
+    
+    void GetContactFieldsL( RArray<TInt>& aFieldIds, RPointerArray<HBufC>& aNumbers, 
+    					   MVPbkStoreContact* aContact );
+    
+    TPtrC GetContactTitle( MVPbkStoreContact* aContact );
+    
+    void ShowDetailsL( const RPointerArray<CFSEmailUiClsItem>& aMatchingItems );
+    
+    void FindContactLinkL( const TDesC& aDes );
+    
+    void FormatFieldIds();
+    void ResetFieldIds();
+
+    /*
+     * Launches remote lookup UI
+     * @param aQueryString Default query string in user input field
+     * @param aResult Structure containing exit reason and selected item
+     * @param aLookupMode The mode in which the lookup is performed.
+     */
+    void DoRemoteLookupL( CFSMailBox& aMailBox, const TDesC& aQueryString, 
+        CPbkxRemoteContactLookupServiceUiContext::TResult& aResult, 
+        CPbkxRemoteContactLookupServiceUiContext::TMode aLookupMode =
+            CPbkxRemoteContactLookupServiceUiContext::EModeContactSelector );
+
+    // Gets the name and email address from given contact item
+    void GetNameAndEmail( TDes& aName, TDes& aEmail, CContactItem& aItem ) const;
+    
+    // Gets the phone number from given contact item
+    HBufC* GetPhoneNumberAndNameL( RBuf& aPhoneNumber, CContactItem& aItem ) const;
+
+    // Displays call query
+    TBool CallQueryL( const TDesC& aDisplayName );
+
+    // Creates copy of given CLS items and appends them to given array.
+    void CopyItemsL( const RPointerArray<CFSEmailUiClsItem>& aItems,
+        RPointerArray<CFSEmailUiClsItem>& aArray );
+
+    // Sets the address used for previous contact search
+    void SetPreviousEmailAddressL( const TDesC& aAddress );
+    
+    void RemoteContactQueryL();
+    
+    TContactHandlerCmd CurrentCommand();
+
+private: // data
+    
+    CFSEmailUiClsListsHandler* iClsListHandler;
+    TContactHandlerState iState;
+    CFSEmailUiClsItem* iSearchMatch;
+
+    MFSEmailUiContactHandlerObserver* iHandlerObserver;
+    HBufC* iPreviousEmailAddress;
+    CFSEmailUiClsItem* iLastClsItem;
+    TBool iOpenComplete;
+    TBool iStoreReady;
+    
+    CFSMailBox* iMailBox;
+    TBool iUseSenderText;
+    
+    
+    CVPbkContactManager* iContactManager;
+    
+    MVPbkContactOperationBase* iLinkOperation;
+    MVPbkContactOperationBase* iLinkOperationFetch;
+    const MVPbkContactLink* iCurrentLink;
+    RPointerArray<CFSEmailUiClsItem> iContactObjects;
+    
+    MVPbkContactLinkArray* iLinksSet;
+            
+    CAiwServiceHandler* iServiceHandler;
+    
+    RArray<TInt> iLastnameFields;
+    RArray<TInt> iFirstnameFields;
+    RArray<TInt> iEmailFields;
+    RArray<TInt> iPhoneNumberFields;
+    
+    MVPbkStoreContact* iContactForMsgCreation;
+    TContactHandlerState iMsgCreationHelperState;
+    
+    /// Own: used to query preferred telephony information
+    MPbkGlobalSetting* iPersistentSetting;
+    RFs& iFs;
+    
+    /// Flag for indicating that caching error was received  
+    TBool iCachingInProgressError;
+    
+    // Flag for making video call
+    TBool iVideoCall;
+
+    // connection to CCMA launcher    
+    MCCAConnection* iConnection;
+
+    CEikonEnv* iEnv;
+};
+
+#endif /*FREESTYLEEMAILUICONTACTHANDLER_H_*/