--- /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 <DiagPlugin.h>
+#include <akntitle.h>
+#include <coemain.h>
+#include <devdiagapp.rsg>
+#include <aknViewAppUi.h>
+#include <eikbtgpc.h> //Button group container
+#include <aknmessagequerydialog.h>
+#include <DiagFrameworkDebug.h> // Debug Logger
+#include <aknnotewrappers.h>
+#include <StringLoader.h>
+#include <AknWaitDialog.h> // CAknWaitDialog
+#include <DiagPluginPool.h>
+
+#include <DiagPlugin.h>
+#include <AknQueryDialog.h>
+#include <aknViewAppUi.h>
+#include <featmgr.h>
+#include <StringLoader.h>
+#include <bautils.h>
+#include <coeaui.h>
+#include <akntitle.h>
+#include <aknmessagequerydialog.h>
+#include <aknnotewrappers.h>
+#include <DiagResultsDatabaseItem.h>
+
+#ifdef __SERIES60_HELP
+#include <hlplch.h>
+#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<MDiagPlugin*>(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