idlehomescreen/xmluirendering/uiengine/src/xnoomsyshandler.cpp
changeset 0 f72a12da539e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnoomsyshandler.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,174 @@
+/*
+* Copyright (c) 2009 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:
+* Helper system for handling Out-Of-Memory cases.
+*
+*/
+
+// System includes
+#include <hal.h>
+#include <e32std.h>
+#include <e32cmn.h> 
+#include <aknnotewrappers.h>
+#include <e32svr.h> 
+#include <StringLoader.h> 
+#include <xnuiengine.rsg>
+
+// User includes
+#include "xnoomsyshandler.h"
+#include "xnpanic.h"
+
+//Constants
+const TInt64 KMinInterval = 5000000;    // 5 seconds
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CXnOomSysHandler* CXnOomSysHandler::NewL()
+    {
+    CXnOomSysHandler* self = new ( ELeave ) CXnOomSysHandler();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;    
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CXnOomSysHandler::~CXnOomSysHandler()
+    {
+    delete iMsg;
+    iMsg = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// Checks if required amount of memory is available on heap
+// -----------------------------------------------------------------------------
+//
+TBool CXnOomSysHandler::HeapAvailable( TInt aAmount )
+    {
+    if( aAmount == EMinNotDef )
+        {
+        aAmount = EMem512kB;
+        }
+
+    // Gather needed data...
+        
+    // Space already allocated.
+    TInt allocated;
+    User::Heap().AllocSize( allocated );    
+    
+    // Max space for heap. Heap can extend only up to this value.
+    const TInt heapMax = User::Heap().MaxLength(); 
+    
+    // Available memory in heap's current state.
+    TInt obsolete = 0;
+    const TInt availableHeap = User::Heap().Available( obsolete );
+    
+    // Current heap size.
+    const TInt heapSize = allocated + availableHeap;
+    
+    // Heap extension requirement. Can be negative.
+    const TInt extensionRequirement = aAmount - availableHeap;
+    
+    // Max. heap extension possible limited by heap max.
+    const TInt heapExtensionMax = heapMax - heapSize;
+    
+    // System free ram.
+    TInt ramFree = 0;
+    HAL::Get( HALData::EMemoryRAMFree, ramFree );
+    
+    // Checking...
+    
+    // Fits into current heap allocation.
+    if( availableHeap >= aAmount )
+        {
+        return ETrue;
+        }
+    
+    // Fits if current heap extends. heap size and therefore
+    // it's possibilities to extend is limited by max heap
+    // size and by available system memory.     
+    if( ( heapExtensionMax ) >= extensionRequirement &&
+        ( ramFree >= extensionRequirement ) )
+        {
+        return ETrue;
+        }   
+    
+    // Does not fit.
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// Handle potential OOM failure.
+// -----------------------------------------------------------------------------
+//
+void CXnOomSysHandler::HandlePotentialOomL()
+    {
+    if( AllowDialog() )
+        {
+        CAknErrorNote* dialog = new (ELeave) CAknErrorNote();
+        dialog->ExecuteLD( *iMsg );
+        dialog = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CXnOomSysHandler::ConstructL()
+    {
+    iMsg = StringLoader::LoadL( R_QTN_HS_HS_MEMORY_FULL );    
+    }
+
+// ---------------------------------------------------------------------------
+// C++ constructor.
+// ---------------------------------------------------------------------------
+//
+CXnOomSysHandler::CXnOomSysHandler()
+    {    
+    iPreviousDialogPopupTime = 0;
+    }
+
+//------------------------------------------------------------------------------
+// Check whether OOM dialog can be shown.
+// Prevents OOM dialogs popping up more often than
+// defined in KMinInterval.
+// -----------------------------------------------------------------------------
+//
+TBool CXnOomSysHandler::AllowDialog()
+    {          
+    TTime now;
+    now.HomeTime();
+    
+    TTimeIntervalMicroSeconds interval
+        = now.MicroSecondsFrom( iPreviousDialogPopupTime ); 
+    
+    if( iPreviousDialogPopupTime == 0 ||    // Not set yet.
+        interval.Int64() >= KMinInterval )  // Proper interval passed.
+        {        
+        iPreviousDialogPopupTime = now.Int64();
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }