browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpConnHandler.cpp
changeset 0 dd21522fd290
child 1 7c90e6132015
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpConnHandler.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,969 @@
+/*
+* Copyright (c) 2002-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:  ?Description
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "HttpClientApp.h"
+#include "HttpClientAppInstance.h"
+#include "HttpDownload.h"
+#include "HttpConnHandler.h"
+#include "HttpDownloadManagerServerEngine.h"
+#include "FileExt.h"
+#include "HttpDownloadMgrLogger.h"
+
+#include <in_sock.h>
+#include <CommDbConnPref.h>
+#include <HttpFilterAuthenticationInterface.h>
+#include <uaproffilter_interface.h>
+#include <HttpFilterCommonStringsExt.h>
+#include <cdblen.h>
+//#include <DeflateFilterInterface.h>
+#include <CookieFilterInterface.h>
+
+// EXTERNAL DATA STRUCTURES
+//extern  ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES  
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+const TInt KShutDownTimer = 60*1000000;  //60 sec - Updated to 60 secs as part of error fix JSIN-7JSE6H
+
+// MACROS
+//#define ?macro ?macro_def
+
+// LOCAL CONSTANTS AND MACROS
+//const ?type ?constant_var = ?constant;
+//#define ?macro_name ?macro_def
+
+// MODULE DATA STRUCTURES
+//enum ?declaration
+//typedef ?declaration
+
+// LOCAL FUNCTION PROTOTYPES
+//?type ?function_name( ?arg_type, ?arg_type );
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------
+// CHttpConnShutdownTimer::NewL
+// ---------------------------------------------------------
+//
+CHttpConnShutdownTimer* CHttpConnShutdownTimer::NewL( MShutdownObserver* aObserver )
+    {
+	CHttpConnShutdownTimer* self = new (ELeave) CHttpConnShutdownTimer( aObserver );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self ); // self
+	return self;
+    }
+
+// ---------------------------------------------------------
+// CHttpConnShutdownTimer::CHttpConnShutdownTimer
+// ---------------------------------------------------------
+//
+CHttpConnShutdownTimer::CHttpConnShutdownTimer( MShutdownObserver* aObserver )
+    :CActive( EPriorityStandard )
+    ,iObserver( aObserver )
+    {
+    CLOG_WRITE_1( "Shutdown_timer(0x%x)", this);
+    }
+
+// ---------------------------------------------------------
+// CHttpConnShutdownTimer::~CHttpConnShutdownTimer
+// ---------------------------------------------------------
+//
+CHttpConnShutdownTimer::~CHttpConnShutdownTimer()
+    {
+    Cancel();
+    iTimer.Close();
+    CLOG_WRITE_1( "Shutdown destroyed (0x%x)", this);
+    }
+
+// ---------------------------------------------------------
+// CHttpConnShutdownTimer::ConstructL
+// ---------------------------------------------------------
+//
+void CHttpConnShutdownTimer::ConstructL()
+    {
+    User::LeaveIfError( iTimer.CreateLocal() );
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------
+// CHttpConnShutdownTimer::Start
+// ---------------------------------------------------------
+//
+void CHttpConnShutdownTimer::Start( TInt aTimeOut )
+    {
+    CLOG_WRITE("Shutdown timer started");
+    if( IsActive() )
+        {
+        return;
+        }
+
+    iTimer.After( iStatus, aTimeOut );
+    SetActive();
+    }
+
+// ---------------------------------------------------------
+// CHttpConnShutdownTimer::DoCancel
+// ---------------------------------------------------------
+//
+void CHttpConnShutdownTimer::DoCancel()
+    {
+    iTimer.Cancel();
+    CLOG_WRITE("Shutdown timer canceled");
+    }
+
+// ---------------------------------------------------------
+// CHttpConnShutdownTimer::RunL
+// ---------------------------------------------------------
+// 
+void CHttpConnShutdownTimer::RunL()
+    {
+    LOGGER_ENTERFN("CHttpConnShutdownTimer::RunL()");
+    iObserver->ShutDown();
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnStageNotifier::CHttpConnStageNotifier
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CHttpConnStageNotifier::CHttpConnStageNotifier( CHttpConnHandler* aConnHandler )
+    :CActive( EPriorityStandard )
+    ,iConnHandler( aConnHandler )
+    {
+    CLOG_WRITE_1( "Stage notifier created (0x%x)", this );
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnStageNotifier::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHttpConnStageNotifier::ConstructL()
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnStageNotifier::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CHttpConnStageNotifier* 
+                CHttpConnStageNotifier::NewL( CHttpConnHandler* aConnHandler )
+    {
+    CHttpConnStageNotifier* self = 
+                            new( ELeave ) CHttpConnStageNotifier( aConnHandler );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+    
+// Destructor
+CHttpConnStageNotifier::~CHttpConnStageNotifier()
+    {
+    Cancel();
+    
+    CLOG_WRITE_1( "Stage notifier destroy: (0x%x)", this );
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnStageNotifier::Start
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnStageNotifier::Start()
+    {
+    LOGGER_ENTERFN( "Start" );
+
+    if( IsActive() )
+        // Already observed
+        {
+        return;
+        }
+
+    iConnHandler->Connection().ProgressNotification( iProgressBuf, iStatus );
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::DoCancel
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnStageNotifier::DoCancel()
+    {
+    if( iConnHandler->Connection().SubSessionHandle() )
+        {
+        iConnHandler->Connection().CancelProgressNotification();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::RunL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnStageNotifier::RunL()
+    {
+    if( iStatus == KErrNone )
+        {
+        TInt stage = iProgressBuf().iStage;
+
+        iConnHandler->ConnectionStageChanged( stage );
+
+        if( stage > KConnectionUninitialised )
+            // connection is still alive
+            {
+            iConnHandler->Connection().ProgressNotification( iProgressBuf, iStatus );
+            SetActive();
+            }
+        }
+    else
+        {
+        iConnHandler->ConnectionError( iStatus.Int() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::CHttpConnHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CHttpConnHandler::CHttpConnHandler( CHttpClientApp* aClientApp )
+    : CActive( EPriorityStandard )
+    , iClientApp( aClientApp )
+    {
+    CLOG_CREATE;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::ConstructL()
+    {
+    CLOG_NAME_2( _L("CHttpConnHandler_%x_c%x"), iClientApp->AppUid(), (TInt)this );
+    LOGGER_ENTERFN( "ConstructL" );
+
+    CActiveScheduler::Add( this );
+
+    iConnNotif = CHttpConnStageNotifier::NewL( this );
+    CLOG_ATTACH( iConnNotif, this );
+    iShutDown = CHttpConnShutdownTimer::NewL( this );
+    CLOG_ATTACH( iShutDown, this );
+
+    iHttpSession.OpenL();
+    CLOG_WRITE8( "Session open" );
+    InitSessionL();
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CHttpConnHandler* CHttpConnHandler::NewL( CHttpClientApp* aClientApp )
+    {
+    CHttpConnHandler* self = new( ELeave ) CHttpConnHandler( aClientApp );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+    
+// Destructor
+CHttpConnHandler::~CHttpConnHandler()
+    {
+    if( IsActive() )
+        {
+        Cancel();
+        }
+
+    ShutDown( ETrue );
+
+    iHttpSession.Close();
+
+    delete iConnNotif;
+    delete iShutDown;
+    
+    CLOG_CLOSE;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ConnectL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::ConnectL()
+    {
+    LOGGER_ENTERFN( "ConnectL" );
+
+    TBool doComplete( ETrue );
+
+    iShutDown->Cancel();
+
+    if( !iConnection.SubSessionHandle() )
+        // only the first connection request does this initialization
+        {
+        CLOG_WRITE( "No subsession" );
+        // forget the previous notifier
+        if( iConnName )
+            {
+            CLOG_WRITE_1("ConnName set: [%S]", iConnName);
+            
+            TName connName;
+
+            connName.Copy( *iConnName );
+
+            User::LeaveIfError( iConnection.Open( iClientApp->Engine()->SocketServ(), connName ) );
+
+            CLOG_WRITE( "connection open" );
+            
+            TNifProgress progress;
+
+            iConnection.Progress( progress );
+
+            iConnStage = progress.iStage;
+            CLOG_WRITE_1("Stage: %d", iConnStage);
+
+            UpdateIapId();
+            }
+        else
+            {
+            User::LeaveIfError( iConnection.Open( iClientApp->Engine()->SocketServ() ) );
+            CLOG_WRITE8_1( "Start: %d", iIapId );
+            if( iIapId )
+                {
+                iPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
+                iPref.SetIapId( iIapId );
+                }
+            else
+                {
+                iPref.SetDialogPreference( ECommDbDialogPrefPrompt );
+                }
+
+            iConnection.Start( iPref, iStatus );
+
+            // RConnection will complete us.
+            doComplete = EFalse;
+            }
+
+        iConnNotif->Start();
+
+        iNewConnection = ETrue;
+        }
+
+    CLOG_WRITE_1( "stage: %d", iConnStage );
+    if( !IsActive() )
+        {
+        CLOG_WRITE( "Not active" );
+
+        SetActive();
+
+        CLOG_WRITE_1( "doComplete: %d", doComplete );
+        if( doComplete )
+            {
+            TRequestStatus* dummy = &iStatus;
+
+            User::RequestComplete( dummy, KErrNone );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::Disconnect
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::Disconnect( TBool aAtOnce, CHttpDownload* aDownload )
+    {
+    LOGGER_ENTERFN( "Disconnect()" );
+    CLOG_WRITE8_1( "Exit: %d", aAtOnce );
+
+    // to remove this download from the referenced ones
+    if( aDownload )
+        {
+        aDownload->SetConnHandler( NULL );
+        }
+
+    TInt refs = Referencies();
+
+    CLOG_WRITE8_1( "aAtOnce: %d", aAtOnce );
+    CLOG_WRITE8_1( "refs: %d", refs );
+
+    if( aAtOnce || (!refs && !iConnName) )
+        // no more reference to this connection -> real disconnect
+        // but only if the connection name was not set from outside
+        // In that case only CHttpClientAppInstance::Disconnect can
+        // disconnect (it uses aAtOnce ETrue).
+        {
+        CLOG_WRITE_1( "conn handle: %d", iConnection.SubSessionHandle() );
+        CLOG_WRITE_1( "stage: %d", iConnStage );
+
+        if( !aAtOnce 
+            && iConnection.SubSessionHandle() 
+            && iConnStage == KLinkLayerOpen )
+            {
+			CLOG_WRITE_1( "ShutDown->Start: atOnce=%d", aAtOnce );
+            iShutDown->Start( KShutDownTimer );
+            }
+        else
+            {
+            ShutDown();
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::IapId
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CHttpConnHandler::IapId() const
+    {
+    return iIapId;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ClientAppInst
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CHttpClientApp* CHttpConnHandler::ClientApp() const
+    {
+    return iClientApp;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ClientAppInst
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CHttpClientAppInstance* CHttpConnHandler::ClientAppInst() const
+    {
+    return iClientInst;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::Session
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RHTTPSession& CHttpConnHandler::Session()
+    {
+    return iHttpSession;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::Connection
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RConnection& CHttpConnHandler::Connection()
+    {
+    return iConnection;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ConnectionNameL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC* CHttpConnHandler::ConnectionNameL( TBool& aDelete )
+    {
+    if( iConnName )
+        {
+        aDelete = EFalse;
+        return iConnName;
+        }
+    else if( iConnection.SubSessionHandle() )
+        {
+        TName connName;
+
+        aDelete = ETrue;
+
+        iConnection.Name( connName );
+
+        return connName.AllocL();
+        }
+
+    aDelete = EFalse;
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::APNameL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::APNameL( TPtrC16& aValue )
+    {
+// TODO: APNameL
+/*
+    if( iConnection.SubSessionHandle() )
+        {
+        TBuf<KCommsDbSvrMaxFieldLength> name;
+        TBuf<20> query;
+
+        query.Format( _L("%s\\%s"), IAP, COMMDB_NAME );
+        iConnection.GetDesSetting( query, name );
+        }
+*/
+    aValue.Set( KNullDesC );
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::IsConnected
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CHttpConnHandler::IsConnected()
+    {
+    return iConnStage == KLinkLayerOpen;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::SetClientAppInst
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::SetClientAppInst( CHttpClientAppInstance* aClientInst )
+    {
+    iClientInst = aClientInst;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::SetIapId
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::SetIapId( TUint32 aIapId )
+    {
+    CLOG_WRITE8_1( "SetIAPId: %d", aIapId );
+    __ASSERT_DEBUG( !IsConnected() || (IsConnected() && aIapId == iIapId), DMPanic( KErrInUse ) );
+
+    if( IsConnected() )
+        // Do not use this new IAP id as long as connected
+        {
+        return;
+        }
+
+    iIapId = aIapId;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::SetConnectionNameL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::SetConnectionNameL( const TDesC& aConnName )
+    {
+    CLOG_WRITE_1( "connName: %S", &aConnName );
+
+    if( !IsConnected() )
+        {
+        if( aConnName.Length() )
+            {
+            if( !iConnName )
+                {
+                iConnName = HBufC::NewL( KMaxName );
+                }
+
+            iConnName->Des().Copy( aConnName );
+
+            ConnectL();
+            }
+        else
+            // forget the connection name
+            {
+            delete iConnName; iConnName = NULL;
+            }
+        }
+    else
+        {
+        CLOG_WRITE( "Connected!!!" );
+        User::Leave( KErrInUse );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::DoCancel
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::DoCancel()
+    {
+    LOGGER_ENTERFN( "DoCancel" );
+
+    CArrayPtrFlat<CHttpDownload>* downloads = 
+                                iClientApp->Downloads();
+    for( TInt i = 0; i < downloads->Count(); ++i )
+        {
+        if( (*downloads)[i]->ConnHandler() == this )
+            {
+            (*downloads)[i]->ConnectionFailed( KErrCancel );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::RunL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::RunL()
+    {
+    LOGGER_ENTERFN( "RunL()" );
+    CLOG_WRITE8_1( "%d", iStatus.Int() );
+    if( iStatus.Int() != KErrNone )
+        {
+        iNewConnection = EFalse;
+
+        CArrayPtrFlat<CHttpDownload>* downloads = 
+                                    iClientApp->Downloads();
+        for( TInt i = 0; i < downloads->Count(); ++i )
+            {
+            if( (*downloads)[i]->ConnHandler() == this )
+                {
+                (*downloads)[i]->ConnectionFailed( iStatus.Int() );
+                }
+            }
+        }
+    else
+        {
+        // Have to check the connection stage if the it was cloned.
+        TNifProgress progress;
+
+        iConnection.Progress( progress );
+
+        iConnStage = progress.iStage;
+        CLOG_WRITE_1( "Stage: %d", iConnStage );
+
+        if( iConnStage == KLinkLayerOpen )
+            // Connect request was issued by download when connection was already 
+            // open -> RConnection.Start() wasn't called, only the request
+            // was completed.
+            {
+            Connected();
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ConnectionStageChanged
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::ConnectionStageChanged( TInt aStage )
+    {
+    CLOG_WRITE8_1( "Stage: %d", aStage );
+
+    iConnStage = aStage;
+
+    if( iConnStage == KConnectionUninitialised || 
+        iConnStage == KDataTransferTemporarilyBlocked
+        )
+        {
+        __ASSERT_DEBUG( iClientApp, DMPanic( KErrCorrupt ) );
+        CArrayPtrFlat<CHttpDownload>* downloads = 
+                                    iClientApp->Downloads();
+        for( TInt i = 0; i < downloads->Count(); ++i )
+            {
+            if( (*downloads)[i]->ConnHandler() == this )
+                {
+                if( iConnStage == KConnectionUninitialised )
+                    {
+                    // from now on this name is invalid -> forget it!
+                    delete iConnName; iConnName = NULL;
+
+                    (*downloads)[i]->Disconnected();
+                    }
+                else
+                    {
+                    (*downloads)[i]->Suspended();
+                    }
+                }
+            }
+
+        if( iConnStage == KConnectionUninitialised )
+            {
+            ShutDown();
+            }
+        if ( iConnStage == KDataTransferTemporarilyBlocked )
+            {
+            iShutDown->Start( KShutDownTimer );
+            }     
+        }
+    else if( iConnStage == KLinkLayerOpen )
+        // connection open
+        {
+        Connected();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ConnectionError
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::ConnectionError( TInt aError )
+    {
+    __ASSERT_DEBUG( iClientApp, DMPanic( KErrCorrupt ) );
+    CArrayPtrFlat<CHttpDownload>* downloads = 
+                                iClientApp->Downloads();
+
+    for( TInt i = 0; i < downloads->Count(); ++i )
+        {
+        if( (*downloads)[i]->ConnHandler() == this )
+            {
+            (*downloads)[i]->ConnectionFailed( aError );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::ShutDown
+//
+// Connection notification is not canceled here, because need to know
+// when the connection is really closed. Forget the connection name, set by
+// the client app only if the connection is really closed.
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::ShutDown( TBool aFromDestructor )
+    {
+    CLOG_WRITE( "ShutDown" );
+    CLOG_WRITE8_1( "dest: %d", aFromDestructor );
+
+    iNewConnection = EFalse;
+
+    if( iShutDown )
+        {
+        iShutDown->Cancel();
+        }
+
+    if( iConnNotif )
+        {
+        iConnNotif->Cancel();
+        }
+    
+    Cancel();
+    CLOG_WRITE( "Canceled" );
+    iConnStage = KConnectionUninitialised;
+
+	CLOG_WRITE( "Closing connection" );
+    iConnection.Close();
+    CLOG_WRITE( "Conn closed" );
+
+    // Pause the downloads  
+    CArrayPtrFlat<CHttpDownload>* downloads = 
+                                iClientApp->Downloads();
+    for( TInt i = 0; i < downloads->Count(); ++i )
+        {
+        if( (*downloads)[i]->ConnHandler() == this )
+            {
+            TRAP_IGNORE( (*downloads)[i]->PauseL( ETrue ) );
+            }
+        }
+    if( !iClientInst && !aFromDestructor )
+        // Client instance already exited and all download disconnected ->
+        // no need for this connhandler anymore.
+        // the next client will create a new connhandler and assigned downloads
+        // will use that one.
+        {
+        CLOG_WRITE( "Destroy me" );
+        // DO NOT USE 'this' after this call!!!
+        iClientApp->DestroyConnHandler( this );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::InitSessionL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::InitSessionL()
+    {
+    LOGGER_ENTERFN( "InitSessionL" );
+
+    iHttpSession.StringPool().OpenL(HttpFilterCommonStringsExt::GetTable());
+
+    // Set the disconnect notification 
+    iHttpSession.ConnectionInfo().SetPropertyL
+        (
+        iHttpSession.StringPool().StringF( HTTP::ENotifyOnDisconnect, RHTTPSession::GetTable() ), 
+        iHttpSession.StringPool().StringF( HTTP::EEnableDisconnectNotification, RHTTPSession::GetTable() )
+        ); 
+
+    CHttpFilterAuthenticationInterface::InstallFilterL(iHttpSession, ETrue);
+    CHttpFilterAuthenticationInterface::InstallFilterL(iHttpSession, EFalse);
+    CHttpUAProfFilterInterface::InstallFilterL(iHttpSession);
+    CHttpCookieFilter::InstallFilterL(iHttpSession);
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::SetConnectionInfoL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::SetConnectionInfoL()
+    {
+    RStringPool strPool = iHttpSession.StringPool();
+
+    // Remove first session properties just in case.
+    RHTTPConnectionInfo connInfo = iHttpSession.ConnectionInfo();
+    
+    // Clear RConnection and Socket Server instances
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EHttpSocketServ,RHTTPSession::GetTable()));
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EHttpSocketConnection,RHTTPSession::GetTable()));
+    
+    // Clear the proxy settings
+//    THTTPHdrVal proxyUsage(strPool.StringF(HTTP::EUseProxy,RHTTPSession::GetTable()));
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EProxyUsage,RHTTPSession::GetTable()));
+    connInfo.RemoveProperty(strPool.StringF(HTTP::EProxyAddress,RHTTPSession::GetTable()));
+    
+    // RConnection and Socket Server
+    connInfo.SetPropertyL ( strPool.StringF(HTTP::EHttpSocketServ, 
+                                    RHTTPSession::GetTable()), 
+                            THTTPHdrVal (iClientApp->Engine()->SocketServ().Handle()) );
+    
+    TInt connPtr1 = REINTERPRET_CAST(TInt, &iConnection);
+    connInfo.SetPropertyL ( strPool.StringF(HTTP::EHttpSocketConnection, 
+                            RHTTPSession::GetTable() ), THTTPHdrVal (connPtr1) );    
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::Connected
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::Connected()
+    {
+    if( iNewConnection )
+        {
+        iNewConnection = EFalse;
+
+        if( iStatus.Int() == KErrNone )
+            {
+            if( !iIapId )
+                {
+                UpdateIapId();
+                }
+
+            TRAP_IGNORE( SetConnectionInfoL() );
+            }
+        }
+
+    __ASSERT_DEBUG( iClientApp, DMPanic( KErrCorrupt ) );
+    CArrayPtrFlat<CHttpDownload>* downloads = 
+                                iClientApp->Downloads();
+    for( TInt i = 0; i < downloads->Count(); ++i )
+        {
+        if( (*downloads)[i]->ConnHandler() == this )
+            {
+            iShutDown->Cancel();
+            (*downloads)[i]->Connected();
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::Referencies
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CHttpConnHandler::Referencies()
+    {
+    TInt refs( 0 );
+
+    __ASSERT_DEBUG( iClientApp, DMPanic( KErrCorrupt ) );
+    CArrayPtrFlat<CHttpDownload>* downloads = 
+                                iClientApp->Downloads();
+
+    for( TInt i = 0; i < downloads->Count(); ++i )
+        {
+        if( (*downloads)[i]->ConnHandler() == this )
+            {
+            ++refs;
+            }
+        }
+
+    return refs;
+    }
+
+// -----------------------------------------------------------------------------
+// CHttpConnHandler::UpdateIapId
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpConnHandler::UpdateIapId()
+    {
+    if( IsConnected() )
+        {
+        // 20 = it's more than enough for the format string
+        TBuf<20> query;
+
+        query.Format( _L("%s\\%s"), IAP, COMMDB_ID );
+        iConnection.GetIntSetting( query, iIapId );
+        }
+    }
+
+//  End of File