browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrClntSession.cpp
changeset 0 dd21522fd290
child 10 a359256acfc6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrClntSession.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,1528 @@
+/*
+* 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: 
+*     This file contains the declaration of the Client interface of Download Mgr Server.
+*
+*/
+
+
+// INCLUDE FILES
+#include "DownloadMgrLogger.h"
+#include "DownloadMgrClient.h"
+#include "DownloadMgrServer.h"
+#include "DownloadMgrStart.h"
+#include "DownloadMgrDef.h"
+#include "DownloadMgrDefAttrib.h"
+#include "DownloadMgrHandler.h"
+#include <e32svr.h>
+#include <EscapeUtils.h>
+#include <centralrepository.h>
+#include "DownloadMgrCRKeys.h"
+#include <BrowserUiSDKCRKeys.h>
+#include <CodDownload.h>
+
+// CONSTANTS
+const TInt KHttpDownloadMgrObserverArrayGranularity = 4;
+const TInt KHttpDownloadMgrDefalutAttribsGranularity = 4;
+const TInt KDefaultMsgSlots = 16;
+
+_LIT8( KHttpScheme, "http" );
+_LIT8( KHttpsScheme, "https" );
+
+// GLOBAL FUNCTIONS
+#if defined(_DEBUG)
+void DMPanic( TInt aPanicCode )
+    {
+    User::Panic( _L("DownloadManager"), aPanicCode );
+    }
+#endif
+ 
+// ================= MEMBER FUNCTIONS =======================
+
+/**
+* Extension class.
+*/
+NONSHARABLE_CLASS( CRHttpDownloadMgrExtension ) : public CBase
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * Two-phased constructor.
+        */
+        static CRHttpDownloadMgrExtension* NewL();
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CRHttpDownloadMgrExtension();
+        
+        /*
+        * Next uri observer setter function
+        */
+        void SetNextUriObserver( MHttpDownloadMgrNextUriObserver* aObserver );
+
+        /*
+        * Next uri observer getter function
+        */
+        MHttpDownloadMgrNextUriObserver* NextUriObserver() const;
+
+
+    protected: // Constructors
+
+        /**
+        * C++ default constructor.
+        */
+        CRHttpDownloadMgrExtension();
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+    public:      
+        
+        static TInt GetRepositoryValue( TUint32 aSettingId, TInt& aSettingValue );
+
+        static TInt SetRepositoryValue( TUint32 aSettingId, TInt aSettingValue );
+
+    public: // Data
+        TInt iEventBroadcastLevel;
+        
+        MHttpDownloadMgrNextUriObserver* iNextUriObserver; ///< Not Owned.
+  
+        TInt iSessionId;
+        
+        TInt iAdjustEventPriorityFlag;
+    };
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadMgrExtension::CRHttpDownloadMgrExtension
+// -----------------------------------------------------------------------------
+//
+CRHttpDownloadMgrExtension::CRHttpDownloadMgrExtension()
+:iEventBroadcastLevel( 0 )
+,iAdjustEventPriorityFlag( 0 )
+    {
+    iNextUriObserver = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadMgrExtension::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CRHttpDownloadMgrExtension::ConstructL()
+    {
+    CLOG_ENTERFN("CRHttpDownloadMgrExtension::ConstructL");
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadMgrExtension::NewL
+// -----------------------------------------------------------------------------
+//
+CRHttpDownloadMgrExtension* CRHttpDownloadMgrExtension::NewL()
+    {
+    CRHttpDownloadMgrExtension* self = new(ELeave)CRHttpDownloadMgrExtension();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CRHttpDownloadMgrExtension::~CRHttpDownloadMgrExtension()
+    {
+    CLOG_ENTERFN("CRHttpDownloadMgrExtension::~CRHttpDownloadMgrExtension");
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadMgrExtension::SetNextUriObserver
+// -----------------------------------------------------------------------------
+//
+void CRHttpDownloadMgrExtension::SetNextUriObserver( MHttpDownloadMgrNextUriObserver* aObserver )
+    {
+    iNextUriObserver = aObserver;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadMgrExtension::NextUriObserver
+// -----------------------------------------------------------------------------
+//
+MHttpDownloadMgrNextUriObserver* CRHttpDownloadMgrExtension::NextUriObserver() const
+    {
+    return iNextUriObserver;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadMgrExtension::GetRepositoryValue
+// -----------------------------------------------------------------------------
+//
+TInt CRHttpDownloadMgrExtension::GetRepositoryValue( TUint32 aSettingId, TInt& aSettingValue )
+    {
+    aSettingValue = KErrNotFound;
+    CRepository* rep = NULL;
+
+    TRAPD( err, rep = CRepository::NewL( KCRUidBrowserUiLV ) );
+    if( (err == KErrNone) && rep )
+        {
+        err = rep->Get( aSettingId, aSettingValue );
+        }
+    delete rep;
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadMgrExtension::SetRepositoryValue
+// -----------------------------------------------------------------------------
+//
+TInt CRHttpDownloadMgrExtension::SetRepositoryValue( TUint32 aSettingId, TInt aSettingValue )
+    {
+    CRepository* rep = NULL;
+   
+    TRAPD( err, rep = CRepository::NewL( KCRUidBrowserUiLV ) );
+    if( (err == KErrNone) && rep )
+        {
+        err = rep->Set( aSettingId, aSettingValue );
+        }
+    delete rep;
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::RHttpDownloadMgr
+// ---------------------------------------------------------
+//
+EXPORT_C RHttpDownloadMgr::RHttpDownloadMgr()
+	{
+    // Reset data members as R-objects are not zero'd.
+    iAppUid = TUid::Null();
+    iDownloadArray = NULL;
+    iObservers = NULL;
+    iDefaultAttribs = NULL;
+    iManagerHandler = NULL;
+    iExtension = NULL;
+	}
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::ConnectL
+// ---------------------------------------------------------
+//
+EXPORT_C void RHttpDownloadMgr::ConnectL( TUid aAppUid,
+                                          MHttpDownloadMgrObserver& aObserver,
+                                          TBool aMaster )
+    {
+	CLOG_CREATE;
+	
+    __ASSERT_DEBUG( !Handle(), DMPanic( KErrAlreadyExists ) );
+    
+    TRAPD( err, DoConnectL( aAppUid, aObserver, aMaster ) );
+    if( err )
+        {
+        Close();
+        User::Leave( err );
+        }
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DoConnectL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::DoConnectL( TUid aAppUid,
+                                   MHttpDownloadMgrObserver& aObserver,
+                                   TBool aMaster )   
+	{
+    CLOG_ENTERFN( "RHttpDownloadMgr::ConnectL" );
+
+    TInt error = KErrNone;
+    RProcess server;
+    error = server.Create( KDownloadMgrServerExe, TPtr( NULL, 0 ),
+                           TUidType( KNullUid, KNullUid, KUidDownloadMgrSrvExe ) );
+    CLOG_WRITE_FORMAT( "RHttpDownloadMgr::ConnectL after process creation, err %d", error );
+
+    if( !error )
+        {
+        TRequestStatus status;
+        server.Rendezvous( status );
+        if( status != KRequestPending )
+            {
+            CLOG_WRITE( "RHttpDownloadMgr::ConnectL pending status error." );
+            server.Kill( 0 );
+            }
+        else
+            {
+            CLOG_WRITE( "RHttpDownloadMgr::ConnectL pending resume server." );
+            server.Resume( );
+            }
+        User::WaitForRequest( status );
+        error = ( server.ExitType() == EExitPanic ) ? KErrGeneral : status.Int();
+        server.Close();
+        }
+    User::LeaveIfError( error );
+    CLOG_WRITE( "Creating..." );
+    User::LeaveIfError(  CreateSession( KDownloadMgrServerName, Version(), KDefaultMsgSlots ) );
+    CLOG_WRITE( "Created" );
+
+    CLOG_WRITE( "Starting initialization" );
+    InitializeL( aAppUid, aObserver, aMaster );
+    CLOG_WRITE( "Init OK" );
+	}
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::InitializeL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::InitializeL( TUid aAppUid,
+                                    MHttpDownloadMgrObserver& aObserver,
+                                    TBool aMaster )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::InitializeL" )
+
+    iAppUid = aAppUid;
+    AddObserverL( aObserver );
+    iExtension = CRHttpDownloadMgrExtension::NewL();
+    CLOG_ATTACH( iExtension, this );
+    iDownloadArray = new (ELeave) CArrayPtrFlat< RHttpDownload >( 1 );
+    if( aMaster )
+        {
+        iManagerHandler = new (ELeave) CDownloadMgrHandler ( this );
+        CLOG_ATTACH( iManagerHandler, this );
+        iManagerHandler->StartL();
+        }
+
+    TPckg<TUid> uidPckg( iAppUid );
+    TInt count( 0 );
+    TPckg<TInt> pckgCount( count );
+    TPckg<TInt> sessionId( iExtension->iSessionId );
+    // 0st param - application UID
+    // 1st param - the amount of downloads at server side belongs to the same UID
+    // 2st param - master flag
+    // 3rd param - session id
+
+    User::LeaveIfError( SendReceive( EHttpDownloadMgrInitialize, 
+                                     TIpcArgs( &uidPckg, &pckgCount, aMaster, 
+                                     &sessionId ) ) );
+
+    CLOG_NAME_2( _L("Session_%x_%x"), aAppUid.iUid, iExtension->iSessionId );
+
+    CLOG_WRITE_FORMAT( "count: %d", count )
+    // There are downloads at server side which needs to be attached
+    if( count )
+        {
+        // Create a buffer which will contain the handles.
+        TPckgBuf<TInt> arrayPckg;
+        HBufC8* buf = HBufC8::NewLC( count*arrayPckg.Size() );
+        // Get the handles from the server
+        TPtr8 ptr = buf->Des();
+        AttachL( ptr );
+        // Create subsessions one by one.
+        for( TInt i = 0; i < count; i++ )
+            {
+            RHttpDownload* download = new (ELeave) RHttpDownload ( this );
+            CleanupStack::PushL( download );
+            // Parse the handle from the buffer.
+            arrayPckg.Copy( buf->Mid( i*arrayPckg.Size(), arrayPckg.Size() ) );
+            // Attach subsession to the server by the handle.
+            download->AttachL( arrayPckg() );
+            TBool isCodDownload ( EFalse );
+            download->GetBoolAttribute ( EDlAttrCodDownload , isCodDownload );
+            if( isCodDownload )
+            	{
+            	//paused Download
+            	download->InitPausedCodDownloadL( iAppUid );
+            	
+            	// Update CodData in Download Mgr Server
+            	HBufC8* mediaInfo8 = NULL;
+    	    	mediaInfo8 = download->iCodDownload->UpdatedDownloadDataL();
+    	    	if (mediaInfo8)
+    	        	{
+    	        	download->SetDownloadDataAttribute(*mediaInfo8);
+    	        	delete mediaInfo8;
+    	        	
+    	        	// Buffer attributes in CRHttpDownloadExtension class
+    	        	download->BufferAttributesL();
+    	        	}
+                User::LeaveIfError( download->GetProductDownloadedSize( ) );                	        	
+            	}
+            AddToArrayL( download );	
+            CleanupStack::Pop( download ); //download
+            }
+
+        CleanupStack::PopAndDestroy( buf ); // buf
+        }
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::AttachL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::AttachL( TDes8& aBuf )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::AttachL" )
+    // 0st param - buffer will contain handles.
+    // The handles idetifies the download subsessions.
+
+    User::LeaveIfError( SendReceive( EHttpDownloadMgrAttach, 
+                                     TIpcArgs( &aBuf ) ) );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownloadMgr::CloseDownload
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::CloseDownload( RHttpDownload* aElement )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::CloseDownload" );
+
+    // As this class owns the array of subsessions, this role is 
+    // to close them.
+    RemoveFromArray( aElement );
+    aElement->Close();
+    delete aElement;
+    aElement = NULL;
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownloadMgr::Version
+// ---------------------------------------------------------
+//
+EXPORT_C TVersion RHttpDownloadMgr::Version( void ) const
+	{
+	return TVersion( KDownloadMgrMajorVersionNumber,
+                     KDownloadMgrMinorVersionNumber,
+                     KDownloadMgrBuildVersionNumber );
+	}
+
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::Close
+// ---------------------------------------------------------
+//
+EXPORT_C void RHttpDownloadMgr::Close()
+	{
+    
+ 	if( !Handle() )
+ 	    {
+ 	    return;
+ 	    }
+
+    CLOG_WRITE( "RHttpDownloadMgr::Close" )
+    if( iDownloadArray )
+        {
+        TInt count = iDownloadArray->Count();
+        while( count-- )
+            {
+            CLOG_WRITE_FORMAT( "Close download count[%d]", count );
+		    RHttpDownload* download = (*iDownloadArray)[count];
+		    CloseDownload( download );
+            }
+        iDownloadArray->Reset();
+        delete iDownloadArray;
+        iDownloadArray = NULL;
+        }
+
+    if( iExtension )
+        {
+        delete iExtension;
+        iExtension = NULL;
+        }
+
+    if( iObservers )
+        {
+        iObservers->Reset();
+        delete iObservers;
+        iObservers = NULL;
+        }
+
+    if( iDefaultAttribs )
+        {
+        iDefaultAttribs->ResetAndDestroy();
+        delete iDefaultAttribs;
+        iDefaultAttribs = NULL;
+        }
+
+    if( iManagerHandler )
+        {
+        iManagerHandler->Cancel();
+        delete iManagerHandler;
+        iManagerHandler = NULL;
+        }
+
+	RHandleBase::Close();
+	
+	CLOG_CLOSE;
+	}
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::AddObserverL
+// ---------------------------------------------------------
+//
+EXPORT_C void RHttpDownloadMgr::AddObserverL( MHttpDownloadMgrObserver& aObserver )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::AddObserverL" )
+
+	if ( iObservers == NULL )
+        {
+		iObservers = new (ELeave) CDownloadMgrObserver( 
+            KHttpDownloadMgrObserverArrayGranularity );
+        }
+
+    TInt index( 0 );
+    if ( FindObserver( aObserver, index ) == KErrNone )
+        {
+        // Observer already added.
+        }
+    else
+        {
+	    iObservers->AppendL( &aObserver );
+        }
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::RemoveObserver
+// ---------------------------------------------------------
+//
+EXPORT_C void RHttpDownloadMgr::RemoveObserver( MHttpDownloadMgrObserver& aObserver )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::RemoveObserver" )
+
+    if ( iObservers )
+        {
+        TInt index( 0 );
+        if ( FindObserver( aObserver, index ) != KErrNone )
+            {
+            // Observer not found. Do nothing.
+            }
+        else
+            {
+            // Observer found.
+            iObservers->Delete( index );
+            // Free up memory.
+            if ( iObservers->Count() == 0 )
+                {
+                delete iObservers;
+                iObservers = NULL;
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::FindObserver
+// ---------------------------------------------------------
+//
+TInt RHttpDownloadMgr::FindObserver( MHttpDownloadMgrObserver& aObserver, TInt& aIndex ) const
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::FindObserver" )
+
+    TInt ret( KErrNotFound );
+
+    if ( iObservers == NULL )
+        {
+        ret = KErrNotFound;
+        }
+    else
+        {
+        MHttpDownloadMgrObserver* obs = &aObserver;
+        TKeyArrayFix key( 0, ECmpTUint32 ); // Compare pointers
+        ret = iObservers->Find( obs, key, aIndex );
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::CurrentDownloads
+// ---------------------------------------------------------
+//
+EXPORT_C const CDownloadArray& RHttpDownloadMgr::CurrentDownloads() const
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_WRITE_FORMAT( "RHttpDownloadMgr::CurrentDownloads %d", iDownloadArray->Count() )
+    return *iDownloadArray;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::CreateDownloadL
+// ---------------------------------------------------------
+//
+EXPORT_C RHttpDownload& RHttpDownloadMgr::CreateDownloadL( const TDesC8& aUrl, 
+                                                           TBool& aResult )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::CreateDownloadL" )
+    RHttpDownload* download = DoFindDownloadL( aUrl, KNullDesC8 );
+    
+    if( !download )
+        {
+        // there is no ongoing download with this URL
+        // create one and add to the array
+        aResult = ETrue;
+        return CreateDownloadL( aUrl );
+        }
+    else
+        {
+        // we already have a download, just return a reference to it.
+        aResult = EFalse;
+        return *download;
+        }
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::CreateDownloadL
+// ---------------------------------------------------------
+//
+EXPORT_C RHttpDownload& RHttpDownloadMgr::CreateDownloadL( const TDesC8& aUrl )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::CreateDownloadL" )
+    
+    RHttpDownload* download = new (ELeave) RHttpDownload ( this );
+    CleanupStack::PushL( download );
+    CleanupClosePushL( *download );
+    HBufC8* buf = PackedDefaultAttributesLC();
+    download->CreateL( aUrl, buf->Des() );
+    RHttpDownload& item = AddToArrayL( download );
+    CleanupStack::PopAndDestroy( buf ); // buf
+    CleanupStack::Pop( 2 );  // download->Close, download
+   
+    return item;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::CreateCodDownloadL
+// ---------------------------------------------------------
+//
+EXPORT_C RHttpDownload& RHttpDownloadMgr::CreateCodDownloadL( const TDesC8& aUrl,
+                                                              const TDesC8& aBuf,
+                                                              const TDesC8& aMimeType,
+                                                              CEikonEnv* aEikEnv,
+                                                              TBool& aResult )
+	{
+	__ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+	
+	CLOG_ENTERFN( "RHttpDownloadMgr::CreateCodDownloadL" )
+	
+	RHttpDownload& download = CreateDownloadL( aUrl, aResult );
+	download.InitCodDownloadL( aBuf, aMimeType, aEikEnv );
+	download.SetBoolAttribute( EDlAttrCodDownload, ETrue );
+	
+	return download;
+	}
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::CreateClientSideDownloadL
+// ---------------------------------------------------------
+//
+EXPORT_C RHttpDownload& RHttpDownloadMgr::CreateClientSideDownloadL( 
+    TInt aHttpTransaction,TBool& aResult )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    RHTTPTransaction* httpTransaction = 
+        REINTERPRET_CAST( RHTTPTransaction* , aHttpTransaction );
+    RHttpDownload& download = 
+    		CreateDownloadL( httpTransaction->Request().URI().UriDes() );
+    		
+    download.SetBoolAttribute( EDlAttrContinue, ETrue );
+    download.SetHttpTransactionL( aHttpTransaction );
+
+    // Set the disconnect notification
+    httpTransaction->PropertySet().SetPropertyL
+        (
+        httpTransaction->Session().StringPool().StringF( HTTP::ENotifyOnDisconnect, RHTTPSession::GetTable() ), 
+        httpTransaction->Session().StringPool().StringF( HTTP::EEnableDisconnectNotification, RHTTPSession::GetTable() )
+        ); 
+
+    aResult = ETrue; // download is created
+        
+    return download;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::FindDownload
+// ---------------------------------------------------------
+//
+EXPORT_C RHttpDownload* RHttpDownloadMgr::FindDownload( const TDesC8& aUrl, 
+                                                        const TDesC8& aMsgBody )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::FindDownload" )
+    RHttpDownload* retVal = NULL;
+    
+    TRAP_IGNORE( retVal = DoFindDownloadL( aUrl, aMsgBody) );
+
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DownloadFromHandleL
+// ---------------------------------------------------------
+//
+RHttpDownload& RHttpDownloadMgr::DownloadFromHandleL( TUint aHandle )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::DownloadFromHandleL" )
+    // Check the download's handle in the array
+    for( TInt i = 0; i < iDownloadArray->Count(); i++ )
+        {
+        if( (*iDownloadArray)[i]->IsDownload( aHandle ) )
+            {
+            return *(*iDownloadArray)[i];
+            }
+        }
+    User::Leave( KErrNotFound );
+
+    // Just let the compiler be satisfied
+    return *(*iDownloadArray)[iDownloadArray->Count()];
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::AddToArrayL
+// ---------------------------------------------------------
+//
+RHttpDownload& RHttpDownloadMgr::AddToArrayL( RHttpDownload* aElement )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::AddToArrayL" );
+
+    TInt index( 0 );
+    TInt err = FindInArray( aElement, index );
+    if ( !err )
+        {
+        // Already added. Do nothing, just return a reference to the 
+        // element in the array.
+        }
+    else
+        {
+        TInt count = iDownloadArray->Count();
+        // 'count' will be the index of the new appended element:
+        index = count;
+        iDownloadArray->AppendL( aElement );
+        }
+
+    return  *(*iDownloadArray)[index];
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::RemoveFromArray
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::RemoveFromArray( RHttpDownload* aElement )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::RemoveFromArray" )
+
+    TInt index( 0 );
+    TInt err = FindInArray( aElement, index );
+    if ( !err )
+        {
+        // Found. Remove from array:
+        iDownloadArray->Delete( index );
+        iDownloadArray->Compress();
+        }
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::FindInArray
+// ---------------------------------------------------------
+//
+TInt RHttpDownloadMgr::FindInArray( RHttpDownload* aElement, TInt& aIndex ) const
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::FindInArray" );
+    
+    //__ASSERT_DEBUG( iDownloadArray, Panic...)
+    TKeyArrayFix key( 0, ECmpTUint32 ); // Compare pointers
+    TInt ret = iDownloadArray->Find( aElement, key, aIndex );
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::PauseAll
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::PauseAll()
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::PauseAll" )
+
+    for( TInt i = 0; i < iDownloadArray->Count(); i++ )
+        {
+        (*iDownloadArray)[i]->Pause();
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::StartAll
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::StartAll()
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::StartAllL" )
+
+    for( TInt i = 0; i < iDownloadArray->Count(); i++ )
+        {
+        (*iDownloadArray)[i]->Start();
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::ResetAll
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::ResetAll()
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::ResetAll" )
+
+    for( TInt i = 0; i < iDownloadArray->Count(); i++ )
+        {
+        (*iDownloadArray)[i]->Reset();
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DeleteAll
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::DeleteAll()
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::DeleteAll" )
+
+    TInt err( KErrNone );
+
+    TInt i = iDownloadArray->Count();
+    while( i )
+        {
+        TInt temp = (*iDownloadArray)[0]->Delete();
+        if( temp )
+            {
+            err = temp;
+            }
+        --i;
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::Disconnect
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::Disconnect()
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::Disconnect" )
+
+    // First pause all downloads.
+    // It'd be difficult to pause client side downloads from
+    // server side.
+    for( TInt i = 0; i < iDownloadArray->Count(); i++ )
+        {
+        (*iDownloadArray)[i]->Pause();
+        }
+
+    return SendReceive( EHttpDownloadMgrDisconnect, TIpcArgs() );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::GetIntAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::GetIntAttribute( const TUint aAttribute, 
+                                                 TInt32& aValue )
+    {
+    switch ( aAttribute )
+        {
+        case EDlMgrHasActiveDownloads:
+            {
+            return CRHttpDownloadMgrExtension::GetRepositoryValue( KDownloadMgrHasActiveDownloads, (TInt&)aValue );
+            }
+        case EDlMgrAutoAcceptCod:
+            {
+            return CRHttpDownloadMgrExtension::GetRepositoryValue( KDownloadMgrAutoAcceptCod, (TInt&)aValue );
+            }
+        case EDlMgrNumOfClientSideDownload:
+            {
+            __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+            return NumberOfClientSideDownload( aValue );
+            }
+        default:
+            {
+            __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+            TPckg<TInt32> pckg( aValue );
+            return SendReceive( EHttpDownloadMgrGetIntAttribute, 
+                        TIpcArgs( aAttribute, &pckg ) );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::NumberOfClientSideDownload
+// ---------------------------------------------------------
+//
+TInt RHttpDownloadMgr::NumberOfClientSideDownload( TInt32& aValue )
+    {
+    TInt err( KErrNone );
+
+    aValue = 0;
+    for( TInt i = 0; i < iDownloadArray->Count(); i++ )
+        {
+        if( (*iDownloadArray)[i]->IsClientSideDownload() )
+            {
+            aValue++;
+            }
+        }
+    
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::GetBoolAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::GetBoolAttribute( const TUint aAttribute, 
+                                                  TBool& aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::GetIntAttribute" )
+
+    TPckg<TBool> pckg( aValue );
+
+    return SendReceive( EHttpDownloadMgrGetBoolAttribute, 
+                        TIpcArgs( aAttribute, &pckg ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::GetStringAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::GetStringAttribute( const TUint aAttribute, 
+                                                    TDes16& aValue  )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::GetIntAttribute" )
+
+    return SendReceive( EHttpDownloadMgrGetStringAttribute, 
+                        TIpcArgs( aAttribute, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::GetStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::GetStringAttribute( const TUint aAttribute, 
+                                                    TDes8& aValue  )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::GetIntAttribute" )
+
+    return SendReceive( EHttpDownloadMgrGetString8Attribute, 
+                        TIpcArgs( aAttribute, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetIntAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetIntAttribute( const TUint aAttribute, 
+                                                 TInt32 aValue )
+    {
+    if( aAttribute == EDlMgrHasActiveDownloads )
+        {
+        return CRHttpDownloadMgrExtension::SetRepositoryValue(
+                KDownloadMgrHasActiveDownloads, (TInt&)aValue );
+        }
+    else
+        {
+        __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+        return SendReceive( EHttpDownloadMgrSetIntAttribute, 
+                            TIpcArgs( aAttribute, aValue ) );
+        }
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetBoolAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetBoolAttribute( const TUint aAttribute, 
+                                                  TBool aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetBoolAttributeL" )
+
+    return SendReceive( EHttpDownloadMgrSetBoolAttribute, 
+                        TIpcArgs( aAttribute, aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetStringAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetStringAttribute( const TUint aAttribute, 
+                                                    const TDesC16& aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetStringAttributeL" )
+
+    return SendReceive( EHttpDownloadMgrSetStringAttribute, 
+                        TIpcArgs( aAttribute, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetStringAttribute( const TUint aAttribute, 
+                                                    const TDesC8& aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetStringAttributeL" )
+
+    return SendReceive( EHttpDownloadMgrSetString8Attribute, 
+                        TIpcArgs( aAttribute, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetDefaultIntAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetDefaultIntAttribute( const TUint aAttribute, 
+                                                        TInt32 aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultIntAttributeL" )
+
+    TRAPD( err, DoSetDefaultAttributeL( aAttribute, aValue ) );
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetDefaultBoolAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetDefaultBoolAttribute( const TUint aAttribute, 
+                                                         TBool aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultBoolAttribute" )
+
+    TRAPD( err, DoSetDefaultAttributeL( aAttribute, aValue ) );
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetDefaultStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetDefaultStringAttribute( const TUint aAttribute, 
+                                                           const TDesC16& aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultBoolAttribute" )
+
+    TRAPD( err, DoSetDefaultAttributeL( aAttribute, aValue ) );
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetDefaultStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownloadMgr::SetDefaultStringAttribute( const TUint aAttribute, 
+                                                           const TDesC8& aValue )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultBoolAttribute" )
+
+    TRAPD( err, DoSetDefaultAttributeL( aAttribute, aValue ) );
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SetNextUriObserver
+// ---------------------------------------------------------
+//
+EXPORT_C void RHttpDownloadMgr::SetNextUriObserver( MHttpDownloadMgrNextUriObserver* aObserver )
+    {
+    __ASSERT_DEBUG( Handle(), DMPanic( KErrDisconnected ) );
+    
+    iExtension->SetNextUriObserver( aObserver );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::NextUriObserver
+// ---------------------------------------------------------
+//
+MHttpDownloadMgrNextUriObserver* RHttpDownloadMgr::NextUriObserver() const
+    {
+    return iExtension->iNextUriObserver;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::SessionId
+// ---------------------------------------------------------
+//
+TInt RHttpDownloadMgr::SessionId() const
+    {
+    return iExtension->iSessionId;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DoSetStringAttributeL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::DoSetDefaultAttributeL( const TUint aAttribute, 
+                                               TBool aValue )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultBoolAttribute" )
+
+    if( iDefaultAttribs == NULL )
+        {
+		iDefaultAttribs = new (ELeave) CArrayPtrFlat< CDefaultAttrib >( 
+            KHttpDownloadMgrDefalutAttribsGranularity );
+        }
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL( (THttpDownloadAttrib)aAttribute,
+                                                   aValue );
+    iDefaultAttribs->AppendL( attrib );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DoSetStringAttributeL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::DoSetDefaultAttributeL( const TUint aAttribute, 
+                                               TInt32 aValue )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultBoolAttribute" )
+
+    if( iDefaultAttribs == NULL )
+        {
+		iDefaultAttribs = new (ELeave) CArrayPtrFlat< CDefaultAttrib >( 
+            KHttpDownloadMgrDefalutAttribsGranularity );
+        }
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL( (THttpDownloadAttrib)aAttribute,
+                                                   aValue );
+    iDefaultAttribs->AppendL( attrib );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DoSetStringAttributeL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::DoSetDefaultAttributeL( const TUint aAttribute, 
+                                               const TDesC8& aValue )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultBoolAttribute" )
+
+    if( iDefaultAttribs == NULL )
+        {
+		iDefaultAttribs = new (ELeave) CArrayPtrFlat< CDefaultAttrib >( 
+            KHttpDownloadMgrDefalutAttribsGranularity );
+        }
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL( (THttpDownloadAttrib)aAttribute,
+                                                   aValue );
+    iDefaultAttribs->AppendL( attrib );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DoSetStringAttributeL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::DoSetDefaultAttributeL( const TUint aAttribute, 
+                                               const TDesC16& aValue )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::SetDefaultBoolAttribute" )
+
+    if( iDefaultAttribs == NULL )
+        {
+		iDefaultAttribs = new (ELeave) CArrayPtrFlat< CDefaultAttrib >( 
+            KHttpDownloadMgrDefalutAttribsGranularity );
+        }
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL( (THttpDownloadAttrib)aAttribute,
+                                                   aValue );
+    iDefaultAttribs->AppendL( attrib );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::HandleDMgrEventL
+// ---------------------------------------------------------
+//
+
+void RHttpDownloadMgr::HandleDMgrEventL( RHttpDownload& aDownload, 
+                                         THttpDownloadEvent aEvent )
+    {
+    CLOG_ENTERFN( "RHttpDownloadMgr::HandleDMgrEventL" )
+    iExtension->iEventBroadcastLevel++;
+    CLOG_WRITE_FORMAT( "aDownload = %x", &aDownload );
+    CLOG_WRITE_FORMAT( "Inc iEventBroadcastLevel = %d", iExtension->iEventBroadcastLevel );
+    // In case of EHttpDlDeleted getting most of the attributes are forbidden,
+    // because the engine is most likely is not ready to serve! Some of the
+    // attributes are buffered in client side.
+    aDownload.SetEventType( aEvent.iDownloadState );
+
+    if( (( EHttpDlInprogress == aEvent.iDownloadState ) && ( EHttpProgCodDescriptorDownloaded == aEvent.iProgressState ))||
+        (( EHttpDlInprogress == aEvent.iDownloadState ) && ( EHttpProgCodDownloadShouldResume == aEvent.iProgressState ))||
+        (( EHttpDlPaused == aEvent.iDownloadState ) && ( EHttpProgCodDescriptorDownloaded == aEvent.iProgressState ))
+      )
+        {
+        TBool isCod( ETrue );
+
+        if(EHttpProgCodDownloadShouldResume == aEvent.iProgressState)
+        	{
+        	//resume only for apps with non-zero uid. otherwise the resume will happen from music player which sets the appuid as zero.
+        	TInt32 clientAppUid(0); 
+            GetIntAttribute(EDlMgrAppUid , clientAppUid);         
+            if( !clientAppUid )
+                {
+                iExtension->iEventBroadcastLevel--;
+                return;
+                }
+        	}
+        	
+        else
+            {
+            TRAPD( err, isCod = aDownload.CheckContentTypeAndCreateCodDownloadL() );
+            if( isCod )
+                {
+                if( err )
+                    {
+                    // The error code is processed by the server
+                    aDownload.SetOnError( err );
+                    iExtension->iEventBroadcastLevel--;
+                    return;                
+                    }
+                }                
+                
+            }
+            TRAPD( err, aDownload.DoStartCodL() );
+            if( err )
+                {
+                aDownload.SetOnError( err );
+                iExtension->iEventBroadcastLevel--;
+                return; 
+                }              
+  
+        }
+    else if( EHttpDlCancelTransaction == aEvent.iDownloadState )
+        {
+        aDownload.DeleteTransaction();
+        }     
+           
+    else if( EHttpProgCodDownloadPause == aEvent.iProgressState )
+        {
+        if(aDownload.iCodDownload)
+            {
+            aDownload.iCodDownload->Pause();
+            }
+        }
+    else if( EHttpDlProgProgressive == aEvent.iProgressState )
+        {
+        if(aDownload.iCodDownload)
+            {
+            aDownload.iCodDownload->SetCodDlAttached(ETrue);
+            }
+        }        
+    else if( EHttpDlProgNonProgressive == aEvent.iProgressState )
+        {
+        if(aDownload.iCodDownload)
+            {
+            aDownload.iCodDownload->SetCodDlAttached(EFalse);
+            }
+        }        
+
+    // TODO: make sure that all COD test cases works OK
+
+    // ...and close the download.
+    if( EHttpDlDeleted == aEvent.iDownloadState )
+        {
+        CloseDownload( &aDownload );
+        }        
+        
+    iExtension->iEventBroadcastLevel--;
+
+    // When a download completes, close the subsession to make a message slot free.
+    // Also the required information will be cached before closing the subsession
+    if( EHttpDlMultipleMOCompleted == aEvent.iDownloadState  && 
+    		( 
+    		EHttpProgContentFileMoved == aEvent.iProgressState ||
+    		EHttpProgContentFileMovedAndDestFNChanged == aEvent.iProgressState 
+    		)
+    	)
+    	{
+    		//Store all the info clinet side in RHttpDownload's extension API
+    		aDownload.SaveDownloadInfoL();
+    		//Close the subsession to free up the message slot
+    		aDownload.CloseSubSession();
+    	}    
+	TInt count = iObservers->Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        CLOG_WRITE_FORMAT( "HandleDMgrEventL( aDownload = 0x%x)", this );
+        TRAP_IGNORE( (*iObservers)[i]->HandleDMgrEventL( aDownload, aEvent ) );
+        if(!iObservers)break;
+        
+        }
+    
+    //CLOG_WRITE_FORMAT( "Dec iEventBroadcastLevel = %d", iExtension->iEventBroadcastLevel );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::BroadcastEvent
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::BroadcastEvent( RHttpDownload& aDownload, 
+                                       THttpDownloadEvent aEvent )
+    {
+    CLOG_WRITE_3( "BroadcastEvent: dl [%x], DownloadState [%d], ProgressState [%d]", this, aEvent.iDownloadState, aEvent.iProgressState );
+    for( TInt i = 0; i < iObservers->Count(); i++ )
+        {        
+        TRAP_IGNORE( (*iObservers)[i]->HandleDMgrEventL( aDownload, aEvent ) );
+        // The download shouldn't be deleted in nested loops!!!
+        if( 1 == iExtension->iEventBroadcastLevel )
+            {
+            if( aDownload.IsToBeDeleted() )
+                {
+                // Decremented before delete because we check the
+                // value in aDownload.Delete();
+                iExtension->iEventBroadcastLevel--;
+                CLOG_WRITE_FORMAT( "Dec iEventBroadcastLevel = %d", iExtension->iEventBroadcastLevel );
+                aDownload.Delete();
+                iExtension->iEventBroadcastLevel++;
+                return;
+                }
+            }
+        }    
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::HandleSessionEventL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::HandleSessionEventL( TInt aHandle, THttpDownloadEvent aEvent )
+    {
+    TRAP_IGNORE( DoHandleSessionEventL( aHandle, aEvent ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DoHandleSessionEventL
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::DoHandleSessionEventL( TInt aHandle, THttpDownloadEvent aEvent )
+    {
+    RHttpDownload* download = new (ELeave) RHttpDownload ( this );
+    CleanupStack::PushL( download );
+    CleanupClosePushL( *download );
+    // Attach subsession to the server by the handle.
+    download->AttachL( aHandle );
+    AddToArrayL( download );
+    CleanupStack::Pop( download ); //download
+    // Forward the event to the client
+    HandleDMgrEventL( *download, aEvent );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::StartSessionEventNotification
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::StartSessionEventNotification( const TDesC8& aDownloadState,
+                                                      const TDesC8& aProgressState,
+                                                      const TDesC8& aHandle,
+                                                      TRequestStatus& aStatus )
+    {
+    CLOG_ENTERFN( "RHttpDownload::StartSessionEventNotification" )
+
+    SendReceive( EHttpDownloadMgrSessionEventSubscription, 
+                 TIpcArgs( &aDownloadState, &aProgressState, &aHandle ), 
+                 aStatus );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::CancelSessionEventNotification
+// ---------------------------------------------------------
+//
+void RHttpDownloadMgr::CancelSessionEventNotification()
+    {
+    CLOG_WRITE( "RHttpDownload::CancelSessionEventNotification" )
+
+    SendReceive( EHttpDownloadMgrSessionEventCancel, TIpcArgs() );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::PackedDefaultAttributesLC
+// ---------------------------------------------------------
+//
+HBufC8* RHttpDownloadMgr::PackedDefaultAttributesLC()
+    {
+    HBufC8* buf = NULL;
+    if( iDefaultAttribs )
+        {
+        
+        buf = TDMgrUtils::PackedAttributesL( iDefaultAttribs );
+        CleanupStack::PushL( buf );
+        }
+    else
+        {
+        buf = HBufC8::NewLC( 0 );
+        }
+
+    return buf;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::DoFindDownloadL
+// ---------------------------------------------------------
+//
+RHttpDownload* RHttpDownloadMgr::DoFindDownloadL( const TDesC8& aUrl, const TDesC8& aMsgBody )
+    {
+    RHttpDownload* retVal = NULL;
+    TInt pushCounter( 0 );
+
+    HBufC8* escaped = EscapeUtils::EscapeDecodeL( aUrl );
+    CleanupStack::PushL( escaped ); ++pushCounter;
+
+    TUriParser8 compUri; 
+    compUri.Parse( *escaped );
+
+    TPtrC8 scheme( compUri.Extract( EUriScheme ) );
+
+    CUri8* url = CUri8::NewLC(); ++pushCounter;
+
+    if( scheme.Length() )
+        {
+        if( scheme != KHttpScheme &&
+            scheme != KHttpsScheme )
+            // this url has an unsupported scheme
+            {
+            User::Leave( KErrArgument );
+            }
+        else
+            {
+            url->SetComponentL( scheme, EUriScheme );
+            }
+        }
+    else
+        {
+        url->SetComponentL( KHttpScheme, EUriScheme );
+        }
+   
+    url->SetComponentL( compUri.Extract( EUriHost ), EUriHost );
+    url->SetComponentL( compUri.Extract( EUriPath ), EUriPath );
+    url->SetComponentL( compUri.Extract( EUriQuery ), EUriQuery );
+    url->SetComponentL( compUri.Extract( EUriFragment ), EUriFragment );
+    
+    if( compUri.IsPresent( EUriPort ) )
+        {
+        url->SetComponentL( compUri.Extract( EUriPort ), EUriPort );
+        }
+    else
+        {
+        TBuf8<10> port;
+
+        port.Format( _L8("%d"), KDefaultPort );
+
+        url->SetComponentL( port, EUriPort );
+        }
+   
+    TBuf8<KHashLength> hash_req;
+    HashL( aMsgBody, hash_req );
+    
+    TUriParser8 parsed_req;
+    
+    parsed_req.Parse( url->Uri().UriDes() );
+
+    for( TInt i = 0; i < iDownloadArray->Count(); i++ )
+        {
+        if( (*iDownloadArray)[i]->IsDownloadL( parsed_req, hash_req ) )
+            {
+            retVal = (*iDownloadArray)[i];
+            break;
+            }
+        }    
+        
+    CleanupStack::PopAndDestroy( pushCounter );
+
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownloadMgr::IsEventBroadcasting
+// ---------------------------------------------------------
+//
+TBool RHttpDownloadMgr::IsEventBroadcasting()
+    {
+    CLOG_WRITE( "RHttpDownload::IsEventBroadcasting" )
+    return (0 < iExtension->iEventBroadcastLevel);
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownloadMgr::IsEventBroadcasting
+// ---------------------------------------------------------
+//       
+TInt RHttpDownloadMgr::EventPriorityFlag() const
+    {
+    return iExtension->iAdjustEventPriorityFlag;
+    }
+        
+// ---------------------------------------------------------
+// RHttpDownloadMgr::IncrementEventPriorityFlag
+// ---------------------------------------------------------
+//       
+void RHttpDownloadMgr::IncrementEventPriorityFlag()
+    {
+    iExtension->iAdjustEventPriorityFlag++;
+    }
+        
+// ---------------------------------------------------------
+// RHttpDownloadMgr::IncrementEventPriorityFlag
+// ---------------------------------------------------------
+//       
+void RHttpDownloadMgr::DecrementEventPriorityFlag()
+    {
+    iExtension->iAdjustEventPriorityFlag--;
+    }