diff -r 6e7b00453237 -r d17dc5398051 appinstaller/AppinstUi/Daemon/Src/daemonbehaviour.cpp --- a/appinstaller/AppinstUi/Daemon/Src/daemonbehaviour.cpp Thu May 27 12:58:35 2010 +0300 +++ b/appinstaller/AppinstUi/Daemon/Src/daemonbehaviour.cpp Fri Jun 11 13:45:18 2010 +0300 @@ -18,9 +18,8 @@ #include #include #include -#include //RApaSession -//TODO enable apparc support -//#include //TAppInfo +#include // RApaSession +#include // TApaAppUpdateInfo #include "daemonbehaviour.h" #include "swispubsubdefs.h" @@ -31,7 +30,6 @@ using namespace Swi; - // ----------------------------------------------------------------------- // CDaemonBehaviour::NewL // ----------------------------------------------------------------------- @@ -83,11 +81,8 @@ } delete iSisInstaller; iSisInstaller = NULL; - iFs.Close(); - -#ifdef RD_MULTIPLE_DRIVE - iDriveArray.Close(); -#endif + iFs.Close(); + iDriveArray.Close(); } // ----------------------------------------------------------------------- @@ -106,7 +101,7 @@ // void CDaemonBehaviour::MediaChangeL(TInt aDrive, TChangeType aChangeType) { - FLOG_1( _L("Daemon: Media change %d"), aDrive ); + FLOG_1( _L("Daemon: MediaChangeL: Media change %d"), aDrive ); RSisRegistryWritableSession registrySession; User::LeaveIfError( registrySession.Connect() ); @@ -115,20 +110,23 @@ if ( aChangeType==EMediaInserted ) { - FLOG( _L("Daemon: Media inserted") ); - + FLOG( _L("Daemon: MediaChangeL: Media inserted") ); + TInt err = KErrNone; // Notify SCR and AppArc for media change. - UpdateComponentStatusL( aChangeType, aDrive ); + TRAP( err, UpdateComponentStatusL( aChangeType, aDrive ) ); + FLOG_1( _L("Daemon: UpdateComponentStatusL err = %d"), err ); // We need call sis registry since this call will // activate sis registry to clean uninstalled components // from inserted media. - registrySession.AddDriveL(aDrive); + registrySession.AddDriveL( aDrive ); // Scan directory on the card and run pre-installed through SWIS - FLOG( _L("Daemon: Media change: Process preinstalled files") ); - ProcessPreinstalledFilesL(aDrive); - + FLOG( _L("Daemon: MediaChangeL: Process preinstalled files") ); + ProcessPreinstalledFilesL( aDrive ); + FLOG_1( _L("Daemon: MediaChangeL: StartInstalling drive: %d"), aDrive ); + iSisInstaller->StartInstallingL(); + // Add inserted media drive to drive array. if ( iDriveArray.Find(aDrive) == KErrNotFound ) { @@ -137,19 +135,22 @@ } else if (aChangeType==EMediaRemoved) { - FLOG( _L("Daemon: Media removed") ); - + FLOG( _L("Daemon: MediaChangeL: Media removed") ); + TInt err = KErrNone; // Notify SCR and AppArc for media change. - UpdateComponentStatusL( aChangeType, aDrive ); + TRAP( err, UpdateComponentStatusL( aChangeType, aDrive ) ); + FLOG_1( _L("Daemon: UpdateComponentStatusL err = %d"), err ); // Get Installer state. TBool installerRunning = iSisInstaller->IsInstalling(); + FLOG_1( _L("Daemon: MediaChangeL: IsInstalling = %d"), installerRunning ); + FLOG( _L("Daemon: MediaChangeL: Cancel install process") ); // Cancel all requests for install iSisInstaller->Cancel(); // Notify plugin - if(iSwiDaemonPlugin) + if( iSwiDaemonPlugin ) { TInt index = iDriveArray.Find(aDrive); iSwiDaemonPlugin->MediaRemoved(index); @@ -163,22 +164,24 @@ iDriveArray.Remove(index); iDriveArray.Compress(); } - + // Continue installing from other drives if needed. if ( installerRunning ) - { + { + FLOG( _L("Daemon: MediaChangeL: Continue installing other drives") ); // Get count of inserted drives. TInt count = iDriveArray.Count(); - + FLOG_1( _L("Daemon: Drive count = %d"), count ); if ( count ) - { + { + // Find packages for other drives. for(index = 0; index < count; index++ ) { - ProcessPreinstalledFilesL(iDriveArray[index]); - - FLOG_1( _L("Daemon: StartInstallingL for drive: %d"), index); - iSisInstaller->StartInstallingL(); + ProcessPreinstalledFilesL(iDriveArray[index]); } + // Start installing. + FLOG( _L("Daemon: MediaChangeL: StartInstallingL") ); + iSisInstaller->StartInstallingL(); } } } @@ -192,11 +195,10 @@ // void CDaemonBehaviour::ProcessPreinstalledFilesL(TInt aDrive) { + FLOG_1( _L("Daemon: ProcessPreinstalledFilesL: Drive index: %d"), + aDrive ); _LIT( KDaemonPrivatePath,":\\private\\10202dce\\" ); -#ifndef RD_MULTIPLE_DRIVE - iSisInstaller->Cancel(); -#endif // For uninstaller // Set on installing mode. iGeneralProcessStatus = EStateInstalling; @@ -206,7 +208,7 @@ ProcessPreinstalledFilesL(aDrive, KDaemonPrivatePath); iStartNotified = EFalse; iDrive = aDrive; - iSisInstaller->StartInstallingL(); + FLOG( _L("Daemon: ProcessPreInstalledFilesL END") ); } // ----------------------------------------------------------------------- @@ -214,8 +216,7 @@ // ----------------------------------------------------------------------- // void CDaemonBehaviour::ProcessPreinstalledFilesL(TInt aDrive, const TDesC& aDirectory) - { - FLOG_1( _L("Daemon: ProcessPreInstalledFilesL: Drive index: %d"), aDrive ); + { TPath preInstalledPath; TChar drive; RFs::DriveToChar(aDrive, drive); @@ -240,7 +241,8 @@ if(!entry.IsDir()) { TFileName fileName(preInstalledPath); - fileName.Append(entry.iName); + fileName.Append(entry.iName); + // Add files to sis installer. iSisInstaller->AddFileToInstallL(fileName); } } @@ -337,13 +339,12 @@ // CDaemonBehaviour::UpdateComponentStatusL // ----------------------------------------------------------------------- // -void CDaemonBehaviour::UpdateComponentStatusL( - TChangeType aChangeType, - TInt aDrive ) +void CDaemonBehaviour::UpdateComponentStatusL( TChangeType aChangeType, + TInt aDrive ) { FLOG( _L("Daemon: UpdateComponentStatus") ); - Usif::RSoftwareComponentRegistry scrServer; + Usif::RSoftwareComponentRegistry scrServer; User::LeaveIfError( scrServer.Connect() ); CleanupClosePushL( scrServer ); @@ -360,118 +361,178 @@ if ( componentIdList.Count() ) { -// TODO Enabloi AppArcin päivitys. -// TODO Hae TAppInfon headeri includeen. -// RArray appinfoArray; -// CleanupClosePushL( appinfoArray ); - - // Convert the given target drive number to drive letter. + RArray appInfoArray; + CleanupClosePushL( appInfoArray ); + FLOG_1( _L("Daemon: target drive: %d"), aDrive ); + +#ifdef _DEBUG TChar targetDrive; iFs.DriveToChar( aDrive, targetDrive ); - FLOG_1( _L("Daemon: targetDrive: 0x%x"), TUint( targetDrive ) ); + HBufC* tarceBuf = HBufC::NewL( 16 ); + TPtr bufPtr = tarceBuf->Des(); + bufPtr.Append( targetDrive ); + FLOG_1( _L("Daemon: target drive: %S"), &bufPtr ); + delete tarceBuf; +#endif FLOG( _L("Daemon: Check all SCR native components") ); // Check all components in SCR. If media is removed/inserted // change status flag in SCR and in AppArc. for ( TInt index=0; index < componentIdList.Count(); index++ ) - { - Usif::CComponentEntry* entry = Usif::CComponentEntry::NewL(); - CleanupStack::PushL( entry ); - + { Usif::TComponentId componentId( componentIdList[index] ); FLOG_1( _L("Daemon: componentId: %d"), componentId ); - - scrServer.GetComponentL( componentId, - *entry, - Usif::KUnspecifiedLocale ); - -// TODO poista ei tarvetta jos filter toimii. - //if ( entry->SoftwareType() == Usif::KSoftwareTypeNative ) + + // Check that package is not in ROM. If package is in rom + // it can not be removed/not present. + TBool inRom = scrServer.IsComponentOnReadOnlyDriveL( componentId ); + FLOG_1( _L("Daemon: IsComponentOnReadOnlyDriveL: %d"), inRom ); - // Get all component drives. - TDriveList driveList; - driveList = entry->InstalledDrives(); - - TBool isInTargetDrive = EFalse; - - FLOG( _L("Daemon: Check all drives for this component") ); - // Go through all drives which have files for - // this component. - for ( TInt i = 0; i < KMaxDrives; i++ ) - { - if ( driveList[i] != 0 ) - { - TChar installDrive = - static_cast( driveList[i] ); - - FLOG_1( _L("Daemon: driveList index: %d"), i ); - FLOG_1( _L("Daemon: installDrive: 0x%x"), TUint( installDrive ) ); - - if ( targetDrive == installDrive ) - { - // Ok we have files in this target drive. - isInTargetDrive = ETrue; - FLOG( _L("Daemon: SW in target drive.") ); - } - } - } - - // Check if component or part of it is in the media. - if ( isInTargetDrive ) + if ( !inRom ) + { + UpdateStatusL( scrServer, + componentId, + aChangeType, + aDrive, + appInfoArray ); + } + } // for loop + + FLOG_1( _L("Daemon: appInfoArray.Count = %d"), appInfoArray.Count() ); + + // Check do we have updated some application info. + if ( appInfoArray.Count() ) + { + // Update AppArc list after we have all application + // uids/status in array. + FLOG( _L("Daemon: Update AppArc") ); + RApaLsSession appArcSession; + TInt err = appArcSession.Connect(); + FLOG_1( _L("Daemon: appArcSession.Connect err = %d"), err ); + if ( !err ) { - FLOG( _L("Daemon: Set component status to SCR") ); -// TAppInfo appInfo; -// appInfo.iAppUid = componentId; - - if ( aChangeType == EMediaInserted ) - { - // Update component flag to SCR. - scrServer.SetIsComponentPresentL( componentId, - ETrue ); - FLOG( _L("Daemon: Set component present = TRUE") ); - // Set app status for AppArc. AppArc sees this - // as new component. -// appInfo.iAppUid = TAppInfo::ENewApp; - } - else if ( aChangeType==EMediaRemoved ) - { - // Update component flag to SCR. - scrServer.SetIsComponentPresentL( componentId, - EFalse ); - FLOG( _L("Daemon: Set component present = FALSE") ); - // Set app status for AppArc. AppArc sees this - // component as removed. -// appInfo.iAppUid = TAppInfo::ERemoveApp; - } - - // Add component info to array. -// appinfoArray.Append( appInfo ); - } - - CleanupStack::PopAndDestroy( entry ); - entry = NULL; - } // for -//TODO enable AppArc support when TAppInfo is available. -/* - FLOG( _L("Daemon: Set component status to AppArc") ); - // Update AppArc list after we have all components in array. - RApaLsSession appArcSession; - TInt err = appArcSession.Connect(); - if ( !err ) - { - CleanupClosePushL(appArcSession); - appArcSession.UpdateAppListL( appinfoArray ); - CleanupStack::PopAndDestroy(); - } - - CleanupStack::PopAndDestroy( &appinfoArray ); -*/ + CleanupClosePushL( appArcSession ); + FLOG( _L("Daemon: UpdateAppListL") ); + appArcSession.UpdateAppListL( appInfoArray ); + CleanupStack::PopAndDestroy(); // appArcSession + } + } + CleanupStack::PopAndDestroy( &appInfoArray ); } // if componentList.Count() CleanupStack::PopAndDestroy( &componentIdList ); //componentIDList.Close(); CleanupStack::PopAndDestroy( filter ); CleanupStack::PopAndDestroy( &scrServer ); FLOG( _L("Daemon: UpdateComponentStatus END") ); - } + } + +// ----------------------------------------------------------------------- +// CDaemonBehaviour::UpdateStatusL +// ----------------------------------------------------------------------- +// +void CDaemonBehaviour::UpdateStatusL( + Usif::RSoftwareComponentRegistry& aScrServer, + Usif::TComponentId aComponentId, + TChangeType aChangeType, + TInt aTargetDrive, + RArray& aAppInfoArray ) + { + FLOG( _L("Daemon: CDaemonBehaviour::UpdateStatusL start") ); + + Usif::CComponentEntry* entry = Usif::CComponentEntry::NewL(); + CleanupStack::PushL( entry ); + + TInt err = KErrNone; + TRAP( err, aScrServer.GetComponentL( aComponentId, + *entry, + Usif::KUnspecifiedLocale ) ); + FLOG_1( _L("Daemon: GetComponentL TRAP err = %d"), err ); + // If we get error let's not stop the loop. + if ( !err ) + { + TBool isInTargetDrive = EFalse; + // Get all component drives. + TDriveList driveList; + driveList = entry->InstalledDrives(); + + FLOG( _L("Daemon: Check all drives for this component") ); + // Go through all drives which have files for this component. + for ( TInt i = 0; i < KMaxDrives; i++ ) + { + if ( driveList[i] != 0 ) + { + FLOG_1( _L("Daemon: Found drive: %d"), i ); + + if ( aTargetDrive == i ) + { + // Ok we have files in this target drive. + isInTargetDrive = ETrue; + FLOG( _L("Daemon: Component has files in target drive") ); + } + } + } // for + + // Check if component or part of it is in the media. + if ( isInTargetDrive ) + { + FLOG( _L("Daemon: Set component status to SCR") ); + // Update component flag to SCR. + if ( aChangeType == EMediaInserted ) + { + FLOG( _L("Daemon: Set component present = TRUE") ); + TRAP( err, aScrServer.SetIsComponentPresentL( aComponentId, ETrue ) ); + } + else if ( aChangeType==EMediaRemoved ) + { + FLOG( _L("Daemon: Set component present = FALSE") ); + TRAP( err, aScrServer.SetIsComponentPresentL( aComponentId, EFalse ) ); + } + FLOG_1( _L("Daemon: SetIsComponentPresentL TRAP err = %d"), err ); + + // We need to update applications status to AppArc when + // there is some media change. AppArc needs application + // UID (not package UID) so we need to get all app. UIDs + // from the package and set them to present or not present. + + FLOG( _L("Daemon: Create application status for AppArc") ); + FLOG( _L("Daemon: Get applications UIDs from SCR") ); + RArray appUidArray; + CleanupClosePushL( appUidArray ); + + TRAP( err, aScrServer.GetAppUidsForComponentL( aComponentId, appUidArray ) ); + FLOG_1( _L("Daemon: GetAppUidsForComponentL TRAP err = %d"), err ); + FLOG_1( _L("Daemon: UID array count = %d"), appUidArray.Count() ); + + for (TInt index = 0; index < appUidArray.Count(); index++) + { + FLOG_1( _L("Daemon: Add app UID = 0x%x"), + appUidArray[index].iUid ); + + TApaAppUpdateInfo appInfo; + appInfo.iAppUid = appUidArray[index]; + + if ( aChangeType == EMediaInserted ) + { + appInfo.iAction = TApaAppUpdateInfo::EAppPresent; + FLOG( _L("Daemon: Set app = EAppPresent") ); + } + else + { + appInfo.iAction = TApaAppUpdateInfo::EAppNotPresent; + FLOG( _L("Daemon: Set app = EAppNotPresent") ); + } + + aAppInfoArray.Append( appInfo ); + } + CleanupStack::PopAndDestroy(&appUidArray); + } // if isInTargetDrive + } // if err + + CleanupStack::PopAndDestroy( entry ); + entry = NULL; + + FLOG( _L("Daemon: CDaemonBehaviour::UpdateStatusL end") ); + } + //EOF