diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/inc/FreestyleEmailUiContactHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/inc/FreestyleEmailUiContactHandler.h Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,451 @@ +/* +* 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 +#include +#include +#include +// +#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; + +/** 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: + 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 ); + + /** + * 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 ); + + // video call + /** + * Enables/disables video call. + * + * @param aState ETrue for 'enable', EFalse for 'disable' + */ + void SetVideoCall( TBool aState ); + // + +// from base class MFSEmailUiClsListsObserver + + void ArrayUpdatedL( const RPointerArray& 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(); + +private: + + CFSEmailUiContactHandler( RFs& aSession ); + + void ConstructL( RFs& aSession ); + +private: + + TInt SelectBetweenCsAndVoip() const; + void HandleCallL( const RPointerArray& aMatchingItems ); + + void CreateMessageL( const RPointerArray& aMatchingItems ); + void SendMessageL( CAiwGenericParamList& aEventParamList, TInt aServiceType ); + void GetSmsAddressFromPhonebookAndSendL( MVPbkContactLink* aContactLink ); + void GetMmsAddressFromPhonebookAndSendL( MVPbkContactLink* aContactLink, TBool aIsVoiceMessage = EFalse ); + + TBool IsRemoteLookupSupported(); + + void GetContactFieldsL( RArray& aFieldIds, RPointerArray& aNumbers, + MVPbkStoreContact* aContact ); + + TPtrC GetContactTitle( MVPbkStoreContact* aContact ); + + void ShowDetailsL( const RPointerArray& aMatchingItems ); + + void FindContactLinkL( const TDesC& aDes ); + + void FormatFieldIds(); + void ResetFieldIds(); + + /* + * LaunchRemoteLookupL + * Launches remote lookup UI + * @param aQueryString Default query string in user input field + * @param aResult Structure containing exit reason and selected item + */ + void DoRemoteLookupL( CFSMailBox& aMailBox, const TDesC& aQueryString, + CPbkxRemoteContactLookupServiceUiContext::TResult& aResult, + CPbkxRemoteContactLookupServiceUiContext::TMode aContext = + 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& aItems, + RPointerArray& 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 iContactObjects; + + MVPbkContactLinkArray* iLinksSet; + + CAiwServiceHandler* iServiceHandler; + + RArray iLastnameFields; + RArray iFirstnameFields; + RArray iEmailFields; + RArray 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; + + // video call + // Flag for making video call + TBool iVideoCall; + // +}; + +#endif /*FREESTYLEEMAILUICONTACTHANDLER_H_*/