diff -r d1838696558c -r 9dcba1ee99f7 appinstaller/AppinstUi/startuplistupdater/src/startuplistupdater.cpp --- a/appinstaller/AppinstUi/startuplistupdater/src/startuplistupdater.cpp Thu Oct 14 14:11:30 2010 +0300 +++ b/appinstaller/AppinstUi/startuplistupdater/src/startuplistupdater.cpp Wed Oct 20 14:52:56 2010 +0300 @@ -37,6 +37,22 @@ const TInt KDriveSpecLength = 2; const TInt KFirstStartupItemInfo = 1; +#ifdef _DEBUG +#define FLOG(x) RDebug::Print(x); +#define FLOG_1(x,y) RDebug::Print(x, y); +#define FLOG_2(x,y,z) RDebug::Print(x, y, z); +#define FLOG_3(x,y,z,v) RDebug::Print(x, y, z, v); +#else +#define FLOG(x) +#define FLOG_1(x,y) +#define FLOG_2(x,y,z) +#define FLOG_3(x,y,z,v) +#endif + +_LIT( KDevTraceDir, "c:\\data\\logs\\swinst\\" ); +_LIT( KDevTraceFile, "startuplistmgmt.log" ); +const TInt KDevTraceBuffer = 256; + // ======== LOCAL FUNCTIONS ======== @@ -58,6 +74,7 @@ // CStartupListUpdater* CStartupListUpdater::NewL() { + FLOG( _L("CStartupListUpdater::NewL") ); CStartupListUpdater* self = new( ELeave ) CStartupListUpdater; CleanupStack::PushL( self ); self->ConstructL(); @@ -71,6 +88,10 @@ // CStartupListUpdater::~CStartupListUpdater() { + FLOG( _L("CStartupListUpdater::~CStartupListUpdater") ); + iLogFile.Close(); + iFileBuf.Close(); + delete iLogBuf; delete iPrivateImportPath; iFs.Close(); @@ -83,7 +104,8 @@ // void CStartupListUpdater::UpdateStartupListL() { - if ( FeatureManager::FeatureSupported( KFeatureIdExtendedStartup ) ) + FLOG( _L("CStartupListUpdater::UpdateStartupListL") ); + if( FeatureManager::FeatureSupported( KFeatureIdExtendedStartup ) ) { ProcessImportsAndUninstallsL(); } @@ -103,14 +125,17 @@ // void CStartupListUpdater::ConstructL() { + FLOG( _L("CStartupListUpdater::ConstructL, begin") ); FeatureManager::InitializeLibL(); User::LeaveIfError( iFs.Connect() ); TInt err = iFs.MkDirAll( PrivateImportPathL() ); if( err != KErrNone && err != KErrAlreadyExists ) { + FLOG_1( _L("CStartupListUpdater::ConstructL, err %d"), err ); User::Leave( err ); } + FLOG( _L("CStartupListUpdater::ConstructL, end") ); } // --------------------------------------------------------------------------- @@ -135,6 +160,7 @@ TPtr ptr( iPrivateImportPath->Des() ); ptr.Format( KDriveAndPathFormat, static_cast< TUint >( driveLetter ), &privateImportPath ); } + FLOG_1( _L("CStartupListUpdater::PrivateImportPathL %S"), iPrivateImportPath ); return *iPrivateImportPath; } @@ -144,13 +170,20 @@ // void CStartupListUpdater::ProcessImportsAndUninstallsL() { + FLOG( _L("CStartupListUpdater::ProcessImportsAndUninstallsL, begin") ); RDscStore dscStore; OpenDscStoreLC( dscStore ); - ImportNewResourceFilesL( dscStore ); + TRAPD( err, ImportNewResourceFilesL( dscStore ) ); + if( err ) + { + DevTrace( _L("Error: import failed, error code %d"), err ); + User::Leave( err ); + } DeregisterUninstalledAppsL( dscStore ); CleanupStack::PopAndDestroy( &dscStore ); + FLOG( _L("CStartupListUpdater::ProcessImportsAndUninstallsL, end") ); } // --------------------------------------------------------------------------- @@ -159,6 +192,7 @@ // void CStartupListUpdater::OpenDscStoreLC( RDscStore& aDscStore ) { + FLOG( _L("CStartupListUpdater::OpenDscStoreLC") ); if( !aDscStore.IsOpened() ) { aDscStore.OpenL(); @@ -170,6 +204,7 @@ } else { + FLOG( _L("CStartupListUpdater::OpenDscStoreLC, KErrAlreadyExists") ); User::Leave( KErrAlreadyExists ); } } @@ -180,6 +215,7 @@ // void CStartupListUpdater::ImportNewResourceFilesL( RDscStore& aDscStore ) { + FLOG( _L("CStartupListUpdater::ImportNewResourceFilesL, begin") ); RPointerArray executableArray; CleanupResetAndDestroyPushL( executableArray ); RPointerArray resourceFileArray; @@ -190,6 +226,7 @@ RemoveImportedResourceFiles( resourceFileArray ); CleanupStack::PopAndDestroy( 2, &executableArray ); + FLOG( _L("CStartupListUpdater::ImportNewResourceFilesL, end") ); } // --------------------------------------------------------------------------- @@ -198,6 +235,7 @@ // void CStartupListUpdater::DeregisterUninstalledAppsL( RDscStore& aDscStore ) { + FLOG( _L("CStartupListUpdater::DeregisterUninstalledAppsL, begin") ); RPointerArray startedAtBootArray; CleanupResetAndDestroyPushL( startedAtBootArray ); RPointerArray installedArray; @@ -211,6 +249,7 @@ RemoveFromStartupListL( aDscStore, startedNotInstalled ); CleanupStack::PopAndDestroy( 3, &startedAtBootArray ); + FLOG( _L("CStartupListUpdater::DeregisterUninstalledAppsL, end") ); } // --------------------------------------------------------------------------- @@ -221,6 +260,7 @@ RPointerArray& aExecutableArray, RPointerArray& aResourceFileArray ) { + FLOG( _L("CStartupListUpdater::GetDataToBeImportedL, begin") ); TParse resourceFiles; User::LeaveIfError( resourceFiles.Set( KResourceFileSpec, &PrivateImportPathL(), NULL ) ); const TPtrC importDir( resourceFiles.FullName() ); @@ -242,6 +282,7 @@ } } CleanupStack::PopAndDestroy( dir ); + FLOG( _L("CStartupListUpdater::GetDataToBeImportedL, end") ); } // --------------------------------------------------------------------------- @@ -251,16 +292,25 @@ void CStartupListUpdater::ImportExecutablesL( RDscStore& aDscStore, RPointerArray& aExecutableArray ) { + FLOG( _L("CStartupListUpdater::ImportExecutablesL, begin") ); for( TInt index = 0; index < aExecutableArray.Count(); ++index ) { const TDesC& executableName = *( aExecutableArray[ index ] ); + FLOG_1( _L("CStartupListUpdater::ImportExecutablesL, exe %S"), &executableName ); CDscItem* item = CDscItem::NewLC( executableName, KNullDesC ); if( !aDscStore.ItemExistsL( *item ) ) { + FLOG( _L("CStartupListUpdater::ImportExecutablesL, add item to DscStore") ); aDscStore.AddItemL( *item ); + DevTrace( _L("Success: '%S' will be started at boot"), &executableName ); + } + else + { + DevTrace( _L("Error: '%S' already in start list"), &executableName ); } CleanupStack::PopAndDestroy( item ); } + FLOG( _L("CStartupListUpdater::ImportExecutablesL, end") ); } // --------------------------------------------------------------------------- @@ -270,18 +320,19 @@ void CStartupListUpdater::RemoveImportedResourceFiles( RPointerArray& aResourceFileArray ) { + FLOG( _L("CStartupListUpdater::RemoveImportedResourceFiles, begin") ); for( TInt index = 0; index < aResourceFileArray.Count(); ++index ) { const TDesC& fileName = *( aResourceFileArray[ index ] ); + FLOG_1( _L("CStartupListUpdater::RemoveImportedResourceFiles, deleting %S"), &fileName ); TInt err = iFs.Delete( fileName ); - if( err ) + FLOG_1( _L("CStartupListUpdater::RemoveImportedResourceFiles, err %d"), err ); + if( !err ) { -#ifdef _DEBUG - RDebug::Print( _L("CStartupListUpdater: cannot delete %S, error %d"), - &fileName, err ); -#endif + DevTrace( _L("Resource file '%S' processed"), &fileName ); } } + FLOG( _L("CStartupListUpdater::RemoveImportedResourceFiles, end") ); } // --------------------------------------------------------------------------- @@ -292,12 +343,18 @@ const TDesC& aResourceFile, RPointerArray& aExecutableArray ) { + FLOG( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, begin") ); + OpenDevTraceL(); + DevTrace( _L("Processing resource file: %S"), &aResourceFile ); + RResourceFile resource; CleanupClosePushL( resource ); resource.OpenL( iFs, aResourceFile ); + FLOG_1( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, %S"), &aResourceFile ); for( TInt id = KFirstStartupItemInfo; resource.OwnsResourceId( id ); ++id ) { + FLOG_1( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, resource id %d"), id ); HBufC8* buffer = resource.AllocReadLC( id ); TResourceReader reader; @@ -308,6 +365,10 @@ TFileName executableName; executableName.Copy( reader.ReadTPtrC() ); TInt recoveryPolicy = reader.ReadUint16(); + FLOG_1( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, executableName %S"), + &executableName ); + FLOG_1( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, recoveryPolicy %d"), + recoveryPolicy ); CleanupStack::PopAndDestroy( buffer ); @@ -327,16 +388,33 @@ executableName.Replace( 0, 1, fileFinder.File() ); CleanupStack::PopAndDestroy( executableDir ); } + + FLOG_1( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, new name %S"), + &executableName ); } + DevTrace( _L("Executable file: %S"), &executableName ); if( IsValidExecutableForStartupL( aResourceFile, executableName ) ) { + FLOG( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, adding to array") ); aExecutableArray.AppendL( executableName.AllocL() ); } } + else + { + if( versionInfo != 0 ) + { + DevTrace( _L("Error: unsupported STARTUP_ITEM_INFO version: %d"), versionInfo ); + } + else + { + DevTrace( _L("Error: unsupported recovery policy: %d"), recoveryPolicy ); + } + } } CleanupStack::PopAndDestroy( &resource ); + FLOG( _L("CStartupListUpdater::AppendExecutablesFromResourceFileL, end") ); } // --------------------------------------------------------------------------- @@ -346,86 +424,264 @@ TBool CStartupListUpdater::IsValidExecutableForStartupL( const TDesC& aResourceFile, const TDesC& aExecutableName ) { + FLOG( _L("CStartupListUpdater::IsValidExecutableForStartupL, begin") ); + FLOG_1( _L("CStartupListUpdater::IsValidExecutableForStartupL, res %S"), &aResourceFile ); + FLOG_1( _L("CStartupListUpdater::IsValidExecutableForStartupL, exe %S"), &aExecutableName ); TBool isValid = EFalse; TEntry entry; if( iFs.Entry( aExecutableName, entry ) == KErrNone ) // needs AllFiles capability { - isValid = ETrue; - - // Extract package UID from the resource file name - // - allow both "[1234ABCD]" and "1234ABCD" formats - // - allow possible "0x" prefix too - TUid packageUid = KNullUid; - TParsePtrC parse( aResourceFile ); - TPtrC parseName = parse.Name(); - TInt fileNameLength = parseName.Length(); - if( !parse.IsNameWild() && fileNameLength > 0 ) - { - TPtr fileName( const_cast( parseName.Ptr() ), - fileNameLength, fileNameLength ); - - if( fileName[ 0 ] == '[' && fileName[ fileNameLength - 1 ] == ']' ) - { - const TInt KTwoCharsLength = 2; - fileNameLength -= KTwoCharsLength; - fileName = fileName.Mid( 1, fileNameLength ); - } + FLOG( _L("CStartupListUpdater::IsValidExecutableForStartupL, exe file exists") ); - _LIT( KHexPrefix, "0x" ); - const TInt KHexPrefixLength = 2; - if( fileName.Left( KHexPrefixLength ) == KHexPrefix ) - { - fileNameLength -= KHexPrefixLength; - fileName = fileName.Mid( KHexPrefixLength, fileNameLength ); - } + TUid packageUid = KNullUid; + ExtractPackageUidFromResourceFileL( aResourceFile, packageUid ); - TLex lex( fileName ); - TUint32 uidValue = 0; - TInt lexError = lex.Val( uidValue, EHex ); - if( !lexError ) - { - packageUid.iUid = uidValue; - } - } - - // Get package info from RSisRegistry, and check that - // - the package contains the resource file - // - the package is properly signed if( packageUid != KNullUid ) { Swi::RSisRegistrySession sisRegSession; User::LeaveIfError( sisRegSession.Connect() ); CleanupClosePushL( sisRegSession ); - Swi::RSisRegistryEntry package; - CleanupClosePushL( package ); - TInt openError = package.Open( sisRegSession, packageUid ); - if( !openError ) - { - TBool hasResourceFile = EFalse; + isValid = IsResourceFileValidForPackageL( sisRegSession, aResourceFile, packageUid ) && + IsExeFileIncludedInPackageL( sisRegSession, aExecutableName, packageUid ); + + CleanupStack::PopAndDestroy( &sisRegSession ); + } + else + { + DevTrace( _L("Error: invalid package UID - check resource file name") ); + } + } + else + { + DevTrace( _L("Error: executable file '%S' not found"), &aExecutableName ); + } + + FLOG_1( _L("CStartupListUpdater::IsValidExecutableForStartupL, return %d"), isValid ); + return isValid; + } + +// --------------------------------------------------------------------------- +// CStartupListUpdater::ExtractPackageUidFromResourceFileL() +// --------------------------------------------------------------------------- +// +void CStartupListUpdater::ExtractPackageUidFromResourceFileL( const TDesC& aResourceFile, + TUid& aPackageUid ) + { + FLOG( _L("CStartupListUpdater::ExtractPackageUidFromResourceFileL, begin") ); + + // Extract package UID from the resource file name + // - allow both "[1234ABCD]" and "1234ABCD" formats + // - allow possible "0x" prefix too + aPackageUid = KNullUid; - RPointerArray files; - CleanupResetAndDestroyPushL( files ); - package.FilesL( files ); - for( TInt index = 0; index < files.Count() && !hasResourceFile; ++index ) - { - hasResourceFile = ( aResourceFile.CompareF( *files[ index ] ) == 0 ); - } + TParse parse; + parse.Set( aResourceFile, NULL, NULL ); + TPtrC parseName = parse.Name(); + TInt fileNameLength = parseName.Length(); + if( !parse.IsNameWild() && fileNameLength > 0 ) + { + TPtr fileName( const_cast( parseName.Ptr() ), + fileNameLength, fileNameLength ); + + if( fileName[ 0 ] == '[' && fileName[ fileNameLength - 1 ] == ']' ) + { + const TInt KTwoCharsLength = 2; + fileNameLength -= KTwoCharsLength; + fileName = fileName.Mid( 1, fileNameLength ); + } - if( hasResourceFile && package.TrustStatusL().IsTrusted() ) - { - isValid = ETrue; - } + _LIT( KHexPrefix, "0x" ); + const TInt KHexPrefixLength = 2; + if( fileName.Left( KHexPrefixLength ) == KHexPrefix ) + { + fileNameLength -= KHexPrefixLength; + fileName = fileName.Mid( KHexPrefixLength, fileNameLength ); + } - CleanupStack::PopAndDestroy( &files ); - } - - CleanupStack::PopAndDestroy( 2, &sisRegSession ); // package, sisRegSession + FLOG_1( _L("CStartupListUpdater::ExtractPackageUidFromResourceFileL, fileName %S"), + &fileName ); + TLex lex( fileName ); + TUint32 uidValue = 0; + TInt lexError = lex.Val( uidValue, EHex ); + if( !lexError ) + { + aPackageUid.iUid = uidValue; } } - return isValid; + FLOG_1( _L("CStartupListUpdater::ExtractPackageUidFromResourceFileL, end, ret 0x%08x"), + aPackageUid.iUid ); + } + +// --------------------------------------------------------------------------- +// CStartupListUpdater::IsResourceFileValidForPackageL() +// --------------------------------------------------------------------------- +// +TBool CStartupListUpdater::IsResourceFileValidForPackageL( + Swi::RSisRegistrySession& aSisRegSession, + const TDesC& aResourceFile, + const TUid& aPackageUid ) + { + FLOG( _L("CStartupListUpdater::IsResourceFileValidForPackageL, begin") ); + TBool isValidForPackage = EFalse; + + // Get package info from RSisRegistry, and check that + // - the package contains the resource file, and + // - the package is properly signed + + Swi::RSisRegistryEntry package; + CleanupClosePushL( package ); + TInt openError = package.Open( aSisRegSession, aPackageUid ); + FLOG_1( _L("CStartupListUpdater::IsResourceFileValidForPackageL, openError %d"), openError ); + if( !openError ) + { + Swi::TSisTrustStatus trustStatus = package.TrustStatusL(); + Swi::TValidationStatus validationStatus = trustStatus.ValidationStatus(); + FLOG_1( _L("CStartupListUpdater::IsResourceFileValidForPackageL, validationStatus %d"), + validationStatus ); + Swi::TRevocationStatus revocationStatus = trustStatus.RevocationStatus(); + FLOG_1( _L("CStartupListUpdater::IsResourceFileValidForPackageL, revocationStatus %d"), + revocationStatus ); + TBool isTrusted = (validationStatus == Swi::EPackageInRom || + validationStatus == Swi::EValidatedToAnchor) && + revocationStatus != Swi::EOcspRevoked; + FLOG_1( _L("CStartupListUpdater::IsResourceFileValidForPackageL, isTrusted %d"), + isTrusted ); + + if( isTrusted ) + { + isValidForPackage = IsFileIncludedInPackageL( aResourceFile, package ); + + if( !isValidForPackage ) + { + DevTrace( _L("Error: package 0x%08x does not install resource file %S"), + aPackageUid.iUid, &aResourceFile ); + } + } + else + { + DevTrace( _L("Error: package 0x%08x not trusted"), aPackageUid.iUid ); + } + } + else + { + DevTrace( _L("Error: package 0x%08x open failed, error %d - check resource file name"), + aPackageUid.iUid, openError ); + } + + CleanupStack::PopAndDestroy( &package ); + + FLOG_1( _L("CStartupListUpdater::IsResourceFileValidForPackageL, ret %d"), isValidForPackage ); + return isValidForPackage; + } + +// --------------------------------------------------------------------------- +// CStartupListUpdater::IsFileIncludedInPackageL() +// --------------------------------------------------------------------------- +// +TBool CStartupListUpdater::IsFileIncludedInPackageL( const TDesC& aFile, + Swi::RSisRegistryEntry& aPackage ) + { + FLOG_1( _L("CStartupListUpdater::IsFileIncludedInPackageL, begin, file %S"), &aFile ); + TBool isIncluded = EFalse; + + RPointerArray files; + CleanupResetAndDestroyPushL( files ); + aPackage.FilesL( files ); + TInt fileCount = files.Count(); + FLOG_1( _L("CStartupListUpdater::IsFileIncludedInPackageL, pckg fileCount %d"), fileCount ); + for( TInt index = 0; index < fileCount && !isIncluded; ++index ) + { + TPtrC pckgFile( *files[ index ] ); + FLOG_1( _L("CStartupListUpdater::IsFileIncludedInPackageL, pckgFile %S"), &pckgFile ); + isIncluded = ( aFile.CompareF( pckgFile ) == 0 ); + } + CleanupStack::PopAndDestroy( &files ); + + if( isIncluded ) + { + DevTrace( _L("File '%S' installed by package 0x%08x" ), &aFile, aPackage.UidL().iUid ); + } + else + { + DevTrace( _L("File '%S' not installed by package 0x%08x" ), &aFile, aPackage.UidL().iUid ); + } + FLOG_1( _L("CStartupListUpdater::IsFileIncludedInPackageL, ret %d"), isIncluded ); + return isIncluded; + } + +// --------------------------------------------------------------------------- +// CStartupListUpdater::IsFileIncludedInEmbeddedPackagesL() +// --------------------------------------------------------------------------- +// +TBool CStartupListUpdater::IsFileIncludedInEmbeddedPackagesL( + Swi::RSisRegistrySession& aSisRegSession, const TDesC& aFile, + Swi::RSisRegistryEntry& aPackage ) + { + FLOG( _L("CStartupListUpdater::IsFileIncludedInEmbeddedPackagesL, begin") ); + TBool isIncluded = EFalse; + + RPointerArray embeddedPackages; + CleanupResetAndDestroyPushL( embeddedPackages ); + aPackage.EmbeddedPackagesL( embeddedPackages ); + + TInt embeddedPackagesCount = embeddedPackages.Count(); + FLOG_1( _L("CStartupListUpdater::IsFileIncludedInEmbeddedPackagesL, embeddedPackagesCount %d"), + embeddedPackagesCount ); + for( TInt index = 0; index < embeddedPackagesCount && !isIncluded; ++index ) + { + TUid uid = embeddedPackages[index]->Uid(); + FLOG_1( _L("CStartupListUpdater::IsFileIncludedInEmbeddedPackagesL, uid 0x%08x"), + uid.iUid ); + + Swi::RSisRegistryEntry package; + if( package.Open( aSisRegSession, uid ) == KErrNone ) + { + CleanupClosePushL( package ); + isIncluded = IsFileIncludedInPackageL( aFile, package ); + if( !isIncluded ) + { + // Check other embedded packages recursively if necessary + isIncluded = IsFileIncludedInEmbeddedPackagesL( aSisRegSession, aFile, package ); + } + CleanupStack::PopAndDestroy( &package ); + } + } + CleanupStack::PopAndDestroy( &embeddedPackages ); + + FLOG_1( _L("CStartupListUpdater::IsFileIncludedInEmbeddedPackagesL, ret %d"), isIncluded ); + return isIncluded; + } + +// --------------------------------------------------------------------------- +// CStartupListUpdater::IsExeFileIncludedInPackageL() +// --------------------------------------------------------------------------- +// +TBool CStartupListUpdater::IsExeFileIncludedInPackageL( + Swi::RSisRegistrySession& aSisRegSession, + const TDesC& aExeFile, const TUid& aPackageUid ) + { + FLOG_1( _L("CStartupListUpdater::IsExeFileIncludedInPackageL, begin, file %S"), &aExeFile ); + TBool isIncluded = EFalse; + + Swi::RSisRegistryEntry package; + CleanupClosePushL( package ); + TInt openError = package.Open( aSisRegSession, aPackageUid ); + if( !openError ) + { + isIncluded = IsFileIncludedInPackageL( aExeFile, package ) || + IsFileIncludedInEmbeddedPackagesL( aSisRegSession, aExeFile, package ); + if( !isIncluded ) + { + DevTrace( _L("Error: exe not installed by this package or it's subpackages") ); + } + } + CleanupStack::PopAndDestroy( &package ); + + FLOG_1( _L("CStartupListUpdater::IsExeFileIncludedInPackageL, return %d"), isIncluded ); + return isIncluded; } // --------------------------------------------------------------------------- @@ -435,6 +691,7 @@ void CStartupListUpdater::GetInstalledAppsL( RPointerArray& aInstalledExecutableArray ) { + FLOG( _L("CStartupListUpdater::GetInstalledAppsL, begin") ); Swi::RSisRegistrySession sisRegistrySession; User::LeaveIfError( sisRegistrySession.Connect() ); CleanupClosePushL( sisRegistrySession ); @@ -443,8 +700,12 @@ CleanupResetAndDestroyPushL( removablePackages ); sisRegistrySession.RemovablePackagesL( removablePackages ); - for( TInt index = 0; index < removablePackages.Count(); ++index ) + TInt removablePackagesCount = removablePackages.Count(); + FLOG_1( _L("CStartupListUpdater::GetInstalledAppsL, removablePackagesCount %d"), + removablePackagesCount ); + for( TInt index = 0; index < removablePackagesCount; ++index ) { + FLOG_1( _L("CStartupListUpdater::GetInstalledAppsL, index %d"), index ); Swi::RSisRegistryEntry entry; CleanupClosePushL( entry ); entry.OpenL( sisRegistrySession, *( removablePackages[ index ] ) ); @@ -456,6 +717,7 @@ } CleanupStack::PopAndDestroy( 2, &sisRegistrySession ); + FLOG( _L("CStartupListUpdater::GetInstalledAppsL, end") ); } // --------------------------------------------------------------------------- @@ -465,16 +727,20 @@ void CStartupListUpdater::GetStartupListAppsL( RDscStore& aDscStore, RPointerArray& aStartedExecutableArray ) { + FLOG( _L("CStartupListUpdater::GetStartupListAppsL, begin") ); aDscStore.EnumOpenLC(); while( CDscItem* item = aDscStore.EnumReadNextL() ) { CleanupStack::PushL( item ); - aStartedExecutableArray.AppendL( item->FileName().AllocL() ); + TPtrC fileName( item->FileName() ); + FLOG_1( _L("CStartupListUpdater::GetStartupListAppsL, fileName %S"), &fileName ); + aStartedExecutableArray.AppendL( fileName.AllocL() ); CleanupStack::PopAndDestroy( item ); } CleanupStack::PopAndDestroy(); // runs EnumClose + FLOG( _L("CStartupListUpdater::GetStartupListAppsL, end") ); } // --------------------------------------------------------------------------- @@ -486,17 +752,22 @@ RPointerArray& aInstalledExecutableArray, // in RPointerArray& aStartedButNotInstalledExecutableArray ) // out { + FLOG( _L("CStartupListUpdater::StartedButNotInstalledAppsL, begin") ); aStartedButNotInstalledExecutableArray.ResetAndDestroy(); TIdentityRelation identityRelation( FileNamesEqual ); for( TInt index = 0; index < aStartedExecutableArray.Count(); ++index ) { const HBufC* startedAppName = aStartedExecutableArray[ index ]; + FLOG_1( _L("CStartupListUpdater::StartedButNotInstalledAppsL, startedAppName %S"), + startedAppName ); if( aInstalledExecutableArray.Find( startedAppName, identityRelation ) == KErrNotFound ) { + FLOG( _L("CStartupListUpdater::StartedButNotInstalledAppsL, adding to array") ); aStartedButNotInstalledExecutableArray.AppendL( startedAppName->AllocL() ); } } + FLOG( _L("CStartupListUpdater::StartedButNotInstalledAppsL, end") ); } // --------------------------------------------------------------------------- @@ -506,16 +777,21 @@ void CStartupListUpdater::RemoveFromStartupListL( RDscStore& aDscStore, RPointerArray& aExecutableArray ) { + FLOG( _L("CStartupListUpdater::RemoveFromStartupListL, begin") ); for( TInt index = 0; index < aExecutableArray.Count(); ++index ) { const TDesC& executableName = *( aExecutableArray[ index ] ); + FLOG_1( _L("CStartupListUpdater::RemoveFromStartupListL, executableName %S"), + &executableName ); CDscItem* item = CDscItem::NewLC( executableName, KNullDesC ); if( aDscStore.ItemExistsL( *item ) ) { + FLOG( _L("CStartupListUpdater::RemoveFromStartupListL, removing from DscStore") ); aDscStore.DeleteItemL( *item ); } CleanupStack::PopAndDestroy( item ); } + FLOG( _L("CStartupListUpdater::RemoveFromStartupListL, end") ); } // --------------------------------------------------------------------------- @@ -525,6 +801,7 @@ void CStartupListUpdater::GetExecutablesFromEntryL( Swi::RSisRegistryEntry& aEntry, RPointerArray& aExecutableArray ) { + FLOG( _L("CStartupListUpdater::GetExecutablesFromEntryL, begin") ); RPointerArray filesList; CleanupResetAndDestroyPushL( filesList ); aEntry.FilesL( filesList ); @@ -533,12 +810,66 @@ { TParse parse; TInt err = parse.SetNoWild( KNullDesC, filesList[ index ], NULL ); + FLOG_3( _L("CStartupListUpdater::GetExecutablesFromEntryL, index %d, parse %S, err %d"), + index, &(parse.FullName()), err ); if( !err && ( parse.Ext().CompareF( KExecutableExtension ) == 0 ) ) { + FLOG( _L("CStartupListUpdater::GetExecutablesFromEntryL, adding to array") ); aExecutableArray.AppendL( parse.FullName().AllocL() ); } + else + { + FLOG( _L("CStartupListUpdater::GetExecutablesFromEntryL, skipped") ); + } } CleanupStack::PopAndDestroy( &filesList ); + FLOG( _L("CStartupListUpdater::GetExecutablesFromEntryL, end") ); } +// --------------------------------------------------------------------------- +// CStartupListUpdater::OpenDevTraceL() +// --------------------------------------------------------------------------- +// +void CStartupListUpdater::OpenDevTraceL() + { + if( !iLogBuf ) + { + TEntry entry; + if( iFs.Entry( KDevTraceDir, entry ) == KErrNone ) + { + FLOG( _L("CStartupListUpdater::OpenDevTraceL, log dir exists") ); + TFileName fileName; + fileName.Copy( KDevTraceDir ); + fileName.Append( KDevTraceFile ); + if( iLogFile.Replace( iFs, fileName, EFileWrite ) == KErrNone ) + { + iLogBuf = HBufC::NewL( KDevTraceBuffer ); + iFileBuf.CreateL( KDevTraceBuffer ); + FLOG( _L("CStartupListUpdater::OpenDevTraceL, log file opened") ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CStartupListUpdater::DevTrace() +// --------------------------------------------------------------------------- +// +void CStartupListUpdater::DevTrace( TRefByValue aFmt, ... ) + { + if( iLogBuf ) + { + VA_LIST list; + VA_START( list, aFmt ); + TPtr line( iLogBuf->Des() ); + line.FormatList( aFmt, list ); + FLOG_1( _L("CStartupListUpdater::DevTrace: %S"), iLogBuf ); + + const TChar KNewLine( '\n' ); + line.Append( KNewLine ); + iFileBuf.Copy( line ); + iLogFile.Write( iFileBuf ); // return value ignored + } + } +