devicediagnostics/diagplugins/DiagInternalMemoryPlugin/src/diaginternalmemoryplugin.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:40:12 +0200
changeset 0 3ce708148e4d
child 54 9360ca28b668
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* 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;
        }           
    }    


// ---------------------------------------------------------------------------
// 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