--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/devdiagapp/src/devdiagruntimereqsInfo.cpp Wed Sep 01 12:31:32 2010 +0100
@@ -0,0 +1,387 @@
+/*
+* 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 <aknmessagequerydialog.h> // CAknMessageQueryDialog
+#include <centralrepository.h> // CRepository
+#include <DiagFrameworkDebug.h> // Debugging Macros
+#include <DiagResultsDatabase.h> // RDiagResultsDatabase
+#include <DiagResultsDatabaseTestRecordInfo.h>
+#include <f32file.h> // RFs
+#include <StringLoader.h> // StringLoader
+#include <devdiagapp.rsg> // 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();
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CDevDiagRuntimeReqsInfo::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CDevDiagRuntimeReqsInfo::RunError( TInt aError )
+ {
+ LOGSTRING2( "CDevDiagRuntimeReqsInfo::RunError( %d )", aError )
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// 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