realtimenetprots/sipfw/SIP/ConnectionMgr/inc/CSipConnection.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/inc/CSipConnection.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,414 @@
+/*
+* 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          : CSipConnection.h
+* Part of       : ConnectionMgr
+* Version       : SIP/4.0
+*
+*/
+
+
+
+#ifndef __CSIPCONNECTION_H__
+
+/**
+* @internalComponent
+*/
+#define __CSIPCONNECTION_H__
+
+// INCLUDES
+#include "MTransportOwner.h"
+#include "MIcmpReceiver.h"
+#include "CSipConnectionMgr.h"
+#include "msipconnectioncontext.h"
+#include "MOutgoingRequestQueueContext.h"
+#include "sipnetworkobserver.h"
+#include "CNetworkManager.h"
+#include "CStateModel.h"
+#include <commsdattypesv1_1.h>
+
+#include <stringpool.h>
+
+// FORWARD DECLARATIONS
+class MTransactionFinder;
+class MSigCompController;
+class MServerTaFactory;
+class MTimerManager;
+class MSIPServerResolverObserver;
+class RSocketServ;
+class CLocalAddrResolver;
+class CTransportBase;
+class CIcmpReceiver;
+class CSIPServerResolver;
+class CSender;
+class COutgoingData;
+class CTcpResponseSender;
+class CSIPMessage;
+class CSIPViaHeader;
+class CURIContainer;
+class COwnerSettingsList;
+class CConnectionContainer;
+class CNetworkManager;
+class CStateModel;
+class CNetworkInfo;
+class CSIPNATTraversalController;
+class COutgoingRequestQueue;
+class CUri8;
+class MSIPNATBindingObserver;
+
+
+// CLASS DEFINITION
+class CSipConnection
+	: public CBase,
+	  public MTransportOwner,
+	  public MSIPConnectionContext,
+	  public MOutgoingRequestQueueContext,
+	  public MIcmpErrorObserver
+	{
+	public: // Constructors and destructor
+
+	    /**
+		* Constructs, adds the pointer onto the cleanup stack
+		* and returns a pointer to, a new CSipConnection object;
+		* leaves on failure.
+		*
+		* @param aFinder	A reference to the MTransactionFinder object
+		* @param aTaFactory	A reference to the MServerTaFactory object
+		* @param aTimer		A reference to the MTimerManager object
+		* @param aTOne		T1 timervalue
+		* @param aParams	info about transport (iapId etc.)
+		* @param aServer	socket server		
+		* @param aSigCompHandler The handler for signaling compression
+		* @param aTUNetStatusObserver Callback where the connection state
+		*					changes are notified
+		* @param aNetworkManager Monitors network's state
+		* @param aOwner		Owner of the CSipConnection
+		* @param aNetworkInfo Network information store
+		*
+		* @return CSipConnection
+		*/
+		static CSipConnection*
+			NewLC( MTransactionFinder& aFinder,
+				   MServerTaFactory& aTaFactory,
+				   MTimerManager& aTimer,
+				   TUint aTOne,
+				   const TSIPTransportParams& aParams,
+				   RSocketServ& aServer,
+				   MSigCompController& aSigCompHandler,
+				   MConnectionStateObserver& aTUNetStatusObserver,
+				   CNetworkManager& aNetworkManager,
+				   MSipConnectionOwner& aOwner,
+				   CNetworkInfo& aNetworkInfo,
+				   CSIPNATTraversalController& aNATTraversal );
+
+		/// Destructor
+		~CSipConnection();
+
+
+	public: // New functions, ConnectionMgr offers through MSipConnectionMgr
+	
+        void SetOptL( const TSIPTransportParams& aParams,
+                      TUint aOptionName,
+	                  TUint aOptionLevel,
+	                  const TDesC8& aOption );
+	         	                         
+        void SetOptL( const TSIPTransportParams& aParams,
+                      TUint aOptionName,
+	                  TUint aOptionLevel,
+	                  TInt aOption ); 	
+
+	    void SendL( const TSIPTransportParams& aParams,
+	                CSIPRequest& aRequest, 
+	                TBool aForceUDP,
+	                const CUri8* aOutboundProxy,
+			        const TInetAddr& aRemoteAddr, 
+			        TRequestStatus& aStatus );
+
+        void SendL( const TSIPTransportParams& aParams,
+	                CSIPResponse& aResponse,
+                    TTransactionId aId,
+			        TRequestStatus& aStatus );
+
+        TInt CancelSend( TRequestStatus &aStatus );
+
+	    TInt CancelResponseSend( TTransactionId aId, TBool aCancelAlso2xxResponses );
+
+        void TcpDisconnect( const TSIPTransportParams& aParams,
+	                        const TInetAddr& aRemoteAddress );
+	                        
+	    void FreeResources( MSIPNATBindingObserver& aSIPNATBindingObserver );
+
+
+	public: // From MSIPConnectionContext
+
+		void SendToTransportL( const TSIPTransportParams& aParams,
+		                       CSIPResponse& aResponse,
+							   TTransactionId aId,
+							   TRequestStatus &aStatus );
+
+		void SendToTransportL( const TSIPTransportParams& aParams,
+		                       CSIPRequest& aRequest,
+		                       TBool aForceUDP,
+		                       const CUri8* aOutboundProxy,
+							   const TInetAddr& aAddr,
+							   TRequestStatus &aStatus );
+
+		TInt OpenConnection();
+
+		void CloseConnection();
+
+		void CreateTransportResourcesL();
+        void CreateDefaultTransportsL();
+
+		void ReleaseTransportResources( TBool aReleaseAllResources );
+		
+		TBool DoTransportResourcesExist() const;
+
+		void ResolveLocalAddress( TInetAddr& aAddress );
+
+		void StartMonitoringL( TInt aError );
+
+		void StopMonitoring();
+		
+		TBool ContinueMonitoring( TInt aError );
+		
+		TInt MonitorConnectionClosure();
+
+		void StateModelChanged( MStateModel::TState aState );
+		
+		void Destroy();
+
+		TInt ConnectionType();
+			
+				
+	public: // From MOutgoingRequestQueueContext
+	
+	    void ContinueSendToTransportL( const TSIPTransportParams& aParams,
+        		                       CSIPRequest& aRequest,
+        		                       TBool aForceUDP,
+        							   const TInetAddr& aRemoteAddr,
+        							   TUint aLocalPort,
+        							   TUint aOrigTransport,
+        							   TRequestStatus& aStatus,
+        							   TBool aPublicAddrResolved );
+        							   
+        void RequestFailed( TRequestStatus& aStatus, TInt aError );
+        
+        RSocket& GetUdpSocketL( const TSIPTransportParams& aParams, 
+                                const TInetAddr& aRemoteAddr,
+                                TUint& aLocalPort,
+                                MSocketUsagePermissionObserver* aObserver,
+                                TBool& aPermissionToUse );
+        
+        void UdpSocketFree( const TSIPTransportParams& aParams,
+                            const TInetAddr& aRemoteAddr,
+                            TUint aLocalPort,
+                            MSocketUsagePermissionObserver* aObserver,
+                            RSocket& aSocket );
+                              
+        		
+	public: // From MTransportOwner
+	
+	    void AddListenerL( const TSIPTransportParams& aParams, 
+	                       TUint aProtocol, 
+	                       TUint aPort );
+	    
+	    TInt RemoveTransport( CTransportBase* aTransport );
+
+		void ReRouteL( TUint aProtocol, 
+		               COutgoingData* aData );
+		              
+		void TcpConnected( const TInetAddr& aAddr );	
+		
+        TBool IsLocalAddr(TInetAddr& aAddr) const; 
+		
+		void GetLocalAddrL( TInetAddr& aAddr, 
+		                    const TInetAddr* aNextHop );
+
+        TBool GetLocalIPAddr( TUint aFamily, TInetAddr& aAddr );
+		                    
+		void FillWithMatchingAddrFamily( TInetAddr& aAddr, 
+		                                 const TInetAddr* aNextHop );		                    
+		
+		TUint32 IapId() const;
+
+
+	public: // New functions
+
+		CSIPConnection::TState State();
+		void SystemStarted();
+		void CellularUsageAllowed();
+		void GetByURIL( const TSIPTransportParams& aParams,
+		                const CURIContainer& aURI,
+		                RPointerArray<MSIPResolvingResult>& aResult,
+		                MSIPServerResolverObserver* aObserver );
+
+		void CancelGetByUri( MSIPServerResolverObserver* aObserver );
+		TInt GetLocalAddress( TInetAddr& aAddr );
+		TBool Match( const TDesC8& aAddress );
+		void ResetTransportsL();		
+		void CancelAllRequests( CSIPConnection::TState aReason );		
+		void IcmpError( const TInetAddr& aAddress );		
+		TBool Handle( TUint32 aIapId ) const;		
+		TInt DecreaseUserCount( const TSIPTransportParams& aParams );
+		void IncreaseUserCount();
+		void ReserveTransportL( const TSIPTransportParams& aOldTransportParams,
+		                        const TSIPTransportParams& aTransportParams,
+                                TUint aLocalSendPort,
+						        TUint aLocalReceivePort,
+			                    const TInetAddr& aRemoteAddr,
+			                    TUint aRemoteSendPort );       
+	    void ReserveTLSTransportL( TSIPTransportParams& aTransportParams );      
+	    TBool RemoveReservedTransport( TUint32 aTransportId,
+	                                   MSIPTransportRemovalObserver* aRemovalObserver,
+                                       TInt& aNumAsyncRemovals );		
+		TInt ConnectionError();
+		TInt DetermineConnectionTypeL();
+		static const TInt iConnectionOffset;
+		TSglQueLink iConnectionLink;
+
+	private:
+
+		void ConstructL();
+		CSipConnection( MTransactionFinder& aFinder,
+						MServerTaFactory& aTaFactory,
+						MTimerManager& aTimer,
+						TUint aTOne,
+						const TSIPTransportParams& aParams,
+						RSocketServ& aServer,
+						MSigCompController& aSigCompHandler,
+						MConnectionStateObserver& aTUNetStatusObserver,
+						CNetworkManager& aNetworkManager,
+						MSipConnectionOwner& aOwner,
+						CNetworkInfo& aNetworkInfo,
+						CSIPNATTraversalController& aNATTraversal );
+
+		CTransportBase* FindTransportL( const TSIPTransportParams& aParams,
+		                                CSIPMessage* aMessage, 
+		                                TTransactionId aId,
+		                                TBool aIsStrict );
+		CTransportBase* FindTransportL( const TSIPTransportParams& aParams,
+		                                CSIPMessage* aMessage,
+									    const TInetAddr& aRemoteAddr,
+									    TUint aLocalPort = 0,
+									    TBool aIsStrict = ETrue );
+	    CTransportBase* FindTransport( const TSIPTransportParams& aParams,
+                                       RStringF aProtocol,
+                                       const TInetAddr& aRemoteAddr,
+                                       TUint aLocalPort = 0,
+                                       TBool aIsStrict = ETrue );
+                                       
+		TBool IsListened( TInt aProtocol, TUint aPort );
+		void AddTransportL( CTransportBase* aTransport );
+		TBool IsInList( CTransportBase* aTransport );
+		void RemoveAllTransports();
+		TBool IsTransportUdp( CSIPMessage* aMessage );
+		TUint TransportProtocolL( CSIPMessage& aMessage );
+		
+		void AddTcpListenerL( const TSIPTransportParams& aParams, 
+		                      TUint aPort, 
+		                      TBool aIsReserved = EFalse );
+		
+		/**
+         * returns pointer to created transport, ownership is not transferred
+         */                         
+		CTransportBase* AddUdpListenerL( const TSIPTransportParams& aParams, 
+		                                 TUint aPort, 
+		                                 TBool aIsReserved = EFalse,
+		                                 TBool aOnlyForReceiving = EFalse );
+
+        void AddTcpListenerUserL( const TSIPTransportParams& aOldParams,
+                                  const TSIPTransportParams& aParams,
+                                  TUint aReceivePort );
+         
+                             
+        void AddUdpListenerUserL( const TSIPTransportParams& aOldParams,
+                                  const TSIPTransportParams& aParams,
+                                  TUint aReceivePort );
+                                  
+		void CreateConnectedTransportPointL( const TSIPTransportParams& aParams,
+                                             CSIPMessage& aMessage, 
+                                             const TInetAddr& aAddress );                                     
+		void CreateTcpTransportPointL( const TSIPTransportParams& aParams,
+		                               const TInetAddr& aAddress );
+		                               
+		void CreateTlsTransportPointL( const TSIPTransportParams& aParams,
+		                               const TInetAddr& aAddress );
+		CSender* GetSender( const TSIPTransportParams& aParams,
+		                    TUint aProtocol, 
+		                    const TInetAddr& aAddr );
+		TUint UpdateTransportIfNeededL( CSIPMessage& aMessage, 
+		                                const TSIPTransportParams& aParams,
+                                        TBool aForceUDP,
+                                        const TInetAddr& aAddr );
+		void RemoveTcpSender( CTcpResponseSender* aThis );
+		void RemoveAllTcpSender();
+		CSIPViaHeader* TopViaHeader( CSIPMessage* aMessage );
+		void SetState( MStateModel::TState aState );
+		RConnection& Connection(); 
+		void NotifyIcmpErrorL( const TInetAddr& aAddress );
+		TBool IsConnectionActive() const;
+		void UpdateURIL( CURIContainer& aURI, 
+		                 const TInetAddr& aAddress, 
+		                 TUint aProtocol ) const;
+
+	private: // Data
+
+		MTransactionFinder& iFinder;
+		MServerTaFactory& iTaFactory;
+		MConnectionStateObserver& iTUNetStatusObserver;
+		CLocalAddrResolver* iLocalAddrResolver;
+
+		MSigCompController& iSigCompHandler;
+
+		RSocketServ& iServer;
+		TSglQue<CTransportBase> iList;
+		TSglQueIter<CTransportBase> iListIter;
+		TSglQue<CTcpResponseSender> iTcpSenderList;
+		TSglQueIter<CTcpResponseSender> iTcpSenderListIter;
+		TUint iTOne;
+		CIcmpReceiver* iIcmpReceiver;
+		CSIPServerResolver* iServerResolver;
+		TInt iUserCount;
+
+		CNetworkManager& iNetworkManager;
+		CConnectionContainer* iConnection;
+		CStateModel* iStateModel;
+		MTimerManager& iTimer;
+		MSipConnectionOwner& iOwner;
+		TUint32 iIapId;
+		CSIPConnection::TState iState;
+		
+		COwnerSettingsList* iSettingsList;
+		
+		COutgoingRequestQueue* iRequestQueue;
+		
+		CNetworkInfo& iNetworkInfo;
+		
+		CSIPNATTraversalController& iNATTraversal;
+
+		TBool iWaitingForDataUsage;
+
+		friend class CTcpResponseSender;
+
+	private: // For testing purposes
+#ifdef CPPUNIT_TEST
+		friend class CSipConnectionTest;
+		friend class CSipConnectionMgrTest;
+		friend class CTcpResponseHandlerTest;
+#endif
+	};
+
+
+#endif // end of __CSipConnection_H__