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