--- /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