--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrServer.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,454 @@
+/*
+* 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 Download Mgr Server.
+*
+*/
+
+
+// INCLUDE FILES
+#include "DownloadMgrLogger.h"
+#include "DownloadMgrServer.h"
+#include "DownloadMgrDef.h"
+
+#include <HttpClientAppInstance.h>
+#include <HttpDownload.h>
+#include <e32svr.h>
+#include <basched.h>
+//#include <e32uid.h>
+
+// CONSTANTS
+
+const TUint KDMgrServerPolicyRangeCount = 3;
+const TInt KDMgrServerPolicyRanges[KDMgrServerPolicyRangeCount] =
+ {
+ 0, // EHttpDownloadMgrInitialize, // = 0
+ 1, // EHttpDownloadMgrCreateDownload, // = 1
+ /*
+ EHttpDownloadMgrCheckUrl, // = 2
+ EHttpDownloadMgrAttach, // = 3
+ EHttpDownloadMgrPauseAll, // = 4
+ EHttpDownloadMgrStartAllL, // = 5
+ EHttpDownloadMgrResetAll, // = 6
+ EHttpDownloadMgrDeleteAll, // = 7
+ EHttpDownloadMgrDisconnect, // = 8
+
+ EHttpDownloadMgrGetIntAttribute, // = 9
+ EHttpDownloadMgrGetBoolAttribute, // =10
+ EHttpDownloadMgrGetStringAttribute, // =11
+ EHttpDownloadMgrGetString8Attribute, // =12
+
+ EHttpDownloadMgrSetIntAttribute, // =13
+ EHttpDownloadMgrSetBoolAttribute, // =14
+ EHttpDownloadMgrSetStringAttribute, // =15
+ EHttpDownloadMgrSetString8Attribute, // =16
+ EHttpDownloadMgrSessionEventSubscription, // =17
+ EHttpDownloadMgrSessionEventCancel, // =18
+
+ EHttpDownloadAttach, // =19
+ EHttpDownloadStart, // =20
+ EHttpDownloadPause, // =21
+ EHttpDownloadReset, // =22
+ EHttpDownloadDelete, // =23
+ EHttpDownloadMove, // =24
+ EHttpDownloadClose, // =25
+ EHttpDownloadEventSubscription, // =26
+ EHttpDownloadEventCancel, // =27
+
+ EHttpDownloadGetIntAttribute, // =28
+ EHttpDownloadGetBoolAttribute, // =29
+ EHttpDownloadGetStringAttribute, // =30
+ EHttpDownloadGetString8Attribute, // =31
+
+ EHttpDownloadSetIntAttribute, // =32
+ EHttpDownloadSetBoolAttribute, // =33
+ EHttpDownloadSetStringAttribute, // =34
+ EHttpDownloadSetString8Attribute, // =35
+ EHttpDownloadBufferAttributes, // =36
+
+ EHttpDownloadGetRFile, // =37
+ EHttpDownloadSetRFile, // =38
+ EHttpDownloadSetOnError, // =39
+ EHttpDownloadAttachToDownload // =40
+ EHttpDownloadCloseCompleted, // =41
+ EHttpDownloadDataAttribute, // =42
+ EHttpDownloadTrackAttribute, // =43
+
+ */
+ 44 // EHttpDownloadMgrNotSupported // =44
+ };
+
+enum TDownloadMgrSecurityPolicy
+ {
+ EDmgrSecurityNetworkServices = 0
+ };
+
+const CPolicyServer::TPolicyElement dMgrServerPolicyElements[] =
+ {
+ // Check Network Services -> EDmgrSecurityNetworkServices = 0
+ {_INIT_SECURITY_POLICY_C1(ECapabilityNetworkServices), CPolicyServer::EPanicClient}
+ };
+
+const TUint8 dMgrServerPolicyElementsIndex[] =
+ {
+ EDmgrSecurityNetworkServices, // applies to req 0
+ CPolicyServer::EAlwaysPass, // applies to req 1 - 39
+ CPolicyServer::ENotSupported // applies to req 40 -
+ };
+
+const CPolicyServer::TPolicy dMgrServerPolicy =
+ {
+ CPolicyServer::EAlwaysPass,
+ KDMgrServerPolicyRangeCount,
+ KDMgrServerPolicyRanges,
+ dMgrServerPolicyElementsIndex,
+ dMgrServerPolicyElements
+ };
+
+// GLOBAL FUNCTIONS
+
+// start the server thread
+// This is called from the client.
+EXPORT_C TInt StartDownloadMgrServer( TAny* /*anArg*/ )
+ {
+ CLOG_CREATE_NULL;
+ CLOG_NAME_NULL( _L("Server") );
+ CLOG_WRITE_NULL( "StartDownloadMgrServer" )
+
+ TBuf<32> name( KDownloadMgrMainThreadName );
+
+ RThread().RenameMe( name );
+
+ CLOG_WRITE_NULL( "RThread().RenameMe( name );" );
+
+ TInt result = KErrNone;
+
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ CLOG_WRITE_FORMAT_NULL( "%x = CTrapCleanup::New();", cleanup );
+ if ( cleanup == NULL )
+ {
+ result = KErrNoMemory;
+ }
+ else
+ {
+ CActiveScheduler* scheduler = new CActiveScheduler;
+ if ( scheduler == NULL )
+ {
+ result = KErrNoMemory;
+ }
+ else
+ {
+ CActiveScheduler::Install( scheduler );
+
+ CDownloadMgrServer* server = NULL;
+ TRAP( result, server = CDownloadMgrServer::NewL() );
+ CLOG_WRITE_FORMAT_NULL( "%x = CDownloadMgrServer::NewL();", server );
+ if ( result == KErrNone )
+ {
+ CLOG_ATTACH_NULL( NULL, server );
+
+ RProcess::Rendezvous( result );
+ CLOG_WRITE_NULL( "RThread::Rendezvous( result );" );
+ // It starts an infinite loop from which we can break out
+ // only if we stop the active scheduler
+ CActiveScheduler::Start();
+
+ // finished
+ delete server;
+ }
+ else
+ {
+
+ }
+ delete scheduler;
+ }
+ delete cleanup;
+ }
+
+ CLOG_WRITE_NULL( "StartDownloadMgrServer" )
+ CLOG_CLOSE_NULL;
+
+ return result;
+ }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::PanicServer
+// ---------------------------------------------------------
+//
+void CDownloadMgrServer::PanicServer( TDownloadMgrSvrPanic aPanic )
+ {
+ CLOG_ENTERFN_NULL( "CDownloadMgrServer::PanicServer" )
+ _LIT( KTxtDownloadMgrServer,"CDownloadMgrServer" );
+ User::Panic( KTxtDownloadMgrServer ,aPanic );
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::NewL
+// ---------------------------------------------------------
+//
+CDownloadMgrServer* CDownloadMgrServer::NewL()
+ {
+ CLOG_ENTERFN_NULL( "CDownloadMgrServer::NewL" )
+ CDownloadMgrServer* self = new (ELeave) CDownloadMgrServer();
+ CleanupStack::PushL( self );
+ self->StartL( KDownloadMgrServerName );
+ CLOG_WRITE_NULL( "self->StartL( KDownloadMgrServerName );" );
+ self->ConstructL();
+ CleanupStack::Pop( self ); // self
+ return self;
+ }
+
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::NewContainerL
+// ---------------------------------------------------------
+//
+CObjectCon* CDownloadMgrServer::NewContainerL()
+ {
+ CLOG_WRITE( "CDownloadMgrServer::NewContainerL" )
+ return iContainerIndex->CreateL();
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::NewContainerL
+// ---------------------------------------------------------
+//
+void CDownloadMgrServer::RemoveContainer( CObjectCon* aCon )
+ {
+ CLOG_ENTERFN( "CDownloadMgrServer::RemoveContainer" )
+ iContainerIndex->Remove( aCon );
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::CDownloadMgrServer
+// ---------------------------------------------------------
+//
+CDownloadMgrServer::CDownloadMgrServer()
+: CPolicyServer( EPriorityStandard, dMgrServerPolicy )
+, iSessionCount( 0 )
+ {
+ __DECLARE_NAME( _S( "CDownloadMgrServer" ) );
+ }
+
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::ConstructL
+// ---------------------------------------------------------
+//
+void CDownloadMgrServer::ConstructL()
+ {
+ CLOG_ENTERFN( "CDownloadMgrServer::ConstructL" )
+ iContainerIndex = CObjectConIx::NewL();
+ iDmEngine = CHttpDownloadManagerServerEngine::NewL();
+ iShutdown = CDownloadMgrShutdown::NewL( this );
+ }
+
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::~CDownloadMgrServer
+// ---------------------------------------------------------
+//
+CDownloadMgrServer::~CDownloadMgrServer()
+ {
+ CLOG_ENTERFN( "CDownloadMgrServer::~CDownloadMgrServer" )
+ // delete the object container index.
+ delete iContainerIndex;
+ if( iDmEngine )
+ {
+ delete iDmEngine;
+ iDmEngine = NULL;
+ }
+ delete iShutdown;
+ }
+
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::NewSessionL
+// ---------------------------------------------------------
+//
+CSession2* CDownloadMgrServer::NewSessionL( const TVersion& aVersion, const RMessage2& /*aMessage*/ ) const
+ {
+ CLOG_ENTERFN( "CDownloadMgrServer::NewSessionL" )
+ iShutdown->Cancel();
+ // check version is ok
+ TVersion v( KDownloadMgrMajorVersionNumber,
+ KDownloadMgrMinorVersionNumber,
+ KDownloadMgrBuildVersionNumber );
+
+ if( !User::QueryVersionSupported( v, aVersion ) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ // make new session
+ CLOG_WRITE( "__DMGRSRV_IPC_V2__" );
+ return CDownloadMgrSession::NewL( ( CDownloadMgrServer* )this );
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::CreateNewClientAppInstanceL
+// ---------------------------------------------------------
+//
+CHttpClientAppInstance* CDownloadMgrServer::CreateNewClientAppInstanceL(
+ TUint32 aAppUid,
+ MDownloadStateObserver& aObserver,
+ TBool aGetAllPendingDownloads )
+ {
+ CLOG_WRITE( "CDownloadMgrServer::CreateNewClientAppInstanceL" )
+ return iDmEngine->CreateNewClientAppInstanceL(
+ aAppUid, &aObserver, aGetAllPendingDownloads );
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::CloseClientInstance
+// ---------------------------------------------------------
+//
+void CDownloadMgrServer::CloseClientInstance( CHttpClientAppInstance* aAppInst )
+ {
+ CLOG_ENTERFN( "CDownloadMgrServer::CloseClientInstance" )
+ iDmEngine->CloseClientInstance( aAppInst );
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::IcrementSessions
+// ---------------------------------------------------------
+//
+void CDownloadMgrServer::IcrementSessions()
+ {
+ CLOG_ENTERFN( "CDownloadMgrServer::IcrementSessions" )
+ iSessionCount++;
+ iShutdown->Cancel();
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::DecrementSessions
+// ---------------------------------------------------------
+//
+void CDownloadMgrServer::DecrementSessions()
+ {
+ CLOG_ENTERFN( "CDownloadMgrServer::DecrementSessions" )
+ iSessionCount--;
+ if( iSessionCount > 0 )
+ {
+ return;
+ }
+ iShutdown->Start();
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::NextSessionId
+// ---------------------------------------------------------
+//
+TInt CDownloadMgrServer::NextSessionId()
+ {
+ return ++iNextSessionId;
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrServer::ActiveDownloads
+// ---------------------------------------------------------
+//
+TInt CDownloadMgrServer::ActiveDownloads() const
+ {
+ return iDmEngine->ActiveDownloads();
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrShutdown::NewL
+// ---------------------------------------------------------
+//
+CDownloadMgrShutdown* CDownloadMgrShutdown::NewL( CDownloadMgrServer* aServer )
+ {
+ CLOG_ENTERFN_NULL( "CDownloadMgrShutdown::NewL" )
+ CDownloadMgrShutdown* self = new (ELeave) CDownloadMgrShutdown( aServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self ); // self
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrShutdown::CDownloadMgrShutdown
+// ---------------------------------------------------------
+//
+CDownloadMgrShutdown::CDownloadMgrShutdown( CDownloadMgrServer* aServer )
+:CActive( EPriorityStandard )
+ {
+ iServer = aServer;
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrShutdown::~CDownloadMgrShutdown
+// ---------------------------------------------------------
+//
+CDownloadMgrShutdown::~CDownloadMgrShutdown()
+ {
+ CLOG_ENTERFN( "CDownloadMgrShutdown::~CDownloadMgrShutdown" )
+ Cancel();
+ iTimer.Close();
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrShutdown::ConstructL
+// ---------------------------------------------------------
+//
+void CDownloadMgrShutdown::ConstructL()
+ {
+ CLOG_ENTERFN( "CDownloadMgrShutdown::ConstructL" )
+ User::LeaveIfError( iTimer.CreateLocal() );
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrShutdown::Start
+// ---------------------------------------------------------
+//
+void CDownloadMgrShutdown::Start()
+ {
+ CLOG_ENTERFN( "CDownloadMgrShutdown::Start" )
+ if( !IsActive() )
+ {
+ iTimer.After( iStatus, KDownloadMgrShutdownInterval );
+ SetActive();
+ }
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrShutdown::DoCancel
+// ---------------------------------------------------------
+//
+void CDownloadMgrShutdown::DoCancel()
+ {
+ CLOG_ENTERFN( "CDownloadMgrShutdown::DoCancel" )
+ iTimer.Cancel();
+ }
+
+// ---------------------------------------------------------
+// CDownloadMgrShutdown::RunL
+// ---------------------------------------------------------
+//
+void CDownloadMgrShutdown::RunL()
+ {
+ CLOG_ENTERFN( "CDownloadMgrShutdown::RunL" )
+ if( !iServer->ActiveDownloads() )
+ {
+ CActiveScheduler::Stop();
+ }
+ else
+ {
+ Start();
+ }
+ }