diff -r 000000000000 -r 1bce908db942 natfw/natfwunsaf_protocols/unsaf_codec/inc/natfwunsafmessage.h --- /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 +#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 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 + +