--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/test/tuiscriptadaptors/forceremove.cpp Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,194 @@
+/*
+* Copyright (c) 2005-2009 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"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include "forceremove.h"
+
+#include "testutilclientswi.h"
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include "cleanuputils.h"
+#include "swi/sisregistryentry.h"
+#include "swi/sisregistrypackage.h"
+#include "swi/sisregistrysession.h"
+#include "sisregistryaccess_client.h"
+#endif
+
+TVerdict CForceRemove::doTestStepL()
+ {
+
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+ // Wait up to 30 seconds to ensure both SWIS and the sisregistry server
+ // have shut down
+ _LIT(KSisRegistryServerName, "!SisRegistryServer");
+ _LIT(KInstallServerName, "!InstallServer");
+ TInt delaytime = 30;
+
+ while (delaytime-- > 0)
+ {
+ TFullName serverName;
+ TFindServer find(KInstallServerName);
+ if (KErrNotFound == find.Next(serverName))
+ {
+ find.Find(KSisRegistryServerName);
+ if (KErrNotFound == find.Next(serverName))
+ {
+ break;
+ }
+ }
+ User::After(1000000); // wait a second until the next test
+ }
+#endif // SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+
+ TPtrC name;
+ RTestUtilSessionSwi testutil;
+ User::LeaveIfError(testutil.Connect());
+ CleanupClosePushL(testutil);
+
+ // If file deletion fails we'll try moving the file to a temp directory
+ // for another process to clean up later.
+
+ TTime currentTime;
+ currentTime.UniversalTime();
+
+ _LIT(KTempPathFormat, "\\temp\\%Lu");
+ TDriveUnit sysDrive (RFs::GetSystemDrive());
+ TBuf<128> tempPathFormat(sysDrive.Name());
+ tempPathFormat.Append(KTempPathFormat);
+
+ TFileName targetPath;
+ targetPath.Format(tempPathFormat, currentTime.Int64());
+
+ _LIT(KNumFiles, "numfiles");
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+ RArray<TUint> removeUids;
+ CleanupClosePushL(removeUids);
+#endif
+
+ TInt num(0);
+ GetIntFromConfig(ConfigSection(), KNumFiles, num);
+
+ // Get the file names and use testutil to remove them
+ for (TInt i = 0; i < num; ++i)
+ {
+ _LIT(KFile, "file");
+ TBuf<32> key(KFile);
+ key.AppendNum(i);
+
+ if (!GetStringFromConfig(ConfigSection(), key, name))
+ continue;
+
+ INFO_PRINTF2(_L("ForceRemove - trying to delete file %S"), &name);
+
+ TInt err = testutil.Delete(name);
+ if (err != KErrNone && err != KErrNotFound && err != KErrPathNotFound)
+ {
+ INFO_PRINTF3(_L("RTestUtilSessionSwi::Delete(%S) returned %d, attempting move instead."), &name, err);
+ TFileName source(name);
+ TParsePtr parse(source);
+ TFileName dest(targetPath);
+ dest.Append(parse.Path());
+ if (parse.DrivePresent())
+ {
+ dest[0] = source[0];
+ }
+ testutil.MkDirAll(dest);
+ dest.Append(parse.NameAndExt());
+
+ err = testutil.Move(source, dest);
+
+ if (err != KErrNone)
+ {
+ INFO_PRINTF4(_L("Attempt to move from %S to %S returned %d"),
+ &source, &dest, err);
+ }
+ }
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+ _LIT(KRegistryPath, "\\sys\\install\\sisregistry\\");
+ if (name.FindF(KRegistryPath) == KErrNotFound)
+ continue;
+
+ // Extract the uid and add it to our list
+ TInt slashPos = name.LocateReverse('\\');
+ TPtrC ptrUid = name.Mid(slashPos + 1);
+ if (ptrUid.Length() != 8)
+ continue;
+
+ TUint uid = 0;
+ TLex lex(ptrUid);
+ if (lex.Val(uid, EHex) == KErrNone)
+ {
+ removeUids.InsertInOrder(uid); // Will not allow duplicates
+ }
+#endif
+ }
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+ // Use the sisregistry folder uid to remove the package entries from SCR
+ // Note that we remove packages present in ROM too due to two reasons:
+ // This is exactly what ForceRemove used to do (delete entire registry folder containing ALL reg files)
+ // After deleting an entry SWIRegistry re-registers ROM apps (missing ones)
+ TInt count = removeUids.Count();
+
+ RSisRegistryAccessSession regWrite;
+ TInt err = regWrite.Connect();
+ User::LeaveIfError(err);
+ CleanupClosePushL(regWrite);
+
+ Swi::RSisRegistrySession regRead;
+ User::LeaveIfError(regRead.Connect());
+ CleanupClosePushL(regRead);
+ for (TInt i = 0; i < count; ++i)
+ {
+ TUid uid = TUid::Uid(removeUids[i]);
+ Swi::RSisRegistryEntry entry;
+ CleanupClosePushL(entry);
+ if (entry.Open(regRead, uid) == KErrNone)
+ {
+ // Get its augmentations
+ RPointerArray<Swi::CSisRegistryPackage> augmentations;
+ CleanupResetAndDestroy<RPointerArray<Swi::CSisRegistryPackage> >::PushL(augmentations);
+
+ entry.AugmentationsL(augmentations);
+ TInt augCount = augmentations.Count();
+ for (TInt j = 0; j < augCount; ++j)
+ {
+ // Remove it
+ TInt dummyTime;
+ regWrite.DeleteEntryL(*augmentations[j], dummyTime);
+ }
+ // Finally remove the base package entry
+ Swi::CSisRegistryPackage* package = entry.PackageL();
+ CleanupStack::PushL(package);
+ TInt dummyTime;
+ regWrite.DeleteEntryL(*package,dummyTime);
+ CleanupStack::PopAndDestroy(2, &augmentations); // package
+ }
+ CleanupStack::PopAndDestroy(&entry);
+ }
+ CleanupStack::PopAndDestroy(3, &removeUids); // regWrite, regRead
+#endif
+
+ CleanupStack::PopAndDestroy(&testutil);
+
+ return EPass;
+ }