--- /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 <f32file.h>
+#include <startupproperties.h>
+
+#include "appstarter2.h"
+#include <startup.hrh>
+#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;
+ }