realtimenetprots/sipfw/SIP/TransactionUser/inc/CTransactionUser.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/TransactionUser/inc/CTransactionUser.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,432 @@
+/*
+* Copyright (c) 2006-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          : CTransactionUser.h
+* Part of       : TransactionUser
+* Version       : SIP/5.0
+*
+*/
+
+
+
+
+/**
+ @internalComponent
+*/
+
+#ifndef CTRANSACTIONUSER_H
+#define CTRANSACTIONUSER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <bamdesca.h>
+#include <stringpool.h>
+#include <commsdattypesv1_1.h>
+
+#include "sipinternalstates.h"
+
+#include "MTransactionUser.h"
+#include "MServerTaFactory.h"
+#include "MConnectionStateObserver.h"
+
+// FORWARD DECLARATIONS
+class MSIPRequestRouter;
+class MTimerManager;
+class CSipConnectionMgr;
+class MSipDialogs;
+class MSipRegistrations;
+class MSipRegistrationContact;
+class CDeleteMgr;
+class CSIPSec;
+class CTransactionMgr;
+
+class MTransactionOwner;
+class CTransactionStore;
+class CUserAgent;
+class CCancelUAC;
+class CUserAgentCreateParams;
+class CTimerValueRetriever;
+class CSIPMessageUtility;
+class CInviteUAC_Start;
+class CInviteUAC_ResolveAddress;
+class CInviteUAC_WaitResponse;
+class CInviteUAC_WaitAckFromApp;
+class CInviteUAC_ResolveAckAddress;
+class CInviteUAC_SendingAck;
+class CInviteUAC_WaitTransactionToEnd;
+class CInviteUAC_WaitAuthentication;
+class CNormalUAC_Start;
+class CNormalUAC_ResolveAddress;
+class CNormalUAC_WaitResponse;
+class CNormalUAC_WaitAuthentication;
+class CInviteUAS_Start;
+class CInviteUAS_GetTxOwner;
+class CInviteUAS_WaitRespFromApp;
+class CInviteUAS_Accepted;
+class CInviteUAS_Rejected;
+class CNormalUAS_Start;
+class CNormalUAS_GetTxOwner;
+class CNormalUAS_WaitRespFromApp;
+class CNormalUAS_FinalRespSent;
+class CCancelUAC_Start;
+class CCancelUAC_ResolveAddress;
+class CCancelUAC_WaitResponse;
+class CCancelUAC_WaitAuthentication;
+class CCancelUAS_Start;
+class CCancelUAS_FinalRespSent;
+
+// CLASS DECLARATION
+
+/**
+ * CTransactionUser class is the interface for using TransactionUser subsystem.
+ */
+class CTransactionUser :	
+	public CBase,
+    public MTransactionUser,
+	public MServerTaFactory,
+    public MConnectionStateObserver
+	{
+public: // Constructors and destructor
+
+	/**
+	 * Creates TransactionUser subsystem.
+	 *
+	 * @pre aRouter != NULL, aTimers != NULL
+	 *
+	 * @param aRouter Router interface. Ownership isn't transferred.
+	 * @param aTimers Lwtimer interface. Ownership isn't transferred.
+	 * @param aObserver Callback to pass connection state information
+	 * @return value New CTransactionUser object, ownership is transferred.
+	 */	
+	static CTransactionUser* NewL(MSIPRequestRouter* aRouter,
+							      MTimerManager* aTimers,
+								  MConnectionStateObserver& aObserver);
+
+	/**
+	 * Destructor. All existing transactions are immediately stopped.
+	 */
+	~CTransactionUser();
+
+public : // From MTransactionUser
+
+	void SendL(TTransactionId& aTransactionId,
+	           TRegistrationId aRegistrationId,
+               CSIPRequest* aRequest,
+               MTransactionOwner* aObserver,
+               CURIContainer& aRemoteTarget,
+               const TSIPTransportParams& aTransportParams,
+               TBool aDeleteRequest);
+					    
+	MTransactionHeaders* SendAndGetHeadersL(
+						TTransactionId& aTransactionId,
+						TRegistrationId aRegistrationId,
+						CSIPRequest* aRequest,
+						MTransactionOwner* aObserver,						
+                        CURIContainer& aRemoteTarget,
+                        const TSIPTransportParams& aTransportParams,
+						TBool aDeleteRequest);
+						
+	void SendL(TTransactionId aTransactionId,
+	           CSIPResponse* aResponse,
+	           const TSIPTransportParams& aTransportParams) const;
+	           
+	void SendL(TTransactionId aTransactionId,
+	           CSIPResponse* aResponse,
+	           MTransactionOwner* aObserver,
+	           const TSIPTransportParams& aTransportParams) const;
+					    
+	void SendCancelL(TTransactionId aInviteTaId,
+					 TTransactionId& aCancelTaId,
+					 MTransactionOwner* aObserver);
+
+	TInt ClearTransactionOwner(TTransactionId aTransactionId) const;
+
+	TInt ClearTransactionOwner(MTransactionOwner* aObserver) const;
+
+
+    void GetLocalAddress(TUint32 aIapId, TInetAddr& aAddr) const;
+
+	void FreeResources(MSIPNATBindingObserver& aSIPNATBindingObserver );
+
+	MTransactionHeaders*
+        TransactionHeadersL(TTransactionId aTransactionId) const;
+
+	void MakeTagL(TDes8& aTag) const;
+	
+	virtual TInt NextHopIP(
+		const TTransactionId& aTransactionId, TInetAddr& aAddr);
+
+public: // From MServerTaFactory
+
+	virtual MReceiverObserver*
+        NewTransactionL(CSIPRequest& aRequest,
+                        const TSIPTransportParams& aParams,
+						TTransactionId& aTransactionId);
+
+public: // From MConnectionStateObserver
+
+	void ConnectionStateChangedL(TUint32 aIapId, CSIPConnection::TState aState);
+
+public: // New functions
+
+    /**
+ 	 * Returns a reference to SIPSec. 
+	 *
+	 * @returns SIPSec
+	 */
+    CSIPSec& SIPSec();
+
+    /**
+ 	 * Returns a reference to SIP ConnnectionMgr.
+	 *
+	 * @returns ConnectionMgr
+	 */    
+    CSipConnectionMgr& SipConnectionMgr();
+
+	/**
+	 * Gives the address of SIP Dialogs subsystem to TransactionUser subsystem.	 
+	 *
+	 * @pre aSipDialogs != NULL
+	 *
+	 * @param aSipDialogs IN: address of SIP Dialogs subsystem. Ownership isn't
+	 *	transferred
+	 */
+	void SetDialogs(MSipDialogs* aSipDialogs);
+
+	/**
+	 * Gives the interfaces of SIP Registrations subsystem for TransactionUser
+	 * subsystem.
+	 *
+	 * @pre aSipRegistrations != NULL, aRegistrationContact != NULL
+	 *
+	 * @param aSipRegistrations IN: interface for checking AORs. Ownership
+     *  isn't transferred
+	 * @param aRegistrationContact IN: interface for obtaining Contact header.
+	 *	Ownership isn't transferred
+	 */
+	void SetRegistrations(MSipRegistrations* aSipRegistrations,
+						  MSipRegistrationContact* aRegistrationContact);        
+
+    /**
+	 * Obtains the state of the specified transaction.
+	 *
+	 * @param aTransactionId TransactionId of the transaction whose state is
+     *  requested.
+	 * @param aState OUT: Transaction state
+	 * @leave KErrNotFound if no such transaction exists.
+	 */
+    void GetStateL(TTransactionId aTransactionId,
+                   CSIPInternalStates::TState& aState) const;
+
+private: // Constructors, for internal use
+
+	CTransactionUser(MSIPRequestRouter* aRouter,
+                     MTimerManager* aTimers,
+                     MConnectionStateObserver& aStateObserver);
+
+	void ConstructL();
+
+private: // New functions, for internal use
+
+	/**
+	 * Builds UA state machines by creating the state objects and linking them
+	 * together.
+	 */
+	void ConstructUaStateMachinesL();
+
+	/**
+	 * Generate a new value to be used as a CSeq sequence number.
+	 *
+	 * @return value Sequence number
+	 */
+	TUint32 NewCSeqValue();
+
+	/**
+	 * Fills the common parameters for creating a new UA.	 
+	 *
+	 * @param aTransactionId Transaction id for the new UserAgent
+	 * @param aObserver Callback to the upper layer. Can be NULL. Ownership
+	 *	isn't transferred.
+	 * @param aDeleteOutgoingMsg If ETrue, UserAgent deletes iOutgoingMsg when
+	 *	UserAgent itself is deleted.
+     * @param aParams IN: Transport parameters to be used when handing a SIP
+     *					  message to SIP Connection Mgr.
+	 * @return Object containing the common parameters for all UserAgent types.
+	 *	Ownership is transferred.
+	 */
+	CUserAgentCreateParams* FillUserAgentParamsLC(TTransactionId aTransactionId,
+									  MTransactionOwner* aObserver,
+									  TBool aDeleteOutgoingMsg,
+			                          const TSIPTransportParams& aParams) const;
+
+	/**
+	 * Creates an UAS for handling a SIP request received from network.
+	 *
+	 * @param aTaId TransactionId for the UAS
+	 * @param aMethod Method of the SIP request
+     * @param aParams IN: Transport parameters to be used when handing a SIP
+     *					  message to SIP Connection Mgr.
+	 * @return value New UA object, ownership is transferred
+	 */
+	CUserAgent* CreateUasL(TTransactionId aTaId,
+						   RStringF aMethod,
+                           const TSIPTransportParams& aParams) const;
+
+	/**
+	 * Creates an UAC for sending a new SIP request to network.	 
+	 *
+	 * @param aTaId TransactionId for the UAC
+	 * @param aMethod Method of the SIP request
+	 * @param aObserver Callback where UAC sends the response and other events
+	 * @param aDeleteRequest If ETrue, UAC will delete the SIP request when UAC
+	 *	ends. If EFalse, UAC doesn't delete the SIP request. In either case,
+	 *  UAC can modify the request.
+	 * @param aCSeqNumber CSeq sequence number for UAC to use, unless filled by
+	 *	upper layer.
+     * @param aParams IN: Transport parameters to be used when handing a SIP
+     *					  request to SIP Connection Mgr.
+	 * @return value New UA object, ownership is transferred
+	 */
+	CUserAgent* CreateUacL(TTransactionId aTaId,
+						   RStringF aMethod,
+						   MTransactionOwner& aObserver,
+						   TBool aDeleteRequest,
+						   TUint32 aCSeqNumber,
+                           const TSIPTransportParams& aParams) const;
+
+    /**
+	 * Creates UAC for sending CANCEL request to network.
+	 *	 
+	 * @param aTaId TransactionId for the UAC	 
+	 * @param aObserver Callback where UAC sends the response an other events	 
+     * @param aCSeqNumber CSeq sequence number for UAC to use, unless filled by
+	 *	upper layer.
+	 * @param aParams IN: Transport parameters to be used when handing a SIP
+     *					  request to SIP Connection Mgr.
+	 * @return value New CancelUAC object, ownership is transferred
+	 */
+    CCancelUAC*
+    	CreateCancelUacL(TTransactionId aTaId,
+						 MTransactionOwner& aObserver,
+                         TUint32 aCSeqNumber,
+                         const TSIPTransportParams& aParams) const;
+    
+    /**
+     * Returns the Timer Retriever Mapped bearer type
+     * @param aIapID IapID for which bearer type needs to be determined 
+     */
+    TInt TimerRetrieverMappedBearerTypeL(TUint32 aIapID) const;
+
+private: // Data
+
+	//Determines where incoming requests are routed. Not owned.
+	MSIPRequestRouter* iRouter;
+
+	//Timer services. Not owned.
+	MTimerManager* iTimers;
+
+    //Connection state changes are reported to this callback
+	MConnectionStateObserver& iStateObserver;
+
+	//Dialog subsystem. Not owned.
+	MSipDialogs* iDialogs;
+
+	//Registration subsystem. Not owned.
+	MSipRegistrations* iRegistrations;
+
+	//Used for filling in information to Contact-headers of outgoing SIP
+    //messages. Not owned.
+	MSipRegistrationContact* iRegistrationContact;
+
+	//Transport layer. Owned.
+	CSipConnectionMgr* iConnectionMgr;
+
+	//Contains information of all existing transactions and UAs. Owned.
+	CTransactionStore* iTransactionStore;
+
+	//Used for freeing memory asynchronously. Owned.
+	CDeleteMgr*	iDeleteMgr;	
+
+
+	//There is one instance of each UA state object. They're all owned.
+
+	//Invite user agent client states
+	CInviteUAC_Start*				 iInviteUAC_Start;
+	CInviteUAC_ResolveAddress*		 iInviteUAC_ResolveAddress;
+	CInviteUAC_WaitResponse*		 iInviteUAC_WaitResponse;
+	CInviteUAC_WaitAckFromApp*		 iInviteUAC_WaitAckFromApp;
+	CInviteUAC_ResolveAckAddress*	 iInviteUAC_ResolveAckAddress;
+	CInviteUAC_SendingAck*			 iInviteUAC_SendingAck;
+	CInviteUAC_WaitTransactionToEnd* iInviteUAC_WaitTransactionToEnd;
+	CInviteUAC_WaitAuthentication*	 iInviteUAC_WaitAuthentication;	
+
+	//Non-Invite user agent client states
+	CNormalUAC_Start*				iNormalUAC_Start;
+	CNormalUAC_ResolveAddress*		iNormalUAC_ResolveAddress;
+	CNormalUAC_WaitResponse*		iNormalUAC_WaitResponse;
+	CNormalUAC_WaitAuthentication*	iNormalUAC_WaitAuthentication;	
+
+	//Cancel user agent client states
+	CCancelUAC_Start*				iCancelUAC_Start;
+	CCancelUAC_ResolveAddress*		iCancelUAC_ResolveAddress;
+	CCancelUAC_WaitResponse*		iCancelUAC_WaitResponse;
+	CCancelUAC_WaitAuthentication*	iCancelUAC_WaitAuthentication;
+
+	//Invite user agent server states
+	CInviteUAS_Start*			iInviteUAS_Start;
+	CInviteUAS_GetTxOwner*		iInviteUAS_GetTxOwner;
+	CInviteUAS_WaitRespFromApp* iInviteUAS_WaitRespFromApp;
+	CInviteUAS_Accepted*		iInviteUAS_Accepted;
+	CInviteUAS_Rejected*		iInviteUAS_Rejected;
+	
+	//Non-Invite user agent server states
+	CNormalUAS_Start*			iNormalUAS_Start;
+	CNormalUAS_GetTxOwner*		iNormalUAS_GetTxOwner;
+	CNormalUAS_WaitRespFromApp* iNormalUAS_WaitRespFromApp;
+	CNormalUAS_FinalRespSent*	iNormalUAS_FinalRespSent;	
+
+	//Cancel user agent server states
+	CCancelUAS_Start*			iCancelUAS_Start;
+	CCancelUAS_FinalRespSent*	iCancelUAS_FinalRespSent;
+
+
+	//Counter used to produce CSeq numbers for outgoing requests when the upper
+	//layers have not filled the CSeq number.	
+	TUint32 iCSeqCounter;
+
+	//Transaction layer. Owned.
+	CTransactionMgr* iTransactionMgr;
+
+	//Timer values, owned.
+	CTimerValueRetriever* iTimerValueRetriever;
+
+    //SIP message manipulating utilities. Owned.
+	CSIPMessageUtility* iSIPMsgUtility;
+
+	//SIP Security subsystem. Owned.
+	CSIPSec* iSIPSec;
+
+private: // For testing purposes
+
+#ifdef CPPUNIT_TEST
+	friend class CTransactionUser_Test;
+#endif
+
+	void __DbgTestInvariant() const;
+
+	};
+
+#endif // end of CTRANSACTIONUSER_H
+
+// End of File