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



#ifndef CSDPCONNECTIONFIELD_H
#define CSDPCONNECTIONFIELD_H

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

// CONSTANTS
const TUint KDefaultNumOfAddress = 1;

// FORWARD DECLARATIONS
class RReadStream;
class RWriteStream;

// CLASS DECLARATION
/**
 *  @publishedAll
 *  @released
 *
 *	This class encapsulates the connection information 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 CSdpConnectionField : public CBase
	{
    public: // Constructors and destructor

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

        /**
         *	Constructs a new connection 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 CSdpConnectionField* DecodeLC( const TDesC8& aText );

        /**
         *	Constructs a new connection field.
		 *	Also sets the network type to "IN" and address type to "IP4" or
		 *  "IP6" depending on the address family of aAddress.
		 *	
		 *	@param aAddress IP address from either KAfInet 
         *         or KAfInet6 family
         *  @param aTTL Time-To-Live for IP4 multicasts, set it as
         *         KErrNotFound if IPv6 multicast or IPv4 unicast
         *  @param aNumOfAddress Number of addresses in multicast,
         *         if unicast, must be 1
         *	@return a new instance.
         */
		IMPORT_C static CSdpConnectionField* NewL(            
            const TInetAddr& aAddress,
            TInt aTTL = KErrNotFound, 
            TUint aNumOfAddress = KDefaultNumOfAddress );

        /**
         *	Constructs a new connection field.
		 *	
         *	@param aNetType A valid network type name from the pre-
         *              defined SDP string table or defined by the user.
		 *  @paramaAddressType A valid address type name from the 
         *              pre-defined SDP string table or defined by the user.
		 *	@param  const TDesC8& aAddress: A valid address of the address type.
         *              Can contain TTL & number of addresses parameter as well.
         *	@return a new instance.
         */
		IMPORT_C static CSdpConnectionField* NewL(
			RStringF aNetType, 
			RStringF aAddressType, 
			const TDesC8& aAddress );

		/**
         *	Constructs a new connection field and adds the pointer to the 
         *  cleanup stack. Also sets the network type to "IN" and address type
		 *	to "IP4" or "IP6" depending on the address family of aAddress.
		 *
		 *	@param aAddress IP address from either KAfInet 
         *              or KAfInet6 family
         *  @param aTTL Time-To-Live for IP4 multicasts, set it as
         *              KErrNotFound if IPv6 multicast or IPv4 unicast
         *  @param aNumOfAddress Number of addresses in multicast,
         *              if unicast, must be 1
         *	@return a new instance.
         */
		IMPORT_C static CSdpConnectionField* NewLC(       
            const TInetAddr& aAddress, 
            TInt aTTL = KErrNotFound,
            TUint aNumOfAddress = KDefaultNumOfAddress );

        /**
         *	Construct a new connection field  and adds the pointer to the
         *  cleanup stack.
		 *	
         *	@param aNetType A valid network type name from the pre-
         *         defined SDP string table or defined by the user
		 *  @paramaAddressType A valid address type name from the 
         *              pre-defined SDP string table or defined by the user
		 *	@param  const TDesC8& aAddress: A valid address of the address type.
         *              Can contain TTL & number of addresses parameter as well.
         *	@return a new instance.
         */
		IMPORT_C static CSdpConnectionField* NewLC(
            RStringF aNetType, RStringF aAddressType, const TDesC8& aAddress );

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

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

		/**
		 *	Creates a new instance that is equal to the target.
		 *
		 *	@return a new instance.
		 */
		IMPORT_C CSdpConnectionField* CloneL() const;

		/**	
		 *	Compares this instance to another for equality.
		 *
		 *	@param const CSdpConnectionField& aObj: The instance to compare to.
		 *	@return ETrue if equal, EFalse if not.
		 */
		IMPORT_C TBool operator== ( const CSdpConnectionField& aObj ) const;

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

		/**
		 *	Gets the address type that is from the pre-defined SDP string table 
         *  or given by the user.
		 *
		 *	@return The address type.
		 */
		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 aAddress.
		 *
		 *	@param aValue The new address.
         *  @param aTTL Time-To-Live for IP4 multicasts, set it as
         *         KErrNotFound if IPv6 multicast or IPv4 unicast
         *  @param aNumOfAddress Number of addresses in multicast,
         *         if unicast, must be 1.
         *  @leave KErrSdpCodecConnectionField ifaddress to be set is wrongly 
         *         formatted.
         */
		IMPORT_C void SetInetAddressL( const TInetAddr& aValue, 
                                   TInt aTTL = KErrNotFound,
                                   TUint aNumOfAddress = KDefaultNumOfAddress);

		/**
		 *	Sets the address, network and address type.
		 *
         *	@param aNetType A valid network type name from the pre-
         *         defined SDP string table or defined by the user
		 *  @param aAddressType A valid address type name from the 
         *         pre-defined SDP string table or defined by the user
		 *	@param aAddress A valid address of the address type.
		 */
		IMPORT_C void SetAddressL( RStringF aNetType, 
								   RStringF aAddressType, 
								   const TDesC8& aAddress );

        /**
         *  Gets TTL attribute.
         *
         *  @return TTL or KErrNotFound, if one is not available for the address
         */
        IMPORT_C TInt TTLValue() const;

        /**
         *  Sets TTL attribute (only valid for IP4 multicasts).
         *  Leaves if trying to set TTL to address that doesn't support it.
         *
         *  @param aTTL Time-To-Live for IP4 multicasts
         *	@leave KErrSdpCodecConnectionField if aTTL is invalid.
         */
        IMPORT_C void SetTTLL( TInt aTTL );

        /**
         *  Gets the number of addresses (can be more than 1 for multicasts).
         *  Multicast addresses are contiguously allocated above the base 
         *  address.
         *
         *  @return Number of addresses
         */
        IMPORT_C TInt NumOfAddress() const;
         
        /**
         *  Sets the number of addreses allocated for multicast. 
         *  
         *	@param aNumOfAddress Number of addresses in multicast
         *  @leave KErrSdpCodecConnectionField if the address is unicast.
         */
        IMPORT_C void SetNumOfAddressL( TUint aNumOfAddress );

    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 CSdpConnectionField* InternalizeL( RReadStream& aStream );

    private:    // Internal

        /**
         *  Constructor
         */
        CSdpConnectionField();

        /**
         *  2nd phase constructor
         *
         *	@param aText A string containing a correctly formatted field value
		 *         terminated by a CRLF.         
         */         
        void ConstructL( const TDesC8& aText );
        
        /**
         *  2nd phase constructor
         *
         *	@param aAddress IP address from either KAfInet or KAfInet6 family
         *  @param aTTL Time-To-Live for IP4 multicasts
         *  @param aNumOfAddress Nubmer of addresses in multicast
         */
        void ConstructL( const TInetAddr& aAddress,
                         TInt aTTL, TUint aNumOfAddress );

        /**
         *  2nd phase constructor
         *
         *	@param aNetType A valid network type name from the pre-defined
		 *         SDP string table or defined by the user
		 *  @param aAddressType A valid address type name from the pre-defined
		 *         SDP string table or defined by the user
		 *	@param aAddress A valid address of the address type
         */
        void ConstructL( RStringF aNetType, RStringF aAddressType, 
	                     const TDesC8& aAddress );

        /**
         *  Checks if the address is valid against given arguments
         *
         *  @param aAddressTypeIP4 The given type of address (EFalse = IP6)
         *  @param aAddress Address with possibly TTL & number of addresses
         *  @return error code (KErrNone if valid)
         */
        TInt IsValidAddress( TBool aAddressTypeIP4,
                             const TDesC8& aAddress ) const;

        /**
         *  Checks if the address is valid against given arguments
         *         
         *  @param aAddress Address in TInetAddr format
         *  @param aTTL TTL attribute
         *  @param aNumOfAddress Number off addresses
         *  @return error code (KErrNone if valid)
         */
        TInt IsValidAddress( const TInetAddr& aAddress, 
                             TInt aTTL, TUint aNumOfAddress ) const;
        
        /**
         *  Parses address field
         *
         *  @param aAddressTypeIP4 The given type of address (EFalse = IP6)
         *  @param aAddress Address with possibly TTL & number of addresses
         *  @param aTTL TTL value is stored here (or KErrNotFound)
         *  @param aNumberOfAddresses Range of addreses
         *  @return The address
         */
        HBufC8* ParseAddressFieldL( TBool aAddressTypeIP4,
                                    const TDesC8& aAddress,
                                    TInt& aTTL,
                                    TUint& aNumberOfAddresses ) const;

        /**
         *  Parses IP4 address
         *
         *  @param aPos Position of the (first) separation mark         
         *  @param aTTL TTL value is stored here (or KErrNotFound)
         *  @param aAddr Addres in TInetAddr format
         *  @param aAddress The whole address field
         *  @param aNumberOfAddresses Range of addreses
         *  @return The address
         */
        HBufC8* ParseIP4AddressL( TInt aPos, 
                                  TInetAddr& aAddr,
                                  const TDesC8& aAddress,
                                  TInt& aTTL,
                                  TUint& aNumberOfAddresses ) const;

        /**
         *  Parses IP6 address
         *
         *  @param aPos Position of the (first) separation mark         
         *  @param aTTL TTL value is stored here (or KErrNotFound)
         *  @param aAddr Addres in TInetAddr format
         *  @param aAddress The whole address field
         *  @param aNumberOfAddresses Range of addreses
         *  @return The address
         */
        HBufC8* ParseIP6AddressL( TInt aPos, 
                                  TInetAddr& aAddr,
                                  const TDesC8& aAddress,
                                  TInt& aTTL,
                                  TUint& aNumberOfAddresses ) const;

        /**
         *  Copies given network type to iNetType and verifies aNetType to
         *  be valid
         *
         *  @param aNetType Given network type                
         */
        void CopyNetTypeL( const TDesC8& aNetType );

        /**
         *  Copies given address type to iAddressType and verifies aAddrType
         *  to be valid
         * 
         *  @param aAddrType Given address type     
         */
        void CopyAddressTypeL( const TDesC8& aAddrType );

        /**
         *  Copies address to iAddress, and initalizes TTL & number of addresses,
         *  leaves on error
         *  
         *  @param aAddress Address string, which can also contain TTL
         *                  and number of addresses attributes
         */
        void CopyAddressL( const TDesC8& aAddress, RStringPool aPool );

    private:    // Data

        // <network type>
        RStringF iNetType;
        
        // <address type>        
        RStringF iAddressType;

        // mutable TInetAddr for InetAddress()
        mutable TInetAddr iInetAddress;

        // Address in text format
        HBufC8* iAddress;

        // TTL for IP4 multicast addresses
        TInt iTTL;
        // Number of addresses
        TUint iNumOfAddress;

        // String pool
        RStringPool iPool;

		void __DbgTestInvariant() const;


	};

#endif // CSDPCONNECTIONFIELD_H