--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/cmd/src/cmdstarterbase.cpp Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,252 @@
+// 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 <s32strm.h>
+#include "ssmcommandparameters.h"
+#include "ssmcommandutilprovider.h"
+#include <ssm/ssmstartupproperties.h>
+#include "ssmdebug.h"
+#include "ssmpanic.h"
+
+#include "cmdstartprocess.h"
+#include "cmdstartapp.h"
+
+/**
+Destructor
+*/
+CCmdStarterBase::~CCmdStarterBase()
+ {
+ Cancel();
+ delete iAppInfo;
+ iProcess.Close();
+ }
+
+/**
+Execute this command
+@param aStatus Completed to indicate execution of the next command may begin.
+@panic ECmdNullPtr if the information used to create command is null
+*/
+void CCmdStarterBase::Execute(TRequestStatus& aStatus)
+ {
+ __ASSERT_ALWAYS(iUtilProvider, PanicNow(KPanicCmdStarterBase, ECmdNullPtr));
+ __ASSERT_ALWAYS(iAppInfo, PanicNow(KPanicCmdStarterBase, ECmdNullPtr));
+
+ aStatus = KRequestPending;
+ iExecuteRequest = &aStatus;
+ TPtrC fileName = iAppInfo->FileName();
+ TPtrC args = iAppInfo->Args();
+ iExecutionBehaviour = iAppInfo->ExecutionBehaviour();
+ DEBUGPRINT4(_L("Starting : %S with arguments : %S and Execution behaviour : %d"), &fileName, &args, iExecutionBehaviour);
+
+ iUtilProvider->StartSafe().Start(*iAppInfo, iProcess, iStatus, iCallerIndex);
+ if (iExecutionBehaviour == ESsmDeferredWaitForSignal)
+ {
+ // complete the command request and initiate execution of next command
+ CompleteExecuteRequest(KErrNone);
+ }
+ SetActive();
+ }
+
+/**
+Releases resources associated with this BIC
+*/
+void CCmdStarterBase::Release()
+ {
+ delete this;
+ }
+
+/**
+Cancels the BIC
+*/
+void CCmdStarterBase::ExecuteCancel()
+ {
+ //cancel the outstanding request
+ Cancel();
+ //and complete the request with KErrCancel
+ CompleteDeferredExecuteRequest(KErrCancel);
+ }
+
+/**
+Returns the type of the BIC
+@return Type of BIC
+*/
+TSsmCommandType CCmdStarterBase::Type() const
+ {
+ return iCommandType;
+ }
+/**
+*/
+void CCmdStarterBase::ExternalizeL(RWriteStream& aWriteStream) const
+ {
+ aWriteStream.WriteInt16L(iSeverity);
+ iAppInfo->ExternalizeL(aWriteStream);
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+ aWriteStream.WriteUint16L(iPriority);
+#endif
+ }
+
+/**
+Handles command's request completion event.
+Request for ESsmDeferredWaitForSignal & ESsmFireAndForget is completed in
+Execute() but completion code will be completed here.
+*/
+void CCmdStarterBase::RunL()
+ {
+ TInt err = iStatus.Int();
+ TPtrC fileName = iAppInfo->FileName();
+ DEBUGPRINT3(_L("%S started with err : %d "), &fileName, err);
+ SSMLOGLEAVEIFERROR(err);
+
+ // start monitor if required, for cmds with execution behaviour = ESsmWaitForSignal/ESsmDeferredWaitForSignal
+ // Monitor can not be started for ESsmFireAndForget
+ if ((iAppInfo->ExecutionBehaviour() != ESsmFireAndForget) && iAppInfo->IsMonitoringRequired())
+ {
+ // sysmon doesn't monitor the applications with deferredwaitforsignal
+ // execution behaviour, so changing it to waitforsignal
+ if (iAppInfo->ExecutionBehaviour() == ESsmDeferredWaitForSignal)
+ {
+ iAppInfo->SetExecutionBehaviour(ESsmWaitForSignal);
+ }
+ DEBUGPRINT2(_L("Starting monitor for %S"), &fileName);
+ iUtilProvider->SysMonSessionL().MonitorL(*iAppInfo, iProcess);
+ }
+
+ CompleteDeferredExecuteRequest(err);
+ }
+
+/**
+Cancellation of an outstanding request.
+*/
+void CCmdStarterBase::DoCancel()
+ {
+ iUtilProvider->StartSafe().StartCancel(iCallerIndex);
+ }
+
+/**
+Complete the command request with aError. It gets called when RunL leaves.
+@param aError Error code with which RunL has left.
+@return KErrNone as error is handled in this function.
+*/
+TInt CCmdStarterBase::RunError(TInt aError)
+ {
+ DEBUGPRINT2A("CCmdStarterBase::RunError called with reason %d", aError);
+ CompleteDeferredExecuteRequest(aError);
+ return KErrNone;
+ }
+
+/**
+Constructs the object through read stream.
+@param aReadStream A read stream containing BIC data
+*/
+void CCmdStarterBase::ConstructL(RReadStream& aReadStream)
+ {
+ iAppInfo = CSsmStartupProperties::NewL();
+ InternalizeL(aReadStream);
+ ValidateL(); //validate command's data
+ }
+
+/**
+Constructs an object from resource file.
+@param aCommandParameters Object data from a resource file
+*/
+void CCmdStarterBase::ConstructL(TSsmCommandParameters& aCommandParameters)
+ {
+ RResourceReader& reader = aCommandParameters.MainReader();
+ iSeverity = static_cast<TCmdErrorSeverity>(reader.ReadInt16L());
+ iAppInfo = CSsmStartupProperties::NewL(reader, aCommandParameters.ResourceFile(), Type());
+ iExecutionBehaviour = iAppInfo->ExecutionBehaviour();
+ ValidateL(); //validate command's data
+ }
+
+
+/**
+Constructs an object from aAppInfo.
+@param aAppInfo Startup properties through which command will be constructed.
+*/
+void CCmdStarterBase::ConstructL(const CSsmStartupProperties* aAppInfo)
+ {
+ SSMLOGLEAVEIFTRUE(aAppInfo == NULL, KErrArgument);
+ iAppInfo = CSsmStartupProperties::NewL(*aAppInfo);
+ iExecutionBehaviour = iAppInfo->ExecutionBehaviour();
+ ValidateL(); //validate command's data
+ }
+/**
+Constructs an object from aAppInfo, Must be used only by CLE
+@param aAppInfo Startup properties through which command will be constructed.
+@param aFalse is dummy variable to bypass the validation of command
+*/
+void CCmdStarterBase::ConstructL(const CSsmStartupProperties *aAppInfo, TBool /*aFalse*/)
+ {
+ SSMLOGLEAVEIFTRUE(aAppInfo == NULL, KErrArgument);
+ iAppInfo = CSsmStartupProperties::NewL(*aAppInfo);
+ iExecutionBehaviour = iAppInfo->ExecutionBehaviour();
+ }
+
+/**
+Overloaded CTOR
+@param aCommandType Command type, It can be either ESsmCmdStartApp or ESsmCmdStartProcess
+*/
+CCmdStarterBase::CCmdStarterBase(TSsmCommandType aCommandType)
+ : iCommandType(aCommandType)
+ {
+ }
+
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+/**
+Overloaded CTOR
+@param aCommandType Command type, It can be either ESsmCmdStartApp or ESsmCmdStartProcess
+@param aSeverity Severity of the command
+@param aPriority The priority of the command in the list
+*/
+CCmdStarterBase::CCmdStarterBase(TSsmCommandType aCommandType, TCmdErrorSeverity aSeverity, const TUint16 aPriority)
+ : CSsmDeferrableCommand(aSeverity, aPriority), iCommandType(aCommandType)
+ {
+ }
+#endif
+
+/**
+Overloaded CTOR
+@param aCommandType Command type, It can be either ESsmCmdStartApp or ESsmCmdStartProcess
+@param aSeverity Severity of the command
+*/
+CCmdStarterBase::CCmdStarterBase(TSsmCommandType aCommandType, TCmdErrorSeverity aSeverity)
+ : CSsmDeferrableCommand(aSeverity), iCommandType(aCommandType)
+ {
+ }
+
+/**
+Configures the BIC using data contained in a ReadStream
+@param aReadStream A read stream containing BIC data
+*/
+void CCmdStarterBase::InternalizeL(RReadStream& aReadStream)
+ {
+ iSeverity = static_cast<TCmdErrorSeverity>(aReadStream.ReadInt16L());
+ iAppInfo->InternalizeL(aReadStream);
+ iExecutionBehaviour = iAppInfo->ExecutionBehaviour();
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+ iPriority = aReadStream.ReadUint16L();
+#endif
+ }
+
+/**
+Helper function to validate commands data.
+@leave KErrArgument If execution behaviour is wrong or FileName() of AppInfo is NULL.
+*/
+void CCmdStarterBase::ValidateL()
+ {
+ CSsmDeferrableCommand::ValidateL();
+ SSMLOGLEAVEIFTRUE(iAppInfo->Retries() < 0, KErrArgument);
+ SSMLOGLEAVEIFTRUE(iAppInfo->FileName() == KNullDesC, KErrArgument);
+ }