diff -r 7333d7932ef7 -r 8b7f4e561641 installationservices/swi/source/integrityservices/operationfunctions.cpp --- a/installationservices/swi/source/integrityservices/operationfunctions.cpp Tue Aug 31 15:21:33 2010 +0300 +++ b/installationservices/swi/source/integrityservices/operationfunctions.cpp Wed Sep 01 12:22:02 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -29,9 +29,15 @@ using namespace Swi; +TBool IsBinary(const TEntry& aEntry) + { + return (aEntry[0].iUid == KExecutableImageUidValue || aEntry[0].iUid == KDynamicLibraryUidValue) ? ETrue : EFalse; + } + void Swi::IntegrityDeleteFileL(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, RLoader& aLoader, CFileMan& aFileMan) { + _LIT(KSysBin, "\\sys\\bin"); RBuf name; name.CreateL(aPath, KMaxFileName); CleanupClosePushL(name); @@ -56,9 +62,42 @@ } else { - TInt err = aLoader.Delete(name); - DEBUG_PRINTF3(_L("Integrity Services - Delete File %S err = %d"), &name, err); - User::LeaveIfError(err); + if ( aLeaf->Type() == EBackupFile ) // Implies a commit operation is in progress + { + + if ( IsBinary(entry) ) + { + // Forming the file name so the renamed file can be under sys/bin + // for special delete mechanism using RLoader::Delete + RBuf tmpName; + TParsePtrC fileName(name); + tmpName.CreateL(name.Length() + KSysBin.iTypeLength); + CleanupClosePushL(tmpName); + + tmpName.Append(fileName.Drive()); + tmpName.Append(KSysBin); + tmpName.Append(fileName.Path()); + tmpName.Append(fileName.NameAndExt()); + + DEBUG_PRINTF3(_L("Integrity Services - Renaming %S to %S"), &name, &tmpName); + aFileMan.Rename(name,tmpName,CFileMan::EOverWrite); + User::LeaveIfError(aLoader.Delete(tmpName)); // Using RLoader delete for paged binaries + DEBUG_PRINTF2(_L("Integrity Services - Deleted renamed file %S"), &tmpName); + + // prune the directory tree if possible + RemoveDirectoryTreeL(aFs, tmpName); + CleanupStack::PopAndDestroy(&tmpName); + } + else + { + User::LeaveIfError(aFileMan.Delete(name)); + } + } + else + { + // Need to use RLoader Delete which can be used during deletion of Added files during Rollback + User::LeaveIfError(aLoader.Delete(name)); + } } // prune the directory tree if possible @@ -69,6 +108,29 @@ DEBUG_PRINTF3(_L("Integrity Services - error %d removing %S"), err, &name); User::Leave(err); } + else + { + + DEBUG_PRINTF3(_L("Integrity Services - error %d removing %S"), err, &name); + + // Check for any renamed files to move it to sys/bin for special delete mechanism + RBuf tmpName; + TParsePtrC fileName(name); + tmpName.CreateL(name.Length() + KSysBin.iTypeLength); + CleanupClosePushL(tmpName); + + tmpName.Append(fileName.Drive()); + tmpName.Append(KSysBin); + tmpName.Append(fileName.Path()); + tmpName.Append(fileName.NameAndExt()); + DEBUG_PRINTF2(_L("Integrity Services - Removing %S renamed binary files if any"), &tmpName); + + aLoader.Delete(tmpName); + // prune the directory tree if possible + RemoveDirectoryTreeL(aFs, tmpName); + CleanupStack::PopAndDestroy(&tmpName); + } + CleanupStack::PopAndDestroy(&name); }