wmdrm/camese/wmdrmdladefaulthttpplugin/inc/wmdrmdladefaulthttpmanager.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 07 Jan 2010 12:54:19 +0200
changeset 1 c562c0bc23e5
parent 0 95b198f216e5
permissions -rw-r--r--
Revision: 200951 Kit: 201001

/*
* Copyright (c) 2008-2009 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:  Defines the CWmDrmDlaDefaultHttpManager class
*
*/


#ifndef WMDRMDLADEFAULTHTTPMANAGER_H
#define WMDRMDLADEFAULTHTTPMANAGER_H

// INCLUDES
#include <e32std.h>
#include <e32base.h>
#include <es_sock.h>
#include <es_enum.h>
#include <in_sock.h>

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

#include <extendedconnpref.h> // TExtendedConnPref, TConnPrefList, TConnectionInfo

#include "wmdrmdladefaulthttpmanagerobserver.h"

/**
* CWmDrmDlaDefaultHttpManager
* The HTTP communication handling class
*/
NONSHARABLE_CLASS( CWmDrmDlaDefaultHttpManager ) :
    public CActive,
    public MHTTPTransactionCallback,
    public MHTTPAuthenticationCallback
    {
    public:
        /**
         * THeader - encapsulates an HTTP header id and its value.
         */
        struct THeader
            {
        public:
            inline THeader( TInt aField, const TDesC8& aDesC ) :
                iField(aField), iVal(aDesC) {};
        public:
            TInt iField;            // e.g. 'HTTP::EAccept'
            const TDesC8& iVal;     // value: e.g. '*/*'
            };

    public:
        /**
         * Constructor.
         * @param aObserver - reference to observer
         * @return address of an instance of this class
         */
        static CWmDrmDlaDefaultHttpManager* NewL(
                    MWmDrmDlaDefaltHttpManagerObserver& aObserver );

        /**
         * Constructor.
         * @param aObserver - reference to observer
         * @param aIapNumber - Internet Access Point to be used
         * @return address of an instance of this class
         */
        static CWmDrmDlaDefaultHttpManager* NewL(
                    MWmDrmDlaDefaltHttpManagerObserver& aObserver,
                    TUint32 aIapNumber );

        /**
         * Destructor.
         */
        virtual ~CWmDrmDlaDefaultHttpManager();

        /**
         * Called to start the GET transaction using the configured IAP.
         * @param aUrl - URL to be used for the transaction
         * @param aHeaders - a list of headers and their values to be
         *                   included with the HTTP request
         */
        void Get( const TDesC8& aUrl, const RArray<THeader>& aHeaders );

        /**
         * Called to start the POST transaction using the configured IAP.
         * @param aUrl - URL to be used for the transaction
         * @param aHeaders - a list of headers and their values to be
         *                   included with the HTTP request
         * @param aDataSupplier - interface to be used to get the POST data
         */
        void Post( const TDesC8& aUrl, const RArray<THeader>& aHeaders,
                   MHTTPDataSupplier* aDataSupplier );

        /**
         * To be called to stop an ongoing transaction instead of Cancel.
         * Cancel SHOULD NOT BE CALLED by clients.
         */
        void Stop();

        /**
        * Notifies the CWmDrmDlaDefaultHttpManager that another piece of data
        * is available to be sent as the body of a request.
        * If the MHTTPDataSupplier::NextDataPart returns EFalse indicating
        * there is more data available this method needs to be called for the
        * next piece of data to be requested from the MHTTPDataSupplier.
        * @leave any of the system wide error codes.
        */
        void MoreDataAvailableL();

        /**
         * If set to true, the connection is not closed when a
         * transaction ends but when the object is deleted. Default: false.
         * @param aKeepAlive - value of the KeepAlive property
         */
        void SetKeepAlive( TBool aKeepAlive );

        /**
         * Retrieves the value of the KeepAlive property
         */
        TBool KeepAlive() const;

        /**
         * Retrieves the current connection info.
         * This method leaves with KErrNotReady if a connection
         * is not open.
         */
        void GetConnectionInfoL( TConnectionInfo& aConnectionInfo );

        /**
         * Set the IAP connection for the next Get or Post
         * @param aIapId The IAP connection that will be used
         */
        void SetIapId( TInt aIapId );

        /**
         * Get the IAP Connection ID
         */
        TInt IapId();

    private: // From MHTTPTransactionCallback

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

    private: // From MHTTPAuthenticationCallback

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

    private:    // From CActive

        void DoCancel();
        void RunL();
        TInt RunError(TInt aError);

    private:

        /**
         * Contructor
         * @param aObserver An observer to monitor the HTTP communications
         * @param aIap An IAP connection to use for HTTP communication
         */
        CWmDrmDlaDefaultHttpManager(
                MWmDrmDlaDefaltHttpManagerObserver& aObserver,
                TUint32 aIapNumber );

        /**
         * Symbian OS 2nd phase constructor.
         */
        void ConstructL();

    private:

        // State transition handlers
        /**
         * Handler for the EStart state.
         */
        void InitializeL();
        /**
         * Handler for the EInitialize state.
         */
        void OpenL();
        /**
         * Handler for the EOpenFailed state.
         */
        void ReconnectL();
        /**
         * Handler for the states EOpen and EReconnect.
         */
        void SubmitL();

        // Utility methods
        void DoStartL( const TDesC8& aUrl, const RArray<THeader>& aHeaders );
        /**
         * Close HTTP connection and clean up instance variables.
         */
        void HandleDownloadComplete( TInt aError );
        /**
         * Close HTTP transaction and clean up instance variables.
         */
        void CleanupTransaction();
        /**
         * Close connection and clean up instance variables.
         */
        void CleanupConnection();
        /**
         * Complete itself to keep state machine running
         */
        void CompleteSelf();
        /**
         * Set the HTTP header to send
         */
        void SetHeaderL( RHTTPHeaders& aHeaders, TInt aHdrField,
                         const TDesC8& aHdrValue ) const;
        /**
         * Delete the username and password used in authentication
         */
        void DeleteUsernamePassword();

    private:    // Private types

        // Asynchronous connection states
        enum TState
            {
            EConstructed,
            EStart,
            EInitialize,
            EOpen,
            EOpenFailed,
            EReconnect,
            ESubmit
            };

        // HTTP operation: GET or POST
        enum TOperation
            {
            EGet,
            EPost
            };

    private: // Data

        MWmDrmDlaDefaltHttpManagerObserver& iObserver;

        TState iState; // State of the asynch connection
        TInt iError;
        TBool iCredentialsOk;

        RSocketServ  iSocketServer;
        RConnection  iConnection;

        TConnPrefList iPrefList;
        TExtendedConnPref iExtPrefs;

        TUint32 iIapNumber;

        RHTTPSession iHttpSession;
        RHTTPTransaction iHttpTransaction;
        MHTTPDataSupplier* iBody;

        TBool iTransactionOpen;
        TBool iInCallback;

        HBufC8* iSrcAddress;
        RArray<TInt> iHdrFields;
        RArray<HBufC8*> iHdrValues;

        HBufC8* iUsername;
        HBufC8* iPassword;

        TOperation iOperation;
        MHTTPDataSupplier* iDataSupplier;   // not owned

        TBool iKeepAlive;
    };

#endif // WMDRMDLADEFAULTHTTPMANAGER_H

// End of File