diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/UCCSDeviceControl/CTCPTransport.cpp --- /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 +#include + +#include "CTCPTransport.h" +#include "assert.h" + +#include + + +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; + }