--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CSipConnectionMgr.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,865 @@
+// Copyright (c) 2003-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 : CSipConnectionMgr.cpp
+// Part of : ConnectionMgr
+// Version : SIP/4.0
+//
+
+
+
+#include "CSipConnectionMgr.h"
+#include "CSipConnection.h"
+#include "MTransactionFinder.h"
+#include "Lwtimer.h"
+#include "SipLogs.h"
+#include "CleanupResetAndDestroy.h"
+#include "sipsigcomphandler.h"
+#include "sipsigcompnotintegrated.h"
+#include "CNetworkManager.h"
+#include "TSIPTransportParams.h"
+#include "sipsigcomphandlerinitparams.h"
+#include "NetworkInfo.h"
+#include "CNATTraversalNotIntegrated.h"
+#include "SipAssert.h"
+#include "cellulardatausagemonitor.h"
+#include <sipnattraversalcontroller.h>
+#include <sipnattraversalcontrollerinitparams.h>
+#include <sipsystemstatemonitor.h>
+
+const TUint KSIPMessageSlots = 32;
+
+const TInt CSipConnection::iConnectionOffset =
+ _FOFF(CSipConnection, iConnectionLink);
+
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::NewL
+// -----------------------------------------------------------------------------
+//
+CSipConnectionMgr* CSipConnectionMgr::NewL( MTransactionFinder& aFinder,
+ MServerTaFactory& aTaFactory, MTimerManager& aTimer, TUint aTOne,
+ MConnectionStateObserver& aNetworkObserver )
+ {
+ CSipConnectionMgr* self = NewLC( aFinder, aTaFactory, aTimer,
+ aTOne, aNetworkObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::NewLC
+// -----------------------------------------------------------------------------
+//
+CSipConnectionMgr* CSipConnectionMgr::NewLC( MTransactionFinder& aFinder,
+ MServerTaFactory& aTaFactory, MTimerManager& aTimer, TUint aTOne,
+ MConnectionStateObserver& aNetworkObserver )
+ {
+ CSipConnectionMgr* self =
+ new (ELeave) CSipConnectionMgr( aFinder, aTaFactory,
+ aTimer, aTOne, aNetworkObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CSipConnectionMgr
+// -----------------------------------------------------------------------------
+//
+CSipConnectionMgr::CSipConnectionMgr( MTransactionFinder& aFinder,
+ MServerTaFactory& aTaFactory, MTimerManager& aTimer, TUint aTOne,
+ MConnectionStateObserver& aNetworkObserver ) :
+ iFinder( &aFinder ), iTaFactory( &aTaFactory ),
+ iTimer( &aTimer ), iTOne( aTOne ),
+ iConnectionList( CSipConnection::iConnectionOffset ),
+ iConnectionListIter( iConnectionList )
+ {
+ iTUNetStatusObserver = &aNetworkObserver;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::ConstructL()
+ {
+ User::LeaveIfError( iSocketServ.Connect( KSIPMessageSlots ) );
+ iNetworkManager = CNetworkManager::NewL();
+ iNetworkInfo = CNetworkInfo::NewL(*iNetworkManager);
+ LoadSigCompL();
+ LoadNATTraversalL();
+ LoadSystemStateMonitorL();
+ iCellularDataUsageMonitor = CSipCellularDataUsageMonitor::NewL(*this);
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::~CSipConnectionMgr
+// -----------------------------------------------------------------------------
+//
+CSipConnectionMgr::~CSipConnectionMgr()
+ {
+ RemoveAllConnections();
+ iSocketServ.Close();
+ delete iSigCompController;
+ delete iNATTraversal;
+ delete iSystemStateMonitor;
+ delete iCellularDataUsageMonitor;
+ //Must delete iNetworkInfo before iNetworkManager
+ delete iNetworkInfo;
+ delete iNetworkManager;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::OpenL
+// -----------------------------------------------------------------------------
+//
+CSIPConnection::TState CSipConnectionMgr::OpenL(
+ const TSIPTransportParams& aParams)
+ {
+ TUint32 iapId = aParams.IapId();
+
+ __ASSERT_ALWAYS( iapId > 0, User::Leave(KErrBadName) );
+
+ CSipConnection* connection = 0;
+ if ( ConnectionExists( iapId ) )
+ {
+ connection = Connection( iapId );
+ }
+ else
+ {
+ connection = CreateNewConnectionL( aParams );
+ }
+ connection->IncreaseUserCount();
+ return connection->State();
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::IsOpen
+// -----------------------------------------------------------------------------
+//
+TBool CSipConnectionMgr::IsOpen( const TSIPTransportParams& aParams )
+ {
+ return ConnectionExists( aParams.IapId() );
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::Close
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::Close( const TSIPTransportParams& aParams )
+ {
+ TUint32 iapId = aParams.IapId();
+
+ if ( ConnectionExists( iapId ) )
+ {
+ if ( Connection( iapId )->DecreaseUserCount( aParams ) == 0 )
+ {
+ RemoveConnection( iapId );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::SetOptL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::SetOptL(
+ const TSIPTransportParams& aParams,
+ TUint aOptionName,
+ TUint aOptionLevel,
+ const TDesC8& aOption )
+ {
+ __ASSERT_ALWAYS( aParams.OwnerId() > 0, User::Leave( KErrArgument ) );
+ TUint32 iapId = aParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ Connection( iapId )->SetOptL(
+ aParams, aOptionName, aOptionLevel, aOption );
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::SetOptL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::SetOptL(
+ const TSIPTransportParams& aParams,
+ TUint aOptionName,
+ TUint aOptionLevel,
+ TInt aOption )
+ {
+ __ASSERT_ALWAYS( aParams.OwnerId() > 0, User::Leave( KErrArgument ) );
+ TUint32 iapId = aParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ Connection( iapId )->SetOptL(
+ aParams, aOptionName, aOptionLevel, aOption );
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::SendL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::SendL(
+ const TSIPTransportParams& aParams,
+ CSIPRequest& aRequest,
+ TBool aForceUDP,
+ const CUri8* aOutboundProxy,
+ const TInetAddr& aRemoteAddr,
+ TRequestStatus& aStatus )
+ {
+ TUint32 iapId = aParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ Connection( iapId )->SendL( aParams,
+ aRequest,
+ aForceUDP,
+ aOutboundProxy,
+ aRemoteAddr,
+ aStatus );
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::SendL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::SendL(
+ const TSIPTransportParams& aParams,
+ CSIPResponse& aResponse,
+ TTransactionId aId,
+ TRequestStatus& aStatus )
+ {
+ TUint32 iapId = aParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ Connection( iapId )->SendL( aParams, aResponse, aId, aStatus );
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CancelSend
+// -----------------------------------------------------------------------------
+//
+TInt CSipConnectionMgr::CancelSend( TRequestStatus &aStatus )
+ {
+ CSipConnection* connection = 0;
+ TInt ret( KErrNotFound );
+ iConnectionListIter.SetToFirst();
+ while ( ( connection = iConnectionListIter++ ) != 0 &&
+ ( ret == KErrNotFound ) )
+ {
+ ret = connection->CancelSend( aStatus );
+ }
+ return ret;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CancelResponseSend
+// -----------------------------------------------------------------------------
+//
+TInt CSipConnectionMgr::CancelResponseSend(
+ TTransactionId aId,
+ TBool aCancelAlso2xxResponses )
+ {
+ CSipConnection* connection = 0;
+ TInt ret( KErrNotFound );
+ iConnectionListIter.SetToFirst();
+ while ( ( connection = iConnectionListIter++ ) != 0 &&
+ ( ret == KErrNotFound ) )
+ {
+ ret = connection->CancelResponseSend( aId, aCancelAlso2xxResponses );
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::TcpDisconnect
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::TcpDisconnect(
+ const TSIPTransportParams& aParams,
+ const TInetAddr& aRemoteAddress )
+ {
+ TUint32 iapId = aParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ Connection( iapId )->TcpDisconnect( aParams, aRemoteAddress );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::FreeResources
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::FreeResources(
+ MSIPNATBindingObserver& aSIPNATBindingObserver )
+ {
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ while ( (connection = iConnectionListIter++) != 0 )
+ {
+ connection->FreeResources( aSIPNATBindingObserver );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::GetByURIL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::GetByURIL(
+ const CURIContainer& aURI,
+ RPointerArray<MSIPResolvingResult>& aResult,
+ const TSIPTransportParams& aParams,
+ MSIPServerResolverObserver* aObserver )
+ {
+ TUint32 iapId = aParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ Connection( iapId )->GetByURIL( aParams, aURI, aResult, aObserver );
+ }
+ else
+ {
+ User::Leave( KErrNotReady );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CancelGetByUri
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::CancelGetByUri(
+ MSIPServerResolverObserver* aObserver )
+ {
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ while ( (connection = iConnectionListIter++) != 0 )
+ {
+ connection->CancelGetByUri( aObserver );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::IsSupported
+// -----------------------------------------------------------------------------
+//
+TBool CSipConnectionMgr::IsSupported() const
+ {
+ return iSigCompController->IsSupported();
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CreateCompartmentL
+// -----------------------------------------------------------------------------
+//
+TUint32 CSipConnectionMgr::CreateCompartmentL(
+ TUint32 aIapId )
+ {
+ __ASSERT_ALWAYS( iSigCompController->IsSupported(),
+ User::Leave( KErrNotSupported ) );
+
+ return iSigCompController->CreateCompartmentL( aIapId );
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::RemoveCompartment
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::RemoveCompartment( TUint32 aCompartmentId )
+ {
+ if ( iSigCompController->IsSupported() )
+ {
+ iSigCompController->RemoveCompartment( aCompartmentId );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CompartmentCount
+// -----------------------------------------------------------------------------
+//
+TInt CSipConnectionMgr::CompartmentCount()
+ {
+ return iSigCompController->CompartmentCount();
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::SendFailedL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::SendFailedL( TUint32 aCompartmentId )
+ {
+ iSigCompController->SendFailedL( aCompartmentId );
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::Match
+// -----------------------------------------------------------------------------
+//
+TBool CSipConnectionMgr::Match( const TDesC8& aAddress )
+ {
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ while ( ( connection = iConnectionListIter++ ) != 0 )
+ {
+ if ( connection->Match( aAddress ) )
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::IsSystemStarted
+// -----------------------------------------------------------------------------
+//
+TBool CSipConnectionMgr::IsSystemStarted() const
+ {
+ return ( iSystemState == CSipSystemStateMonitor::ESystemReady );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::Destroy
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::Destroy( TUint32 aIapId )
+ {
+ RemoveConnection( aIapId );
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::IsCellularDataUsageAllowed
+// -----------------------------------------------------------------------------
+//
+
+TBool CSipConnectionMgr:: IsCellularDataUsageAllowed() const
+{
+
+TBool val = (MSipCellularDataUsageObserver::EDataUsageAllowed == iCellularDataUsageMonitor->CellularUsageStatus());
+__SIP_INT_LOG1( "CSipConnectionMgr::IsCellularDataUsageAllowed, return value", val )
+ return val;
+}
+
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::ReserveTransportL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::ReserveTransportL(
+ TSIPTransportParams& aTransportParams,
+ TUint aLocalSendPort,
+ TUint aLocalReceivePort,
+ const TInetAddr& aRemoteAddr,
+ TUint aRemoteSendPort )
+ {
+ TUint32 iapId = aTransportParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ // Old transport params are possibly used (if tp id is not default)
+ // for mapping two related transports together. This is for the IPSec
+ // need where two records are sharing the same listening port
+ TSIPTransportParams oldTransportParams( aTransportParams );
+
+ aTransportParams.SetTransportId( CreateTransportId() );
+
+ CSipConnection* con = Connection( iapId );
+ TRAPD( err, con->ReserveTransportL( oldTransportParams,
+ aTransportParams,
+ aLocalSendPort,
+ aLocalReceivePort,
+ aRemoteAddr,
+ aRemoteSendPort ) );
+ if ( err )
+ {
+ TInt ignored( 0 );
+ con->RemoveReservedTransport( aTransportParams.TransportId(),
+ 0,
+ ignored );
+ User::Leave( err );
+ }
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CreateTLSTransportL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::CreateTLSTransportL(
+ TSIPTransportParams& aTransportParams )
+ {
+ TUint32 iapId = aTransportParams.IapId();
+ if ( ConnectionExists( iapId ) )
+ {
+ aTransportParams.SetTransportId( CreateTransportId() );
+
+ CSipConnection* con = Connection( iapId );
+ TRAPD( err, con->ReserveTLSTransportL( aTransportParams ) );
+ if ( err )
+ {
+ TInt ignored( 0 );
+ con->RemoveReservedTransport( aTransportParams.TransportId(),
+ 0,
+ ignored );
+ User::Leave( err );
+ }
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::RemoveTransport
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::RemoveTransport( TUint32 aTransportId )
+ {
+ RemoveTransport( aTransportId, 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::RemoveTransport
+// -----------------------------------------------------------------------------
+//
+TInt CSipConnectionMgr::RemoveTransport(
+ TUint32 aTransportId,
+ MSIPTransportRemovalObserver* aRemovalObserver )
+ {
+ TInt numAsyncRemovals( 0 );
+
+ if ( aTransportId == 0 )
+ {
+ return numAsyncRemovals;
+ }
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ TBool removed( EFalse );
+ while ( ( connection = iConnectionListIter++ ) != 0 && !removed )
+ {
+ removed = connection->RemoveReservedTransport( aTransportId,
+ aRemovalObserver,
+ numAsyncRemovals );
+ }
+ return numAsyncRemovals;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::GetLocalAddress
+// -----------------------------------------------------------------------------
+//
+TInt CSipConnectionMgr::GetLocalAddress( TUint32 aIapId, TInetAddr& aAddr )
+ {
+ if ( ConnectionExists( aIapId ) )
+ {
+ return Connection( aIapId )->GetLocalAddress( aAddr );
+ }
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::SystemVariableUpdated
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::SystemVariableUpdated(
+ CSipSystemStateMonitor::TSystemVariable aVariable,
+ TInt /*aObjectId*/,
+ TInt aValue )
+ {
+ __SIP_INT_LOG1( "CSipConnectionMgr::SystemVariableUpdated variable",
+ aVariable )
+
+ __SIP_INT_LOG1( "CSipConnectionMgr::SystemVariableUpdated value",
+ aValue )
+
+ if ( aVariable == CSipSystemStateMonitor::ESystemState &&
+ aValue == CSipSystemStateMonitor::ESystemReady &&
+ iSystemState != CSipSystemStateMonitor::ESystemReady )
+ {
+ iSystemState = CSipSystemStateMonitor::ESystemReady;
+
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ while ( ( connection = iConnectionListIter++ ) != 0 )
+ {
+ connection->SystemStarted();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CellularDataUsageChangedL
+// -----------------------------------------------------------------------------
+//
+
+ void CSipConnectionMgr::CellularDataUsageChangedL(MSipCellularDataUsageObserver::TCellularDataUsageStatus aStatus)
+ {
+ //First the Status must be retrived from the Monitor.
+ //Then, if the Status is to be allowed only then the below code must execute.
+ // Status check must typically happen by using CSipCellularDataUsageMonitor::CellularUsageStatus()
+ // and the value must be EDataUsageAllowed.
+ if(MSipCellularDataUsageObserver::EDataUsageAllowed == aStatus)
+ {
+ __SIP_LOG( "CSipConnectionMgr::CellularDataUsageChangedL(), Notified with CellularUsage Allowed" )
+
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ while ( ( connection = iConnectionListIter++ ) != 0 )
+ {
+ connection->CellularUsageAllowed();
+ }
+ }
+ }
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CreateNewConnectionL
+// -----------------------------------------------------------------------------
+//
+CSipConnection* CSipConnectionMgr::CreateNewConnectionL(
+ const TSIPTransportParams& aParams )
+ {
+ CSipConnection* connection =
+ CSipConnection::NewLC( *iFinder, *iTaFactory, *iTimer, iTOne,
+ aParams, iSocketServ, *iSigCompController,
+ *iTUNetStatusObserver, *iNetworkManager, *this,
+ *iNetworkInfo, *iNATTraversal );
+ CleanupStack::Pop( connection );
+ iConnectionList.AddLast( *connection );
+ return connection;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::RemoveConnection
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::RemoveConnection( TUint32 aIapId )
+ {
+ CSipConnection* connection = Connection( aIapId );
+ if ( connection )
+ {
+ iConnectionList.Remove( *connection );
+ delete connection;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::ConnectionExists
+// -----------------------------------------------------------------------------
+//
+TBool CSipConnectionMgr::ConnectionExists( TUint32 aIapId )
+ {
+ return Connection( aIapId ) != 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::Connection
+// -----------------------------------------------------------------------------
+//
+CSipConnection* CSipConnectionMgr::Connection( TUint32 aIapId )
+ {
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ while ( ( connection = iConnectionListIter++ ) != 0 )
+ {
+ if ( connection->Handle( aIapId ) )
+ {
+ return connection;
+ }
+ }
+ return NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::RemoveAllConnections
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::RemoveAllConnections()
+ {
+ CSipConnection* connection = 0;
+ iConnectionListIter.SetToFirst();
+ while ( ( connection = iConnectionListIter++ ) != 0 )
+ {
+ iConnectionList.Remove( *connection );
+ delete connection;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::CreateTransportId
+// -----------------------------------------------------------------------------
+//
+TUint32 CSipConnectionMgr::CreateTransportId()
+ {
+ if ( iTransportIdCounter < KMaxTUint32 )
+ {
+ iTransportIdCounter++;
+ }
+ else
+ {
+ iTransportIdCounter = 1;
+ }
+ return iTransportIdCounter;
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::LoadSigCompL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::LoadSigCompL()
+ {
+ TEComResolverParams resolverParams;
+ RImplInfoPtrArray infoArray;
+ REComSession::ListImplementationsL( KSIPSigCompInterfaceUid,
+ infoArray );
+ CleanupResetAndDestroyPushL( infoArray );
+
+ if ( infoArray.Count() > 0 && infoArray[ 0 ] )
+ {
+ CImplementationInformation& info = *( infoArray[ 0 ] );
+ TSIPSigCompHandlerInitParams initparam( *this );
+ resolverParams.SetDataType( info.DataType() );
+
+ iSigCompController =
+ reinterpret_cast< CSigCompHandler* >(
+ REComSession::CreateImplementationL(
+ KSIPSigCompInterfaceUid,
+ _FOFF(CSigCompHandler,iInstanceKey),
+ &initparam,
+ resolverParams ) );
+
+ __SIP_DES8_LOG( "SigComp plugin loaded", info.DataType() )
+ }
+ else
+ {
+ iSigCompController = CSigCompNotIntegrated::NewL();
+ __SIP_LOG( "SigComp plugin not loaded" )
+ }
+
+ CleanupStack::PopAndDestroy( 1 ); // infoArray
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::LoadNATTraversalL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::LoadNATTraversalL()
+ {
+ TEComResolverParams resolverParams;
+ RImplInfoPtrArray infoArray;
+ REComSession::ListImplementationsL( KSIPNATTraversalControllerIFUid,
+ infoArray );
+ CleanupResetAndDestroyPushL( infoArray );
+
+ if ( infoArray.Count() > 0 && infoArray[ 0 ] )
+ {
+ CImplementationInformation& info = *( infoArray[ 0 ] );
+ resolverParams.SetDataType( info.DataType() );
+ TSIPNATTraversalControllerInitParams initParams( iSocketServ );
+
+ iNATTraversal =
+ reinterpret_cast< CSIPNATTraversalController* >(
+ REComSession::CreateImplementationL(
+ KSIPNATTraversalControllerIFUid,
+ _FOFF( CSIPNATTraversalController, iInstanceKey ),
+ &initParams,
+ resolverParams ) );
+
+ __SIP_DES8_LOG( "NATTraversal plugin loaded", info.DataType() )
+ }
+ else
+ {
+ iNATTraversal = CNATTraversalNotIntegrated::NewL();
+ __SIP_LOG( "NATTraversal plugin not loaded" )
+ }
+
+ CleanupStack::PopAndDestroy( 1 ); // infoArray
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::LoadSystemStateMonitorL
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::LoadSystemStateMonitorL()
+ {
+ __ASSERT_ALWAYS( !iSystemStateMonitor, User::Leave( KErrAlreadyExists ) );
+
+ RImplInfoPtrArray infoArray;
+ REComSession::ListImplementationsL( KSipSystemStateMonitorIfUid,
+ infoArray );
+
+ if ( infoArray.Count() > 0 && infoArray[0] )
+ {
+ // Create a specific plugin with its UID
+ iSystemStateMonitor = reinterpret_cast<CSipSystemStateMonitor*>(
+ REComSession::CreateImplementationL(
+ infoArray[0]->ImplementationUid(),
+ _FOFF(CSipSystemStateMonitor, iInstanceKey ) ) );
+ __SIP_LOG( "System State Monitor loaded" )
+ iSystemStateMonitor->StartMonitoringL(
+ CSipSystemStateMonitor::ESystemState, 0, *this );
+ iSystemState = iSystemStateMonitor->State();
+
+ __SIP_INT_LOG1( "Current system state", iSystemState )
+ }
+ else
+ {
+ __SIP_LOG( "System State Monitor not loaded" )
+
+ iSystemState = CSipSystemStateMonitor::ESystemReady;
+ }
+ infoArray.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::RefreshConnection
+// -----------------------------------------------------------------------------
+//
+void CSipConnectionMgr::RefreshConnectionL(TUint32 aIapId)
+ {
+ iNetworkManager->RefreshConnectionL(aIapId);
+ }
+
+// -----------------------------------------------------------------------------
+// CSipConnectionMgr::ConnectionErrorL
+// -----------------------------------------------------------------------------
+//
+TInt CSipConnectionMgr::ConnectionErrorL(TUint32 aIapId)
+ {
+ CSipConnection* conn = Connection(aIapId);
+ __SIP_ASSERT_LEAVE(conn, KErrNotFound);
+ return conn->ConnectionError();
+ }
+// End of file