diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/cmd/src/cmdstarterbase.cpp --- /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 +#include "ssmcommandparameters.h" +#include "ssmcommandutilprovider.h" +#include +#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(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(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); + }