--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/devdiagapp/src/devdiagplugincontainer.cpp Wed Sep 01 12:31:32 2010 +0100
@@ -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