diff -r 000000000000 -r 1bce908db942 natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsaftcprelaypacket.cpp --- /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 +#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(&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(&bigEndianLength), + static_cast(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; + }