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 : SdpDocument.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 CSDPDOCUMENT_H williamr@2: #define CSDPDOCUMENT_H williamr@2: williamr@2: // INCLUDES williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: // FORWARD DECLARATIONS williamr@2: class SdpUtil; williamr@2: class RReadStream; williamr@2: class RWriteStream; williamr@2: class CUri8; williamr@2: class CDesC8Array; williamr@2: class CSdpOriginField; williamr@2: class CSdpEmailField; williamr@2: class CSdpPhoneField; williamr@2: class CSdpConnectionField; williamr@2: class CSdpBandwidthField; williamr@2: class CSdpTimeField; williamr@2: class CSdpAttributeField; williamr@2: class CSdpMediaField; williamr@2: class CSdpKeyField; williamr@2: class CSdpCodecParseUtil; williamr@2: williamr@2: // CLASS DECLARATION williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * williamr@2: * This class encapsulates the Session Description Protocol (SDP) document. williamr@2: * The SDP document is a collection of SDP fields and related values williamr@2: * describing a session. 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 CSdpDocument : public CBase williamr@2: { williamr@2: public: // Constructors and destructor williamr@2: /** williamr@2: * Constructs a new SDP document. williamr@2: * williamr@2: * @param aText A string containing a correctly formatted SDP document. williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpDocument* DecodeL(const TDesC8& aText); williamr@2: williamr@2: /** williamr@2: * Constructs a new SDP document and adds the pointer to the cleanup stack. williamr@2: * williamr@2: * @param aText A string containing a correctly formatted SDP document. williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpDocument* DecodeLC(const TDesC8& aText); williamr@2: williamr@2: /** williamr@2: * Constructs a new, empty SDP document. williamr@2: * The instance will have the following initial values: williamr@2: * v=0 williamr@2: * s=- williamr@2: * t=0 0 williamr@2: * williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpDocument* NewL(); williamr@2: williamr@2: /** williamr@2: * Constructs a new, empty SDP document document and adds the pointer to williamr@2: * the cleanup stack. williamr@2: * The instance will have the following initial values: williamr@2: * v=0 williamr@2: * s=- williamr@2: * t=0 0 williamr@2: * williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpDocument* NewLC(); williamr@2: williamr@2: /** williamr@2: * Deletes the resources held by the instance. williamr@2: */ williamr@2: IMPORT_C ~CSdpDocument(); williamr@2: williamr@2: public: williamr@2: /** williamr@2: * Externalizes the object state in an internal, memory optimized format. williamr@2: * williamr@2: * @param aStream The output stream. williamr@2: */ williamr@2: IMPORT_C void ExternalizeL(RWriteStream& aStream) const; williamr@2: williamr@2: /** williamr@2: * Internalizes the object state from an internal, memory optimized format. williamr@2: * williamr@2: * @param aStream The input stream. williamr@2: * @return A new SDP document internalized from the input stream. williamr@2: */ williamr@2: IMPORT_C static CSdpDocument* InternalizeL(RReadStream& aStream); williamr@2: williamr@2: /** williamr@2: * Outputs the SDP document formatted according to SDP syntax. williamr@2: * It is possible to output the document even though it is williamr@2: * incomplete in the sense that all mandatory SDP fields are williamr@2: * not present.When creating an SDP document to be used e.g. williamr@2: * as part of SIP signalling, caller should first ensure the williamr@2: * validity of the document using the IsValid() function. williamr@2: * williamr@2: * @param aStream Stream used for output. On return the williamr@2: * stream includes correctly formatted SDP description. 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 CSdpDocument* CloneL() const; williamr@2: williamr@2: /** williamr@2: * Checks if the instance represents a valid SDP document. williamr@2: * williamr@2: * @return ETrue if SDP document is valid and EFalse if not. williamr@2: */ williamr@2: IMPORT_C TBool IsValid() const; williamr@2: williamr@2: /** williamr@2: * Gets the SDP version used in the version field. williamr@2: * Note, that the current implementation supports only version number 0. williamr@2: * williamr@2: * @return The SDP version number. williamr@2: */ williamr@2: IMPORT_C TUint SdpVersion() const; williamr@2: williamr@2: /** williamr@2: * Gets a reference to the session origin field. williamr@2: * Note, that the ownership is not transferred and williamr@2: * the instance must not be deleted by the caller. williamr@2: * williamr@2: * @return The origin field or zero if not present. williamr@2: */ williamr@2: IMPORT_C CSdpOriginField* OriginField(); williamr@2: williamr@2: /** williamr@2: * Gets a reference to the session origin field. williamr@2: * williamr@2: * @return The origin field or zero if not present. williamr@2: */ williamr@2: IMPORT_C const CSdpOriginField* OriginField() const; williamr@2: williamr@2: /** williamr@2: * Sets or removes the session origin field. williamr@2: * Note, that the ownership of the argument is williamr@2: * transferred to the SDP document object. williamr@2: * williamr@2: * @param aObj New origin field or null to remove the field. williamr@2: */ williamr@2: IMPORT_C void SetOriginField(CSdpOriginField* aObj); williamr@2: williamr@2: /** williamr@2: * Gets the session name field value. williamr@2: * williamr@2: * @return The session name or empty descriptor if not present. williamr@2: */ williamr@2: IMPORT_C const TDesC8& SessionName() const; williamr@2: williamr@2: /** williamr@2: * Sets the session name field value. williamr@2: * williamr@2: * @param aValue Valid session name value. williamr@2: * Note that an empty value is not accepted. williamr@2: * @leave KErrSdpCodecSessionField if williamr@2: * aValue is not empty or aValue includes invalid byte strings williamr@2: * (´\0´, ´\n´, ´\r´). williamr@2: */ williamr@2: IMPORT_C void SetSessionNameL(const TDesC8& aValue); williamr@2: williamr@2: /** williamr@2: * Gets the session information field value. williamr@2: * williamr@2: * @return Info field value or an empty descriptor if not present. williamr@2: */ williamr@2: IMPORT_C const TDesC8& Info() const; williamr@2: williamr@2: /** williamr@2: * Sets or removes the session information field value. williamr@2: * williamr@2: * @param New field value or an empty descriptor to remove the field. williamr@2: * @leave KErrSdpCodecInfoField if aValue is not empty or aValue includes williamr@2: * invalid byte strings (´\0´, ´\n´, ´\r´). williamr@2: */ williamr@2: IMPORT_C void SetInfoL(const TDesC8& aValue); williamr@2: williamr@2: /** williamr@2: * Gets the session URI field value. williamr@2: * Note, that the ownership is not transferred and williamr@2: * the instance must not be deleted by the caller. williamr@2: * williamr@2: * @return CUri8*: Session URI or zero if the field is not present. williamr@2: */ williamr@2: IMPORT_C CUri8* Uri(); williamr@2: williamr@2: /** williamr@2: * Gets the session URI field value. williamr@2: * williamr@2: * @return Session URI or zero if the field is not present. williamr@2: */ williamr@2: IMPORT_C const CUri8* Uri() const; williamr@2: williamr@2: /** williamr@2: * Sets or removes the session level URI field. williamr@2: * Note, that the ownership of the argument is williamr@2: * transferred to the SDP document object. williamr@2: * williamr@2: * @param New value of the field or zero to remove the field. williamr@2: */ williamr@2: IMPORT_C void SetUri(CUri8* aValue); williamr@2: williamr@2: /** williamr@2: * Gets the set of session level email field values. This array is used to williamr@2: * add and remove fields into the document. williamr@2: * Note, that only correctly formatted email field values should be placed williamr@2: * into the array. Empty values in the array will be ignored. williamr@2: * williamr@2: * @return Email fields in array or empty array if no email fields. williamr@2: */ williamr@2: IMPORT_C CDesC8Array& EmailFields(); williamr@2: williamr@2: /** williamr@2: * Gets the set of session level phone field values. This array is used to williamr@2: * add and remove fields into the document. williamr@2: * Note, that only correctly formatted phone field values should be placed williamr@2: * into the array. Empty values in the array will be ignored. williamr@2: * williamr@2: * @return Phone fields in array or empty array if no phone fields. williamr@2: */ williamr@2: IMPORT_C CDesC8Array& PhoneFields(); williamr@2: williamr@2: /** williamr@2: * Gets the session level connection field. williamr@2: * Note, that the ownership is not transferred and the instance must not be williamr@2: * deleted by the caller. williamr@2: * williamr@2: * @return Connection field or zero if not present. williamr@2: */ williamr@2: IMPORT_C CSdpConnectionField* ConnectionField(); williamr@2: williamr@2: /** williamr@2: * Gets the session level connection field. williamr@2: * williamr@2: * @return Connection field or zero if not present. williamr@2: */ williamr@2: IMPORT_C const CSdpConnectionField* ConnectionField() const; williamr@2: williamr@2: /** williamr@2: * Sets or removes the session level connection field. williamr@2: * Note, that the ownership of the argument is williamr@2: * transferred to the SDP document object. williamr@2: * williamr@2: * @param New connection field or zero to remove the field. williamr@2: */ williamr@2: IMPORT_C void SetConnectionField(CSdpConnectionField* aObj); williamr@2: williamr@2: /** williamr@2: * Gets the possibly empty set of session level bandwidth fields. williamr@2: * This array is used directly for element insertion and removal. williamr@2: * The array may contain zero references and these are ignored. williamr@2: * williamr@2: * The objects referenced from the array are owned by the document williamr@2: * instance and must not be deleted. An object can be removed from williamr@2: * the document by setting the corresponding element to zero. By williamr@2: * doing so, the calling party receives ownership of the removed object. williamr@2: * williamr@2: * @return Set of bandwidth fields. williamr@2: */ williamr@2: IMPORT_C RPointerArray& BandwidthFields(); williamr@2: williamr@2: /** williamr@2: * Gets the set of session level time description fields. williamr@2: * This array is used directly for element insertion and removal. williamr@2: * There must be at least one time description field in a valid SDP williamr@2: * document.The array may contain zero references and these are ignored. williamr@2: * williamr@2: * The objects referenced from the array are owned by the document williamr@2: * instance and must not be deleted. An object can be removed from the williamr@2: * document by setting the corresponding element to zero. By doing so, williamr@2: * the calling party receives ownership of the removed object. williamr@2: * williamr@2: * @return Set of time fields. williamr@2: */ williamr@2: IMPORT_C RPointerArray& TimeFields(); williamr@2: williamr@2: /** williamr@2: * Gets the zone adjustments field value. williamr@2: * williamr@2: * @return The field value or an empty descriptor if the williamr@2: * field is not present. williamr@2: */ williamr@2: IMPORT_C const TDesC8& ZoneAdjustments() const; williamr@2: williamr@2: /** williamr@2: * Sets the zone adjustments field value. williamr@2: * williamr@2: * @param aValue A valid field value or an empty descriptor williamr@2: * if field is not present. williamr@2: */ williamr@2: IMPORT_C void SetZoneAdjustmentsL(const TDesC8& aValue); williamr@2: williamr@2: /** williamr@2: * Gets the session level encryption key field. williamr@2: * Note, that the ownership is not transferred and williamr@2: * the instance must not be deleted by the caller. williamr@2: * williamr@2: * @return The encryption key or zero if not present. williamr@2: */ williamr@2: IMPORT_C CSdpKeyField* Key(); williamr@2: williamr@2: /** williamr@2: * Gets the session level encryption key field. williamr@2: * williamr@2: * @return The encryption key or zero if not present. williamr@2: */ williamr@2: IMPORT_C const CSdpKeyField* Key() const; williamr@2: williamr@2: /** williamr@2: * Sets or removes the encryption key field. williamr@2: * Note, that the ownership of the argument is williamr@2: * transferred to the SDP document object. williamr@2: * williamr@2: * @param aObj New value of the field or zero to remove the field. williamr@2: */ williamr@2: IMPORT_C void SetKey(CSdpKeyField* aObj); williamr@2: williamr@2: /** williamr@2: * Gets the possibly empty set of session level attribute fields. williamr@2: * This array is used directly for element insertion and removal. williamr@2: * The array may contain zero references and these are ignored. williamr@2: * williamr@2: * The objects referenced from the array are owned by the document williamr@2: * instance and must not be deleted. An object can be removed from the williamr@2: * document by setting the corresponding element to zero. By doing so, williamr@2: * the calling party receives ownership of the removed object. williamr@2: * williamr@2: * @return Set of session level attributes. williamr@2: */ williamr@2: IMPORT_C RPointerArray& AttributeFields(); williamr@2: williamr@2: /** williamr@2: * Gets the possibly empty set of media description fields. williamr@2: * This array is used directly for element insertion and removal. williamr@2: * Note, that media level attributes and fields are managed williamr@2: * through the corresponding media field instance and not through williamr@2: * the document instance. williamr@2: * The array may contain zero references and these are ignored. williamr@2: * williamr@2: * The objects referenced from the array are owned by the document williamr@2: * instance and must not be deleted. An object can be removed from the williamr@2: * document by setting the corresponding element to zero. By doing so, williamr@2: * the calling party receives ownership of the removed object. williamr@2: * williamr@2: * @return Set of media description fields. williamr@2: */ williamr@2: IMPORT_C RPointerArray& MediaFields(); williamr@2: williamr@2: private: williamr@2: CSdpDocument(); williamr@2: void ConstructL(); williamr@2: void ConstructL(const CSdpDocument& aSdpDocument); williamr@2: void DoInternalizeL(RReadStream& aStream); williamr@2: williamr@2: void ParseL (const TDesC8& aText); williamr@2: void ParseSessionVersionL(); williamr@2: void ParseSessionOwnerL(); williamr@2: void ParseSessionNameL(); williamr@2: void ParseSessionInformationL(); williamr@2: void ParseUriL(); williamr@2: void ParseEmailL(); williamr@2: void ParsePhoneL(); williamr@2: void ParseConnectionL(); williamr@2: void ParseBandwidthL(); williamr@2: void ParseTimeFieldL(); williamr@2: void ParseZoneAdjustmentL(); williamr@2: void ParseEncryptionKeyL(); williamr@2: void ParseAttributeFieldL(); williamr@2: void ParseMediaLevelL (); williamr@2: void ExternalizeDesCArrayL(CDesC8ArraySeg& aArray, williamr@2: RWriteStream& aStream) const; williamr@2: void EncodeDesCArrayL(CDesC8ArraySeg& aArray,TInt aIndex, williamr@2: RWriteStream& aStream) const; williamr@2: williamr@2: TDesC8& GetTokenFromStreamL(RReadStream& aStream); williamr@2: williamr@2: CSdpDocument(const CSdpDocument&); // Hidden. williamr@2: CSdpDocument& operator = (const CSdpDocument&); // Hidden williamr@2: williamr@2: private: // Data williamr@2: williamr@2: HBufC8* iInfo; williamr@2: HBufC8* iSessionName; williamr@2: HBufC8* iZoneAdjustments; williamr@2: CSdpKeyField* iSdpKeyField; williamr@2: CSdpOriginField* iSdpOriginField; williamr@2: CSdpConnectionField* iSdpConnectionField; williamr@2: TUint iSdpVersion; williamr@2: RPointerArray* iTimeFields; williamr@2: RPointerArray* iBandwidthFields; williamr@2: RPointerArray* iAttributeFields; williamr@2: RPointerArray* iMediaFields; williamr@2: CUri8* iUri; williamr@2: CDesC8ArraySeg* iEmailFields; williamr@2: CDesC8ArraySeg* iPhoneFields; williamr@2: RStringPool iPool; williamr@2: HBufC8* iToken; williamr@2: CSdpCodecParseUtil* iSdpCodecParseUtil; williamr@2: }; williamr@2: williamr@2: #endif // CSDPDOCUMENT_H