/*
* 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 C_CATALOGSHTTPSTACK_H
#define C_CATALOGSHTTPSTACK_H

#include <http/mhttpdatasupplier.h>
#include <http/mhttptransactioncallback.h>
#include <http/mhttpauthenticationcallback.h>

#include "catalogshttpstackobserver.h"
#include "catalogskeyvaluepair.h"
#include "catalogsconnectionmethod.h"


// Constants
const TInt KRequestTimeoutMicroseconds( 180000000 );

// Forward declarations
class RHTTPSession;
class RHTTPTransaction;
class CCatalogsHttpConnectionCreator;
class CCatalogsHttpConnectionManager;
class CCatalogsConnection;

/**
 * Symbian implementation of a HTTP stack.
 */
class CCatalogsHttpStack :   
    public CActive,     
    public MHTTPTransactionCallback,
    public MHTTPDataSupplier,
    public MHTTPAuthenticationCallback
    {
public:
    
    static CCatalogsHttpStack* NewL( 
        MCatalogsHttpStackObserver* aObserver,
        CCatalogsConnection& aConnection,
        CCatalogsHttpConnectionCreator& aConnectionCreator );
        
    static CCatalogsHttpStack* NewLC( 
        MCatalogsHttpStackObserver* aObserver,
        CCatalogsConnection& aConnection,
        CCatalogsHttpConnectionCreator& aConnectionCreator );
        
    virtual ~CCatalogsHttpStack();

private:
    
    void ConstructL();
    CCatalogsHttpStack( 
        MCatalogsHttpStackObserver* iObserver,
        CCatalogsConnection& aConnection,
        CCatalogsHttpConnectionCreator& aConnectionCreator );

    void SetHeaderL( RHTTPHeaders aHeaders, 
                     TInt aHdrField, 
                     const TDesC8& aHdrValue);


public:     

    void ClearHeaders();
    
    void AddHeaderL( const CCatalogsKeyValuePair* aPair );

    void IssueHttpRequestL( const TDesC8& aMethod,
                            const TDesC8& aURI,
                            const TDesC8& aContentType,
                            const TDesC8& aBody );

    void CancelTransaction();
    
    void ReleaseBody();    
    

    void SetConnectionMethodL( const TCatalogsConnectionMethod& aMethod );
    
    /** 
     * Real accesspoint id if connected     
     */
    TUint32 AccessPointID() const;
    
    void SetObserver( MCatalogsHttpStackObserver* aObserver );

    
    /**
     * @param aManager Connection manager. Ownership is NOT transferred
     */
    void SetConnectionManager( CCatalogsHttpConnectionManager* aManager );

private:

    void MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent );
    TInt MHFRunError( TInt aError, 
                      RHTTPTransaction aTransaction, 
                      const THTTPEvent& aEvent );

private:
    
    void ReleaseData();
    TBool GetNextDataPart( TPtrC8& aDataPart );
    TInt Reset();
    TInt OverallDataSize();    

    void SetTimeoutTimer();
    void CancelTimeoutTimer();

private:
    
    TBool GetCredentialsL( const TUriC8& aURI, 
                           RString aRealm, 
                           RStringF aAuthenticationType, 
                           RString& aUsername, 
                           RString& aPassword );

private:

    void RunL();
    void DoCancel();

private:

    enum
        {
        ENone,
        ETimeout
        } iState;

    RTimer                  iTimer;        
    
    RHTTPSession            iSession;
    RHTTPTransaction        iTransaction;
    
    RPointerArray<CCatalogsKeyValuePair> iUserHeaders;

    TBool                   iConnected;
    TCatalogsConnectionMethod iConnectionMethod;    

    
    TInt                    iLastError;

    RStringPool             iPool;
    TStringTable const&     iTable;

    MHTTPDataSupplier*      iBody;

    MCatalogsHttpStackObserver*  iObserver;  // Used for passing body data and
                                        // events to the client.
    HBufC8*                 iPostData;  // Data for HTTP requests
    TBool                   iRunning;   // ETrue, if transaction running

    CCatalogsConnection&    iConnection; 
    CCatalogsHttpConnectionCreator& iConnectionCreator;
    TBool                   iConnectionOpened; // ETrue if iConnection is open
    CCatalogsHttpConnectionManager* iConnectionManager; // not owned
    
    };

#endif // C_CATALOGSHTTPSTACK_H
