devicediagnosticsfw/diagframework/src/diagexecplanentryimplsuite.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:27:42 +0100
branchRCL_3
changeset 26 19bba8228ff0
parent 0 b497e44ab2fc
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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 definition of CDiagExecPlanEntryImplSuite
*
*/


// CLASS DECLARATION
#include "diagexecplanentryimplsuite.h"

// SYSTEM INCLUDE FILES
#include <DiagPlugin.h>                     // MDiagPlugin
#include <DiagSuitePlugin.h>                // MDiagSuitePlugin
#include <DiagFrameworkDebug.h>             // LOGSTRING
#include <DiagSuiteExecParam.h>             // TDiagSuiteExecParam

// USER INCLUDE FILES
#include "diagframework.pan"                // Panics
#include "diagexecplanentryimplobserver.h"  // MDiagExecPlanEntryImplObserver

// DATA

// MACROS

// LOCAL DATA TYPES


// ======== LOCAL FUNCTIONS ========

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::NewL
// ---------------------------------------------------------------------------
//
CDiagExecPlanEntryImplSuite* CDiagExecPlanEntryImplSuite::NewL(
        MDiagEngineCommon& aEngine,
        const TDiagEngineConfig& aEngineConfig,
        MDiagExecPlanEntryImplObserver& aObserver,
        MDiagSuitePlugin& aPlugin,
        TBool aAsDependency,
        CDiagExecPlanEntryImpl::TType aType )
    {
    CDiagExecPlanEntryImplSuite* self = NewLC( aEngine,
                                               aEngineConfig,
                                               aObserver,
                                               aPlugin,
                                               aAsDependency,
                                               aType );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::NewLC
// ---------------------------------------------------------------------------
//
CDiagExecPlanEntryImplSuite* CDiagExecPlanEntryImplSuite::NewLC(
        MDiagEngineCommon& aEngine,
        const TDiagEngineConfig& aEngineConfig,
        MDiagExecPlanEntryImplObserver& aObserver,
        MDiagSuitePlugin& aPlugin,
        TBool aAsDependency,
        CDiagExecPlanEntryImpl::TType aType )
    {
    CDiagExecPlanEntryImplSuite* self = 
        new ( ELeave ) CDiagExecPlanEntryImplSuite ( aEngine,
                                                     aEngineConfig,
                                                     aObserver,
                                                     aPlugin, 
                                                     aAsDependency,
                                                     aType );
    CleanupStack::PushL( self );
    return self;
    }


// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::CDiagExecPlanEntryImplSuite
// ---------------------------------------------------------------------------
//
CDiagExecPlanEntryImplSuite::CDiagExecPlanEntryImplSuite( 
        MDiagEngineCommon& aEngine,
        const TDiagEngineConfig& aEngineConfig,
        MDiagExecPlanEntryImplObserver& aObserver,
        MDiagSuitePlugin& aPlugin,
        TBool aAsDependency,
        CDiagExecPlanEntryImpl::TType aType )
    :   CDiagExecPlanEntryImpl( 
            aEngine,
            aEngineConfig,
            aObserver,
            aPlugin,
            aAsDependency,
            aType  )
    {
    }

// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::~CDiagExecPlanEntryImplSuite
// ---------------------------------------------------------------------------
//
CDiagExecPlanEntryImplSuite::~CDiagExecPlanEntryImplSuite()
    {
    Cancel();

    if ( CDiagExecPlanEntryImpl::State() == EStateRunning )
        {
        TRAP_IGNORE( SuitePlugin().ExecutionStopL( MDiagSuitePlugin::ESkip ) )
        }
    }

// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::SuitePlugin
// ---------------------------------------------------------------------------
//
MDiagSuitePlugin& CDiagExecPlanEntryImplSuite::SuitePlugin()
    {
    // It is safe to typecast here, since CDiagExecPlanEntryImplSuite::NewL
    // accepts only MDiagSuitePlugin&.
    return static_cast< MDiagSuitePlugin& >( Plugin() );
    }

// ---------------------------------------------------------------------------
// From CDiagExecPlanEntryImpl
// CDiagExecPlanEntryImplSuite::ExecuteL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::ExecuteL()
    {
    #ifdef _DEBUG
    HBufC* pluginName = Plugin().GetPluginNameL( 
        MDiagPlugin::ENameLayoutListSingle );
    
    LOGSTRING4( "---- SUITE BEGIN ---- [ 0x%08x %S / %s ] ---- SUITE BEGIN ---- {",
        Plugin().Uid().iUid,
        pluginName,
        ( Type() == ETypeSuitePrepare ) ? L"PREPARE" : L"FINALIZE" )

    delete pluginName;
    pluginName = NULL;
    #endif // _DEBUG

    __ASSERT_DEBUG( State() == EStateQueued,
                    Panic( EDiagFrameworkCorruptStateMachine ) );

    ResetWatchdog( EDiagEngineWatchdogTypeAutomatic );
    ChangeStateL( EStateRunning );

    // Notify observer that progress is 0 of 1 since suite does not have progress.
    Observer().ExecPlanEntryProgressL( *this, 0, 1 );

    TDiagSuiteExecParam* execParam = new ( ELeave ) TDiagSuiteExecParam( *this, Engine() );
    if ( Type() == CDiagExecPlanEntryImpl::ETypeSuitePrepare )
        {
        SuitePlugin().PrepareChildrenExecutionL( execParam,  // owership change
                                                 Engine().IsDependencyDisabled(),
                                                 AsDependency() );
        }
    else
        {
        SuitePlugin().FinalizeChildrenExecutionL( execParam, // owership change
                                                  Engine().IsDependencyDisabled(),
                                                  AsDependency() );
        }

    execParam = NULL; //lint !e423 execParam ownership changed.
    }

// ---------------------------------------------------------------------------
// From CDiagExecPlanEntryImpl
// CDiagExecPlanEntryImplSuite::StopExecutionByWatchdogL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::StopExecutionByWatchdogL()
    {
    StopSuitePluginL( MDiagSuitePlugin::EWatchdog );
    }

// ---------------------------------------------------------------------------
// From CDiagExecPlanEntryImpl
// CDiagExecPlanEntryImplSuite::StopExecutionByClientL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::DoStopExecutionByClientL( 
        MDiagEngineCommon::TCancelMode aCancelMode )
    {
    MDiagSuitePlugin::TStopReason stopReason;

    switch ( aCancelMode )
        {
        case MDiagEngineCommon::ECancelAll:
            stopReason = MDiagSuitePlugin::ECancelAll;
            break;

        case MDiagEngineCommon::ESkip:
            stopReason = MDiagSuitePlugin::ESkip;
            break;

        default:
            __ASSERT_DEBUG( 0, Panic( EDiagFrameworkInternal ) );
            stopReason = MDiagSuitePlugin::ESkip;
            break;
        }

    StopSuitePluginL( stopReason );
    }

// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::StopSuitePluginL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::StopSuitePluginL(
        MDiagSuitePlugin::TStopReason aStopReason )
    {
    LOGSTRING3( "CDiagExecPlanEntryImplSuite::StopSuitePluginL(): "
        L"Calling plugin uid = 0x%08x SuitePlugin::ExecutionStopL( %d )",
        Plugin().Uid().iUid,
        aStopReason )

    Cancel();

    switch ( State() )
        {
        case EStateQueued:      // fall through
        case EStateInitDelay:   // fall through
        case EStateStopped:     // fall through
        case EStateSuspended:   // fall through
        case EStateCompleted:
            LOGSTRING3( "CDiagExecPlanEntryImplSuite::DoStopSuitePluginL(): "
                L"Plugin 0x%08x = %d. Do nothing.",
                Plugin().Uid().iUid,
                State() )
            break;

        case EStateRunning:
            LOGSTRING2( "CDiagExecPlanEntryImplSuite::DoStopSuitePluginL(): "
                L"Plugin 0x%08x was in ERunning or ESuspended. Call Stop",
                Plugin().Uid().iUid )
            SuitePlugin().ExecutionStopL( aStopReason );
            break;

        default:
            LOGSTRING3( "CDiagExecPlanEntryImplSuite::DoStopSuitePluginL(): "
                L"Plugin 0x%08x = INVALID STATE! %d",
                Plugin().Uid().iUid,
                State() )
            __ASSERT_DEBUG( 0, Panic( EDiagFrameworkCorruptStateMachine ) );
            break;
        }

    // Notify observer as if plug-in itself would have done.
    ContinueExecutionL( SuitePlugin() );
    }

// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::SuspendL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::SuspendL()
    {
    Cancel();

    switch ( State() )
        {
        case EStateQueued:      // fall through
        case EStateInitDelay:   // fall through
            LOGSTRING3( "CDiagExecPlanEntryImplSuite::SuspendL(): "
                L"Plugin 0x%08x = %d. Reset to Queued state",
                Plugin().Uid().iUid,
                State() )
            // force reset the execution state to queued so that
            // it will be restarted
            ChangeStateL( EStateQueued );
            break;

        case EStateRunning:
            LOGSTRING2( "CDiagExecPlanEntryImplSuite::SuspendL(): "
                L"Plugin 0x%08x was in ERunning. Calling Stop",
                Plugin().Uid().iUid )

            // Suites do not have suspend. Stop with cancel as reason.
            SuitePlugin().ExecutionStopL( MDiagSuitePlugin::ESkip );
            // force reset the plugin execution to queued so that
            // it will be restarted
            ChangeStateL( EStateQueued );
            break;

        case EStateStopped:
            LOGSTRING2( "CDiagExecPlanEntryImplSuite::SuspendL(): "
                L"Plugin 0x%08x = Stopped.",
                Plugin().Uid().iUid )
            // plug-in is already stopped.
            ChangeStateL( EStateSuspended );
            break;

        case EStateSuspended:
            LOGSTRING2( "CDiagExecPlanEntryImplSuite::SuspendL(): "
                L"Plugin 0x%08x = Suspended.",
                Plugin().Uid().iUid )
            // already suspneded. nothing to do.
            break;

        case EStateCompleted:
            LOGSTRING2( "CDiagExecPlanEntryImplSuite::SuspendL(): "
                L"Plugin 0x%08x was already in completed state. No change",
                Plugin().Uid().iUid )
            break;

        default:
            LOGSTRING3( "CDiagExecPlanEntryImplSuite::SuspendL(): "
                L"Plugin 0x%08x = INVALID STATE! %d",
                Plugin().Uid().iUid,
                State() )
            __ASSERT_DEBUG( 0, Panic( EDiagFrameworkCorruptStateMachine ) );
            break;
        }

    // Postcondition. Check acceptble states.
    __ASSERT_DEBUG( State() == EStateQueued ||
                    State() == EStateSuspended ||
                    State() == EStateCompleted,
                    Panic( EDiagFrameworkCorruptStateMachine ) );
    }

// ---------------------------------------------------------------------------
// CDiagExecPlanEntryImplSuite::ResumeL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::ResumeL()
    {
    LOGSTRING3( "CDiagExecPlanEntryImplTest::ResumeL(): "
        L"Plugin 0x%08x, State = %d", Plugin().Uid().iUid, State() )

    __ASSERT_DEBUG( State() == EStateQueued ||
                    State() == EStateSuspended,
                    Panic( EDiagFrameworkCorruptStateMachine ) );

    if ( State() == EStateQueued )
        {
        ExecuteL();
        }
    else
        {
        ContinueExecutionL( SuitePlugin() );
        }
    }

// ---------------------------------------------------------------------------
// From MDiagSuiteObserver
// CDiagExecPlanEntryImplSuite::ContinueExecutionL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::ContinueExecutionL( const MDiagSuitePlugin& aSender )
    {
    __ASSERT_ALWAYS( aSender.Uid() == Plugin().Uid(), Panic( EDiagFrameworkPlugin ) );

    // Need to do an empty request complete since by default, suite plug-ins
    // do nothing in prepare/finalize steps and just call ContinueExecutionL.
    // Doing empty request complete ensures that Plug-in call back does not
    // directly call application TestExecutionCompletedL() method.

    ChangeStateL( EStateStopped );

    TRequestStatus* status = &iStatus;
    User::RequestComplete( status, KErrNone );
    SetActive();
    }

// ---------------------------------------------------------------------------
// From CActive
// CDiagExecPlanEntryImplSuite::RunL
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::RunL()
    {
    ChangeStateL( EStateCompleted );

    #ifdef _DEBUG
    HBufC* pluginName = Plugin().GetPluginNameL( 
        MDiagPlugin::ENameLayoutListSingle );
    
    LOGSTRING4( "} ---- SUITE END ---- [ 0x%08x %S / %s ] ---- SUITE END ----",
        Plugin().Uid().iUid,
        pluginName,
        ( Type() == ETypeSuitePrepare ) ? L"PREPARE" : L"FINALIZE" )

    delete pluginName;
    pluginName = NULL;
    #endif // _DEBUG

    Observer().ExecPlanEntryExecutedL( *this );
    }


// ---------------------------------------------------------------------------
// From CActive
// CDiagExecPlanEntryImplSuite::DoCancel
// ---------------------------------------------------------------------------
//
void CDiagExecPlanEntryImplSuite::DoCancel()
    {
    // nothing to do
    }


// End of File