realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Inc/sipimsprofilecontext.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Inc/sipimsprofilecontext.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,366 @@
+/*
+* Copyright (c) 2005-2009 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:
+* Name        : sipimsprofilecontext.h
+* Part of     : sip ims agent
+* Interface   : Internal IF
+* Version     : 1.0
+*
+*/
+
+
+
+
+/**
+ @internalComponent
+*/
+
+#ifndef CSIPIMSPRROFILECONTEXT_H
+#define CSIPIMSPRROFILECONTEXT_H
+
+//INCLUDES 
+#include <e32base.h>
+#include <badesca.h>
+#include <stringpool.h>
+#include <uri8.h>
+#include "sipprofilecontextbase.h"
+#include "sipprofileagent.h"
+#include "sipimsconnectioncontext.h"
+#include "sipregeventobserver.h"
+#include "sipprofileagentobserver.h"
+#include "sipdialogassocbase.h"
+#include <sipprofileagentextensionparams.h>
+
+// FORWARD DECLARATIONS
+class CSIPHeaderBase;
+class CSIPSecurityClientHeader;
+class CSIPRegEventHandler;
+class CDeltaTimer;
+class CSIPNotifyXmlBodyParser;
+class CSIPProfileSIMRecord;
+
+// CLASS DECLARATION
+/**
+*  Class for maintaining the information related
+*  to a particular IMS type profile. Class stores
+*  related registration, sip connection and transactions.
+*
+*  @lib n/a.
+*/
+class CSIPIMSProfileContext : public CSIPProfileContextBase,
+				              public MSIPRegEventObserver,
+				              public MSIPProfileAgentObserver
+	{
+	public:
+		   
+		enum TConfiguredType
+			{
+			/** IMS Release x */
+			EIMSReleaseType=0,
+			/** Early IMS*/
+			EEarlyIMSType,
+			/** IAPClient configured type */
+			EClientConfiguredType
+			};
+		   
+		   
+        /**
+        * Two-phased constructor.
+        * @param aXMLParser a XML parser
+	    * @param aSIP a handle to SIP server
+		* @param aConnection a SIP connection
+		* @param aInitState a init state
+		* @param aProfile a profile
+        */
+		static CSIPIMSProfileContext* NewL(
+		    CSIPNotifyXmlBodyParser& aXMLParser,
+			CSIP& aSIP,
+			CSIPIMSConnectionContext& aConnection,
+			MSIPProfileAgentObserver& aObserver,
+			CSIPPrflStateBase& aInitState,
+			CSIPConcreteProfile& aProfile,
+			CDeltaTimer& aDeltaTimer,
+			CSIPProfileSIMRecord& aSIMRecord,
+			CSipProfileAgentConfigExtension& aConfigExtension);
+        /**
+        * Two-phased constructor.
+        * @param aXMLParser a XML parser
+	    * @param aSIP a handle to SIP server
+		* @param aConnection a SIP connection
+		* @param aInitState a init state
+		* @param aProfile a profile
+        */
+		static CSIPIMSProfileContext* NewLC(
+		    CSIPNotifyXmlBodyParser& aXMLParser,
+			CSIP& aSIP,
+			CSIPIMSConnectionContext& aConnection,
+			MSIPProfileAgentObserver& aObserver,
+			CSIPPrflStateBase& aInitState,
+			CSIPConcreteProfile& aProfile,
+			CDeltaTimer& aDeltaTimer,
+			CSIPProfileSIMRecord& aSIMRecord,
+			CSipProfileAgentConfigExtension& aConfigExtension);
+
+        /**
+        * Destructor.
+        */
+		~CSIPIMSProfileContext();
+
+
+    public: // From MSIPProfileContext
+
+        MSIPProfileAgentObserver& AgentObserver() const;
+
+		void DestroyRegistration();
+
+        void CreateRegistrationL();
+
+		CSIPMessageElements* CreateMsgElementsLC();
+		
+        CSIPMessageElements* CreateDeRegisterElementsL();
+		
+		void UpdateContactHeaderParamsL(CSIPConcreteProfile& aNewProfile);
+				
+		TBool RetryTimerInUse();
+
+		TUint RetryAfterTime();
+
+		TBool RetryAfterTimer();
+		
+		void ResolveProxyL();
+				
+		void CancelProxyResolving();
+				
+		TBool ProxiesAlreadyResolved();
+		
+	public: // From MSIPRegEventObserver
+	
+	    void RegEventSubscriptionActive();
+	    
+        void ExpirationTimeUpdatedL(TInt aExpirationTime);
+        
+        void ReRegister();
+    
+        void RegistrationDeactivated();
+		
+        void RegistrationTerminated();
+     
+        void RegEventSubscriptionFailedL();		
+		
+		
+	public: // From MSIPProfileAgentObserver
+	
+		void SIPProfileStatusEvent(
+		    CSIPConcreteProfile& aProfile,
+		    TUint32 aContextId);
+
+		void SIPProfileErrorEvent(
+		    CSIPConcreteProfile& aProfile,
+		    TInt aError);
+
+		TBool ProceedRegistration(CSIPConcreteProfile& aProfile, TInt aError);		
+		
+		void GetFailedProfilesL(
+		    const TSIPProfileTypeInfo& aType,
+		    RPointerArray<CSIPConcreteProfile>& aFailedProfiles) const;
+		
+	public: // New functions
+
+	    /**
+	    * Deregisters SIP profile according to the profile type.
+	    * @param aSIPConcreteProfile sip profile to deregister
+	    */
+	    void DeregisterL();
+
+ 		/**
+		* Updates SIP profile. This can lead to profile de-registration
+		* and registration. Function leaves with KErrArgument if profiles 
+		* are the same.
+		* @param aNewProfile sip profile to update
+		*/
+		void UpdateL(CSIPConcreteProfile& aNewProfile);
+
+		/**
+		* A SIP response creating a registration binding or an error response 
+		* that is related to an refreshed registration binding  
+		* has been received from the network.
+		* @param aTransaction contains response elements.
+		* The ownership is transferred.
+		* @param aRegistration associated registration
+		* @param aHandled, returned ETrue if response handled
+		*/
+		void IncomingResponse(CSIPClientTransaction& aTransaction,
+		                      CSIPRegistrationBinding& aRegistration,
+		                      TBool& aHandled);
+
+		/**
+		* A SIP request within a dialog has been received from the network.
+		* The client must resolve the actual dialog association to which
+		* this request belongs.
+		* @param aTransaction SIP server transaction
+		* The ownership is transferred.
+		* @param aDialog the dialog  that
+		*        this transaction belongs to.
+		* @param aHandled, returned ETrue if request handled
+ 		*/
+		void IncomingRequest(CSIPServerTransaction* aTransaction,
+		                     CSIPDialog& aDialog,
+		                     TBool& aHandled);
+
+		/**
+		* A SIP response received from the network.
+		* @param aTransaction contains response elements.
+		* The ownership is transferred.
+		* @param aHandled, returned ETrue if response handled
+		*/
+		void IncomingResponse(CSIPClientTransaction& aTransaction,
+							  TBool& aHandled);
+							  
+		/**
+		* A SIP response that is within a dialog association or creates
+		* a dialog association.
+		* @param aTransaction contains response elements.
+		* The ownership is transferred.
+		* @param aDialogAssoc a dialog association
+		* @param aHandled, returned ETrue if response handled
+		*/
+		void IncomingResponse(CSIPClientTransaction& aTransaction,
+		                      CSIPDialogAssocBase& aDialogAssoc,
+		                      TBool& aHandled);
+
+		/**
+		* An asynchronous error has occured related to a periodical refresh 
+		* that belongs to SIP dialog association.
+		* @param aDialogAssoc SIP dialog association
+		* @param aError error code
+		* @param aHandled, returned ETrue if error handled
+		*/
+		void ErrorOccured(CSIPDialogAssocBase& aDialogAssoc,
+						  TInt aError,
+						  TBool& aHandled);
+
+		/**
+		* An asynchronous error has occured related to a request within
+		* an existing dialog.
+		* @param aTransaction the failed transaction
+		* @param aDialogAssoc the failed dialog associoation
+		* @param aError error code
+		* @param aHandled, returned ETrue if error handled
+		*/
+		void ErrorOccured(CSIPTransactionBase& aTransaction,
+		                  CSIPDialogAssocBase& aDialogAssoc,
+		                  TInt aError,
+		                  TBool& aHandled);			                      
+		/*
+		* Checks whether HTTP Digest Settings are configured for the profile.
+		* @param aProfile profile to be checked
+		* @return ETrue if HTTP Digest settings are configured,
+		*         otherwise return EFalse.
+		*/
+		static TBool IsHttpDigestSettingsConfigured(
+		    const CSIPConcreteProfile& aProfile);
+
+		static TBool IsSupportedSecurityMechanismL(CSIP& aSIP,
+		                                           const TDesC8& aValue);
+
+		void SetConfiguredType(TConfiguredType);
+		
+		CSIPIMSProfileContext::TConfiguredType ConfiguredType();
+		
+	private: // Second phase constructors
+
+		CSIPIMSProfileContext(
+		    CSIPNotifyXmlBodyParser& aXMLParser,
+			CSIP& aSIP,
+			CSIPIMSConnectionContext& iConnection,
+			MSIPProfileAgentObserver& aObserver,
+			CSIPPrflStateBase& aInitState,
+			CSIPConcreteProfile& aProfile,
+			CDeltaTimer& aDeltaTimer,
+			CSIPProfileSIMRecord& aSIMRecord,
+			CSipProfileAgentConfigExtension& aConfigExtension);
+
+        void ConstructL();
+
+
+	private: // From CSIPProfileContextBase
+
+		void ConnectionStateChangedImpl(CSIPConnection::TState aState);
+		
+		void SetRegisteredAORsL();
+		
+		TBool RetryRegister(CSIPClientTransaction* aTransaction,
+							TInt aError);
+							  
+		TBool ShouldRetryRegistration(TInt aError);
+		
+		void InitializeRetryTimerValue();
+		
+        TBool HasTransaction(const CSIPClientTransaction& aTransaction) const;
+    
+        TBool HasRefresh(const CSIPRefresh& aRefresh) const;		
+
+        const TDesC8& RegistrarUsername() const;
+		
+    private: // New functions
+
+        void RemoveRegEventHandler();
+
+		void StoreMsgElementsL();
+		
+		TBool IsUnsupportedHeaderValue(RStringF aValue);
+				
+		void AddSecurityClientHeaderL(RPointerArray<CSIPHeaderBase>& aHeaders,
+		                              const CSIPConcreteProfile& aProfile);
+		
+		void HandleProfileRegisteredEventL();
+
+        CSIPMessageElements* CreateMsgElementsForUpdateLC(
+            CSIPConcreteProfile& aProfile);
+		
+		RPointerArray<CSIPHeaderBase> CreateSIPHeadersL(
+		    const CSIPConcreteProfile& aProfile);
+		    
+		void CheckRetryAfter( CSIPClientTransaction* aTransaction );
+		
+		RStringF TransportProtocol(const CUri8& aUri) const;
+
+	private: // Data
+	    
+	    CSIPNotifyXmlBodyParser&    iXMLParser;
+		CSIPIMSConnectionContext&	iConnectionContext;
+		CUri8*						iPAURI;
+		CSIPRegEventHandler*		iRegEventHandler;
+		RStringF                    iPathStr;
+		TBool                       iRegEventSubscriptionFailed;
+		TConfiguredType 			iConfiguredType;
+		CSIPProfileSIMRecord&		iSIMRecord;
+		TBool                       iConnectionDropped;
+		TBool                       iDeactivatedByNetwork;
+		TBool						iRetriedRegister;
+		TBool						iRetryTimerUse;
+		TUint						iRetryAfterTime;
+		TUint						iRetryCounterSum;
+		TBool						iUseDynamicProxyForTry;
+		CSipProfileAgentConfigExtension& iConfigExtension;
+	
+	private: // For testing purposes
+#ifdef CPPUNIT_TEST		
+		friend class CSIPIMSProfileContextTest;
+		friend class CSIPIMSConnectionContextTest;
+		friend class CSIPIMSProfileAgentTest;
+#endif
+	};
+
+#endif // CSIPIMSPRROFILECONTEXT_H