devicediagnostics/devdiagapp/src/devdiagruntimereqsInfo.cpp
changeset 0 3ce708148e4d
child 54 9360ca28b668
--- /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 <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();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 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