hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/CProtocolTCP.cpp
branchRCL_3
changeset 59 8ad140f3dd41
--- /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<MBPExpression> ( 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<KHexDecimalLength> 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<KHexDecimalLength> portBuf;
+    portBuf.Format( KHexFormat, aPort );
+    aSocketWriter.WriteL( portBuf );
+    }
+
+//  End of File