sysresmonitoring/oodmonitor/oodmonitor2/src/outofdiskmonitor.cpp
changeset 0 2e3d3ce01487
child 17 d440d4c7e9b4
child 28 b0b858956ed5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysresmonitoring/oodmonitor/oodmonitor2/src/outofdiskmonitor.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,469 @@
+/*
+* 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:  Implementation of COutOfDiskMonitor class.
+*
+*/
+
+
+// SYSTEM INCLUDES
+#include <driveinfo.h>
+#include <centralrepository.h>
+
+// USER INCLUDES
+#include "outofdiskmonitor.h"
+#include "outofdisknotifyobserver.h"
+#include "OodTraces.h"
+#include "UiklafInternalCRKeys.h"
+#include "outofdiskpsobserver.h"
+#include "UiklafInternalCRKeys.h"
+
+// CONSTANTS
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+COutOfDiskMonitor* COutOfDiskMonitor::NewL(MShutdownEventObserver& aObserver)
+    { // static
+    TRACES("COutOfDiskMonitor::NewL");
+    COutOfDiskMonitor* self = new(ELeave) COutOfDiskMonitor(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+COutOfDiskMonitor::~COutOfDiskMonitor()
+    {
+    TRACES("COutOfDiskMonitor::~COutOfDiskMonitor");
+    delete iOutOfDiskNotifyObserver;
+    delete iOutOfDiskGlobalNote;    
+    iResourceFile.Close();
+    iFs.Close();
+    for( TInt i = EDriveA; i <= EDriveZ; i++ )
+        {
+            if( iDriveStatus[i].iTimer )
+            {
+            iDriveStatus[i].iTimer->Cancel();
+            delete iDriveStatus[i].iTimer;
+            }
+        }
+
+    TRACES("COutOfDiskMonitor::~COutOfDiskMonitor: End");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+COutOfDiskMonitor::COutOfDiskMonitor(MShutdownEventObserver& aObserver)
+    : CLafShutdownManagerBase(aObserver),
+      iGlobalNotesAllowed(EFalse)
+    {
+    TRACES("COutOfDiskMonitor::COutOfDiskMonitor");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskMonitor::ConstructL()
+    {
+    TRACES("COutOfDiskMonitor::ConstructL"); 
+   
+    TRACES("COutOfDiskMonitor::ConstructL: Connect to FS");
+    User::LeaveIfError(iFs.Connect());
+    
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultPhoneMemory, iDefaultPhoneMemory );
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, iDefaultMassStorage );
+    TRACES2("COutOfDiskMonitor::ConstructL: Default Phone mem %c, default mass mem %c"
+                    ,iDefaultPhoneMemory+'A',iDefaultMassStorage+'A');      
+    
+    iOutOfDiskGlobalNote = COutOfDiskGlobalNote::NewL( this, iFs );
+
+    for( TInt i = EDriveA; i <= EDriveZ; i++ )
+        {
+        SaveDriveStatus(i, DISK_SPACE_OK, ETrue);
+        }
+    
+    iOutOfDiskPSObserver = COutOfDiskPSObserver::NewL( this );
+
+    CRepository* repository( NULL );
+    TInt warningThreshold(0);
+    TInt criticalThreshold(0);
+    TRAPD( err, repository = CRepository::NewL( KCRUidUiklaf ) );
+    if ( err == KErrNone )
+        {
+        err = repository->Get(KUikOODDiskFreeSpaceWarningNoteLevel, warningThreshold);
+        err = repository->Get(KUikOODDiskCriticalThreshold, criticalThreshold);
+        }
+    delete repository;
+    iOODWarningThreshold = warningThreshold;
+    iOODCriticalThreshold = criticalThreshold;
+    
+	TRACES1("COutOfDiskMonitor::ConstructL: Warning threshold: %d percent",iOODWarningThreshold);
+    TRACES1("COutOfDiskMonitor::ConstructL: Critical threshold: %ld bytes",iOODCriticalThreshold);
+    
+    iOutOfDiskNotifyObserver = COutOfDiskNotifyObserver::NewL( this, iFs );
+    TRACES("COutOfDiskMonitor::ConstructL: End");
+    }
+
+// ---------------------------------------------------------
+// 
+// 
+// ---------------------------------------------------------
+//
+void COutOfDiskMonitor::ShowGlobalQueryIfNeededL()
+    {
+    TRACES("COutOfDiskMonitor::ShowGlobalQueryIfNeededL");
+    TInt drive = GetTopPriorityDrive();
+    if (drive != KErrNotFound)
+        {
+        iOutOfDiskGlobalNote->ShowGlobalQueryL(iDriveStatus[drive].iStatus, drive);
+        }
+    TRACES("COutOfDiskMonitor::ShowGlobalQueryIfNeededL: End");
+    }
+    
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt COutOfDiskMonitor::DoStopTimingL( TAny* aParam )
+    {
+    TAfterNoteTimer* p = reinterpret_cast<TAfterNoteTimer*>( aParam );
+    COutOfDiskMonitor* oodm = STATIC_CAST( COutOfDiskMonitor*, p->iOODM ); // cast
+    TBool ret =  oodm->ResetDisplayedStatus(p->iDrive); // call non-static function	
+    if ( ret )
+        {
+        delete p;
+        p = NULL;
+        }
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt COutOfDiskMonitor::GetDriveStatus(TInt aDrive)
+    {
+    TRACES("COutOfDiskMonitor::GetDriveStatus");
+    TInt64 freeSpace(0);
+    TInt state(DISK_SPACE_OK);
+    TVolumeInfo volInfo;
+    TInt ret( iFs.Volume( volInfo, aDrive ) );
+    if ( ret == KErrNone )
+        {
+        freeSpace = volInfo.iFree;
+        TRACES1("COutOfDiskMonitor::GetDriveStatus: Free space: %ld",freeSpace);           
+        }
+    else
+        {
+        TRACES1("COutOfDiskMonitor::GetDriveStatus: End: Returns %d",state);
+        return state;
+        }
+    
+    if (freeSpace < GetThreshold(DISK_SPACE_WARNING, aDrive) && 
+        freeSpace > GetThreshold(DISK_SPACE_CRITICAL, aDrive))
+        {
+        state = DISK_SPACE_WARNING;
+        }    
+    else if (freeSpace <= iOODCriticalThreshold)
+        {
+        state = DISK_SPACE_CRITICAL;
+        }
+    TRACES1("COutOfDiskMonitor::GetDriveStatus: End: Returns %d",state);
+    return state;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt64 COutOfDiskMonitor::GetThreshold(TInt aLevel, TInt aDrive)
+    {
+    TRACES2("COutOfDiskMonitor::GetThreshold(aLevel=%d, aDrive=%d)",aLevel, aDrive);
+    TInt64 threshold(KErrNotFound);
+    if (aLevel == DISK_SPACE_WARNING)
+        {
+		TVolumeInfo volInfo;
+		TInt ret( iFs.Volume( volInfo, aDrive ) );
+        TInt64 volSize(volInfo.iSize);
+        TRACES1("COutOfDiskMonitor::GetThreshold: Volume size: %ld",volSize);		
+		if ( ret == KErrNone )
+			{
+			TRACES1("COutOfDiskMonitor::GetThreshold: Warning threshold: Used disk space %d percent",iOODWarningThreshold);
+			threshold = ((volSize*(100-iOODWarningThreshold))/100);		
+			}
+        }
+    else if (aLevel == DISK_SPACE_CRITICAL)
+        {
+        threshold = iOODCriticalThreshold;
+        }
+    TRACES1("COutOfDiskMonitor::GetThreshold: End: Returns %ld",threshold);
+    return threshold;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskMonitor::SaveDriveStatus(TInt aDrive, TInt aStatus, TBool aReset)
+    {
+    TRACES("COutOfDiskMonitor::SaveDriveStatus");
+    if (aDrive == iDefaultPhoneMemory)
+        {
+        TRACES("COutOfDiskMonitor::SaveDriveStatus: Defult phone mem. Update PS");
+        RProperty::Set( KPSUidUikon, KUikFFSFreeLevel, aStatus );
+        }
+    else if (aDrive == iDefaultMassStorage)
+        {
+        TRACES("COutOfDiskMonitor::SaveDriveStatus: Defult mass mem. Update PS");
+        RProperty::Set( KPSUidUikon, KUikMmcFFSFreeLevel, aStatus );
+        }
+
+    iDriveStatus[aDrive].iStatus = aStatus;		
+    if (aReset)
+        {
+        ResetDisplayedStatus(aDrive);
+        }
+    TRACES3("COutOfDiskMonitor::SaveDriveStatus: End: D: %c, S: %d D: %d",aDrive+'A',aStatus,
+            iDriveStatus[aDrive].iDisplayed);
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TBool COutOfDiskMonitor::ResetDisplayedStatus(TInt aDrive, TBool aResetAll)
+    {
+    TRACES("COutOfDiskMonitor::ResetDisplayedStatus");
+    if (aResetAll)
+        {
+        TRACES("COutOfDiskMonitor::ResetDisplayedStatus: Reset all drives");
+        for( TInt i = EDriveA; i <= EDriveZ; i++ )
+            {
+            if (AllowedToReset(i))
+                {
+                iDriveStatus[i].iDisplayed = NULL;
+                if (iDriveStatus[i].iTimer)
+                    {
+                    delete iDriveStatus[i].iTimer;
+                    iDriveStatus[i].iTimer = NULL;
+                    return ETrue;
+                    }
+                }
+            }
+        }
+    else
+        {
+        TRACES1("COutOfDiskMonitor::ResetDisplayedStatus: Reset drive %c",aDrive+'A');
+        if (AllowedToReset(aDrive))
+            {
+            iDriveStatus[aDrive].iDisplayed = NULL;
+            if (iDriveStatus[aDrive].iTimer)
+                {
+                delete iDriveStatus[aDrive].iTimer;
+                iDriveStatus[aDrive].iTimer = NULL;
+                return ETrue;
+                }
+            }
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TBool COutOfDiskMonitor::AllowedToReset(TInt aDrive)
+    {
+    TInt retVal(ETrue);
+    TNoteInfo noteInfo(iOutOfDiskGlobalNote->GetNoteInfo());
+    TRACES1("COutOfDiskMonitor::AllowedToReset: Drive %c",aDrive+'A');	
+    if ((iOutOfDiskGlobalNote->NoteOnDisplay())&&
+        (noteInfo.iDrive == aDrive))
+        {
+        if (noteInfo.iStatus == iDriveStatus[aDrive].iStatus)
+            {
+            TRACES("COutOfDiskMonitor::AllowedToReset: Same drive with same status already on display");
+            retVal = EFalse;
+            }
+        else if ( noteInfo.iStatus == DISK_SPACE_CRITICAL && iDriveStatus[aDrive].iStatus == DISK_SPACE_WARNING )
+            {
+            TRACES("COutOfDiskMonitor::AllowedToReset: Same drive with worse status already on display");        
+            retVal = EFalse;
+            }
+        }	
+    TRACES1("COutOfDiskMonitor::AllowedToReset: %d",retVal);		
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt COutOfDiskMonitor::GetTopPriorityDrive()
+    {
+    TRACES("COutOfDiskMonitor::GetTopPriorityDrive");
+    // 0 - Critical Default Phone Memory
+    // 1 - Critical Default Mass Storage
+    // 2 - Critical other drives
+    // 3 - Warning Default Phone Memory
+    // 4 - Warning Default Mass Storage
+    // 5 - Warning other drives
+
+    TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: DPM %d, %d",
+        iDriveStatus[iDefaultPhoneMemory].iStatus, 
+        iDriveStatus[iDefaultPhoneMemory].iDisplayed);
+    
+    TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: DMS %d, %d",
+        iDriveStatus[iDefaultMassStorage].iStatus, 
+        iDriveStatus[iDefaultMassStorage].iDisplayed);
+    
+    if (iDriveStatus[iDefaultPhoneMemory].iStatus == DISK_SPACE_CRITICAL &&
+        (iDriveStatus[iDefaultPhoneMemory].iDisplayed == NULL ||
+        iDriveStatus[iDefaultPhoneMemory].iDisplayed == DISK_SPACE_WARNING)) 
+        {
+        TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: Drive %c, status %d"
+                        ,iDefaultPhoneMemory+'A',DISK_SPACE_CRITICAL);            
+        return iDefaultPhoneMemory;
+        }
+    if (iDriveStatus[iDefaultMassStorage].iStatus == DISK_SPACE_CRITICAL &&
+        iDriveStatus[iDefaultMassStorage].iDisplayed == NULL )
+        {
+        TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: Drive %c, status %d"
+                        ,iDefaultMassStorage+'A',DISK_SPACE_CRITICAL);
+        return iDefaultMassStorage;
+        }
+    for( TInt i = EDriveA; i <= EDriveZ; i++ )
+        {
+        if (iDriveStatus[i].iStatus == DISK_SPACE_CRITICAL &&
+            iDriveStatus[i].iDisplayed == NULL )
+            {
+            TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: Drive %c, status %d"
+                        ,i+'A',iDriveStatus[i].iStatus);                
+            return i;
+            }
+        }
+    if (iDriveStatus[iDefaultPhoneMemory].iStatus == DISK_SPACE_WARNING &&
+        iDriveStatus[iDefaultPhoneMemory].iDisplayed == NULL )
+        {
+        TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: Drive %c, status %d"
+                        ,iDefaultPhoneMemory+'A',DISK_SPACE_WARNING);
+        return iDefaultPhoneMemory;
+        }
+    if (iDriveStatus[iDefaultMassStorage].iStatus == DISK_SPACE_WARNING &&
+        iDriveStatus[iDefaultMassStorage].iDisplayed == NULL )
+        {
+        TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: Drive %c, status %d"
+                        ,iDefaultMassStorage+'A',DISK_SPACE_WARNING);
+        return iDefaultMassStorage;
+        }
+    for( TInt i = EDriveA; i <= EDriveZ; i++ )
+        {
+        if (iDriveStatus[i].iStatus == DISK_SPACE_WARNING &&
+            iDriveStatus[i].iDisplayed == NULL )
+            {
+            TRACES2("COutOfDiskMonitor::GetTopPriorityDrive: Drive %c, status %d"
+                        ,i+'A',iDriveStatus[i].iStatus);
+            return i;
+            }
+        }
+	TRACES("COutOfDiskMonitor::GetTopPriorityDrive: return KErrNotFound");
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskMonitor::SetAsDisplayedL(TInt aDrive, TInt aDriveStatus)
+    {
+    TRACES2("COutOfDiskMonitor::SetAsDisplayedL: Drive %d: DriveStatus %d",aDrive, aDriveStatus);
+    iDriveStatus[aDrive].iDisplayed = aDriveStatus;
+    // Don't show notes for same drive on a given time. Show only if state is following cases:
+    // 1) State is going worse
+    // 2) Autolock off
+    // 3) The drive is unmounted and mounted again
+    // 4) Phone is restarted
+    if ( !iDriveStatus[aDrive].iTimer)
+        {
+        TAfterNoteTimer* p = 0;
+        p = new (ELeave) TAfterNoteTimer;
+        p->iOODM = this;
+        p->iDrive = aDrive;
+        iDriveStatus[aDrive].iTimer = CPeriodic::NewL( EPriorityNormal );
+        iDriveStatus[aDrive].iTimer->Start( KDelayAfterNote, KDelayAfterNote, TCallBack( DoStopTimingL, p ) );
+        }
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskMonitor::SetGlobalNotesAllowed(TInt aValue)
+    {
+    TRACES1("COutOfDiskMonitor::SetGlobalNotesAllowed: Value %d",aValue);
+    if (aValue)
+        iGlobalNotesAllowed = ETrue;
+    else
+        iGlobalNotesAllowed = EFalse;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TBool COutOfDiskMonitor::GetGlobalNotesAllowed()
+    {
+    TRACES1("COutOfDiskMonitor::GetGlobalNotesAllowed: Value %d",iGlobalNotesAllowed);
+    return iGlobalNotesAllowed;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt COutOfDiskMonitor::GetDefaultPhoneMemory()
+    {
+    TRACES("COutOfDiskMonitor::GetDefaultPhoneMemory");
+    return iDefaultPhoneMemory;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt COutOfDiskMonitor::GetDefaultMassStorage()
+    {
+    TRACES("COutOfDiskMonitor::GetDefaultMassStorage");
+    return iDefaultMassStorage;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt COutOfDiskMonitor::GetDefaultRomDrive()
+    {
+    TRACES("COutOfDiskMonitor::GetDefaultRomDrive");
+    return iDefaultRomDrive;
+    }
+// End of file.