diff -r b183ec05bd8c -r 19bba8228ff0 devicediagnosticsfw/diagframework/inc/diagpluginexecplanimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnosticsfw/diagframework/inc/diagpluginexecplanimpl.h Wed Sep 01 12:27:42 2010 +0100 @@ -0,0 +1,463 @@ +/* +* Copyright (c) 2007 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: Class declaration for CDiagPluginExecPlanImpl +* +*/ + + +#ifndef DIAGPLUGINEXECPLANIMPL_H +#define DIAGPLUGINEXECPLANIMPL_H + +// SYSTEM INCLUDE FILES +#include // CBase +#include // MDiagPluginExecPlan +#include // CDiagResultsDatabaseItem::TResult + +// USER INCLUDE FILES +#include "diagexecplanentryimpl.h" // TDiagPluginExecPlanImpl::TType + +// FORWARD DECLARATION +class MDiagPlugin; +class MDiagSuitePlugin; +class MDiagEngineCommon; +class CDiagPluginPool; +class RDiagResultsDatabaseRecord; +class TDiagEngineConfig; +struct TTransitionStackEntry; + +template +class CStack; + +/** +* Diagnostics Plugin Execution Plan +* +* This class provides interface to access execution plan. +* It also provides interface to modify execution plan. +* A cursor to currently executing item is also maintained. +* +* @since S60 v5.0 +* +*/ +NONSHARABLE_CLASS( CDiagPluginExecPlanImpl ) : public CActive, + public MDiagPluginExecPlan + { +public: + /** + * Two-phase constructor + * + * @param aEngine - Reference to diagnostics engine. + * @param aEngineConfig - Engine configuration information. + * @param aEntryObserver - Reference to entry observer. + * @return new instance of CDiagPluginExecPlanImpl + */ + static CDiagPluginExecPlanImpl* NewL( MDiagEngineCommon& aEngine, + const TDiagEngineConfig& aEngineConfig, + MDiagExecPlanEntryImplObserver& aEntryObserver ); + + /** + * Destructor. + */ + virtual ~CDiagPluginExecPlanImpl(); + +public: // New API + /** + * Initialize execution plan + * + * @param aStatus - Request status to set when plan creatation is completed. + * @param aBatch - list of plug-ins to execute + */ + void InitializeL( TRequestStatus& aStatus, + const RPointerArray< MDiagPlugin >& aBatch ); + + /** + * Initialize execution plan from db. + * This will read current data from results database and reconstruct + * the execution plan. + * + * This should be used to continue an incomplete session. + * + * @param aStatus - Request status to set when plan creatation is completed. + */ + void InitializeL( TRequestStatus& aStatus ); + + /** + * Access an item in plan. + * + * @param aIndex - index + * @return Reference to plan entry at given index. + */ + CDiagExecPlanEntryImpl& operator[]( TInt aIndex ); //lint !e1411 This is proper overload + + /** + * Get current execution plan item. + * + * @return Reference to currently executing plan item. + */ + CDiagExecPlanEntryImpl& CurrentExecutionItem(); //lint !e1411 This is proper overload + + /** + * Reset execution cursor + * + * Resets execution cursor to the beginning. + */ + void ResetExecutionCursor(); + + /** + * Moves execution cursor to next item. + * + * @return ETrue if cursor is updated. + * EFalse if cursor is already at last item. + */ + TInt MoveCursorToNext(); + +private: // from CActive + /** + * Handle Active Object completion event. + * @see CActive::RunL() + */ + virtual void RunL(); + + /** + * Cancel outstanding request + * @see CActive::RunL() + */ + virtual void DoCancel(); + + /** + * Handle errors + * @see CActive::RunError() + */ + virtual TInt RunError( TInt aError ); + +public: // from MDiagPluginExecPlan + /** + * Access an item in plan. + * @see MDiagPluginExecPlan::operator[] + */ + virtual const MDiagExecPlanEntry& operator[]( TInt aIndex ) const; + + /** + * Get current execution plan item. + * @see MDiagPluginExecPlan::CurrentExecutionItem + */ + virtual const MDiagExecPlanEntry& CurrentExecutionItem() const; + + /** + * Returns index of execution cursor. + * @see MDiagPluginExecPlan::CurrentIndex + */ + virtual TInt CurrentIndex() const; + + /** + * Returns total number of items in the plan. + * @see MDiagPluginExecPlan::Count + */ + virtual TInt Count() const; + + /** + * Get current test index. + * + * @see MDiagPluginExecPlan::CurrentTestIndex + */ + virtual TInt CurrentTestIndex( TBool aIncludeDependency ) const; + + /** + * Get total test count. + * + * @see MDiagPluginExecPlan::TestCount + */ + virtual TInt TestCount( TBool aIncludeDependency ) const; + + /** + * Check if this is the last test being executed. + * + * @see MDiagPluginExecPlan::IsLastTest + */ + virtual TBool IsLastTest() const; + + /** + * Check if this is the last plug-in being executed. + * + * @see MDiagPluginExecPlan::IsLastPlugin + */ + virtual TBool IsLastPlugin() const; + + /** + * Returns the plug-in index that plan is resuming from. + * + * @see MDiagPluginExecPlan::ResumeIndex + */ + virtual TInt ResumeIndex() const; + +private: // private data types + /** + * State + */ + enum TState + { + EStateIdle = 0, + EStateExpandDependencyAndSuites, + EStateRemoveEmptySuites, + EStateInsertSuiteTransitions, + EStateStoreToDb, + EStatePlanCreated + }; + +private: // private functions + /** + * C++ Constructor + * @param aEngine - reference to engine. + * @param aEngineConfig - reference to engine configuration information. + * @param aEntryObserver - Reference to observer for each plug-in + */ + CDiagPluginExecPlanImpl( MDiagEngineCommon& aEngine, + const TDiagEngineConfig& aEngineConfig, + MDiagExecPlanEntryImplObserver& aEntryObserver ); + + /** + * Symbian 2nd phase constructor + */ + void ConstructL(); + + /** + * Change state + * @param aState - new state. + */ + void ChangeState( TState aState ); + + /** + * Plan creation phase 1. Expand dependencies + * + * @return ETrue if any changes are made to the plan. + */ + TBool ExpandDependenciesL(); + + /** + * Plan creation phase 2. Expand suites to plug-ins + * + * @return ETrure if any changes are made to the plan + */ + TBool ExpandSuitesL(); + + /** + * Plan creation phase 3. Remove empty suites. Delete plan entries that + * just has prepare and finalize without any tests in between. + * + */ + void RemoveEmptySuites(); + + /** + * Plan creation phase 4. Insert suite transition based on parent + * + */ + void InsertSuiteTransitionsL(); + + /** + * Store next test plan item to database. Part of STEP_6. + * + */ + void StoreNextTestPluginToDbL(); + + /** + * Plan creation step 7. Prepend items from last session to new plan. + */ + void PrependExecutedItemsL(); + + /** + * Report result to client. + * + * @param aErr - Result to report back to engine. KErrNone if successful. + * + */ + void ReportResult( TInt aErr ); + + /** + * Insert plugin + * + * This function will attempt to add a plugin into plan. + * If item already exists in the plan prior to the given index, it will + * not add a new item. + * If item exists after the given index, and the item is a dependent item, it will + * move it up in the plan, so that it will be executed earlier. + * If item exists after the given index, and the item is not a dependent item, + * it will create a duplicate entry, to make sure that client specified order + * is not changed. + * + * @param aPlugin - Plugin to insert + * @param aAsDependent - whether new item is to satify dependency or not. + * @param aAt - index to insert the dependent item to. + * @return ETrue if plan is updated. EFalse if no changes to plan is made. + */ + TBool InsertPluginL( MDiagPlugin& aPlugin, + TBool aAsDependent, + TInt aAt ); + + /** + * Utility function to create a default execution plan entry + * For test plug-ins, it will create an entry with EQueueToRun as status. + * For suite plug-ins, it will create an entry with ETypeSuiteUnexpanded as type. + * + * @param aPlugin - Plugin to create default entry for. Either test or suite plug-in. + * @param aAsDependency - Whether the entry should be created as dependency or not. + * + * @return New execution plan entry. Ownership is transferred. + */ + CDiagExecPlanEntryImpl* CreateDefaultPlanEntryLC( + MDiagPlugin& aPlugin, + TBool aAsDependency ) const; + + /** + * Utility function to add root suite if it does not alredy exists + * in the plan. + * + * NOTE: This should be called only from InsertSuiteTransitionsL() + */ + void AddRootSuiteIfMissingL(); + + /** + * Utility function to push new transition into stack. + * + * NOTE: This should be called only from InsertSuiteTransitionsL() + * + * @param aStack - Stack to push new transition to. + * @Param aHeadIndex - index in execution plan to head entry. + */ + void PushNewLevelL( CStack& aStack, TInt aHeadIndex ); + + /** + * Utility function to pop a level from stack. This will remove top entry + * + * NOTE: This should be called only from InsertSuiteTransitionsL() + * + * @param aStack - Stack to pop the head item from. + */ + void PopLevel( CStack& aStack ); + + /** + * Utility function to check if given level exists in stack + * + * NOTE: This should be called only from InsertSuiteTransitionsL() + * + * @param aStack - Stack to check levels in. + * @param aLevelUid - Uid of leven to check in stack. + * + * @return ETrue if item exists in stack. EFalse if not found. + */ + TBool IsLevelInStack( CStack& aStack, TUid aLevelUid ) const; + + /** + * Utility function to check if there is more of items of the same parent + * exists in the plan. + * + * NOTE: This should be called only from InsertSuiteTransitionsL() + * + * @param aParentUid - Uid of suite to search for. + * @param aIndex - Index to execution plan to start searching for. + * @return ETrue if given suite is still needed. + * EFalse otherwise. + */ + TBool IsThisSuiteNeededAfterThisIndex( TUid aSuiteUid, TInt aIndex ) const; + + /** + * Utility function to add a SuitePrepare entry into plan. + * + * NOTE: This should be called only from InsertSuiteTransitionsL() + * + * @param aLevelUid - Uid of suite to add in plan. + * @param aAt - Index in plan to add new prepare entry to. + */ + void AddSuitePrepareL( TUid aLevelUid, TInt aAt ); + + /** + * Utility function to add a SuiteFinalize entry into plan. + * + * NOTE: This should be called only from InsertSuiteTransitionsL() + * + * @param aPrepareIndex - location in plan where prepare is at. Some information + * from prepare item will be copied to finalize. + * @param aAt - Index in execution plan to add finalize entry to. + */ + void AddSuiteFinalizeL( TInt aPrepareIndex, TInt aAt ); + + /** + * Log plan information to debug log. This function does nothing in release build. + */ + void LogPlanL() const; + + /** + * Debug function that validate that entries are written to db correctly. + * This function does nothing in release build. + */ + void LogPlanInRecordL() const; + +private: // data + + /** + * iPlan - holds plan entries + * Individual entries are owned by the array. + */ + RPointerArray iPlan; + + /** + * iExecutedEntries - Items that are already executed in the + * previous session. + * Individual entries are owned by the array. + */ + RPointerArray iExecutedEntries; + + /** + * iExecutionCursor - currently executing item. + */ + TInt iExecutionCursor; + + /** + * iResumeIndex - Index which session is being resumed from. + */ + TInt iResumeIndex; + + /** + * iEngine - Reference to diag engine. + */ + MDiagEngineCommon& iEngine; + + /** + * iEngineConfig - Enine configuration information. + */ + const TDiagEngineConfig& iEngineConfig; + + /** + * iPlanEntryObserver - Plan entry observer. Passed to each plan entry + * when it is created. + */ + MDiagExecPlanEntryImplObserver& iPlanEntryObserver; + + /** + * iClientStatus - TRequestStatus of the client. Used to notify + * completion and error. + * Ownership - Does not own. + */ + TRequestStatus* iClientStatus; + + /** + * iState - state of the execution plan creation. + * @see TState + */ + TState iState; + }; + +#endif // DIAGPLUGINEXECPLANIMPL_H + + +// End of File +