installationservices/swi/test/testexes/killrunningprocess.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/test/testexes/killrunningprocess.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2006-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: 
+* This program kills all instances of a running exes specified in the command
+* line.
+* Usage: killrunningprocess <uid in hex> [delay in microseconds]
+* If no delay is specified the kill will be attempted immediately.
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include <e32base.h>
+#include <bacline.h>
+
+// private
+LOCAL_C void mainL();
+TInt E32Main() // main function called by E32
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
+
+	TRAPD(error,mainL()); // Trap main execution
+	delete cleanup; // destroy clean-up stack
+	__UHEAP_MARKEND;
+	return error; // and return
+	}
+
+LOCAL_C void mainL()
+	{
+	CCommandLineArguments* cmdLine = CCommandLineArguments::NewLC();
+	TInt argTotal=cmdLine->Count();
+	if (argTotal < 2 || argTotal > 3)
+		{
+		User::Leave(KErrArgument);
+		}
+	TUint sidRequested;
+	TLex processLex(cmdLine->Arg(1));
+	User::LeaveIfError(processLex.Val(sidRequested, EHex));
+	if (sidRequested == 0)
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	if (argTotal == 3)
+		{
+		TUint timeout;
+		TLex timeoutLex(cmdLine->Arg(2));
+		User::LeaveIfError(timeoutLex.Val(timeout));
+		if (timeout > 0)
+			{
+			User::After(timeout);
+			}
+		}
+
+	TUid sid = {sidRequested};
+	TBool needToScanFullList;
+	TFullName fullName;
+
+	do
+		{
+		needToScanFullList = EFalse;
+		TFindProcess findProcess;
+
+		while(findProcess.Next(fullName) == KErrNone)
+			{
+			RProcess process;
+			TInt ret=KErrNone;
+			TInt count=0;
+			do
+			{
+			count++;
+ 			ret=process.Open(findProcess);
+			if (ret!=KErrNone)
+				{
+				User::After(200000);
+				}
+			}while (ret!=KErrNone && count<=10);
+			if (ret!=KErrNone)
+				{
+				User::Leave(ret);
+				}
+
+			TUid processSid(process.SecureId());
+			if (processSid == sid && process.ExitType() == EExitPending)
+				{
+				process.Kill(KErrNone);
+				needToScanFullList = ETrue;
+				}
+			process.Close();
+			}
+		} while (needToScanFullList);
+
+	CleanupStack::PopAndDestroy(cmdLine);
+	}