dvrengine/CommonRecordingEngine/inc/CCRRTSPCommand.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:37 +0100
branchRCL_3
changeset 23 13a33d82ad98
parent 0 822a42b6c3f1
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201029 Kit: 201035

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:    Class for parsing and producing a command string*
*/




#ifndef CCRRTSPCOMMAND_H
#define CCRRTSPCOMMAND_H

// INCLUDES
#include "CRRtspCommon.h"
#include <Hash.h>

// CONSTANTS
// None

// MACROS
// None

// DATA TYPES
// None

// FORWARD DECLARATIONS
// None

// CLASS DECLARATION

/**
*  Class that parses and produces rtsp commands as in rfc2326.
*
*  @lib CommonRecordingEngine.lib
*  @since Series 60 3.0
*/
class CCRRtspCommand : public CCRRtspCommon
    {
    
public: // Data types 

    /**
    * Enum for subset of RTSP commands 
    */
    enum TCommand
        {
		ERTSPCommandPLAY = 0,  /**< Command for triggering clip that has been SETUP */
        ERTSPCommandPAUSE,     /**< Command for pausing a clip that is already  playing */
        ERTSPCommandTEARDOWN,  /**< Command for quitting a session */
        ERTSPCommandOPTIONS,   /**< No operation, except ping */
        ERTSPCommandDESCRIBE,  /**< Command for acquiring an SDP */
        ERTSPCommandSETUP,     /**< Command for setting up audio or video stream */
        ERTSPCommandNOCOMMAND  /**< init value, no-operation */
        };    

public: // Constructors and destructor

    /**
    * Two-phased constructor.
    * @return CCRRtspCommand pointer to CCRRtspCommand class.
    */
    static CCRRtspCommand* NewL();

    /**
    * Destructor.
    */
    virtual ~CCRRtspCommand( );

public: // New functions

    /**
    * Method that is used to give rtsp command to this class.
    * command is something alike:
    * "PLAY rtsp://vishnu.wipsl.com/oops/winter_fun.mp4/ RTSP/1.0\r\n..."
    * @since Series 60 3.0
    * @param aString is the response string
    * @return none. 
    *         May leave with symbian error codes. At least following may be 
    *         seen: KErrUnderflow if there is \r\n\r\n sequence in the string
    *         marking end of response or if there is content (like SDP) and the
    *         content lenght is too short; KErrNotSupported if it doesn't look
    *         like RTSP at all.
    */
    void TryParseL( const TDesC8 &aString );

    /**
    * Method for getting URL. 
    * @since Series 60 3.0
    * @param aURL is string descriptor allocated by caller that
    *        will have its content set to block allocated by instance
    *        of this class containing the session id. 
    * @return KErrNone if no error, KErrNotFound if URL is not there.
    */
    TInt URL( TPtrC8& aURL ); 
            
    /**
    * Method for setting URL.
    * @since Series 60 3.0
    * @param aURL is string descriptor allocated by caller. 
    * @return none.
    */
    void SetURL( const TDesC8& aURL ); 

    /**
    * Method for setting command.
    * @since Series 60 3.0
    * @param aCommand is the command that will be set.
    * @return none.
    */
    void SetCommand( TCommand aCommand  ); 
    
    /**
    * Method for setting authentication info.
    * @since Series 60 3.0
    * @param aAuth is ETrue if authentication is to be used.
    *        When constructing command string, authentication headers
    *        will be added. See also SetUserNameL et al. 
    * @return none.
    */
    void SetAuthentication( TBool aAuth  ); 

    /**
    * Sets identification string to be sent as 'UserAgent' header.
    * No header is sent if not identification is not set.
    * @since Series 60 3.0
    * @param aUserAgent user agent identification.
    * @return none.
    */
    void SetUserAgentL( const TDesC8& aUserAgent );

    /**
    * Sets connection bandwidth to be sent as 'Bandwidth' header.
    * No header is sent if bandwidth is not set.
    * @since Series 60 3.0
    * @param aBandwidth connection bandwidth in bit/s.
    * @return none.
    */
    void SetBandwidth( TInt aBandwidth );

    /**
    * Sets profile identification for 'x-wap-profile' header.
    * @since Series 60 3.0
    * No header is sent if identification is not set.
    * @param aWapProfile profile identification.
    * @return none.
    */
    void SetWapProfileL( const TDesC8& aWapProfile );

    /**
    * Method for getting command.
    * @since Series 60 3.0
    * @param none.
    * @return the command.
    */
    CCRRtspCommand::TCommand Command( void ) const; 
        
    /**
    * Method that does opposite of parse: it produces a RTSP command.
    * @since Series 60 3.0
    * @param none.
    * @return string descriptor containing the command
    */
    TPtrC8& ProduceL( void ); 

    /**
    * Appends string to the buffer.
    * @since Series 60 3.0
    * @param aBuffer a buffer where to add text.
    * @param aTxt a string to append.
    * @return none.
    */
    void AppendL( HBufC8*& aBuffer,
                  const TDesC8& aTxt );

    /**
    * Appends integer value as text to the buffer.
    * @since Series 60 3.0
    * @param aBuffer a buffer where to add text.
    * @param aNum a numerical value to append.
    * @return none.
    */
    void AppendNumL( HBufC8*& aBuffer,
                     const TInt aNum );

    /**
    * Appends formatted text to the buffer.
    * @since Series 60 3.0
    * @param aBuffer a buffer where to add text.
    * @param aFmt a format string to use.
    * @return none.
    */
    void AppendFormatL( HBufC8*& aBuffer,
                        TRefByValue<const TDesC8> aFmt, ... );

private: // Constructors and destructors

    /**
     * default constructor
     */
     CCRRtspCommand(); 
     
    /** 
     * 2nd phase constructor 
     */
     void ConstructL();
    
private: // new methods:

    /** 
    * Method for finding the URL this command is about
    * @since Series 60 3.0
    * @param none.
    * @return none but will leave with KErrNotSupported 
    *         if it doesn't look like RTSP
    */
    void FindURLL( void ); 

    /**
    * Generates authentication header iAuthHeader using given values.
    * Method described in RFC 2069 "An Extension to HTTP : Digest Access 
    * Authentication".
    * @since Series 60 3.0
    * @param aMethod Method name (e.g. "DESCRIBE" / "SETUP" / etc.)
    */
    void CalculateDigestResponseL( const TDesC8& aMethod ); 
    
    /**
    * Generates authentication header iAuthHeader using given values.
    * Method described in RFC 2617 "HTTP Authentication: Basic and Digest 
    * Access Authentication".
    * @since Series 60 3.0
    * @param aMethod Method name (e.g. "DESCRIBE" / "SETUP" / etc.)
    */
    void CalculateBasicResponseL( const TDesC8& aMethod );
    
    /**
    * Calculates MD5 hash of the message.
    * @since Series 60 3.0
    * @param aMessage Message.
    * @param aHash On return, contains message hash.
    */
    void HashL( const TDesC8& aMessage, TDes8& aHash );  
       
private: // Data

    /** 
    * What command this is.
    */
    TCommand iCommand; 
    
    /**
    * What is the URL that this command is about.
    */
    TPtrC8 iURL; 
    
    /**
    * String descriptor that we retur with ProduceL.
    */
    TPtrC8 iProductDescriptor; 
    
    /**
    * Authentication header.
    */
    HBufC8* iAuthHeader;
        
    /**
    * MD5 message digest class. Required for HTTP digest authentication.
    */
    CMD5* iMD5Calculator;
    
    /**
    * If authentication is needed.
    */
    TBool iAuthenticationNeeded;

    /**
    * User Agent header if present.
    */
    HBufC8* iUserAgent;

    /**
    * Connection bandwidth in bit/s for 'Bandwidth' header.
    */
    TInt iBandwidth;

    /**
    * Bandwidth present.
    */
    TBool iBandwidthAvailable;

    /**
    * x-wap-profile if present.
    */
    HBufC8* iWapProfile;
    
    };

#endif // CCRRTSPCOMMAND_H

// End of file