devicediagnostics/devdiagapp/src/devdiagpluginview.cpp
changeset 0 3ce708148e4d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/devdiagapp/src/devdiagpluginview.cpp	Thu Dec 17 08:40:12 2009 +0200
@@ -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