diff -r 000000000000 -r ba25891c3a9e installationservices/swi/test/tuiscriptadaptors/forceremove.cpp --- /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 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 augmentations; + CleanupResetAndDestroy >::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; + }