--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/smartinstaller/adm/inc/ADMStateMachine.h Wed Jun 30 11:01:26 2010 +0530
@@ -0,0 +1,562 @@
+/*
+* Copyright (c) 2009-2010 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:
+* State machine
+*
+*
+*/
+
+
+#ifndef ADMSTATEMACHINE_H_
+#define ADMSTATEMACHINE_H_
+
+#include <e32base.h>
+#include <e32debug.h>
+
+#include "ADMAppUi.h"
+#include "ADMInstallManager.h"
+#include "ADMPackageInfo.h"
+#include "ADMSisParser.h"
+#include "ADMXmlParser.h"
+
+// Forward declarations
+class TState;
+class CStateMachine;
+
+enum TStatePanic
+ {
+ EPanicStateIndexOutOfBounds = 1000,
+ EPanicStateImplementationMissing,
+ EPanicStateInvalidBootstrapVersion,
+ EPanicStateInvalidMachineUid,
+ EPanicStateFetchStatus,
+ EPanicStateFetchPackageNull,
+ EPanicStateUnexpectedPackage,
+ EPanicStateUnexpectedRootPackage,
+ EPanicStateWrapperNotInstalled
+ };
+
+const TInt KUnknownState = -40000;
+
+// Timeout for waiting for download deletion. Default 2 s.
+const TInt KDlDeletingTimeout = 2*1000*1000;
+
+class CStateFactory : public CBase
+ {
+public:
+ enum TAppState
+ {
+ EStateSetup = 0, // 0
+ EStateSetupParsing,
+ EStateBuildDepTree,
+ EStateDownloadChangesFile,
+ EStateParseChangesFile,
+ EStateDownloadDepFile, // 5
+ EStateParseDepFile,
+ EStateBuildFetchList,
+ EStateVerifyAvailableDiskSpace,
+ EStateConfirmDownload,
+ EStateConfirmRoamingDownload, // 10
+ EStateStartDependencyDownload,
+ EStateDownloadDependency,
+ EStateInstallDependency,
+ EStateInstallAppSis,
+ EStateUninstallDependency, // 15
+ EStatePrepareExitWithError,
+ EStateLaunchApp,
+ EStateExit,
+
+ EStateLast
+ };
+
+ TState& GetState(const TAppState aState) const;
+ TInt StateIndex(const TState* aState) const;
+
+ inline CStateMachine& StateMachine() const { return iStateMachine; }
+
+ static CStateFactory* NewL(CStateMachine& aStateMachine);
+ ~CStateFactory();
+
+private:
+ CStateFactory(CStateMachine& aStateMachine);
+ void ConstructL();
+
+private:
+ TFixedArray<TState*, EStateLast> iStates;
+ CStateMachine& iStateMachine;
+ };
+
+// Base class for a state
+class TState
+ {
+public:
+ //friend class CStateFactory;
+ //friend class CStateMachine;
+
+ TState(const CStateFactory& aFactory);
+
+ // Change of states
+ virtual void Enter() const;
+ virtual void Exit() const;
+
+ // Events from UI
+ virtual void UserAccepted();
+ virtual void UserRejected();
+ virtual void UserCancelled();
+
+ // Events from DownloadManager
+ virtual void DownloadInProgress(const TInt aAlreadyDownloaded, const TInt aDownloadSize, const TReal32 aAvgDlSpeed);
+ virtual void DownloadCompleted(const TInt aBytesDownloaded);
+ virtual void DownloadFailed();
+ virtual void DownloadCancelled();
+
+ // Events from InstallManager
+ virtual void InstallInProgress();
+ virtual void InstallCompleted(TInt aStatus);
+ virtual void InstallationCancelled();
+
+protected:
+ void DownloadFailed(const CStateFactory::TAppState aState);
+ void PanicInState(TStatePanic aPanic) const;
+
+protected:
+ const CStateFactory& iFactory;
+ CStateMachine& iStateMachine;
+ };
+
+// ----------------------------------------------------------------------------
+class TStateSetup : public TState
+ {
+public:
+ TStateSetup(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateSetupParsing : public TState
+ {
+public:
+ TStateSetupParsing(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateDownloadDepFile : public TState
+ {
+public:
+ TStateDownloadDepFile(const CStateFactory& aFactory);
+
+ void Enter() const;
+
+ void DownloadCompleted(const TInt aBytesDownloaded);
+ void DownloadFailed();
+ };
+// ----------------------------------------------------------------------------
+class TStateParseDepFile : public TState
+ {
+public:
+ TStateParseDepFile(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateBuildDepTree : public TState
+ {
+public:
+ TStateBuildDepTree(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateDownloadChangesFile : public TState
+ {
+public:
+ TStateDownloadChangesFile(const CStateFactory& aFactory);
+
+ void Enter() const;
+
+ void DownloadCompleted(const TInt aBytesDownloaded);
+ void DownloadFailed();
+ };
+// ----------------------------------------------------------------------------
+class TStateParseChangesFile : public TState
+ {
+public:
+ TStateParseChangesFile(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateBuildFetchList : public TState
+ {
+public:
+ TStateBuildFetchList(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateVerifyAvailableDiskSpace : public TState
+ {
+public:
+ TStateVerifyAvailableDiskSpace(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateConfirmDownload : public TState
+ {
+public:
+ TStateConfirmDownload(const CStateFactory& aFactory);
+
+ void Enter() const;
+ void UserAccepted();
+ };
+// ----------------------------------------------------------------------------
+class TStateConfirmRoamingDownload : public TState
+ {
+public:
+ TStateConfirmRoamingDownload(const CStateFactory& aFactory);
+
+ void Enter() const;
+ void UserAccepted();
+ };
+// ----------------------------------------------------------------------------
+class TStateStartDependencyDownload : public TState
+ {
+public:
+ TStateStartDependencyDownload(const CStateFactory& aFactory);
+
+ void Enter() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateDownloadDependency : public TState
+ {
+public:
+ TStateDownloadDependency(const CStateFactory& aFactory);
+
+ void Enter() const;
+
+ void DownloadCompleted(const TInt aBytesDownloaded);
+ void DownloadInProgress(const TInt aAlreadyDownloaded, const TInt aDownloadSize, const TReal32 aAvgDlSpeed);
+ void DownloadFailed();
+
+private:
+ TBool iRetryDownload; // Set to true, if we're retrying download
+ };
+// ----------------------------------------------------------------------------
+class TStateInstallDependency : public TState
+ {
+public:
+ TStateInstallDependency(const CStateFactory& aFactory);
+
+ void Enter() const;
+ void Exit() const;
+ void InstallCompleted(TInt aStatus);
+ };
+// ----------------------------------------------------------------------------
+class TStateInstallAppSis : public TState
+ {
+public:
+ TStateInstallAppSis(const CStateFactory& aFactory);
+
+ void Enter() const;
+ void InstallCompleted(TInt aStatus);
+ };
+// ----------------------------------------------------------------------------
+class TStateUninstallDependency : public TState
+ {
+public:
+ TStateUninstallDependency(const CStateFactory& aFactory);
+
+ void Enter() const;
+ void InstallCompleted(TInt aStatus);
+ };
+// ----------------------------------------------------------------------------
+class TStatePrepareExitWithError : public TState
+ {
+public:
+ TStatePrepareExitWithError(const CStateFactory& aFactory);
+
+ void Enter() const;
+
+private:
+ TInt CreateInstallationResumeInfo() const;
+ void BackupFilesL() const;
+ };
+// ----------------------------------------------------------------------------
+class TStateLaunchApp : public TState
+ {
+public:
+ TStateLaunchApp(const CStateFactory& aFactory);
+
+ void Enter() const;
+ void UserAccepted();
+ void UserRejected();
+};
+// ----------------------------------------------------------------------------
+class TStateExit : public TState
+ {
+public:
+ TStateExit(const CStateFactory& aFactory);
+
+ void Enter() const;
+
+private:
+ void RemoveResumeFiles() const;
+
+#ifdef FEATURE_REPORTING
+ void Report() const;
+
+public:
+ void DownloadInProgress(const TInt /* aAlreadyDownloaded */, const TInt /* aDownloadSize */, const TReal32 /* aAvgDlSpeed */);
+ void DownloadCompleted(const TInt /* aBytesDownloaded */);
+ void DownloadFailed();
+ void DownloadCancelled();
+#endif
+ };
+
+// ----------------------------------------------------------------------------
+class CStateMachine : public CActive,
+ public CInstallManager::MInstallClient,
+ public CDownloadHandler::MDownloadClient
+ {
+public:
+ friend class TState;
+ friend class TStateBuildDepTree;
+ friend class TStateBuildFetchList;
+ friend class TStateConfirmDownload;
+ friend class TStateConfirmRoaming;
+ friend class TStateDownloadChangesFile;
+ friend class TStateDownloadDepFile;
+ friend class TStateDownloadDependency;
+ friend class TStateExit;
+ friend class TStateInstallAppSis;
+ friend class TStateInstallDependency;
+ friend class TStateLaunchApp;
+ friend class TStateParseChangesFile;
+ friend class TStateParseDepFile;
+ friend class TStateParseSisFile;
+ friend class TStatePrepareExitWithError;
+ friend class TStateSetup;
+ friend class TStateSetupParsing;
+ friend class TStateStartDependencyDownload;
+ friend class TStateUninstallDependency;
+ friend class TStateVerifyAvailableDiskSpace;
+ friend class TStateWaitForUserConfirmation;
+
+ static CStateMachine* NewL(CADMAppUi& aAppUi, const TDesC& aDownloadPath);
+ ~CStateMachine();
+
+ void Start();
+ void Stop();
+ void SetStartState(const CStateFactory::TAppState aState);
+ void SetState(const CStateFactory::TAppState aState);
+ TInt StateIndex() const;
+
+ // Interfacing for ADM
+ // Called when user has made a selection in a query dialog
+ void SetIAP(TUint32 aIAP);
+ void HandleUserResponse(TInt aResponse);
+ CStateFactory::TAppState FailedState() const { return iFailedState; }
+ inline TInt32 TotalDownloadSize() const { return iDepTree->GetTotalDownloadSize(); }
+ inline HBufC* LaunchCaption() const
+ {
+ CPackageInfo* root = iDepTree->GetRootNode();
+ if (root)
+ return root->GetPackageName();
+ else
+ return NULL;
+ }
+
+#ifdef USE_LOGFILE
+ RFileLogger& Log() const { return iAppUi.iLog; }
+#endif
+
+ // Interface to ADM
+ inline TBool ResumeRequired() const { return iAppUi.iIsResumeRequired; }
+ inline TInt MachineUid() const { return iAppUi.iMachineUid; }
+ inline TInt BootstrapVersion() const { return iAppUi.iBootstrapVersion; }
+ inline TBool RegisteredRoaming() const { return iAppUi.RegisteredRoaming(); }
+ inline TBool UsingWLAN() const { return iAppUi.UsingWLAN(); }
+ inline TBool OviStoreRunning() const { return iAppUi.iOviStoreRunning; }
+ inline TBool ResumingInstallation() const { return iAppUi.iResumingInstallation; }
+ inline HBufC* DepFilename() const { return iAppUi.iDepFileName; }
+ inline HBufC* SisFilename() const { return iAppUi.iSisFileName; }
+ inline HBufC8* ConfigUrl() const { return iAppUi.iConfigUrl; }
+ inline TUid& WrapperPackageUid() const { return (TUid&)iAppUi.iWrapperPackageUid; }
+ inline RFs& FsSession() const { return iAppUi.EikonEnv()->FsSession(); }
+ inline void SetSilentInstallationOk(const TBool aOk) { iAppUi.iSilentInstallationOk = aOk; }
+ inline void SetNonSilentInstallation(const TBool aVal) { iAppUi.iNonSilentInstallation = aVal; }
+ inline void SetAppLaunch(const TBool aSuccess) { iAppUi.iAppLaunch = aSuccess; }
+ inline TBool AppLaunch() const { return iAppUi.iAppLaunch; }
+ inline TInt ExitReason() const { return iAppUi.iExitReason; }
+ void UpdateProgressBar(const TInt aStartValue, const TInt aEndValue);
+ void StopProgressBar() const;
+ void SetFailureReason(TExitReason aReason);
+ void ShowDownloadQueryL(const TInt aResourceId, const TInt aInfoResourceId = -1);
+ void ShowWaitNoteL(const TInt aResourceId);
+ void ShowInstallingWaitNoteL(const TInt aCurrent, const TInt aLast);
+ void ShowProgressBarL(const TInt aStartValue, const TInt aEndValue, const TInt aCurrent = -1, const TInt aLast = -1);
+ void StopWaitNote();
+
+protected:
+ void RunL();
+ void DoCancel();
+ TInt RunError(const TInt aError);
+
+ void SetState(TState& aState);
+
+ //From MInstallClient
+ void HandleInstallCompletedL(TInt aStatus);
+
+ //From MDownloadClient
+ /**
+ * Called by Download Manager when IAP has changed.
+ * @param aIAP IAP ID
+ */
+ void HandleIapChanged(const TUint32 aIAP);
+ /**
+ * Called by Download Manager when downloading of a packet is completed.
+ * @param aDlFileName Name of the downloaded file.
+ * @param aResponseType Download type.
+ * @param aDownloadSize Total number of bytes downloaded.
+ */
+ void HandleHttpFetchCompleted( const TDesC& aDlFilename, const TInt aDownloadType, const TInt32 aBytesDownloaded, const TReal32 aAvgDlSpeed, const TInt64 aDlTime );
+
+ /**
+ * Called when download manager has retrieved a packet from the network.
+ * Required for updating the progress bar.
+ */
+ void HandleHttpFetchInProgress(const TInt32 aAlreadyDownloaded, const TInt32 aDownloadSize, const TReal32 aAvgDlSpeed);
+
+ /**
+ * Called when download manager encounters a problem while downloading
+ */
+ void HandleHttpFetchFailure( const TDesC& aDlFilename, const TInt aGlobalErrorId, const TInt aErrorId, const TInt aFetchType );
+
+ /**
+ * Called when download manager is deleting the download.
+ */
+ void HandleDownloadDeleting();
+
+ // State machine required functions
+ //void HandleFailure();
+ //TBool VerifyAvailableDiskSpace();
+ //void SilentInstallDownloadedPackageL();
+
+private:
+ CStateMachine(CADMAppUi& aAppUi);
+ void ConstructL(const TDesC& aDownloadPath);
+
+private:
+ CADMAppUi& iAppUi;
+ CStateFactory* iStateFactory; //< owns
+ CInstallManager* iInstallManager; //< owns
+ CDownloadHandler* iDownloadHandler; //< owns
+
+ CXmlParser* iXmlParser; //< owns
+ CSisParser* iSisParser; //< owns
+ CDepTree* iDepTree; //< owns
+ CPackageInfo* iCurrentPackage;
+
+ /**
+ * Path to the downloaded file. Updated after each finishing each
+ * download (completed or failed).
+ */
+ HBufC* iDownloadedFile; //< owns
+
+ /**
+ * Current state.
+ */
+ TState* iState;
+
+ /**
+ * The state that experienced failure that causes ADM to exit.
+ */
+ CStateFactory::TAppState iFailedState;
+
+ /**
+ * Number of dependency tree nodes processed so far.
+ */
+ TInt iNodesProcessed;
+
+ /**
+ * Progress bar current value.
+ */
+ TInt32 iProgressCurrentValue;
+
+ /**
+ * Progress bar maximum value. Stays constant after being set.
+ */
+ TInt32 iProgressMaxValue;
+
+ /**
+ * Current package # being downloaded/installed.
+ */
+ TInt iCounterCurrent;
+
+ /**
+ * Total number of packages being downloaded/installed.
+ */
+ TInt iCounterMax;
+
+ /**
+ * Total size of the packages to be downloaded in bytes.
+ * Used in progress bar update.
+ */
+ TInt32 iDownloadSize;
+
+ /**
+ * Downloaded bytes so far.
+ * Used in progress bar update.
+ */
+ TInt32 iCumulativeDepDownloaded;
+
+ /**
+ * Total number of bytes downloaded during session. Includes all
+ * dependency XML file downloads and .sis file downloads.
+ */
+ TInt32 iCumulativeDownloaded;
+
+ /**
+ * Time in microseconds used in downloading, used for calculating average download speed.
+ */
+ TInt64 iDownloadTime;
+
+ /**
+ * Drive in which wrapper is installed.
+ */
+ TChar iWrapperInstalledDrive;
+
+ /**
+ * Restart Attempt for Download Failure
+ */
+ TInt iRestartAttempt;
+
+#ifdef FEATURE_LAUNCH_INSTALLED_APP
+ /**
+ * App Launch name
+ */
+ TFileName iLaunchName;
+ TFileName iLaunchIconFilename;
+ TApaAppCaption iLaunchCaption;
+#endif
+
+ /**
+ * Semaphore for signalling download deleting.
+ */
+ RSemaphore iDlDeletingSemaphore;
+ };
+
+#endif /* ADMSTATEMACHINE_H_ */