diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpstengine/inc/cvimpstenginepresencesubservice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstengine/inc/cvimpstenginepresencesubservice.h Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,582 @@ +/* +* 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: Class handling connection to precense framework +* +*/ + + +#ifndef CVIMPSTENGINEPRESENCESUBSERVICE_H +#define CVIMPSTENGINEPRESENCESUBSERVICE_H + +// INCLUDES +#include +#include // handling the presence cache events +#include // buddy info class +#include //Presence info test + +#include "mvimpstenginesubservice.h" +#include "mvimpstenginepresencesubservice.h" +#include "mvimpstenginecchhandlerobserver.h" +#include "mvimpstenginesessioncntxtobserver.h" +#include "tvimpstenums.h" +#include "cvimpstengineimagehandler.h" +//FORWARD DECLARATIONS +class CVIMPSTEngineServiceTableFetcher; +class CVIMPSTEngineCchHandler; +class CVIMPSTEngineSessionCntxtObserver; +class MPresenceCacheReader2; +class CIMCacheFactory; +class MIMCacheUpdater; +class MPresentityGroupContentEvent; +class CVIMPSTBlockedListManager; +class MVIMPSTEngineServiceConnectionEventObserver; + +// CLASS DECLARATION +/** + * Presence sub service + * This class implements the presence subservice + * The problem in VOIP case would be that this "sip" must be hardcoded. Can this be avoided + * + * + * The Presence Information can be fetched either thro PresenceCache or + * thro XIMP's MPresentityPresenceEvent. So somehow we should be able to differentiate + * which service uses PresenceCache or XIMP's MPresentityPresenceEvent during the creation of this object + * One of the proposal could be is to use the CCH, if it could provide us this information or SP Settings + * + * All the Block/Friend Request/Presence information of a contact should be passed + * to the VIMPSTStorage which will update the list on the UI. + * + */ + + +NONSHARABLE_CLASS( CVIMPSTEnginePresenceSubService ): public CBase, + public MVIMPSTEnginePresenceSubService, + public MPresenceCacheReadHandler2, + public MVIMPSTEngineCchHandlerObserver, + public MVIMPSTEngineSessionCntxtObserver + { + //for testcases + friend class T_VimpstEnginePresenceSubService; + + public: + + /** + * Two-phased constructor. + * + * @since s60 5.0 + * @param aServiceId, service id + * @param aCchHandler, reference to cchhandler. + * @param aTableFetcher, reference to settingstable. + * @param aXimpEventObserver, reference to ximpevent observer. + * @param aServiceStateListener, reference to servicestatelistener. + */ + static CVIMPSTEnginePresenceSubService* NewL( TUint32 aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + CVIMPSTEngineSessionCntxtObserver& aXimpEventObserver, + MVIMPSTEngineServiceConnectionEventObserver& aObserver); + + /** + * Two-phased constructor. + * + * @since s60 5.0 + * @param aServiceId, service id + * @param aCchHandler, reference to cchhandler. + * @param aTableFetcher, reference to settingstable. + * @param aXimpEventObserver, reference to ximpevent observer. + * @param aServiceStateListener, reference to servicestatelistener. + */ + static CVIMPSTEnginePresenceSubService* NewLC(TUint32 aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + CVIMPSTEngineSessionCntxtObserver& aXimpEventObserver, + MVIMPSTEngineServiceConnectionEventObserver& aObserver); + + /** + * Standard C++ destructor + */ + ~CVIMPSTEnginePresenceSubService(); + + public: //From MVIMPSTSubService + + /** + * @return TVIMPSTRegistrationState Service State of this service + */ + TVIMPSTEnums::TVIMPSTRegistrationState SubServiceState() const; + + + TVIMPSTEnums::SubServiceType Type() const; + + + /** + * @see MVIMPSTSubService + */ + TBool Enabled(); + + /** + * Set the blocked list manager. + @param aBlockedListMgr blocked list instance pointer. + */ + void SetBlockedListManager(CVIMPSTBlockedListManager* aBlockedListMgr); + + //Reset the blocked list to zero blocked contact + void ResetBlockedListManagerL(); + public: //From MVIMPSTEnginePresenceSubService + + /** + * @see MVIMPSTEnginePresenceSubService + */ + void RegisterPresenceEventObserverL( + MVIMPSTEnginePresenceSubServiceEventObserver* aObserver); + + /** + * @see MVIMPSTEnginePresenceSubService + */ + void UnRegisterPresenceEventObserver( + MVIMPSTEnginePresenceSubServiceEventObserver* aObserver); + + /** + * Subsribes presence of a single contact + * Can be done for the contacts who are already subscribed(Required atleast in XMPP Case) + * This function can be used on FriendRequests also wherein it performs 2 operation + * 1. Accepts the invitation if Friend Request is Pending(GrantPresenceForPresentityL) + * 2. Subscribes for the presence either to PresenceCache + * or XIMP (MPresentityPresenceEvent) + * + * + * @since S60 5.0 + * @param aUriOfTheContact, Presence URI to be subscribed + */ + void SubscribePresenceOfSingleContactL( const TDesC& aUriOfTheContact ); + + + /** + * Unsubsribes presence of a single contact + * Used for those contact whose presence has been subscribed + * Can be used for Friend Requests also + * 1. Denies the invitation for the contact (WithdrawPresenceGrantFromPresentityL) + * 2. Sends a unsubscribe to PresenceCache + * or XIMP (UnsubscribePresentityPresenceL) + * + * @since S60 5.0 + * @param aUriOfTheContact, Presence URI to be subscribed + */ + void UnSubscribePresenceOfSingleContactL( const TDesC& aUriOfTheContact ); + + /** + * Fetches presence from presencecache. + * + * @since 5.0 + **/ + TInt FetchPresenceFromCache(); + + /** + * Unsubscribes ximp group contents. + * + * Buddy list and authorization lists are always unsubscibed. + * Block list is unsubscribed if it is supported. + * + * @since S60 5.0 + * @param None + * @leave Standard Symbian error codes. + * @return None + */ + void UnsubscribeListsL(); + + /** + * Requests the XIMPFw to subscribe for presence + * grant request list subscription. + */ + void SubscribeForAuthorizationL(); + + /** + * sends PresenceGrantForPresentity response to server + * @param aContactId, id of the requesting party.. + * @param aResponse , Etrue if accpeted else rejected. + * @return TInt error if any + */ + TInt SendPresenceGrantPresentityL( const TDesC& aContactId , TBool aResponse ); + + /** + * IsChangeOwnStatusSupported by the protocol + * + * @since S60 5.0 + * @return TBool ETrue if supported else EFalse. + */ + TBool IsChangeOwnStatusSupported() ; + + /** + * IsStatusMsgSupported by the protocol + * + * @since S60 5.0 + * @return TBool ETrue if supported else EFalse. + */ + TBool IsStatusMsgSupported(); + + /** + * IsAvatarSupported by the protocol + * + * @since S60 5.0 + * @return TBool ETrue if supported else EFalse. + */ + TBool IsAvatarSupported() ; + + /** + * SetAvatarSupported by the protocol + * + * @since S60 5.0 + * @param aSupported, TBool ETrue if supported else EFalse. + */ + void SetAvatarSupported(TBool aSupported ) ; + + + /** + * PublishOwnPresenceL + * to update the ownstatus to server. + * and publishes the own status. + * + * @param aStatus ,status to be updated to the server. + * @param aValue , text for the status message + * @param aFilename , avatar file name + * @param aMimetype , a mime type + * @param aIsAvatar , a avatar field included + * @return TInt error if any + */ + TInt PublishOwnPresenceL(TVIMPSTEnums::TOnlineStatus aStatus, + const TDesC& aValue, + const TDesC& aFilename = KNullDesC, + const TDesC8& aMimetype = KNullDesC8, + TBool aIsAvatar = EFalse ); + + + /** + * Removes URI from block list + * + * @since S60 5.0 + * @param aUriOfTheContact, URI to be removed + * @return error. + */ + TInt RemoveFromBlockListL( const TDesC& aUriOfTheContact ); + + /** + * Adds URI to block list + * + * @since S60 5.0 + * @param aContactId, URI to be added + * @return error. + */ + TInt AddToBlockListL( const TDesC& aContactId ); + + /** + * Get list of blocked contact. + */ + RPointerArray* GetBlockedList(); + + /** + * fetch blocked list from server to get the freshed blocked list. + */ + void FetchBlockedListFromServerL(MVIMPSTEngineBlockedListFetchEventObserver* aOb); + + /** + * function called from the engine once contact fetching completes + */ + void UpdatePresenceStateL(); + + /** + * Fetches the presence of singlecontact form presence cache + * @param aContact, user id of the ocntact who's presence + * needs to eb fetched. + */ + void FetchPresenceOfSingleContactL(const TDesC& aContact); + + + + private: // prescachereadhandler + + /** + * Handler for AllBuddiesPresenceInService method of MPresenceCacheReader. + * + * @param aErrorCode + * @param aPresenceBuddyInfoList presence infos for all buddies requested. + * Ownership of elements to callee. Can be empty if not found. + */ + void HandlePresenceReadL(TInt aErrorCode, + RPointerArray& aPresenceBuddyInfoList) ; + + /** + * Handler for Buddy presence change notifications. + * + * @param aErrorCode + * @param aPresenceBuddyInfo presence info for buddy. + * Ownership to callee. Can be NULL if aErrorCode exist. + */ + void HandlePresenceNotificationL(TInt aErrorCode, + MPresenceBuddyInfo2* aPresenceBuddyInfo); + + + private: // From MVIMPSTEngineCchHandlerObserver + + /** + * From MVIMPSTEngineCchHandlerObserver + * Observer callback for CCH event + * + * @param aServiceId, service id + * @param aState, service state + * @param aServiceError, error + * @since S60 5.0 + */ + void CchEventOccuredL( + TUint aServiceId, + TCCHSubserviceState aState, + TInt aServiceError ); + /** + * Handles any error that occured during login. + + * @since S60 5.0 + * @param aServiceError, error + */ + void DoHandleCchErrorL( TInt aServiceError ); + + public: + /** + * Observer Event for forwarding the ximp events. + * @param aContext - ximpfw context + * @param aEvent - ximpfw event + */ + void HandleSessionContextEventL( const MXIMPContext& aContext, + const MXIMPBase& aEvent, + TXimpOperation aXimpOperation = EVIMPSTXimpOperationNoOperation); + + private: + + /** + * Resolves service state for given service id. + * + * @since S60 5.0 + * @param aState, state of the subservice + * @param aServiceError, service error is stored here + * @return TVIMPSTRegistrationState, + * service state to use + */ + TVIMPSTEnums::TVIMPSTRegistrationState ResolveServiceStateL( TCCHSubserviceState aState, + TInt aServiceError ); + + /** + * Gets a list of all presence subscribtions + * + * @since S60 5.0 + */ + void RetrieveSubscribedListL(); + + /** + * Handles presentity group context events. + * + * @since S60 5.0 + * @param aContext, presence context + * @param aEvent, presence event + */ + void DoHandlePresentityGroupContentEventL( + const MXIMPContext& aContext, + const MXIMPBase& aEvent ); + + /** + * Handles presentity grant request list events. + * + * @since S60 5.0 + * @param aContext, presence context + * @param aEvent, presence event + */ + void DoHandlePresenceGrantRequestListEventL( + const MXIMPContext& aContext, + const MXIMPBase& aEvent ); + + /** + * Handles presentity block list events. + * + * @since S60 5.0 + * @param aContext, presence context + * @param aEvent, presence event + */ + void DoHandlePresenceBlockListEventL( + const MXIMPContext& aContext, + const MXIMPBase& aEvent ); + + /** + * Handles completed ximp event. + * + * @since S60 5.0 + * @param aType, completed event. + * @param aCompleteCode, error code of complete + * @param aEvent, MXIMBase for the clients to use information + */ + void HandleXimpRequestCompleteL( TXimpOperation aType, + TInt aCompleteCode, + const MXIMPBase& aEvent); + + /** + * Handles completed list/bind/unbind events. + * + * @since S60 5.0 + * @param aType, completed event. + * @param aCompleteCode, error code of complete + * @param aEvent, MXIMBase for the clients to use information + */ + void HandleListEventCompleteL(TXimpOperation aType, + TInt aCompleteCode, + const MXIMPBase& aEvent ); + /** + * ConvertPresenceStatus + * @param aStatus presence status to be converted + * @return TAvailabilityValues + */ + NPresenceInfo::TAvailabilityValues ConvertPresenceStatus(TVIMPSTEnums::TOnlineStatus aStatus); + + + /** + * Stores all the contact into virtual store + * need to chec how thi has to be handled for sip:as + * sip does not fetch the contacts from the server. + * + * @since 5.0 + * @param aListEvent list containing all the group members. + */ + void StoreToVirtualStoreL( const MPresentityGroupContentEvent& aListEvent ); + + + + /** + * Converts the presence cache status to client supported presence status. + * + * @since 5.0 + * @param aAvailabilityEnum presence cache status value. + * @param aAvabilityText avability text, To support Multiple presence states. + * @return TVIMPSTEnums::TOnlineStatus client presence status. + */ + TVIMPSTEnums::TOnlineStatus ConvertPresenceCacheEnums(MPresenceBuddyInfo2::TAvailabilityValues aAvailabilityEnum,TPtrC aAvabilityText); + /** + * Initiates downloading of block list + * @since 5.0 + */ + void RetrieveBlockListL(); + + /** + * Converts the presence cache extension keys + * user for block and pending states to client supported presence status. + * + * @since 5.0 + * @param aPresenceBuddyInfo presence buddy info class. + * @param TVIMPSTEnums::TOnlineStatus client presence status. + */ + void GetKeyFieldsAndValuesL(MPresenceBuddyInfo2& aPresenceBuddyInfo,TVIMPSTEnums::TOnlineStatus &aStatus); + + /** + * Handler for Buddy presence change notifications. + * + * @param aPresenceBuddyInfo presence info for buddy. + */ + void DoHandlePresenceNotificationL(MPresenceBuddyInfo2& aPresenceBuddyInfo); + + + private: // Implementation + + /** + * Standard C++ constructor + * + * @since s60 5.0 + * @param aServiceId, service id + * @param aCchHandler, reference to cchhandler. + * @param aTableFetcher, reference to settingstable. + * @param aXimpEventObserver, reference to ximpevent observer. + * @param aServiceStateListener, reference to servicestatelistener. + */ + CVIMPSTEnginePresenceSubService( TUint32 aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + CVIMPSTEngineSessionCntxtObserver& aXimpEventObserver, + MVIMPSTEngineServiceConnectionEventObserver& aObserver ); + + /** + * Performs the 2nd phase of construction. + */ + void ConstructL(); + + private: // Data + + // Service identifier + TUint32 iServiceId; + + //Ref to the CCH Handler + //thro this interface Presence sub service listens to the + //ECCHPrsenceSub connectivity events. + CVIMPSTEngineCchHandler& iCchHandler; + + //doesnt own, reference to settings table. + CVIMPSTEngineServiceTableFetcher& iSettingsTableFetcher; + + //doesnot own, reference to ximpeventobserver. + CVIMPSTEngineSessionCntxtObserver& iXimpEventObserver; + + //does not own, reference to servicestatelistener. + MVIMPSTEngineServiceConnectionEventObserver& iObserver; + + + //owns + MPresenceCacheReader2* iPresenceCacheReader; + + //Owns, service name + HBufC* iServiceName; + + + // Stores services current state + TVIMPSTEnums::TVIMPSTRegistrationState iServiceState; + + TBool iChangeStatusSupported; + + TBool iChangeStatusMsgSupported; + + // ETrue if supported + TBool iAvatarSupported; + + //Doesnt Own + MVIMPSTEnginePresenceSubServiceEventObserver* iSubServiceObserver; + + // Etrue if clearing avatar in progress + TBool iIsClearingAvatar; + + //stores the default MBM path + TFileName iDefaultMbmPath; + + //Blocked list manager instance pointer. + CVIMPSTBlockedListManager* iBlockedListMgr; + + //Not owned;Notify that blocked list has been fetched. + MVIMPSTEngineBlockedListFetchEventObserver* iBlockedListObserver; + + //flag indicate if request for fetching blocked list is pending. + TBool iBlockListFetchReqPending; + + //flag indicates pending Logout request + TBool iLogoutRequest; + // owns : ETrue if fetching is ongoing + TBool iIsFetchingContact; + + TBool iAutoAccept; + + // owns, tells weather it is subscribe to authorization list or not. + TBool iSubscribeToAuthList; + + }; + +#endif //CVIMPSTENGINEPRESENCESUBSERVICE_H +