installationservices/swtransactionservices/source/server/operationfunctions.cpp
changeset 42 d17dc5398051
parent 24 84a16765cd86
--- 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);
 	}