sysstatemgmt/systemstarter/src/appstarter2.cpp
changeset 0 4e1aa6a622a0
--- /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;
+	}