sysstatemgmt/systemstatemgr/cle/src/cmdlistexecutor.cpp
changeset 0 4e1aa6a622a0
child 6 6bb05bdcbe09
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/cle/src/cmdlistexecutor.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,205 @@
+// 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:
+//
+
+#include "cmdlistexecutor.h"
+
+
+
+/**
+ Initiate command processing.
+ */	
+void CSsmCmdListExecutor::StartL( CSsmCommandList* aCmdList )
+	{
+	__ASSERT_DEBUG( (aCmdList->Count() > 0), User::Panic(KCleCmdListBadIdx, KErrArgument) );
+	
+	if( iRunning )
+		{
+		User::Leave( KErrInUse );
+		}
+	
+	iInterCmdDelay = aCmdList->DelayBetweenCommands();
+	if( iInterCmdDelay > 0 ) 
+		{
+		User::LeaveIfError( iTimer.CreateLocal() );
+		// If delays are required. Do a delay before the first execution.
+		iDoDelayToggle = ETrue;
+		}
+
+	iRunning = ETrue;
+	iCommandList = aCmdList; // Ownership transferred after any possible leaves.
+	iCommandCount = iCommandList->Count();
+	
+	iCommandIndex = 0;
+	
+	SetActive();
+	TRequestStatus* trs = &iStatus;
+	User::RequestComplete( trs, KErrNone );
+	}
+
+
+
+/**
+ Successive calls to Execute, but only one per RunL in order for
+ the scheduler/ server to remain responsive.
+ */
+void CSsmCmdListExecutor::RunL()
+	{
+	if( iStatus != KErrNone )
+		{
+		// If a command (or the timer) has completed with an error code, terminate list 
+		// processing and supply the error code to the server.
+		iRunning = EFalse;
+		//cancel all remaining commands
+		for (; iCommandIndex < iCommandCount; iCommandIndex++)
+			{
+			iCommandList->ExecuteCancel(iCommandIndex);
+			}
+		iObserver.ListExecutionComplete( iStatus.Int(), iSessionIndex, iCommandList->Severity(iCommandIndex-1) );
+		}
+	else if( iCommandIndex < iCommandCount )
+		{
+		DoExecute();
+		}
+	else
+		{
+		// The last command must have completed.
+		iRunning = EFalse;
+		iObserver.ListExecutionComplete( iStatus.Int(), iSessionIndex, iCommandList->Severity(iCommandIndex-1) );
+		}
+	}
+	
+	
+
+/**
+ Perform command execution and inter-command delays where required.
+*/
+void CSsmCmdListExecutor::DoExecute()
+	{
+	const TInt KMilliToMicro = 1000;
+	
+	// Are inter-command delays required?
+	if( iInterCmdDelay > 0 )
+		{
+		// Do a delay or execute a command?
+		if( iDoDelayToggle )
+			{
+			DEBUGPRINT2( _L("***** Performing inter-cmd delay of  %d ms"), iInterCmdDelay );
+			iDoDelayToggle = EFalse;
+			iTimer.After( iStatus, iInterCmdDelay * KMilliToMicro );
+			
+			SetActive();			
+			}
+		else
+			{
+			DEBUGPRINT2( _L("***** Exececute cmd no. %d"), iCommandIndex );
+			iDoDelayToggle = ETrue;
+			iCommandList->Execute( iCommandIndex++, iStatus );
+			
+			SetActive();
+			}
+		}
+	else
+		{
+		// Execute the commands without delays.
+		DEBUGPRINT2( _L("***** Execute cmd no. %d without a delay"), iCommandIndex );
+		iCommandList->Execute( iCommandIndex++, iStatus );
+		
+		SetActive();		
+		}
+	
+	}
+
+
+/**
+ Please note: At the time of writing, this is unreachable and therefore untestable code
+ as there are no leaving calls in RunL(). However, if at some future point a leaving call 
+ is added to RunL(), this function may require attention.
+ 
+ The implementation provided notifies the server via ListExecutionComplete()
+*/ 
+TInt CSsmCmdListExecutor::RunError( TInt aError )
+	{	
+	iRunning = EFalse;
+	iObserver.ListExecutionComplete( aError, iSessionIndex, iCommandList->Severity(iCommandIndex) );
+	return KErrNone;
+	}
+
+
+
+/**
+ Cancel the current command.
+ Dispose of iCommandList.
+*/
+void CSsmCmdListExecutor::DoCancel()
+	{
+	if( iCommandList && iRunning )
+		{
+		iTimer.Close();
+		
+		TInt currentCommand = ( 0 == iCommandIndex ) ? 0 : ( iCommandIndex - 1 );
+		iCommandList->ExecuteCancel( currentCommand );
+		iCommandList->DeferredDelete();
+		iCommandList = NULL;
+		
+		iRunning = EFalse;
+		}	
+	}
+	
+	
+	
+CSsmCmdListExecutor* CSsmCmdListExecutor::NewL( MCommandListExecutionObserver& aCmdListObserver, TInt aSessionIndex )
+	{
+	CSsmCmdListExecutor* self = NewLC( aCmdListObserver, aSessionIndex );
+	CleanupStack::Pop();	
+	return self;
+	}
+	
+	
+	
+CSsmCmdListExecutor* CSsmCmdListExecutor::NewLC( MCommandListExecutionObserver& aCmdListObserver, TInt aSessionIndex )
+	{
+	CSsmCmdListExecutor* self = new(ELeave) CSsmCmdListExecutor( aCmdListObserver, aSessionIndex );
+	CleanupStack::PushL( self );
+	self->ConstructL();	
+	return self;
+	}
+
+
+
+void CSsmCmdListExecutor::ConstructL()
+	{
+	CActiveScheduler::Add( this );
+	}
+	
+	
+	
+CSsmCmdListExecutor::CSsmCmdListExecutor( MCommandListExecutionObserver& aCmdListObserver, TInt aSessionIndex  )
+: CActive( EPriorityHigh ), iObserver( aCmdListObserver ), iSessionIndex( aSessionIndex )
+	{
+	}
+	
+	
+	
+CSsmCmdListExecutor::~CSsmCmdListExecutor()
+	{
+	Cancel();
+	if (iCommandList)
+		{
+		iCommandList->DeferredDelete();
+		}
+	}
+
+
+