/*
* Copyright (c) 2002-2004 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:  Implements one download in DownloadManager
*
*/



#ifndef HTTPDOWNLOAD_H
#define HTTPDOWNLOAD_H

//  INCLUDES
#include "HttpClientAppInstance.h"
#include "HttpConnHandler.h"
#include "DownloadDataServ.h"

#include <httpdownloadmgrcommon.h>
#include <e32base.h>
#include <es_sock.h>
#include <http.h>

// CONSTANTS
const TInt KDownloadNameMaxSize = 256;

// MACROS
//#define ?macro ?macro_def

// DATA TYPES
//enum ?declaration
//typedef ?declaration
//extern ?data_type;

// FUNCTION PROTOTYPES
//?type ?function_name(?arg_list);

// FORWARD DECLARATIONS

// CLASS DECLARATION
class RFs;
class RFile;
class CFileMan;
class CHeaderField;
class CHttpStorage;
#ifdef DOWNLOADMGR_PATH_PLUGIN_ENABLED_FF
class CDownloadPathHandler;
#endif
/**
*  ?one_line_short_description.
*  ?other_description_lines
*
*  @lib ?library
*  @since Series 60 v2.8
*/
NONSHARABLE_CLASS( CHttpDownload ): public CActive
                                  , public MConnectionCallback
                                  , public MHTTPTransactionCallback
    {
    public:  // Constructors and destructor
        
        /**
        * Two-phased constructor.
        */
        static CHttpDownload* NewL( const TDesC8& aUrl,
                                    CHttpClientApp *aClientApp,
                                    TInt32 aId,
                                    CHttpClientAppInstance* aClientAppInstance = NULL );
        
        /**
        * Destructor.
        */
        virtual ~CHttpDownload();

    public: // New functions

        /**
        * Starts download process.
        * @since Series 60 v3.2
        * @return none.
        */
        IMPORT_C void Attach( CHttpClientAppInstance* aClientAppInstance );
      
        /**
        * Starts download process.
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        IMPORT_C void StartL();

        /**
        * Pauses the download process.
        * @since Series 60 v2.8
        * @param bStore if ETrue download state is stored into file
        * @return none. Leaves on error.
        */
        IMPORT_C void PauseL( TBool bStore = EFalse );

        /**
        * Resets to the download.
        * @since Series 60 v2.8
        * @return none.
        */
        IMPORT_C void Reset();

        /**
        * Deletes the download. Every reference to this object 
        * becomes invalid after this function returns.
        * @since Series 60 v2.8
        * @return none.
        */
        IMPORT_C void Delete( CHttpClientAppInstance* aClAppInstance );

        /**
        * Deletes the info file associated with the download.
        * This can be called only after the download is completed, 
        *  since deletion of the file is illegal when the download is not yet complete.
        * @since Series 60 v3.2
        * @return none.
        */
		IMPORT_C void DeleteInfoFile( CHttpClientAppInstance* aClAppInstance );

        /**
        * Moves/renames download content file. Destination can be
        * specified with EDlAttrDestFilename
        * @since Series 60 v2.8
        * @param none
        * @return none. Leaves on error:
        * KErrNotReady - if download is not completed yet
        * KErrInUse - if move is in progress
        */
        IMPORT_C void MoveL();

        /**
		* Gets the value for a TInt attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aValue On completion, contains the requested TInt attribute.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not integer
		*/
		IMPORT_C void GetIntAttributeL( THttpDownloadAttrib aAttribute, 
									    TInt32& aValue );

        /**
		* Gets the value for a TBool attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aValue On completion, contains the requested TBool attribute.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not boolean
		*/
		IMPORT_C void GetBoolAttributeL( THttpDownloadAttrib aAttribute, 
                                         TBool& aValue );

		/**
		* Gets the value for a string attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aValue On completion, contains the requested string. Use a 16-bit descriptor!
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not string
        * - KErrNotFound if requested attribute is not initialized. This can make
        * easier to differentiate between that string is zero length or not allocated yet.
		*/
		IMPORT_C HBufC* GetStringAttributeL( THttpDownloadAttrib aAttribute, 
                                             TBool& aDelete );

		/**
		* Gets the value for a string attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aValue On completion, contains the requested string. Use a 16-bit descriptor!
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not string
        * - KErrNotFound if requested attribute is not initialized. This can make it
        * easier to differentiate between that string is zero length or not allocated yet.
		*/
		IMPORT_C HBufC8* GetString8AttributeL( THttpDownloadAttrib aAttribute, 
                                               TBool& aDelete );

        /**
        * 
        */
        IMPORT_C RFile* GetFileHandleAttributeL();

        /**
		* Sets the value for a TInt attribute.
		* @param aAttribute Identifies the attribute to be set.
		* @param aValue The value to be set.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not integer
		*/
		IMPORT_C void SetIntAttributeL( THttpDownloadAttrib aAttribute, 
                                        const TInt32 aValue );
		
		/**
		* Sets the value for a TBool attribute.
		* This method can be used to stop a connection (KConnectionStop).
		* @param aAttribute Identifies the attribute to be set.
		* @param aValue The value to be set.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not boolean
		*/
		IMPORT_C void SetBoolAttributeL( THttpDownloadAttrib aAttribute, 
                                         const TBool aValue );
		
		/**
		* Sets the value for a string attribute.
		* @param aAttribute Identifies the attribute to be set.
		* @param aValue The string value to be set. Must be a 16-bit descriptor!.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not string
		*/
		IMPORT_C void SetStringAttributeL( THttpDownloadAttrib aAttribute, 
                                           const TDesC16& aValue );

		/**
		* Sets the value for a string attribute.
		* @param aAttribute Identifies the attribute to be set.
		* @param aValue The string value to be set. Must be a 16-bit descriptor!.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not string
		*/
		IMPORT_C void SetStringAttributeL( THttpDownloadAttrib aAttribute, 
                                           const TDesC8& aValue );

        /**
        * 
        */
        IMPORT_C void SetFileHandleAttributeL( RFile* aFile );
        
        /**
        * Returns the associated client application instance.
        * @since Series 60 v2.8
        * @return associated client application instance
        */
        IMPORT_C CHttpClientAppInstance* ClientAppInstance() const;

        /**
        * Called only from the server when a leave trapped.
        * This is the place where client app can be informed
        * about this error if not done before.
        * @since Series 60 v2.8
        * @param aError Error code from a previous leave
        * @return none
        */
        IMPORT_C void OnError( TInt aError,
                               THttpDownloadMgrError aDlError = EGeneral );

        /**
		* Gets the value for a TInt attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aMoIndex Identifies the media object index.
		* @param aValue On completion, contains the requested TInt attribute.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not integer
		*/
		IMPORT_C void GetIntAttributeL( THttpDownloadAttrib aAttribute, 
									    TInt32& aMoIndex,
									    TInt32& aValue );

        /**
		* Gets the value for a TBool attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aMoIndex Identifies the media object index.
		* @param aValue On completion, contains the requested TBool attribute.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not boolean
		*/
		IMPORT_C void GetBoolAttributeL( THttpDownloadAttrib aAttribute, 
		                                 TInt32& aMoIndex,
                                         TBool& aValue );
        
        /**
		* Gets the value for a string attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aMoIndex Identifies the media object index.
		* @param aValue On completion, contains the requested string. Use a 16-bit descriptor!
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not string
        * - KErrNotFound if requested attribute is not initialized. This can make
        * easier to differentiate between that string is zero length or not allocated yet.
		*/
		IMPORT_C HBufC* GetStringAttributeL( THttpDownloadAttrib aAttribute, 
		                                     TInt32& aMoIndex,
                                             TBool& aDelete );
        
        /**
		* Gets the value for a string attribute.
		* @param aAttribute Identifies the attribute to be retrived.
		* @param aMoIndex Identifies the media object index.
		* @param aValue On completion, contains the requested string. Use a 16-bit descriptor!
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not string
        * - KErrNotFound if requested attribute is not initialized. This can make it
        * easier to differentiate between that string is zero length or not allocated yet.
		*/
		IMPORT_C HBufC8* GetString8AttributeL( THttpDownloadAttrib aAttribute, 
		                                       TInt32& aMoIndex,
                                               TBool& aDelete );

		/**
		* Sets the value for a string attribute.
		* @param aAttribute Identifies the attribute to be set.
		* @param aMOIndex - media object index.
		* @param aValue The string value to be set. Must be a 16-bit descriptor!.
        * @return void. Leaves on error:
        * - KErrArgument if requested attribute is unknown or not string
		*/
        IMPORT_C void SetStringAttributeL( THttpDownloadAttrib aAttribute, const TInt32 aMOIndex,
								                  const TDesC16& aValue );

        /**
		* Sets the Download data (media info).
		*/
        IMPORT_C void SetDownloadDataAttributeL(HBufC8* dlData);
        
        /**
        * Sets the media object data (track info).
        */
        IMPORT_C void SetTrackDataAttributeL(TInt aIndex, HBufC8* dlData);

        /**
        * Detach the given client instance from the download.
        * @param aInstance client app instance to be detached
        * @return ETrue if download is still attached to another instance
        */                                
        IMPORT_C TBool DetachClientInstance( CHttpClientAppInstance* aInstance );

        /**
        * Return the client application where this download is created.
        * @since Series 60 v2.8
        * @return client application where this download is created
        */
        CHttpClientApp* ClientApp() const;

        /**
        * Returns the associated PD client application instance.
        * @since Series 60 v3.2
        * @return associated PD client application instance
        */
        CHttpClientAppInstance* PDClientAppInstance() const;

        /**
        * Returns the unique download id.
        * @since Series 60 v2.8
        * @return unique id of this download
        */
        TInt Id() const;

        /**
        * Returns the state of this download. 
        * @since Series 60 v2.8
        * @return state of this download
        */
        THttpDownloadState State() const;

        /**
        * Returns the progress state of the download.
        * @since Series 60 v2.8
        * @return progress state of this download
        */
        THttpProgressState ProgState() const;

        /**
        * Returns associated connection handler.
        * @since Series 60 v2.8
        * @return associated connection handler
        */
        CHttpConnHandler* ConnHandler() const;

        /**
        * Return EDlAttrNoMedia
        * @since Series 60 v2.8
        * @return ETrue if media is removed
        */
        TBool NoMedia() const;

        /**
        * Called when media card removed.
        * @since Series 60 v2.8
        * @return none.
        */
        void MediaRemoved( TUint aUid, TBool aDontCheckMediaUid = EFalse );

        /**
        * Called when media card inserted.
        * @since Series 60 v2.8
        * @return none.
        */
        void MediaInserted( TUint aUid );

        /**
        * Returns the current download destination drive id.
        * @since Series 60 v2.8
        * @return none.
        */
        TInt GetDestinationDriveID() const;
        
        /**
        * Associates download with the given client instance.
        * @since Series 60 v2.8
        * @param aInstance client instance this download to be associated with
        * @param aNoMoveEvent if ETrue move event disabled
        * @return none.
        */
        void SetClientInstance( CHttpClientAppInstance* aInstance,
                                TBool aNoMoveEvent = EFalse );

        
        /**
        * Associates download with the given connection handler
        * @since Series 60 v2.8
        * @param aConnHandler connection handler this download to be associated with
        * @return ?description
        */
        void SetConnHandler( CHttpConnHandler* aConnHandler );

        /**
        * Returns pausable state of the download
        */
        TBool Pausable() const;
        
        /**
        * Sets a new download name. Triggers EHttpProgDlNameChanged event.
        * @param aNewName new download name
        * @return none. Leaves on error.
        */
        void SetDownloadNameL( const TDesC& aNewName );

        void Ref() { ++iRefCount; }

        void Deref() { if( --iRefCount == 0 ) delete this; }
        
    public: // Functions from base classes

        /**
        * methods from MHTTPTransactionCallback
        */
        virtual void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
        virtual TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent);

        /**
        * methods from CActive
        */
	    virtual void DoCancel();
	    virtual void RunL();
        virtual TInt RunError(TInt aError);
    
        /**
        * methods from MConnectionCallback
        */
        void Connected();
        void Suspended();
        void Disconnected();
        void ConnectionFailed( TInt aError );
        void SetRetryFlag(TBool aFlag){ iRetryFlag = aFlag; }
        TBool GetRetryFlag(){ return iRetryFlag;}        
        
    protected:  // New functions

        /**
        * Does real reset on download
        * @since Series 60 v2.8
        * @param aOnDelete if ETrue function called on delete
        * @return none.
        */
        void DoReset( TBool aOnDelete = EFalse );

        /**
        * Stores download info into file.
        * @since Series 60 v2.8
        * @return none. Leave on error.
        */
        void StoreDownloadInfoL();

        /**
        * Loads download info from file.
        * @since Series 60 v2.8
        * @return none. Leaves on failure.
        */
        void LoadDownloadInfoL();

        /**
        * Checks that (if known) that content
        * is still valid or expired.
        * @since Series Series60
        * @return ETrue if content is expired
        */
        TBool IsExpired();

        /**
        * Called if download completed.
        * @since Series 60 v2.8
        * @param ?arg1 ?description
        * @return ?description
        */
        void OnCompletedL();
        
       
       /**
        * Checks that if content type is of file storage type 
        * @return ETrue if content is of file storage type
        */
        TBool IsContentFileStorageType();
        
        /**
        * Reinitialize download. 
        * @since Series 60 v2.8
        */
        void ReInitializeDownload();

        /**
        * Cancels transaction.
        * @since Series 60 v2.8
        * @return none.
        */
        void CancelTransaction();

        /**
        * Pauses the download process.
        * @since Series 60 v2.8
        * @param aDisconnect if ETrue download disconnects
        * @return none. Leaves on error.
        */
        void InternalPauseL( TBool aDisconnect = EFalse );

        /**
        * Set download status and calls event callback function.
        * @since Series 60 v2.8
        * @param aProgState see THttpProgressState
        * @param aStatus see THttpDownloadState
        * @param aErrorId see THttpDownloadMgrError
        * @param aGlobalErrorId global error id
        * @return none.
        */
        void SetDownloadStatus( THttpProgressState aProgState,
                                THttpDownloadState aStatus = EHttpDlInprogress,
                                THttpDownloadMgrError aErrorId = ENoError,
                                TInt aGlobalErrorId = KErrUnknown );

        /**
        * Called when response header received. 
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void ResponseHeaderReceivedL();

        /**
        * Called when a new body chunk received.
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void ResponseBodyReceivedL( const TDesC8& aBuf );

        /**
        * Start connection creation process.
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void Connect();

        /**
        * Disconnects download from the network.
        * @since Series 60 v2.8
        * @return none.
        */
        void Disconnect();

        /**
        * Requesting header.
        * @param aStringPool stringpool of HTTP session
        * @param aHeaders request header of the transaction
        * @param ETrue if HEAD method used.
        * @return none. Leaves on error.
        */
        void SetRequestHeaderL( RStringPool& aStringPool,
                                RHTTPHeaders& aHeaders,
                                TBool aHeadMethod );

        /**
        * Disables pipelining of the transaction.
        * @since Series 60 v2.8
        * @param aStringPool stringpool of HTTP session
        * @return none. Leaves on error.
        */
        void DisablePipeliningL( RStringPool& aStringPool );

        /**
        * Sets transaction property.
        * @param aStringPool stringpool of HTTP session
        * @param aPropertyName name of the property
        * @param aToken property value
        * @return none. Leaves on error.
        */
        void SetPropertyL( RStringPool& aStringPool,
                           RStringF aPropertyName, 
                           const TDesC8& aToken );

        /**
        * Sets transaction property.
        * @param aPropertyName name of the property
        * @param aValue property value
        * @return none. Leaves on error.
        */
        void SetPropertyL( RStringF aPropertyName, 
                           const TInt aValue );

        /**
        * Add client app's own fields to request header
        * @since Series 60 v2.8
        * @param aStringPool stringpool of HTTP session
        * @param aHeaders request header of the transaction
        * @return none. Leaves of error
        */
        void SetRequestHeaderAddOnL( RStringPool& aStringPool,
                                     RHTTPHeaders& aHeaders );
        /**
        * Set credential properties of transaction
        * @since Series 60 v2.8
        * @param aStringPool stringpool of HTTP session
        * @return none. Leaves of error
        */
        void SetCredentialsInfoL( RStringPool& aStringPool );

        /**
        * Set 'Range' field in request header.
        * @since Series 60 v2.8
        * @param aStringPool stringpool of HTTP session
        * @param aHeaders request header of the transaction
        * @return none. Leaves of error
        */
        void SetRangeFieldL( RStringPool& aStringPool,
                             RHTTPHeaders& aHeaders );

        /**
        * Sets the given header field with the expire value
        * @since Series 60 v2.8
        * @param aField header field to be set
        * @param aHeaders request header of the transaction
        * @return ?description
        */
        void SetExpireToFieldL( RStringF& aField, 
                                RStringPool& aStringPool,
                                RHTTPHeaders& aHeaders );

        /**
        * Rebuilds the url with scheme and port
        * @since Series 60 v2.8
        * @return none. Leaves of error
        */
        void ParseRequestedUrlL();

        /**
        * Creates the download name from the url
        * @since Series 60 v2.8
        * @return none. Leaves of error
        */
        void ParseDownloadNameL();

        /**
        * Store entire response header with raw data in iHeaders array
        * @since Series 60 v2.8
        * @return none. Leaves of error
        */
        void StoreResponseHeaderL();

        /**
        * Saves credentials info to memory for next submit.
        * Credential info are deleted in destructor and never
        * persisted.
        * @since Series 60 v2.8
        * @param aStringPool stringpool of HTTP session
        * @return none. Leaves of error
        */
        void SaveCredentialsL( RStringPool aStringPool );

        /**
        * Builds up the request and submits the transaction.
        * @since Series 60 v2.8
        * @return none. Leaves of error
        */
        void RequestContentL();

    protected:  // Functions from base classes
        
    private:

        /**
        * C++ default constructor.
        */
        CHttpDownload( CHttpClientApp *aClientApp,
                       TInt32 aId,
                       CHttpClientAppInstance* aClientAppInstance );

        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL( const TDesC8& aUrl );

        // Prohibit copy constructor if not deriving from CBase.
        // CHttpDownload( const CHttpDownload& );
        // Prohibit assigment operator if not deriving from CBase.
        // CHttpDownload& operator=( const CHttpDownload& );

        /**
        * Called when content type received in response header.
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void ContentTypeReceivedL();

        /**
        * Handles HTTP error 401
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void HttpResponse401L();

        /**
        * Handles HTTP error 407
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void HttpResponse407L();

        /**
        * Search for and return a field in response header
        * @since Series 60 v2.8
        * @param aFieldName name of the field
        * @return index to the field in iHeaders or KErrNotFound
        */
        TInt FindHeaderField( CArrayPtrFlat<CHeaderField>* aHeaders,
                              const TDesC8& aFieldName ) const;

        /**
        * Converts download name to unique one.
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void ConvertDownloadNameUniqueL();

        /**
        * Creates a unique, indexed name
        * @since Series 60 v2.8
        * @return none. Leaves on error.
        */
        void CreateIndexedNameL( HBufC* &aUniqueName, 
                                 TDesC& aOrgName, 
                                 TInt& aIndex );

        /**
        * Stores response header received by client application.
        * It is used only in case of continue download.
        * @param aResponseHeader see EDlAttrResponseHeader
        * @return none. Leaves on error.
        */
        void ContinueDownloadStoreResponseHeaderL( 
                                                const TDesC8& aResponseHeader );

        /**
        * Parses content type and media type from the response header.
        * @return none. Leaves on error.
        */
        void ParseContentTypeL( RStringPool& aStrPool );

        /**
        * Parses content disposition from the response header.
        * @return none. Leaves on error.
        */
        void ParseContentDispositionL( RStringPool& aStrPool );

        /**
        * Called mainly from SetDownloadStatus. This function passes
        * the download statuses to the event handler
        * @since Series 60 v2.8
        * @return none.
        */
        void TriggerEvent( THttpDownloadState aDlState,
                           THttpProgressState aProgState = EHttpProgNone );

        /**
        * Checks that in current situation the download is pausable, or not.
        * Triggers event to client if pausable attribute changes.
        * @since Series 60 v2.8
        * @return none.
        */
        void UpdatePausable();

        /**
        * Do some (re)initialization before a forced restart.
        * @since Series 60 v2.8
        * @return none.
        */
        void ForcedRestartL();

        /**
        * Returns the raw data of the requested header field.
        * @since Series 60 v2.8
        * @return HBufC8* buffer with raw data of header field.
        */
        HBufC8* HeaderFieldL( CArrayPtrFlat<CHeaderField>* aHeaders, 
                              TInt aFieldIndex );

#ifdef DEAD_CODE
        /**
        * Checks the response header on 206 response, if the
        * content is really what we requested and hasn't changed
        * since last request.
        * Checked field: date
        * @return ETrue if content is probably not modified
        */
        TBool CheckIfContentUnModified();
#endif

        /**
        * Checks the max length of the string attribute
        * since last request.
        * Checked field: date
        * @return none.
        */
        void CheckAttribMaxLengthL( THttpDownloadAttrib aAttribute, 
	                                const TDesC16& aValue );

        /**
        * Checks the max length of the string attribute
        * since last request.
        * Checked field: date
        * @return none.
        */
        void CheckAttribMaxLengthL( THttpDownloadAttrib aAttribute, 
	                                const TDesC8& aValue );

        /**
        * Set cookie transaction property
        * @param aStringPool stringpool of HTTP session
        * @return none. Leaves of error.
        */
        void SetCookiesL( RStringPool& aStringPool );

        /**
        * Client side transaction completed.
        */
        void DownloadSucceededL();

        /**
        * Parses input request header add-on and stores it in request headers array.
        * @param aValue Request header add-on from client application
        * @return None. Leaves on error.
        */
        void ParseRequestHeaderAddOnL( const TDesC8& aValue );

        /**
        * Load headers from file
        */
        void LoadHeadersL( RFile& aFile, CArrayPtrFlat<CHeaderField>* aHeaders );

        /**
        * Append headers to buffer
        */
        void AppendHeadersL( TPtr8& aBuf, CArrayPtrFlat<CHeaderField>* aHeaders );

        /**
        * Get the size of Http headers
        */
        TInt GetHttpHeadersSize(CArrayPtrFlat<CHeaderField>* aHeaders );
        
        /**
        * Add the given header in the header array
        * @return None. Leaves on error.
        */
        void AddHeaderL( THttpDownloadAttrib aAttribute, 
			             const TDesC8& aValue,
                         const TInt aConversionTable[][2],
                         CArrayPtrFlat<CHeaderField>* aHeaders );

        /**
        * Handles permanent redirection event
        * @param aNewUrl new URL after redirection
        * @return None. Leaves on error.
        */
        void RedirectedPermanentlyL( const TDesC8& aNewUrl );
        
        /**
        * Handles temporary redirection event
        * @param aNewUrl new URL after redirection
        * @return None. Leaves on error.
        */
        void RedirectedTemporaryL( const TDesC8& aNewUrl );
        
        /**
        * Check that the content is supported multipart
        * @param aBuf new chunk of message body
        * @return TBool. Leaves on error.
        */        
        TBool IsMultipartSupportedL( const TDesC8& aBuf );
        
        /**
        * Gets the specified attribute from media type
        * @param aAttribute Required attribute
        * @return TPtrC8. Leaves on error - KErrNotFound.
        */                
        TPtrC8 GetParamFromMediaTypeL( const TDesC8& aAttribute );
        
        /**
        * Escape decoded URL may contain characters that cannot
        * be used to create filename. These characters are replaced
        * with KUrlFixChar
        * @return none. Leaves on error.
        */
        void FixDownloadNameL();
        
        /**
        * Set iCodDownload = aValue
        */       
        void SetCodFlag( TBool aValue );
        
        
        /**
        * Check the contenttype and returns TRUE if drm
        */         
        void CheckRealDRMContentType();
        
        /**
        * Self completes the active object
        */
        void SelfComplete( TInt aReason = KErrNone );
        
        /**
        *check for correct drive to move from cenrep
        */
        void UpdateDestFileNameL();

        /**
        * notify DcfRepository for new/deleted files
        */
        void UpdateDCFRepositoryL( const TDesC& aFileName );
        
        /**
        * Move completed media object files to gallery when delete is called
        * @param aMediaObjectIndex media object index to be moved
        * @return error code
        */
        TInt MoveInDelete(TInt aMediaObjectIndex);

        /**
        * Initiates a move for downloaded media object files to gallery/download folder
        * @param aMediaObjectIndex media object index to be moved
        */
        void MoveDownloadedMediaObjectL(TInt aMediaObjectIndex);
        
        /**
        * Moves downloaded media object file to gallery/download folder
        * @param aMediaObjectIndex media object index to be moved
        */
        void MoveDownloadedMediaObjectSyncL(TInt aMediaObjectIndex);
        
        /**
        * Calls ConvertDownloadNameUniqueL to create unique name based on source file name
        * and destination path. 
        */
        void FindUniqueDestinationFileNameL( TDesC& srcFile, HBufC*& destPath );

        /**
        * Notifies gallery about new file
        * @param aFileName file name
        */        
        void CHttpDownload::NotifyMediaGalleryL( const TDesC& aFileName );
        
        /**
        * ConvertDownloadNameUniqueL
        */        
        void CHttpDownload::ConvertDownloadNameUniqueL( HBufC*& filePath,
                                            			HBufC*& fileName,
                                            			HBufC*& fileExtn);
#ifdef DOWNLOADMGR_PATH_PLUGIN_ENABLED_FF
        /*
         * Gets the instance of CDownloadPathHandler from the Plugin implementaion, if present 
         */
        CDownloadPathHandler* GetDownloadPathPluginInstanceL();
        /*
         * Get Updated path from the Plugin Implementation
         */
        void GetUpdatedPathFromPluginL(CDownloadPathHandler* downloadPathPlugin,TFileName& rootPath, TPtr& fileNamePtr);
#endif
    public:     // Data
        // ?one_line_short_description_of_data
        //?data_declaration;
    
    protected:  // Data

        TInt32  iId;    // unique id of the download
        CHttpClientApp* iClientApp;
        CHttpClientAppInstance* iClAppInstance;    // pointer to the client app's 
                                            // preferencies class
		CHttpClientAppInstance* iPDClAppInstance;
        TInt32   iUserData;     // EDlAttrUserData

        HBufC8* iUrl;           // EDlAttrReqUrl
        HBufC8* iRedirUrl;      // EDlAttrRedirUlr
        HBufC8* iCurrentUrl;    // EDlAttrCurrentUrl
        HBufC*  iDlName;        // EDlAttrName
        TInt32  iPort;          // EDlAttrPort
        TInt    iTargetApp;     // EDlAttrTargetApp
        THttpMethod iMethod;    // EDlAttrMethod

        TInt    iAuthScheme;    // EDlAttrAuthScheme
        HBufC8* iHttpRealm;     // EDlAttrRealm
        HBufC8* iHttpUsername;  // EDlAttrUsername
        HBufC8* iHttpPassword;  // EDlAttrPassword
        HBufC8* iHttpProxyRealm;// EDlAttrProxyRealm
        HBufC8* iHttpProxyUsername;  // EDlAttrProxyUsername
        HBufC8* iHttpProxyPassword;  // EDlAttrProxyPassword
        HBufC8* iHttpNonce;     // Nonce-value used in digest authentication
                                // Received from HTTP server, non-accessible from
                                // outside

        TInt32  iPreferencies;

        TBool   iDisconnectOnPause;     // EDlAttrDisconnectOnPause
        TBool   iDisconnectOnReset;     // EDlAttrDisconnectOnReset
        TInt    iCodDownload;           // See EDlCodDownload this is a bool attrib but needs to increment!
        TInt32  iFotaPckgId;            // EDlAttrFotaPckgId

        CArrayPtrFlat<CHeaderField>* iResponseHeaders;  // Response header
        CArrayPtrFlat<CHeaderField>* iRequestHeaders;   // Additional request header
                                                        // See ERequestHeaderAddon
        CArrayPtrFlat<CHeaderField>* iEntityHeaders;
        CArrayPtrFlat<CHeaderField>* iGeneralHeaders;

        // the following members are initialized from
        // HTTP response header.
        TInt32      iStatusCode;        // EDlAttrStatusCode
        HBufC8*     iContentType;       // EDlAttrContentType
        HBufC8*     iDispositionType;         // EDlAttrDispositionType (e.g.:"inline", "attachment")
        HBufC*		iAttachmentFileName;      // EDlAttrFileNameParm
        HBufC8*     iMediaType;         // EDlAttrMediaType
        TDateTime   iDate;
        TDateTime   iExpires;
        TTimeIntervalSeconds    iMaxAge;

        CHttpConnHandler* iConnHandler; // pointer to the CHttpConnHandler.
                                        // Not owned.
        RHTTPTransaction    iTrans;
        TBool               iTransValid;// iTrans is a valid transaction

        THttpDownloadState  iDlState;       // EDlAttrState
        THttpProgressState  iProgState;     // EDlAttrProgressState

        THttpDownloadMgrAction  iAction;    // EDlAttrAction
        THttpRestartActions iRestartAction; // EDlAttrRestartAction
        
        TInt    iLastError;             // EDlAttrErrorId
        TInt    iGlobalErrorId;         // EDlAttrGlobalErrorId

        TBool   iNoContentTypeCheck;    // EDlAttrNoContentTypeCheck

        TInt    iDontFireEvent;

        CFileMan*   iFileMan;           // used in MoveL

        TBool   iNoMedia;               // See EDlAttrNoMedia
        TBool   iContinueDownload;      // See EDlContinue

        CHttpStorage*   iStorage;       // Stores received body data
        
        HBufC8*  iHashedMsgBody;        // EDlAttrHashedMsgBody

		TBool	iUseAttachmentFileName;	// Content disposition type = "attachment"
		TBool	iUseInlineFileName;		// Content disposition type = "inline"

		TBool   iCodPdAvailable;		// COD Progerssive download is available

        TBool   iUpdatedDDUriSet;       //True if updated DD URI is set from COD Eng
        HBufC8* iDDType;                // EDlAttrDDType
        
        CDownloadDataServ* iCodDlData;// COD download info
        
        TFileName iFname;               ///< File name.

    private:    // Data

        TBool   iNoRealError;           // It's set in Get/SetAttrib functions. Indicates
                                        // that if a leave occures it doesn't have any
                                        // real effect on download process and nothing
                                        // to do in the OnError()
        TBool   iRedirect;              // Transaction redirected.
                                        // Restore iCurrentUrl to iUrl after transaction abnormally
                                        // completed (paused, failed)
        TBool   iPausable;              // EDlAttrPausable 

        TBool   iDlStartedByClient;     // Download started by client app via ::StartL.
                                        // In some cases the download is restarted by the engine.
        TBool   iSilentMode;            // EDlAttrSilent
        TBool   iHidden;                // EDlAttrHidden

        TBool   iUseCookies;
        
        TBool   iPausableDRM;           // Set to ETrue if KDRMOldContentType is found in response header.
        TBool   iDrmContentLengthValid; //
      
       
        HBufC8* iHeaderOfMultipart;     // Header of multipart
        TBool   iMultiPart;

        TBool   iDlNameChanged;         //Set if download name has changed        
        TBool   iContTypeRecognitionAvailSent;

        HBufC8* iDownloadInfo;          // contains download info

        TInt    iRefCount;
        
        TBool    iMoveInProgress;
        
        TInt    iMoLength;              //Multiple Media Object Length
        TInt    iActiveDownload;        // Currenlty active Cod Download
        TInt    iActivePlayedDownload;  // Currenlty actively played Cod Download
        TInt	iMOMoved;				// index for bulk move
        TBool   iMoDownloadCompleted;   //MO download Completed.But Move will be issued by PD Client
        TBool   iRetryFlag;
        
    public:     // Friend classes
        //?friend_class_declaration;
    protected:  // Friend classes

        friend class CHttpStorage;

    private:    // Friend classes
        //?friend_class_declaration;
    };

#endif      // HTTPDOWNLOAD_H   
            
// End of File
