realtimenetprots/sipfw/SIP/ConnectionMgr/src/COwnerSettings.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/COwnerSettings.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,360 @@
+// 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        : COwnerSettings.cpp
+// Part of     : ConnectionMgr
+// See class definition below.
+// Version     : SIP/4.0
+//
+
+
+
+#include <in_sock.h>
+
+#include "COwnerSettings.h"
+#include "CSocketOpt.h"
+#include "CommonConsts.h"
+   
+const TInt KSocketOptsGranularity = 2;
+const TInt KPortsGranularity = 2;
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::NewLC
+// -----------------------------------------------------------------------------
+//
+COwnerSettings* COwnerSettings::NewLC( const TSIPTransportParams& aParams )
+    {
+    COwnerSettings* self = new ( ELeave ) COwnerSettings( aParams );
+    CleanupStack::PushL( self );
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::~COwnerSettings
+// -----------------------------------------------------------------------------
+//
+COwnerSettings::~COwnerSettings()
+    {
+    delete iRemoteAddr;
+    iSocketOpts.ResetAndDestroy();
+    iOriginalOpts.ResetAndDestroy();
+    iPorts.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::COwnerSettings
+// -----------------------------------------------------------------------------
+//    
+COwnerSettings::COwnerSettings( const TSIPTransportParams& aParams ) :
+    iSocketOpts( KSocketOptsGranularity ),
+    iPorts( KPortsGranularity ),
+	iParams( aParams ),
+	iUseTLS( EFalse )
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::AddOptL
+// -----------------------------------------------------------------------------
+//
+void COwnerSettings::AddOptL(
+    TUint aOptionName,
+	TUint aOptionLevel,
+	TInt aOption )
+    {
+    CSocketOpt* sockopt = 
+                    CSocketOpt::NewLC( aOptionName, aOptionLevel, aOption );
+    AddOptL( sockopt );
+    CleanupStack::Pop( sockopt );
+    }   
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::AddOptL
+// -----------------------------------------------------------------------------
+//
+void COwnerSettings::AddOptL(
+    TUint aOptionName,
+	TUint aOptionLevel,
+	const TDesC8& aOption )
+    {
+    CSocketOpt* sockopt = 
+                    CSocketOpt::NewLC( aOptionName, aOptionLevel, aOption );
+    AddOptL( sockopt );
+    CleanupStack::Pop( sockopt );
+    }   
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::TransportParams
+// -----------------------------------------------------------------------------
+//      
+const TSIPTransportParams& COwnerSettings::TransportParams() const
+    {
+    return iParams;
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::SetOpts
+// -----------------------------------------------------------------------------
+//     
+void COwnerSettings::SetOpts( RSocket& aSocket )
+    {
+    // Clear original opts, those will be re-created while setting new options
+    iOriginalOpts.ResetAndDestroy();
+    
+    TRAP_IGNORE( SetOptsL( aSocket ) )
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::ClearOpts
+// -----------------------------------------------------------------------------
+//     
+void COwnerSettings::ClearOpts( RSocket& aSocket )
+    {
+    TRAP_IGNORE( ClearOptsL( aSocket ) )
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::RememberPortsL
+// -----------------------------------------------------------------------------
+//    
+void COwnerSettings::SaveTransportInfoL( 
+    TUint aLocalSendPort,
+    TUint aLocalReceivePort,
+    const TInetAddr& aRemoteAddr,
+    TUint aRemoteSendPort )
+    {
+    __ASSERT_ALWAYS( !iLocalSendPort && 
+                     !iLocalReceivePort && 
+                     !iRemoteAddr &&
+                     !iRemoteSendPort, 
+                     User::Leave( KErrAlreadyExists ) );
+     
+    iRemoteAddr = new ( ELeave ) TInetAddr( aRemoteAddr );                
+    iLocalSendPort = aLocalSendPort;
+    iLocalReceivePort = aLocalReceivePort;
+    iRemoteSendPort = aRemoteSendPort;
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::AddReservedPortL
+// -----------------------------------------------------------------------------
+//       
+void COwnerSettings::AddReservedPortL( TUint aPort )
+    {
+    // Don't allow duplicates in the array, however in such situation no need
+    // to leave
+    TInt err = iPorts.InsertInOrder( aPort );
+    if ( err && err != KErrAlreadyExists )
+        {
+        User::Leave( err );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::IsUnreservedPort
+// -----------------------------------------------------------------------------
+//    
+TBool COwnerSettings::IsUnreservedPort( TUint aPort ) const
+    {
+    TInt count = iPorts.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        if ( iPorts[ i ] == aPort )
+            {
+            return EFalse;
+            }
+        }
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::IsOpts
+// -----------------------------------------------------------------------------
+//      
+TBool COwnerSettings::IsOpts() const
+    {
+    return ( iSocketOpts.Count() > 0 );
+    }
+ 
+// -----------------------------------------------------------------------------
+// COwnerSettings::LocalSendPort
+// -----------------------------------------------------------------------------
+//         
+TUint COwnerSettings::LocalSendPort() const
+    {
+    return iLocalSendPort;
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::LocalReceivePort
+// -----------------------------------------------------------------------------
+//         
+TUint COwnerSettings::LocalReceivePort() const
+    {
+    return iLocalReceivePort;
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::RemoteAddr
+// -----------------------------------------------------------------------------
+//         
+const TInetAddr* COwnerSettings::RemoteAddr() const
+    {
+    return iRemoteAddr;
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::IsMatchingWithSavedInfo
+// -----------------------------------------------------------------------------
+//         
+TBool COwnerSettings::IsMatchingWithSavedInfo( 
+    const TSIPTransportParams& aParams, 
+    const TInetAddr& aRemoteAddr,
+    TUint aProtocol,
+    TUint aLocalPort ) const
+    {
+    TUint32 transportId( aParams.TransportId() );
+    TBool isReservedTransport( transportId > 0 );
+    
+    TBool addressMatch( EFalse );
+    
+    if ( aProtocol == KProtocolInetUdp && isReservedTransport )
+        {
+        // In case of protected UDP, check only remote send and local receive
+        // ports
+        addressMatch = ( IsMatchingWithRemoteSendAddr( aRemoteAddr, ETrue ) &&
+                         iLocalReceivePort == aLocalPort );
+        }
+    else
+        {
+        // Otherwise check both, remote and local, send and receive ports
+        addressMatch = ( IsMatchingWithRemoteSendAddr( aRemoteAddr, EFalse ) &&
+                         ( iLocalReceivePort == aLocalPort ||
+                           iLocalSendPort == aLocalPort ) );
+        }
+    return ( addressMatch &&
+             ( !isReservedTransport || iParams.TransportId() == transportId ) );
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::IsMatchingWithRemoteSendAddr
+// -----------------------------------------------------------------------------
+//    
+TBool COwnerSettings::IsMatchingWithRemoteSendAddr( 
+    const TInetAddr& aRemoteSendAddr,
+    TBool aCheckOnlySendPort ) const
+    {
+    if ( !iRemoteAddr )
+        {
+        return EFalse;
+        }
+    
+    TBool portMatch = ( iRemoteSendPort == aRemoteSendAddr.Port() );
+    if ( !aCheckOnlySendPort && !portMatch )
+        {
+        portMatch = ( iRemoteAddr->CmpPort( aRemoteSendAddr ) );
+        }
+
+    return ( iRemoteAddr->Match( aRemoteSendAddr ) && portMatch );
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::SetUseTLS
+// -----------------------------------------------------------------------------
+//   
+void COwnerSettings::SetUseTLS( TBool aUseTLS )
+    {
+    iUseTLS = aUseTLS;
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::UseTLS
+// -----------------------------------------------------------------------------
+//     
+TBool COwnerSettings::UseTLS() const
+    {
+    return iUseTLS;
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::SaveTLSRemoteL
+// -----------------------------------------------------------------------------
+// 
+void COwnerSettings::SaveTLSRemoteL( const TInetAddr& aRemoteAddr )   
+    {
+    __ASSERT_ALWAYS( iUseTLS, User::Leave( KErrNotReady ) );
+    
+    TInetAddr* remoteAddr = new ( ELeave ) TInetAddr( aRemoteAddr );  
+    delete iRemoteAddr;
+    iRemoteAddr = remoteAddr;
+    
+    iRemoteAddr->SetPort( KDefaultSipsPort );
+    }
+    
+// -----------------------------------------------------------------------------
+// COwnerSettings::AddOptL
+// -----------------------------------------------------------------------------
+//
+void COwnerSettings::AddOptL( CSocketOpt* aSocketOpt )
+    {
+    __ASSERT_ALWAYS( aSocketOpt, User::Leave( KErrArgument ) );
+    // Don't allow multiple socket opts with same option name
+    for ( TInt i = 0; i < iSocketOpts.Count(); i++ )
+        {
+        if ( iSocketOpts[ i ]->OptionName() == aSocketOpt->OptionName() )
+            {
+            delete iSocketOpts[ i ];
+            iSocketOpts.Remove( i );
+            iSocketOpts.InsertL( aSocketOpt, i );
+            return;
+            }
+        }
+    iSocketOpts.AppendL( aSocketOpt );
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::SetOptsL
+// -----------------------------------------------------------------------------
+//
+void COwnerSettings::SetOptsL( RSocket& aSocket )
+    {
+    TInt count = iSocketOpts.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        // Store previous opt as it will be used when ClearOpts is called
+        CSocketOpt* previousOpt = iSocketOpts[ i ]->SetOptL( aSocket );
+        if ( previousOpt )
+            {
+            CleanupStack::PushL( previousOpt );
+            iOriginalOpts.AppendL( previousOpt );
+            CleanupStack::Pop( previousOpt );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// COwnerSettings::ClearOptsL
+// -----------------------------------------------------------------------------
+//     
+void COwnerSettings::ClearOptsL( RSocket& aSocket )
+    {
+    TInt count = iOriginalOpts.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CSocketOpt* previousOpt = iOriginalOpts[ i ]->SetOptL( aSocket );
+        // Not interested about previous value
+        delete previousOpt;
+        }
+    }
+       
+// end of file