epoc32/include/mw/sdpmediafield.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     1 /*
     2 * Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description:
    15 * Name          : SdpMediaField.h
    16 * Part of       : SDP Codec
    17 * Interface     : SDK API, SDP Codec API
    18 * Version       : 1.0
    19 *
    20 */
    21 
    22 
    23 
    24 #ifndef CSDPMEDIAFIELD_H
    25 #define CSDPMEDIAFIELD_H
    26 
    27 //  INCLUDES
    28 #include <e32base.h>
    29 #include <stringpool.h>
    30 
    31 // FORWARD DECLARATIONS
    32 class RReadStream;
    33 class RWriteStream;
    34 class CSdpConnectionField;
    35 class CSdpBandwidthField;
    36 class CSdpAttributeField;
    37 class CSdpKeyField;
    38 class CSdpFmtAttributeField;
    39 class CSdpCodecParseUtil;
    40 
    41 // CLASS DECLARATION
    42 /**
    43  *  @publishedAll
    44  *  @released
    45  *
    46  *	This class encapsulates the media description field and related media
    47  *  specific subfields of the Session Description Protocol.
    48  *
    49  *	The normative reference for correct formatting and values is
    50  *	draft-ietf-mmusic-sdp-new-14 unless specified otherwise in
    51  *  member documentation. The implementation supports this normative
    52  *  reference, but does not enforce it fully. 
    53  *
    54  *  @lib sdpcodec.lib
    55  */
    56 class CSdpMediaField : public CBase
    57 	{
    58 
    59 	public:
    60 
    61 
    62     public: // Constructors and destructor
    63         /**
    64          *	Constructs a new media description field.
    65 		 *	
    66          *	@param aText A correctly formatted media field 
    67          *         terminated by a CRLF followed by zero or more media 
    68          *         attribute fields separated by a CRLF.
    69          *	@param aRecurse If ETrue, attempts to construct also media 
    70          *         attributes following the CRLF terminating the media field.
    71          *	@return a new instance.
    72          */
    73 		IMPORT_C static	CSdpMediaField* DecodeL(const TDesC8& aText,
    74 												TBool aRecurse = ETrue);
    75 
    76         /**
    77          *	Constructs a new media description field and adds the pointer to 
    78          *  the cleanup stack.
    79 		 *	
    80          *	@param aText A correctly formatted media field 
    81          *         terminated by a CRLF followed by zero or more media 
    82          *         attribute fields separated by a CRLF.
    83          *	@param aRecurse If ETrue, attempts to construct also media 
    84          *         attributes following the CRLF terminating the media field.
    85 		 *  @return a new instance.
    86          */
    87 		IMPORT_C static	CSdpMediaField* DecodeLC(const TDesC8& aText,
    88 												 TBool aRecurse = ETrue);
    89 
    90         /**
    91          *	Constructs a new media description field.
    92 		 *  The optional portcount component of the field is initialized to 1.
    93 		 *
    94 		 *	@param aMedia A valid media type name.
    95          *	@param aPort Port number.
    96          *	@param aProtocol A valid media protocol name.
    97          *	@param aFormatList A valid format list.
    98          *	@return a new instance.
    99          */
   100 		IMPORT_C static CSdpMediaField* NewL(RStringF aMedia,
   101 											 TUint aPort,
   102 											 RStringF aProtocol,
   103 											 const TDesC8& aFormatList);
   104 
   105 		/**
   106          *	Constructs a new media description field and adds the pointer to 
   107          *  the cleanup stack.
   108 		 *  The optional portcount component of the field is initialized to 1.
   109 		 *	
   110 		 *	@param aMedia A valid media type name.
   111          *	@param aPort Port number.
   112          *	@param aProtocol A valid media protocol name.
   113          *	@param aFormatList A valid format list.
   114          *	@return a new instance.
   115          */
   116 		IMPORT_C static CSdpMediaField* NewLC(RStringF aMedia,
   117 											  TUint aPort,
   118 										      RStringF aProtocol,
   119 										      const TDesC8& aFormatList);
   120 
   121 		/**
   122 		 *	Deletes the resources held by the instance.
   123 		 */
   124 		IMPORT_C ~CSdpMediaField();
   125 
   126     public: // New functions
   127 		/**
   128 		 *	Outputs the field formatted according to SDP syntax and including
   129 		 *  the terminating CRLF. Optionally output also the related media 
   130 		 *  level fields. 
   131 		 * 
   132 		 *	@param aStream Stream used for output. On return the
   133          *         stream includes correctly formatted media field with 
   134          *         media part fields if aRecurse is defined to ETrue.
   135 		 *	@param aRecurse Flag to specify whether to output media 
   136 		 *         attributes also (ETrue) or only the media field (EFalse).
   137 		 */
   138 		IMPORT_C void 
   139 			EncodeL(RWriteStream& aStream, TBool aRecurse = ETrue) const;
   140 
   141 		/**
   142 		 *	Creates a new instance that is equal to the target.
   143 		 *  Optionally also related subfields are cloned.
   144 		 *
   145 		 *	@param aRecurse Flag to specify whether to clone subfields
   146 		 *         also (ETrue) or only the media field (EFalse).
   147 		 *	@return a new instance.
   148 		 */
   149 		IMPORT_C CSdpMediaField * CloneL(TBool aRecurse = ETrue) const;
   150 
   151 		/**	
   152 		 *	Compares this instance to another for equality. Subfields are
   153 		 *  included in the comparison if present.
   154 		 *
   155 		 *	@param aObj The instance to compare to.
   156 		 *	@return ETrue if equal, EFalse if not.
   157 		 */
   158 		IMPORT_C TBool operator == (const CSdpMediaField& aObj) const;
   159 
   160 		/**
   161 		 *	Checks the consistency between the media field and it's subfields.
   162 		 *  In particular, this function checks that each format specific 
   163 		 *  attribute is related to a format in the format list of the
   164 		 *  media field.
   165 		 *
   166 		 *	@return	ETrue if media description is consistent and EFalse if not.
   167 		 */
   168 		IMPORT_C TBool IsValid() const;
   169 
   170 		/**
   171 		 *	Gets the media type.
   172 		 *
   173 		 *	@return The media type.
   174 		 */
   175 		IMPORT_C RStringF Media() const;
   176 
   177 		/**
   178 		 *	Sets the media type.
   179 		 *
   180 		 *	@param aMedia The media type.
   181 		 *  @leave KErrSdpCodecMediaField if aMedia is not valid character
   182 		 */
   183 		IMPORT_C void SetMediaL(RStringF aMedia);
   184 
   185 		/**
   186 		 *	Gets the media protocol.
   187 		 *
   188 		 *	@return The media protocol.
   189 		 */
   190 		IMPORT_C RStringF Protocol() const;
   191 
   192 		/**
   193 		 *	Sets the media protocol.
   194 		 *
   195 		 *	@param aProtocol The media protocol.
   196 		 *  @leave KErrSdpCodecMediaField if 
   197 		 *		   aProtocol containing two elements divided by slash are not 
   198          *         valid tokens.
   199 		 */
   200 		IMPORT_C void SetProtocolL(RStringF aProtocol);
   201 
   202 		/**
   203 		 *	Gets the port number.
   204 		 *
   205 		 *	@return The port number.
   206 		 */
   207 		IMPORT_C TUint Port() const;
   208 
   209 		/**
   210 		 *	Sets the port number.
   211 		 *
   212 		 *	@param aPort The port number.
   213 		 *  @leave KErrSdpCodecMediaField if port is not valid number as 
   214          *         defined in draft-ietf-mmusic-sdp-new-14
   215 		 */
   216 		IMPORT_C void SetPortL(TUint aPort);
   217 
   218 		/**
   219 		 *	Gets the port count.
   220 		 *
   221 		 *	@return The port count.
   222 		 */
   223 		IMPORT_C TUint PortCount() const;
   224 
   225 		/**
   226 		 *	Sets the port count.
   227 		 *
   228 		 *	@param aCount The port count that must be greater than zero.
   229 		 *  @leave KErrSdpCodecMediaField if aCount equals to zero.
   230 		 */
   231 		IMPORT_C void SetPortCountL(TUint aCount);
   232 
   233 		/**
   234 		 *	Gets the format list.
   235 		 *
   236 		 *	@return The format list.
   237 		 */
   238 		IMPORT_C const TDesC8& FormatList() const;
   239 
   240 		/**
   241 		 *	Sets the format list.
   242 		 *  The format list should contain one or more format tokens separated
   243 		 *  by a single whitespace character.
   244 		 *
   245 		 *	@param aValue A valid format list.
   246 		 *  @leave KErrSdpCodecMediaField if aValue contains invalid tokens
   247 		 */
   248 		IMPORT_C void SetFormatListL(const TDesC8& aValue);
   249 
   250 		/**
   251 		 *	Return the media level info field value.
   252 		 *
   253 		 *	@return The value or an empty descriptor if not present.
   254 		 */
   255 		IMPORT_C const TDesC8& Info() const;
   256 
   257 		/**
   258 		 *	Sets the media level info field value.
   259 		 *
   260 		 *	@param aValue A valid info field value.
   261 		 *	@leave KErrSdpCodecMediaInfoField if aValue is not KNullDesC8 or 
   262          *         aValue includes invalid byte strings (´\0´, ´\n´, ´\r´).
   263 		 */
   264 		IMPORT_C void SetInfoL(const TDesC8& aValue);
   265 
   266 		/**
   267 		 *	Gets the media level encryption key field.
   268 		 *	Note, that the ownership is not transferred and
   269 		 *	the instance must not be deleted by the caller.
   270 		 *
   271 		 *	@return Encryption key field or null if not present.
   272 		 */
   273 		IMPORT_C CSdpKeyField* Key();
   274 
   275 		/**
   276 		 *	Gets the media level encryption key field.
   277 		 *
   278 		 *	@return Encryption key field or null if not present.
   279 		 */
   280 		IMPORT_C const CSdpKeyField* Key() const;
   281 
   282 		/**
   283 		 *	Sets or removes the media level encryption key field.
   284 		 *
   285 		 *	@param aObj The new key field or null if field is 
   286          *         to be removed. Ownership of the referenced object
   287 		 *         is transferred to the media field instance.
   288 		 */
   289 		IMPORT_C void SetKey(CSdpKeyField* aObj);
   290 
   291 		/**
   292 		 *	Gets the set of media format level attributes.
   293 		 *  This array is used directly for element insertion and removal.
   294 		 *
   295 		 *	The objects referenced from the array are owned by the media
   296 		 *  field instance and must not be deleted. An object can be
   297 		 *  removed from the media description by setting the corresponding
   298 		 *  element to zero. By doing so, the calling party receives ownership
   299 		 *  of the removed object.
   300 		 *
   301 		 *	@return The set of media format level attributes.
   302 		 */
   303 		IMPORT_C RPointerArray<CSdpFmtAttributeField>& FormatAttributeFields();
   304 
   305 		/**
   306 		 *	Gets the set of media level, format independent attributes.
   307 		 *  This array is used directly for element insertion and removal.
   308 		 *
   309 		 *	The objects referenced from the array are owned by the media
   310 		 *  field instance and must not be deleted. An object can be
   311 		 *  removed from the media description by setting the corresponding
   312 		 *  element to zero. By doing so, the calling party receives ownership
   313 		 *  of the removed object.
   314 		 *
   315 		 *	@return The set of media level attributes.
   316 		 */
   317 		IMPORT_C RPointerArray<CSdpAttributeField>& AttributeFields();
   318 
   319 		/**
   320 		 *	Gets the set of media level bandwidth fields.
   321 		 *  This array is used directly for element insertion and removal.
   322 		 *
   323 		 *	The objects referenced from the array are owned by the media
   324 		 *  field instance and must not be deleted. An object can be
   325 		 *  removed from the media description by setting the corresponding
   326 		 *  element to zero. By doing so, the calling party receives ownership
   327 		 *  of the removed object.
   328 		 *
   329 		 *	@return The set of media level bandwidth fields.
   330 		 */
   331 		IMPORT_C RPointerArray<CSdpBandwidthField>& BandwidthFields();
   332 
   333 		/**
   334 		 *	Gets the set of media level connection fields.
   335 		 *  This array is used directly for element insertion and removal.
   336 		 *
   337 		 *	The objects referenced from the array are owned by the media
   338 		 *  field instance and must not be deleted. An object can be
   339 		 *  removed from the media description by setting the corresponding
   340 		 *  element to zero. By doing so, the calling party receives ownership
   341 		 *  of the removed object.
   342 		 *
   343 		 *	@return The set of media level connection fields.
   344 		 */
   345 		IMPORT_C RPointerArray<CSdpConnectionField>& ConnectionFields();
   346 
   347 		/**
   348 		 *	Removes a specific format from the media description.
   349 		 *  The function will remove the named format from the format list if
   350 		 *  found and then delete all format level attributes of type 
   351 		 *  CSdpFmtAttributeField related to the removed format. 
   352 		 *
   353 		 *	@param aFormat The name of the format to remove.
   354 		 */
   355 		IMPORT_C void RemoveFormatL(const TDesC8& aFormat);
   356 
   357 		/**
   358 		 *	Removes all formats except one from the media description.
   359 		 *  The function will set the format list to only contain the one
   360 		 *  format to keep and then delete all format level attributes that
   361 		 *  are related to the removed formats. If the format is not found
   362 		 *  from the format list, it is added there. If there are no format
   363 		 *  level attributes for the specified format, the format level
   364 		 *  attribute set will be empty.
   365 		 *
   366 		 *	@param aFormat The name of the format to keep after 
   367 		 *         removing all others.
   368 		 */
   369 		IMPORT_C void KeepFormatL(const TDesC8& aFormat);
   370 
   371 		/**
   372 		 *	Sets this media description into rejected state.
   373 		 *  The rejected state is defined by the offer/answer model in
   374 		 *  RFC3264. The function sets the port number to 0 and removes
   375 		 *  all formats except one. The remaining format is determined
   376 		 *  by the implementation.
   377 		 */
   378 		IMPORT_C void RejectMedia();
   379 
   380     public:
   381 		/**
   382 		 *	Shows if contact is present
   383 		 *
   384 		 *	@return ETrue if contact present, otherwise EFalse
   385 		 */
   386 		TBool IsContactPresent() const;
   387 		
   388 		/**
   389          *  Externalizes the object to stream
   390          *
   391          *  @param aStream Stream where the object's state will be stored
   392          */
   393 		void ExternalizeL(RWriteStream& aStream) const;
   394 		
   395 		/**
   396          *  Creates object from the stream data
   397          *
   398          *  @param aStream Stream where the object's state will be read	
   399          *  @return Initialized object
   400          */
   401 		static CSdpMediaField* InternalizeL(RReadStream& aStream);
   402 
   403 	private:
   404 		CSdpMediaField();
   405 		void ConstructL();
   406 		void ConstructL(TBool aRecurse);
   407 		void ConstructL(RStringF aMedia, TUint aPort, RStringF aProtocol, 
   408 						const TDesC8& aFormatList);
   409 
   410 		void ConstructL(const CSdpMediaField& aSdpMediaField);
   411 		void DoInternalizeL(RReadStream& aStream);
   412 		void ParseL (const TDesC8& aText);
   413 		void ParseMediaL();
   414 		void ParseInformationL();
   415 		void ParseConnectionL();
   416 		void ParseBandwithL();
   417 		void ParseEncryptionKeyL();
   418 		void ParseAttributeFieldsL();
   419 		TDesC8& GetTokenFromStreamL(RReadStream& aStream);
   420 
   421 
   422 		CSdpMediaField(const CSdpMediaField&); // Hidden.
   423 		CSdpMediaField& operator = (const CSdpMediaField&); // Hidden
   424 
   425     private: // Data
   426 		HBufC8* iInfo;
   427 		CSdpKeyField* iSdpKeyField;
   428 		RArray<TPtrC8> iElementArray;
   429 		RStringPool iPool;
   430 		TBool iRecurse;
   431 		RStringF iMedia;
   432 		RStringF iProtocol;
   433 		TUint iPort;
   434 		TUint iPortCount;
   435 		HBufC8* iFormatList;
   436 		RPointerArray<CSdpBandwidthField>* iBandwidthFields;
   437 		RPointerArray<CSdpAttributeField>* iAttributeFields;
   438 		RPointerArray<CSdpConnectionField>* iConnectionFields;
   439 		RPointerArray<CSdpFmtAttributeField>* iFmtAttrFields;
   440 		HBufC8* iToken;
   441 		CSdpCodecParseUtil* iSdpCodecParseUtil;
   442 	};
   443 
   444 #endif // CSDPMEDIAFIELD_H