/*
* Copyright (c) 2006 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:  
*
*/


#ifndef T_CATALOGSHTTPTYPES_H
#define T_CATALOGSHTTPTYPES_H

#include <httpdownloadmgrcommon.h>

class MCatalogsHttpOperation;

/**
* HTTP events
*/

/**
* HTTP operation states
*/
enum TCatalogsHttpOperationState
    {
    /**
    * The operation has been created. This is the initial state
    * of the operation and no event will be sent for it.
    */
    ECatalogsHttpOpCreated,
    
    /**
    * The operation is in progress
    */
    ECatalogsHttpOpInProgress,
    
    /**
    * The operation is on pause. 
    * The operation is not automatically resumed from this state
    */
    ECatalogsHttpOpPaused,
    
    /**
    * The operation is in the operation queue waiting for its
    * execution. 
    *
    * The difference between ECatalogsHttpOpPaused
    * and ECatalogsHttpOpQueued is that the operation goes to the
    * former state if the client pauses the operation. The latter state
    * is entered automatically if the limit for concurrently executing
    * operations would be otherwise exceeded.
    *
    * The operation will be automatically resumed.
    */
    ECatalogsHttpOpQueued,
    
    /**
    * The operation is complete
    */
    ECatalogsHttpOpCompleted,
    
    /**
    * The operation failed
    * 
    * This event is not sent to observers. Handle failures in HandleHttpError()
    * Transport uses this internally.
    */
    ECatalogsHttpOpFailed,
    
    
    /**
    * Not supported yet
    * @ Fix this
    */
    ECatalogsHttpOpMediaRemoved,
    ECatalogsHttpOpMediaInserted,
    
    /**
    * The operation can be paused. Event for this will be sent
    * only after ECatalogsHttpOpNonPausable
    */
    ECatalogsHttpOpPausable,
    
    /**
    * The operation cannot currently be paused
    */
    ECatalogsHttpOpNonPausable,
    
    /**
    * The operation is already running
    */
    ECatalogsHttpOpAlreadyRunning,
    
    /**
    * The operation is being deleted
    */
    ECatalogsHttpOpDeleting    
    };
   
    
/**
* HTTP operation state progress
*/  
enum TCatalogsHttpProgressState
    {
    /**
    * Initial state of the operation
    */
    ECatalogsHttpNone,
    
    /**
    * The operation has started.
    * Event about this is sent only for downloads
    */
    ECatalogsHttpStarted,

    /**
    * The operation is creating a network connection.
    * Event about this is sent only for downloads
    */
    ECatalogsHttpCreatingConnection,

    /**
    * The operation has created a network connection
    * with the server.
    */
    ECatalogsHttpConnected,
    
    /**
    * Network connection has been suspended.
    * Event about this is sent only for downloads
    */
    ECatalogsHttpConnectionSuspended,

    /**
    * Network connection was disconnected.
    * Event about this is sent only for downloads
    */
    ECatalogsHttpDisconnected,

    /**
    * The download has started
    * Event about this is sent only for downloads
    */
    ECatalogsHttpDownloadStarted,
    
    
    /**
    * The operation has received the content type header
    * @note There won't be a separate ECatalogsHttpResponseHeaderReceived
    * event for content type receival.
    */
    ECatalogsHttpContentTypeReceived,
    
    /**
    * Event about this is sent only for downloads
    */    
    ECatalogsHttpSubmitIssued,
    
    /**
    * The operation has received a response header
    */
    ECatalogsHttpResponseHeaderReceived,
    
    /**
    * The operation has received a part of the response body.
    *
    * Transaction observers should request the body when handling
    * this event since the body will be lost after the handler exits.
    *
    * For downloads the body is empty since it is written straight to
    * a file.
    */
    ECatalogsHttpResponseBodyReceived,

    /**
    * The download has been redirected permanently.
    * Transactions don't support redirection.
    * Event about this is sent only for downloads
    */
    ECatalogsHttpRedirectedPermanently,

    /**
    * The download has been redirected temporarily. It shouldn't be
    * paused because there's no guarantee that it can be resumed correctly
    * Transactions don't support redirection.
    * Event about this is sent only for downloads
    */
    ECatalogsHttpRedirectedTemporarily,

    /**
    * 
    * Event about this is sent only for downloads
    */
    ECatalogsHttpNameChanged,

    /**
    * 
    * Event about this is sent only for downloads
    */
    ECatalogsHttpContentTypeChanged,

    /**
    * 
    * Event about this is sent only for downloads
    */
    ECatalogsHttpMovingContentFile,

    /**
    * 
    * Event about this is sent only for downloads
    */
    ECatalogsHttpContentFileMoved,
    
    ECatalogsHttpDone = ECatalogsHttpContentFileMoved
    
    };



/**
 * Error types
 */
enum TCatalogsHttpErrorType
    {
    ECatalogsHttpErrorGeneral = 0,
    ECatalogsHttpErrorHttp
    };


/**
* HTTP event
*/
struct TCatalogsHttpEvent
    {
    /// State of the operation
    TCatalogsHttpOperationState iOperationState;
    
    /// Progress of the operation state
    TCatalogsHttpProgressState iProgressState;  
    
    TCatalogsHttpEvent( const TCatalogsHttpOperationState& aOpState, 
        const TCatalogsHttpProgressState& aPrState ) :
        iOperationState( aOpState ), iProgressState( aPrState )
        {
        }
    };
    
    
/**
 * HTTP erros
 */    
struct TCatalogsHttpError
    {
    /** 
     * Defines the interpretation for iError    
     */
    TCatalogsHttpErrorType iType;
    
    /**
     * Error code. 
     * 
     * If iType is ECatalogsHttpErrorGeneral then this is a Symbian error
     * code.
     * If iType is ECatalogsHttpErrorHttp then this is a HTTP status code
     */
    TInt iError;
    
    TCatalogsHttpError( const TCatalogsHttpErrorType& aType, TInt aError ) :
        iType( aType ), iError( aError )
        {
        }
    };

/**
* HTTP methods
*/    
enum TCatalogsHttpMethod
    {
    ECatalogsHttpGet = 0,
    ECatalogsHttpPost,
    ECatalogsHttpPut,
    ECatalogsHttpHead
    };


/**
* HTTP operation types
*/    
enum TCatalogsHttpOperationType
    {
    ECatalogsHttpTransaction = 0,
    ECatalogsHttpDownload,
    ECatalogsHttpUpload
    };
    
            

/**
* HTTP configuration events
* INTERNAL
* @see MCatalogsHttpConfigObserver
* @see MCatalogsHttpConfig
*/
enum TCatalogsHttpConfigEvent
    {
    ECatalogsHttpCfgPriorityChanged = 0
    };


/**
* HTTP transaction types
* INTERNAL
*/
enum TCatalogsHttpTransactionType
    {
    ECatalogsHttpTransactionNormal = 0,
    ECatalogsHttpTransactionDownload
    };


/**
* Modes for getting HTTP headers in downloads
* INTERNAL
*/
enum TCatalogsHttpHeaderMode
    {
    ECatalogsHttpHeaderModeDefault = 0,
    ECatalogsHttpHeaderModeForceHead,
    ECatalogsHttpHeaderModeNoHead
    };

/**
* Maximum length for content types
*/
const TUint KCatalogsHttpMaxContentTypeLength = KMaxContentTypeLength;


/**
* The operation has been queued
*/
const TInt KCatalogsHttpOperationQueued = 1;

/**
* Type for HTTP operation arrays
*/    
typedef RPointerArray<MCatalogsHttpOperation> 
    RCatalogsHttpOperationArray;
    

const TUint KCatalogsErrorHeaderPresent( 1234 );

_LIT8( KCatalogsHeaderErrorNumber, "catalogs-client-error-number" );
_LIT8( KCatalogsHeaderErrorMessage, "catalogs-client-error-message" );

// HTTP methods
_LIT8( KCatalogsHttpPost, "POST" );
_LIT8( KCatalogsHttpGet,  "GET" );
_LIT8( KCatalogsHttpHead,  "HEAD" );

_LIT8( KCatalogsHttpHeaderHost, "Host" );

_LIT8( KCatalogsHttpHeaderContentDisposition, "Content-Disposition" );

/**
 * Options that can be set with MCatalogsHttpConfig::SetOptions()
 */
enum TCatalogsHttpOptions 
    {
    ECatalogsHttpDisableHeadRequest = 1
    };
        
#endif // T_CATALOGSHTTPTYPES_H
