diff -r 000000000000 -r dd21522fd290 browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpConnHandler.cpp --- /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 +#include +#include +#include +#include +#include +//#include +#include + +// 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 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* 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* 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* 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* 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* 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* 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* 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