sysresmonitoring/oodmonitor/oodmonitor2/src/outofdisknotifyobserver.cpp
changeset 0 2e3d3ce01487
child 70 739cef680932
child 77 b01c07dfcf84
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysresmonitoring/oodmonitor/oodmonitor2/src/outofdisknotifyobserver.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,245 @@
+/*
+* 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 COutOfDiskNotifyObserver class.
+*
+*/
+
+
+// SYSTEM INCLUDES
+#include <driveinfo.h>
+
+// USER INCLUDES
+#include "outofdisknotifyobserver.h"
+#include "UiklafInternalCRKeys.h"
+#include "OodTraces.h"
+
+// CONSTANTS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+COutOfDiskNotifyObserver* COutOfDiskNotifyObserver::NewL(COutOfDiskMonitor* aOutOfDiskMonitor, 
+                                                         RFs& aFs)
+    { // static
+    TRACES("COutOfDiskNotifyObserver::NewL");
+    COutOfDiskNotifyObserver* self = new(ELeave) COutOfDiskNotifyObserver(aOutOfDiskMonitor, aFs);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+COutOfDiskNotifyObserver::~COutOfDiskNotifyObserver()
+    {
+    TRACES("COutOfDiskNotifyObserver::~COutOfDiskNotifyObserver");
+    delete iWait;
+    delete iDiskNotifyHandler;
+    TRACES("COutOfDiskNotifyObserver::~COutOfDiskNotifyObserver: End");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+COutOfDiskNotifyObserver::COutOfDiskNotifyObserver(COutOfDiskMonitor* aOutOfDiskMonitor, 
+                                                   RFs& aFs) :
+    iFs(aFs),
+    iOutOfDiskMonitor( aOutOfDiskMonitor ),
+    iCritical2OK(EFalse)
+    {
+    TRACES("COutOfDiskNotifyObserver::COutOfDiskNotifyObserver");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskNotifyObserver::ConstructL()
+    {
+    TRACES("COutOfDiskNotifyObserver::ConstructL");
+
+    TRACES("COutOfDiskNotifyObserver::ConstructL: Create ActiveScheduler");
+    iWait = new ( ELeave )CActiveSchedulerWait;
+    TRACES("COutOfDiskNotifyObserver::ConstructL: Create iDiskNotifyHandler");
+    iDiskNotifyHandler = CDiskNotifyHandler::NewL( *this, iFs );
+
+    // Start listening disk events first
+    TInt status = iDiskNotifyHandler->NotifyDisk();
+    TRACES1("COutOfDiskNotifyObserver::ConstructL: NotifyDisk status %d",status);
+    
+    TRACES("COutOfDiskNotifyObserver::ConstructL: Get list of already mounted drives");
+    TDriveList driveListInt;
+    TInt driveCountInt(0);
+    User::LeaveIfError(DriveInfo::GetUserVisibleDrives(
+           iFs, driveListInt, driveCountInt, KDriveAttInternal | KDriveAttRemovable )); // Get already inserted internal and removable drives
+    for( TInt i = EDriveA; i <= EDriveZ; i++ )
+        {
+        if (driveListInt[i])
+            {
+            TRACES("COutOfDiskNotifyObserver::ConstructL: Add disk +++++++++++++++++++++++++++++");
+            DiskAddedL(i);
+            TRACES("COutOfDiskNotifyObserver::ConstructL: Disk added ---------------------------");
+            }            
+        }
+
+    iWait->Start();    
+    TRACES("COutOfDiskNotifyObserver::ConstructL: End");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskNotifyObserver::NotifyDiskSpace(TInt64 aWarningThreshold, TInt64 aCriticalThreshold,
+                                               TInt aDrive)
+    {
+    TRACES("COutOfDiskNotifyObserver::NotifyDiskSpace");
+    TRACES1("COutOfDiskNotifyObserver::NotifyDiskSpace: Drive %c",aDrive+'A');
+
+    TRACES1("COutOfDiskNotifyObserver::NotifyDiskSpace: WarningThreshold            %ld",aWarningThreshold);
+    TRACES1("COutOfDiskNotifyObserver::NotifyDiskSpace: CriticalThreshold           %ld",aCriticalThreshold);
+    
+    iDiskNotifyHandler->NotifyDiskSpace(aWarningThreshold, aDrive);
+    iDiskNotifyHandler->NotifyDiskSpace(aCriticalThreshold, aDrive);
+    TRACES("COutOfDiskNotifyObserver::NotifyDiskSpace: End");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskNotifyObserver::DiskAddedL(TInt aDrive)
+    {
+    TRACES1("COutOfDiskNotifyObserver::DiskAddedL: Drive %c",aDrive+'A');
+
+    TUint driveStatus(0);
+    if ( DriveInfo::GetDriveStatus( iFs, aDrive, driveStatus ) == KErrNone )
+        {
+        if (driveStatus & DriveInfo::EDriveRemote)
+            {
+            TRACES("COutOfDiskNotifyObserver::DiskAddedL: Do not monitor remote drives");
+            return;
+            }
+        }
+
+	TInt64 warningThreshold = iOutOfDiskMonitor->GetThreshold(DISK_SPACE_WARNING, aDrive);
+	TInt64 criticalThreshold = iOutOfDiskMonitor->GetThreshold(DISK_SPACE_CRITICAL, aDrive);
+	TRACES1("COutOfDiskNotifyObserver::DiskAddedL: Warning Threshold: %ld",warningThreshold);
+	TRACES1("COutOfDiskNotifyObserver::DiskAddedL: Critical Threshold: %ld",criticalThreshold);
+	
+	if (warningThreshold <= 0 || criticalThreshold <= 0)
+		{
+        TRACES("COutOfDiskNotifyObserver::DiskAddedL: Cannot get threshold of the drive");
+	    return;		
+		}
+	
+    TInt status = iOutOfDiskMonitor->GetDriveStatus(aDrive);
+    iOutOfDiskMonitor->SaveDriveStatus(aDrive, status, ETrue);
+    iOutOfDiskMonitor->ShowGlobalQueryIfNeededL();
+    NotifyDiskSpace(warningThreshold, 
+                    criticalThreshold, 
+                    aDrive);
+    TRACES("COutOfDiskNotifyObserver::DiskAddedL: End");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskNotifyObserver::HandleNotifyDisk(
+        TInt /*aError*/, const TDiskEvent& aEvent )
+    {
+    TRACES("COutOfDiskNotifyObserver::HandleNotifyDisk +++++++++++++++++++++++++++++");
+    TRACES1("COutOfDiskNotifyObserver::HandleNotifyDisk: Drive %c:",aEvent.iDrive+'A');
+
+    switch(aEvent.iType)
+        {
+        case EDiskAdded:
+            TRACES("COutOfDiskNotifyObserver::HandleNotifyDisk: EDiskAdded");
+            TRAP_IGNORE( DiskAddedL(aEvent.iDrive) );
+            break;
+        case EDiskError:
+        case EDiskRemoved:
+            TRACES("COutOfDiskNotifyObserver::HandleNotifyDisk: EDiskRemoved");
+            iDiskNotifyHandler->CancelNotifyDiskSpace(aEvent.iDrive);
+            break;
+        case EDiskStatusChanged:
+            TRACES("COutOfDiskNotifyObserver::HandleNotifyDisk: EDiskStatusChanged");
+            TVolumeInfo volInfo;
+            TInt ret( iFs.Volume( volInfo, aEvent.iDrive ) );
+            TRACES1("COutOfDiskMonitor::HandleNotifyDisk: Free space: %d",volInfo.iFree);
+            if (volInfo.iFree >= 0)
+                {
+                TRACES("COutOfDiskNotifyObserver::HandleNotifyDisk: Added");
+                TRAP_IGNORE( DiskAddedL(aEvent.iDrive) );
+                }
+            else
+                {
+                TRACES("COutOfDiskNotifyObserver::HandleNotifyDisk: Removed");
+                iDiskNotifyHandler->CancelNotifyDiskSpace(aEvent.iDrive);
+                iOutOfDiskMonitor->SaveDriveStatus(aEvent.iDrive, DISK_SPACE_OK, ETrue);
+                TRAP_IGNORE( iOutOfDiskMonitor->ShowGlobalQueryIfNeededL() );
+                }
+            break;
+        }
+    TRACES("COutOfDiskNotifyObserver::HandleNotifyDisk: End ------------------------------ ");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskNotifyObserver::HandleNotifyDismount(
+        TInt /*aError*/, const TDismountEvent& aEvent )
+    {
+    TRACES("COutOfDiskNotifyObserver::HandleNotifyDismount +++++++++++++++++++++++++++++");
+    iDiskNotifyHandler->CancelNotifyDiskSpace(aEvent.iDrive);
+    TRACES("COutOfDiskNotifyObserver::HandleNotifyDismount: End ------------------------------ ");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskNotifyObserver::HandleNotifyDiskSpace(
+        TInt /*aError*/, const TDiskSpaceEvent& aEvent )
+    {
+    TRACES("COutOfDiskNotifyObserver::HandleNotifyDiskSpace +++++++++++++++++++++++++++++");
+    TRACES1("COutOfDiskNotifyObserver::HandleNotifyDiskSpace: Drive %c:",aEvent.iDrive+'A');
+    TRACES1("COutOfDiskNotifyObserver::HandleNotifyDiskSpace: Threshold: %ld",aEvent.iThreshold);
+
+    iOutOfDiskMonitor->SaveDriveStatus(aEvent.iDrive, 
+            iOutOfDiskMonitor->GetDriveStatus(aEvent.iDrive));
+    TRAP_IGNORE( iOutOfDiskMonitor->ShowGlobalQueryIfNeededL() );
+    
+    TRACES("COutOfDiskNotifyObserver::HandleNotifyDismount: End ------------------------------ ");
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void COutOfDiskNotifyObserver::HandleNotifyEntry(
+        TInt /*aError*/, const TEntryEvent& /*aEvent*/ )
+    {
+    TRACES("COutOfDiskNotifyObserver::HandleNotifyEntry");
+    }
+// End of file.