--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/cmd/src/ssmdeferrablecommand.cpp Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,143 @@
+// 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 "ssmdeferrablecommand.h"
+#include "ssmdebug.h"
+#include "ssmpanic.h"
+
+CSsmDeferrableCommand::CSsmDeferrableCommand()
+ : iCompletionStatus(KSsmCommandPending), iExecutionBehaviour(ESsmFireAndForget)
+ {
+ }
+
+CSsmDeferrableCommand::CSsmDeferrableCommand(TCmdErrorSeverity aSeverity, TSsmExecutionBehaviour aExecutionBehaviour)
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+ : CSsmCommandBase(aSeverity, KDefaultCommandPriority),
+#else
+ : CSsmCommandBase(aSeverity),
+#endif
+ iCompletionStatus(KSsmCommandPending), iExecutionBehaviour(aExecutionBehaviour)
+ {
+ }
+
+CSsmDeferrableCommand::CSsmDeferrableCommand(TCmdErrorSeverity aSeverity)
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+ : CSsmCommandBase(aSeverity, KDefaultCommandPriority),
+#else
+ : CSsmCommandBase(aSeverity),
+#endif
+ iCompletionStatus(KSsmCommandPending), iExecutionBehaviour(ESsmFireAndForget)
+ {
+ }
+
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+CSsmDeferrableCommand::CSsmDeferrableCommand(TCmdErrorSeverity aSeverity, TSsmExecutionBehaviour aExecutionBehaviour, const TUint16 aPriority)
+ : CSsmCommandBase(aSeverity, aPriority), iCompletionStatus(KSsmCommandPending), iExecutionBehaviour(aExecutionBehaviour)
+ {
+ }
+
+CSsmDeferrableCommand::CSsmDeferrableCommand(TCmdErrorSeverity aSeverity, const TUint16 aPriority)
+ : CSsmCommandBase(aSeverity, aPriority), iCompletionStatus(KSsmCommandPending), iExecutionBehaviour(ESsmFireAndForget)
+ {
+ }
+
+#endif
+CSsmDeferrableCommand::~CSsmDeferrableCommand()
+ {
+ }
+
+TBool CSsmDeferrableCommand::IsDeferred() const
+ {
+ return iExecutionBehaviour != ESsmWaitForSignal;
+ }
+
+TSsmExecutionBehaviour CSsmDeferrableCommand::ExecutionBehaviour() const
+ {
+ return iExecutionBehaviour;
+ }
+
+TInt CSsmDeferrableCommand::CompletionStatus() const
+ {
+ return iCompletionStatus;
+ }
+
+void CSsmDeferrableCommand::RegisterCompletionObserver(TRequestStatus& aStatus)
+ {
+ __ASSERT_ALWAYS(iCompletionObserver == NULL, PanicNow(KPanicDeferrableCommand, EInvalidDeferrebleCmdRegistration)); // guard against registering more than once
+ aStatus = KRequestPending;
+ iCompletionObserver = &aStatus;
+
+ if (iCompletionStatus != KSsmCommandPending)
+ {
+ CompleteRequest(*iCompletionObserver, KErrNone);
+ iCompletionObserver = NULL;
+ }
+ }
+
+void CSsmDeferrableCommand::RegisterCompletionObserverCancel()
+ {
+ if (iCompletionObserver)
+ {
+ // assume the request is still pending
+ CompleteRequest(*iCompletionObserver, KErrCancel);
+ iCompletionObserver = NULL;
+ }
+ }
+
+TBool CSsmDeferrableCommand::EvaluateCondition(MSsmConditionalCallback* aCallback, CResourceFile* aResourceFile)
+ {
+ TBool ret = CSsmCommandBase::EvaluateCondition(aCallback, aResourceFile);
+ if (ret == EFalse)
+ {
+ // Need to set iCompletionStatus to KErrNone as this command will never run
+ CompleteDeferredExecuteRequest(KErrNone);
+ }
+ return ret;
+ }
+
+void CSsmDeferrableCommand::CompleteDeferredExecuteRequest(TInt aReason)
+ {
+ if (iCompletionObserver)
+ {
+ // notify observer of command completion
+ CompleteRequest(*iCompletionObserver, KErrNone); // observer is expected to call CompletionCode() to get the error code
+ iCompletionObserver = NULL;
+ }
+
+ if (Severity()==ECmdIgnoreFailure && aReason!=KErrCancel)
+ {
+ iCompletionStatus = KErrNone;
+ }
+ else
+ {
+ iCompletionStatus = aReason;
+ }
+ DEBUGVERBOSE2A("iCompletionStatus set to %d", iCompletionStatus);
+
+ if (iExecutionBehaviour != ESsmDeferredWaitForSignal)
+ {
+ CompleteExecuteRequest(aReason);
+ }
+ }
+
+void CSsmDeferrableCommand::ValidateL()
+ {
+ if (iExecutionBehaviour != ESsmFireAndForget &&
+ iExecutionBehaviour != ESsmWaitForSignal &&
+ iExecutionBehaviour != ESsmDeferredWaitForSignal )
+ {
+ User::Leave(KErrArgument);
+ }
+ }