diff -r 6757f1e2efd2 -r 5b858729772b devicediagnostics/devdiagapp/src/devdiagpluginview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnostics/devdiagapp/src/devdiagpluginview.cpp Wed Sep 01 12:31:32 2010 +0100 @@ -0,0 +1,686 @@ +/* +* 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: Plug-in view +* +*/ + + +// INCLUDE FILES + +#include "devdiagapp.hrh" +#include "devdiagplugincontainer.h" +#include "devdiagengine.h" +#include "devdiagpluginview.h" +#include "devdiagdef.h" +#include "devdiag.pan" +#include "devdiagexecutionresults.h" + +#include +#include //resources +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // For HlpLauncher +#include +#include +#include +#include // Debug Logger +#include + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +// MACROS + +// LOCAL CONSTANTS AND MACROS +_LIT(KLinefeed, "\n"); +_LIT(KTabfeed, "\t"); +const TInt KFailedTestsMaxLength(1024); + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS ============================== + +// ========================= MEMBER FUNCTIONS ================================ + +// ---------------------------------------------------------------------------- +// CDevDiagPluginView::CDevDiagPluginView() +// +// Constructor +// ---------------------------------------------------------------------------- +// +CDevDiagPluginView::CDevDiagPluginView( CDevDiagEngine& aEngine, TUid aParentSuiteUid ): + iContainer(NULL), iEngine(aEngine), iParentSuiteUid( aParentSuiteUid ) + { + } + + +// --------------------------------------------------------------------------- +// CDevDiagPluginView::NewL() +// +// Symbian OS default constructor +// --------------------------------------------------------------------------- +CDevDiagPluginView* CDevDiagPluginView::NewL( CDevDiagEngine& aEngine, + TUid aParentSuiteUid ) + { + LOGSTRING("CDevDiagPluginView* CDevDiagPluginView::NewL"); + CDevDiagPluginView* self = new( ELeave ) + CDevDiagPluginView ( aEngine, aParentSuiteUid ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// --------------------------------------------------------------------------- +// CDevDiagPluginView::ConstructL() +// +// Symbian OS two-phased constructor +// --------------------------------------------------------------------------- +void CDevDiagPluginView::ConstructL() + { + if ( iParentSuiteUid == KDDHardwareSuiteUid ) + { + BaseConstructL( R_DD_HW_PLUGIN_VIEW ); + ChangeTitleL( R_DIAG_TITLE_HARDWARE ); + } + else if ( iParentSuiteUid == KDDConnectivitySuiteUid ) + { + BaseConstructL( R_DD_CONNECTIVITY_PLUGIN_VIEW ); + ChangeTitleL( R_DIAG_TITLE_CONNECTIVITY ); + } + else if ( iParentSuiteUid == KDDServicesSuiteUid ) + { + BaseConstructL( R_DD_SERVICE_PLUGIN_VIEW ); + ChangeTitleL( R_DIAG_TITLE_SERVICE ); + } + else if ( iParentSuiteUid == KDDCoverageSuiteUid) + { + BaseConstructL( R_DD_COVERAGE_PLUGIN_VIEW ); + ChangeTitleL( R_DIAG_TITLE_COVERAGE ); + } + else + { + Panic( EDDApplicationUnknownSuite ); + } + + } + + +// ---------------------------------------------------------------------------- +// CDevDiagPluginView::~CDevDiagPluginView +// +// Destructor +// ---------------------------------------------------------------------------- +CDevDiagPluginView::~CDevDiagPluginView() + { + + if ( iContainer ) + { + delete iContainer; + } + + } + + +// --------------------------------------------------------------------------- +// TUid CDevDiagPluginView::Id() +// +// Returns view's ID. +// --------------------------------------------------------------------------- +TUid CDevDiagPluginView::Id() const + { + return KDDPluginViewId; + } + + +// --------------------------------------------------------------------------- +// Set context menu bar according to the suite. +// --------------------------------------------------------------------------- +void CDevDiagPluginView::SetContextMenu() + { + if ( iParentSuiteUid == KDDHardwareSuiteUid ) + { + + MenuBar()->SetContextMenuTitleResourceId( R_DD_HW_CONTEXT_MENUBAR ); + } + else if ( iParentSuiteUid == KDDConnectivitySuiteUid ) + { + MenuBar()->SetContextMenuTitleResourceId( R_DD_CONNECTIVITY_CONTEXT_MENUBAR ); + } + else if ( iParentSuiteUid == KDDServicesSuiteUid ) + { + MenuBar()->SetContextMenuTitleResourceId( R_DD_SERVICE_CONTEXT_MENUBAR ); + } + else if ( iParentSuiteUid == KDDCoverageSuiteUid) + { + MenuBar()->SetContextMenuTitleResourceId( R_DD_COVERAGE_CONTEXT_MENUBAR ); + } + else + { + Panic( EDDApplicationUnknownSuite ); + } + } +// --------------------------------------------------------------------------- +// CDevDiagPluginView::HandleCommandL(TInt aCommand) +// +// Handles commands directed to this class. +// --------------------------------------------------------------------------- +void CDevDiagPluginView::HandleCommandL( TInt aCommand ) + { + LOGSTRING("CDevDiagPluginView::HandleCommandL"); + switch ( aCommand ) + { + + case EDDCmdPerformSingle: + { + // State == EStateReady then run tests + if (iEngine.GetState()== 2) + { + LOGSTRING("iState == EStateReady"); + iContainer->DisplayStartTestingL(); + + MDiagPlugin* plugin = NULL; + iContainer->SelectedPlugin(plugin); + + iEngine.ExecuteTestL( plugin->Uid(), *AppUi() ); + } + else + { + LOGSTRING2("PluginView::iEngine::iState = %d ", iEngine.GetState()); + LOGSTRING ("Trying to Execute Plugin @ Invalid State"); + } + break; + } + + case EAknSoftkeyBack: + { + if (iEngine.GetState()== 2) + { + LOGSTRING("Before Activate Local View for Back"); + + AppUi()->ActivateLocalViewL( KDDMainViewId ); + + LOGSTRING("After Activate Local View for Back"); + + } + + else + { + LOGSTRING2("PluginView::iEngine::iState = %d ", iEngine.GetState()); + LOGSTRING ("Trying to issue Back @ Invalid State"); + } + break; + } + + case EDDMenuCmdMainHelp: + { + MessageQueryDialogLaunchL( + R_MESSAGE_QUERY_HELP_NOTE ); + break; + } + + case EAknCmdHelp: + { + + + if( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + AppUi()->AppHelpContextL() ); + } + + break; + } + + case EDDCmdPerformAllHwTests: + { + //ask confirmation from the user + TBool ok = MessageQueryDialogLaunchL( + R_MESSAGE_QUERY_PERFORM_ALL_HW_TESTS ); + if ( ok ) + { + iContainer->ResetL(); + iContainer->DisplayStartTestingL(); + //Engine will populate the suite + iEngine.ExecuteTestL( KDDHardwareSuiteUid, *AppUi() ); + } + + break; + } + + case EDDCmdPerformAllCoverageTests: + { + + //ask confirmation from the user + TBool ok = MessageQueryDialogLaunchL( + R_MESSAGE_QUERY_PERFORM_ALL_COVERAGE_TESTS ); + if ( ok ) + { + //Engine will populate the suite + iEngine.ExecuteTestL( KDDCoverageSuiteUid, *AppUi() ); + } + + break; + } + + //These have only one test, so performing all is not needed yet + case EDDCmdPerformAllServiceTests: + { + break; + } + + case EDDCmdPerformAllConnTests: + { + break; + } + case EAknCmdTaskSwapper: + { + /* + * MSK: Active Applications + * This command is actually handled by Avkon FW + * Applications should not handle this + */ + break; + } + + default: + AppUi()->HandleCommandL( aCommand ); + break; + } + } + +// ---------------------------------------------------------------------------- +// CDevDiagPluginView::DoActivateL +// +// First method called by the Avkon framwork to invoke a view. +// ---------------------------------------------------------------------------- +// +void CDevDiagPluginView::DoActivateL( const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/ , + const TDesC8& /*aCustomMessage*/ ) + { + if( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + + delete iContainer; + iContainer = NULL; + } + + iContainer = CDevDiagPluginContainer::NewL( this, iEngine, ClientRect() ); + iContainer->SetMopParent( this ); + AppUi()->AddToStackL( iContainer ); + + iEngine.SetObserver( this ); + + //Construct the model + iContainer->UpdateModelL( iParentSuiteUid ); + + SetContextMenu(); + + //Retrieve last test results. HandleEngineCommandL with + //EDevDiagEngineCommandGetLastResults is called after this. + iEngine.GetLastResultsL( iParentSuiteUid ); + } + +// ---------------------------------------------------------------------------- +// CDevDiagPluginView::DoDeactivate +// +// Called by the Avkon view framework when closing. +// ---------------------------------------------------------------------------- +// +void CDevDiagPluginView::DoDeactivate() + { + if ( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer = NULL; + } + } + + +// ---------------------------------------------------------------------------- +// Handle CDevDiagEngine events. +// +// EDevDiagEngineCommandTestExecutionDone is called when single or group +// execution finishes. +// +// MDevDiagEngineObserver::EDevDiagEngineCommandResultsDataUpdated is called +// when a plug-in is executed. +// +// EDevDiagEngineCommandGetLastResults is called after +// iEngine.GetLastResultsL( iParentSuiteUid ) is called. It retrieves the +// last results. +// ---------------------------------------------------------------------------- +// +void CDevDiagPluginView::HandleEngineCommandL( TAppEngineCommand aCommand, + TInt aError, + TAny* aCustom ) + { + LOGSTRING("CDevDiagPluginView::HandleEngineCommandL"); + switch ( aCommand ) + { + case MDevDiagEngineObserver::EDevDiagEngineCommandGroupExecutionDone: + { + if ( aError != KErrNone ) + { + LOGSTRING2("MDevDiagEngineObserver::Exec Done Error: %d: ", aError); + return; + } + + iEngine.GetLastResultsL( iParentSuiteUid ); + + if ( iEngine.HasExecutionResults() ) + { + TInt failedCount = iEngine.ExecutionResults().FailedResultsCount(); + + TInt passedCount = iEngine.ExecutionResults().PassedResultsCount(); + + if ( failedCount == 0 && passedCount > 0) + { + DisplayConfirmationDialogL(R_DIAG_CONF_TEST_PASSED); + } + else if(failedCount > 0) + { + DisplayMessageQueryDialogFailedResultsL(); + } + } + + break; + } + + case MDevDiagEngineObserver::EDevDiagEngineCommandGroupExecutionProgress: + { + if ( aError != KErrNone ) + { + LOGSTRING2("MDevDiagEngineObserver::ExecutionProgress Error: %d: ", aError); + return; + } + + iEngine.GetLastResultsL( iParentSuiteUid ); + + iContainer->MoveStartTestingDownL(); + + break; + } + case MDevDiagEngineObserver::EDevDiagEngineCommandGetLastResults: + { + if ( aError != KErrNone ) + { + LOGSTRING2("MDevDiagEngineObserver::GetLastResults Error: %d: ", aError); + return; + } + + RPointerArray* array = + static_cast*> (aCustom); + iContainer->DisplayChildrenWithResultsL( *array ); + + + if ( iEngine.HasExecutionResults() && !iEngine.ExecutionResults().LastTestFinishedL()) + { + iContainer->MoveStartTestingDownL(); + } + + + break; + } + case MDevDiagEngineObserver::EDevDiagEngineCommandSinglePluginExecutionDone: + { + + if(!iEngine.GetPluginDependencyL()) + iEngine.GetLastResultsL( iParentSuiteUid ); + + if ( aError != KErrNone ) + { + LOGSTRING2("MDevDiagEngineObserver::SinglePluginExecutionDone Error: %d: ", aError); + return; + } + + //iEngine.GetLastResultsL( iParentSuiteUid ); // ADO & Platformization Changes + + // ADO & Platformization Changes + + ///@@@KSR: changes for Codescanner error val = High + //if(iEngine.ExecutionResults().SinglePluginExecutionL() && !iEngine.GetPluginDependency()) + if(iEngine.ExecutionResults().SinglePluginExecutionL() && !iEngine.GetPluginDependencyL()) + { + + const CDiagResultsDatabaseItem* aResult; + aResult = iEngine.ExecutionResults().GetSinglepluginExecutionResult(); + + + if(aResult->TestResult() == CDiagResultsDatabaseItem::ESuccess) + { + DisplayConfirmationDialogL(R_DIAG_CONF_TEST_PASSED_1); + LOGSTRING("The test has passed"); + } + else if(aResult->TestResult() == CDiagResultsDatabaseItem::EFailed) + { + DisplayConfirmationDialogL(R_DIAG_CONF_TEST_FAILED_1); + LOGSTRING("The test has failed"); + } + } + + + // Changes ends + + break; + } + + case MDevDiagEngineObserver::EDevDiagEngineCommandTestExecutionCancelled: + { + //Update container. + iEngine.GetLastResultsL( iParentSuiteUid ); + + if ( iEngine.HasExecutionResults() ) + { + TInt failedCount = iEngine.ExecutionResults().FailedResultsCount(); + + TInt passedCount = iEngine.ExecutionResults().PassedResultsCount(); + + if ( failedCount == 0 && passedCount > 0) + { + DisplayConfirmationDialogL(R_DIAG_CONF_TEST_PASSED); + } + else if(failedCount > 0) + { + DisplayMessageQueryDialogFailedResultsL(); + } + } + + break; + } + } + } + + +// ---------------------------------------------------------------------------- +// Change the title of the application. +// +// ---------------------------------------------------------------------------- +// +void CDevDiagPluginView::ChangeTitleL(TInt aResourceId) + { + CAknTitlePane* titlePane = + (CAknTitlePane*)(AppUi()->StatusPane())->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ); + + HBufC* titleText = iEikonEnv->AllocReadResourceLC( aResourceId ); + titlePane->SetTextL( titleText->Des() ); + CleanupStack::PopAndDestroy(titleText); + } + + +// ---------------------------------------------------------------------------- +// Display a message query dialog. +// +// ---------------------------------------------------------------------------- +// +TBool CDevDiagPluginView::MessageQueryDialogLaunchL( TInt aResourceId ) + { + CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog(); + + dlg->PrepareLC( aResourceId ); + + if (dlg->RunLD()) + { + return ETrue; + } + + return EFalse; + } + + +// ---------------------------------------------------------------------------- +// This is needed after performing a group of tests succesfully. +// ---------------------------------------------------------------------------- +// +void CDevDiagPluginView::DisplayConfirmationDialogL(TInt aResourceId) + { + CAknConfirmationNote* note = + new (ELeave) CAknConfirmationNote( ETrue ); //Waiting + + HBufC* text = NULL; + + text = StringLoader::LoadLC( aResourceId ); + + note->ExecuteLD( *text ); //Blocks until note dismissed + + CleanupStack::PopAndDestroy(); + } + + +// ---------------------------------------------------------------------------- +// This is needed after performing a group of tests +// +// Display dialog text according to the test result. +// +// Message query dialog will display a list of failed test cases. +// ---------------------------------------------------------------------------- +// +void CDevDiagPluginView::DisplayMessageQueryDialogFailedResultsL() + { + CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog(); + + dlg->PrepareLC( R_DEVDIAG_FAILED_TESTS_MESSAGEQUERY_DIALOG ); + + HBufC* failText = StringLoader::LoadL( R_DIAG_CONF_TEST_FAILED ); + CleanupStack::PushL( failText ); + + HBufC* failedTests = CreateResultsTextsForFailedTestsLC( iEngine.ExecutionResults() ); + + TInt newBufLength = failText->Length() + failedTests->Length(); + + HBufC* text = HBufC::NewLC( newBufLength ); + + text->Des().Append( *failText ); + text->Des().Append( *failedTests ); + + dlg->SetMessageTextL( *text ); + + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(); + + if (dlg->RunLD()) + { + + } + } + + +// ---------------------------------------------------------------------------- +// Loads names of the tests that failed. +// ---------------------------------------------------------------------------- +// +HBufC* CDevDiagPluginView::CreateResultsTextsForFailedTestsLC( + const CDevDiagExecResults& aExecResults ) + { + RBuf resultText; + CleanupClosePushL( resultText ); + + resultText.CreateL( KFailedTestsMaxLength ); + + TBool firstLineFeed = ETrue; + + for ( TInt i = 0; i < aExecResults.Count(); ++i ) + { + const CDevDiagExecResults::CResult& result = aExecResults[i]; + + //if item == NULL it is a test suite + const CDiagResultsDatabaseItem* item = result.Result(); + + if (item && !item->WasDependency()) + { + //List failed test cases + if ( item && item->TestResult() == CDiagResultsDatabaseItem::EFailed ) + { + const MDiagPlugin& plugin = result.Plugin(); + + //Note the correct layout. Name is used in the pop-up info pane. + HBufC* name = plugin.GetPluginNameL( MDiagPlugin::ENameLayoutPopupInfoPane ); + CleanupStack::PushL( name ); + + if ( resultText.MaxLength() < resultText.Length() + name->Length() ) + { + HBufC* temp = resultText.AllocLC(); + resultText.ReAlloc( resultText.Length() + KFailedTestsMaxLength ); + resultText.Append( *temp ); + CleanupStack::PopAndDestroy(); + } + + if ( !firstLineFeed ) + { + resultText.Append( KLinefeed ); + } + else + { + firstLineFeed = EFalse; + } + + resultText.Append( *name ); + resultText.Append( KTabfeed ); + + CleanupStack::PopAndDestroy(); + } + } + } + + //contains combined result texts + HBufC* result = resultText.AllocL(); + + CleanupStack::PopAndDestroy(); + + CleanupStack::PushL( result ); + return result; + } + +// End of File