diff -r 000000000000 -r 1bce908db942 natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsafaddressattribute.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsafaddressattribute.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,211 @@ +/* +* 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: +* +*/ + + + + +#include +#include "natfwunsafaddressattribute.h" +#include "natfwunsafutils.h" + + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::CNATFWUNSAFAddressAttribute +// ----------------------------------------------------------------------------- +// +CNATFWUNSAFAddressAttribute::CNATFWUNSAFAddressAttribute() + { + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::CNATFWUNSAFAddressAttribute +// ----------------------------------------------------------------------------- +// +CNATFWUNSAFAddressAttribute::CNATFWUNSAFAddressAttribute( + const TInetAddr& aInetAddr) : + CNATFWUNSAFAttribute(), + iInetAddr(aInetAddr) + { + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::~CNATFWUNSAFAddressAttribute +// ----------------------------------------------------------------------------- +// +CNATFWUNSAFAddressAttribute::~CNATFWUNSAFAddressAttribute() + { + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::EncodeValueL +// ----------------------------------------------------------------------------- +// +HBufC8* CNATFWUNSAFAddressAttribute::EncodeValueL() const + { + TInt size = IsIPv6Address() ? EAttributeValueSizeIPv6 : + EAttributeValueSizeIPv4; + HBufC8* encodedValue = HBufC8::NewLC(size); + TPtr8 ptr = encodedValue->Des(); + ptr.FillZ(size); + + if (IsIPv6Address()) + { + ptr[EFamilyOffset] = KAddressFamilyIPv6; + } + else + { + ptr[EFamilyOffset] = KAddressFamilyIPv4; + } + EncodeAddressL(ptr); + + CleanupStack::Pop(encodedValue); + return encodedValue; + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::Address +// ----------------------------------------------------------------------------- +// +EXPORT_C TInetAddr& CNATFWUNSAFAddressAttribute::Address() + { + return iInetAddr; + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::Address +// ----------------------------------------------------------------------------- +// +EXPORT_C const TInetAddr& CNATFWUNSAFAddressAttribute::Address() const + { + return iInetAddr; + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::EncodeAddressL +// ----------------------------------------------------------------------------- +// +void CNATFWUNSAFAddressAttribute::EncodeAddressL(TDes8& aResult) const + { + EncodeAddressL(iInetAddr, aResult); + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::EncodeAddressL +// ----------------------------------------------------------------------------- +// +void CNATFWUNSAFAddressAttribute::EncodeAddressL(const TInetAddr& aInetAddr, + TDes8& aResult) const + { + NATFWUNSAFUtils::WriteNetworkOrder16L(aResult, + EPortOffset, + static_cast + (aInetAddr.Port())); + if (IsIPv6Address(aInetAddr)) + { + const TInt KIPv6AddressSize = EAttributeValueSizeIPv6 - EAddressOffset; + const TIp6Addr& ipv6Addr = aInetAddr.Ip6Address(); + for ( TInt i = 0; i < KIPv6AddressSize; ++ i ) + { + aResult[EAddressOffset + i] = ipv6Addr.u.iAddr8[i]; + } + } + else + { + NATFWUNSAFUtils::WriteNetworkOrder32L(aResult, + EAddressOffset, + aInetAddr.Address()); + } + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::DecodeValueL +// ----------------------------------------------------------------------------- +// +void CNATFWUNSAFAddressAttribute::DecodeValueL(const TDesC8& aValue) + { + //Byte stream must contain at least enough data for this attribute (at least + //enough data to contain an IPv4 address). It may contain more data (other + //attributes etc). + __ASSERT_ALWAYS(aValue.Length() >= EAttributeValueSizeIPv4, + User::Leave(KErrArgument)); + + iInetAddr.SetPort(BigEndian::Get16(aValue.Mid(EPortOffset).Ptr())); + + TUint8 addressFamily = aValue[EFamilyOffset]; + __ASSERT_ALWAYS(addressFamily == KAddressFamilyIPv4 || + addressFamily == KAddressFamilyIPv6, + User::Leave(KErrArgument)); + if (addressFamily == KAddressFamilyIPv6) + { + DecodeIPv6AddressL(aValue.Mid(EAddressOffset)); + } + else + { + //SetAddress also sets address family to KAfInet, meaning IPv4 address + iInetAddr.SetAddress( + BigEndian::Get32(aValue.Mid(EAddressOffset).Ptr())); + } + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::DecodeIPv6AddressL +// ----------------------------------------------------------------------------- +// +void CNATFWUNSAFAddressAttribute::DecodeIPv6AddressL(const TDesC8& aValue) + { + const TInt KIPv6AddressSize = EAttributeValueSizeIPv6 - EAddressOffset; + __ASSERT_ALWAYS(aValue.Length() >= KIPv6AddressSize, + User::Leave(KErrArgument)); + + TIp6Addr addr; + for ( TInt i = 0; i < KIPv6AddressSize; ++ i ) + { + addr.u.iAddr8[i] = aValue[i]; + } + iInetAddr.SetAddress(addr); + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::CheckLengthL +// ----------------------------------------------------------------------------- +// +void CNATFWUNSAFAddressAttribute::CheckLengthL(const TDesC8& aByteStream) + { + TUint16 length = ParseLengthL(aByteStream); + __ASSERT_ALWAYS(length == EAttributeValueSizeIPv4 || + length == EAttributeValueSizeIPv6, + User::Leave(KErrCorrupt)); + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::IsIPv6Address +// ----------------------------------------------------------------------------- +// +TBool CNATFWUNSAFAddressAttribute::IsIPv6Address() const + { + return IsIPv6Address(iInetAddr); + } + +// ----------------------------------------------------------------------------- +// CNATFWUNSAFAddressAttribute::IsIPv6Address +// ----------------------------------------------------------------------------- +// +TBool CNATFWUNSAFAddressAttribute::IsIPv6Address( + const TInetAddr& aInetAddr) const + { + return aInetAddr.Address() == 0 || aInetAddr.IsV4Compat(); + }