natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsaftcprelaypacket.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsaftcprelaypacket.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,210 @@
+/*
+* Copyright (c) 2006-2007 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:   
+*
+*/
+
+
+
+
+/*
+TCP Relay packet header:
+
+    0                   1                   2                   3
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   | Relay type    | Reserved=0x00 |           Data length         |
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+*/
+
+#include <es_sock.h>
+#include "natfwunsaftcprelaypacket.h"
+#include "natfwunsafutils.h"
+
+// CONSTANTS
+const TInt KByteSize = 8;
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNATFWUNSAFTcpRelayPacket* CNATFWUNSAFTcpRelayPacket::NewL(
+    const TDesC8& aData,
+    const TRelayType aType)
+    {
+    CNATFWUNSAFTcpRelayPacket* self =
+        CNATFWUNSAFTcpRelayPacket::NewLC(aData, aType);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNATFWUNSAFTcpRelayPacket* CNATFWUNSAFTcpRelayPacket::NewLC(
+    const TDesC8& aData,
+    const TRelayType aType)
+    {
+    CNATFWUNSAFTcpRelayPacket* self =
+        new (ELeave) CNATFWUNSAFTcpRelayPacket();
+    CleanupStack::PushL(self);
+    self->ConstructL(aData, aType);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::CreateL
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFTcpRelayPacket* CNATFWUNSAFTcpRelayPacket::CreateL(
+    const TDesC8& aData,
+    const TRelayType aType )
+    {
+    return NewL(aData, aType);
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::CNATFWUNSAFTcpRelayPacket
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFTcpRelayPacket::CNATFWUNSAFTcpRelayPacket()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::~CNATFWUNSAFTcpRelayPacket
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFTcpRelayPacket::~CNATFWUNSAFTcpRelayPacket()
+    {
+    delete iData;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFTcpRelayPacket::ConstructL(
+    const TDesC8& aData,
+    const TRelayType aType )
+    {
+    CheckLengthL(aData.Length());
+    iData = aData.AllocL();
+    iType = aType;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::EncodeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CBufBase* CNATFWUNSAFTcpRelayPacket::EncodeL() const
+    {
+    CBufBase* relay = EncodeRelayHeaderLC();
+    relay->InsertL(relay->Size(), *iData);
+    CleanupStack::Pop(relay);
+    SetRelayLength(*relay);
+    return relay;
+    }
+    
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::EncodeRelayHeaderLC
+// -----------------------------------------------------------------------------
+//
+CBufBase* CNATFWUNSAFTcpRelayPacket::EncodeRelayHeaderLC() const
+    {
+    CBufBase* header = CBufFlat::NewL(EFrameSize);
+    CleanupStack::PushL(header);
+    TUint16 relayType = Type();
+     // Last eight bits of frame type are reserved as zeros
+    relayType <<= KByteSize;
+    TUint16 bigEndianType(0);
+    BigEndian::Put16(reinterpret_cast<TUint8*>(&bigEndianType), relayType);
+    header->InsertL(EFrameTypeOffset, &bigEndianType, sizeof(bigEndianType));
+    //Value is zero, so it is same also in the big endian representation
+    TUint16 frameLength(0);
+    header->InsertL(EFrameLengthOffset, &frameLength, sizeof(frameLength));
+    return header;
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::RelayLength
+// TInt is guaranteed to be at least 32 bits.
+// -----------------------------------------------------------------------------
+//
+TInt CNATFWUNSAFTcpRelayPacket::RelayLength(const TDesC8& aRelay)
+    {
+    if (aRelay.Length() < EFrameSize)
+        {
+        return KErrNotFound;
+        }
+
+    return BigEndian::Get16(aRelay.Mid(EFrameLengthOffset).Ptr());
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::SetRelayLength
+// UNSAF Relay length does not include the NATFWUNSAF header
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFTcpRelayPacket::SetRelayLength(CBufBase& aRelay)
+    {
+    SetRelayLength(aRelay, aRelay.Size() - EFrameSize);
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::SetRelayLength
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFTcpRelayPacket::SetRelayLength(CBufBase& aRelay, TInt aLength)
+    {
+    __ASSERT_ALWAYS(aLength >= 0, User::Panic(KNullDesC, KErrUnderflow));
+
+    TUint16 bigEndianLength(0);
+    BigEndian::Put16(reinterpret_cast<TUint8*>(&bigEndianLength),
+                 static_cast<TUint16>(aLength));
+
+    aRelay.Write(EFrameLengthOffset, &bigEndianLength,
+        sizeof(bigEndianLength));
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::CheckLengthL
+// Check the granularity of attribute's length.
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFTcpRelayPacket::CheckLengthL(TInt aLength) const
+    {
+    __ASSERT_ALWAYS((aLength % EGranularity) == 0, User::Leave(KErrCorrupt));
+    }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::Data
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CNATFWUNSAFTcpRelayPacket::Data() const
+    {
+    return *iData;
+    }
+    
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFTcpRelayPacket::Type
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CNATFWUNSAFTcpRelayPacket::TRelayType
+    CNATFWUNSAFTcpRelayPacket::Type() const
+    {
+    return iType;
+    }