systemhealthmanagement/systemhealthmgr/startuppropertiessrc/startupproperties.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/systemhealthmanagement/systemhealthmgr/startuppropertiessrc/startupproperties.cpp Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,628 @@
+// Copyright (c) 2006-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 "startupproperties.h"
+#include <barsread.h>
+#include <e32debug.h>
+#include <s32mem.h>
+#include <e32hal.h>
+#include <e32modes.h>
+
+#include "shmadebug.h"
+#include "shmapanic.h"
+
+/** Internal version for the CStartupProperties object created by the NewL factory
+@internalTechnology
+*/
+const TInt KParameterObjectVersion = 1;
+
+/**
+Used to create an instance of CStartupProperties class.
+@return An instance of CStartupProperties
+@publishedPartner
+@deprecated
+*/
+EXPORT_C CStartupProperties* CStartupProperties::NewL()
+ {
+ CStartupProperties* properties = CStartupProperties::NewLC();
+ CleanupStack::Pop(properties);
+ return properties;
+ }
+
+/**
+Used to create an instance of CStartupProperties class.
+The new instance is put on the CleanupStack.
+@return An instance of CStartupProperties
+@publishedPartner
+@deprecated
+*/
+EXPORT_C CStartupProperties* CStartupProperties::NewLC()
+ {
+ CStartupProperties* properties = new(ELeave) CStartupProperties();
+ CleanupStack::PushL(properties);
+ properties->ConstructL();
+ return properties;
+ }
+
+/**
+Used to create an instance of CStartupProperties class with the specified process
+filename and arguments.
+@param aFileName A file name containing full path to be used to start up a component.
+@param aArgs A string that will be used as an argument to the component when starting.
+@return An instance of CStartupProperties
+@publishedPartner
+@deprecated
+*/
+EXPORT_C CStartupProperties* CStartupProperties::NewL(const TDesC& aFileName, const TDesC& aArgs)
+ {
+ CStartupProperties* properties = CStartupProperties::NewLC(aFileName, aArgs);
+ CleanupStack::Pop(properties);
+ return properties;
+ }
+
+/**
+Used to create an instance of CStartupProperties class with the specified process
+filename and arguments. The new instance is pushed onto the CleanupStack.
+@see CStartupProperties::NewL(const TDesC& aFileName, const TDesC& aArgs)
+@publishedPartner
+@deprecated
+*/
+EXPORT_C CStartupProperties* CStartupProperties::NewLC(const TDesC& aFileName, const TDesC& aArgs)
+ {
+ CStartupProperties* properties = CStartupProperties::NewLC();
+ properties->SetFileParamsL(aFileName, aArgs);
+ return properties;
+ }
+
+/**
+Used to create an instance of CStartupProperties class from a resource definition.
+Supported resource structs are @c START_PROCESS_INFO, @c START_PROCESS_INFO2,
+@c START_APP_INFO and @c START_APP_INFO2.
+@return An instance of CStartupProperties
+@param aSource The resource reader with which to access the resource values
+@publishedPartner
+@deprecated
+@panic EInvalidCommandType if the Command type is invalid
+@panic EInvalidStartMethod if the start method is invalid
+@panic EInvalidTimeout if start method is not EWaitForStart then timeout value should be zero
+@panic EInvalidNoOfRetries if start method is not EWaitForStart then no_of_retries should be zero
+@panic EInvalidRecoveryMethod if the Recovery method called after a command failure is invalid
+*/
+EXPORT_C CStartupProperties* CStartupProperties::NewL(TResourceReader& aSource)
+ {
+ CStartupProperties* properties = CStartupProperties::NewLC(aSource);
+ CleanupStack::Pop(properties);
+ return properties;
+ }
+
+/**
+Used to create an instance of CStartupProperties class from a resource definition.
+The new instance is put on the CleanupStack.
+@see CStartupProperties::NewL(TResourceReader& aResourceReader)
+@publishedPartner
+@deprecated
+*/
+EXPORT_C CStartupProperties* CStartupProperties::NewLC(TResourceReader& aSource)
+ {
+ CStartupProperties* properties = CStartupProperties::NewLC();
+ properties->ConstructFromResourceL(aSource);
+ return properties;
+ }
+
+CStartupProperties::CStartupProperties() :
+ iVersion(KParameterObjectVersion),
+ iStartupType(EStartProcess),
+ iStartMethod(EFireAndForget),
+ iRestartMode(EStartupModeUndefined)
+ {
+ iRecoveryMethod.iRecoveryMethod = EIgnoreOnFailure;
+ }
+
+void CStartupProperties::ConstructL()
+ {
+ }
+
+/**
+Reset all variables in this instance back to constructor defaults.
+@publishedPartner
+@deprecated
+*/
+EXPORT_C void CStartupProperties::Reset()
+ {
+ //from constructor
+ iVersion = KParameterObjectVersion;
+ iStartupType = EStartProcess;
+ iStartMethod = EFireAndForget;
+ iRestartMode = EStartupModeUndefined;
+ iRecoveryMethod.iRecoveryMethod = EIgnoreOnFailure;
+ //from CBase
+ delete iArgs;
+ iArgs = NULL;
+ delete iFileName;
+ iFileName = NULL;
+ iNoOfRetries = 0;
+ iTimeout = 0;
+ iMonitored = EFalse;
+ iViewless = EFalse;
+ iStartInBackground = EFalse;
+ }
+
+/**
+Destructor for CStartupProperties class
+@publishedPartner
+@deprecated
+*/
+EXPORT_C CStartupProperties::~CStartupProperties()
+ {
+ delete iArgs;
+ delete iFileName;
+ }
+
+/** Accessor function returning internal version of the parameter object
+@publishedPartner
+@deprecated
+@return Internal version of the parameter object
+*/
+EXPORT_C TInt CStartupProperties::Version() const
+ {
+ return iVersion;
+ }
+
+/** Sets file parameters
+@publishedPartner
+@deprecated
+@param aFileName A file name containing full path to be used to start up a component.
+@param aArgs A string that will be used as an argument to the component when starting.
+*/
+EXPORT_C void CStartupProperties::SetFileParamsL(const TDesC& aFileName, const TDesC& aArgs)
+ {
+ HBufC* fname = aFileName.AllocL();
+ delete iFileName;
+ iFileName = fname;
+ TPtr writeableFilename = iFileName->Des();
+ writeableFilename.TrimAll();
+
+ HBufC* args = aArgs.AllocL();
+ delete iArgs;
+ iArgs = args;
+ TPtr writeableArgs = iArgs->Des();
+ writeableArgs.TrimAll();
+ }
+
+/** Sets startup type parameter
+@publishedPartner
+@deprecated
+@param aStartupType EStartProcess for starting processes, EStartApp for starting applications
+*/
+EXPORT_C void CStartupProperties::SetStartupType(TStartupType aStartupType)
+ {
+ iStartupType = aStartupType;
+ }
+
+/** Sets startup method parameter.
+@publishedPartner
+@deprecated
+@param aStartMethod The method to be used to start up the component.
+*/
+EXPORT_C void CStartupProperties::SetStartMethod(TStartMethod aStartMethod)
+ {
+ iStartMethod = aStartMethod;
+ }
+
+/** Sets failure parameter @c NoOfRetries. Only valid when @c TStartMethod = @c EWaitForStart.
+@publishedPartner
+@deprecated
+@param aNoOfRetries Number of retries to attempt if the component fails to start for the first
+ time during system startup. Also determines if a monitored component should be
+ restarted when it fails. Only valid when @c TStartMethod = @c EWaitForStart.
+*/
+EXPORT_C void CStartupProperties::SetNoOfRetries(TInt aNoOfRetries)
+ {
+ iNoOfRetries = aNoOfRetries;
+ }
+
+/** Sets failure parameter Timeout. Used together with start-method @c EWaitStart to determine
+how long to wait for the component being started to rendevouz before aborting an attempt.
+@publishedPartner
+@deprecated
+@param aTimeout The time in milliseconds to wait before terminating a component
+ that's taking longer to start (rendezvouz) than this specified timeout value.
+ A value of zero means "do not time this component out". Only valid when
+ @c TStartMethod = @c EWaitForStart.
+*/
+EXPORT_C void CStartupProperties::SetTimeout(TInt aTimeout)
+ {
+ iTimeout = aTimeout;
+ }
+
+/** Sets the monitoring parameter. Monitoring a component means the System Monitor server
+observes the component and takes action when it exits. When a monitored component
+exits, the System Monitor server will try to restart it the number of times specified in
+@c NoOfRetries. If the number of retries is 0, or the number of retries have been exhausted,
+the @c TRecoveryMethod is executed.
+@publishedPartner
+@deprecated
+@param aMonitored ETrue if the component should be monitored for failure
+*/
+EXPORT_C void CStartupProperties::SetMonitored(TBool aMonitored)
+ {
+ iMonitored = aMonitored;
+ }
+
+/** Sets recovery parameters. When a component being monitored exits and the system fails
+to restart the component within the specified number of retries, the @c TRecoveryMethod
+is executed.
+Used to set the retry_failure_recovery_method within START_PROCESS_INFO2 and
+START_APP_INFO2 structures.
+
+@publishedPartner
+@deprecated
+@param aRecoveryMethod The method to use to recover when a monitored component fails.
+@param aRestartMode The startup mode to restart the OS if recovery method is @c ERestartOSWithMode.
+ If aRecoveryMethod==ERestartOS this parameter should be zero.
+*/
+EXPORT_C void CStartupProperties::SetRecoveryParams(TRecoveryMethod aRecoveryMethod, TInt aRestartMode)
+ {
+ iRecoveryMethod.iRecoveryMethod = aRecoveryMethod;
+ iRestartMode = aRestartMode;
+ }
+
+/** Action to be taken on command failure. Provides backward compatibility with earlier SSC format.
+Used to set the fail_on_error fields within START_PROCESS_INFO, START_APP_INFO, START_DLL_INFO,
+and MULTIPLE_WAIT structures.
+
+@publishedPartner
+@deprecated
+@param aActionOnCommandFailure Action to be taken if the system starter command fails.
+*/
+EXPORT_C void CStartupProperties::SetActionOnCommandFailure(TActionOnCommandFailure aActionOnCommandFailure)
+ {
+ iRecoveryMethod.iActionOnCommandFailure = aActionOnCommandFailure;
+ }
+
+/** Sets extra startup viewless parameter only needed if starting an application
+@publishedPartner
+@deprecated
+@param aViewless ETrue if the application should be viewless
+*/
+EXPORT_C void CStartupProperties::SetViewless(TBool aViewless)
+ {
+ iViewless = aViewless;
+ }
+
+/** Sets extra startup start in background parameter only needed if starting an application
+@publishedPartner
+@deprecated
+@param aStartInBackground ETrue if the application should start in the background
+*/
+EXPORT_C void CStartupProperties::SetStartInBackground(TBool aStartInBackground)
+ {
+ iStartInBackground = aStartInBackground;
+ }
+
+/** Accessor function returning filename property
+@publishedPartner
+@deprecated
+@return Filename property
+*/
+EXPORT_C TPtrC CStartupProperties::FileName() const
+ {
+ return (iFileName) ? *iFileName : KNullDesC();
+ }
+
+/** Accessor function returning arguments property
+@publishedPartner
+@deprecated
+@return Arguments property
+*/
+EXPORT_C TPtrC CStartupProperties::Args() const
+ {
+ return (iArgs) ? *iArgs : KNullDesC();
+ }
+
+/** Accessor function returning startup type property
+@publishedPartner
+@deprecated
+@return Startup type property
+*/
+EXPORT_C TStartupType CStartupProperties::StartupType() const
+ {
+ return iStartupType;
+ }
+
+/** Accessor function returning start method property
+@publishedPartner
+@deprecated
+@return Start method property
+*/
+EXPORT_C TStartMethod CStartupProperties::StartMethod() const
+ {
+ return iStartMethod;
+ }
+
+/** Accessor function returning number of retries property.
+Only valid when @c TStartMethod = @c EWaitForStart.
+@publishedPartner
+@deprecated
+@return Number of retries property
+*/
+EXPORT_C TInt CStartupProperties::NoOfRetries() const
+ {
+ return iNoOfRetries;
+ }
+
+/** Accessor function returning timeout property.
+Only valid when @c TStartMethod = @c EWaitForStart.
+@publishedPartner
+@deprecated
+@return Timeout property
+*/
+EXPORT_C TInt CStartupProperties::Timeout() const
+ {
+ return iTimeout;
+ }
+
+/** Accessor function returning the legacy fail_on_error property
+used by the old resource structs START_APP_INFO and START_PROCESS_INFO.
+@publishedPartner
+@deprecated
+@return Recovery method property
+*/
+EXPORT_C TActionOnCommandFailure CStartupProperties::ActionOnCommandFailure() const
+ {
+ return iRecoveryMethod.iActionOnCommandFailure;
+ }
+
+/** Accessor function returning recovery method property read from
+the retry_failure_recovery_method property in the resource structs
+START_PROCESS_INFO2 and START_APP_INFO2.
+@publishedPartner
+@deprecated
+@return Recovery method property
+*/
+EXPORT_C TRecoveryMethod CStartupProperties::RecoveryMethod() const
+ {
+ return iRecoveryMethod.iRecoveryMethod;
+ }
+
+/** Accessor function returning restart mode property
+@publishedPartner
+@deprecated
+@return Restart mode property
+*/
+EXPORT_C TInt CStartupProperties::RestartMode() const
+ {
+ return iRestartMode;
+ }
+
+/** Accessor function returning monitored property
+@publishedPartner
+@deprecated
+@return Monitored property
+*/
+EXPORT_C TBool CStartupProperties::Monitored() const
+ {
+ return iMonitored;
+ }
+
+/** Accessor function returning viewless property
+@publishedPartner
+@deprecated
+@return Viewless property
+*/
+EXPORT_C TBool CStartupProperties::Viewless() const
+ {
+ return iViewless;
+ }
+
+/** Accessor function returning start in background property
+@publishedPartner
+@deprecated
+@return Start in background property
+*/
+EXPORT_C TBool CStartupProperties::StartInBackground() const
+ {
+ return iStartInBackground;
+ }
+
+/** Externalize the class into a buffer.
+This function has to be updated every time a member has been added to the class to maintain binary
+compatibility.
+@internalTechnology
+@released
+@param aBufPtr A buffer of sufficient size to contain the externalized class data on function return
+*/
+EXPORT_C void CStartupProperties::ExternalizeL(CBufBase& aBufPtr) const
+ {
+ RBufWriteStream writeStream(aBufPtr);
+
+ writeStream.WriteInt32L(iVersion);
+ writeStream << FileName();
+ writeStream << Args();
+ writeStream.WriteInt8L(iStartupType); //enumeration has few values so 8bit should be enough
+ writeStream.WriteInt8L(iStartMethod); //enumeration has few values so 8bit should be enough
+ writeStream.WriteInt32L(iNoOfRetries);
+ writeStream.WriteInt32L(iTimeout);
+ writeStream.WriteInt8L(iRecoveryMethod.iRecoveryMethod); //enumeration has few values so 8bit should be enough
+ writeStream.WriteInt32L(iRestartMode);
+ writeStream.WriteInt8L(iMonitored); //8bit should be enough for bool also
+ writeStream.WriteInt8L(iViewless); //8bit should be enough for bool also
+ writeStream.WriteInt8L(iStartInBackground); //8bit should be enough for bool also
+
+ // Add any new data member externalization code here, before CommitL
+ // e.g. writeStream.WriteInt32L(iSomethingElse);
+
+ writeStream.CommitL();
+ writeStream.Release();
+
+ }
+
+/** Internalize the class from a buffer.
+This function has to be updated every time a member has been added to the class to maintain binary
+compatibility.
+@internalTechnology
+@released
+@param aBufPtr A buffer containing the externalized class data
+*/
+EXPORT_C void CStartupProperties::InternalizeL(const TPtrC8& aBufPtr)
+ {
+ RDesReadStream readStream;
+ readStream.Open(aBufPtr);
+ CleanupClosePushL(readStream);
+
+ iVersion = readStream.ReadInt32L();
+
+ delete iFileName;
+ iFileName=NULL;
+ iFileName = HBufC::NewL(readStream,KMaxFileName);
+ delete iArgs;
+ iArgs=NULL;
+ iArgs = HBufC::NewL(readStream,KMaxFileName);
+
+ iStartupType = static_cast<TStartupType>(readStream.ReadInt8L());
+ iStartMethod = static_cast<TStartMethod>(readStream.ReadInt8L());
+ iNoOfRetries = readStream.ReadInt32L();
+ iTimeout = readStream.ReadInt32L();
+ iRecoveryMethod.iRecoveryMethod = static_cast<TRecoveryMethod>(readStream.ReadInt8L());
+ iRestartMode = readStream.ReadInt32L();
+ iMonitored = static_cast<TBool>(readStream.ReadInt8L());
+ iViewless = static_cast<TBool>(readStream.ReadInt8L());
+ iStartInBackground = static_cast<TBool>(readStream.ReadInt8L());
+
+ // Add any new data member internalization code here
+ // e.g. iSomethingElse = readStream.ReadInt32L();
+
+ CleanupStack::PopAndDestroy(&readStream);
+ }
+
+/**
+@return The size in bytes for this particular object.
+*/
+EXPORT_C TInt CStartupProperties::Size() const
+ {
+ const TInt nameSize = iFileName ? iFileName->Size() : 0;
+ const TInt argsSize = iArgs ? iArgs->Size() : 0;
+ return sizeof(CStartupProperties) + nameSize + argsSize;
+ }
+
+void CStartupProperties::ConstructFromResourceL(TResourceReader& aSource)
+ {
+ const TStartupCommandType commandType = static_cast<TStartupCommandType>(aSource.ReadUint16());
+ iStartupType = ((commandType==EStartupApp)||(commandType==EStartupApp2)) ? EStartApp : EStartProcess;
+
+ iFileName = aSource.ReadHBufCL();
+ if(iFileName)
+ {
+ TPtr writeableFilename = iFileName->Des();
+ writeableFilename.TrimAll();
+ }
+
+ iArgs = aSource.ReadHBufCL();
+ if(iArgs)
+ {
+ TPtr writeableArgs = iArgs->Des();
+ writeableArgs.TrimAll();
+ }
+
+ iStartMethod = static_cast<TStartMethod>(aSource.ReadUint16());
+
+ switch(commandType)
+ {
+ case EStartupApp:
+ delete iArgs; // deleted for backwards compatibility
+ iArgs = NULL;
+ iViewless = static_cast<TUint16>(aSource.ReadUint16());
+ iStartInBackground = static_cast<TUint16>(aSource.ReadUint16());
+ iTimeout = aSource.ReadInt32();
+ iRecoveryMethod.iActionOnCommandFailure = static_cast<TActionOnCommandFailure> (aSource.ReadUint16());
+ iNoOfRetries = static_cast<TUint16> (aSource.ReadUint16());
+ break;
+
+ case EStartupApp2:
+ iViewless = static_cast<TUint16>(aSource.ReadUint16());
+ iStartInBackground = static_cast<TUint16>(aSource.ReadUint16());
+ iTimeout = aSource.ReadInt32();
+ iRecoveryMethod.iRecoveryMethod = static_cast<TRecoveryMethod> (aSource.ReadUint16());
+ iNoOfRetries = static_cast<TUint16> (aSource.ReadUint16());
+ iMonitored = static_cast<TUint16>(aSource.ReadUint16());
+ iRestartMode = aSource.ReadInt16();
+ break;
+
+ case EStartupProcess:
+ iTimeout = aSource.ReadInt32();
+ iRecoveryMethod.iActionOnCommandFailure = static_cast<TActionOnCommandFailure>(aSource.ReadUint16());
+ iNoOfRetries = static_cast<TUint16> (aSource.ReadUint16());
+ break;
+
+ case EStartupProcess2:
+ iTimeout = aSource.ReadInt32();
+ iRecoveryMethod.iRecoveryMethod = static_cast<TRecoveryMethod>(aSource.ReadUint16());
+ iNoOfRetries = static_cast<TUint16> (aSource.ReadUint16());
+ iMonitored = static_cast<TUint16>(aSource.ReadUint16());
+ iRestartMode = aSource.ReadInt16();
+ break;
+
+ default:
+ PanicNow(KPanicStartupProperties, EInvalidCommandType);
+ break;
+ }
+
+ DoSanityCheck(commandType);
+ }
+
+void CStartupProperties::DoSanityCheck(TStartupCommandType aCommandType) const
+ {
+ if ((iStartMethod < EFireAndForget) || (iStartMethod > EDeferredWaitForStart))
+ {
+ DEBUGPRINT2(_L("Invalid start_method value of %d"), iStartMethod);
+ PanicNow(KPanicStartupProperties, EInvalidStartMethod);
+ }
+
+ // The timeout and no_of_retries_on_failure fields can only be used
+ // with EWaitForStart. Check that no values other than the defaults have been
+ // provisioned
+ if (iStartMethod != EWaitForStart)
+ {
+ if (iTimeout)
+ {
+ DEBUGPRINT2(_L("Timeout should be 0, invalid timeout value of %d"), iTimeout);
+ PanicNow(KPanicStartupProperties, EInvalidTimeout);
+ }
+ if (iNoOfRetries)
+ {
+ DEBUGPRINT2(_L("no_of_retries_on_failure should be 0, invalid value of %d"), iNoOfRetries);
+ PanicNow(KPanicStartupProperties, EInvalidNoOfRetries);
+ }
+ }
+
+ if ((aCommandType == EStartupApp) || (aCommandType == EStartupProcess))
+ {
+ // Check that the fail_on_error value is valid for version 1 struct.
+ if ((iRecoveryMethod.iActionOnCommandFailure != EIgnoreCommandFailure) && (iRecoveryMethod.iActionOnCommandFailure != EPanicOnCommandFailure))
+ {
+ DEBUGPRINT2(_L("Invalid fail_on_error: %d"), iRecoveryMethod.iActionOnCommandFailure);
+ PanicNow(KPanicStartupProperties, EInvalidRecoveryMethod);
+ }
+ }
+ else if ((aCommandType == EStartupApp2) || (aCommandType == EStartupProcess2))
+ {
+ // Check that the fail_on_error value is valid for version 2 struct.
+ if ((iRecoveryMethod.iRecoveryMethod > ECriticalNoRetries) || (iRecoveryMethod.iRecoveryMethod < EIgnoreOnFailure))
+ {
+ DEBUGPRINT2(_L("Invalid retry_failure_recovery_method: %d"), iRecoveryMethod.iRecoveryMethod);
+ PanicNow(KPanicStartupProperties, EInvalidRecoveryMethod);
+ }
+ }
+ }