--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpDownloadManagerServerEngine.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,879 @@
+/*
+* 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
+
+ //User Includes
+#include "HttpDownloadManagerServerEngine.h"
+#include "HttpClientApp.h"
+#include "HttpDownloadMgrLogger.h"
+
+ //System Includes
+#include <bldvariant.hrh>
+#include <e32std.h>
+#include <centralrepository.h>
+#include <BrowserUiSDKCRKeys.h>
+#include <DocumentHandler.h>
+#include <FeatMgr.h>
+
+#ifdef RD_MULTIPLE_DRIVE
+#include <driveinfo.h>
+#endif //RD_MULTIPLE_DRIVE
+
+#ifdef __DOWNLOADMGR_CLOG__
+#pragma message ( "DMgr Engine logger enabled" )
+#endif
+
+// EXTERNAL DATA STRUCTURES
+//extern ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+_LIT( KDmDefaultDir, "c:\\system\\dmgr\\" );
+_LIT( KDefaultDriveList, "C;E" );
+#ifdef RD_MULTIPLE_DRIVE
+_LIT( KDefaultDriveListSep, ";" );
+#endif
+// TODO: Modify KGrandMasterAppUid if stand-alone DMgr app's uid is known")
+
+// 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;
+
+// ============================= LOCAL FUNCTIONS ===============================
+#if defined(_DEBUG)
+void DMPanic( TInt aPanicCode )
+ {
+ User::Panic( _L("DMEngine"), aPanicCode );
+ }
+#endif
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+CMMCNotifier::CMMCNotifier( RProperty* aProperty )
+ : CActive( EPriorityStandard )
+ ,iProperty( aProperty )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+CMMCNotifier::~CMMCNotifier()
+ {
+ Cancel();
+ }
+
+void CMMCNotifier::StartObserving( MMMCObserver* aObserver )
+ {
+ __ASSERT_DEBUG( !IsActive(), User::Panic( KNullDesC, KErrInUse) );
+
+ iObserver = aObserver;
+
+ iProperty->Subscribe( iStatus );
+ SetActive();
+ }
+
+void CMMCNotifier::RunL()
+ {
+ TInt value( 0 );
+ iProperty->Get( value);
+
+ iObserver->MMCModeChanged( value == 1 );
+
+ iProperty->Subscribe( iStatus );
+ SetActive();
+ }
+
+void CMMCNotifier::DoCancel()
+ {
+ iProperty->Cancel();
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::CHttpDownloadManagerServerEngine
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CHttpDownloadManagerServerEngine::CHttpDownloadManagerServerEngine()
+ : iMMCUniqueID( (TUint)KErrNotFound ),
+ iFeatProgressiveDownload(EFalse)
+ {
+ CLOG_CREATE;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::ConstructL()
+ {
+ CLOG_NAME( _L("Engine") );
+ LOGGER_ENTERFN( "ConstructL()" );
+
+ User::LeaveIfError( iRfs.Connect() );
+ User::LeaveIfError(iRfs.ShareProtected());
+
+ iDocHandler = CDocumentHandler::NewL();
+
+ iFeatProgressiveDownload = FeatureManager::FeatureSupported( KFeatureIdBrowserProgressiveDownload );
+
+ iProperty = new (ELeave) RProperty;
+ CLOG_ATTACH( iProperty, this );
+ iProperty->Attach( KPSUidUikon,KUikMMCInserted );
+
+ iMMCNotifier = new (ELeave) CMMCNotifier( iProperty );
+ CLOG_ATTACH( iMMCNotifier, this );
+ iMMCNotifier->StartObserving( this );
+
+ QueryMMCUniqueId();
+
+ QueryDriveListL();
+
+ iClientApps = new (ELeave) CArrayPtrFlat<CHttpClientApp>(2);
+
+ // make directory for the server
+ // No problem if it already exists
+ TInt error = iRfs.MkDirAll( KDmDefaultDir );
+ if( error != KErrNone && error != KErrAlreadyExists )
+ // leave if makedir failed in some way
+ // don't leave if already exists
+ {
+ CLOG_WRITE8_1( "MkDirAll: %d", error );
+ User::Leave( error );
+ }
+
+ LoadClientsL();
+
+ // This code generates a unique id for the next download
+ // client will create. It is always the the highest unique
+ // id of all downloads + 1.
+ iNextDownloadId = 1;
+
+ for( TInt apps = 0; apps < iClientApps->Count(); ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* allDownloads = (*iClientApps)[apps]->Downloads();
+
+ for( TInt i = 0; i < allDownloads->Count(); ++i )
+ {
+ if( iNextDownloadId <= (*allDownloads)[i]->Id() )
+ {
+ iNextDownloadId = (*allDownloads)[i]->Id() + 1;
+ }
+ }
+ }
+
+ error = iSocketServ.Connect();
+ User::LeaveIfError(error);
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CHttpDownloadManagerServerEngine*
+ CHttpDownloadManagerServerEngine::NewL()
+ {
+ CHttpDownloadManagerServerEngine* self =
+ new( ELeave ) CHttpDownloadManagerServerEngine();
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+
+// Destructor
+CHttpDownloadManagerServerEngine::~CHttpDownloadManagerServerEngine()
+ {
+ CLOG_WRITE( "~CHttpDownloadManagerServerEngine" );
+
+ CloseEngine( EFalse );
+
+ CLOG_CLOSE;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::CloseEngine
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CHttpDownloadManagerServerEngine::CloseEngine( TBool /*bStore*/ )
+ {
+ LOGGER_ENTERFN( "CloseEngine" );
+ iEngineClosing = ETrue;
+
+ if( iClientApps )
+ {
+ iClientApps->ResetAndDestroy();
+ delete iClientApps; iClientApps = NULL;
+ }
+
+ if( iMMCNotifier )
+ {
+ iMMCNotifier->Cancel();
+ delete iMMCNotifier; iMMCNotifier = NULL;
+ }
+
+ delete iProperty; iProperty = NULL;
+
+ iRfs.Close();
+ iSocketServ.Close();
+
+ delete iDocHandler; iDocHandler = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::CreateNewClientAppL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CHttpClientAppInstance*
+ CHttpDownloadManagerServerEngine::CreateNewClientAppInstanceL(
+ TUint32 aAppUid,
+ MDownloadStateObserver* aObserver,
+ TBool aMaster )
+ {
+ LOGGER_ENTERFN( "CreateNewClientAppInstanceL" );
+
+ // clientApp is stored in iCliendApps array
+ CHttpClientApp* clientApp = CreateNewClientAppL( aAppUid );
+
+ CHttpClientAppInstance* instance =
+ clientApp->CreateNewInstanceL( aObserver,
+ aMaster );
+
+ return instance;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::CloseClientInstance
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CHttpDownloadManagerServerEngine::CloseClientInstance(
+ CHttpClientAppInstance* aAppInst )
+ {
+ LOGGER_ENTERFN( "CloseClientInstance" );
+
+ if( !aAppInst )
+ {
+ return;
+ }
+
+ __ASSERT_DEBUG( aAppInst->ClientApp(), DMPanic( KErrArgument ) );
+
+ aAppInst->ClientApp()->CloseInstance( aAppInst );
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::ActiveDownloads
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CHttpDownloadManagerServerEngine::ActiveDownloads() const
+ {
+ LOGGER_ENTERFN( "ActiveDownloads" );
+
+ TInt downloads( 0 );
+
+ for( TInt apps = 0; apps < iClientApps->Count(); ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* dlArray = (*iClientApps)[apps]->Downloads();
+
+ for( TInt dl = 0; dl < dlArray->Count(); ++dl )
+ {
+ if( (*dlArray)[dl]->State() == EHttpDlInprogress )
+ {
+ ++downloads;
+ }
+ }
+ }
+
+ return downloads;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::AllDownloadsSizeL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CHttpDownloadManagerServerEngine::AllDownloadsSizeL(const CHttpDownload *aDownload) const
+ {
+ LOGGER_ENTERFN( "AllDownloadsSize" );
+
+ TInt allDownloadsSize( 0 );
+ TInt numClientApps = iClientApps->Count();
+ for( TInt apps = 0; apps < numClientApps; ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* dlArray = (*iClientApps)[apps]->Downloads();
+ TInt numDownloads = dlArray->Count();
+ for( TInt dl = 0; dl < numDownloads; ++dl )
+ {
+ if( ( aDownload != (*dlArray)[dl]) && (*dlArray)[dl]->State() != EHttpDlMultipleMOCompleted)
+ {
+ TInt32 totalSize(0);
+ TInt32 downloadedSize(0);
+
+ (*dlArray)[dl]->GetIntAttributeL(EDlAttrMultipleMOLength, totalSize);
+ (*dlArray)[dl]->GetIntAttributeL(EDlAttrMultipleMODownloadedSize, downloadedSize);
+
+ //Do not conside the downloads with unknown size
+ if(KDefaultContentLength != totalSize)
+ allDownloadsSize += (totalSize - downloadedSize);
+ }
+ }
+ }
+
+ return allDownloadsSize;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::AllDownloadsSizeInDriveL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CHttpDownloadManagerServerEngine::AllDownloadsSizeInDriveL(const CHttpDownload *aDownload, TInt aDriveId) const
+ {
+ LOGGER_ENTERFN( "AllDownloadsSizeInDriveL" );
+
+ TInt allDownloadsSize( 0 );
+ TInt numClientApps = iClientApps->Count();
+ for( TInt apps = 0; apps < numClientApps; ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* dlArray = (*iClientApps)[apps]->Downloads();
+ TInt numDownloads = dlArray->Count();
+ for( TInt dl = 0; dl < numDownloads; ++dl )
+ {
+ if( ( aDownload != (*dlArray)[dl]) && (*dlArray)[dl]->State() != EHttpDlMultipleMOCompleted
+ && aDriveId == (*dlArray)[dl]->GetDestinationDriveID())
+ {
+ TInt32 totalSize(0);
+ TInt32 downloadedSize(0);
+
+ (*dlArray)[dl]->GetIntAttributeL(EDlAttrMultipleMOLength, totalSize);
+ (*dlArray)[dl]->GetIntAttributeL(EDlAttrMultipleMODownloadedSize, downloadedSize);
+
+ //Do not conside the downloads with unknown size
+ if(KDefaultContentLength != totalSize)
+ allDownloadsSize += (totalSize - downloadedSize);
+ }
+ }
+ }
+
+ return allDownloadsSize;
+ }
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::IsDownloadAttached
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CHttpDownloadManagerServerEngine::IsAttachedAlready(TInt32 aDownloadId)
+{
+ LOGGER_ENTERFN( "IsAttachedAlready" );
+
+ for( TInt apps = 0; apps < iClientApps->Count(); ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* dlArray = (*iClientApps)[apps]->Downloads();
+
+ for( TInt dl = 0; dl < dlArray->Count(); ++dl )
+ {
+ if( (*dlArray)[dl]->Id() == aDownloadId )
+ {
+ if ((*dlArray)[dl]->PDClientAppInstance())
+ {
+ return ETrue;
+ }
+ }
+ }
+ }
+
+ return EFalse;
+
+}
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::FindDownload
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CHttpDownload*
+ CHttpDownloadManagerServerEngine::FindDownload( TInt32 aDownloadId )
+ {
+ for( TInt apps = 0; apps < iClientApps->Count(); ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* allDownloads = (*iClientApps)[apps]->Downloads();
+
+ for( TInt i = 0; i < allDownloads->Count(); ++i )
+ {
+ if( (*allDownloads)[i]->Id() == aDownloadId )
+ {
+ return (*allDownloads)[i];
+ }
+ }
+ }
+
+ return NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::CreateNewClientAppL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CHttpClientApp*
+ CHttpDownloadManagerServerEngine::CreateNewClientAppL( TUint32 aAppUid )
+ {
+ LOGGER_ENTERFN( "CreateNewClientAppL" );
+ CHttpClientApp* clientApp = NULL;
+
+ // Is this client app already registered?
+ for( TInt index = 0; index < iClientApps->Count(); ++index )
+ {
+ if( (*iClientApps)[index]->AppUid() == aAppUid )
+ {
+ // we found it
+ clientApp = (*iClientApps)[index];
+ clientApp->LoadClientInfoL(KNullDesC);
+ break;
+ }
+ }
+
+ if( !clientApp )
+ {
+ clientApp = CHttpClientApp::NewL( aAppUid,
+ this );
+ CleanupStack::PushL( clientApp );
+ iClientApps->AppendL( clientApp );
+ CleanupStack::Pop( clientApp );
+ }
+
+ return clientApp;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::LoadClientsL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::LoadClientsL()
+ {
+ LOGGER_ENTERFN( "LoadClientsL" );
+
+ CDir* dirs = 0;
+ // hidden + system + dir + only these
+ TUint mask = KEntryAttMatchMask | KEntryAttMatchExclusive;
+
+ User::LeaveIfError( iRfs.GetDir( KDmDefaultDir,
+ mask,
+ EAscending | EDirsFirst,
+ dirs) );
+ if( dirs && dirs->Count() )
+ {
+ CleanupStack::PushL( dirs );
+
+ for( TInt ii = 0; ii < dirs->Count(); ++ii )
+ {
+ TEntry entry = (*dirs)[ii];
+
+ CLOG_WRITE_1( "Found: %S", &entry.iName );
+
+ TUint32 clientUid = CheckClientDirName( entry.iName );
+ if( clientUid )
+ {
+ CreateNewClientAppL( clientUid );
+ }
+ }
+
+ CleanupStack::Pop( dirs );
+ }
+
+ delete dirs;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::CheckClientDirName
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CHttpDownloadManagerServerEngine::CheckClientDirName( TDesC& aClientDir )
+ {
+ TLex temp( aClientDir );
+ TUint32 clientUid( 0 );
+
+ temp.Val( clientUid, EHex );
+
+ return clientUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::ClientAppFolder
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::ClientAppFolder(
+ const CHttpClientApp* aClientApp,
+ TDes& aFolder )
+ {
+ _LIT( KClientAppFolderFormat, "%S%x\\" );
+
+ aFolder.Format( KClientAppFolderFormat, &KDmDefaultDir, aClientApp->AppUid() );
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::ClientAppFolder
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::ClientAppFolderWithoutDriveLetter(
+ const CHttpClientApp* aClientApp,
+ TDes& aFolder )
+ {
+ _LIT( KClientAppFolderFormat, "%s%x\\" );
+
+ // [3] cut off the drive letter + ':\\' part
+ aFolder.Format( KClientAppFolderFormat,
+ &KDmDefaultDir()[3],
+ aClientApp->AppUid() );
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::DownloadInfoFolder
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::DownloadInfoFolder(
+ const CHttpClientApp* aClientApp,
+ TDes& aFolder ) const
+ {
+ _LIT( KDownloadFolderFormat, "%S%x\\%S\\" );
+
+ aFolder.Format( KDownloadFolderFormat,
+ &KDmDefaultDir,
+ aClientApp->AppUid(),
+ &KInfoFilesDirName );
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::DownloadInfoFolder
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::CODDownloadInfoFolder(
+ const CHttpClientApp* aClientApp,
+ TDes& aFolder ) const
+ {
+ _LIT( KDownloadFolderFormat, "%S%x\\%S\\" );
+
+ aFolder.Format( KDownloadFolderFormat,
+ &KDmDefaultDir,
+ aClientApp->AppUid(),
+ &KInfoFilesCodDirName );
+ }
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::DownloadInfoFolder
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::DownloadContentFolder(
+ const CHttpClientApp* aClientApp,
+ TDes& aFolder ) const
+ {
+ _LIT( KDownloadFolderFormat, "%S%x\\%S\\" );
+
+ aFolder.Format( KDownloadFolderFormat,
+ &KDmDefaultDir,
+ aClientApp->AppUid(),
+ &KContentsDirName );
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::DownloadInfoFolder
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CHttpDownloadManagerServerEngine::CodFolder(
+ const CHttpClientApp* aClientApp,
+ TDes& aFolder ) const
+ {
+ _LIT( KDownloadFolderFormat, "%S%x\\%S\\" );
+
+ aFolder.Format( KDownloadFolderFormat,
+ &KDmDefaultDir,
+ aClientApp->AppUid(),
+ &KCodsDirName );
+ }
+
+#ifdef DEAD_CODE
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::AllDownloadsL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CArrayPtrFlat<CHttpDownload>*
+ CHttpDownloadManagerServerEngine::AllDownloadsL() const
+ {
+ CArrayPtrFlat<CHttpDownload>* downloads =
+ new (ELeave) CArrayPtrFlat<CHttpDownload>(2);
+
+ CleanupStack::PushL( downloads );
+
+ for( TInt apps = 0; apps < iClientApps->Count(); ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* allDownloads = (*iClientApps)[apps]->Downloads();
+
+ for( TInt i = 0; i < allDownloads->Count(); ++i )
+ {
+ downloads->AppendL( (*allDownloads)[i] );
+ }
+ }
+ CleanupStack::Pop( downloads );
+
+ return downloads;
+ }
+#endif
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::Fs
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RFs& CHttpDownloadManagerServerEngine::Fs()
+ {
+ return iRfs;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::SocketServ
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RSocketServ& CHttpDownloadManagerServerEngine::SocketServ()
+ {
+ return iSocketServ;
+ }
+
+// -----------------------------------------------------------------------------
+// CHttpDownloadManagerServerEngine::NextDownloadId
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CHttpDownloadManagerServerEngine::NextDownloadId()
+ {
+ return iNextDownloadId++;
+ }
+
+//------------------------------------------------------------------------
+//CHttpDownloadManagerServerEngine::MMCModeChanged
+//------------------------------------------------------------------------
+void CHttpDownloadManagerServerEngine::MMCModeChanged( TBool aMmcPresent )
+ {
+ for( TInt apps = 0; apps < iClientApps->Count(); ++apps )
+ {
+ CArrayPtrFlat<CHttpDownload>* allDownloads = (*iClientApps)[apps]->Downloads();
+
+ for( TInt i = 0; i < allDownloads->Count(); ++i )
+ {
+ QueryMMCUniqueId();
+
+ if( aMmcPresent )
+ {
+ (*allDownloads)[i]->MediaInserted( iMMCUniqueID );
+ }
+ else
+ {
+ (*allDownloads)[i]->MediaRemoved( iMMCUniqueID );
+ }
+ }
+ }
+ }
+
+//------------------------------------------------------------------------
+//CHttpDownloadManagerServerEngine::MMCModeChanged
+//------------------------------------------------------------------------
+void CHttpDownloadManagerServerEngine::QueryMMCUniqueId()
+ {
+ //
+ // Query the MMC's or Default Removable Mass Storage unique id
+ //
+ TInt drive( 0 );
+#ifdef RD_MULTIPLE_DRIVE
+ DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, drive );
+#else
+ iRfs.CharToDrive( 'E', drive );
+#endif
+
+ TVolumeInfo info;
+
+ if( iRfs.Volume( info, drive ) == KErrNone )
+ {
+ iMMCUniqueID = info.iUniqueID;
+ }
+ else
+ {
+ iMMCUniqueID = (TUint)KErrNotFound;
+ }
+
+
+ CLOG_WRITE_1( "MMC id: %d", iMMCUniqueID );
+ }
+
+#ifdef RD_MULTIPLE_DRIVE
+//------------------------------------------------------------------------
+//CHttpDownloadManagerServerEngine::QueryDynDriveListLC
+//------------------------------------------------------------------------
+HBufC8* CHttpDownloadManagerServerEngine::QueryDynDriveListLC()
+ {
+ TDriveList driveList;
+ TInt driveCount( 0 );
+ TInt err;
+ TChar driveLetter;
+ TBuf8<KMaxDriveListStrLen> driveLettersDyn;
+
+ // Checking validity of drives in Cenrep List
+ // drive letters are separated by semicolons
+ // Destination is FFS in default
+ TInt drive;
+ User::LeaveIfError(
+ DriveInfo::GetDefaultDrive( DriveInfo::EDefaultPhoneMemory, drive ) );
+
+ for( TInt i = 0; i < iDriveLettersCenRep.Length(); i = i + 2 )
+ {
+ if( iRfs.CharToDrive( iDriveLettersCenRep[i], drive ) == KErrNone )
+ {
+ TUint status;
+ if ( DriveInfo::GetDriveStatus( iRfs, drive, status ) == KErrNone )
+ {
+ if ( ( status & ( DriveInfo::EDriveUserVisible | DriveInfo::EDrivePresent ) ) )
+ {
+ CLOG_WRITE_1( "Drive %d is present and visible", drive);
+ }
+ }
+ }
+ }
+
+ if ( iDriveLettersCenRep.Length() > 0 )
+ {
+ driveLettersDyn.Append( iDriveLettersCenRep );
+ if ( driveLettersDyn[driveLettersDyn.Length() - 1] != ';' )
+ {
+ driveLettersDyn.Append( KDefaultDriveListSep );
+ }
+ }
+
+ // get the list of drives available in real time
+ err = DriveInfo::GetUserVisibleDrives( iRfs, driveList, driveCount );
+ if ( err == KErrNone )
+ {
+ TInt count( driveList.Length() );
+ for ( TInt i( 0 ); i < count; ++i )
+ {
+ if ( driveList[ i ] )
+ {
+ User::LeaveIfError( iRfs.DriveToChar( i, driveLetter) );
+ TInt drivePos = driveLettersDyn.LocateF( driveLetter );
+ if ( drivePos == KErrNotFound )
+ {
+ driveLettersDyn.Append( driveLetter );
+ driveLettersDyn.Append( KDefaultDriveListSep );
+ }
+ }
+ }
+
+ CLOG_WRITE_1( "Pref. drive list dynamic: [%S]", &driveLettersDyn );
+ }
+ else
+ {
+ CLOG_WRITE_1( "GetUserVisibleDrives failed with %d", err );
+ }
+
+ HBufC8* driveLetters = HBufC8::NewLC( KMaxDriveListStrLen );
+ driveLetters->Des().Copy( driveLettersDyn );
+ return driveLetters;
+ }
+#endif
+
+//------------------------------------------------------------------------
+//CHttpDownloadManagerServerEngine::QueryDriveList
+//------------------------------------------------------------------------
+void CHttpDownloadManagerServerEngine::QueryDriveListL()
+ {
+ CRepository* repository = CRepository::NewLC( KCRUidBrowser );
+
+ if( repository->Get(KBrowserDrivePrefListForDownloadedContent, iDriveLettersCenRep) != KErrNone )
+ {
+ CLOG_WRITE( "Drive list not found" );
+ iDriveLettersCenRep.Copy( KDefaultDriveList );
+ }
+
+ CLOG_WRITE_1( "Pref. drive list: [%S]", &iDriveLettersCenRep );
+
+ CleanupStack::PopAndDestroy( repository );
+ }
+
+//------------------------------------------------------------------------
+//CHttpDownloadManagerServerEngine::DocHandler
+//------------------------------------------------------------------------
+CDocumentHandler* CHttpDownloadManagerServerEngine::DocHandler() const
+ {
+ return iDocHandler;
+ }
+
+// End of File