sysstatemgmt/systemstarter/amastartsrc/amastart.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstarter/amastartsrc/amastart.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,151 @@
+// 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 "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 <e32base.h>
+#include <dscitem.h>
+#include "startsafe.h"
+
+#include "amastart.h"
+
+/**
+ * Used to create an instance of CAmaStart class
+ * @return An instance of CAmaStart
+ */
+EXPORT_C CAmaStart* CAmaStart::NewL()
+	{
+	RDebug::Print(_L(">CAmaStart::NewL"));
+	
+	CAmaStart* ama = new(ELeave) CAmaStart();
+	CleanupStack::PushL(ama);
+	ama->ConstructL();
+	CleanupStack::Pop(ama);
+	
+	RDebug::Print(_L("CAmaStart::NewL>"));
+	return ama;
+	}
+
+
+
+/**
+ * Used to launch AMAs (after market application) from a DSC. 
+ * Returns when processing of the DSC is complete. 
+ * (Synchronous)
+ * @param aDscId Id of the DSC containing AMAs to be started.
+ */
+EXPORT_C void CAmaStart::StartL(const TUid aDscId)
+	{
+	RDebug::Print(_L(">CAmaStart::StartL"));
+	
+	iDscStore.EnumOpenLC(aDscId) ; // leaves if opening fails
+
+	CDscItem* item = iDscStore.EnumReadNextL();
+	while (item)
+		{
+		//if loading of one AMA from the DSC fails we should move to next AMA - so we trap here 
+		TRAP_IGNORE(StartDscItemL(*item));
+		
+		delete item;
+		item = iDscStore.EnumReadNextL();
+		}
+
+	//EnumClose()
+	//Pop and destroy cleanup rollback operation left on cleanstack by EnumOpenLC()
+	CleanupStack::PopAndDestroy();
+	
+	RDebug::Print(_L("CAmaStart::StartL>"));
+	}
+
+/**
+ * Destructor for CAmaStart class
+ */
+EXPORT_C CAmaStart::~CAmaStart()
+	{
+	RDebug::Print(_L( ">CAmaStart::~CAmaStart"));
+	delete iStartSafe;
+	if (&(this)->iDscStore)
+		{
+		iDscStore.Close();
+		}
+	if (&(this)->iSysMon)
+		{
+		iSysMon.Close();
+		}
+	RDebug::Print(_L( "CAmaStart::~CAmaStart>"));
+	}
+
+
+
+void CAmaStart::StartDscItemL(const CDscItem& aDscItem)
+	{
+	RDebug::Print(_L( ">CAmaStart::StartDscItemL"));
+	//A process to be created inside iStartSafe->StartL();
+	RProcess process;
+	CleanupClosePushL(process);
+
+	//Number of retries made for starting the process.
+	TInt tried=0;
+	
+	// start the process
+	const CStartupProperties& properties = aDscItem.StartupProperties();
+	iStartSafe->StartL(properties, process, tried);
+		
+#ifdef _DEBUG
+	_LIT(KNumRetried, "%d times has been retried to start the process successfully");
+	RDebug::Print(KNumRetried, tried);
+#endif
+
+	TInt error=KErrNone;
+	//monitor the process if indicated
+	if(aDscItem.Monitored())
+		{
+		// first time monitoring, so connect with the SysMon server
+		if (iSysMon.Handle() == KNullHandle)
+			{
+			TRAP(error, iSysMon.OpenL());
+			}
+		// monitor the process	
+		if (KErrNone==error) 
+			{
+			TRAP(error, iSysMon.MonitorL(properties, process));
+			}
+		//Connect to SysMon fail or register to monitor the process fail
+		//Kill the started process because Start and Monitor should be one atomic function.
+		if (KErrNone !=error)
+			{
+			process.Kill(error);
+			process.Close();
+			}
+		User::LeaveIfError(error);	
+		}
+	CleanupStack::PopAndDestroy(&process);
+	RDebug::Print(_L( "CAmaStart::StartDscItemL>"));
+	}
+
+
+	
+CAmaStart::CAmaStart()
+	{
+	RDebug::Print(_L(">CAmaStart::CAmaStart> (Empty constructor)"));
+	}
+
+
+
+void CAmaStart::ConstructL()
+	{
+	RDebug::Print(_L(">CAmaStart::ConstructL"));
+	iStartSafe = CStartSafe::NewL();
+	iDscStore.OpenL();
+	RDebug::Print(_L("CAmaStart::ConstructL>"));
+	}