devicediagnostics/devdiagapp/src/devdiagplugincontainer.cpp
changeset 0 3ce708148e4d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/devdiagapp/src/devdiagplugincontainer.cpp	Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,683 @@
+/*
+* Copyright (c) 2007-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: Implementation of diagnostics components
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "devdiagplugincontainer.h"
+#include "devdiagengine.h"   
+#include "devdiag.pan" 
+#include "devdiagutil.h" //Time conversion functions
+
+#include <DiagFrameworkDebug.h>   
+#include <devdiagapp.rsg>
+#include <DiagPlugin.h>  
+#include <DiagPluginPool.h> 
+#include <DiagSuitePlugin.h>   
+#include <DiagResultsDatabaseItem.h>
+#include <eikclbd.h>                // CColumnListBoxData
+#include <aknmessagequerydialog.h> 
+#include <data_caging_path_literals.hrh>
+#include <aknPopup.h>		// popup dialogs
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <textresolver.h>
+#include <AknIconArray.h>
+#include <AknsUtils.h>
+#include <featmgr.h>
+#include <AknWaitDialog.h> 
+#include <devdiagapp.mbg>
+
+
+#include <AknsUtils.h>
+///@@@KSR: changes for BAD Warnings - #177-D: variable "KDiagSpace" was declared but never referenced
+//_LIT( KDiagSpace, " " );
+_LIT( KListTestElementFormatDouble,  "%d\t%S\t%S" );
+_LIT( KDevDiagAppIconFileName, "\\resource\\apps\\devdiagapp.mif");
+
+const TInt KLastResultTextLength(256);
+const TInt KIconArrayGranularity(20);
+
+//INCORRECT!
+const MDiagPlugin::TNameLayoutType KLayoutType( MDiagPlugin::ENameLayoutListSingle );
+
+
+// ========================== MEMBER FUNCTIONS =================================
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDevDiagPluginContainer* CDevDiagPluginContainer::NewL( CDevDiagPluginView* aView,
+                                                         CDevDiagEngine& aEngine,
+                                                const TRect&    aRect )
+    {
+    CDevDiagPluginContainer* self = new( ELeave ) 
+                                     CDevDiagPluginContainer( aView, aEngine );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::CDevDiagPluginContainer
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CDevDiagPluginContainer::CDevDiagPluginContainer( CDevDiagPluginView* aView,
+                                                    CDevDiagEngine& aEngine )
+    : iView( aView ), iEngine(aEngine), iModelUpdated( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::ConstructL( const TRect& aRect )
+    {
+    LOGSTRING( "CDevDiagPluginContainer::ConstructL" );
+    CreateWindowL();
+
+	iListBox = new ( ELeave ) CAknDoubleLargeStyleListBox;
+	
+	iListBox->SetContainerWindowL( *this );
+	iListBox->ConstructL( this, EAknListBoxSelectionList );
+
+	iListBox->CreateScrollBarFrameL( ETrue );
+	iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( 
+	                                            CEikScrollBarFrame::EOff,
+	                                            CEikScrollBarFrame::EAuto );
+                	
+    AddIconsL();
+
+	iListBox->UpdateScrollBarsL();
+	//iListBox->ScrollBarFrame()->MoveVertThumbTo( 0 );		
+
+	iListBox->SetListBoxObserver( this );
+			
+    SetRect( aRect );
+    ActivateL();    
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::~CDevDiagPluginContainer
+// -----------------------------------------------------------------------------
+//
+CDevDiagPluginContainer::~CDevDiagPluginContainer()
+    {
+    delete iListBox;
+        
+    //Do not call ResetAndDestroy, because plug-ins are not owned.
+    iChildren.Close();
+    }
+    
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::SizeChanged
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::SizeChanged()
+    {
+    iListBox->SetRect( Rect() );    // Mandatory, otherwise not drawn
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::HandleResourceChange
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::HandleResourceChange( TInt aType )
+    {    
+    CCoeControl::HandleResourceChange( aType );
+    
+    //Handle change in layout orientation
+    if ( aType == KEikDynamicLayoutVariantSwitch || 
+         aType == KAknsMessageSkinChange )
+        {
+        if ( aType == KAknsMessageSkinChange )
+        	{
+        	// Skin changed; we'll have to reload the icon array
+            CArrayPtr<CGulIcon>* iconArray =
+                iListBox->ItemDrawer()->FormattedCellData()->IconArray();
+            if ( iconArray )
+                {
+    	        iconArray->ResetAndDestroy();
+	            delete iconArray;
+	            iconArray = NULL;
+    	        }
+    	    TRAP_IGNORE( AddIconsL() );
+        	}
+
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+        SetRect( mainPaneRect );
+		DrawDeferred();
+		}	
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::CountComponentControls
+// -----------------------------------------------------------------------------
+//
+TInt CDevDiagPluginContainer::CountComponentControls() const
+    {
+    TInt retval( 0 );
+    if ( iListBox )
+        {
+        retval = 1;
+        }
+    return retval; // return nbr of controls inside this container
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::ComponentControl
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CDevDiagPluginContainer::ComponentControl( TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            {
+            return iListBox;
+            }
+        default:
+            {
+            return NULL;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::Draw
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::Draw( const TRect& /* aRect */ ) const
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::HandleControlEventL
+// -----------------------------------------------------------------------------
+//
+
+void CDevDiagPluginContainer::HandleControlEventL( CCoeControl* /* aControl */,
+                                                TCoeEvent /* aEventType */ )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::OfferKeyEventL
+// -----------------------------------------------------------------------------
+//
+
+TKeyResponse CDevDiagPluginContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                             TEventCode aType )
+	{
+
+	if ( iListBox && aType == EEventKey )
+		{
+		switch ( aKeyEvent.iCode )
+			{
+			case EStdKeyHome:
+				{
+			
+			    break;
+           
+				}
+				
+			case EKeyEscape:
+				{
+			
+				iAvkonAppUi->ProcessCommandL( EEikCmdExit );
+				
+		    	break;
+				}
+			case EKeyUpArrow:
+			case EKeyDownArrow:
+			    {
+			    TKeyResponse retVal =
+			        iListBox->OfferKeyEventL( aKeyEvent, aType );
+                return retVal;
+			    }
+			case EKeyLeftArrow:
+			case EKeyRightArrow:
+			    {
+			    break;  // AppUi handles the tab changes
+			    }
+			default:
+			    {
+			    return iListBox->OfferKeyEventL( aKeyEvent, aType );
+			    }
+			}
+		}
+	
+	return EKeyWasNotConsumed;
+	}
+
+
+
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::HandleListBoxEventL
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::HandleListBoxEventL( CEikListBox* /*aListBox*/, 
+                                                 TListBoxEvent aEventType )
+	{	
+	// if the Select Key has been pressed
+	if ((aEventType == MEikListBoxObserver::EEventEnterKeyPressed) ||
+	(aEventType == MEikListBoxObserver::EEventItemClicked))
+		{ 
+		
+		}
+	}
+	
+#ifdef __SERIES60_HELP
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::GetHelpContext
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::GetHelpContext( TCoeHelpContext& /*aContext */ ) const
+	{	
+	//aContext.iMajor = KUidSmlSyncApp;
+    //aContext.iContext = KDM_HLP_DIAGNOSTICS_APPLICATION;
+	}
+
+#else
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::GetHelpContext
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::GetHelpContext( TCoeHelpContext& /*aContext*/ ) const
+	{
+	}
+#endif // __SERIES60_HELP
+
+// -----------------------------------------------------------------------------
+// CDevDiagPluginContainer::FocusChanged
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::FocusChanged( TDrawNow /*aDrawNow*/ )
+	{
+	if ( iListBox )
+		{
+		iListBox->SetFocus( IsFocused() );
+		}
+	}
+
+
+// -----------------------------------------------------------------------------
+// Change text of the focused item into "Testing ..."
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::DisplayStartTestingL()
+    {
+    LOGSTRING( "CDevDiagPluginContainer::DisplayStartTestingL" ); 
+    __ASSERT_ALWAYS( iModelUpdated, 
+                     Panic( EDevDiagListboxModelNotUpdated ) ); 
+    
+    // Add listbox items.
+    CDesCArray* pluginTextArray = static_cast< CDesCArray* >(
+        iListBox->Model()->ItemTextArray() );
+    
+    __ASSERT_ALWAYS( pluginTextArray->Count() == iChildren.Count(), 
+                     Panic( EDevDiagListboxContainerModel ) );
+    
+    MDiagPlugin* plugin;
+    HBufC* formattedName = NULL;
+    
+    SelectedPlugin ( plugin );
+    
+    HBufC* name = plugin->GetPluginNameL( KLayoutType );
+    CleanupStack::PushL( name );      
+     
+    HBufC* testingText = StringLoader::LoadL( R_DIAG_LST_TEST_ONGOING );
+    CleanupStack::PushL ( testingText );
+     
+    formattedName = HBufC::NewLC( name->Length() + 
+                                  KListTestElementFormatDouble().Length() + 
+                                  testingText->Length() );
+    formattedName->Des().Format( KListTestElementFormatDouble(), 0, name, testingText );
+
+    TInt index = iListBox->CurrentItemIndex();           
+    pluginTextArray->Delete( index );
+    
+    pluginTextArray->InsertL( index, *formattedName  );    
+    
+    CleanupStack::PopAndDestroy( formattedName );
+    CleanupStack::PopAndDestroy( testingText );         
+    CleanupStack::PopAndDestroy( name );
+        
+    iListBox->SetFocus( ETrue );
+    iListBox->HandleItemAdditionL();
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+    iListBox->DrawDeferred();
+    }
+ 
+// -----------------------------------------------------------------------------
+// Move "Testing ..." one step lower. This is needed when a group of plug-ins
+// are executed.
+// -----------------------------------------------------------------------------
+//
+ void CDevDiagPluginContainer::MoveStartTestingDownL()
+    {
+    if ( iListBox->CurrentItemIndex() + 1 < iChildren.Count() )
+        {
+        iListBox->SetCurrentItemIndex ( iListBox->CurrentItemIndex() +1 );
+        DisplayStartTestingL();
+        }   
+    }
+
+
+// -----------------------------------------------------------------------------
+// Set focus at the beginning of the listbox.
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::ResetL()
+    {
+    iListBox->SetCurrentItemIndexAndDraw  ( 0 );
+    }
+
+
+// -----------------------------------------------------------------------------
+// Create the plug-in model.
+// The function needs to know the parent uid and its children are loaded.
+// -----------------------------------------------------------------------------
+// 
+void CDevDiagPluginContainer::UpdateModelL( TUid aParentSuiteUid )    
+    {
+    LOGSTRING( "CDevDiagPluginContainer::UpdateModelL" );         
+    MDiagPlugin* plugin;
+    if ( iEngine.PluginPool().FindPlugin( aParentSuiteUid, plugin ) == KErrNone )
+        {
+        iChildren.Reset(); //plug-ins are owned by the engine.
+       
+        MDiagSuitePlugin* suite = static_cast< MDiagSuitePlugin* >( plugin );
+        suite->GetChildrenL( iChildren, MDiagSuitePlugin::ESortByPosition );
+        
+        iModelUpdated = ETrue;
+        }
+    else
+        {
+        Panic( EDevDiagListboxFindPluginFailure );
+        }
+    }
+    
+
+// -----------------------------------------------------------------------------
+// The plug-in execution was not performed. Display the text on the listbox.
+// -----------------------------------------------------------------------------
+//    
+void CDevDiagPluginContainer::DisplayNotPerformedL( CDesCArray& aListboxModel, 
+                                                    MDiagPlugin*& aPlugin )    
+    {    
+    LOGSTRING( "CDevDiagPluginContainer::DisplayNotPerformedL" );                    
+    HBufC* name = aPlugin->GetPluginNameL( KLayoutType );
+                
+    CleanupStack::PushL( name );
+    
+    HBufC* result = GetPluginResultL( ENotPerformed );    
+    CleanupStack::PushL( result );
+            
+    HBufC* formattedName = HBufC::NewLC( name->Length() + 
+                                  result->Length() +
+                                  KListTestElementFormatDouble().Length() );
+    formattedName->Des().Format( KListTestElementFormatDouble(), 0, name, result);
+            
+    aListboxModel.AppendL( *formattedName );
+            
+    CleanupStack::PopAndDestroy( formattedName );
+    CleanupStack::PopAndDestroy( result );
+    
+    CleanupStack::PopAndDestroy( name );         
+    }
+    
+
+// -----------------------------------------------------------------------------
+// Display icon and test result for the plug-in.
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::DisplayLastResultL( CDesCArray& aListboxModel,
+                                                  MDiagPlugin*& aPlugin,
+                                                  CDiagResultsDatabaseItem& aItem )    
+    {   
+    LOGSTRING( "CDevDiagPluginContainer::DisplayLastResultL" );                    
+    
+    HBufC* name = aPlugin->GetPluginNameL( KLayoutType );
+    CleanupStack::PushL( name );           
+            
+    TBuf<KLastResultTextLength> execTime;
+                                
+    TTime started = aItem.TimeStarted();
+            
+    if ( TDevDiagUtil::IsToday(started))
+        {
+        TDevDiagUtil::GetTimeTextL( execTime, started );
+        LOGTEXT( execTime );
+        }
+    else 
+        {
+        TDevDiagUtil::GetDateTextL( execTime, started );
+        LOGTEXT( execTime );
+        }
+      
+    TInt iconIndex = -1;  
+    
+    HBufC* result = ConvertResultLC( execTime, iconIndex, &aItem );          
+                                                                                                    
+    HBufC* formattedName = HBufC::NewLC( name->Length() + 
+                                  result->Length() +
+                                  KListTestElementFormatDouble().Length());
+                                 
+    // Format icon index, then the name of the plug-in and then time.                                  
+    formattedName->Des().Format( KListTestElementFormatDouble(), 
+                                 iconIndex, 
+                                 name, 
+                                 result);    
+                
+    aListboxModel.AppendL( *formattedName );
+                        
+    CleanupStack::PopAndDestroy( formattedName );
+    CleanupStack::PopAndDestroy( result );
+    CleanupStack::PopAndDestroy( name );                
+    }
+    
+
+// -----------------------------------------------------------------------------
+// Refresh the listbox with last results.
+// -----------------------------------------------------------------------------
+//    
+void CDevDiagPluginContainer::DisplayChildrenWithResultsL(
+                        RPointerArray<CDiagResultsDatabaseItem>& aArray )
+    {
+    LOGSTRING( "CDevDiagPluginContainer::DisplayChildrenWithResultsL" );
+    
+    __ASSERT_ALWAYS( iModelUpdated, 
+                     Panic( EDevDiagListboxModelNotUpdated ) ); 
+                   
+    // arrays must match                     
+    __ASSERT_ALWAYS( aArray.Count() == iChildren.Count(), 
+                     Panic( EDevDiagContainerArrayMismatch ) );                      
+    
+    iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+
+    // Add listbox items.
+    CDesCArray* pluginTextArray = static_cast< CDesCArray* >(
+        iListBox->Model()->ItemTextArray() );
+    pluginTextArray->Reset();
+         
+    // Go through the last result list         
+    for (TInt i = 0; i < aArray.Count(); ++i)
+        {                             
+        if ( !aArray[i] ) //Item has not been performed (last result not found)
+            {
+            LOGSTRING2("Item number: %d was null", i );                            
+            DisplayNotPerformedL( *pluginTextArray, iChildren[i] );                                   
+            }
+        else  //last result found, display a test result
+            {   
+            LOGSTRING2("Result found: %d", i );                 
+            DisplayLastResultL( *pluginTextArray, iChildren[i], *aArray[i] );                                        
+            }
+        }   
+        
+    iListBox->SetFocus( ETrue );
+    iListBox->HandleItemAdditionL();
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+    iListBox->DrawDeferred();
+    
+    LOGSTRING( "CDevDiagPluginContainer::DisplayChildrenWithResultsL end" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// Get localised test result text.
+// -----------------------------------------------------------------------------
+// 
+HBufC* CDevDiagPluginContainer::GetPluginResultL( TContainerResult aResult ) const
+    {
+    LOGSTRING( "CDevDiagPluginContainer::GetPluginResultL" );
+    
+    switch ( aResult  )
+        {
+        case ESuccess:
+            return StringLoader::LoadL( R_DIAG_LST_TEST_PASS  );
+
+        case EFailed:
+            return StringLoader::LoadL ( R_DIAG_LST_TEST_FAILED  );
+
+        case ENotPerformed:
+            return StringLoader::LoadL( R_DIAG_LIST_NOT_PERFORMED  );
+
+        default:
+            Panic( EDevDiagApplicationInvalidResultIndex );            
+        }
+        
+    return NULL;    
+    }
+
+
+// -----------------------------------------------------------------------------
+// Get localised test result text and the icon array
+// -----------------------------------------------------------------------------
+// 
+HBufC* CDevDiagPluginContainer::ConvertResultLC( const TDesC& aString, 
+                                                TInt& aIconIndex, 
+                                                CDiagResultsDatabaseItem* aResult ) const
+    {
+    LOGSTRING( "CDevDiagPluginContainer::ConvertResultL" );
+    if ( !aResult )
+        {
+        return StringLoader::LoadLC( R_DIAG_LIST_NOT_PERFORMED  );
+        }
+    
+    switch ( aResult->TestResult() )
+        {
+        case CDiagResultsDatabaseItem::ESuccess:
+            aIconIndex = 1;
+            return StringLoader::LoadLC( R_DIAG_LST_TEST_PASS, aString );
+
+        case CDiagResultsDatabaseItem::EFailed:
+            aIconIndex = 2;
+            return StringLoader::LoadLC ( R_DIAG_LST_TEST_FAILED, aString );      
+        case CDiagResultsDatabaseItem::ESkipped:
+        case CDiagResultsDatabaseItem::ECancelled:
+        case CDiagResultsDatabaseItem::EQueuedToRun:
+            {
+            return StringLoader::LoadLC( R_DIAG_LIST_NOT_PERFORMED  );
+            }
+
+        default:
+            LOGSTRING2("PANIC: Results item had a result: %d ", aResult->TestResult() );
+            Panic( EDevDiagApplicationInvalidResultIndex );            
+        }
+        
+    return NULL;
+    }
+
+void CDevDiagPluginContainer::SelectedPlugin(MDiagPlugin*& aPlugin)
+    {
+    LOGSTRING( "CDevDiagPluginContainer::SelectedPluginL" );
+    aPlugin = iChildren[ iListBox->CurrentItemIndex() ];
+    }
+
+// -----------------------------------------------------------------------------
+// Load icons. 
+//
+// Icons are:
+// Not performed
+// Passed
+// Failed
+// -----------------------------------------------------------------------------
+//
+void CDevDiagPluginContainer::AddIconsL()
+    {   
+    LOGSTRING( "CDevDiagPluginContainer::AddIconsL" );        
+	CArrayPtr<CGulIcon>* icons = new (ELeave) CArrayPtrFlat<CGulIcon>
+	                                                (KIconArrayGranularity);
+	                                                
+	iListBox->ItemDrawer()->FormattedCellData()->SetIconArray( icons );
+    
+	CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+        
+    LOGSTRING( "CDevDiagPluginContainer::AddIconsL 1" ); 
+        
+    AknIconUtils::CreateIconL(
+        bitmap,
+        mask,
+        KDevDiagAppIconFileName(),
+        EMbmDevdiagappQgn_prop_cp_diag_not,
+        EMbmDevdiagappQgn_prop_cp_diag_not_mask );
+
+    icons->AppendL( CGulIcon::NewL( bitmap, mask ));
+    
+    LOGSTRING( "CDevDiagPluginContainer::AddIconsL 2" ); 
+    
+    AknIconUtils::CreateIconL(
+        bitmap,
+        mask,
+        KDevDiagAppIconFileName(),
+        EMbmDevdiagappQgn_prop_cp_diag_pass,
+        EMbmDevdiagappQgn_prop_cp_diag_pass_mask );
+    
+    LOGSTRING( "CDevDiagPluginContainer::AddIconsL 3" );     
+
+    icons->AppendL( CGulIcon::NewL( bitmap, mask ));
+    
+    AknIconUtils::CreateIconL(
+        bitmap,
+        mask,
+        KDevDiagAppIconFileName(),
+        EMbmDevdiagappQgn_prop_cp_diag_fail,
+        EMbmDevdiagappQgn_prop_cp_diag_fail_mask );
+
+	// Create the icon.
+    icons->AppendL( CGulIcon::NewL( bitmap, mask ));
+    
+    LOGSTRING( "CDevDiagPluginContainer::AddIconsL end" );            
+    }
+
+// End of File