/*
* Copyright (c) 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:  Declaration of class CCodDownload.   
*
*/


#ifndef COD_DOWNLOAD_H
#define COD_DOWNLOAD_H

// INCLUDES

#include <e32base.h>

// FORWARD DECLARATION

class CCodDownload;
class CCodDownloadImpl;
class CAiwGenericParamList;
class CEikonEnv;

// CLASS DECLARATION

/**
* Cod Download observer.
*/
NONSHARABLE_CLASS( MCodDownloadObserver )
    {
    public:     // types

        enum TEvent              ///< Event.
            {
            EStart,              ///< Load initiated.
            ENameChanged,        ///< Name changed.
            ETypeChanged,        ///< Type changed.
            EProgressUpdate,     ///< Progress update.
            EDone,               ///< Finished (success or failure).
            EAccept,             ///< Load accepted by user (start of load).
            EEndLoad,            ///< Waiting for service flow (end of load).
            EPdPlayAvailable,	 ///< in case of PD allow user to choose 'play'
            EUpdatedDDURI,       ///< Updated DD URI notification to the DM Server
            EResumed,			 ///< Resume successful and ready for PD
            EDownloadPausable,   ///< Informs the Server that download is PAUSABLE
            EDownloadNonPausable,///< Informs the Server that download is NOT PAUSABLE
            EHandlePostResponse, ///<  Intiates fresh download as part handling PostResponseURL of metering response 
            EUpdatedMediaInfo,   ///< Updated Media Info to DM Server
            ESetActiveDownload,  ///< Inform the server about currently active download
            EUpdatedTrackInfo    ///< Updated Media Info to DM Server
            };

    public:     // New methods.

        /**
        * Cod Download event.
        * @param aDownload Download.
        * @param aEvent Event.
        */
        virtual void CodEventL( CCodDownload& aDownload, TEvent aEvent ) = 0;

    };

/**
* Cod Download progress tracking.
*/
NONSHARABLE_STRUCT( TCodDownloadProgress )
    {
    public:     // types

        enum TState             ///< State.
            {
            EInit,              ///< Initial state.
            EInProgress,        ///< In progress.
            ESucceeded,         ///< Succeeded.
            EFailedTemporary,   ///< Failed (temporary error).
            EFailedPermanent,    ///< Failed (permanent error).
            EPaused  			///< Paused
            };

    public:     // data

        TState iState;  ///< Download state.
        TInt iError;    ///< Error code.
        TInt iBytesCur; ///< Bytes downloaded so far (-1 if unknown).
        TInt iBytesMax; ///< Total download size (estimated; -1 if unknown).
    };

/**
* Descriptor-based download.
* Supported descriptor types:
* - text/x-co-desc (Nokia COD)
* - application/vnd.oma.dd+xml (OMA DD)
* - multipart/related, where the first part is one of the two above.
*/
NONSHARABLE_CLASS( CCodDownload ): public CBase
    {
    public:     // Constructors and destructor

        /**
        * Two-phased constructor. Leaves on failure.
        * @param aBuf The descriptor.
        * @param aType Descriptor data type.
        * @param aObserver Observer.
        * @param aEikEnv Eikon environment or NULL. Can be NULL if download
        * does not require UI functionality. If download needs UI but NULL is
        * passed here, the download fails with EFailedPermanent KErrCancel.
        * @return The constructed object.
        */
        IMPORT_C static CCodDownload* NewL
            (
            const TDesC8& aBuf,
            const TDesC8& aType,
            MCodDownloadObserver& aObserver,
            CEikonEnv* aEikEnv
            );

        /**
        * Two-phased constructor. Leaves on failure.
        * This one supports multipart/related where the first part of the
        * multipart is the descriptor.
        * @param aBuf Data buffer (descriptor or multipart).
        * @param aType Data type.
        * @param aObserver Observer.
        * @param aEikEnv Eikon environment or NULL. Can be NULL if download
        * does not require UI functionality. If download needs UI but NULL is
        * passed here, the download fails with EFailedPermanent KErrCancel.
        * @param aMultipartBoundary Multipart boundary or NULL.
        * Required for processing multipart.
        * @param aMultipartUrl Multipart URL or NULL.
        * Required for processing multipart.
        * @return The constructed object.
        */
        IMPORT_C static CCodDownload* NewL
            (
            const TDesC8& aBuf,
            const TDesC8& aType,
            MCodDownloadObserver& aObserver,
            CEikonEnv* aEikEnv,
            const TDesC8* aMultipartBoundary,
            const TDesC16* aMultipartUrl
            );

        /**
        * Destructor.
        */
        IMPORT_C virtual ~CCodDownload();

    public:     // New methods

        /**
        * Start download. Panics if already active.
        * Restart is OK for completed downloads.
        * @param aParams Parameters or NULL.
        */
        IMPORT_C void StartL( const CAiwGenericParamList* aParams );

        /**
        * Stop (cancel) download. Safe to call in any state.
        * Note: processing continues until MCodDownloadObserver::EDone event.
        */
        IMPORT_C void Stop();

        /**
        * Pauses the COD download
        */  
        IMPORT_C void Pause();
        
        /**
        * Get progress.
        * @return Progress.
        */
        IMPORT_C const TCodDownloadProgress& Progress() const;

        /**
        * Get name attribute. This may be empty string, if attribute is
        * empty or not available. Do not store pointer (data may change as
        * download proceeds).
        */
        IMPORT_C TPtrC Name();

        /**
        * Get data type of content (or empty string: type may not be
        * available).
        * @return Data type.
        */
        IMPORT_C TPtrC8 Type() const;

        /**
        * Get path of saved content (or empty string).
        * Available in ESucceeded state only.
        * @return Path of saved content. Fits to KMaxFileName.
        */
        IMPORT_C TPtrC GetPath() const;

        /**
        * Perform service flow after a succesful or failed download.
        * This consists of zero, one or both of
        * - launching downloaded content
        * - activating Next-URL.
        * Load may also be retried.
        * Call this in response to EEndLoad event.
        */
        IMPORT_C void ServiceFlowL();

        /**
        * Get Next-URL.
        * @return Next-URL. Owner is the caller.
        */
        IMPORT_C HBufC8* NextUrlL() const;
        
        /**
        * Get PostResponse-URL.
        * @return PostResponse-URL. Owner is the caller.
        */
        IMPORT_C HBufC8* GetPostResponseUrlL() const;

        /**
        * Get the updated DD URL.
        * @return Updated DD URL.
        */
        IMPORT_C HBufC8* UpdatedDDUriL() const;
        
		/**
        * Check if downloading to removable media.
        * Available after EAccept event.
        * @return ETrue if downloading to removable media.
        */
        IMPORT_C TBool RemovableMedia() const;

        /**
        * Set COD download attached
        * @param aValue If equals ETrue - download is attached
        */
        IMPORT_C void SetCodDlAttached(const TBool aValue);

    public:     // Transparent user data

        /**
        * Get tansparent user data.
        * @return User data.
        */
        IMPORT_C TAny* UserData() const;

        /**
        * Set tansparent user data.
        * @param aUserData User data.
        */
        IMPORT_C void SetUserData( TAny* aUserData );

    public:     //Added as part of multiple download

        /**
        * Two-phased constructor. Leaves on failure.
        * @param aDownloadId Download ID.
        * @param aDlUid App UID.        
        * @param aType Descriptor data type.
        * @param aObserver Observer.
        * @param aEikEnv Eikon environment or NULL. Can be NULL if download
        * does not require UI functionality. If download needs UI but NULL is
        * passed here, the download fails with EFailedPermanent KErrCancel.
        * @return The constructed object.
        */            
        IMPORT_C static CCodDownload* NewL
	        (
	        const TInt aDownloadId,
	        const TUid aDlUid,
	        const TDesC8& aType,
	        MCodDownloadObserver& aObserver,
	        CEikonEnv* aEikEnv 
	        );

        /**
        * Set the CodData stream descriptor.
        * @param aDesStream.
        */
        IMPORT_C HBufC8* UpdatedDownloadDataL() const;
        
        /**
        * Set the stream descriptor for single media object (track).
        * @param aDesStream.
        */
        IMPORT_C HBufC8* UpdatedTrackDataL(TInt& aValue) const;

        /**
        * Get COD Active download 
        * @return Count of currently active download
        */
        IMPORT_C TInt ActiveDownload ( );
        /**
        * Get Destination file name 
        * @param aMOIndex media object index between 1 to 'n'
        * @return NULL if index out of range
        */
        IMPORT_C TPtrC GetDestFilePath (TInt aMOIndex ) const;
            
    private:    // Constructor

        /**
        * Constructor.
        */
        CCodDownload();

    private:    // Data 

        CCodDownloadImpl* iImpl;    ///< Implementation. Owned.

    };

#endif /* def COD_DOWNLOAD_H */
