realtimenetprots/sipfw/SIP/ConnectionMgr/src/CSocketOpt.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CSocketOpt.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,146 @@
+// 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        : CSocketOpt.cpp
+// Part of     : ConnectionMgr
+// See class definition below.
+// Version     : SIP/4.0
+//
+
+
+
+#include "CSocketOpt.h"
+#include "SipLogs.h"
+ 
+// -----------------------------------------------------------------------------
+// CSocketOpt::NewLC
+// -----------------------------------------------------------------------------
+//
+CSocketOpt* CSocketOpt::NewLC(
+    TUint aOptionName,
+	TUint aOptionLevel,
+	TInt aOption )
+    {
+    CSocketOpt* self = 
+        new ( ELeave ) CSocketOpt( aOptionName, aOptionLevel, aOption );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+      
+// -----------------------------------------------------------------------------
+// CSocketOpt::NewLC
+// -----------------------------------------------------------------------------
+//
+CSocketOpt* CSocketOpt::NewLC(
+    TUint aOptionName,
+	TUint aOptionLevel,
+	const TDesC8& aOption )
+    {
+    CSocketOpt* self = 
+        new ( ELeave ) CSocketOpt( aOptionName, aOptionLevel );
+    CleanupStack::PushL( self );
+    self->ConstructL( aOption );
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSocketOpt::~CSocketOpt
+// -----------------------------------------------------------------------------
+//
+CSocketOpt::~CSocketOpt()
+    {
+    delete iOptionBuf;
+    }
+
+// -----------------------------------------------------------------------------
+// CSocketOpt::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSocketOpt::ConstructL( const TDesC8& aOption )
+    {
+    if ( aOption != KNullDesC8 )
+        {
+        iOptionBuf = aOption.AllocL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSocketOpt::CSocketOpt
+// -----------------------------------------------------------------------------
+//    
+CSocketOpt::CSocketOpt(
+    TUint aOptionName,
+	TUint aOptionLevel,
+	TInt aOption ) :
+	iOptionName( aOptionName ),
+	iOptionLevel( aOptionLevel ),
+	iOption( aOption )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSocketOpt::SetOpt
+// -----------------------------------------------------------------------------
+//         
+TUint CSocketOpt::OptionName() const
+    {
+    return iOptionName;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSocketOpt::SetOptL
+// -----------------------------------------------------------------------------
+//     
+CSocketOpt* CSocketOpt::SetOptL( RSocket& aSocket )
+    {
+    __SIP_LOG( "CSocketOpt::SetOptL" )
+    
+    CSocketOpt* previousOpt( NULL );
+    TInt err( KErrNone );
+    
+    if ( iOptionBuf )
+        {
+        // Errors are ignored
+        HBufC8* optionBuf = HBufC8::NewLC( iOptionBuf->Des().MaxLength() * 2 );
+        TPtr8 optionBufPtr = optionBuf->Des();
+        err = aSocket.GetOpt( iOptionName, iOptionLevel, optionBufPtr );
+        if ( !err )
+            {
+            previousOpt = CSocketOpt::NewLC( iOptionName, iOptionLevel, *optionBuf );
+            CleanupStack::Pop( previousOpt );
+            }
+        __SIP_INT_LOG1( "CSocketOpt::SetOptL, previous opt read, err:", err )
+        CleanupStack::PopAndDestroy( optionBuf );
+        err = aSocket.SetOpt( iOptionName, iOptionLevel, *iOptionBuf );
+        }
+    else
+        {
+        // Errors are ignored
+        TInt optionVal( 0 );
+        err = aSocket.GetOpt( iOptionName, iOptionLevel, optionVal );
+        if ( !err )
+            {
+            previousOpt = CSocketOpt::NewLC( iOptionName, iOptionLevel, optionVal );
+            CleanupStack::Pop( previousOpt );
+            }
+        __SIP_INT_LOG1( "CSocketOpt::SetOptL, previous opt read, err:", err )
+        err = aSocket.SetOpt( iOptionName, iOptionLevel, iOption );
+        }  
+        
+    __SIP_INT_LOG1( "CSocketOpt::SetOptL, exit, err:", err )
+    
+    return previousOpt;
+    }
+    
+// end of file