natfw/natfwunsaf_protocols/unsaf_codec/inc/natfwunsafaddressattribute.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwunsaf_protocols/unsaf_codec/inc/natfwunsafaddressattribute.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,155 @@
+/*
+* 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:   
+*
+*/
+
+
+
+
+#ifndef CNATFWUNSAFADDRESSATTRIBUTE_H
+#define CNATFWUNSAFADDRESSATTRIBUTE_H
+
+// INCLUDES
+#include <in_sock.h>
+#include "natfwinternaldefs.h"    //UNIT_TEST
+#include "natfwunsafattribute.h"
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+/**
+ * An abstract base class for UNSAF attributes having
+ * the same syntax as MAPPED-ADDRESS.
+ */
+class CNATFWUNSAFAddressAttribute : public CNATFWUNSAFAttribute
+    {
+    public: // Constructors and destructor
+
+        /**
+        * Destructor, deletes the resources of CNATFWUNSAFAddressAttribute.
+        */
+        virtual ~CNATFWUNSAFAddressAttribute();
+
+    public: // From CNATFWUNSAFAttribute
+
+        HBufC8* EncodeValueL() const;
+
+    public: // New functions
+
+        /**
+        * Returns modifiable address
+        * @return the address
+        */
+        IMPORT_C TInetAddr& Address();
+
+        /**
+        * Returns non-modifiable address
+        * @return the address
+        */
+        IMPORT_C const TInetAddr& Address() const;
+
+    protected: // Constructors
+
+        CNATFWUNSAFAddressAttribute();
+        CNATFWUNSAFAddressAttribute(const TInetAddr& aInetAddr);
+
+    protected: // New functions
+
+        /**
+        * Checks if the contained ip-address is an IPv6 address.
+        * @return ETrue if IPv6 address, EFalse if IPv4 address.
+        */
+        TBool IsIPv6Address() const;
+
+        /**
+        * Checks if the ip-address is an IPv6 address.
+        * @param aInetAddr IP-address
+        * @return ETrue if IPv6 address, EFalse if IPv4 address.
+        */
+        TBool IsIPv6Address(const TInetAddr& aInetAddr) const;
+
+        /**
+        * Encodes the address part (IP address and port) of the contained
+        * IP-address.
+        * @param aResult Buffer where the result will be written
+        */
+        virtual void EncodeAddressL(TDes8& aResult) const;
+
+        /**
+        * Encodes the address part (IP address and port)
+        * @param aInetAddr IP-address to encode
+        * @param aResult Buffer where the result will be written
+        */
+        void EncodeAddressL(const TInetAddr& aInetAddr,
+                            TDes8& aResult) const;
+
+        /**
+        * Decodes the value part of the attribute and updates iInetAddr
+        * accordingly.
+        * @param aValue Value part of the attribute to be decoded
+        */
+        void DecodeValueL(const TDesC8& aValue);
+
+        /**
+        * Check the attribute's length field has a valid value.
+        * @param aByteStream Stream containing attribute in binary format,
+        *    starting from the type-field.
+        * @leave KErrCorrupt If the length field in aByteStream is invalid
+        */
+        static void CheckLengthL(const TDesC8& aByteStream);
+
+    private: // New functions, for internal use
+
+        /**
+        * Decodes an IPv6 address and updates iInetAddr accordingly.
+        * @param aValue Address part of the attribute to be decoded
+        */
+        void DecodeIPv6AddressL(const TDesC8& aValue);
+
+    protected: // Data
+
+        TInetAddr iInetAddr;
+
+        //Values are from RFC 3489
+        enum TEncodedValue
+            {
+            //Offset to fields inside the attribute value
+            EFamilyOffset = 1,
+            EPortOffset = 2,
+            EAddressOffset = 4,
+
+            KAddressFamilyIPv4 = 0x01,
+            KAddressFamilyIPv6 = 0x02,
+
+            //Size in bytes of the attribute value
+            EAttributeValueSizeIPv4 = 8,
+            EAttributeValueSizeIPv6 = 20
+            };
+
+    private: // For testing purposes
+
+        UNIT_TEST(UT_CNATFWUNSAFMessage)
+        UNIT_TEST(UT_CNATFWUNSAFMessageFactory)
+        UNIT_TEST(UT_CNATFWUNSAFMappedAddressAttribute)
+        UNIT_TEST(UT_CNATFWUNSAFAlternateServerAttribute)
+        UNIT_TEST(UT_CNATFWUNSAFDestinationAddressAttribute)
+        UNIT_TEST(UT_CNATFWUNSAFRelayAddressAttribute)
+        UNIT_TEST(UT_CNATFWUNSAFRemoteAddressAttribute)
+        UNIT_TEST(UT_CNATFWUNSAFRequestedIpAttribute)
+    };
+
+#endif // CNATFWUNSAFADDRESSATTRIBUTE_H
+
+