diff -r 76f9aaeefbab -r e13acd883fbe common/tools/ats/smoketest/lbs/internal/lbstestserver/src/cprocesslaunch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/tools/ats/smoketest/lbs/internal/lbstestserver/src/cprocesslaunch.cpp Tue Nov 10 13:50:58 2009 +0000 @@ -0,0 +1,102 @@ +// 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 "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// processlaunch.cpp +// +// + +#include +#include "cprocesslaunch.h" + +//---------------------------------------------------------------------------- + +/** called by the launcher! Launch the process by specified parameters +find the process and launch it + +@param aParams A reference to TProcessStartParams object +@return Symbian error code +@see TProcessStartParams +@internalTechnology +@released + */ +TInt CProcessLaunch::ProcessLaunch(TProcessStartParams& aParams) +// now prevents multiple instances of the same image being launched! +// So P&S servers now look like realCServer2 servers. + { + TFullName fullName; + _LIT(KStar, "*"); + TParse parser; + parser.SetNoWild(aParams.GetProcessFileName(), NULL, NULL); + fullName.Append(parser.NameAndExt()); + fullName.Append(KStar); + + TFindProcess processFinder(fullName); + TInt err = KErrNotFound; + while (err = processFinder.Next(fullName), err == KErrNone) + { + RProcess process; + TInt processOpenErr = process.Open(processFinder); + if (processOpenErr == KErrNone) + { + TExitType exitType = process.ExitType(); + if (exitType == EExitPending) + { + // Found a running instance of the process, + // so return without starting another instance. + process.Close(); + return KErrNone; + } + } + process.Close(); + } + + // No running instance found, so start one. + return (DoProcessLaunch(aParams)); + } + +/** Create the process by specified parameters and wait for the request + +@param aParams A reference to TProcessStartParams object +@return Symbian error code +@see TProcessStartParams +@internalTechnology +@released + */ +TInt CProcessLaunch::DoProcessLaunch(TProcessStartParams& aParams) + { + RProcess process; + + TInt r=process.Create(aParams.GetProcessFileName(),aParams.GetAsCommandLine()); + if (r!=KErrNone) + { + return r; + } + // are we expecing to rendezvous with the process we have created above + if(aParams.GetRendezvousRequired()) + { + TRequestStatus stat; + process.Rendezvous(stat); + if (stat!=KRequestPending) + { + process.Kill(0); + } + else + { + process.Resume(); + } + User::WaitForRequest(stat); + r=(process.ExitType()==EExitPanic) ? KErrGeneral : stat.Int(); + } + process.Close(); + return r; + }