--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/diagplugins/DiagInternalMemoryPlugin/src/diaginternalmemoryplugin.cpp Wed Sep 01 12:31:32 2010 +0100
@@ -0,0 +1,605 @@
+/*
+* 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: Internal Memory Test Plugin
+*
+*/
+
+
+// CLASS DECLARATION
+#include "diaginternalmemoryplugin.h"
+
+// SYSTME INCLUDE FILES
+#include <featmgr.h> // feature manager for MMC support checking
+#include <features.hrh>
+//#ifndef RD_MULTIPLE_DRIVE
+#include <pathinfo.h> //PathInfo
+//#endif // RD_MULTIPLE_DRIVE
+#include <sysutil.h> //SysUtil
+#include <StringLoader.h> // StringLoader
+
+#include <DiagTestObserver.h> // MDiagTestObserver
+#include <DiagTestExecParam.h> // TDiagTestExecParam
+#include <DiagResultsDbItemBuilder.h> // CDiagResultsDbItemBuilder
+#include <DiagResultDetailBasic.h> // CDiagResultDetailBasic
+#include <DiagFrameworkDebug.h> // LOGSTRING
+#include <devdiaginternalmemorypluginrsc.rsg>
+
+#include "diaginternalmemoryplugin.hrh" // ADO & Platformization Changes
+
+#include <AknDialog.h> // ADO & Platformization Changes
+#include <aknmessagequerydialog.h> // ADO & Platformization Changes
+#include <DiagCommonDialog.h> // for EDiagCommonDialogConfirmCancelAll
+#include <DiagEngineCommon.h>
+
+
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KDiagInternalMemoryStepsMaxCount = 3; //total test steps
+_LIT( KText1, "PhoneDoctor Internal Memory Test" );
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ==============================
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ----------------------------------------------------------------------------
+// CDiagInternalMemoryPlugin::CDiagInternalMemoryPlugin()
+//
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CDiagInternalMemoryPlugin::CDiagInternalMemoryPlugin( CDiagPluginConstructionParam* aParam )
+ : CDiagTestPluginBase( aParam )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CDiagInternalMemoryPlugin::NewL()
+//
+// Symbian OS default constructor
+// ---------------------------------------------------------------------------
+MDiagPlugin* CDiagInternalMemoryPlugin::NewL( TAny* aInitParams )
+ {
+ ASSERT( aInitParams );
+ LOGSTRING( "CDiagInternalMemory::NewL" );
+
+
+ CDiagPluginConstructionParam* param =
+ static_cast<CDiagPluginConstructionParam*>( aInitParams );
+ CleanupStack::PushL( param );
+ CDiagInternalMemoryPlugin* self = new( ELeave ) CDiagInternalMemoryPlugin (param);
+ CleanupStack::Pop( param );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self ); // self
+ return self;
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CDiagInternalMemoryPlugin::ConstructL()
+//
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+void CDiagInternalMemoryPlugin::ConstructL()
+ {
+ LOGSTRING("CDiagInternalMemoryPlugin::ConstructL: Plugin created.");
+ idialogOn = EFalse;
+ idialogDismissed = EFalse;
+ BaseConstructL ( KDiagInternalMemoryPluginResourceFileName );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CDiagInternalMemoryPlugin::~CDiagInternalMemoryPlugin
+//
+// Destructor
+// ----------------------------------------------------------------------------
+CDiagInternalMemoryPlugin::~CDiagInternalMemoryPlugin()
+ {
+
+ }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagInternalMemoryPlugin::IsVisible()
+// ---------------------------------------------------------------------------
+TBool CDiagInternalMemoryPlugin::IsVisible() const
+ {
+ return ETrue;
+ }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagInternalMemoryPlugin::IsSupported()
+// ---------------------------------------------------------------------------
+TBool CDiagInternalMemoryPlugin::IsSupported() const
+ {
+ return ETrue;
+ }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagTestPlugin
+// CDiagInternalMemoryPlugin::RunMode()
+// ---------------------------------------------------------------------------
+MDiagTestPlugin::TRunMode CDiagInternalMemoryPlugin::RunMode() const
+ {
+ return EAutomatic;
+ }
+
+
+
+
+// ---------------------------------------------------------------------------
+// From MDiagTestPlugin
+// CDiagInternalMemoryPlugin::TotalSteps()
+// ---------------------------------------------------------------------------
+TUint CDiagInternalMemoryPlugin::TotalSteps() const
+ {
+ return KDiagInternalMemoryStepsMaxCount;
+ }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagInternalMemoryPlugin::GetPluginName
+// ---------------------------------------------------------------------------
+HBufC* CDiagInternalMemoryPlugin::GetPluginNameL( TNameLayoutType aLayoutType ) const
+ {
+
+ switch ( aLayoutType )
+ {
+ case ENameLayoutListSingle:
+ return StringLoader::LoadL ( R_DIAG_LST_INTERNAL_MEMORY );
+
+ case ENameLayoutHeadingPane:
+ return StringLoader::LoadL ( R_QTN_DIAG_MSG_TITLE_INTERNAL_MEMORY );
+
+ case ENameLayoutPopupInfoPane:
+ return StringLoader::LoadL ( R_QTN_DIAG_MSG_INFO_INTERNAL_MEMORY );
+
+ case ENameLayoutTitlePane:
+ return StringLoader::LoadL ( R_QTN_DIAG_TITLE_TEST_INTERNAL_MEMORY );
+
+ case ENameLayoutListSingleGraphic:
+ return StringLoader::LoadL ( R_QTN_DIAG_LST_TEST_INTERNAL_MEMORY );
+
+ default:
+ LOGSTRING2( "CDiagInternalMemoryPlugin::GetPluginNameL: "
+ L"ERROR: Unsupported layout type %d", aLayoutType )
+ __ASSERT_DEBUG( 0, User::Invariant() );
+ return StringLoader::LoadL ( R_DIAG_LST_INTERNAL_MEMORY );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagInternalMemoryPlugin::Uid
+// ---------------------------------------------------------------------------
+TUid CDiagInternalMemoryPlugin::Uid() const
+ {
+ return KDiagInternalMemoryPluginUid;
+ }
+
+
+// ---------------------------------------------------------------------------
+// From CActive
+// CDiagInternalMemoryPlugin::RunL
+// ---------------------------------------------------------------------------
+void CDiagInternalMemoryPlugin::RunL()
+ {
+
+ //report test progress
+ if ( iCounter > 0 )
+ {
+ iCounter--;
+ ReportTestProgressL( KDiagInternalMemoryStepsMaxCount - iCounter );
+ }
+
+ // handle read or write action
+ switch ( iState )
+ {
+ case EWriting:
+ if (idialogDismissed)
+ {
+ ReportResultToPluginL( CDiagResultsDatabaseItem::ESkipped );
+ LOGSTRING("CDiagExternalMediaCardPlugin::RunL dialogDismissed=EWriting");
+ //reset the var
+ idialogDismissed = EFalse;
+ return;
+ }
+ //check if write is okay
+ if ( iStatus == KErrNone )
+ {
+ LOGSTRING( "CDiagInternalMemory::RunL, write ok" );
+ iFile.Close();
+
+ // read test
+ TInt errorCodeOpen = iFile2.Open( iFs, iFileName, EFileRead );
+ if ( errorCodeOpen!=KErrNone )
+ {
+ LOGSTRING( "CDiagInternalMemory::RunL,iFile2 open fail" );
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ return;
+ }
+ LOGSTRING( "CDiagInternalMemory::RunL, iFile2 open okay" );
+
+ // Start read test
+ SetState( EReading );
+ iBufr.Zero();
+ iFile2.Read( iBufr, iStatus );
+
+ SetActive();
+
+ }
+ else //write fail
+ {
+ LOGSTRING( "CDiagInternalMemory::RunL, write fail" );
+ //set test result fail
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ }
+ break;
+
+ case EReading:
+ if (idialogDismissed)
+ {
+ ReportResultToPluginL( CDiagResultsDatabaseItem::ESkipped );
+ LOGSTRING("CDiagExternalMediaCardPlugin::RunL dialogDismissed=EReading");
+ //reset the var
+ idialogDismissed = EFalse;
+ return;
+ }
+ //check if read is okay
+ if( iStatus == KErrNone )
+ {
+ LOGSTRING( "CDiagInternalMemory::RunL, read okay" );
+
+ //compare data and set test result
+ CDiagResultsDatabaseItem::TResult result = ( iBufr == iBufw )?
+ CDiagResultsDatabaseItem::ESuccess
+ : CDiagResultsDatabaseItem::EFailed;
+ ReportResultToPluginL( result );
+ LOGSTRING2( "CDiagInternalMemory::RunL,test result %d", result );
+ }
+ else //read fail
+ {
+ LOGSTRING( "CDiagInternalMemory::RunL, read fail" );
+ //set result fail
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ }
+ break;
+ default:
+ LOGSTRING( "CDiagInternalMemory::RunL, default case" );
+ //set result fail
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CDiagInternalMemoryPlugin::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CDiagInternalMemoryPlugin::RunError( TInt aError )
+ {
+ LOGSTRING2( "CDiagInternalMemoryPlugin::RunError( %d )", aError )
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// From CActive
+// CDiagInternalMemoryPlugin::DoCancel
+// ---------------------------------------------------------------------------
+void CDiagInternalMemoryPlugin::DoCancel()
+ {
+ switch ( iState )
+ {
+ case EReading:
+ iFile.ReadCancel(iStatus);
+ break;
+
+ default:
+ // No action needed
+ break;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// From CDiagTestPluginBase
+// CDiagInternalMemoryPlugin::DoRunTestL()
+// ---------------------------------------------------------------------------
+void CDiagInternalMemoryPlugin::DoRunTestL()
+ {
+ TInt aButtonId; // ADO & Platformization Changes
+ iCounter = KDiagInternalMemoryStepsMaxCount;
+ // ADO & Platformization Changes
+
+ ShowMessageQueryL(R_MESSAGEQUERY_TITLE_INTERNALMEMORY,aButtonId);
+
+ if(aButtonId == ECBACmdCancel)
+ {
+ ReportResultToPluginL( CDiagResultsDatabaseItem::ESkipped );
+ return;
+ }
+
+ if(aButtonId == ECBACmdSkip)
+ {
+ TInt confirmResult = 0;
+
+ CAknDialog* dlg = ExecutionParam().Engine().
+ CreateCommonDialogLC( EDiagCommonDialogConfirmSkipAll, NULL );
+
+ if ( !RunWaitingDialogL( dlg, confirmResult ) )
+ {
+ return;
+ }
+
+ if ( confirmResult)
+ {
+ return;
+ }
+ }
+ // Changes Ends
+
+
+ //Start my test
+
+ ShowProgressNoteL();
+
+ SetState( EIdle );
+
+ //check the drive number for internal memory
+ TInt phoneMemoryDriveNum( 0 );
+ // If path length is zero, driveLetterBuf will be empty.
+ TBuf<1> driveLetterBuf = PathInfo::PhoneMemoryRootPath ().Left( 1 );
+
+ TInt errorCode( KErrNotFound );
+ if ( driveLetterBuf.Length() > 0 )
+ {
+ LOGSTRING( "CDiagInternalMemory::DoRunTestL, driveLetterBuf ok" );
+ TChar driveLetter = driveLetterBuf[0];
+ errorCode = RFs::CharToDrive( driveLetter, phoneMemoryDriveNum );
+ }
+ else
+ {
+ LOGSTRING( "CDiagInternalMemory::DoRunTestL, driveLetterBuf empty" );
+ }
+
+ if ( errorCode != KErrNone )
+ {
+ LOGSTRING( "CDiagInternalMemory::DoRunTestL, no drive" );
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ return;
+ }
+
+
+ User::LeaveIfError( iFs.Connect() ); // Connects a client process to the fileserver
+ LOGSTRING( "CDiagInternalMemory::DoRunTestL, iFs connect" );
+ // check disk space
+ if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, iBufw.MaxLength(), phoneMemoryDriveNum ) )
+ {
+ //disk is out of memory
+ LOGSTRING( "CDiagInternalMemory::DoRunTestL, out of memory" );
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ return;
+ }
+
+ //Try to create a temp file for test
+ TFileName filePath;
+ TDriveUnit unit( phoneMemoryDriveNum );
+ errorCode = iFs.CreatePrivatePath( unit );
+
+ if ( ( errorCode != KErrNone ) && ( errorCode != KErrAlreadyExists ) )
+ {
+ LOGSTRING( "CDiagInternalMemory::DoRunTestL, CreatePrivatePath fail" );
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ return;
+ }
+
+ iFs.PrivatePath( filePath );
+ filePath.Insert( 0, unit.Name() );
+
+ errorCode = iFile.Temp( iFs, filePath, iFileName, EFileWrite );
+ LOGSTRING2( "CDiagInternalMemory::DoRunTestL, Temp err = %d", errorCode );
+
+ if ( errorCode != KErrNone )
+ {
+ //Temp file creation failed
+ ReportResultToPluginL( CDiagResultsDatabaseItem::EFailed );
+ return;
+ }
+
+ // Temp file created, start the write test
+
+ iBufw.Zero();
+ iBufw.Copy( KText1 );
+
+ SetState( EWriting );
+
+ iFile.Write( iBufw, iStatus );
+ SetActive();
+
+ //report test progress
+ if ( iCounter > 0 )
+ {
+ iCounter--;
+ ReportTestProgressL( KDiagInternalMemoryStepsMaxCount - iCounter );
+ }
+ }
+
+
+//---------------------------------------------------------------------------
+// CDiagInternalMemoryPlugin::DoStopAndCleanupL
+//---------------------------------------------------------------------------
+void CDiagInternalMemoryPlugin::DoStopAndCleanupL()
+ {
+ switch ( iState )
+ {
+ case EWriting:
+ iFile.Close();
+ iFs.Delete( iFileName ); // delete the file created by Temp
+ iFs.Close();
+ break;
+
+ case EReading:
+ iFile2.Close();
+ iFs.Delete( iFileName ); // delete the file created by Temp
+ iFs.Close();
+ break;
+
+ case EIdle:
+ iFs.Close();
+ break;
+
+ default:
+ ASSERT ( EFalse ); //this should never happen
+ break;
+ }
+
+ if ( iWaitDialog )
+ delete iWaitDialog;
+ idialogOn = EFalse;
+ idialogDismissed = EFalse;
+
+ SetState( EIdle );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CDiagExternalMediaCardPlugin::ShowProgressNoteL
+//
+// Progress Note
+// ----------------------------------------------------------------------------
+
+void CDiagInternalMemoryPlugin::ShowProgressNoteL()
+ {
+ if ( iWaitDialog )
+ {
+ delete iWaitDialog;
+ iWaitDialog = NULL;
+ }
+
+
+ // WAIT NOTE DIALOG
+ iWaitDialog = new (ELeave) CAknWaitDialog(
+ (REINTERPRET_CAST(CEikDialog**, &iWaitDialog)),
+ ETrue);
+
+ iWaitDialog->PrepareLC(R_INTMEM_PLUGIN_WAIT_NOTE);
+ iWaitDialog->SetCallback(this);
+ iWaitDialog->RunLD();
+ idialogOn = ETrue;
+ LOGSTRING("CDiagInternalMemoryPlugin::ShowProgressNoteL()");
+
+ }
+
+//*********************************************************
+// CallBack from AKnWaitDialog when Cancel is pressed
+//*********************************************************
+
+void CDiagInternalMemoryPlugin::DialogDismissedL( TInt aButtonId )
+ {
+ LOGSTRING2("CDiagInternalMemoryPlugin::DialogDismissedL() = %d",aButtonId);
+
+ if (aButtonId == ECBACmdCancel && idialogOn)
+ {
+ // cancel the tests based on which point the dialog is dismissed
+ LOGSTRING2("CDiagInternalMemoryPlugin::DialogDismissed @ iState= %d",iState);
+ if (iState == EReading)
+ iFile.ReadCancel(iStatus);
+
+ iWaitDialog = NULL;
+ idialogOn = EFalse;
+ idialogDismissed = ETrue;
+ }
+ }
+
+void CDiagInternalMemoryPlugin::ReportResultToPluginL(CDiagResultsDatabaseItem::TResult aResult)
+ {
+ // clear the dialogue only if dialog is running.
+ if(idialogOn)
+ iWaitDialog->ProcessFinishedL();
+ LOGSTRING("CDiagInternalMemoryPlugin::ReportResultToPluginL()");
+ CompleteTestL( aResult );
+ }
+
+//---------------------------------------------------------------------------
+// CDiagInternalMemoryPlugin::SetState()
+//---------------------------------------------------------------------------
+void CDiagInternalMemoryPlugin::SetState( TStates aState )
+ {
+ iState = aState;
+ }
+
+
+// ADO & Platformization Changes
+TBool CDiagInternalMemoryPlugin::ShowMessageQueryL( TInt aResourceId, TInt &aButtonId )
+ {
+ LOGSTRING( "CDiagAudioPlugin::ShowMessageQueryL IN" )
+ CAknMessageQueryDialog* dlg = NULL;
+ TBool result = EFalse;
+
+ // Create CAknMessageQueryDialog instance
+ dlg = new ( ELeave ) CAknMessageQueryDialog();
+
+ dlg->PrepareLC( aResourceId );
+
+ CEikButtonGroupContainer& cba = dlg->ButtonGroupContainer();
+
+ switch ( aResourceId )
+ {
+ case R_MESSAGEQUERY_TITLE_INTERNALMEMORY:
+ {
+ if ( SinglePluginExecution() )
+ {
+ cba.SetCommandSetL( R_INT_MEMORY_SOFTKEYS_OK_CANCEL );
+ }
+ else
+ {
+ cba.SetCommandSetL( R_INT_MEMORY_SOFTKEYS_OK_SKIP );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ result = RunWaitingDialogL( dlg, aButtonId );
+
+ LOGSTRING3( "CDiagAudioPlugin::ShowMessageQueryL() OUT aButtonId=%d result=%d", aButtonId, result )
+ return result;
+ }
+
+// End of File