hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/CProtocolUDP.cpp
branchRCL_3
changeset 59 8ad140f3dd41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/CProtocolUDP.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,196 @@
+/*
+* 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:  UDP protocol implementation for IP proxy
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CProtocolUDP.h"
+#include "CExprUDPMsg.h"
+#include "MSocketWriter.h"
+#include "MProtocolObserverUDP.h"
+#include "CommRouterDefinitions.h"
+
+#define DEBUG_FILENAME "IPProxyEngine.log"
+#include "DebugPrint.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::CProtocolUDP
+// -----------------------------------------------------------------------------
+//
+CProtocolUDP::CProtocolUDP( MProtocolObserverUDP* aObserver )
+    : iObserver( aObserver )
+    {
+    __ASSERT_DEBUG( iObserver, User::Invariant() );
+    }
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CProtocolUDP::ConstructL()
+    {
+    // Add all the expressions for UDP
+    iExpressionArray = new (ELeave) CArrayPtrFlat<MBPExpression> ( 3 );
+
+    CExprUDPMsg* UDPMsg = CExprUDPMsg::NewL( this );
+    iExpressionArray->AppendL( UDPMsg );
+    }
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::NewL
+// -----------------------------------------------------------------------------
+//
+CProtocolUDP* CProtocolUDP::NewL( MProtocolObserverUDP* aObserver )
+    {
+    CProtocolUDP* self = CProtocolUDP::NewLC( aObserver );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::NewLC
+// -----------------------------------------------------------------------------
+//
+CProtocolUDP* CProtocolUDP::NewLC( MProtocolObserverUDP* aObserver )
+    {
+    CProtocolUDP* self = new( ELeave ) CProtocolUDP( aObserver );
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::~CProtocolUDP
+// -----------------------------------------------------------------------------
+//
+CProtocolUDP::~CProtocolUDP()
+    {
+    if ( iExpressionArray )
+        {
+        iExpressionArray->ResetAndDestroy();
+        delete iExpressionArray;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::FrameStarted
+// -----------------------------------------------------------------------------
+//
+void CProtocolUDP::FrameStarted()
+    {
+    iObserver->FrameStarted();
+    }
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::FrameParsedL
+// -----------------------------------------------------------------------------
+//
+void CProtocolUDP::FrameParsedL( TUint aPort, const TDesC8& aData )
+    {
+    iObserver->UDPFrameParsedL( aPort, aData );
+    }
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::ProtocolErrorL
+// -----------------------------------------------------------------------------
+//
+void CProtocolUDP::ProtocolErrorL(
+    TInt aErrorCode, const TDesC8& aReceivedData )
+    {
+    iObserver->ProtocolErrorL( aErrorCode, aReceivedData );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::WriteFrameL
+// -----------------------------------------------------------------------------
+//
+void CProtocolUDP::WriteFrameL( MSocketWriter& aSocketWriter,
+            TUint aPeerPort, TUint aOriginalPort, const TDesC8& aData ) const
+    {
+    DEBUG_PRINT( DEBUG_STRING(
+        "CProtocolUDP::WriteFrameL(), peer port=%d, original port=%d" ),
+        aPeerPort, aOriginalPort );
+
+    TInt bufSize = 0;
+    bufSize += KUDPPrefix().Length();
+    bufSize += KHexDecimalLength;
+    bufSize += KPortSuffix().Length();
+    bufSize += KHexDecimalLength;
+    bufSize += KLengthSuffix().Length();
+    bufSize += aData.Length();
+    bufSize += KDataSuffix().Length();
+    bufSize += KMessageSuffix().Length();
+    
+    TBuf8<KHexDecimalLength> hexbuf;
+    HBufC8* buf = HBufC8::NewLC( bufSize );
+    TPtr8 ptr( buf->Des() );
+    
+    // Append UDP prefix
+    ptr.Append( KUDPPrefix );
+
+    // Append peer port
+    hexbuf.Format( KHexFormat, aPeerPort );
+    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 );
+    }
+
+// -----------------------------------------------------------------------------
+// CProtocolUDP::HandleReceivedDataL
+// -----------------------------------------------------------------------------
+//
+TBool CProtocolUDP::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;
+    }
+//  End of File