diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/profile_fsm/inc/sipprofilecontextbase.h --- /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 +#include +#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 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 +