appinstaller/AppMngr2/src/appmngr2model.cpp
changeset 80 9dcba1ee99f7
parent 77 d1838696558c
--- a/appinstaller/AppMngr2/src/appmngr2model.cpp	Thu Oct 14 14:11:30 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,839 +0,0 @@
-/*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "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:   Model implementation
-*
-*/
-
-
-#include "appmngr2model.h"              // CAppMngr2Model
-#include "appmngr2modelobserver.h"      // CAppMngr2ModelObserver
-#include "appmngr2infomaker.h"          // CAppMngr2InfoMaker
-#include "appmngr2appinfomaker.h"       // CAppMngr2AppInfoMaker
-#include "appmngr2packageinfomaker.h"   // CAppMngr2PackageInfoMaker
-#include "appmngr2appinfoarray.h"       // CAppMngr2AppInfoArray
-#include "appmngr2packageinfoarray.h"   // CAppMngr2PackageInfoArray
-#include "appmngr2scanner.h"            // CAppMngr2Scanner
-#include "appmngr2pluginholder.h"       // CAppMngr2PluginHolder
-#include <appmngr2runtime.h>            // CAppMngr2Runtime
-#include <appmngr2infobase.h>           // CAppMngrInfoBase
-#include <appmngr2appinfo.h>            // CAppMngr2AppInfo
-#include <appmngr2packageinfo.h>        // CAppMngr2PackageInfo
-#include <appmngr2recognizedfile.h>     // CAppMngr2RecognizedFile
-#include <appmngr2cleanuputils.h>       // CleanupResetAndDestroyPushL
-#include <appmngr2driveutils.h>         // TAppMngr2DriveUtils
-#include <appmngr2common.hrh>           // generic command ids
-#include <ecom/implementationinformation.h>  // CImplementationInformation
-#include <ecom/ecom.h>                  // REComSession
-#include <AknIconArray.h>               // CAknIconArray
-#include <gulicon.h>                    // CGulIcon
-#include <driveinfo.h>                  // DriveInfo
-#include <pathinfo.h>                   // Pathinfo
-#include <centralrepository.h>          // CRepository
-#include <SWInstallerInternalCRKeys.h>  // KCRUidSWInstallerLV
-#include <AknsUtils.h>                  // AknsUtils
-#include <appmngr2.mbg>                 // icon IDs
-
-_LIT( KAppMngr2BitmapFile, "appmngr2.mif" );
-_LIT( KDriveSpec, "%c:" );
-
-
-// ======== LOCAL FUNCTIONS =========
-
-// ---------------------------------------------------------------------------
-// FindDataType()
-// ---------------------------------------------------------------------------
-//
-TBool FindDataType( const TDataType& aDataType, CDataTypeArray& aArray )
-    {
-    TInt count = aArray.Count();
-    for( TInt index = 0; index < count; index++ )
-        {
-        if( aArray[ index ] == aDataType )
-            {
-            return ETrue;
-            }
-        }
-    return EFalse;
-    }
-
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::NewL()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2Model* CAppMngr2Model::NewL( RFs& aFsSession,
-        MAppMngr2ModelObserver& aObserver )
-    {
-    CAppMngr2Model* self = new (ELeave) CAppMngr2Model( aFsSession, aObserver );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::~CAppMngr2Model()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2Model::~CAppMngr2Model()
-    {
-    FLOG( "CAppMngr2Model::~CAppMngr2Model" );
-    iClosing = ETrue;   // to disable notifications
-
-    Cancel();
-    delete iApaAppListNotifier;
-    iInfoMakers.ResetAndDestroy();
-    delete iScanner;
-    delete iInstalledApps;
-    delete iInstallationFiles;
-    iPlugins.ResetAndDestroy();     // unloads plugin DLLs
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::AppInfoCount()
-// ---------------------------------------------------------------------------
-//
-TInt CAppMngr2Model::AppInfoCount() const
-    {
-    return iInstalledApps->Count();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::AppInfo()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2AppInfo& CAppMngr2Model::AppInfo( TInt aIndex ) const
-    {
-    return *( reinterpret_cast< CAppMngr2AppInfo* >( iInstalledApps->At( aIndex ) ) );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::PackageInfoCount()
-// ---------------------------------------------------------------------------
-//
-TInt CAppMngr2Model::PackageInfoCount() const
-    {
-    return iInstallationFiles->Count();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::PackageInfo()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2PackageInfo& CAppMngr2Model::PackageInfo( TInt aIndex ) const 
-    {
-    return *( reinterpret_cast< CAppMngr2PackageInfo* >( iInstallationFiles->At( aIndex ) ) );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::LoadIconsL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::LoadIconsL( CAknIconArray& aIconArray )
-    {
-    LoadDefaultIconsL( aIconArray );
-    
-    TInt pluginCount = iPlugins.Count();
-    for( TInt index = 0; index < pluginCount; index++ )
-        {
-        iPlugins[ index ]->LoadIconsL( aIconArray );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::GetIconIndexesL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::GetIconIndexesL( TUid aUid, TInt& aIconIndexBase, TInt& aIconIndexMax ) const
-    {
-    TInt pluginCount = iPlugins.Count();
-    for( TInt index = 0; index < pluginCount; index++ )
-        {
-        if( iPlugins[ index ]->Runtime().RuntimeUid() == aUid )
-            {
-            aIconIndexBase = iPlugins[ index ]->IconIndexBase();
-            aIconIndexMax = iPlugins[ index ]->IconIndexMax();
-            return;
-            }
-        }
-    User::Leave( KErrNotFound );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::HandleCommandL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::HandleCommandL( CAppMngr2InfoBase& aInfo, TInt aCommand )
-    {
-    FLOG( "CAppMngr2Model::HandleCommandL( %d ), IsActive() = %d", aCommand, IsActive() );
-    
-    if( !IsActive() )
-        {
-        // About to start plugin specific command. Note that when the command completes
-        // we need to call CAppMngr2InfoBase::CommandComplete() function. For this (and
-        // to indicate that there is a plugin specific command on-going) we take the
-        // address of CAppMngr2InfoBase item into iActiveItem. Because plugin specific
-        // command (like delete or uninstall) may trigger new scanning, it is necessary
-        // to disable iInstalledApps and iInstallationFiles array refreshing temporarily.
-        // When refreshing is disabled, the item which address is stored in iActiveItem
-        // is maintained in arrays and we can call iActiveItem->CommandComplete() when
-        // the command is complete. If arrays could be refreshed during plugin specific
-        // command, then calling iActiveItem->CommandComplete() would panic.
-        if( iObs.InstalledAppsDisplayed() )
-            {
-            iInstalledApps->DisableRefreshNotificationsL();
-            }
-        if( iObs.InstallationFilesDisplayed() )
-            {
-            iInstallationFiles->DisableRefreshNotificationsL();
-            }
-
-        iActiveItem = &aInfo;
-        iActiveCommand = aCommand;
-        FLOG( "CAppMngr2Model::HandleCommandL, iActiveItem = 0x%08x '%S'",
-                iActiveItem, &( iActiveItem->Name() ) ); 
-        TRAPD( err, iActiveItem->HandleCommandL( aCommand, iStatus ) );
-        FLOG( "CAppMngr2Model::HandleCommandL, command started, err = %d", err );
-        SetActive();
-        if( err )
-            {
-            TRequestStatus* statusPtr = &iStatus;
-            User::RequestComplete( statusPtr, err );
-            }
-        }
-    // Ignore the command silently if already active. This may happen when user
-    // cancels previous installation command. Because cancelling installation can
-    // take long time, user may be able to issue new commands while model is still
-    // active (i.e. previous installation command is being cancalled).
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::StartFetchingInstallationFilesL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::StartFetchingInstallationFilesL()
-    {
-    FLOG( "CAppMngr2Model::StartFetchingInstallationFilesL" );
-    FLOG_PERF_START( FetchInstallationFiles )
-    
-    // Installation files cache must be enabled until scanner has completed.
-    // This ensures that scanner has time to call GetInstallationFilesL() for
-    // each plugin and for each directory before the first call completes.
-    // If the first call completes before scanner has made all these requets,
-    // cache will be turned off and partial results are displayed.
-    iInstallationFiles->IncrementCacheUseStartingNewRoundL();
-
-    iScanner->StartScanningL();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::StartFetchingInstalledAppsL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::StartFetchingInstalledAppsL()
-    {
-    FLOG( "CAppMngr2Model::StartFetchingInstalledAppsL" );
-    FLOG_PERF_START( FetchInstalledApps )
-
-    // Additional cache increment to ensure that iInstalledApps cache is
-    // used until GetInstalledAppsL() function is called for each plugin.
-    // Without this, the fastest plugin might get it's list complete before
-    // other IncrementCacheUseL() calls and iInstalledApps would display
-    // partial list.
-    iInstalledApps->IncrementCacheUseStartingNewRoundL();
-    
-    TInt pluginCount = iPlugins.Count();
-    for( TInt pluginIndex = 0; pluginIndex < pluginCount; pluginIndex++ )
-        {
-        CAppMngr2AppInfoMaker* appInfoMaker = CAppMngr2AppInfoMaker::NewLC(
-                iPlugins[ pluginIndex ]->Runtime(), *this, iFs );
-        
-        TRAPD( err, appInfoMaker->StartGettingInstalledAppsL() );
-        FLOG( "CAppMngr2Model::StartFetchingInstalledAppsL, plugin 0x%08x, err = %d",
-                iPlugins[ pluginIndex ]->Runtime().RuntimeUid().iUid, err );
-        if( err == KErrNone )
-            {
-            iInfoMakers.AppendL( appInfoMaker );
-            CleanupStack::Pop( appInfoMaker );
-            iInstalledApps->IncrementCacheUseL();
-            }
-        else
-            {
-            CleanupStack::PopAndDestroy( appInfoMaker );
-            }
-        }
-
-    // All GetInstalledAppsL() requests have been issued
-    iInstalledApps->DecrementCacheUse();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::DoCancel()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::DoCancel()
-    {
-    FLOG( "CAppMngr2Model::DoCancel, iActiveItem = 0x%08x", iActiveItem );
-    
-    if( iActiveItem )
-        {
-        iActiveItem->CancelCommand();
-        iActiveItem = NULL;
-        if( !iClosing )
-            {
-            TRAP_IGNORE( iInstalledApps->EnableRefreshNotificationsL() );
-            TRAP_IGNORE( iInstallationFiles->EnableRefreshNotificationsL() );
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::RunL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::RunL()
-    {
-    FLOG( "CAppMngr2Model::RunL, iActiveItem = 0x%08x, iStatus = %d",
-            iActiveItem, iStatus.Int() );
-
-    if( iActiveItem )
-        {
-        TInt completionCode = iStatus.Int();
-        TRAPD( err, iActiveItem->HandleCommandResultL( completionCode ) );
-        FLOG( "CAppMngr2Model::RunL, HandleCommandResultL err = %d", err );
-        CAppMngr2InfoBase* itemToDelete = iActiveItem;
-        iActiveItem = NULL;
-
-        // Enable refresh notifications. No need to check which view is active
-        // because notifications can be enabled even if they were not disabled.
-        iInstalledApps->EnableRefreshNotificationsL();
-        iInstallationFiles->EnableRefreshNotificationsL();
-
-        // Leave on error. This displays error note (if error notes are enabled).
-        User::LeaveIfError( err );
-        
-        // If the command is EAppMngr2CmdUninstall or EAppMngr2CmdRemove, and it
-        // completed without errors, then we remove the current item immediatelty
-        // from the displayed list. Otherwise it may take quite long time until
-        // the item is removed from the UI, and in worst case it may not be removed
-        // at all.
-        // For example when an installation file is deleted, scanner notices change
-        // in directories and re-scans everything. UI is updated when the scanning
-        // completes. Delay between delete command and UI update (deleted item is
-        // removed from UI) depends on how quickly scanning completes.
-        if( completionCode == KErrNone )
-            {
-            if( iActiveCommand == EAppMngr2CmdUninstall && iObs.InstalledAppsDisplayed() )
-                {
-                iInstalledApps->ImmediateDelete( itemToDelete );
-                }
-            if( iActiveCommand == EAppMngr2CmdRemove && iObs.InstallationFilesDisplayed() )
-                {
-                iInstallationFiles->ImmediateDelete( itemToDelete );
-                }
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::RefreshInstalledApps()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::RefreshInstalledApps()
-    {
-    FLOG( "CAppMngr2Model::RefreshInstalledApps" );
-    
-    TRAP_IGNORE( StartFetchingInstalledAppsL() );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::RefreshInstallationFiles()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::RefreshInstallationFiles()
-    {
-    FLOG( "CAppMngr2Model::RefreshInstallationFiles" );
-
-    TRAP_IGNORE( StartFetchingInstallationFilesL() );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::ScanningResultL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::ScanningResultL( RPointerArray<CAppMngr2RecognizedFile>& aResult )
-    {
-    FLOG( "CAppMngr2Model::ScanningResultL, begin: aResult.Count() = %d", aResult.Count() );
-    
-    // Split recognition result array into smaller (plugin specific) arrays. Plugin
-    // specific arrays are maintained by CAppMngr2PackageInfoMaker objects, so one
-    // CAppMngr2PackageInfoMaker object is needed for each plugin that has recognized
-    // files.
-    TInt pluginCount = iPlugins.Count();
-    for( TInt pluginIndex = 0; pluginIndex < pluginCount; pluginIndex++ )
-        {
-        CAppMngr2PackageInfoMaker* packageInfoMaker = CAppMngr2PackageInfoMaker::NewLC(
-                iPlugins[ pluginIndex ]->Runtime(), *this, iFs );
-
-        TInt fileCount = 0;
-        TInt resultCount = aResult.Count();
-        for( TInt resultIndex = resultCount - 1; resultIndex >= 0; resultIndex-- )
-            {
-            CAppMngr2RecognizedFile* recFile = aResult[ resultIndex ];
-            if( FindDataType( recFile->DataType(), iPlugins[ pluginIndex ]->DataTypes() ) )
-                {
-                packageInfoMaker->AddFileL( recFile );  // takes ownership
-                aResult.Remove( resultIndex );
-                fileCount++;
-                }
-            }
-
-        FLOG( "CAppMngr2Model::ScanningResultL, plugin 0x%08x: fileCount = %d",
-                iPlugins[ pluginIndex ]->Runtime().RuntimeUid().iUid, fileCount );
-        if( fileCount > 0 )
-            {
-            packageInfoMaker->StartGettingInstallationFilesL();
-            iInfoMakers.AppendL( packageInfoMaker );
-            CleanupStack::Pop( packageInfoMaker );
-            iInstallationFiles->IncrementCacheUseL();
-            }
-        else
-            {
-            CleanupStack::PopAndDestroy( packageInfoMaker );
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::ScanningComplete()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::ScanningComplete()
-    {
-    FLOG( "CAppMngr2Model::ScanningComplete" );
-    
-    iInstallationFiles->DecrementCacheUse();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::DirectoryChangedL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::DirectoryChangedL( const TDesC& /*aChangedDir*/ )
-    {
-    FLOG( "CAppMngr2Model::DirectoryChangedL" );
-    
-    // This might be improved by scanning the changed directory only. Model
-    // could record which items are got from which directory, so that it could
-    // remove those items that were created from the changed directory and
-    // re-scan only the changed directory. Scanner should also support
-    // scanning one directory only. Now, we just scan all again.
-    StartFetchingInstallationFilesL();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::HandleAppListEvent()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::HandleAppListEvent( TInt /*aEvent*/ )
-    {
-    FLOG( "CAppMngr2Model::HandleAppListEvent" );
-    
-    TRAP_IGNORE( StartFetchingInstalledAppsL() );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::NewAppsCreatedL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::NewAppsCreatedL( const CAppMngr2InfoMaker& aMaker,
-        RPointerArray<CAppMngr2AppInfo>& aAppInfos )
-    {
-    FLOG( "CAppMngr2Model::NewAppsCreatedL, plugin 0x%08x: packageCount = %d",
-            aMaker.RuntimeUid().iUid, aAppInfos.Count() );
-    
-    iInstalledApps->AddItemsInOrderL( aAppInfos );
-    iInstalledApps->DecrementCacheUse();
-    CloseInfoMaker( aMaker );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::ErrorInCreatingAppsL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::ErrorInCreatingAppsL( const CAppMngr2InfoMaker& aMaker,
-#ifdef FLOG_DEBUG_TRACES
-        TInt aError )
-#else
-        TInt /*aError*/ )
-#endif
-    {
-    FLOG( "CAppMngr2Model::ErrorInCreatingAppsL, plugin 0x%08x: error = %d",
-            aMaker.RuntimeUid().iUid, aError );
-    
-    iInstalledApps->DecrementCacheUse();
-    CloseInfoMaker( aMaker );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::NewPackagesCreatedL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::NewPackagesCreatedL( const CAppMngr2InfoMaker& aMaker,
-            RPointerArray<CAppMngr2PackageInfo>& aPackageInfos )
-    {
-    FLOG( "CAppMngr2Model::NewPackagesCreatedL, plugin 0x%08x: packageCount = %d",
-            aMaker.RuntimeUid().iUid, aPackageInfos.Count() );
-    
-    iInstallationFiles->AddItemsInOrderL( aPackageInfos );
-    iInstallationFiles->DecrementCacheUse();
-    CloseInfoMaker( aMaker );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::ErrorInCreatingPackagesL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::ErrorInCreatingPackagesL( const CAppMngr2InfoMaker& aMaker,
-#ifdef FLOG_DEBUG_TRACES
-        TInt aError )
-#else
-        TInt /*aError*/ )
-#endif
-    {
-    FLOG( "CAppMngr2Model::ErrorInCreatingPackagesL, plugin 0x%08x: error = %d",
-            aMaker.RuntimeUid().iUid, aError );
-    
-    iInstallationFiles->DecrementCacheUse();
-    CloseInfoMaker( aMaker );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::ArrayContentChanged()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::ArrayContentChanged( CAppMngr2InfoArray* aArray,
-        TInt aMoreRefreshesExpected )
-    {
-    if( aArray == iInstalledApps )
-        {
-        FLOG_PERF_STOP( FetchInstalledApps )
-        FLOG_PERF_PRINT( FetchInstalledApps )
-        iObs.InstalledAppsChanged( aMoreRefreshesExpected );
-        }
-    if( aArray == iInstallationFiles )
-        {
-        FLOG_PERF_STOP( FetchInstallationFiles )
-        FLOG_PERF_PRINT( FetchInstallationFiles )
-        iObs.InstallationFilesChanged( aMoreRefreshesExpected );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::CAppMngr2Model()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2Model::CAppMngr2Model( RFs& aFsSession, MAppMngr2ModelObserver& aObserver )
-        : CActive( CActive::EPriorityStandard ), iFs( aFsSession ), iObs( aObserver )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::ConstructL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::ConstructL()
-    {
-    FLOG( "CAppMngr2Model::ConstructL" );
-    iClosing = EFalse;
-
-    iInstalledApps = CAppMngr2AppInfoArray::NewL( *this );
-    iInstallationFiles = CAppMngr2PackageInfoArray::NewL( *this );
-    
-    FLOG_PERF_STATIC_BEGIN( LoadPluginsL )
-    LoadPluginsL();
-    FLOG_PERF_STATIC_END( LoadPluginsL )
-    FLOG_PERF_STATIC_BEGIN( CreateScannerL )
-    CreateScannerL();
-    FLOG_PERF_STATIC_END( CreateScannerL )
-    FLOG_PERF_STATIC_BEGIN( FetchDataTypesL )
-    FetchDataTypesL();
-    FLOG_PERF_STATIC_END( FetchDataTypesL )
-
-    // start monitoring changes in applications list
-    iApaAppListNotifier = CApaAppListNotifier::NewL( this, CActive::EPriorityStandard );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::LoadDefaultIconsL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::LoadDefaultIconsL( CAknIconArray& aIconArray )
-    {
-    FLOG( "CAppMngr2Model::LoadDefaultIconsL" );
-    
-    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
-    HBufC* bitmapFile = TAppMngr2DriveUtils::FullBitmapFileNameLC( KAppMngr2BitmapFile, iFs );
-    CFbsBitmap* bitmap = NULL;
-    CFbsBitmap* mask = NULL;
-    CGulIcon* icon = NULL;
-    
-    // Note that icons can be graphically-skinned (icon graphic defined in theme)
-    // or color-skinned (icon colors change depending on background color defined
-    // in theme). Normal icons are graphically-skinned and indicator icons are
-    // color-skinned. AknsUtils::CreateGulIconL() creates graphically-skinned icons,
-    // and AknsUtils::CreateColorIconL() creates color-skinned icons. Hence both
-    // of these functions are used below.
-
-    // Icon 0: EAppMngr2IconIndex_QgnIndiAmInstMmcAdd
-    // Indicator icon for items stored/installed in memory card
-    AknsUtils::CreateColorIconLC( skinInstance, 
-            KAknsIIDQgnIndiMmcAdd, KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG13,
-            bitmap, mask, *bitmapFile, 
-            EMbmAppmngr2Qgn_indi_mmc_add,
-            EMbmAppmngr2Qgn_indi_mmc_add_mask,
-            KRgbBlack );
-    icon = CGulIcon::NewL( bitmap, mask );
-    icon->SetBitmapsOwnedExternally( EFalse );
-    CleanupStack::Pop( 2 );   // bitmap and mask, order is varying
-    CleanupStack::PushL( icon );
-    aIconArray.AppendL( icon );
-    CleanupStack::Pop( icon );
-
-    // Icon 1: EAppMngr2IconIndex_QgnIndiFmgrMsAdd
-    // Indicator icon for items stored/installed in mass memory
-    AknsUtils::CreateColorIconLC( skinInstance, 
-            KAknsIIDQgnIndiFmgrMsAdd, KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG13,
-            bitmap, mask, *bitmapFile, 
-            EMbmAppmngr2Qgn_indi_fmgr_ms_add,
-            EMbmAppmngr2Qgn_indi_fmgr_ms_add_mask,
-            KRgbBlack );
-    icon = CGulIcon::NewL( bitmap, mask );
-    icon->SetBitmapsOwnedExternally( EFalse );
-    CleanupStack::Pop( 2 );   // bitmap and mask, order may vary
-    CleanupStack::PushL( icon );
-    aIconArray.AppendL( icon );
-    CleanupStack::Pop( icon );
-
-    // Icon 2: EAppMngr2IconIndex_QgnPropUnknown
-    // List icon for items that are not known
-    icon = AknsUtils::CreateGulIconL( skinInstance,
-            KAknsIIDQgnPropUnknown, *bitmapFile,
-            EMbmAppmngr2Qgn_prop_unknown, 
-            EMbmAppmngr2Qgn_prop_unknown_mask );
-    CleanupStack::PushL( icon );
-    aIconArray.AppendL( icon );
-    CleanupStack::Pop( icon );
-
-    CleanupStack::PopAndDestroy( bitmapFile );
-    
-    // Additionally some unknown indicator icon could be defined.
-    // Now, if some plugin gives incorrect index fox indicator icon,
-    // then no indicator icon is displayed.
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::LoadPluginsL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::LoadPluginsL()
-    {
-    FLOG( "CAppMngr2Model::LoadPluginsL" );
-    
-    RImplInfoPtrArray implInfoArray;
-    CleanupResetAndDestroyPushL( implInfoArray  );
-    REComSession::ListImplementationsL( KAppMngr2PluginInterface, implInfoArray );
-
-    CAppMngr2PluginHolder* pluginHolder = NULL;
-    CImplementationInformation* implInfo;
-    TInt count = implInfoArray.Count();
-    for( TInt index = 0; index < count; index++ )
-        {
-        implInfo = implInfoArray[ index ];
-        FLOG( "CAppMngr2Model::LoadPluginsL, loading %S", &( implInfo->DisplayName() ) );
-        FLOG_PERF_STATIC_BEGIN( DoLoadPluginL );
-        TRAPD( err, pluginHolder = DoLoadPluginL( implInfo->ImplementationUid() ) );
-        FLOG_PERF_STATIC_END( DoLoadPluginL );
-        FLOG( "CAppMngr2Model::DoLoadPluginL( 0x%08x ), err = %d",
-                implInfo->ImplementationUid().iUid, err );
-        if( err == KErrNone )
-            {
-            CleanupStack::PushL( pluginHolder );
-            iPlugins.AppendL( pluginHolder );
-            CleanupStack::Pop( pluginHolder );
-            }
-        }
-
-    CleanupStack::PopAndDestroy( &implInfoArray );
-    REComSession::FinalClose();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::DoLoadPluginL()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2PluginHolder* CAppMngr2Model::DoLoadPluginL( TUid aUid )
-    {
-    CAppMngr2Runtime* plugin = CAppMngr2Runtime::NewL( aUid, *this );
-    CleanupStack::PushL( plugin );
-    CAppMngr2PluginHolder* holder = new (ELeave) CAppMngr2PluginHolder( plugin );
-    CleanupStack::Pop( plugin );
-    return holder;
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::CreateScannerL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::CreateScannerL()
-    {
-    iScanner = CAppMngr2Scanner::NewL( *this );
-
-    TDriveList driveList;
-    TInt driveCount = 0;
-    TInt err = DriveInfo::GetUserVisibleDrives( iFs, driveList, driveCount );
-    User::LeaveIfError( err );
-
-    // Default directories
-    TFileName path;
-    TInt driveListLength = driveList.Length();
-    for( TInt driveNumber = 0; driveNumber < driveListLength; driveNumber++ )
-        {
-        if( driveList[ driveNumber ] )
-            {
-            TUint driveStatus = 0;
-            err = DriveInfo::GetDriveStatus( iFs, driveNumber, driveStatus );
-            User::LeaveIfError( err );
-
-            if( !( driveStatus & DriveInfo::EDriveRemote ) )
-                {
-                err = PathInfo::GetFullPath( path, driveNumber, PathInfo::EInstallsPath );
-                User::LeaveIfError( err );
-                iScanner->AddDirectoryL( path );
-                }
-            }
-        }
-
-    // Additional plug-in specific directories
-    TInt pluginCount = iPlugins.Count();
-    for( TInt pluginIndex = 0; pluginIndex < pluginCount; pluginIndex++ )
-        {
-        RPointerArray<HBufC> dirsToScan;
-        CleanupResetAndDestroyPushL( dirsToScan );
-        TRAPD( err, iPlugins[ pluginIndex ]->Runtime().GetAdditionalDirsToScanL( iFs,
-                dirsToScan ) );
-        if( err == KErrNone )
-            {
-            TInt dirCount = dirsToScan.Count();
-            for( TInt dirIndex = 0; dirIndex < dirCount; dirIndex++ )
-                {
-                TPtrC dirName = *( dirsToScan[ dirIndex ] );
-                iScanner->AddDirectoryL( dirName );
-                }
-            }
-        CleanupStack::PopAndDestroy( &dirsToScan );
-        }
-    
-    // KSWInstallerPackageFolder directory if defined in CenRep
-    CRepository* cenrep = CRepository::NewLC( KCRUidSWInstallerLV );
-    err = cenrep->Get( KSWInstallerPackageFolder, path );
-    CleanupStack::PopAndDestroy( cenrep );
-    if( err == KErrNone )
-        {
-        TParsePtr parse( path );
-        if( parse.DrivePresent() )
-            {
-            iScanner->AddDirectoryL( path );
-            }
-        else if( parse.PathPresent() )
-            {
-            TDriveList driveList;
-            TInt driveCount = 0;
-            err = DriveInfo::GetUserVisibleDrives( iFs, driveList, driveCount );
-            if( err == KErrNone )
-                {
-                TInt driveListLength = driveList.Length();
-                for( TInt driveNumber = 0; driveNumber < driveListLength; driveNumber++ )
-                    {
-                    if( driveList[ driveNumber ] )
-                        {
-                        TUint driveStatus = 0;
-                        err = DriveInfo::GetDriveStatus( iFs, driveNumber, driveStatus );
-                        if( err == KErrNone && !( driveStatus & DriveInfo::EDriveRemote ) )
-                            {
-                            TChar driveLetter;
-                            if( RFs::DriveToChar( driveNumber, driveLetter ) == KErrNone )
-                                {
-                                TFileName fullPath;
-                                fullPath.Format( KDriveSpec, static_cast<TUint>( driveLetter ) );
-                                fullPath.Append( path ); 
-                                iScanner->AddDirectoryL( fullPath );
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        else
-            {
-            // ignore empty values, and values that does not contain valid path
-            }
-        }
-    else
-        {
-        if( err != KErrNotFound )
-            {
-            User::Leave( err );
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::FetchDataTypesL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::FetchDataTypesL()
-    {
-    FLOG( "CAppMngr2Model::FetchDataTypesL" );
-    
-    TInt pluginCount = iPlugins.Count();
-    for( TInt pluginIndex = 0; pluginIndex < pluginCount; pluginIndex++ )
-        {
-        FLOG( "CAppMngr2Model::FetchDataTypesL: pluginIndex = %d", pluginIndex );
-        TRAP_IGNORE( iPlugins[ pluginIndex ]->FetchDataTypesL() );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2Model::CloseInfoMaker()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2Model::CloseInfoMaker( const CAppMngr2InfoMaker& aMaker )
-    {
-    const CAppMngr2InfoMaker* makerToClose = &aMaker;
-    for( TInt index = iInfoMakers.Count() - 1; index >= 0; index-- )
-        {
-        CAppMngr2InfoMaker* maker = iInfoMakers[ index ]; 
-        if( maker == makerToClose )
-            {
-            iInfoMakers.Remove( index );
-            delete maker;
-            break;
-            }
-        }
-    }
-