devicediagnostics/devdiagapp/src/devdiagsuiteview.cpp
changeset 0 3ce708148e4d
--- /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