diff -r 6e7b00453237 -r d17dc5398051 installationservices/swtransactionservices/source/server/operationfunctions.cpp --- a/installationservices/swtransactionservices/source/server/operationfunctions.cpp Thu May 27 12:58:35 2010 +0300 +++ b/installationservices/swtransactionservices/source/server/operationfunctions.cpp Fri Jun 11 13:45:18 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -23,12 +23,18 @@ */ #include "operationfunctions.h" - #include "integritytree.h" +#include "usiflog.h" namespace Usif { +TBool IsBinary(const TEntry& aEntry) + { + return (aEntry[0].iUid == KExecutableImageUidValue || aEntry[0].iUid == KDynamicLibraryUidValue) ? ETrue : EFalse; + } + + void VerifyDeletionErrorL(TInt err) { if (err != KErrNone && err != KErrNotFound && err != KErrPathNotFound) @@ -38,6 +44,7 @@ void IntegrityDeleteFileL(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, RLoader& aLoader, CFileMan& aFileMan) { + _LIT(KSysBin, "\\sys\\bin"); RBuf name; name.CreateL(aPath, KMaxFileName); CleanupClosePushL(name); @@ -58,17 +65,76 @@ User::LeaveIfError(aFileMan.RmDir(name)); } else - { - User::LeaveIfError(aLoader.Delete(name)); + { + 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 RemoveDirectoryTreeL(aFs, name); } - else + else if(err != KErrNotFound && err != KErrPathNotFound) { - VerifyDeletionErrorL(err); + 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); }