/*
* Copyright (c) 2002-2005 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:    Header description       
*
*/











#ifndef SEN_HTTP_CHANNEL_IMPL_H
#define SEN_HTTP_CHANNEL_IMPL_H

// INCLUDES
#include <badesca.h>
#include <http/mhttpauthenticationcallback.h>
#include <flogger.h>
#include <es_sock.h>
#include <commdbconnpref.h>

#include "senhttpchannel.h"
#include "MSenElement.h"
#include "SenIdentityProvider.h"
#include "senpointermap.h"
#include "senmtomtxnstate.h"

_LIT(KColon,                            ":");

// Multipart message
_LIT8(KMimeAccept, "*/*");

// Panics
_LIT(KUnrecognisedValueTypeOfContentTypePanicText, "ContentType has unrecognised value");

// FORWARD DECLARATIONS
class CSenHttpEventHandler;
class CSenTxnState;
class CSenAtomEntry;
//class CSenMtomTxnState;
class MSenIdentityManager;
//class CSenElement;
class CSenLayeredHttpTransportProperties;

// CLASS DECLARATION
class CSenHttpChannelImpl : public CSenHttpChannel,
                            public MHTTPAuthenticationCallback
    {
public:
    static CSenHttpChannelImpl* NewL(MSenIdentityManager& aManager);
    static CSenHttpChannelImpl* NewLC(MSenIdentityManager& aManager);
    static CSenHttpChannelImpl* NewL(MSenIdentityManager& aManager, TUint32 aIapId);
    static CSenHttpChannelImpl* NewLC(MSenIdentityManager& aManager, TUint32 aIapId);

    virtual ~CSenHttpChannelImpl();

    void HandleResponseHeadersL(RHTTPTransaction aTransaction);
    void HandleResponseBodyDataL(RHTTPTransaction aTransaction);
    void HandleResponseL(RHTTPTransaction aTransaction);
    void HandleRunErrorL(RHTTPTransaction aTransaction, TInt aError);
    void HandleRedirectRequiresConfirmationL(RHTTPTransaction aTransaction);

    // Functions from base classes
    virtual TInt SendL(MSenResponseObserver& aObserver,
                       const TDesC8& aUri,
                       const TDesC8& aContent,
                       CSenLayeredHttpTransportProperties& aProps);
                       
    virtual TInt SendL(MSenResponseObserver& aObserver,
                 	   const TDesC8& aUri,
                       CSenSoapEnvelope2& aContent, 
                       CSenLayeredHttpTransportProperties& aProps);
    virtual TInt SendL(MSenResponseObserver& aObserver,
                           	    const TDesC8& aUri,
                               	CSenAtomEntry& aContent, 
                               	CSenLayeredHttpTransportProperties& aProps);
                               	
	virtual TInt SendL(MSenResponseObserver& aObserver,
						const TDesC8& aUri,
						const RFile& aFile,
						CSenLayeredHttpTransportProperties& aProps);
					                                                      	
     
    virtual void SetProxyL(const TDesC8& aProxyHostBaseAddr,
                           TInt aProxyPort);
    virtual void SetProxyL(const TDesC8& aProxyAddrStr);
    virtual void SetHttpVersionL(TInt aVersion);
    virtual void SetProxyUsageL(TBool aProxyUsage);
    virtual void SetSecureDialogL(TBool aSecureDialog);

    TInt CancelTransaction(const TInt aTxnId);
    void CancelAllTransactions();

    void SetExplicitIapDefined(TBool aExplicitIapDefined);
    /*
    * Getter for currently effective IAP ID
    * @param aIapId will be assigned to hold
    * the value of that Internet Access Point
    * identifier (an unsigned integer utilized
    * by CommsDB API).
    * @return EFalse, if IAP ID has not been
    * specified. Otherwise, returns ETrue.
    */
    virtual TBool EffectiveIapId(TUint32 &aIapId);

    // Helper, for file logging. 
    //RFileLogger* Log() const;
    void NotifyMoreBodyL();

    // Functions from MHTTPAuthenticationCallback
    virtual TBool GetCredentialsL(const TUriC8& aURI, RString aRealm,
                                  RStringF aAuthenticationType,
                                  RString& aUsername,
                                  RString& aPassword);
    void EnableTimeOutL(TInt aTxnId, TInt aTimeOutSec);
    void DisableTimeOutL(TInt aTxnId);
    virtual TInt32 UsedIap();
    
protected:
    CSenHttpChannelImpl(MSenIdentityManager& aManager);

    void AddRequestHeadersL(RHTTPHeaders& aHeaders, CSenLayeredHttpTransportProperties& aProps);
    void AppendNewTxnStateL(CSenTxnState* aTxnState);
    void DeleteTxnState(TInt aTxnId);
    CSenTxnState* FindTxnState(TInt aTxnId, TInt* aIndex = NULL);
    /**
    * Applies new IAP preferencies to current HTTP Session (RHTTPSession)
    * @param aIapId new IAP ID
    * @param aDialogPref shows is IAPDialog allowed or not 
    * @param aConnection is the connection to be attached to HTTP session
    * @param aSocketServer is the socket server to be attached to HTTP session
    * Leaves with system-wide error code if preferences cannot be set.
    */
    TInt SetIapPrefsL( TUint32 aIapId, TBool aDialogPref, RConnection& aConnection, RSocketServ& aSocketServer );
    TInt SetSnapPrefsL( TUint32 aSnapId, TBool aDialogPref, RConnection& aConnection, RSocketServ& aSocketServer );
    
    //void SetupConnectionWithIapPrefsL( TUint32 aIapId, RConnection& aConnection, RSocketServ& aSocketServer );
    //void AttachSocketServerAndConnectionWithHttpSession( TUint32 aIapId, RConnection& aConnection, RSocketServ& aSocketServer );

    void ConstructL();
    void ConstructL( TUint32 aIapId );


private:
    
    // New functions
    
    
    TPtrC8 SoapActionL(MSenElement& aSoapEnvelope);
    TInt SubmitRequestL(MSenResponseObserver& aObserver,
                        const TDesC8& aUri,
                        const TDesC8* aContentType = NULL,
                        const TDesC8* aContent = NULL);

    TInt SubmitRequestL(MSenResponseObserver& aObserver,
                        const TDesC8& aUri,
                        MSenElement& aMessage,
                        const TDesC8* aContentType = NULL);

    TInt InvokeHttpMethodL(CSenTxnState* aTxnState,
                           CSenLayeredHttpTransportProperties& aProps);
	
    void ListFilters();
    void DumpRespHeadersL(RHTTPTransaction& aTrans);
    void DumpBodyData(const TDesC8& aData);
    TInt ContentTypeParamValueL(const RHTTPHeaders& aResponseHeaders,
                                const RStringF& aContent, 
                                const TPtrC8& aParamName,
                                SenMultiPartUtils::TMultiPartContentType& aMultiPartContentType);

protected:
    RSocketServ iSockServ;
    RConnection iConnection;
    TUint32 iIapId;
    TUint32 iUsedIapId;
    TUint32 iSnapId;
    RStringPool iStringPool;
    RHTTPSession iSess;
    CSenHttpEventHandler* iTransObs;
    //RFileLogger iLog;
    
private:

    CArrayPtrFlat<CSenTxnState>* iTxnStates;
    MSenIdentityManager& iManager;
    TInt iBasicConnectionTries;
    CSenIdentityProvider*   iSessionAuthentication; // NOT owned
    TBool   iPasswordFromUser;  // Is ETrue if data from identitymanager is
    TPtrC8 iContentType; // content type of usual response
    TBool iExplicitIapDefined;
    HBufC8* iProxyHostPort;
    TBool iXopResponse;
    TBool iDeflateFilter;//Is true if deflate filter loaded for a session
    TBool iHasHttpContentType;
    SenMultiPartUtils::TMultiPartContentType iMultiPartContentType; // content type of MultiPart response
    RHTTPTransaction iHttpTransaction ;
    };

#endif //SEN_HTTP_CHANNEL_IMPL_H

// End of file
