uiservicetab/vimpstengine/inc/cvimpstenginepresencesubservice.h
changeset 0 5e5d6b214f4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiservicetab/vimpstengine/inc/cvimpstenginepresencesubservice.h	Tue Feb 02 10:12:18 2010 +0200
@@ -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 <e32base.h>
+#include <presencecachereadhandler2.h> // handling the presence cache events 
+#include <mpresencebuddyinfo2.h> // buddy info class
+#include <presenceinfo.h> //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<HBufC>* 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<MPresenceBuddyInfo2>& 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
+