diff -r 000000000000 -r 3ce708148e4d devicediagnostics/devdiagapp/src/devdiagsuiteview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnostics/devdiagapp/src/devdiagsuiteview.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,656 @@ +/* +* 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: Main view implementation. +* +*/ + + + +#include "devdiagsuitecontainer.h" +#include "devdiagengine.h" +#include "devdiagdef.h" +#include "devdiagpluginview.h" +#include "devdiagexecutionresults.h" +#include "devdiag.pan" + +#include +#include +#include +#include +#include +#include //Button group container +#include +#include // Debug Logger +#include +#include +#include // CAknWaitDialog +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __SERIES60_HELP +#include +#endif + +#include "devdiagsuiteview.h" + +const TInt KRootSuite = 0x2000E540; //top level suite + +_LIT(KLinefeed, "\n"); +_LIT(KTabfeed, "\t"); +const TInt KFailedTestsMaxLength(1024); + +// ---------------------------------------------------------------------------- +// Standard symbian c++ constructor +// ---------------------------------------------------------------------------- +CDevDiagSuiteView* CDevDiagSuiteView::NewL( CDevDiagEngine& aEngine ) + { + //LOGSTRING("CDevDiagSuiteView* CDevDiagSuiteView::NewL"); + CDevDiagSuiteView* self = CDevDiagSuiteView::NewLC( aEngine ); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------------------------- +// Standard symbian c++ constructor +// ---------------------------------------------------------------------------- +// +CDevDiagSuiteView* CDevDiagSuiteView::NewLC( CDevDiagEngine& aEngine ) + { + //LOGSTRING("CDevDiagSuiteView* CDevDiagSuiteView::NewLC"); + CDevDiagSuiteView* self = new (ELeave) CDevDiagSuiteView(aEngine); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------------------------- +// ConstructL. +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::ConstructL() + { + BaseConstructL( R_GS_DD_VIEW ); + ChangeTitleL ( R_GS_DIAGNOSTICS_VIEW_CAPTION ); + } + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +// +CDevDiagSuiteView::CDevDiagSuiteView(CDevDiagEngine& aEngine): + iContainer ( NULL ), + iEngine ( aEngine ), + iParentPlugin( TUid::Uid( KRootSuite )) + { + aEngine.SetObserver(this); + } + +// ---------------------------------------------------------------------------- +// Destructor. +// ---------------------------------------------------------------------------- +// +CDevDiagSuiteView::~CDevDiagSuiteView() + { + if ( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer = NULL; + } + } + +// ---------------------------------------------------------------------------- +// Engine observer. +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::HandleEngineCommandL( TAppEngineCommand aCommand, + TInt aError, + TAny* aCustom ) + { + switch ( aCommand ) + { + case MDevDiagEngineObserver::EDevDiagEngineCommandPluginLoadComplete: + { + + if ( iWaitDialog ) + { + DismissWaitDialogPreparingL(); + } + + CheckCrashedTestL(); + + break; + } + case MDevDiagEngineObserver::EDevDiagEngineCommandPluginLoadProgress: + { + MDiagPlugin* plugin = static_cast(aCustom); + + if ( SuiteUid( plugin->Uid() )) + { + iContainer->DisplayPluginL( plugin ); + } + + break; + } + + case MDevDiagEngineObserver::EDevDiagEngineCommandGroupExecutionDone: + { + if ( aError != KErrNone ) + { + LOGSTRING2("MDevDiagEngineObserver::Exec Done Error: %d: ", aError); + return; + } + + if ( iEngine.HasExecutionResults() ) + { + TInt failedCount = iEngine.ExecutionResults().FailedResultsCount(); + + if ( failedCount == 0 ) + { + DisplayConfirmationDialogL(); + } + else + { + DisplayMessageQueryDialogFailedResultsL(); + } + } + + break; + } + } + } + +// ---------------------------------------------------------------------------- +// Application ID. +// ---------------------------------------------------------------------------- +// +TUid CDevDiagSuiteView::Id() const + { + return KDDMainViewId; + } + + +// ---------------------------------------------------------------------------- +// Change the title of the application. +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::ChangeTitleL(TInt aResourceId) + { + CAknTitlePane* titlePane = + (CAknTitlePane*)(AppUi()->StatusPane())->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ); + + HBufC* titleText = iEikonEnv->AllocReadResourceLC( aResourceId ); + titlePane->SetTextL( titleText->Des() ); + CleanupStack::PopAndDestroy(titleText); + } + +// ---------------------------------------------------------------------------- +// Handle commands. +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::HandleCommandL( TInt aCommand ) + { + LOGSTRING2("CDevDiagSuiteView::HandleCommandL %d",aCommand); + switch ( aCommand ) + { + case EDDCmdOpen: + { + //Selected suite plug-in + MDiagPlugin* plugin; + + iContainer->SelectedPlugin( plugin ); + + if ( iPluginView ) + { + AppUi()->RemoveView( KDDPluginViewId ); + } + + iPluginView = CDevDiagPluginView::NewL( iEngine, plugin->Uid() ); + + AppUi()->AddViewL( iPluginView ); + + AppUi()->ActivateLocalViewL( KDDPluginViewId ); + + } + + break; + + case EDDCmdPerformAllTests: + { + + + TBool ok = MessageQueryDialogLaunchL( R_MESSAGE_QUERY_PERFORM_ALL_TESTS ); + + if ( ok ) + { + //Engine will populate the suite. + //because the plug-in is root suite, all tests will be executed. + iEngine.ExecuteTestL( iParentPlugin, *AppUi() ); + } + + break; + } + + case EDDMenuCmdMainHelp: + { + /* MessageQueryDialogLaunchL( + R_MESSAGE_QUERY_HELP_NOTE );*/ + + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + AppUi()->AppHelpContextL() ); + break; + } + + case EAknCmdHelp: + { + 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; + } + } + + +// ---------------------------------------------------------------------------- +// Identify is it a suite or not. +// ---------------------------------------------------------------------------- +// +TBool CDevDiagSuiteView::SuiteUid( TUid aUid ) + { + + if ( aUid == KDDHardwareSuiteUid ) + { + return ETrue; + } + else if ( aUid == KDDConnectivitySuiteUid ) + { + return ETrue; + } + else if ( aUid == KDDServicesSuiteUid ) + { + return ETrue; + } + else if ( aUid == KDDCoverageSuiteUid ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ---------------------------------------------------------------------------- +// First method called by the Avkon framwork to invoke a view. +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::DoActivateL( const TVwsViewId& aPrevViewId, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/ ) + { + LOGSTRING( "CDevDiagSuiteView::DoActivateL"); + ChangeTitleL ( R_GS_DIAGNOSTICS_VIEW_CAPTION ); + + iPrevViewId = aPrevViewId; + + if( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + + delete iContainer; + iContainer = NULL; + } + + iContainer = CDevDiagSuiteContainer::NewL( this, iEngine, ClientRect() ); + iContainer->SetMopParent( this ); + AppUi()->AddToStackL( iContainer ); + + iEngine.SetObserver(this); + + if ( !iEngine.ArePluginsLoaded() ) + { + DisplayWaitDialogPreparingL(); + } + else + { + //display children of the top level suite. + iContainer->DisplayChildrenL( iParentPlugin ); + } + + if ( iEikonEnv->StartedAsServerApp() ) + { + //UpdateCbaL( R_PROFILE_MAIN_VIEW_CBA_2 ); + } + + LOGSTRING( "CDevDiagSuiteView::DoActivateL end"); + } + +// ---------------------------------------------------------------------------- +// Update command buttons +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::UpdateCbaL(TInt aResourceId) + { + CEikButtonGroupContainer* cba = Cba(); + cba->SetCommandSetL(aResourceId); + cba->DrawDeferred(); + } + +// ---------------------------------------------------------------------------- +// Called by the Avkon view framework when closing. +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::DoDeactivate() + { + if ( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer = NULL; + } + + } + +// ---------------------------------------------------------------------------- +// Display message query dialog. +// +// ---------------------------------------------------------------------------- +// +TBool CDevDiagSuiteView::MessageQueryDialogLaunchL( TInt aResourceId ) + { + CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog(); + + dlg->PrepareLC( aResourceId ); + + if (dlg->RunLD()) + { + return ETrue; + } + + return EFalse; + } + + +// ---------------------------------------------------------------------------- +// Display a confirmation dialog. +// +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::DisplayConfirmationDialogL( TBool aPassed ) + { + CAknConfirmationNote* note = + new (ELeave) CAknConfirmationNote( ETrue ); //Waiting + + HBufC* text = NULL; + + if ( aPassed ) + { + text = StringLoader::LoadL( R_DIAG_CONF_TEST_PASSED ); + } + else + { + text = StringLoader::LoadL( R_DIAG_CONF_TEST_FAILED ); + } + + CleanupStack::PushL( text ); + + note->ExecuteLD( *text ); //Blocks until note dismissed + + CleanupStack::PopAndDestroy(); + } + + +// --------------------------------------------------------------------------- +// Display a wait dialog to inform the user we are preparing for execution. +// --------------------------------------------------------------------------- +// +void CDevDiagSuiteView::DisplayWaitDialogPreparingL() + { + LOGSTRING( "CDevDiagSuiteView::DisplayWaitDialogPreparingL()" ); + + __ASSERT_DEBUG( !iWaitDialog, Panic( EDevDiagApplicationGeneral ) ); + + // Create the wait dialog and run it. The dialog will only display if + // checking runtime requirements takes more than 1.5 seconds. + iWaitDialog = new (ELeave) CAknWaitDialog( + reinterpret_cast< CEikDialog** >( &iWaitDialog ), + EFalse ); + iWaitDialog->ExecuteLD( R_DEV_DIAG_PREPARING_WAIT_NOTE ); + + } + +// --------------------------------------------------------------------------- +// Display a confirmation dialog to inform the user there are no logged +// results available. +// --------------------------------------------------------------------------- +// +void CDevDiagSuiteView::DismissWaitDialogPreparingL() + { + LOGSTRING( "CDevDiagSuiteView::DismissWaitDialogPreparingL()" ) + + __ASSERT_DEBUG( iWaitDialog, Panic( EDevDiagApplicationGeneral ) ); + + // Stop the wait dialog. + iWaitDialog->ProcessFinishedL(); + iWaitDialog = NULL; + + } + +// --------------------------------------------------------------------------- +// Check and display a dialog if there is a crashed test record. Only the last +// crashed test record is counted. +// --------------------------------------------------------------------------- +// +void CDevDiagSuiteView::CheckCrashedTestL() + { + LOGSTRING("CDevDiagSuiteView::CheckCrashedTestL"); + TUid pluginUid; + TBool found = EFalse; + TInt error = KErrNone; + found = iEngine.CrashedPluginL( pluginUid ); + LOGSTRING2("CrashedPlugin Found = %d", found); + if ( found ) + { + //Complete the record. + ///@@@KSR: changes for Codescanner error val = High + //error = iEngine.CompleteCrashedTestRecord(); + error = iEngine.CompleteCrashedTestRecordL(); + + if ( error != KErrNone ) + { + LOGSTRING2( "CDevDiagSuiteView::CheckCrashedTestL 1() error: %d", error ); + Panic( EDevDiagCheckCrashedTest ); + } + + MDiagPlugin* plugin = NULL; + error = iEngine.PluginPool().FindPlugin( pluginUid, plugin ); + + HBufC* name = plugin->GetPluginNameL( MDiagPlugin::ENameLayoutPopupInfoPane ); + CleanupStack::PushL( name ); + + HBufC* text = StringLoader::LoadLC( R_DIAG_CONF_QUERY_AFTER_CRASH, *name ); + + CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog; + + dlg->PrepareLC( R_DEVDIAG_EXECUTE_CRASHED_TEST_MESSAGEQUERY_DIALOG ); + + dlg->SetMessageTextL( *text ); + + HBufC* headerText = plugin->GetPluginNameL( MDiagPlugin::ENameLayoutHeadingPane ); + CleanupStack::PushL( headerText ); + + dlg->SetHeaderTextL( *headerText ); + + CleanupStack::PopAndDestroy(); + + if (dlg->RunLD()) + { + //Create a new test run. + iEngine.ExecuteTestL( pluginUid, *AppUi() ); + } + + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(); + } + } + + +// ---------------------------------------------------------------------------- +// This is needed after performing a group of tests succesfully. +// ---------------------------------------------------------------------------- +// +void CDevDiagSuiteView::DisplayConfirmationDialogL( ) + { + CAknConfirmationNote* note = + new (ELeave) CAknConfirmationNote( ETrue ); //Waiting + + HBufC* text = NULL; + + text = StringLoader::LoadLC( R_DIAG_CONF_TEST_PASSED ); + + 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 CDevDiagSuiteView::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* CDevDiagSuiteView::CreateResultsTextsForFailedTestsLC( + const CDevDiagExecResults& aExecResults ) + { + LOGSTRING("CDevDiagSuiteView::CreateResultsTextsForFailedTestsLC"); + 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