realtimenetprots/sipfw/SDP/api/SdpAttributeField.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SDP/api/SdpAttributeField.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,391 @@
+/*
+* Copyright (c) 2003-2009 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:
+* Name          : SdpAttributeField.h
+* Part of       : SDP Codec
+* Interface     : SDK API, SDP Codec API
+* Version       : 1.0
+*
+*/
+
+
+
+#ifndef CSDPATTRIBUTEFIELD_H
+#define CSDPATTRIBUTEFIELD_H
+
+//  INCLUDES
+#include <e32base.h>
+#include <stringpool.h>
+#include "sdpcodecstringconstants.h"
+
+// FORWARD DECLARATIONS
+class RReadStream;
+class RWriteStream;
+class CSdpFmtAttributeField;
+class CSdpAttributeFieldPtrs;
+
+// CLASS DECLARATION
+/**
+ *  @publishedAll
+ *  @released
+ *
+ *	This class encapsulates the attribute field of Session Description Protocol
+ *	for media and session level attributes. Media format/payload type level
+ *  attributes are supported by the CSdpFmtAttributeField class. 
+ * 
+ *	The normative reference for correct formatting and values is
+ *	draft-ietf-mmusic-sdp-new-14 unless specified otherwise in
+ *  member documentation. The implementation supports this normative
+ *  reference, but does not enforce it fully. 
+ *
+ *  @lib sdpcodec.lib
+ */
+class CSdpAttributeField : public CBase
+	{
+    public:     // Constructors and destructor
+
+        /**
+         *	Constructs a new attribute field.
+		 *			 
+         *	@param aText A string containing a correctly 
+         *         formatted field value terminated by a CRLF.
+         *	@return a new instance.
+         */
+		IMPORT_C static CSdpAttributeField* DecodeL( const TDesC8& aText );
+
+        /**
+         *	Constructs a new attribute field and adds the pointer to the 
+         *  cleanup stack.
+		 *		 
+         *	@param aTest A string containing a correctly 
+         *         formatted field value terminated by a CRLF.
+         *	@return a new instance.
+         */
+		IMPORT_C static CSdpAttributeField* DecodeLC( const TDesC8& aText );
+
+        /**
+         *	Constructs a new attribute field. 
+		 *
+         *	@param aAttribute The attribute name. It can be a pre-
+         *         defined name in the SDP string pool or defined by the 
+         *         client.
+         *	@param aValue A valid attribute value or an empty 
+         *         descriptor to omit the value part.
+         *	@return a new instance.
+		 */
+		IMPORT_C static CSdpAttributeField* NewL(
+            RStringF aAttribute, const TDesC8& aValue );
+
+        /**
+         *	Constructs a new attribute field and adds the pointer to the 
+         *  cleanup stack. 
+		 *
+         *	@param aAttribute The attribute name. It can be a pre-defined 
+         *         name in the SDP string pool or defined by the client.
+         *	@param aValue A valid attribute value or an empty 
+         *         descriptor to omit the value part.
+         *	@return a new instance.
+		 */
+		IMPORT_C static CSdpAttributeField* NewLC(
+            RStringF aAttribute, const TDesC8& aValue );
+
+ 		/**
+		 *	Deletes the resources held by the instance.
+		 */
+		IMPORT_C ~CSdpAttributeField();
+
+    public:     // New functions
+	
+    	/**
+		 *	Outputs the field formatted according to SDP syntax and including
+		 *  the terminating CRLF.
+		 * 
+		 *	@param aStream Stream used for output. On return the 
+         *         stream includes correctly formatted attribute field.
+		 */
+		IMPORT_C void EncodeL( RWriteStream& aStream ) const;
+
+		/**
+		 *	Creates a new instance that is equal to the target.
+		 *
+		 *	@return a new instance.
+		 */
+		IMPORT_C CSdpAttributeField* CloneL() const;
+
+		/**	
+		 *	Compares this instance to another for equality.
+		 *
+		 *	@param aObj: The instance to compare to.
+		 *	@return ETrue if equal, EFalse if not.
+		 */
+		IMPORT_C TBool operator == ( const CSdpAttributeField& aObj ) const;
+
+		/**
+		 *	Gets the attribute name.
+		 *	
+		 *	@return	The attribute name. The name can be pre-defined 
+         *          name in the SDP string table or defined by the client.
+		 */
+		IMPORT_C RStringF Attribute() const;
+
+		/**
+		 *	Gets the attribute.
+		 *
+ 		 *	@return	The value or an empty descriptor if there is no value part.
+		 */
+		IMPORT_C const TDesC8& Value() const;
+
+		/**
+		 *	Sets the attribute and attribute value.
+		 *
+         *	@param aAttribute A valid attribute name. It can be a 
+         *         pre-defined name in the SDP string pool or 
+         *         defined by the client.
+         *	@param aValue A valid attribute value or an empty 
+         *         descriptor to omit the value part.
+		 *  @leave KErrSdpCodecAttributeField if the attribute part is not 
+		 *         pre-defined EAttributeFmtp or EAttributeRtpmap.
+		 */
+		IMPORT_C void SetL( RStringF aAttribute, const TDesC8& aValue );
+		
+		/**
+ 		 *	Assigns attribute to the format level attribute.
+ 		 *  In the final output the attribute will placed after format level
+		 *  attribute.
+ 		 *
+ 		 *	@param aFmtAttribute A format level 
+ 		 *         attribute this attribute is assigned to.
+ 		 */
+ 		IMPORT_C void AssignTo(const CSdpFmtAttributeField& aFmtAttribute);
+		
+		/**
+		 *	Test if the attribute belongs to the given format level attribute.
+		 *  Note, that the check can be true for the media level paremeter if
+		 *  it appears after the last format level attribute.
+		 *
+		 *	@param  aFmtAttribute: A format level 
+		 *          attribute this attribute belongs to.
+		 *	@return	ETrue if attribute belongs to the format level attribute, 
+		 *          EFalse otherwise.
+		 */
+		IMPORT_C TBool BelongsTo(const CSdpFmtAttributeField& aFmtAttribute) const;
+
+    public:     // Internal to codec
+
+        /**
+         *  Externalizes the object to stream
+         *
+         *  @param aStream Stream where the object's state will be stored
+         */
+		void ExternalizeL( RWriteStream& aStream ) const;
+
+        /**
+         *  Creates object from the stream data
+         *
+         *  @param aStream Stream where the object's state will be read
+         *  @return Initialized object
+         */
+        static CSdpAttributeField* InternalizeL( RReadStream& aStream );
+        
+        /**
+         *  Informs if the attribute belongs to any format level attribute.
+         *
+         *  @return ETrue if attribute belongs to any format level 
+		 *			attribute, EFalse otherwise.
+         */
+        TBool IsFmtAttribute();
+    
+	private:    // Constructors
+
+        /**
+         *  Constructor
+         */
+		CSdpAttributeField();
+
+        /**
+         *  Second phase constructor
+         *
+         *  @param aText Text string ending to LF character
+         */
+        void ConstructL( const TDesC8& aText );
+
+        /**
+         *  Second phase constructor
+         *
+         *  @param aAttribute Attribute identifier
+         *  @param aValue Value of the attribute of KNullDesC8
+         */
+        void ConstructL( RStringF aAttribute, const TDesC8& aValue );
+    
+    private:    // Internal
+
+        /**
+         *  Verifies that attribute is valid property attribute and initializes
+         *  the member variables of class accordingly
+         *
+         *  @param aAttribute Attribute in descriptor
+         */
+        void FormatProperyAttributeL( const TDesC8& aAttribute );
+
+        /**
+         *  Verifies that attribute is valid value attribute and initializes
+         *  the member variables of class accordingly
+         *
+         *  @param aArray Array of the attributes
+         */
+        void FormatValueAttributeL( const TDesC8& aAttribute,
+                                    const TDesC8& aValue );
+
+        /**
+         *  Verifies that the value is valid for the attribute
+         *
+         *  @param aAttribute The attribute
+         *  @param aArray Array containing the values (and attribute)
+         */
+        void VerifyValueAttributeL( SdpCodecStringConstants::TStrings aString,
+                                    const TDesC8& aValue );
+                                    
+        /**
+         *  Forms attribute and value strings out of the token array
+         *  and pushes both (aAttribute & aValue) into cleanup stack
+         *
+         *  @param aArray Token array
+         *  @param aAttribute Attribute string (in cleanup stack)
+         *  @param aValue Value string (in cleanup stack)
+         */
+        void CreateAttributeAndValueStringsLC( RArray<TPtrC8>& aArray,
+                                               HBufC8*& aAttribute,
+                                               HBufC8*& aValue );
+
+        /**
+         *  Checks if the value is among the valid orient attributes
+         *
+         *  @param aValue Value string
+         */
+        void CheckValidOrientL( const TDesC8& aValue );
+
+        /**
+         *  Checks if the value is valid language attribute as
+         *  specified in RFC 3066
+         *
+         *  @param aValue Value string
+         */
+        void CheckValidLangStrL( const TDesC8& aValue );
+
+        /**
+         *  Checks if the value is valid framerate attribute
+         *
+         *  @param aValue Value string
+         */
+        void CheckValidFrameRateL( const TDesC8& aValue );
+        
+        /**
+         *  Checks if the value is among valid uri value for control attribute
+         *
+         *  @param aValue Value string
+         */       
+        void CheckValidControlL( const TDesC8& aValue );
+
+        /**
+         *  Checks if the value is valid value for group attribute as
+         *  specified in RFC 3388
+         *
+         *  @param aValue Value string
+         */       
+        void CheckValidGroupL( const TDesC8& aValue );
+
+        /**
+         *  Checks if the value is valid value for des attribute as
+         *  specified in RFC 3312
+         *
+         *  @param aValue Value string
+         */       
+        void CheckValidDesL( const TDesC8& aValue );
+
+        /**
+         *  Checks if the value is valid value for curr and conf attribute as
+         *  specified in RFC 3312
+         *
+         *  @param aValue Value string
+         */       
+        void CheckValidCurrAndConfL( const TDesC8& aValue );
+
+        /**
+         *  Checks if value is included in the list of predefined values
+         *
+         *  @param aItemsCount Predefined values count
+         *  @param aValuesList List of predefined values
+         *  @param aValue Value string
+         */       
+        void ValidValueInListL( TInt aItemsCount, 
+                                const TText8* const aValuesList[], 
+                                const TDesC8& aValue );
+
+        /**
+         *  Checks if the value is valid value for range attribute as
+         *  specified in RFC 2326
+         *
+         *  @param aValue Value string
+         */       
+        void CheckValidRangeL( const TDesC8& aValue );
+
+
+        /**
+         *  Checks if the value is valid rtpmap string
+         *
+         *  @param aValue Value string
+         */   
+        void CheckValidRtpmapL( const TDesC8& aValue );
+
+        /**
+         *  Checks if the value is valid fmtp string
+         *
+         *  @param aValue Value string
+         */   
+        void CheckValidFmtpL( const TDesC8& aValue );
+        
+        /**
+         *  Set attribute and values. Attribute is not one of predefined ones.
+         *
+         *  @param aAttribute Attribute string (in cleanup stack)
+         *  @param aValue Value string
+         */   
+        void SetNotPredefinedAttributeL( const TDesC8& aAttribute, 
+                                         const TDesC8& aValue );
+        
+        void CreateAttributeFieldPtrsL();
+        
+        inline CSdpAttributeFieldPtrs& AttributeFieldPtrs();      
+        
+        inline const CSdpAttributeFieldPtrs& AttributeFieldPtrs() const;
+	   
+		void __DbgTestInvariant() const;
+
+
+    private:    // Data
+
+        // String pool
+        RStringPool iPool;
+
+        // Attribute name
+        RStringF iAttribute;
+
+        // Flag indicating if the attribute is a property attribute
+        TBool iPropertyAttribute;
+
+        // Value field
+        HBufC8* iValue;
+	};
+
+#endif // CSDPATTRIBUTEFIELD_H