diff -r 7fdc9a71d314 -r 8ad140f3dd41 hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/CProtocolTCP.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/CProtocolTCP.cpp Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,272 @@ +/* +* 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: HTTPProxy protocol implementation +* +*/ + + + +// INCLUDE FILES +#include "CProtocolTCP.h" +#include "CExprTCPMsg.h" +#include "CExprTCPOpen.h" +#include "CExprTCPLstn.h" +#include "CExprTCPClose.h" +#include "CExprTCPCloseAll.h" +#include "MSocketWriter.h" +#include "MProtocolObserverTCP.h" +#include "CommRouterDefinitions.h" + +#define DEBUG_FILENAME "IPProxyEngine.log" +#include "DebugPrint.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CProtocolTCP::CProtocolTCP +// ----------------------------------------------------------------------------- +// +CProtocolTCP::CProtocolTCP( MProtocolObserverTCP* aObserver ) + : iObserver( aObserver ) + { + __ASSERT_DEBUG( iObserver, User::Invariant() ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::ConstructL +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::ConstructL() + { + // Add all the expressions for TCP + iExpressionArray = new (ELeave) CArrayPtrFlat ( 5 ); + + CExprTCPMsg* tcpMsg = CExprTCPMsg::NewL( this ); + iExpressionArray->AppendL( tcpMsg ); + + CExprTCPOpen* tcpOpen = CExprTCPOpen::NewL( this ); + iExpressionArray->AppendL( tcpOpen ); + + CExprTCPLstn* tcpLstn = CExprTCPLstn::NewL( this ); + iExpressionArray->AppendL( tcpLstn ); + + CExprTCPClose* tcpClose = CExprTCPClose::NewL( this ); + iExpressionArray->AppendL( tcpClose ); + + CExprTCPCloseAll* tcpCloseAll = CExprTCPCloseAll::NewL( this ); + iExpressionArray->AppendL( tcpCloseAll ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::NewL +// ----------------------------------------------------------------------------- +// +CProtocolTCP* CProtocolTCP::NewL( MProtocolObserverTCP* aObserver ) + { + CProtocolTCP* self = CProtocolTCP::NewLC( aObserver ); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::NewLC +// ----------------------------------------------------------------------------- +// +CProtocolTCP* CProtocolTCP::NewLC( MProtocolObserverTCP* aObserver ) + { + CProtocolTCP* self = new( ELeave ) CProtocolTCP( aObserver ); + CleanupStack::PushL( self ); + + self->ConstructL(); + return self; + } + + +// ----------------------------------------------------------------------------- +// CProtocolTCP::~CProtocolTCP +// ----------------------------------------------------------------------------- +// +CProtocolTCP::~CProtocolTCP() + { + if ( iExpressionArray ) + { + iExpressionArray->ResetAndDestroy(); + delete iExpressionArray; + } + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::FrameStarted +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::FrameStarted() + { + iObserver->FrameStarted(); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::FrameParsedL +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::FrameParsedL( TUint aPort, const TDesC8& aData ) + { + iObserver->TCPFrameParsedL( aPort, aData ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::ProtocolErrorL +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::ProtocolErrorL( + TInt aErrorCode, const TDesC8& aReceivedData ) + { + iObserver->ProtocolErrorL( aErrorCode, aReceivedData ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::OpenLocalTCPConnectionL +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::OpenLocalTCPConnectionL( TUint aPort ) + { + iObserver->OpenLocalTCPConnectionL( aPort ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::OpenListeningTCPConnectionL +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::OpenListeningTCPConnectionL( TUint aPort ) + { + iObserver->OpenListeningTCPConnectionL( aPort ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::CloseTCPConnection +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::CloseTCPConnectionL( TUint aPort ) + { + iObserver->CloseTCPConnectionL( aPort ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::ProtocolErrorL +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::CloseAllTCPConnections() + { + iObserver->CloseAllTCPConnections(); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::WriteFrameL +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::WriteFrameL( MSocketWriter& aSocketWriter, + TUint aPeerPort, TUint aOriginalPort, const TDesC8& aData ) const + { + DEBUG_PRINT( DEBUG_STRING( + "CProtocolTCP::WriteFrameL(), peer port=%d, original port=%d" ), + aPeerPort, aOriginalPort ); + + TInt bufSize = 0; + bufSize += KTCPPrefix().Length(); + bufSize += KHexDecimalLength; + bufSize += KPortSuffix().Length(); + bufSize += KHexDecimalLength; + bufSize += KPortSuffix().Length(); + bufSize += KHexDecimalLength; + bufSize += KLengthSuffix().Length(); + bufSize += aData.Length(); + bufSize += KDataSuffix().Length(); + bufSize += KMessageSuffix().Length(); // ? is this really needed + + TBuf8 hexbuf; + HBufC8* buf = HBufC8::NewLC( bufSize ); + TPtr8 ptr( buf->Des() ); + + // Append TCP prefix + ptr.Append( KTCPPrefix ); + + // Append peer port + hexbuf.Format( KHexFormat, aPeerPort ); + ptr.Append( hexbuf ); + ptr.Append( KPortSuffix ); + + // Append host port + hexbuf.Format( KHexFormat, aOriginalPort ); + ptr.Append( hexbuf ); + ptr.Append( KPortSuffix ); + + // Append data length + hexbuf.Format( KHexFormat, aData.Length() ); + ptr.Append( hexbuf ); + ptr.Append( KLengthSuffix ); + + // Append data + ptr.Append( aData ); + ptr.Append( KDataSuffix ); + ptr.Append( KMessageSuffix ); + + // Write to socket + aSocketWriter.WriteL( *buf ); + + CleanupStack::PopAndDestroy( buf ); + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::HandleReceivedDataL +// ----------------------------------------------------------------------------- +// +TBool CProtocolTCP::HandleReceivedDataL( TDes8& aData, TInt& aStartPos, + TInt& aLength ) + { + TBool msgHandled = EFalse; + TInt protCount = iExpressionArray->Count(); + + for ( TInt i = 0; i < protCount; i++ ) + { + msgHandled = iExpressionArray->At( i )->HandleRecievedMsgL( aData, + aStartPos, + aLength); + if ( msgHandled ) + { + break; + } + } + + return msgHandled; + } + +// ----------------------------------------------------------------------------- +// CProtocolTCP::SendCloseTCPConnection +// ----------------------------------------------------------------------------- +// +void CProtocolTCP::SendCloseTCPConnection( MSocketWriter& aSocketWriter, + TUint aPort ) + { + DEBUG_PRINT( + DEBUG_STRING( "CProtocolTCP::SendCloseTCPConnection, port %d" ), + aPort ); + + aSocketWriter.WriteL( KTCPClosePrefix ); + TBuf8 portBuf; + portBuf.Format( KHexFormat, aPort ); + aSocketWriter.WriteL( portBuf ); + } + +// End of File