realtimenetprots/sipfw/SIP/ConnectionMgr/src/CServerTransport.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name          : CServerTransport.cpp
       
    15 // Part of       : ConnectionMgr
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 #include "CServerTransport.h"
       
    23 #include "MServerTransportOwner.h"
       
    24 #include "CSender.h"
       
    25 #include "CSenderTcp.h"
       
    26 #include "CReceiverTcp.h"
       
    27 #include "sipmessage.h"
       
    28 #include "CommonConsts.h"
       
    29 #include "CSocketContainer.h"
       
    30 #include "MSIPTransportRemovalObserver.h"
       
    31 #include "siperr.h"
       
    32 #include <sipnattraversalcontroller.h>
       
    33 
       
    34 const TInt CServerTransport::iOffset = _FOFF(CServerTransport, iLink);
       
    35 
       
    36 // -----------------------------------------------------------------------------
       
    37 // CServerTransport::NewL
       
    38 // -----------------------------------------------------------------------------
       
    39 //
       
    40 CServerTransport* CServerTransport::NewL( 
       
    41     RSocketServ& aServer, 
       
    42     MServerTransportOwner& aMyOwner,
       
    43     MTimerManager& aTimer,
       
    44     TUint aTOne,
       
    45     CSIPNATTraversalController& aNATTraversal,
       
    46     COwnerSettingsList& aSettingsList )
       
    47 	{
       
    48 	CServerTransport* self = NewLC( aServer, 
       
    49 	                                aMyOwner, 
       
    50 	                                aTimer, 
       
    51 	                                aTOne, 
       
    52 	                                aNATTraversal,
       
    53 	                                aSettingsList );
       
    54 	CleanupStack::Pop( self );
       
    55 	return self;
       
    56 	}
       
    57 
       
    58 // -----------------------------------------------------------------------------
       
    59 // CServerTransport::NewLC
       
    60 // -----------------------------------------------------------------------------
       
    61 //
       
    62 CServerTransport* CServerTransport::NewLC( 
       
    63     RSocketServ& aServer, 
       
    64     MServerTransportOwner& aMyOwner,
       
    65     MTimerManager& aTimer,
       
    66     TUint aTOne,
       
    67     CSIPNATTraversalController& aNATTraversal,
       
    68     COwnerSettingsList& aSettingsList )
       
    69 	{
       
    70 	CServerTransport* self = new (ELeave) CServerTransport( aMyOwner, 
       
    71 	                                                        aTimer, 
       
    72 	                                                        aNATTraversal,
       
    73 	                                                        aSettingsList );
       
    74 	CleanupStack::PushL( self );
       
    75 	self->ConstructL( aServer, aTOne );
       
    76 	return self;
       
    77 	}
       
    78 
       
    79 // -----------------------------------------------------------------------------
       
    80 // CServerTransport::SendL
       
    81 // -----------------------------------------------------------------------------
       
    82 //
       
    83 void CServerTransport::SendL( const TSIPTransportParams& aParams,
       
    84                               CSIPMessage& aMessage, 
       
    85                               TRequestStatus &aStatus )
       
    86 	{
       
    87 	if ( iAccepted && iSender )
       
    88 		{
       
    89 		// Remember currently used tpparams
       
    90 		iTransportParams = aParams;
       
    91 		
       
    92 		iSender->SendL( aParams, aMessage, aStatus );
       
    93 		StartTimerL();
       
    94 		}
       
    95 	}
       
    96 	
       
    97 // -----------------------------------------------------------------------------
       
    98 // CServerTransport::Handle
       
    99 // -----------------------------------------------------------------------------
       
   100 //
       
   101 TBool CServerTransport::Handle( const TInetAddr& aRemoteAddr )
       
   102 	{
       
   103 	if ( iAccepted )
       
   104 		{
       
   105 		TInetAddr connect;
       
   106 		iSocket.RemoteName( connect );
       
   107 		if ( connect.CmpAddr( aRemoteAddr ) )
       
   108 			{
       
   109 			return ETrue;
       
   110 			}
       
   111 		}
       
   112 	return EFalse;
       
   113 	}
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // CServerTransport::AcceptedL
       
   117 // -----------------------------------------------------------------------------
       
   118 //
       
   119 void CServerTransport::AcceptedL()
       
   120 	{
       
   121 	__ASSERT_ALWAYS( !iSender && !iReceiver, User::Leave( KErrInUse ) );
       
   122 	
       
   123 	iSocket.RemoteName( iRemoteAddr );
       
   124 	
       
   125 	iReceiver = CReceiverTcp::NewL( *this );
       
   126 	iSender = CSenderTcp::NewL( *this, iSettingsList );
       
   127 
       
   128 	iReceiver->ReceiveDataL();
       
   129 	iAccepted = ETrue;
       
   130 	}
       
   131 
       
   132 // -----------------------------------------------------------------------------
       
   133 // CServerTransport::TransportParams
       
   134 // -----------------------------------------------------------------------------
       
   135 //	
       
   136 TSIPTransportParams& CServerTransport::TransportParams()
       
   137     {
       
   138     return iTransportParams;
       
   139     }
       
   140     
       
   141 // -----------------------------------------------------------------------------
       
   142 // CServerTransport::CancelAllRequests
       
   143 // -----------------------------------------------------------------------------
       
   144 //
       
   145 void CServerTransport::CancelAllRequests( TInt aReason )
       
   146 	{
       
   147 	if ( iSender )
       
   148 		{
       
   149 		iSender->CancelAllRequests( aReason );
       
   150 		}
       
   151 	}
       
   152 
       
   153 // -----------------------------------------------------------------------------
       
   154 // CServerTransport::Sender
       
   155 // -----------------------------------------------------------------------------
       
   156 //	
       
   157 CSender* CServerTransport::Sender() 
       
   158     { 
       
   159     return iSender; 
       
   160     }
       
   161 
       
   162 // -----------------------------------------------------------------------------
       
   163 // CServerTransport::SetPersistency
       
   164 // -----------------------------------------------------------------------------
       
   165 //   
       
   166 void CServerTransport::SetPersistency( TBool aIsPersistent )
       
   167     {
       
   168     iIsPersistent = aIsPersistent;
       
   169     }
       
   170 
       
   171 // -----------------------------------------------------------------------------
       
   172 // CServerTransport::IsPersistent
       
   173 // -----------------------------------------------------------------------------
       
   174 //     
       
   175 TBool CServerTransport::IsPersistent() const
       
   176     {
       
   177     return iIsPersistent;
       
   178     }
       
   179 
       
   180 // -----------------------------------------------------------------------------
       
   181 // CServerTransport::InformSendingStatus
       
   182 // -----------------------------------------------------------------------------
       
   183 //     
       
   184 void CServerTransport::InformSendingStatus()
       
   185     {
       
   186     iNATTraversal.SocketIdle( !iIsSending, iSocket );
       
   187     }
       
   188 
       
   189 // -----------------------------------------------------------------------------
       
   190 // CServerTransport::Removal
       
   191 // -----------------------------------------------------------------------------
       
   192 //    
       
   193 TBool CServerTransport::Removal( MSIPNATBindingObserver& aBindingObserver )
       
   194     {
       
   195     return ( iTransportParams.NATBindingObserver() == &aBindingObserver &&
       
   196              IsPersistent() &&
       
   197              !iMyOwner.IsReservedTransportOwner() );
       
   198     }
       
   199 
       
   200 // -----------------------------------------------------------------------------
       
   201 // CServerTransport::Shutdown
       
   202 // -----------------------------------------------------------------------------
       
   203 //	     
       
   204 TBool CServerTransport::Shutdown( 
       
   205     MSIPTransportRemovalObserver* aRemovalObserver )
       
   206     {
       
   207     if ( iSender && iReceiver && aRemovalObserver )
       
   208         {
       
   209         SetShutdownObserver( aRemovalObserver );
       
   210         iReceiver->Cancel();
       
   211     	iSender->Cancel();
       
   212         iReceiver->Shutdown();
       
   213         return ETrue;
       
   214         }
       
   215         
       
   216     return EFalse;
       
   217     }
       
   218     
       
   219 // -----------------------------------------------------------------------------
       
   220 // CServerTransport::TimerExpiredL
       
   221 // -----------------------------------------------------------------------------
       
   222 //
       
   223 void CServerTransport::TimerExpiredL( TTimerId /*aTimerId*/,
       
   224 									  TAny* /*aTimerParam*/ )
       
   225 	{
       
   226 	// Reserved transport uses persistent tcp connection and therefore
       
   227 	// only send operations are cleared when timer expires
       
   228 	if ( iMyOwner.IsReservedTransportOwner() || IsPersistent() )
       
   229 	    {
       
   230 	    CancelAllRequests( KErrSIPTransportFailure );
       
   231 	    }
       
   232 	else
       
   233 	    {    
       
   234 	    RemoveL();
       
   235 	    }
       
   236 	}
       
   237 
       
   238 // -----------------------------------------------------------------------------
       
   239 // CServerTransport::SocketContainer
       
   240 // -----------------------------------------------------------------------------
       
   241 //
       
   242 CSocketContainer& CServerTransport::SocketContainer() 
       
   243     {
       
   244     return *iSocketContainer;
       
   245     }
       
   246 // -----------------------------------------------------------------------------
       
   247 // CServerTransport::SocketContainer
       
   248 // -----------------------------------------------------------------------------
       
   249 //
       
   250 CSocketContainer* CServerTransport::SocketContainer(
       
   251     TUint /*aIPAddrFamily*/) 
       
   252     {
       
   253     return iSocketContainer;
       
   254     }
       
   255     
       
   256 // -----------------------------------------------------------------------------
       
   257 // CServerTransport::ReceivedDataL
       
   258 // -----------------------------------------------------------------------------
       
   259 //
       
   260 void CServerTransport::ReceivedDataL( CSIPMessage* aMessage,
       
   261 									  const TInetAddr& aRemoteAddr,
       
   262 									  TInt aError,
       
   263 									  TBool aCompressed )
       
   264 	{
       
   265 	// As starting timer can leave, do it before passing ownership of aMessage
       
   266 	StartTimerL();
       
   267 	iMyOwner.ReceiveL( aMessage, aRemoteAddr, aError, aCompressed );
       
   268 	}
       
   269 
       
   270 // -----------------------------------------------------------------------------
       
   271 // CServerTransport::CancelSend
       
   272 // -----------------------------------------------------------------------------
       
   273 //
       
   274 TBool CServerTransport::CancelSend( TRequestStatus& aStatus )
       
   275 	{
       
   276 	if ( iSender )
       
   277 		{
       
   278 		return iSender->FindAndCancel( aStatus );
       
   279 		}
       
   280 	return EFalse;
       
   281 	}
       
   282 
       
   283 // -----------------------------------------------------------------------------
       
   284 // CServerTransport::Remove
       
   285 // Timer will remove this CServerTransport asynchronously
       
   286 // -----------------------------------------------------------------------------
       
   287 //
       
   288 TInt CServerTransport::Remove()
       
   289 	{
       
   290 	TRAP_IGNORE( StartTimerL() )
       
   291 	return KErrNone;
       
   292 	}
       
   293 
       
   294 // -----------------------------------------------------------------------------
       
   295 // CServerTransport::StartTimerL
       
   296 // As starting new timer may fail, do it before stopping old timer
       
   297 // -----------------------------------------------------------------------------
       
   298 //
       
   299 void CServerTransport::StartTimerL()
       
   300 	{
       
   301 	TTimerId timerId = iTimer.StartL( this, iTimerValue );
       
   302 	StopTimer();
       
   303 	iTimerId = timerId;
       
   304 	}
       
   305 
       
   306 // -----------------------------------------------------------------------------
       
   307 // CServerTransport::StopTimer
       
   308 // -----------------------------------------------------------------------------
       
   309 //
       
   310 void CServerTransport::StopTimer()
       
   311     {
       
   312     iTimer.Stop( iTimerId );
       
   313     }
       
   314 
       
   315 // -----------------------------------------------------------------------------
       
   316 // CServerTransport::ReRouteL
       
   317 // -----------------------------------------------------------------------------
       
   318 //
       
   319 void CServerTransport::ReRouteL( TUint /*aProtocol*/, 
       
   320                                  COutgoingData* /*aData*/ )
       
   321 	{
       
   322 	}
       
   323 
       
   324 // -----------------------------------------------------------------------------
       
   325 // CServerTransport::DisconnectedL
       
   326 // -----------------------------------------------------------------------------
       
   327 //
       
   328 TBool CServerTransport::DisconnectedL()
       
   329 	{
       
   330 	__ASSERT_ALWAYS( iReceiver && iSender, User::Leave( KErrNotFound ) );
       
   331 	
       
   332 	iReceiver->Cancel();
       
   333 	iSender->Cancel();
       
   334 	COutgoingData* data( NULL );
       
   335 	while ( ( data = iSender->Data() ) != 0 )
       
   336 		{
       
   337 		if ( !data->Message().IsRequest() )
       
   338 			{
       
   339 			CleanupStack::PushL( data );
       
   340 			iMyOwner.ReRouteL( data );
       
   341 			CleanupStack::Pop( data );
       
   342 			}
       
   343 		else
       
   344 			{
       
   345 			TRequestStatus* stat = data->Status();
       
   346 			User::RequestComplete( stat, KErrCouldNotConnect );
       
   347 			delete data;
       
   348 			}
       
   349 		}
       
   350 		
       
   351 	RemoveL();
       
   352 	
       
   353 	return ETrue;
       
   354 	}
       
   355 
       
   356 // -----------------------------------------------------------------------------
       
   357 // CServerTransport::SigCompHandler
       
   358 // -----------------------------------------------------------------------------
       
   359 //
       
   360 MSigCompController* CServerTransport::SigCompHandler()
       
   361 	{
       
   362 	return iMyOwner.SigCompHandler();
       
   363 	}
       
   364 
       
   365 // -----------------------------------------------------------------------------
       
   366 // CServerTransport::IapId
       
   367 // -----------------------------------------------------------------------------
       
   368 //
       
   369 TUint32 CServerTransport::IapId()
       
   370 	{
       
   371 	return iMyOwner.IapId();
       
   372 	}
       
   373 	
       
   374 // -----------------------------------------------------------------------------
       
   375 // CServerTransport::Sending
       
   376 // -----------------------------------------------------------------------------
       
   377 //
       
   378 void CServerTransport::Sending( TBool aIsSending )
       
   379     {    
       
   380     iIsSending = aIsSending;
       
   381     iNATTraversal.SocketIdle( !iIsSending, iSocket );
       
   382     }
       
   383     
       
   384 // -----------------------------------------------------------------------------
       
   385 // CServerTransport::SetShutdownObserver
       
   386 // -----------------------------------------------------------------------------
       
   387 //
       
   388 void CServerTransport::SetShutdownObserver( 
       
   389     MSIPTransportRemovalObserver* aRemovalObserver )
       
   390     {
       
   391     iShutdownObserver = aRemovalObserver;
       
   392     }
       
   393     
       
   394 // -----------------------------------------------------------------------------
       
   395 // CServerTransport::HandleShutdownCompletion
       
   396 // -----------------------------------------------------------------------------
       
   397 //     
       
   398 void CServerTransport::HandleShutdownCompletion()
       
   399     {
       
   400     if ( iShutdownObserver )
       
   401         {
       
   402         iShutdownObserver->RemovalCompleted( iTransportParams.TransportId() );
       
   403         iShutdownObserver = 0;
       
   404         }
       
   405     }
       
   406 
       
   407 // -----------------------------------------------------------------------------
       
   408 // CServerTransport::RemoveL
       
   409 // -----------------------------------------------------------------------------
       
   410 //    
       
   411 void CServerTransport::RemoveL()
       
   412     {
       
   413     MSIPTransportRemovalObserver* shutdownObserver = iShutdownObserver;
       
   414     iShutdownObserver = 0;
       
   415 	iMyOwner.RemoveL( this, iRemoteAddr, shutdownObserver );
       
   416     }
       
   417     
       
   418 // -----------------------------------------------------------------------------
       
   419 // CServerTransport::~CServerTransport
       
   420 // -----------------------------------------------------------------------------
       
   421 //
       
   422 CServerTransport::~CServerTransport()
       
   423 	{
       
   424 	HandleShutdownCompletion();
       
   425 	StopTimer();
       
   426 	delete iReceiver;
       
   427     delete iSender;
       
   428     delete iSocketContainer;
       
   429 	iSocket.Close();
       
   430 	}
       
   431 
       
   432 // -----------------------------------------------------------------------------
       
   433 // CServerTransport::CServerTransport
       
   434 // -----------------------------------------------------------------------------
       
   435 //
       
   436 CServerTransport::CServerTransport( 
       
   437 	MServerTransportOwner& aMyOwner,
       
   438     MTimerManager& aTimer,
       
   439     CSIPNATTraversalController& aNATTraversal,
       
   440     COwnerSettingsList& aSettingsList ) :
       
   441     iMyOwner( aMyOwner ),
       
   442     iTimer( aTimer ),
       
   443     iNATTraversal( aNATTraversal ),
       
   444     iSettingsList( aSettingsList ),
       
   445     iTransportParams( KDefaultOwnerId, iMyOwner.IapId() ),
       
   446     iIsPersistent( EFalse ),
       
   447     iIsSending( EFalse ),
       
   448     iShutdownObserver( 0 )
       
   449 	{
       
   450 	}
       
   451 
       
   452 // -----------------------------------------------------------------------------
       
   453 // CServerTransport::ConstructL
       
   454 // -----------------------------------------------------------------------------
       
   455 //
       
   456 void CServerTransport::ConstructL( RSocketServ& aServer, TUint aTOne )
       
   457 	{
       
   458 	iTimerValue = ( 64 * aTOne );
       
   459 	iAccepted = EFalse;
       
   460 	User::LeaveIfError( iSocket.Open( aServer ) );
       
   461 	iSocketContainer = CSocketContainer::NewL( iSocket );
       
   462 	}