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 : SdpOriginField.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 CSDPORIGINFIELD_H williamr@2: #define CSDPORIGINFIELD_H williamr@2: williamr@2: // INCLUDES williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: // CONSTANTS williamr@2: const TInt KMaxAddressLength = 256; williamr@2: williamr@2: // FORWARD DECLARATIONS williamr@2: class RReadStream; williamr@2: class RWriteStream; williamr@2: class CSdpOriginFieldPtrs; williamr@2: williamr@2: // CLASS DECLARATION williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * williamr@2: * This class encapsulates the origin field of williamr@2: * the Session Description Protocol. 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 CSdpOriginField : public CBase williamr@2: { williamr@2: public: // Constructors and destructor williamr@2: williamr@2: /** williamr@2: * Constructs a new origin 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 CSdpOriginField* DecodeL( const TDesC8& aText ); williamr@2: williamr@2: /** williamr@2: * Constructs a new origin field and adds the pointer to the cleanup williamr@2: * stack. 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 CSdpOriginField* DecodeLC( const TDesC8& aText ); williamr@2: williamr@2: /** williamr@2: * Constructs a new origin field. williamr@2: * williamr@2: * @param aUserName A valid user name value. williamr@2: * @param aSessionId A valid session id value. williamr@2: * @param aSessionVersion A valid announcement version value. williamr@2: * @param aAddress A unicast IP address from either williamr@2: * KAfInet or KAfInet6 family. williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpOriginField* NewL( const TDesC8& aUserName, williamr@2: TInt64 aSessionId, williamr@2: TInt64 aSessionVersion, williamr@2: TInetAddr& aAddress ); williamr@2: williamr@2: /** williamr@2: * Constructs a new origin field and adds the pointer to the cleanup williamr@2: * stack. williamr@2: * williamr@2: * @param aUserName A valid user name value. williamr@2: * @param aSessionId A valid session id value. williamr@2: * @param aSessionVersion A valid announcement version value. williamr@2: * @param aAddress A unicast IP address from either williamr@2: * KAfInet or KAfInet6 family. williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpOriginField* NewLC( const TDesC8& aUserName, williamr@2: TInt64 aSessionId, williamr@2: TInt64 aSessionVersion, williamr@2: TInetAddr& aAddress ); williamr@2: williamr@2: /** williamr@2: * Constructs a new origin field. williamr@2: * williamr@2: * @param aUserName A valid user name value. williamr@2: * @param aSessionId A valid session id value. williamr@2: * @param aSessionVersion A valid announcement version value. williamr@2: * @param aNetType A valid network type value (typically "IN"). williamr@2: * @param aAddressType A valid address type value williamr@2: * (typically "IP4" or "IP6"). williamr@2: * @param aAddress A unicast IP Address, Fully williamr@2: * Qualified Domain Name (FQDN), or an other type of williamr@2: * address allowed for the address type. williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpOriginField* NewL( const TDesC8& aUserName, williamr@2: TInt64 aSessionId, williamr@2: TInt64 aSessionVersion, williamr@2: RStringF aNetType, williamr@2: RStringF aAddressType, williamr@2: const TDesC8& aAddress ); williamr@2: williamr@2: /** williamr@2: * Constructs a new origin field and adds the pointer to the cleanup williamr@2: * stack. williamr@2: * williamr@2: * @param aUserName A valid user name value. williamr@2: * @param aSessionId A valid session id value. williamr@2: * @param aSessionVersion A valid announcement version value. williamr@2: * @param aNetType A valid network type value (typically "IN"). williamr@2: * @param aAddressType A valid address type value williamr@2: * (typically "IP4" or "IP6"). williamr@2: * @param aAddress A unicast IP Address, Fully Qualified Domain williamr@2: * Name (FQDN), or an other type of address allowed williamr@2: * for the address type. williamr@2: * @return a new instance. williamr@2: */ williamr@2: IMPORT_C static CSdpOriginField* NewLC( const TDesC8& aUserName, williamr@2: TInt64 aSessionId, williamr@2: TInt64 aSessionVersion, williamr@2: RStringF aNetType, williamr@2: RStringF aAddressType, williamr@2: const TDesC8& aAddress ); williamr@2: williamr@2: /** williamr@2: * Deletes the resources held by the instance. williamr@2: */ williamr@2: IMPORT_C ~CSdpOriginField(); 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 williamr@2: * the stream includes correctly formatted origin 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 CSdpOriginField* 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 CSdpOriginField& aObj ) const; williamr@2: williamr@2: /** williamr@2: * Gets the user name. williamr@2: * williamr@2: * @return User name. williamr@2: */ williamr@2: IMPORT_C const TDesC8& UserName() const; williamr@2: williamr@2: /** williamr@2: * Sets the user name. williamr@2: * williamr@2: * @param aValue A valid user name value. williamr@2: * @leave KErrSdpCodecOriginField if aValue is not a valid user name. williamr@2: */ williamr@2: IMPORT_C void SetUserNameL( const TDesC8& aValue ); williamr@2: williamr@2: /** williamr@2: * Gets the session id of the origin field. williamr@2: * williamr@2: * @return Session id. williamr@2: */ williamr@2: IMPORT_C TInt64 SessionId() const; williamr@2: williamr@2: /** williamr@2: * Sets the session id. williamr@2: * williamr@2: * @param aValue A valid session id value. williamr@2: */ williamr@2: IMPORT_C void SetSessionId( TInt64 aValue ); williamr@2: williamr@2: /** williamr@2: * Gets the announcement version. williamr@2: * williamr@2: * @return Version. williamr@2: */ williamr@2: IMPORT_C TInt64 Version() const; williamr@2: williamr@2: /** williamr@2: * Sets the announcement version.. williamr@2: * williamr@2: * @param aValue A valid version value. williamr@2: */ williamr@2: IMPORT_C void SetVersion( TInt64 aValue ); williamr@2: williamr@2: /** williamr@2: * Gets the network type. williamr@2: * williamr@2: * @return The network type from pre-defined SDP string williamr@2: * table or given by the user. williamr@2: */ williamr@2: IMPORT_C RStringF NetType() const; williamr@2: williamr@2: /** williamr@2: * Gets the address type. williamr@2: * williamr@2: * @return The address type from pre-defined SDP string williamr@2: * table or given by the user. williamr@2: */ williamr@2: IMPORT_C RStringF AddressType() const; williamr@2: williamr@2: /** williamr@2: * Gets the address. williamr@2: * williamr@2: * @return Address as an IP address or null if it is williamr@2: * not an IP address. This may be e.g. when the address has williamr@2: * been specified as a FQDN. In this case, the address can be williamr@2: * accessed using the other getters. williamr@2: */ williamr@2: IMPORT_C const TInetAddr* InetAddress() const; williamr@2: williamr@2: /** williamr@2: * Gets the address. williamr@2: * williamr@2: * @return Address as a string. williamr@2: */ williamr@2: IMPORT_C const TDesC8& Address() const; williamr@2: williamr@2: /** williamr@2: * Sets the address, network and address type. williamr@2: * Also sets the network type to "IN" and address type to "IP4" or williamr@2: * "IP6" depending on the address family of aValue. williamr@2: * williamr@2: * @param aValue A unicast IP address from either KAfInet williamr@2: * or KAfInet6 family. williamr@2: */ williamr@2: IMPORT_C void SetInetAddress( const TInetAddr& aValue ); williamr@2: williamr@2: /** williamr@2: * Sets the address, network and address type. williamr@2: * williamr@2: * @param aAddress A unicast IP Address, Fully Qualified Domain williamr@2: * Name (FQDN), or an other type of address allowed for the williamr@2: * address type. williamr@2: * @param aNetType A valid network type value (typically "IN"). williamr@2: * @param aAddressType A valid address type value williamr@2: * (typically "IP4" or "IP6"). williamr@2: * @leave KErrSdpCodecOriginField if aNetType or aAddressType are not williamr@2: * valid tokens, or aAddress is invalid, or aAddress type williamr@2: * is not aligned with the address format williamr@2: */ williamr@2: IMPORT_C void SetAddressL( const TDesC8& aAddress, williamr@2: RStringF aNetType, williamr@2: RStringF aAddressType ); 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 CSdpOriginField* InternalizeL( RReadStream& aStream ); williamr@2: williamr@2: private: // Constructors williamr@2: williamr@2: /** williamr@2: * Constructor williamr@2: */ williamr@2: CSdpOriginField(); williamr@2: williamr@2: /** williamr@2: * Second phase constructor. Parses the text string and initializes williamr@2: * the member variables williamr@2: * williamr@2: * @param aText Line of text that will be parsed (ends on the newline) williamr@2: */ williamr@2: void ConstructL( const TDesC8& aText ); williamr@2: williamr@2: /** williamr@2: * Second phase constructor. Constructs the object. williamr@2: * williamr@2: * @param aUserName A valid user name value. williamr@2: * @param aSessionId A valid session id value. williamr@2: * @param aSessionVersion A valid announcement version value. williamr@2: * @param aAddress A unicast IP address from either williamr@2: * KAfInet or KAfInet6 family. williamr@2: */ williamr@2: void ConstructL( const TDesC8& aUserName, williamr@2: TInt64 aSessionId, williamr@2: TInt64 aSessionVersion, williamr@2: TInetAddr& aUnicastAddress ); williamr@2: williamr@2: /** williamr@2: * Second phase constructor. Constructs the object. williamr@2: * williamr@2: * @param aUserName A valid user name value. williamr@2: * @param aSessionId A valid session id value. williamr@2: * @param aSessionVersion A valid announcement version value. williamr@2: * @param aNetType A valid network type value (typically "IN"). williamr@2: * @param aAddressType A valid address type value williamr@2: * (typically "IP4" or "IP6"). williamr@2: * @param aAddress A unicast IP Address, Fully Qualified Domain williamr@2: * Name (FQDN), or an other type of address allowed williamr@2: * for the address type. williamr@2: */ williamr@2: void ConstructL( const TDesC8& aUserName, williamr@2: TInt64 aSessionId, williamr@2: TInt64 aSessionVersion, williamr@2: RStringF aNetType, williamr@2: RStringF aAddressType, williamr@2: const TDesC8& aAddress ); williamr@2: williamr@2: // These are unnecessary? Derived from CBase, prevents the use williamr@2: CSdpOriginField( const CSdpOriginField& ); // Hidden. williamr@2: CSdpOriginField& operator = ( const CSdpOriginField& ); // Hidden williamr@2: williamr@2: private: // New methods williamr@2: williamr@2: /** williamr@2: * Checks if the given address is valid williamr@2: * williamr@2: * @param aAddress Address to be checked williamr@2: * @return Valid address or not williamr@2: */ williamr@2: TBool IsValidAddress( const TDesC8& aAddress ) const; williamr@2: williamr@2: /** williamr@2: * Checks if the given address is valid williamr@2: * williamr@2: * @param aAddr Address to be checked williamr@2: * @return Valid address or not williamr@2: */ williamr@2: TBool IsValidAddress( const TInetAddr& addr ) const; williamr@2: williamr@2: /** williamr@2: * Checks that address type matches with address format williamr@2: * williamr@2: * @param aAddress Address williamr@2: * @param aType Address type williamr@2: * @param aPool String pool williamr@2: * @return Type Matches with format or not williamr@2: */ williamr@2: TBool TypeMatchesWithFormat( williamr@2: const TDesC8& aAddress, const TDesC8& aType, williamr@2: RStringPool aPool ) const; williamr@2: williamr@2: /** williamr@2: * Checks if the given username is valid williamr@2: * williamr@2: * @param aUserName Username williamr@2: * @return Validity of the given username williamr@2: */ williamr@2: TBool IsValidUserName( const TDesC8& aUserName ) const; williamr@2: williamr@2: /** williamr@2: * Parses username, initializes iUserName williamr@2: * williamr@2: * @param aArray Array containing all the elements williamr@2: */ williamr@2: void ParseUserNameL( RArray& aArray ); williamr@2: williamr@2: /** williamr@2: * Parses session ID and version, initializes iSessionId williamr@2: * and iSessionVersion williamr@2: * williamr@2: * @param aArray Array containing all the elements williamr@2: */ williamr@2: void ParseSessionIDAndVersionL( RArray& aArray ); williamr@2: williamr@2: /** williamr@2: * Parses network type and address type, initializes williamr@2: * iNetType and iAddressType williamr@2: * williamr@2: * @param aArray Array containing all the elements williamr@2: */ williamr@2: void ParseNetTypeAndAddressTypeL( RArray& aArray ); williamr@2: williamr@2: /** williamr@2: * Parses address, checks address against address type, williamr@2: * initializes iAddress williamr@2: * williamr@2: * @param aArray Array containing all the elements williamr@2: */ williamr@2: void ParseAddressL( RArray& aArray ); williamr@2: williamr@2: inline CSdpOriginFieldPtrs& OriginFieldPtrs(); williamr@2: williamr@2: inline const CSdpOriginFieldPtrs& OriginFieldPtrs() const; williamr@2: williamr@2: TInt64 Get63Msbs( const TDesC8& aDecimalValue ) const; williamr@2: void SetIPAddressType( const TInetAddr& aAddr ); williamr@2: williamr@2: private: // Data williamr@2: williamr@2: RStringPool iPool; williamr@2: williamr@2: // williamr@2: HBufC8* iUserName; williamr@2: // williamr@2: TInt64 iSessionId; williamr@2: // williamr@2: TInt64 iSessionVersion; williamr@2: // williamr@2: RStringF iNetType; williamr@2: //
williamr@2: RStringF iAddressType; williamr@2: //
williamr@2: // Either one is used (this or iAddressType/iAddress combo) williamr@2: // Can be defined as mutable because this variable does not affect williamr@2: // to the state of the object, but it is needed as const pointer williamr@2: // is returned on InetAddr() method williamr@2: mutable TInetAddr iUnicastAddress; williamr@2: TBuf8 iAddress; williamr@2: // For configuring the address into TInetAddr williamr@2: TBuf iAddress16; williamr@2: williamr@4: void __DbgTestInvariant() const; williamr@4: williamr@2: }; williamr@2: williamr@2: #endif // CSDPORIGINFIELD_H