diff -r 000000000000 -r 1bce908db942 multimediacommsengine/tsrc/testdriver/testclient/net/src/CTcTcpManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/tsrc/testdriver/testclient/net/src/CTcTcpManager.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,256 @@ +/* +* Copyright (c) 2004 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: Implementation +* +*/ + +#include +#include + +#include "CTcTcpManager.h" +#include "TTcTcpFactory.h" +#include "debuglog.h" + +CTcTcpManager* CTcTcpManager::NewL( const TTcTcpFactory& aFactory ) + { + CTcTcpManager* self = new( ELeave ) CTcTcpManager( aFactory ); + + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + + return self; + } + +CTcTcpManager::~CTcTcpManager() + { + LOG( _L("CTcTcpManager::~CTcTcpManager()") ); + // Close connection + Close(); + iConnServ.Close(); + iSockServ.Close(); + delete iRemoteAddr; + } + +CTcTcpManager::CTcTcpManager( const TTcTcpFactory& aFactory ) + : CActive( CActive::EPriorityStandard ), + iConn( aFactory.iPort ), iIAPId( aFactory.iIAPId ) + { + CActiveScheduler::Add( this ); + } + +void CTcTcpManager::ConstructL() + { + LOG( _L("CTcTcpManager::ConstructL()") ); + // Open a session to socket server and connection server + User::LeaveIfError( iSockServ.Connect() ); + User::LeaveIfError( iConnServ.Open( iSockServ ) ); + iConn.SetObserver( this ); + iConn.SetConnection( &iSockServ, &iConnServ ); + + iPrefs.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + iPrefs.SetDirection( ECommDbConnectionDirectionOutgoing ); + iPrefs.SetIapId( iIAPId ); + } + +void CTcTcpManager::RunL() + { + LOG( _L("CTcTcpManager::RunL() start") ); + + // Report any intermediate connection errors + TInt status( iStatus.Int() ); + if( status != KErrNone ) + { + BearerCompletion( MTcBearerObserver::EConnect, status ); + } + else + { + TInt err( KErrNone ); + // Start waiting for connections + if ( iRemoteAddr ) + { + TRAP( err, iConn.ConnectL( *iRemoteAddr ) ); + } + else + { + TRAP( err, iConn.ConnectL() ); + } + // Catch and report errors + if( err ) + { + BearerCompletion( MTcBearerObserver::EConnect, err ); + } + } + + LOG( _L("CTcTcpManager::RunL() end") ); + } + +void CTcTcpManager::DoCancel() + { + LOG( _L("CTcTcpManager::DoCancel()") ); + // Cannot use Stop() as it forces the whole IAP connection down + // even if somebody else is still using it. + iConnServ.Close(); + } + +void CTcTcpManager::ConnectL( TInetAddr* aRemoteAddr ) + { + LOG( _L("CTcTcpManager::ConnectL() start, IAP = %d"), iIAPId ); + + delete iRemoteAddr; + iRemoteAddr = NULL; + + if ( aRemoteAddr ) + { + iRemoteAddr = new ( ELeave ) TInetAddr( *aRemoteAddr ); + } + + // Fire up a net connection, use the defined IAP if any + if( iIAPId ) + { + iConnServ.Start( iPrefs, iStatus ); + } + else + { + // This will query the user for an IAP + iConnServ.Start( iStatus ); + } + + SetActive(); + + LOG( _L("CTcTcpManager::ConnectL() end") ); + } + +void CTcTcpManager::Close() + { + LOG( _L("CTcTcpManager::Close()") ); + + Cancel(); + // Shut down the service port + iConn.Close(); + } + +void CTcTcpManager::Send( const TDesC8& aDes ) + { + iConn.Send( aDes ); + } + +void CTcTcpManager::Receive( TDes8& aDes ) + { + iConn.Receive( aDes ); + } + +void CTcTcpManager::ReceiveOneOrMore( TDes8& aDes ) + { + iConn.ReceiveOneOrMore( aDes ); + } + +void CTcTcpManager::SetObserver( MTcBearerObserver* aObserver ) + { + iObserver = aObserver; + } + +void CTcTcpManager::GetLocalAddressL( TDes& aDes ) + { + // Array for addresses + RArray< TBuf<40> > addresses; + + // Open socket for querying socket options + RSocket socket; + User::LeaveIfError(socket.Open( + iSockServ, KAfInet, KSockDatagram, KProtocolInetUdp, iConnServ)); + + // Get IAP id from CommDb for the active connection + TUint32 iapId; + User::LeaveIfError(iConnServ.GetIntSetting(_L("IAP\\Id"), iapId)); + + // Get address from socket options + TInt err = socket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl); + if (err == KErrNone) + { + TPckgBuf info; + err = socket.GetOpt(KSoInetNextInterface,KSolInetIfCtrl,info); + while (err == KErrNone) + { + TPckgBuf query; + query().iName = info().iName; + err = socket.GetOpt(KSoInetIfQueryByName,KSolInetIfQuery,query); + if (err == KErrNone) + { + if (!info().iAddress.IsUnspecified() && + !info().iAddress.IsLoopback() && + !info().iAddress.IsLinkLocal()) + { + + TInetAddr addr; + + // Initialize address for both ipv4 and ipv6 + addr.Init(KAfInet6); + + addr = info().iAddress; + + TBuf<40> addrDesc; + addr.Output( addrDesc ); + + TInt oldIndex = addresses.Find(addrDesc); + + // Address of current IAP is shown first + if (query().iZone[1] == iapId) + { + // remove the old one + if(KErrNotFound != oldIndex){ + addresses.Remove(oldIndex); + } + addresses.Insert(addrDesc,0); + } + else + { + if(KErrNotFound == oldIndex){ + addresses.Append(addrDesc); + } + } + } + err = socket.GetOpt(KSoInetNextInterface,KSolInetIfCtrl,info); + } + } + } + + socket.Close(); + + if (err == KErrNoMemory) + { + User::LeaveNoMemory(); + } + _LIT(KLineFeed,"\n"); + + // append address from the array to descriptor + for(TInt i=0;iBearerCompletion( aOp, aStatus ); + } + LOG( _L("CTcTcpManager::BearerCompletion() end") ); + }