diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/ConnectionMgr/inc/CTransport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/inc/CTransport.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,298 @@ +/* +* Copyright (c) 2002-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 : CTransport.h +* Part of : ConnectionMgr +* Version : SIP/4.0 +* +*/ + + + + +/** + @internalComponent +*/ + +#ifndef __CTRANSPORT_H__ +#define __CTRANSPORT_H__ + +#include "CTransportBase.h" +#include "SipStackServerDefs.h" +#include "TResponseRoute.h" +#include "CSipConnectionMgr.h" + + +//SIP version +_LIT8(KDefaultSipVersion, "SIP/2.0"); +_LIT8(KDefaultProtocol, "SIP"); +_LIT8(KDefaultVersion, "2.0"); + +class MTransactionFinder; +class MServerTaFactory; +class MTransportOwner; +class CSIPServerResolver; +class CNetworkInfo; +class COwnerSettingsList; +class CSIPMessage; +class CSIPRequest; +class CSIPResponse; +class CSIPViaHeader; +class CTransportErrorHandler; +class CSIPHostPort; +class CSIPNATTraversalController; +class CSocketContainer; +class MSIPNATBindingObserver; + +class CTransport : public CTransportBase + { +public: + + virtual ~CTransport(); + +public: // From CTransportBase + + void Send( const TSIPTransportParams& aParams, + CSIPResponse& aResponse, + TTransactionId aId, + TRequestStatus &aStatus ); + void Send( const TSIPTransportParams& aParams, + CSIPResponse& aResponse, + const TInetAddr& aAddr, + TRequestStatus &aStatus ); + void Send( const TSIPTransportParams& aParams, + CSIPRequest& aRequest, + TBool aForceUDP, + const TInetAddr& aAddr, + TUint aOrigTransport, + TRequestStatus &aStatus, + TBool aPublicAddrResolved ); + + TBool HandleL( const TSIPTransportParams& aParams, + CSIPMessage* aMessage, + TTransactionId aId, + TBool aIsStrict ); + TBool HandleL( const TSIPTransportParams& aParams, + CSIPMessage* aMessage, + const TInetAddr& aAddr, + TUint aLocalPort, + TBool aIsStrict ); + + virtual TBool HandleMessage( const TSIPTransportParams& aParams, + RStringF aProtocol, + const TInetAddr& aRemoteAddr, + TUint aLocalPort, + TBool aIsStrict ) = 0; + + virtual TBool Handle( TUint32 aTransportId ); + + TBool Match( const TSIPTransportParams& aParams ); + + void GetAddrFromResponseL( const TSIPTransportParams& aParams, + CSIPMessage& aMessage, + TInetAddr& aAddr ); + TUint ProtocolType(); + TBool HasRemoteHost( const TSIPTransportParams& aParams, + const TInetAddr& aRemoteHost, + RStringF aProtocol ); + + virtual void Disconnect( const TInetAddr& /*aRemoteHost*/ ) {} + virtual void ICMPErrorL( CSipConnectionMgr::TICMPError /*aICMPError*/, + const TInetAddr& /*aSourceAddr*/ ) {} + + virtual TBool Remove( const TSIPTransportParams& aParams ); + virtual TBool Remove( TUint32 /*aTransportId*/ ) {return ETrue;} + virtual TBool Remove( MSIPNATBindingObserver& aSIPNATBindingObserver ); + + virtual TBool Shutdown( TUint32 aTransportId, + MSIPTransportRemovalObserver* aRemovalObserver ); + + virtual TBool AddUserL( const TSIPTransportParams& /*aParams*/, + TUint /*aReceivePort*/ ) {return EFalse;} + + TBool IsReservedTransport() const; + + virtual RSocket* AcquireUdpSocket( + MSocketUsagePermissionObserver* aObserver, + const TInetAddr& aRemoteAddr, + TBool& aPermissionToUse ); + + virtual void UdpSocketReleased( MSocketUsagePermissionObserver* aObserver, + RSocket& aSocket ); + + virtual TInetAddr* PersistentRemoteAddr( + MSIPNATBindingObserver* aBindingObserver ); + + +public: + + static void ConvertToInetAddrL( const TDesC8& aAddrStr, TInetAddr& aAddr ); + + static HBufC8* ConvertInetAddrToTextL( const TInetAddr& aAddr ); + + static CSIPViaHeader* TopViaHeader( CSIPMessage* aMessage ); + +protected: + + // Uses cleanupstack for aData inside method, so caller should not + // push aData to cleanupstack before calling this method + void RecvL( HBufC8* aData, + const TInetAddr& aRemoteAddr, + TBool aCompressed ); + void RecvL( CSIPMessage* aMessage, + const TInetAddr& aRemoteAddr, + TInt aParserError, + TBool aCompressed ); + CTransport( MTransactionFinder& aFinder, + MServerTaFactory& aTaFactory, + MTransportOwner& aTransportOwner, + CSIPServerResolver& aServerResolver, + MSigCompController& aSigCompHandler, + const TSIPTransportParams& aTransportParams, + CNetworkInfo& aNetworkInfo, + COwnerSettingsList& aOwnerSettingsList, + CSIPNATTraversalController& aNATTraversal ); + virtual TBool CancelResponseSend( TTransactionId aId, TBool aCancelAlso2xxResponses ); + virtual void SendToNetL( const TSIPTransportParams& aParams, + const TInetAddr& aAddress, + CSIPMessage& aMessage, + TBool aForceUDP, + TUint aOrigTransport, + TRequestStatus &aStatus ); + virtual void SendToNetL( const TSIPTransportParams& aParams, + const TInetAddr& aAddress, + TTransactionId aId, + CSIPMessage& aMessage, + TRequestStatus &aStatus ); + virtual void SendToNetL( const TSIPTransportParams& aParams, + const TInetAddr& aAddress, + CSIPMessage& aMessage, + TRequestStatus &aStatus ); + virtual TUint SourcePort() = 0; + virtual TUint Protocol() = 0; + virtual CTransportErrorHandler& ErrorHandler() = 0; + virtual CSocketContainer& GetSocketContainerL( const TInetAddr& aRemoteAddr ) = 0; + virtual void InformSendingStatus( const TInetAddr& aRemoteAddr ) = 0; + virtual void SetPersistencyL( const TInetAddr& aRemoteAddr, + TBool aIsPersistent, + MSIPNATBindingObserver* aBindingObserver ); + TBool IsPersistent() const; + TBool IsDefault() const; + void RemoveResponseRoute( const TInetAddr& aRemoteAddr ); + void RemoveResponseRoute( TTransactionId aId ); + HBufC8* LocalAddressL(); + void HandleMixedAddressFamilysL( CSIPMessage& aMessage, + const TInetAddr& aRemoteAddr ); + + MSigCompController* SigCompressionHandler() {return iSigCompHandler;} + + TBool IsConnectedTransport(); + + TBool NotifyFlowFailure(); + +protected: // Data + + MTransportOwner* iTransportOwner; + RArray iIDArray; + + // Binding observers are not owned + RPointerArray iBindingObservers; + + CSIPServerResolver* iServerResolver; + + TSIPTransportParams iTransportParams; + COwnerSettingsList& iSettingsList; + + CSIPNATTraversalController& iNATTraversal; + +private: + + void HandleClientRequestL( const TSIPTransportParams& aParams, + CSIPRequest& aRequest, + TBool aPublicAddrResolved ); + + //Obtains address from the top Via-header of aMessage, and places it + //into aAddr + void HandleClientResponseL( const TSIPTransportParams& aParams, + CSIPMessage* aMessage, + TInetAddr& aAddr ); + + TBool HandleServerResponseL( CSIPMessage* aMessage, + const TInetAddr& aAddr ); + TInt HandleServerRequestL( CSIPMessage* aMessage, + const TInetAddr& aAddr ); + + TBool MethodIsSameInCSecAndReqLine( CSIPRequest& aMessage ); + TBool AllMandatoryHeaders( CSIPMessage& aMessage ); + TBool SupportedSIPVersion( CSIPMessage& aMessage ); + TBool ContentTypeOk( CSIPMessage& aMessage ); + TBool OnlyOneViaHeader( CSIPMessage& aMessage ); + TBool CorrectProtocolInVia( CSIPMessage& aMessage ); + TInt CheckAndUpdateContentLengthL( CSIPMessage* aMessage, + const TInetAddr& aAddr ); + TBool IsAck( CSIPMessage& aMessage ); + void HandleSigCompAllowDenyL( const TInetAddr& aRemoteAddr, + TInt aParserError, + TBool aCompressed ); + void UpdateListenersL( const TSIPTransportParams& aParams, + CSIPMessage* aMessage ); + void SetReceivedIfNeededL( CSIPViaHeader* aViaHeader, TInetAddr aAddr ); + + void RouteL( CSIPMessage* aMessage, const TInetAddr& aRemoteAddr ); + + void SendErrorResponseL( TUint aResponseCode, + TInt aStrIndex, + CSIPMessage& aMessage, + const TInetAddr& aAddr ); + + void UpdateContactHeadersL( const TSIPTransportParams& aParams, + CSIPMessage* aMessage, + TBool aUpdatePorts ); + + void ChangeHostAddressFamilyIfNeededL( CSIPHostPort& aHostPort, + const TInetAddr& aRemoteAddr ); + + TBool HandleClientResponseRPortL( CSIPViaHeader& aViaHeader, TInetAddr& aAddr ); + + void HandleResponseNATTraversalL( CSIPResponse& aResponse, + const TInetAddr& aRemoteAddr, + MSIPNATBindingObserver* aBindingObserver ); + + TBool HasValue( CSIPViaHeader& aViaHeader, RStringF& aParam ); + + void AddBindingObserverL( MSIPNATBindingObserver& aBindingObserver ); + + TBool RemoveBindingObserver( MSIPNATBindingObserver& aBindingObserver ); + +private: // Data + + MTransactionFinder* iTaFinder; + MServerTaFactory* iTaFactory; + MSigCompController* iSigCompHandler; + + TTimerId iTimerId; + TUint iTime; + + //For constructing P-Access-Network-Info header + CNetworkInfo& iNetworkInfo; +private: //For testing purposes +#ifdef CPPUNIT_TEST + friend class CValidTest; + friend class CSipConnectionTest; + friend class CTransportTlsTest; +#endif + }; +#endif // end of __CTRANSPORT_H__ + +// End of File