diff -r 7259cf1302ad -r 169364e7e4b4 hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/CIPProxyEngine.cpp --- a/hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/CIPProxyEngine.cpp Tue Jul 06 16:05:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,629 +0,0 @@ -/* -* Copyright (c) 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: Implementation of the main class for IPProxyEngine -* -*/ - - - -// INCLUDE FILES -#include "CIPProxyEngine.h" -#include "Ctcpportlistener.h" -#include "CLocalTCPConnection.h" -#include "Csocketrouter.h" -#include "MIPProxyEngineObserver.h" -#include "MHostConnection.h" -#include "MAbstractConnection.h" - -#define DEBUG_FILENAME "IPProxyEngine.log" -#include "DebugPrint.h" - -const TInt KPeerDisconnectDelay = 60000000; //60 seconds - -// ============================= LOCAL FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CleanupSocket RSocket pointer cleanup operation -// ----------------------------------------------------------------------------- -// -LOCAL_C void CleanupSocket( TAny* aPtr ) - { - RSocket* socket = ( RSocket* ) aPtr; - if ( socket ) - { - socket->Close(); - delete socket; - } - } - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::CIPProxyEngine -// ----------------------------------------------------------------------------- -// -CIPProxyEngine::CIPProxyEngine( MAbstractConnection* aConnection ) - : CActive( EPriorityStandard ), iAbstractConnection( aConnection ) - { - __ASSERT_DEBUG( iAbstractConnection, User::Invariant() ); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::ConstructL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::ConstructL() - { - DEBUG_PRINT( DEBUG_STRING( "CSocketRouter::ConstructL()" ) ); - - User::LeaveIfError( iTimer.CreateLocal() ); - User::LeaveIfError( iSocketServ.Connect() ); - - iHostConnection = iAbstractConnection->GetHostConnection(); - __ASSERT_DEBUG( iHostConnection, User::Invariant() ); - iHostConnection->SetObserver( this ); - - // Peer array. Granularity 10 suits fine. - iPeerListenerArray = new (ELeave) CArrayPtrFlat ( 10 ); - - // Local TCP connections array - iLocalConnArray = new (ELeave) CArrayPtrFlat ( 5 ); - - iSocketRouter = CSocketRouter::NewL( this ); - - CActiveScheduler::Add( this ); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::NewL -// ----------------------------------------------------------------------------- -// -CIPProxyEngine* CIPProxyEngine::NewL( MAbstractConnection* aConnection ) - { - CIPProxyEngine* self = CIPProxyEngine::NewLC( aConnection ); - CleanupStack::Pop(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::NewLC -// ----------------------------------------------------------------------------- -// -CIPProxyEngine* CIPProxyEngine::NewLC( MAbstractConnection* aConnection ) - { - CIPProxyEngine* self = new( ELeave ) CIPProxyEngine( aConnection ); - CleanupStack::PushL( self ); - - self->ConstructL(); - return self; - } - - -// Destructor -CIPProxyEngine::~CIPProxyEngine() - { - Cancel(); - iTimer.Close(); - delete iSocketRouter; - - if ( iPeerListenerArray ) - { - iPeerListenerArray->ResetAndDestroy(); - delete iPeerListenerArray; - } - if ( iLocalConnArray ) - { - iLocalConnArray->ResetAndDestroy(); - delete iLocalConnArray; - } - - iSocketServ.Close(); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::RunL -// This is called when the timer expires -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::RunL() - { - DEBUG_PRINT( DEBUG_STRING( "CIPProxyEngine::RunL()" ) ); - DEBUG_PRINT( DEBUG_STRING( " peer count = %d" ), - iSocketRouter->SocketCount() ); - - if ( iSocketRouter->SocketCount() == 0 ) - { - iHostConnection->IssueDisconnect(); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::DoCancel -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::DoCancel() - { - iTimer.Cancel(); - DEBUG_PRINT( DEBUG_STRING( "Timeout timer cancelled" ) ); - } - - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::SetObserver -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::SetObserver( MIPProxyEngineObserver* aObserver ) - { - iObserver = aObserver; - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::AddPeerListeningPortL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::AddPeerListeningPortL( TInt aPort ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::AddPeerListeningPortL(%d)" ), aPort ); - - CTCPPortListener* newListener = CTCPPortListener::NewLC( aPort, this ); - iPeerListenerArray->AppendL( newListener ); - if ( iListening ) - { - newListener->IssueListen(); - } - CleanupStack::Pop( newListener ); - - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::AddPeerListeningPortL, Adding also UDP listener(%d)" ), - aPort ); - - // Adding also UDP listener for the port - iSocketRouter->AddUDPSocketL( aPort ); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::StartListening -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::StartListening() - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::StartListening()" ) ); - TInt peerListenerArrayCount = iPeerListenerArray->Count(); - for ( TInt i = 0; i < peerListenerArrayCount; i++ ) - { - iPeerListenerArray->At( i )->IssueListen(); - } - iListening = ETrue; - - AssureConnectionL(); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::StopListening -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::StopListening() - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::StopListening()" ) ); - - TInt peerListenerArrayCount = iPeerListenerArray->Count(); - for ( TInt i = 0; i < peerListenerArrayCount; i++ ) - { - iPeerListenerArray->At( i )->Cancel(); - } - iListening = EFalse; - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::DisconnectAllConnections -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::DisconnectAllConnections() - { - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::ConnectionAcceptedL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::ConnectionAcceptedL( RSocket* aSocket ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::ConnectionAcceptedL()" ) ); - - Cancel(); //Possible timeout timer - - CleanupStack::PushL( TCleanupItem( CleanupSocket, aSocket ) ); - iSocketRouter->AddPeerSocketL( aSocket ); - CleanupStack::Pop(); //aSocket - - AssureConnectionL(); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::ErrorL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::ErrorL( TInt aErrorCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::ErrorL(%d)" ), aErrorCode ); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::ObserverLeaved -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::ObserverLeaved( TInt aLeaveCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::ObserverLeaved(%d)" ), aLeaveCode ); - if ( iObserver ) - { - iObserver->ObserverLeaved( aLeaveCode ); - } - } - - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::ConnectionEstablishedL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::ConnectionEstablishedL() - { - // Connection to host established via bluetooth - - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::ConnectionEstablishedL()" ) ); - - MSocket* socket = iAbstractConnection->GetSocket(); - if ( socket ) - { - iSocketRouter->SetHostSocketL( socket ); - iSocketRouter->StartRouting(); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::HostConnectionErrorL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::HostConnectionErrorL( TInt aErrorCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::HostConnectionErrorL(%d)" ), aErrorCode ); - iHostConnection->IssueDisconnect(); - iSocketRouter->RemoveAllPeers(); - iSocketRouter->StopRouting(); - iSocketRouter->ResetQueue(); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::HostConnectionObserverLeaved -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::HostConnectionObserverLeaved( TInt aLeaveCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::HostConnectionObserverLeaved(%d)" ), aLeaveCode ); - if ( iObserver ) - { - iObserver->ObserverLeaved( aLeaveCode ); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::LocalTCPConnectionEstablishedL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::LocalTCPConnectionEstablishedL( TUint aPort ) - { - // Connection to local host (via TCP connection) established. - - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::LocalTCPConnectionEstablishedL(), port=%d" ), aPort ); - - // TCP connection that was initiated from the PC side, got connected - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::ConnectionEstablishedL() -\ - Local conn. was connected, adding the socket to socket router" ) ); - - TInt connIndex = FindLocalTCPConn( aPort ); - if ( connIndex >= 0 ) - { - CLocalTCPConnection* conn = iLocalConnArray->At( connIndex ); - iSocketRouter->AddPeerSocketL( conn->Socket() ); - // Socket router took ownership of the socket - conn->SetSocketOwnership( EFalse ); - // Connection was established, - conn->Cancel(); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::LocalTCPConnectionErrorL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::LocalTCPConnectionErrorL( TInt aPort, TInt aErrorCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::LocalTCPConnectionErrorL(%d)" ), aErrorCode ); - - TInt connIndex = FindLocalTCPConn( aPort ); - if ( connIndex >= 0 ) - { - RSocket* localSocket = iLocalConnArray->At( connIndex )->Socket(); - iSocketRouter->RemovePeerSocket( localSocket ); - iLocalConnArray->Delete( connIndex ); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::LocalTCPConnectionObserverLeaved -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::LocalTCPConnectionObserverLeaved( TInt aPort, - TInt aLeaveCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::HostConnectionObserverLeaved(%d), port%d" ), - aLeaveCode, aPort ); - if ( iObserver ) - { - iObserver->ObserverLeaved( aLeaveCode ); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::SocketRouterErrorL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::SocketRouterErrorL( - const MSocket* /*aSocket*/, TInt aErrorCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::SocketRouterErrorL(%d)" ), aErrorCode ); - - if ( aErrorCode == -6305 ) //BT disconnected - { - iHostConnection->IssueDisconnect(); - iSocketRouter->RemoveAllPeers(); - iSocketRouter->StopRouting(); - iSocketRouter->ResetQueue(); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::ObserverLeaved -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::ObserverLeaved( - const MSocket* /*aSocket*/, TInt aLeaveCode ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::ObserverLeaved(%d)" ), aLeaveCode ); - if ( iObserver ) - { - iObserver->ObserverLeaved( aLeaveCode ); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::PeerDisconnectedL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::PeerDisconnectedL( const MSocket* aSocket ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::PeerDisconnectedL(), localPort= %d. remotePort=%d" ), - aSocket->LocalPort(), aSocket->RemotePort() ); - - // Check if the socket was a local TCP connection socket - TInt indexOfConn = -1; - indexOfConn = FindLocalTCPConn( aSocket->RemotePort() ); - if ( indexOfConn >= 0 ) - { - // Notify PC side that the connection was disconnected - iSocketRouter->SendCloseTCPConnection( aSocket->RemotePort() ); - - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::PeerDisconnectedL(), Deleting local connection." ), - aSocket->LocalPort(), aSocket->RemotePort() ); - iLocalConnArray->Delete( indexOfConn ); - } - - Cancel(); - iTimer.After( iStatus, KPeerDisconnectDelay ); - SetActive(); - DEBUG_PRINT( DEBUG_STRING( "Timeout timer activated" ) ); - - if ( iSocketRouter->SocketCount() == 0 ) - { - iSocketRouter->StopRouting(); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::HostDisconnectedL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::HostDisconnectedL( const MSocket* /*aSocket*/ ) - { - iHostConnection->IssueDisconnect(); - if ( iSocketRouter->IsRouting() ) - { - iSocketRouter->StopRouting(); - } - iSocketRouter->ResetQueue(); - iSocketRouter->RemoveAllPeers(); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::OpenLocalTCPConnectionL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::OpenLocalTCPConnectionL( TUint aPort ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::OpenLocalTCPConnectionL(), port=%d"), aPort ); - - CLocalTCPConnection* newConn = - CLocalTCPConnection::NewLC( this, aPort ); - - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::OpenLocalTCPConnectionL(), Issuing connection") ); - iLocalConnArray->AppendL( newConn ); - CleanupStack::Pop( newConn ); - - newConn->IssueConnectL(); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::OpenListeningTCPConnectionL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::OpenListeningTCPConnectionL( TUint aPort ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::OpenListeningTCPConnectionL(), port=%d"), aPort ); - - TInt count = iPeerListenerArray->Count(); - for ( TInt i = 0; i < count; i++ ) - { - if ( iPeerListenerArray->At( i )->Port() == aPort ) - { - // Port already listening - return; - } - } - - // AddPeerListeningPortL will call IssueListen() only if iListening is set - // to ETrue - iListening = ETrue; - AddPeerListeningPortL( aPort ); - AssureConnectionL(); - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::CloseTCPConnection -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::CloseTCPConnection( TUint aPort ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::CloseTCPConnection(), port=%d"), aPort ); - - // Delete local TCP connections - TInt index = FindLocalTCPConn( aPort ); - if ( index > -1 ) - { - CLocalTCPConnection* conn = iLocalConnArray->At( index ); - iLocalConnArray->Delete( index ); - delete conn; - - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::CloseTCPConnection(), conn deleted.") ); - } - - // stop listening on this port - TInt peerListenerArrayCount = iPeerListenerArray->Count(); - for ( TInt i = 0; i < peerListenerArrayCount; i++ ) - { - CTCPPortListener* listener = iPeerListenerArray->At( i ); - if(listener->Port() == aPort) - { - listener->Cancel(); - iPeerListenerArray->Delete(i); - delete listener; - break; - } - } - - if(iPeerListenerArray->Count() == 0) - { - iListening = EFalse; - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::CloseAllTCPConnections -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::CloseAllTCPConnections() - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::CloseAllTCPConnections()" ) ); - - iSocketRouter->ResetQueue(); - iSocketRouter->RemoveAllPeers(); - - iLocalConnArray->ResetAndDestroy(); - - StopListening(); - - if ( iPeerListenerArray ) - { - iPeerListenerArray->ResetAndDestroy(); - } - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::FindLocalTCPConn -// ----------------------------------------------------------------------------- -// -TInt CIPProxyEngine::FindLocalTCPConn( TUint aPort ) - { - DEBUG_PRINT( DEBUG_STRING( - "CIPProxyEngine::FindLocalTCPConn(), port=%d"), aPort ); - for ( TInt i = 0; i < iLocalConnArray->Count(); i++ ) - { - if ( iLocalConnArray->At(i)->Port() == aPort ) - { - return i; - } - } - return -1; - } - -// ----------------------------------------------------------------------------- -// CIPProxyEngine::AssureConnectionL -// ----------------------------------------------------------------------------- -// -void CIPProxyEngine::AssureConnectionL() - { - DEBUG_PRINT( DEBUG_STRING( - "AssureConnectionL()" ) ); - if ( iHostConnection->IsConnected() ) - { - DEBUG_PRINT( DEBUG_STRING( - "AssureConnectionL, connected" ) ); - if ( !iSocketRouter->IsRouting() ) - { - DEBUG_PRINT( DEBUG_STRING( - "AssureConnectionL, starting routing" ) ); - iSocketRouter->StartRouting(); - } - } - else - { - DEBUG_PRINT( DEBUG_STRING( - "AssureConnectionL, not connected, connecting" ) ); - iHostConnection->IssueConnectL(); - } - } -// End of File