diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstarter/src/appstarter2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstarter/src/appstarter2.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,125 @@ +// 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 "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: +// + + +#include +#include + +#include "appstarter2.h" +#include +#include "startuputilprovider.h" + +#include "SysStartDebug.h" +#include "sysstartpanic.h" + + +// +// Standard Symbian factory functions +// + +CAppStarter* CAppStarter::NewL(CStartupProperties* aAppInfo, CStartupUtilProvider& aProvider) + { + CAppStarter* self = CAppStarter::NewLC(aAppInfo, aProvider); + CleanupStack::Pop(self); + return self; + } + +CAppStarter* CAppStarter::NewLC(CStartupProperties* aAppInfo, CStartupUtilProvider& aProvider) + { + __ASSERT_ALWAYS(aAppInfo != NULL, PanicNow(KPanicAppStart, ENULLPropertiesPassed)); + + CAppStarter* self = new (ELeave) CAppStarter(aAppInfo, aProvider); + CleanupStack::PushL(self); + return self; + } + +CAppStarter::~CAppStarter() + { + delete iAppInfo; + iProcess.Close(); + } + +CAppStarter::CAppStarter(CStartupProperties* aAppInfo, CStartupUtilProvider& aProvider) + :iProvider(aProvider), iAppInfo(aAppInfo) + { + } + +// +// Public member functions +// + +/** Implementation of MStartupCommand interface. + +@see MStartupCommand. +*/ +void CAppStarter::Execute(TRequestStatus& aCallerStatus) + { + aCallerStatus = KRequestPending; + + TPtrC appFileName = iAppInfo->FileName(); + TPtrC args = iAppInfo->Args(); + TParsePtrC parser(iAppInfo->FileName()); + + DEBUGPRINT3(_L("SysStart: starting %S %S"), &appFileName, &args); + + TInt err = KErrNone; + + TInt tried=0; + + if (iAppInfo->StartMethod() == EDeferredWaitForStart) + { + // Start process asynchronously, iCommandStatus will be checked at MultipleWait + // and monitoring will commence afterwards if required + TRAP(err, iProvider.StartSafe().StartL(*iAppInfo, iProcess, iCommandStatus)); + DEBUGPRINT2(_L("SysStart: Attempted %S with StartMethod()==EDeferredWaitForStart"), &appFileName); + } + else + { + // Start process synchronously for EWaitForStart and EFireAndForget case + TRAP(err, iProvider.StartSafe().StartL(*iAppInfo, iProcess, tried)); + DEBUGPRINT4(_L("SysStart: Attempted %S %d times, result: %d"), &appFileName, (tried + 1), err); + + // Start monitor if required + if (KErrNone == err && iAppInfo->Monitored()) + { + const TBool KEvenIfAlreadyDead = ETrue; + TRAP(err, iProvider.SysMonSessionL().MonitorL(*iAppInfo, iProcess, KEvenIfAlreadyDead)); + DEBUGPRINT3(_L("SysStart: Attempted to monitor %S, result: %d "), &appFileName, err); + } + } + + TRequestStatus* callerStatus = &aCallerStatus; + User::RequestComplete(callerStatus, err); + } + +CStartupProperties& CAppStarter::AppInfo() + { + return *iAppInfo; + } + +RProcess& CAppStarter::Process() + { + return iProcess; + } + +TRequestStatus& CAppStarter::CommandStatus() + { + return iCommandStatus; + } + +void CAppStarter::Release() + { + delete this; + }