realtimenetprots/sipfw/SDP/api/SdpOriginField.h
author Petteri Saari <petteri.saari@digia.com>
Thu, 25 Nov 2010 13:59:42 +0200
branchMSRP_FrameWork
changeset 58 cdb720e67852
parent 0 307788aac0a8
permissions -rw-r--r--
This release addresses the following issues: 1. The crash bug fix when receiving file 2. Now the sending is based on MSRP messages, there is no longer file receiving or sending. Client sends data as MSRP was designed. 3. Soma MSRP stack was created so that the client told the correct session-id, Symbian stack generated it by itself. This is not allowed, it was changed so that clients tell the session-id (same as used in SIP INVITE). 4. Unnecessary division of data to chunks removed when there is no need to interrupt sending. The message is sent in as few chunks as possible. 5. Stack can now receive files and chunks with ?unlimited? size. Old stack wrote the incoming data to memory and did not utilize disk space until the end of chunk was reached (large chunks from another client crashed it). 6. Now when writing the incoming data to file, it will take into account the byte-range header values. So, this complies with the RFC4975 requirements that stack must be able to handle chunks that come in any sequence. 7. Some buffering changes to outgoing/incoming data. 8. The outgoing data is now checked that it does not contain the created transaction-id before sending the data. 9. MSRP success reports are now implemented and tested against servers. 10. Progress report system fixed so progress is now visible on client (all the way to 100%). 11. Message Cancel receiving / Cancel sending now corrected and made to work as rfc4975 requires. (termination from sender and error code from receiver when cancelling). 12. Bug correction related to messages received not belonging to any session, old stack implementation did send error response, but after response was written it did give the buffer to client anyway. Now corrected.

/*
* 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          : SdpOriginField.h
* Part of       : SDP Codec
* Interface     : SDK API, SDP Codec API
* Version       : 1.0
*
*/



#ifndef CSDPORIGINFIELD_H
#define CSDPORIGINFIELD_H

//  INCLUDES
#include <e32base.h>
#include <in_sock.h>
#include <stringpool.h>

//  CONSTANTS
const TInt KMaxAddressLength = 256;

//  FORWARD DECLARATIONS
class RReadStream;
class RWriteStream;
class CSdpOriginFieldPtrs;

// CLASS DECLARATION
/**
 *  @publishedAll
 *  @released
 *
 *	This class encapsulates the origin field of 
 *  the Session Description Protocol.
 * 
 *	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 CSdpOriginField : public CBase
	{
    public:     // Constructors and destructor

        /**
         *	Constructs a new origin field.
		 *		 
         *	@param aText A string containing a correctly 
         *         formatted field value terminated by a CRLF.
         *	@return a new instance.
         */
		IMPORT_C static	CSdpOriginField* DecodeL( const TDesC8& aText );

        /**
         *	Constructs a new origin field and adds the pointer to the cleanup 
         *  stack.
		 * 		
         *	@param aText A string containing a correctly 
         *         formatted field value terminated by a CRLF.
         *	@return a new instance.
         */
		IMPORT_C static	CSdpOriginField* DecodeLC( const TDesC8& aText );

        /**
         *	Constructs a new origin field.
		 *	         
         *	@param aUserName A valid user name value.
         *	@param aSessionId A valid session id value.
         *	@param aSessionVersion A valid announcement version value.
         *	@param aAddress A unicast IP address from either
		 *         KAfInet or KAfInet6 family.
         *	@return a new instance.
         */
		IMPORT_C static	CSdpOriginField* NewL( const TDesC8& aUserName, 
											   TInt64 aSessionId, 
											   TInt64 aSessionVersion, 
											   TInetAddr& aAddress );

        /**
         *	Constructs a new origin field and adds the pointer to the cleanup 
         *  stack.
		 *	         
         *	@param aUserName A valid user name value.
         *	@param aSessionId A valid session id value.
         *	@param aSessionVersion A valid announcement version value.
         *	@param aAddress A unicast IP address from either
		 *         KAfInet or KAfInet6 family.
         *	@return a new instance.
         */
		IMPORT_C static	CSdpOriginField* NewLC( const TDesC8& aUserName, 
											    TInt64 aSessionId, 
											    TInt64 aSessionVersion, 
											    TInetAddr& aAddress );

		/**
         *	Constructs a new origin field.
		 *	
         *	@param aUserName A valid user name value.
         *	@param aSessionId A valid session id value.
         *	@param aSessionVersion A valid announcement version value.
         *	@param aNetType A valid network type value (typically "IN").
		 *  @param aAddressType A valid address type value 
		 *         (typically "IP4" or "IP6").
		 *	@param aAddress A unicast IP Address, Fully 
         *         Qualified Domain Name (FQDN), or an other type of 
         *         address allowed for the address type.
         *	@return a new instance.
         */
		IMPORT_C static	CSdpOriginField* NewL( const TDesC8& aUserName, 
											TInt64 aSessionId, 
											TInt64 aSessionVersion, 
											RStringF aNetType, 
											RStringF aAddressType, 
											const TDesC8& aAddress );

		/**
         *	Constructs a new origin field and adds the pointer to the cleanup 
         *  stack.
		 *	
         *	@param aUserName A valid user name value.
         *	@param aSessionId A valid session id value.
         *	@param aSessionVersion A valid announcement version value.
         *	@param aNetType A valid network type value (typically "IN").
		 *  @param aAddressType A valid address type value 
		 *         (typically "IP4" or "IP6").
		 *	@param aAddress A unicast IP Address, Fully Qualified Domain
		 *         Name (FQDN), or an other type of address allowed
		 *         for the address type.
         *	@return a new instance.
         */
		IMPORT_C static	CSdpOriginField* NewLC( const TDesC8& aUserName, 
											TInt64 aSessionId, 
											TInt64 aSessionVersion, 
											RStringF aNetType, 
											RStringF aAddressType, 
											const TDesC8& aAddress );

		/**
		 *	Deletes the resources held by the instance.
		 */
		IMPORT_C ~CSdpOriginField();

    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 origin field.
		 */
		IMPORT_C void EncodeL( RWriteStream& aStream ) const;

		/**
    	 *	Creates a new instance that is equal to the target.
		 *
		 *	@return a new instance.
		 */
		IMPORT_C CSdpOriginField* 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 CSdpOriginField& aObj ) const;

		/**
		 *	Gets the user name.
		 *
		 *	@return User name.
		 */
		IMPORT_C const TDesC8& UserName() const;

		/**
		 *	Sets the user name.
		 *
		 *	@param aValue A valid user name value.
		 *	@leave KErrSdpCodecOriginField if aValue is not a valid user name.
		 */
		IMPORT_C void SetUserNameL( const TDesC8& aValue );

		/**
		 *	Gets the session id of the origin field.
		 *  
		 *	@return Session id.
		 */
		IMPORT_C TInt64 SessionId() const;

		/**
		 *	Sets the session id.
		 *
		 *	@param aValue A valid session id value.
		 */
		IMPORT_C void SetSessionId( TInt64 aValue );
		
		/**
		 *	Gets the announcement version.
		 *	
		 *	@return Version.
		 */
		IMPORT_C TInt64 Version() const;

		/**
		 *	Sets the announcement version..
		 *
		 *	@param aValue A valid version value.
		 */
		IMPORT_C void SetVersion( TInt64 aValue );

		/**
		 *	Gets the network type.
		 *
		 *	@return The network type from pre-defined SDP string 
         *          table or given by the user.
		 */
		IMPORT_C RStringF NetType() const;

		/**
		 *	Gets the address type.
		 *
		 *	@return The address type from pre-defined SDP string 
         *          table or given by the user.
		 */
		IMPORT_C RStringF AddressType() const;
		
		/**
		 *	Gets the address.
		 *
		 *	@return Address as an IP address or null if it is
		 *          not an IP address. This may be e.g. when the address has 
		 *          been specified as a FQDN. In this case, the address can be 
		 *          accessed using the other getters.
		 */
		IMPORT_C const TInetAddr* InetAddress() const;

		/**
		 *	Gets the address.
		 *
		 *  @return Address as a string.
		 */
		IMPORT_C const TDesC8& Address() const;

		/**
		 *	Sets the address, network and address type.
		 *	Also sets the network type to "IN" and address type to "IP4" or 
		 *  "IP6" depending on the address family of aValue.
		 *
         *	@param aValue A unicast IP address from either KAfInet 
         *         or KAfInet6 family.
		 */
		IMPORT_C void SetInetAddress( const TInetAddr& aValue );

		/**
		 *	Sets the address, network and address type.
		 *
		 *	@param aAddress A unicast IP Address, Fully Qualified Domain
		 *         Name (FQDN), or an other type of address allowed for the
		 *         address type.
         *	@param aNetType A valid network type value (typically "IN").
		 *  @param aAddressType A valid address type value 
		 *         (typically "IP4" or "IP6").
		 *	@leave KErrSdpCodecOriginField if aNetType or aAddressType are not
		 *		   valid tokens, or aAddress is invalid, or aAddress type 
		 *		   is not aligned with the address format
		 */
		IMPORT_C void SetAddressL( const TDesC8& aAddress, 
								   RStringF aNetType, 
								   RStringF aAddressType );
        
    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 CSdpOriginField* InternalizeL( RReadStream& aStream );

	private:    // Constructors

        /**
         *  Constructor
         */
		CSdpOriginField();

        /**
         *  Second phase constructor. Parses the text string and initializes
         *  the member variables
         *         
         *  @param aText Line of text that will be parsed (ends on the newline)
         */
		void ConstructL( const TDesC8& aText );
        
        /**
         *  Second phase constructor. Constructs the object.
         *
         *  @param aUserName  A valid user name value.
         *  @param aSessionId A valid session id value.
         *  @param aSessionVersion A valid announcement version value.
         *  @param aAddress A unicast IP address from either
		 *                  KAfInet or KAfInet6 family.        
         */
		void ConstructL( const TDesC8& aUserName, 
						 TInt64 aSessionId, 
                         TInt64 aSessionVersion, 
						 TInetAddr& aUnicastAddress );
         
        /**                        
         *	Second phase constructor. Constructs the object.
		 *	
         *	@param aUserName  A valid user name value.
         *	@param aSessionId A valid session id value.
         *	@param aSessionVersion A valid announcement version value.
         *	@param aNetType A valid network type value (typically "IN").
		 *  @param aAddressType A valid address type value 
		 *         (typically "IP4" or "IP6").
		 *	@param aAddress A unicast IP Address, Fully Qualified Domain
		 *         Name (FQDN), or an other type of address allowed
		 *         for the address type.
         */
        void ConstructL( const TDesC8& aUserName, 
	                     TInt64 aSessionId, 
	                     TInt64 aSessionVersion, 
	                     RStringF aNetType, 
					     RStringF aAddressType, 
	                     const TDesC8& aAddress );

        // These are unnecessary? Derived from CBase, prevents the use
		CSdpOriginField( const CSdpOriginField& ); // Hidden.
		CSdpOriginField& operator = ( const CSdpOriginField& ); // Hidden

    private:        // New methods

        /**
         *  Checks if the given address is valid
         *
         *  @param aAddress Address to be checked
         *  @return Valid address or not
         */
        TBool IsValidAddress( const TDesC8& aAddress ) const;   
        
        /**
         *  Checks if the given address is valid
         *
         *  @param aAddr Address to be checked
         *  @return Valid address or not
         */             
        TBool IsValidAddress( const TInetAddr& addr ) const;

        /**
         *  Checks that address type matches with address format
         *
         *  @param aAddress Address
         *  @param aType Address type
         *  @param aPool String pool
         *  @return Type Matches with format or not
         */
        TBool TypeMatchesWithFormat( 
            const TDesC8& aAddress, const TDesC8& aType, 
            RStringPool aPool ) const;

        /**
         *  Checks if the given username is valid
         *
         *  @param aUserName Username
         *  @return Validity of the given username
         */
        TBool IsValidUserName( const TDesC8& aUserName ) const;

        /**
         *  Parses username, initializes iUserName
         *
         *  @param aArray Array containing all the elements
         */
        void ParseUserNameL( RArray<TPtrC8>& aArray );

        /**
         *  Parses session ID and version, initializes iSessionId
         *  and iSessionVersion
         *
         *  @param aArray Array containing all the elements
         */
        void ParseSessionIDAndVersionL( RArray<TPtrC8>& aArray );

        /**
         *  Parses network type and address type, initializes
         *  iNetType and iAddressType
         *
         *  @param aArray Array containing all the elements
         */
       void ParseNetTypeAndAddressTypeL( RArray<TPtrC8>& aArray );

        /**
         *  Parses address, checks address against address type,
         *  initializes iAddress
         *
         *  @param aArray Array containing all the elements
         */
        void ParseAddressL( RArray<TPtrC8>& aArray );

		inline CSdpOriginFieldPtrs& OriginFieldPtrs();

		inline const CSdpOriginFieldPtrs& OriginFieldPtrs() const;

		TInt64 Get63Msbs( const TDesC8& aDecimalValue ) const;
		void SetIPAddressType( const TInetAddr& aAddr );

    private:    // Data

        RStringPool iPool;

        // <username>
		HBufC8* iUserName;
        // <session id>
		TInt64 iSessionId;
        // <version>
		TInt64 iSessionVersion;
        // <net type>
        RStringF iNetType;
        // <address type>        
        RStringF iAddressType;
        // <address>
        // Either one is used (this or iAddressType/iAddress combo)
        // Can be defined as mutable because this variable does not affect
        // to the state of the object, but it is needed as const pointer
        // is returned on InetAddr() method
		mutable TInetAddr iUnicastAddress;        
        TBuf8<KMaxAddressLength> iAddress; 
        // For configuring the address into TInetAddr
        TBuf<KMaxAddressLength> iAddress16;          

		void __DbgTestInvariant() const;

	};

#endif // CSDPORIGINFIELD_H