27 #include "integritytree.h" |
27 #include "integritytree.h" |
28 #include "log.h" |
28 #include "log.h" |
29 |
29 |
30 using namespace Swi; |
30 using namespace Swi; |
31 |
31 |
32 TBool IsBinary(const TEntry& aEntry) |
|
33 { |
|
34 return (aEntry[0].iUid == KExecutableImageUidValue || aEntry[0].iUid == KDynamicLibraryUidValue) ? ETrue : EFalse; |
|
35 } |
|
36 |
|
37 void Swi::IntegrityDeleteFileL(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, |
32 void Swi::IntegrityDeleteFileL(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, |
38 RLoader& aLoader, CFileMan& aFileMan) |
33 RLoader& aLoader, CFileMan& aFileMan) |
39 { |
34 { |
40 _LIT(KSysBin, "\\sys\\bin"); |
|
41 RBuf name; |
35 RBuf name; |
42 name.CreateL(aPath, KMaxFileName); |
36 name.CreateL(aPath, KMaxFileName); |
43 CleanupClosePushL(name); |
37 CleanupClosePushL(name); |
44 name.Append(aLeaf->Name()); |
38 name.Append(aLeaf->Name()); |
45 |
39 |
60 DEBUG_PRINTF3(_L("Integrity Services - Remove Directory %S err = %d"), &name, err); |
54 DEBUG_PRINTF3(_L("Integrity Services - Remove Directory %S err = %d"), &name, err); |
61 User::LeaveIfError(err); |
55 User::LeaveIfError(err); |
62 } |
56 } |
63 else |
57 else |
64 { |
58 { |
65 if ( aLeaf->Type() == EBackupFile ) // Implies a commit operation is in progress |
59 TInt err = aLoader.Delete(name); |
66 { |
60 DEBUG_PRINTF3(_L("Integrity Services - Delete File %S err = %d"), &name, err); |
67 |
61 User::LeaveIfError(err); |
68 if ( IsBinary(entry) ) |
|
69 { |
|
70 // Forming the file name so the renamed file can be under sys/bin |
|
71 // for special delete mechanism using RLoader::Delete |
|
72 RBuf tmpName; |
|
73 TParsePtrC fileName(name); |
|
74 tmpName.CreateL(name.Length() + KSysBin.iTypeLength); |
|
75 CleanupClosePushL(tmpName); |
|
76 |
|
77 tmpName.Append(fileName.Drive()); |
|
78 tmpName.Append(KSysBin); |
|
79 tmpName.Append(fileName.Path()); |
|
80 tmpName.Append(fileName.NameAndExt()); |
|
81 |
|
82 DEBUG_PRINTF3(_L("Integrity Services - Renaming %S to %S"), &name, &tmpName); |
|
83 aFileMan.Rename(name,tmpName,CFileMan::EOverWrite); |
|
84 User::LeaveIfError(aLoader.Delete(tmpName)); // Using RLoader delete for paged binaries |
|
85 DEBUG_PRINTF2(_L("Integrity Services - Deleted renamed file %S"), &tmpName); |
|
86 |
|
87 // prune the directory tree if possible |
|
88 RemoveDirectoryTreeL(aFs, tmpName); |
|
89 CleanupStack::PopAndDestroy(&tmpName); |
|
90 } |
|
91 else |
|
92 { |
|
93 User::LeaveIfError(aFileMan.Delete(name)); |
|
94 } |
|
95 } |
|
96 else |
|
97 { |
|
98 // Need to use RLoader Delete which can be used during deletion of Added files during Rollback |
|
99 User::LeaveIfError(aLoader.Delete(name)); |
|
100 } |
|
101 } |
62 } |
102 |
63 |
103 // prune the directory tree if possible |
64 // prune the directory tree if possible |
104 RemoveDirectoryTreeL(aFs, name); |
65 RemoveDirectoryTreeL(aFs, name); |
105 } |
66 } |
106 else if(err != KErrNotFound && err != KErrPathNotFound) |
67 else if(err != KErrNotFound && err != KErrPathNotFound) |
107 { |
68 { |
108 DEBUG_PRINTF3(_L("Integrity Services - error %d removing %S"), err, &name); |
69 DEBUG_PRINTF3(_L("Integrity Services - error %d removing %S"), err, &name); |
109 User::Leave(err); |
70 User::Leave(err); |
110 } |
71 } |
111 else |
|
112 { |
|
113 |
|
114 DEBUG_PRINTF3(_L("Integrity Services - error %d removing %S"), err, &name); |
|
115 |
|
116 // Check for any renamed files to move it to sys/bin for special delete mechanism |
|
117 RBuf tmpName; |
|
118 TParsePtrC fileName(name); |
|
119 tmpName.CreateL(name.Length() + KSysBin.iTypeLength); |
|
120 CleanupClosePushL(tmpName); |
|
121 |
|
122 tmpName.Append(fileName.Drive()); |
|
123 tmpName.Append(KSysBin); |
|
124 tmpName.Append(fileName.Path()); |
|
125 tmpName.Append(fileName.NameAndExt()); |
|
126 DEBUG_PRINTF2(_L("Integrity Services - Removing %S renamed binary files if any"), &tmpName); |
|
127 |
|
128 aLoader.Delete(tmpName); |
|
129 // prune the directory tree if possible |
|
130 RemoveDirectoryTreeL(aFs, tmpName); |
|
131 CleanupStack::PopAndDestroy(&tmpName); |
|
132 } |
|
133 |
|
134 CleanupStack::PopAndDestroy(&name); |
72 CleanupStack::PopAndDestroy(&name); |
135 } |
73 } |
136 |
74 |
137 void Swi::IntegrityRestoreFileL(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, |
75 void Swi::IntegrityRestoreFileL(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, |
138 RLoader& /*aLoader*/, CFileMan& /*aFileMan*/) |
76 RLoader& /*aLoader*/, CFileMan& /*aFileMan*/) |