natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsafaddressattribute.cpp
changeset 0 1bce908db942
--- /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 <es_sock.h>
+#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<TUint16>
+                                         (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();
+    }