natfw/natfwunsaf_protocols/unsaf_codec/inc/natfwunsafmessage.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwunsaf_protocols/unsaf_codec/inc/natfwunsafmessage.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,295 @@
+/*
+* 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 CNATFWUNSAFMESSAGE_H
+#define CNATFWUNSAFMESSAGE_H
+
+// INCLUDES
+#include <e32base.h>
+#include "natfwinternaldefs.h"    //UNIT_TEST
+#include "natfwunsaftransactionid.h"
+#include "natfwunsafattribute.h"
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+/**
+* An abstract base class for NATFWUNSAF requests, indications and responses.
+*
+*  @lib natfwunsafprotocols.lib
+*/
+class CNATFWUNSAFMessage : public CBase
+    {
+    public: // Enumerations
+
+        enum TMethod // Values are from RFC 3489 and TURN draft
+            {
+            EBinding = 0x0001,
+            ESharedSecret = 0x0002,
+            EAllocate = 0x0003,
+            ESetActiveDestination = 0x0004,
+            EConnect = 0x0005,
+            //NOTE: ESend changed from 0x0006 to conform with old TURN draft-03
+            //to get things to work in our test infra for now
+            ESend = 0x0001,
+            //NOTE: EData changed from 0x0007 to conform with old TURN draft-03
+            //to get things to work in our test infra for now
+            EData = 0x0002,
+            EConnectStatus = 0x0008
+            };
+
+        enum TClass // Values are from RFC 3489 bis 08
+            {
+            ERequestMask = 0x0000,
+            EIndicationMask = 0x0010,
+            EResponseMask = 0x0100,
+            EErrorResponseMask = 0x0110 
+            };
+
+        enum TType // Currently supported message types
+            {
+            EBindingRequest =
+                EBinding | ERequestMask,
+            EBindingIndication =
+                EBinding | EIndicationMask,
+            EBindingResponse =
+                EBinding | EResponseMask,
+            EBindingErrorResponse =
+                EBinding | EErrorResponseMask,
+            ESharedSecretRequest =
+                ESharedSecret | ERequestMask,
+            ESharedSecretResponse =
+                ESharedSecret | EResponseMask,
+            ESharedSecretErrorResponse =
+                ESharedSecret | EErrorResponseMask,
+            EAllocateRequest =
+                EAllocate | ERequestMask,
+            EAllocateResponse =
+                EAllocate | EResponseMask,
+            EAllocateErrorResponse =
+                EAllocate | EErrorResponseMask,
+            ESendIndication =
+                ESend | EIndicationMask,
+            EDataIndication =
+                EData | EIndicationMask,
+            ESetActiveDestinationRequest =
+                ESetActiveDestination | ERequestMask,
+            ESetActiveDestinationResponse =
+                ESetActiveDestination | EResponseMask,
+            ESetActiveDestinationErrorResponse =
+                ESetActiveDestination | EErrorResponseMask,
+            EConnectRequest =
+                EConnect | ERequestMask,
+            EConnectResponse =
+                EConnect | EResponseMask,
+            EConnectErrorResponse =
+                EConnect | EErrorResponseMask,
+            EConnectStatusIndication =
+                EConnectStatus | EIndicationMask
+            };
+
+        enum THeader // RFC 3489 bis 08
+            {
+            EMessageTypeOffset     = 0,
+            EMessageLengthOffset   = 2,
+            EMagicCookieOffset     = 4,
+            ETransactionIDOffset   = 8,
+
+            EMessageTypePrefixMask = 0xc000,
+            EMessageTypeMask       = 0x3fff,
+            EMessageMethodMask     = 0x0001,
+            EMessageClassMask      = 0x0110,
+            EMagicCookie           = 0x2112A442,
+            EHeaderSize            = 20
+            };
+
+    public: // Constructors and destructor
+
+        /**
+        * Destructor, deletes the resources of CNATFWUNSAFMessage.
+        */
+        virtual ~CNATFWUNSAFMessage();
+
+
+    public: // New pure virtual functions
+
+        /**
+        * The type of the UNSAF message
+        * @return UNSAF message type
+        */
+        virtual TType Type() const = 0;
+
+        /**
+        * Validates the UNSAF message. In other words checks that
+        * all the mandatory attributes are present.
+        * @return ETrue if the message is valid. Otherwise EFalse.
+        */
+        virtual TBool Validate() const = 0;
+
+        /**
+        * Determine if the specified attribute is allowed to be present in the
+        * UNSAF message in question.
+        * @return ETrue  Attribute is allowed
+        *          EFalse Otherwise
+        */
+        virtual TBool IsAllowed(TUint16 aAttributeType) const = 0;
+
+    public: // New functions
+
+        /**
+        * Obtains the transaction ID.
+        * @return NATFWUNSAF transaction ID
+        */
+        IMPORT_C TNATFWUNSAFTransactionID TransactionID() const;
+
+        /**
+        * Checks whether a UNSAF attribute is present in this UNSAF message.
+        * @param aType the attribute type
+        * @return ETrue if the attribute is present, otherwise EFalse.
+        */
+        IMPORT_C TBool HasAttribute(CNATFWUNSAFAttribute::TType aType) const;
+
+        /**
+        * Gets a UNSAF attribute from the UNSAF message.
+        * @param aType the attribute type
+        * @return NULL if the attribute is not present.
+        *         Otherwise a pointer to the attribute.
+        *         The ownership is not transferred.
+        */
+        IMPORT_C CNATFWUNSAFAttribute* Attribute(
+            CNATFWUNSAFAttribute::TType aType) const;
+
+        /**
+        * Adds a UNSAF attribute to the UNSAF message.
+        * @param aAttribute the attribute to be added.
+        *        The ownership is transferred.
+        */
+        IMPORT_C void AddAttributeL(CNATFWUNSAFAttribute* aAttribute);
+
+        /**
+        * Detaches a UNSAF attribute from the UNSAF message.
+        * @param aAttribute the attribute to be detached.
+        *        The caller gets the ownership of the attribute.
+        */
+        IMPORT_C void DetachAttribute(const CNATFWUNSAFAttribute* aAttribute);
+
+        /**
+        * Removes and deletes all attribute of the specified type from UNSAF
+        * message.
+        * @param aType Attribute type to delete
+        */
+        IMPORT_C void DeleteAttribute(TUint16 aType);
+
+        /**
+        * Encodes a UNSAF message without MESSAGE-INTEGRITY attribute.
+        * @return The encoded UNSAF message. The ownership is transferred.
+        */
+        IMPORT_C CBufBase* EncodeL() const;
+
+         /**
+        * Encodes a UNSAF message and adds MESSAGE-INTEGRITY attribute.
+        * @param aSharedSecret shared secret used to calculate the
+        *        value of the MESSAGE-INTEGRITY attribute.
+        * @param  aUseFingerprint flag indicating whether to add a FINGERPRINT
+        *         attribute.
+        * @return The encoded UNSAF message. The ownership is transferred.
+        */
+        IMPORT_C CBufBase* EncodeL(const TDesC8& aSharedSecret,
+            TBool aUseFingerprint=EFalse) const;
+
+        /**
+        * When decoding the UNSAF message, an unrecognized mandatory attribute
+        * has been encountered.
+        * @post iUnknownMandatoryAttributes == ETrue
+        */
+        void UnknownMandatoryAttributeFound();
+
+        /**
+        * Tells if there were unrecognized mandatory attributes when the
+        * message was decoded. These attributes have not been decoded.
+        * @return ETrue Unrecognized mandatory attributes were encountered
+        *         EFalse Otherwise
+        */
+        IMPORT_C TBool HasUnknownMandatoryAttributes() const;
+
+        /**
+        * Retrieves the UNSAF message length from a UNSAF message header.
+        * @param aNATFWUNSAFMessage a UNSAF message
+        * @return KErrNotFound if length field cannot be parsed.
+        *         Otherwise the value of the length field.
+        */
+        static TInt MessageLength(const TDesC8& aNATFWUNSAFMessage);
+
+        /**
+        * Writes the length field into NATFWUNSAF header.
+        * @param aNATFWUNSAFMessage Encoded UNSAF message whose length is to be
+        *    calculated and written.
+        */
+        static void SetMessageLength(CBufBase& aNATFWUNSAFMessage);
+
+        /**
+        * Writes the length field into NATFWUNSAF header.
+        * @param aNATFWUNSAFMessage Encoded UNSAF message whose
+        *        length is to be set.
+        * @param aLength Value to write into the length field.
+        */
+        static void SetMessageLength(CBufBase& aNATFWUNSAFMessage,
+            TInt aLength);
+
+    protected: // Constructors
+
+        CNATFWUNSAFMessage(const TNATFWUNSAFTransactionID& aTransactionID);
+
+    private:
+
+        /**
+        * Encodes the UNSAF message header.
+        * @return The encoded UNSAF message header. The ownership is
+        * transferred.
+        */
+        CBufBase* EncodeMessageHeaderLC() const;
+
+    private: // Data
+
+        TNATFWUNSAFTransactionID iTransactionID;
+
+        //Owned
+        RPointerArray<CNATFWUNSAFAttribute> iAttributes;
+
+        //ETrue if an unrecognized mandatory attribute was encountered when
+        //decoding this UNSAF message.
+        TBool iUnknownMandatoryAttributes;
+
+    private: // For testing purposes
+
+        UNIT_TEST(UT_CNATFWUNSAFMessage)
+        UNIT_TEST(UT_CNATFWUNSAFMessageFactory)
+        UNIT_TEST(UT_CNATFWUNSAFBindingRequest)
+        UNIT_TEST(UT_CNATFWUNSAFAllocateRequest)
+        UNIT_TEST(UT_CNATFWUNSAFConnectRequest)
+        UNIT_TEST(UT_CNATFWUNSAFSendIndication)
+        UNIT_TEST(UT_CNATFWUNSAFSetActiveDestinationRequest)
+        UNIT_TEST(UT_CNATFWUNSAFTcpRelayPacketFactory)
+        UNIT_TEST(UT_CNATFWUNSAFBindingResponse)
+    };
+
+#endif // CNATFWUNSAFMESSAGE_H
+
+