sysstatemgmt/systemstarter/amastartsrc/amastartasync.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstarter/amastartsrc/amastartasync.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,224 @@
+// Copyright (c) 2007-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "amastartasync.h"
+
+#include "ssmdebug.h"
+
+CAmaStartAsync* CAmaStartAsync::NewL( RMessage2 aMessage )
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::NewL" );
+	
+	CAmaStartAsync* self = NewLC( aMessage );
+	CleanupStack::Pop();
+	
+	DEBUGPRINT1A( "CAmaStartAsync::NewL>" );
+	return self;
+	}
+	
+	
+	
+CAmaStartAsync* CAmaStartAsync::NewLC( RMessage2 aMessage )
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::NewLC" );
+	
+	CAmaStartAsync* self = new(ELeave) CAmaStartAsync( aMessage );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	
+	DEBUGPRINT1A( ">CAmaStartAsync::NewLC" );
+	return self;
+	}
+
+
+
+CAmaStartAsync::~CAmaStartAsync()
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::~CAmaStartAsync" );
+	
+	Cancel();
+
+	delete iStartSafe;
+	if (iDscStore.IsOpened())
+		{
+		iDscStore.Close();
+		}
+	iSysMon.Close();
+	
+	DEBUGPRINT1A( "CAmaStartAsync::~CAmaStartAsync>" );
+	}
+
+
+
+/**
+ * Initiate AMA processing.
+ */	
+void CAmaStartAsync::StartL( const TUid& aDscId )
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::StartL" );
+	
+	if( iRunning )
+		{
+		User::Leave( KErrInUse );
+		}
+
+	DEBUGPRINT1( _L("***** Set running") );
+	
+	iRunning = ETrue;
+	iDscStore.EnumOpenLC(aDscId);
+	CleanupStack::Pop();
+		
+	SetActive();
+	TRequestStatus* trs = &iStatus;
+	User::RequestComplete( trs, KErrNone );
+	
+	DEBUGPRINT1A( "CAmaStartAsync::StartL>" );
+	}
+
+
+
+/**
+ * Succsessive calls to StartDscItemL, but only one per RunL in order for
+ * the scheduler/ server to remain responsive.
+ */
+void CAmaStartAsync::RunL()
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::RunL %d" );
+	CDscItem* item = iDscStore.EnumReadNextL();
+	if (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;
+		
+		SetActive();
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrNone);
+		
+		}
+	else // No more items in store, so finish here
+		{
+		iDscStore.EnumClose();
+		iDscStore.Close();
+		iMessage.Complete(KErrNone);
+		}
+
+	DEBUGPRINT1A( "CAmaStartAsync::RunL>" );
+	}
+	
+	
+
+TInt CAmaStartAsync::RunError( TInt aError )
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::RunError" );
+	
+	iDscStore.EnumClose();
+	iDscStore.Close();
+	iMessage.Complete(aError);
+	
+	DEBUGPRINT1A( "CAmaStartAsync::RunError>" );
+	return KErrNone;
+	}
+
+
+
+/**
+ * Cancel the current command.
+ */
+void CAmaStartAsync::DoCancel()
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::DoCancel" );
+
+	if( iRunning )
+		{
+		iDscStore.EnumClose();
+		iMessage.Complete(KErrCancel);
+		iRunning = EFalse;
+		}
+	
+	DEBUGPRINT1A( "CAmaStartAsync::DoCancel>" );
+	}
+	
+
+
+void CAmaStartAsync::ConstructL()
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::ConstructL" );
+	
+	iStartSafe = CStartSafe::NewL();
+	iDscStore.OpenL();
+	CActiveScheduler::Add( this );
+	
+	DEBUGPRINT1A( "CAmaStartAsync::ConstructL>" );
+	}
+	
+	
+	
+CAmaStartAsync::CAmaStartAsync( RMessage2 aMessage )
+: CActive( EPriorityStandard ), iMessage( aMessage )
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::CAmaStartAsync> (Empty constructor)" );
+	}
+	
+	
+
+void CAmaStartAsync::StartDscItemL(const CDscItem& aDscItem)
+	{
+	DEBUGPRINT1A( ">CAmaStartAsync::StartDscItemL" );
+	
+	//A process to be created inside iStartSafe->StartL();
+	RProcess 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);
+	
+	DEBUGPRINT2(_L("%d times has been retried to start the process successfully"), tried);
+
+	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);	
+		}
+		
+	DEBUGPRINT1A( "CAmaStartAsync::StartDscItemL>" );
+	}