diff -r 000000000000 -r 3ce708148e4d devicediagnostics/devdiagapp/src/devdiagruntimereqsInfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnostics/devdiagapp/src/devdiagruntimereqsInfo.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,377 @@ +/* +* 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: This is the implementation of the runtime requirements +* information data class. +* +*/ + + +// System Include Files +#include // CAknMessageQueryDialog +#include // CRepository +#include // Debugging Macros +#include // RDiagResultsDatabase +#include +#include // RFs +#include // StringLoader +#include // Resource defintions + +// User Include Files +#include "devdiag.pan" // Panic +#include "devdiagruntimereqsinfo.h" // CDevDiagRuntimeReqsInfo +#include "devdiagprivatecrkeys.h" // CR Key ID Definitions + + + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// Static two-phase constructor. +// --------------------------------------------------------------------------- +// +CDevDiagRuntimeReqsInfo* CDevDiagRuntimeReqsInfo::NewL( RFs& aFs, + RDiagResultsDatabase& aDb, + TCallBack aCallback ) + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::NewL()" ) + + CDevDiagRuntimeReqsInfo* self = new ( ELeave ) CDevDiagRuntimeReqsInfo( aFs, + aDb, + aCallback ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CDevDiagRuntimeReqsInfo::~CDevDiagRuntimeReqsInfo() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::~CDevDiagRuntimeReqsInfo()" ) + + Cancel(); + delete iTelephony; + + } + +// --------------------------------------------------------------------------- +// Begins checking if the diagnostics runtime requirements are satisfied. +// --------------------------------------------------------------------------- +// +void CDevDiagRuntimeReqsInfo::CheckRuntimeRequirementsL( TBool aResumingTests ) + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::CheckRuntimeRequirementsL()" ) + + // If the requirements are already being checked, start over. + if ( iState != EStateInitial ) + { + Cancel(); + } + + iResumingTests = aResumingTests; + + // (Check 1) Check the free disk space. + CheckDiskSpaceL(); + + // (Check 2) Check the battery level. + CheckBatteryLevelL(); + } + +// --------------------------------------------------------------------------- +// Returns the runtime requirements result, which indicates if the runtime +// requirements were satisfied. +// --------------------------------------------------------------------------- +// +CDevDiagRuntimeReqsInfo::TResult CDevDiagRuntimeReqsInfo::Result() const + { + return iResult; + } + +// --------------------------------------------------------------------------- +// Displays the dialog associated with the result of the runtime checks. +// --------------------------------------------------------------------------- +// +TInt CDevDiagRuntimeReqsInfo::DisplayDialogL() const + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::DisplayDialogL()" ) + + // Act on the result. + switch ( iResult ) + { + case EResultErrLowDisk: + return DisplayMessageQueryDialogL( R_DEVDIAG_LOW_DISK_DIALOG ); + + case EResultErrLowBattery: + return DisplayMessageQueryDialogL( R_DEVDIAG_LOW_BATTERY_DIALOG ); + + case EResultOk: + default: + return EAknSoftkeyOk; + } + } + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CDevDiagRuntimeReqsInfo::CDevDiagRuntimeReqsInfo( RFs& aFs, + RDiagResultsDatabase& aDb, + TCallBack aCallback ) +: CActive( EPriorityStandard ), + iFs( aFs ), + iDb( aDb ), + iCallback( aCallback ), + iBatteryInfo(), + iBatteryInfoPackage( iBatteryInfo ) + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::CDevDiagRuntimeReqsInfo()" ) + + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +void CDevDiagRuntimeReqsInfo::ConstructL() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::ConstructL()" ) + + ReadCentralRepositoryValuesL(); + } + +// --------------------------------------------------------------------------- +// Reads the runtime requirements values from the central repository and +// stores them to the object. +// --------------------------------------------------------------------------- +// +void CDevDiagRuntimeReqsInfo::ReadCentralRepositoryValuesL() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::ReadCentralRepositoryValuesL()" ) + + CRepository* repository = CRepository::NewLC( KCRUidDevDiag ); + + // The required battery level. + User::LeaveIfError( repository->Get( KDevDiagAppMinBatteryLevel, + iMinBatteryLevel ) ); + + // The required free disk space. A local TInt is used because the data + // member is a TInt64, but the CR only has a getter function for TInt. + TInt minDiskSpaceRequired; + User::LeaveIfError( repository->Get( KDevDiagAppMinDiskSpace, + minDiskSpaceRequired ) ); + iMinDiskSpaceFree = minDiskSpaceRequired; + + + LOGSTRING3( "CDevDiagRuntimeReqsInfo::ReadCentralRepositoryValuesL() -" + L" iMinBatteryLevel %d, iMinDiskSpaceFree %d", + iMinBatteryLevel, + minDiskSpaceRequired ) + + CleanupStack::PopAndDestroy( repository ); + } + + +// --------------------------------------------------------------------------- +// Checks if there is enough free estimated disk space to log test results. +// --------------------------------------------------------------------------- +// +void CDevDiagRuntimeReqsInfo::CheckDiskSpaceL() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::CheckDiskSpaceL()" ) + + // If the runtime requirements have already failed, this function will + // set us active and complete the request. + if ( CheckCompletion() ) + { + return; + } + + // Set default values for this check. + iDiskSpaceFree = 0; + + // Get the free disk space. + TVolumeInfo volumeData; + User::LeaveIfError( iFs.Volume( volumeData ) ); + iDiskSpaceFree = volumeData.iFree; + + // Check the free disk level. + if ( iDiskSpaceFree < iMinDiskSpaceFree ) + { + iResult = EResultErrLowDisk; + } + + return; + } + +// --------------------------------------------------------------------------- +// Checks if the phone's battery level is adequate to run tests. +// --------------------------------------------------------------------------- +// +void CDevDiagRuntimeReqsInfo::CheckBatteryLevelL() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::CheckBatteryLevelL()" ) + + // If the runtime requirements have already failed, this function will + // set us active and complete the request. + if ( CheckCompletion() ) + { + return; + } + + // Check the battery level. + switch ( iState ) + { + case EStateInitial: + { + iState = EStateCheckingBattery; + + // Issue the asynchronous request. + if ( !iTelephony ) + { + iTelephony = CTelephony::NewL(); + } + + iTelephony->GetBatteryInfo( iStatus, iBatteryInfoPackage ); + SetActive(); + break; + } + + case EStateCheckingBattery: + { + iState = EStateInitial; + + // Check the battery level. + if ( iStatus != KErrNone ) + { + iResult = EResultErrLowBattery; + break; + } + + if ( iBatteryInfo.iChargeLevel < TUint( iMinBatteryLevel ) ) + { + iResult = EResultErrLowBattery; + } + + iBatteryLevel = iBatteryInfo.iChargeLevel; + break; + } + + default: + { + __ASSERT_DEBUG( EFalse, Panic( EDevDiagApplicationRuntimeReqs) ); + iResult = EResultErrLowBattery; + CheckCompletion(); + break; + } + } + } + + +// --------------------------------------------------------------------------- +// This is a utility function to handle the common checking for completion +// of the runtime requirements checks. +// --------------------------------------------------------------------------- +// +TBool CDevDiagRuntimeReqsInfo::CheckCompletion() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::CheckCompletion()" ) + + // If there is already a failed check, complete the asynchronous request + // if it hasn't already been done. + if ( iResult != EResultOk && iState != EStateComplete ) + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::CheckCompletion() - completed" ) + iState = EStateComplete; + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + return ETrue; + } + + if ( iState == EStateComplete ) + { + return ETrue; + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// Utility function to display a message dialog associated with the specified +// resource. +// --------------------------------------------------------------------------- +// +TInt CDevDiagRuntimeReqsInfo::DisplayMessageQueryDialogL( TInt aResource ) + { + LOGSTRING2( "CDevDiagRuntimeReqsInfo::DisplayMessageQueryDialogL( %d )", + aResource ) + CAknMessageQueryDialog* dlg = new ( ELeave ) CAknMessageQueryDialog; + return dlg->ExecuteLD( aResource ); + } + + +// --------------------------------------------------------------------------- +// From CActive. +// This function is called when an active request completes. +// --------------------------------------------------------------------------- +// +void CDevDiagRuntimeReqsInfo::RunL() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::RunL()" ) + + switch ( iState ) + { + case EStateCheckingBattery: + // (Check 1) Check the battery level. + CheckBatteryLevelL(); + + + case EStateComplete: + default: + { + delete iTelephony; + iTelephony = NULL; + // Inform the observer that checking is complete. + iCallback.CallBack(); + } + } + } + +// --------------------------------------------------------------------------- +// From CActive. +// This function is called to cancel any outstanding asynchronous requests. +// --------------------------------------------------------------------------- +// +void CDevDiagRuntimeReqsInfo::DoCancel() + { + LOGSTRING( "CDevDiagRuntimeReqsInfo::DoCancel()" ) + + // Cancel the asynchronous requests. + switch ( iState ) + { + case EStateCheckingBattery: + __ASSERT_DEBUG( iTelephony, Panic( EDevDiagApplicationRuntimeReqs ) ); + iTelephony->CancelAsync( CTelephony::EGetBatteryInfoCancel ); + break; + + default: + break; + } + } + +// End of File