systemhealthmanagement/systemhealthmgr/startuppropertiessrc/startupproperties.cpp
changeset 0 4e1aa6a622a0
--- /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);
+			} 
+		}
+	}