realtimenetprots/sipfw/ProfileAgent/profile_fsm/inc/sipprofilecontextbase.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/inc/sipprofilecontextbase.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,369 @@
+/*
+* Copyright (c) 2007-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        : sipprofilecontextbase.h
+* Part of     : sip profile fsm
+* Interface   : internal interface
+* Version     : %version: 2.1.1 %
+*
+*/
+
+
+
+
+/**
+ @internalComponent
+*/
+
+#ifndef CSIPPRROFILECONTEXTBASE_H
+#define CSIPPRROFILECONTEXTBASE_H
+
+//INCLUDES 
+#include <e32base.h>
+#include <badesca.h>
+#include "sipconnection.h"
+#include "sipclienttransaction.h"
+#include "sipregistrationbinding.h"
+#include "sipprofilecontext.h"
+#include "sipprofileagent.h"
+
+// FORWARD DECLARATIONS
+class CSIP;
+class CSIPHttpDigest;
+
+// CLASS DECLARATION
+/**
+*  A base class for maintaining the dynamic information related
+*  to a particular SIP profile. Class stores the related registration, 
+*  sip connection and transactions.
+*
+*  @lib sipprofilefsm.lib
+*/
+class CSIPProfileContextBase : public CBase, public MSIPProfileContext
+	{
+	public:
+
+        /**
+        * Destructor.
+        */
+		IMPORT_C virtual ~CSIPProfileContextBase();
+
+
+    public: // From MSIPProfileContext
+    
+        IMPORT_C const CSIPConnection& Connection() const; 
+        
+        IMPORT_C CSIPRegistrationBinding* Registration();
+        
+        IMPORT_C void SetNextState(CSIPPrflStateBase& aState);
+
+        IMPORT_C void ForgetProfile();
+
+        IMPORT_C void SetTransaction(CSIPClientTransaction* aTransaction);
+
+        IMPORT_C CSIPConcreteProfile* Profile();
+
+        IMPORT_C virtual MSIPProfileAgentObserver& AgentObserver() const;
+
+        IMPORT_C void SetProfile(CSIPConcreteProfile* aProfile);
+        
+        IMPORT_C TInt SetRegisteredAORs();	
+        
+        IMPORT_C void RemoveDeltaTimerEntry();
+        
+        IMPORT_C void HandleProxyResolvingError(TInt aError);
+        
+        IMPORT_C TBool IsProxyResolvingEnabled() const;
+        
+        IMPORT_C TBool ProxiesAlreadyResolved();
+        
+        IMPORT_C void SetProxiesL(MDesC8Array& aProxies);
+       
+		IMPORT_C void SetNegotiatedSecurityMechanismL();
+		
+		IMPORT_C void ResetNegotiatedSecurityMechanismL();       
+        
+	public: // New functions
+
+		/**
+		* Gets the current SIP Profile FSM state
+		* @return current state
+		*/
+		IMPORT_C TSIPProfileState CurrentState() const;
+
+		/**
+		* Gets the current state mapped to the state of CSIPConcreteProfile  
+		* @return the current mapped state
+		*/
+        IMPORT_C CSIPConcreteProfile::TStatus CurrentMappedState() const;
+
+	    /**
+	    * Registers SIP profile to the network and maintains
+	    * the registration. Takes actions needed for the registration
+        * according to the profile type.
+	    */
+	    IMPORT_C void RegisterL();
+
+        /**
+        * Checks whether a registration is pending for the profile.
+        * In other words if a REGISTER has been sent 
+        * but a final response has not yet been received.
+        */ 		
+        IMPORT_C TBool IsRegisterPending() const;
+
+		/**
+		* Retries registration with next proxy address if needed
+		*/
+		IMPORT_C void RetryRegistration();
+
+		/**
+		* Sets resolved proxy addresses
+		* @param aProxies array of dynamicly resolved proxies
+		*/
+		IMPORT_C void ProxyResolvingRequestCompleteL(MDesC8Array& aProxies);
+
+		/**
+		* An asynchronous proxy resolving request has failed.
+		* @param aError a reason why the request failed.
+		*/
+		IMPORT_C void ProxyResolvingRequestFailed(TInt aError);
+
+		/**
+		* Checks if error event is ignored and not sent to client
+		* @return ETrue if error can ignored
+		*/
+		IMPORT_C TBool IgnoreErrorEvent();
+		
+		/**
+		* Terminates abnormally profile handling i.e.
+		* cleanups reserved resources for the profile and forgets it.
+		*/
+		IMPORT_C void TerminateHandling();		
+
+		/**
+		* An asynchronous error has occured related to a periodical refresh 
+		* that relates to a registration.
+		* @param aError error code
+		* @param aRegistration associated registration
+		* @param aHandled, returned ETrue if response handled
+		*/
+		IMPORT_C void ErrorOccured(TInt aError,
+		                           CSIPRegistrationBinding& aRegistration,
+		                           TBool& aHandled);
+
+		/**
+		* An asynchronous error has occurred in the stack related
+		* to the request indicated by the given transaction.
+		* @param aError error code
+		* @param aTransaction the failed transaction
+		* @param aRegistration the failed registration
+		* @param aHandled, returned ETrue if response handled
+		*/
+		IMPORT_C void ErrorOccured(TInt aError,
+		                           CSIPClientTransaction& aTransaction,
+		                           CSIPRegistrationBinding& aRegistration,
+		                           TBool& aHandled);
+
+		/**
+		* Connection state has changed.
+		* @param aState indicates the current connection state
+		*/
+		IMPORT_C void ConnectionStateChanged(CSIPConnection::TState aState);
+
+		IMPORT_C void RetryDeltaTimer( TUint aTime, TInt aError );
+		
+		/**
+		* Checks if profile has not received final response to 
+		* registration/deregistration and the registrar has same value
+		* as input value aValue
+		* @return ETrue if conditions are met.
+		*/
+		IMPORT_C TBool AddIntoQueue( const TDesC8& aValue );
+		
+		/**
+		* Checks if profile is in state when register has not yet been sent
+		* @return ETrue if conditions are met.
+		*/
+		IMPORT_C TBool AddDeregisterIntoQueue();
+		
+		/**
+		* Checks if the profile  is in idle state.
+		* @return ETrue if conditions are met.
+		*/
+		IMPORT_C TBool IsIdle();
+
+		/**
+		* Sets HTTP Digest credentials from the profile
+		* if the given transaction is related to this profile.
+		* @return ETrue if the transaction was found and credentials were set.
+		*/
+        IMPORT_C TBool SetCredentials(
+            const CSIPClientTransaction& aTransaction,
+            CSIPHttpDigest& aDigest);
+
+		/**
+		* Sets HTTP Digest credentials from the profile
+		* if the given refresh is related to this profile.
+		* @return ETrue if the refresh was found and credentials were set.
+		*/
+        IMPORT_C TBool SetCredentials(
+            const CSIPRefresh& aRefresh,
+            CSIPHttpDigest& aDigest);
+
+    public: // For internal use
+
+		static TInt RetryDeltaTimerExpired(TAny* aPtr);
+		
+		void ContinueRegistrationL();
+
+	protected: // Constructors
+	
+		/**
+		* Constructor
+		*/
+		IMPORT_C CSIPProfileContextBase(
+			CSIP& aSIP,
+			CSIPConnection& iConnection,
+			MSIPProfileAgentObserver& aObserver,
+			CSIPPrflStateBase& aInitState,
+			CSIPConcreteProfile& aProfile,
+			CDeltaTimer& aDeltaTimer);
+    
+    protected: // Virtual functions
+
+    	IMPORT_C virtual TBool HasTransaction(
+    	    const CSIPClientTransaction& aTransaction) const;
+    
+    	IMPORT_C virtual TBool HasRefresh(
+    	    const CSIPRefresh& aRefresh) const;
+    	    
+    	IMPORT_C virtual const TDesC8& RegistrarUsername() const;
+
+		virtual void ConnectionStateChangedImpl(
+		    CSIPConnection::TState aState) = 0;
+		    
+		virtual void SetRegisteredAORsL() = 0;
+
+		virtual TBool RetryRegister(CSIPClientTransaction* aTransaction,
+							        TInt aError) = 0;
+							  
+		virtual TBool ShouldRetryRegistration(TInt aError) = 0;					  
+    	
+    	virtual void InitializeRetryTimerValue() = 0;
+    
+    protected: // New functions
+    
+ 		/**
+		* Require dynamic proxy resolving
+		* @return ETrue, if required
+		*/
+		IMPORT_C TBool RequireProxyResolving();
+    
+		/**
+		* Returns either static or dynamic proxy address
+		* @return proxy address
+		*/
+		IMPORT_C const TDesC8& ProxyAddressL();
+
+		/**
+		* Returns either static or dynamic proxy address
+		* @return proxy address
+		*/
+		IMPORT_C const TDesC8& ProxyAddressL(CSIPConcreteProfile& aProfile);
+		
+		/**
+		* A 2XX response to a REGISTER request was received.
+		*/
+		IMPORT_C void Received2XXRegisterResponse();
+		
+		/**
+		* Checks if retry of registration is possible
+		* @return ETrue if retry possible
+		*/
+		IMPORT_C TBool RetryPossible(TInt aError);		
+				
+		/**
+		* Set flag to indicate whether retry of registration is possible
+		* @param aRetryPossible ETrue if retry possible
+		*/
+		IMPORT_C void SetRetryPossible(TBool aRetryPossible);
+		
+		/**
+		 * Returns profile ID
+		 * @return profile ID or 0 if profile doesn't exist
+		 */
+		IMPORT_C TUint32 ProfileId() const;
+		
+    private: // New functions
+
+        void RegisterDynamicL(MDesC8Array& aProxies);
+
+		void ConstructDynamicProxyL(const TDesC8& aProxy);
+		
+		void ClearProxyResolving();
+		
+		void ResetRegisteredAORsL();				
+ 
+        template<class T> void SetCredentialsImplementation(
+            const T& aChallengeTarget,
+            const CSIPResponseElements& aResponse,
+            CSIPHttpDigest& aDigest);
+ 
+        TBool GetRegistrarCredentials(
+            TPtrC8& aUsername,
+            TPtrC8& aPassword) const;
+ 
+         TBool GetProxyCredentials(
+            TPtrC8& aProxyHost,
+            TPtrC8& aUsername,
+            TPtrC8& aPassword) const;
+ 
+        TPtrC8 ExtractProxyHost() const;
+
+
+    protected: // Data
+
+		CSIP&						iSIP;
+		CSIPConnection&             iConnection;
+		MSIPProfileAgentObserver&	iObserver;
+		CSIPPrflStateBase*			iCurrentState; // Not owned
+		CSIPPrflStateBase*			iInitState; // Not owned
+		CSIPConcreteProfile*		iProfile; // Not owned
+		CSIPClientTransaction*		iClientTx; // Owned
+		CSIPRegistrationBinding*	iRegistration; // Owned
+		TUint32						iProfileId;
+		CDeltaTimer&				iDeltaTimer;
+		MDesC8Array*				iProxies; // Owned
+		TInt                        iErrorForDeltaTimer;
+
+	private:
+	
+		TInt						iDynamicProxyCount;
+		TCallBack					iDeltaTimerCallBack;
+		TDeltaTimerEntry			iDeltaTimerEntry;
+		TBool					    iRetryPossible;
+		TBool						iResolvingCompleted;
+        RStringF                    iWwwAuthenticateHeaderName;
+        RStringF                    iProxyAuthenticateHeaderName;
+        TBool 						iUseBackupProxy;
+		
+	private: // For testing purposes
+	
+        #ifdef CPPUNIT_TEST	
+	    	friend class CSIPProfileContextBaseTest;
+        #endif
+	};
+
+#endif // CSIPPRROFILECONTEXTBASE_H
+