installationservices/swi/source/swis/server/statemachine.h
changeset 0 ba25891c3a9e
child 40 f8cf9d484c15
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/source/swis/server/statemachine.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,211 @@
+/*
+* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+* SWIS state machine
+*
+*/
+
+
+/**
+ @file 
+ @internalComponent 
+*/
+
+#ifndef __SWIS_STATEMACHINE_H__
+#define __SWIS_STATEMACHINE_H__
+
+#include <e32std.h>
+#include <e32base.h>
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include <usif/sts/sts.h>
+#include "registrywrapper.h"
+#else
+#include "integrityservices.h"
+#include "sisregistrywritablesession.h"
+#endif
+#include "sishelperclient.h"
+#include "sisuihandler.h"
+#include "swi/sisinstallationresult.h"
+#include "securitymanager.h"
+#include "swiobserverclient.h"
+
+
+namespace Swi
+{
+class CPlan;
+
+/** Panic ID for panics raised in state machine */
+enum StateMachinePanic
+	{
+	EStateError
+	};
+
+/**
+ * State machine base absrtract class. A state machine in this implementation 
+ * represents one task for SWIS (installation or uninstallation).
+ *
+ * @internalComponent
+ * @released
+ */
+class CSwisStateMachine : public CActive
+	{
+public:
+	virtual ~CSwisStateMachine();
+	virtual TInt Start();
+	virtual void PostJournalFinalizationL(TInt aError);
+	/**
+	 * Abstract base class for all states of a state machine.
+	 *
+	 * @internalComponent
+	 * @released
+	 */
+	class TState
+		{
+	public:
+		virtual void    EnterL()=0;
+		virtual TState* CompleteL()=0;
+		virtual TState* ErrorL(TInt aCode)=0;
+		virtual void    Cancel()=0;
+		};
+
+	void CancelInstallation();
+	
+	#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	// Returns the mode in which state machine operates on.
+	// Will return TRUE if it operates on component information extraction mode, 
+	// FALSE when it operates on normal installtion/uninstallation mode ( By default ).
+	TBool IsInInfoMode();
+	
+	// Sets the state machine to operate on information exteraction mode. 
+	void SetIsInInfoMode(TBool aMode);
+	#endif
+
+protected:
+	CSwisStateMachine(const RMessage2& aMessage);
+	
+	#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	CSwisStateMachine(const RMessage2& aMessage,const TBool aInInfoMode);
+	#endif
+	
+	/** Must be called in derived classes */
+	void ConstructL();
+	void ChangeStateL(TState* aNextState);
+	inline TState* CurrentState();
+	void SetNextState(TState* aNextState);
+	void CompleteSelf();
+
+	void FinalizeJournalsL(TInt aError);
+	void CompleteClientL(TInt aError);
+	RUiHandler& UiHandler();
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	Usif::RStsSession& TransactionSession();
+	CRegistryWrapper& RegistryWrapper();
+	void SetFinalProgressBarValue(TInt aValue);
+	// Is the state machine runs in information extraction mode or normal installation/uninstallation mode?
+	TBool iIsInInfoMode;
+#else
+	CIntegrityServices& IntegrityServicesL();
+#endif
+
+	virtual TState* FirstState()=0;
+	virtual TState* ErrorOnStateEntryL(TInt aError)=0;
+
+	const RMessage2& Message() const;	
+
+// These are overridden and used to signal the UI	
+	virtual void SignalCompletedL()=0;
+
+// Used to do signalling to the UI, copes with the plan not having a valid
+// TAppInfo yet
+	void HandleInstallationEventL(CPlan* plan, TInstallEvent aEvent, TInt aValue = 0);
+	RSwiObserverSession& Observer();
+private:
+	// from CActive
+	void RunL();
+	TInt RunError(TInt aError);
+	void DoCancel();
+	void InformUserOfFatalErrorL(TInt aError);
+
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	void ResetRegistryCache(void);
+#endif
+
+protected:
+	// The confirmation state; where the user elects to go ahead with
+	// the installation/un-installation; has been entered. Therefore 
+	// the registery MIGHT have been altered.
+	TBool iOperationConfirmed;
+	
+private:
+	TState*             iState;             ///< Curent state
+	const RMessage2     iMessage;           ///< Message to complete when done
+	RUiHandler          iUiHandler;         ///< UI handler server session
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	Usif::RStsSession	iStsSession;		///< Transaction service session handle
+	CRegistryWrapper* 	iRegistryWrapper;	///< Registry wrapper to access the registry
+	CProgressBarValuePublisher* iProgressPublisher;	///< Pointer to the progress bar value publisher object..
+#else
+	CIntegrityServices* iIntegrityServices; ///< Shared integrity services.
+#endif
+
+	TBool iCancelled;
+	RSwiObserverSession iObserver;			///< Swi Observer session handle.
+	}; // class CSwisStateMachine
+
+inline CSwisStateMachine::TState* CSwisStateMachine::CurrentState() 
+	{
+	return iState;
+	};
+
+inline RUiHandler& CSwisStateMachine::UiHandler()
+	{
+	return iUiHandler;
+	}
+
+inline const RMessage2& CSwisStateMachine::Message() const
+	{
+	return iMessage;
+	}	
+	
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+inline Usif::RStsSession& CSwisStateMachine::TransactionSession()
+	{
+	return iStsSession;
+	}
+
+inline CRegistryWrapper& CSwisStateMachine::RegistryWrapper()
+	{
+	return *iRegistryWrapper;
+	}
+#else
+inline CIntegrityServices& CSwisStateMachine::IntegrityServicesL()
+	{
+	if (!iIntegrityServices)
+		{
+		User::Leave(KErrBadUsage);
+		}
+
+	return *iIntegrityServices;
+	}
+#endif
+
+inline RSwiObserverSession& CSwisStateMachine::Observer()
+	{
+	return iObserver;
+	}
+
+} // namespace Swi
+
+#endif