diff -r 000000000000 -r ba25891c3a9e installationservices/swi/source/swis/server/statemachine.h --- /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 +#include +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK +#include +#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