testexecmgmt/ucc/Source/UCCSDeviceControl/CTCPTransport.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/UCCSDeviceControl/CTCPTransport.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,158 @@
+/*
+* 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: 
+*
+*/
+
+
+
+#include <e32def.h>
+#include <inet.h>
+
+#include "CTCPTransport.h"
+#include "assert.h"
+
+#include <CommDbConnPref.h>
+
+
+CTCPTransport::CTCPTransport()
+	{
+	}
+
+CTCPTransport::~CTCPTransport()
+	{
+	iSocket.Close();
+	iServer.Close();
+	}
+
+TInt CTCPTransport::InitialiseL()
+	{
+	return KErrNone;
+	}
+
+TInt CTCPTransport::Release( void )
+	{
+	iSocket.Close();
+	iServer.Close();
+	return KErrNone;
+	}
+
+TInt CTCPTransport::ConnectL( TDesC* aRemoteHost )
+	{
+	// Retrieve the destination port location
+	TInt colonPos = aRemoteHost->Locate( TChar(':') );
+	if(colonPos != KErrNotFound)
+		{
+		// Set the destination port
+		TPtrC host( aRemoteHost->Left(colonPos) );
+		TLex portLex( aRemoteHost->Mid(colonPos + 1) );
+		TInt port = 0;
+		portLex.Val( port );
+		iDestAddr.SetPort( port );
+
+		// Retrieve and set the destination ip address
+		TBuf<20> ipAddress;
+		ipAddress.Copy( host.Ptr(), colonPos );
+		iDestAddr.Input( ipAddress );
+		}
+	else
+		{
+		iDestAddr.SetPort( KUCCTCPPort );
+		}
+	
+	// pick out the iap/snap index..
+	TInt index=0;
+	TPtrC mode;
+
+	TInt pipePos = aRemoteHost->Locate( TChar('|') );
+	if( pipePos != KErrNotFound )
+		{
+		TPtrC tempstr( aRemoteHost->Ptr() + pipePos + 1 );
+		TInt indexPos = tempstr.Locate( TChar(':') );
+
+		if( indexPos != KErrNotFound )
+			{
+			mode.Set( tempstr.Left(indexPos) );
+			TLex iapLex( tempstr.Mid(indexPos + 1) );
+			iapLex.Val( index );
+			}
+		}
+	
+	// Connect to the server - need to retry as the first few attepts seem to fail over PPP
+	User::LeaveIfError( iServer.Connect() );
+	User::LeaveIfError( iConnection.Open(iServer) );
+
+	if( index > 0 && mode.Compare( _L("IAP") ) == 0 )
+		{
+		TCommDbConnPref pref;
+		pref.SetIapId(index);
+		pref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+		User::LeaveIfError(iConnection.Start(pref));
+		}
+#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
+	else if( index > 0 && mode.Compare( _L("SNAP") ) == 0 )
+		{
+		TConnSnapPref pref(index);
+		User::LeaveIfError(iConnection.Start(pref));
+		}
+#endif // SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
+	else
+		{
+		User::LeaveIfError(iConnection.Start());
+		}
+
+	TInt ret = -1;
+	while( ret )
+		{
+		User::LeaveIfError( iSocket.Open(iServer, KAfInet, KSockStream, KProtocolInetTcp, iConnection) );
+		TRequestStatus status;
+		iSocket.Connect( iDestAddr, status );
+		User::WaitForRequest( status );
+		ret = status.Int();
+		}
+
+	return KErrNone;
+	}
+
+TInt CTCPTransport::Disconnect( void )
+	{
+	iSocket.Close();
+	iServer.Close();
+	return KErrNone;
+	}
+
+TInt CTCPTransport::RequestSend( TDesC8 *aData, const TUint aDataLength )
+	{
+	assert( aData->Length() == aDataLength );
+	// Write to the socket
+	TRequestStatus status;
+	iSocket.Write( *aData, status );
+	User::WaitForRequest( status );
+	return status.Int();
+	}
+
+TInt CTCPTransport::RequestReceive( TPtr8 *aRecvBufferPtr, TUint aByteCount )
+	{
+	assert( aRecvBufferPtr->MaxLength() == aByteCount );
+	// Read from the socket
+	TRequestStatus status;
+	iSocket.Read( *aRecvBufferPtr, status );
+	User::WaitForRequest( status );
+	return status.Int();
+	}
+
+TText8 *CTCPTransport::Error( void )
+	{
+	return NULL;
+	}