--- /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 <DiagPlugin.h>
+#include <devdiagapp.rsg> //resources
+#include <AknQueryDialog.h>
+#include <aknradiobuttonsettingpage.h>
+#include <aknViewAppUi.h>
+#include <featmgr.h>
+#include <StringLoader.h>
+#include <bautils.h>
+#include <coeaui.h>
+#include <eikfrlbd.h>
+#include <gulicon.h>
+#include <hlplch.h> // For HlpLauncher
+#include <akntitle.h>
+#include <aknmessagequerydialog.h>
+#include <aknnotewrappers.h>
+#include <DiagFrameworkDebug.h> // Debug Logger
+#include <DiagResultsDatabaseItem.h>
+
+// 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<CDiagResultsDatabaseItem>* array =
+ static_cast<RPointerArray<CDiagResultsDatabaseItem>*> (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