internetradio2.0/cachemgmtsrc/ircachecleanup.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2006-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:  ?Description
*
*/


#include "ircachecleanup.h"
#include "ircachemgmt.h"
#include "irdebug.h"

//Constant decided on the rate of data collection in cache in a high speed connection
/* const TUint KConstantForCleanupFrequency = KCacheLimitSize*90; */
//maximum time interval = 2147483648/KCacheLimitSize
const TUint KIntervalPerByte =2048 ;
//
const TInt KMinCleanupInterval = 2*60*1000000;//2 mins
const TInt KMaxCleanupInterval = 2147483647;//~36 mins for 1MB data

// ---------------------------------------------------------------------------
//Two-phased constructor.
// ---------------------------------------------------------------------------
//
   	CIRCacheCleanup* CIRCacheCleanup::NewL(CIRCacheMgmt& aCacheDb)
   		{
   		IRLOG_DEBUG( "CIRCacheCleanup::NewL - Entering" );
   		CIRCacheCleanup* self = new(ELeave)CIRCacheCleanup(aCacheDb);
   		CleanupStack::PushL(self);
   		self->ConstructL();
   		CleanupStack::Pop(self);
   		IRLOG_DEBUG( "CIRCacheCleanup::NewL - Exiting" );
   		return self;
   		}

// ---------------------------------------------------------------------------
// Destructor.
// ---------------------------------------------------------------------------
//
    CIRCacheCleanup::~CIRCacheCleanup()
    	{
    	IRLOG_DEBUG( "CIRCacheCleanup::~CIRCacheCleanup - Entering" );
    	Cancel();
    	IRLOG_DEBUG( "CIRCacheCleanup::~CIRCacheCleanup - Exiting" );
    	}

// ---------------------------------------------------------------------------
//Default Constructor
// ---------------------------------------------------------------------------
//
    CIRCacheCleanup::CIRCacheCleanup(CIRCacheMgmt& aCacheDb):
    CTimer( CActive::EPriorityLow ), iDatabase( aCacheDb )
    	{
    	IRLOG_DEBUG( "CIRCacheCleanup::CIRCacheCleanup - Entering" );
    	CActiveScheduler::Add( this );
    	IRLOG_DEBUG( "CIRCacheCleanup::CIRCacheCleanup - Exiting" );
    	}

// ---------------------------------------------------------------------------
//Second-phase constructor.
// ---------------------------------------------------------------------------
//
    void CIRCacheCleanup::ConstructL()
    	{
    	IRLOG_DEBUG( "CIRCacheCleanup::ConstructL - Entering" );
    	CTimer::ConstructL(); 	
    	CheckStatusL();
    	IRLOG_DEBUG( "CIRCacheCleanup::ConstructL - Exiting" );
    	}

// ---------------------------------------------------------------------------
//Cleanup CacheDb if necessary
// ---------------------------------------------------------------------------
//
    void CIRCacheCleanup::CleanupCacheDbL()
    	{
    	IRLOG_DEBUG( "CIRCacheCleanup::CleanupCacheDbL - Entering" );
    	iDatabase.CheckSizeL();
    	IRLOG_DEBUG( "CIRCacheCleanup::CleanupCacheDbL - Exiting" );
    	}
    
// ---------------------------------------------------------------------------
//CheckStatus of CacheDb and do cleanup if necessary
// ---------------------------------------------------------------------------
//
    void CIRCacheCleanup::CheckStatusL()
    	{
    	IRLOG_DEBUG( "CIRCacheCleanup::CheckStatusL - Entering" );
    	TTimeIntervalMicroSeconds32  interval(GetCleanupInterval());
    	After(interval);
    	CleanupCacheDbL();
    	IRLOG_DEBUG( "CIRCacheCleanup::CheckStatusL - Exiting" );
    	}
    
// ---------------------------------------------------------------------------
//  CIRCacheCleanup::RunL().
// ---------------------------------------------------------------------------
//
    void CIRCacheCleanup::RunL()
    	{
    	IRLOG_DEBUG( "CIRCacheCleanup::RunL - Entering" );
    	CheckStatusL();
    	IRLOG_DEBUG( "CIRCacheCleanup::RunL - Exiting" );
    	}
    	
// ---------------------------------------------------------------------------
//  CIRCacheCleanup::GetCleanupInterval().
// ---------------------------------------------------------------------------
//
TUint32 CIRCacheCleanup::GetCleanupInterval()
	{
	IRLOG_DEBUG( "CIRCacheCleanup::GetCleanupInterval - Entering" );
	//formula derivation:
	//Timeinterval of cleanup (T) is inversely proportional to the cache size(S)
	//Minimum time interval for cleanup routine 2 min.
	//Maximum time interval for cleanup routine ~35mins.
	//timeintervalperbyte = (35-2)*60*1000000/1024*1024
	//TimeInterval = timeintervalperbyte*(MaxCacheLimit-CurrentCachesize)
	
	TInt interval =KIntervalPerByte * (KCacheLimitSize - iDatabase.CacheSize());
	//keep the value range bound
	interval = Max(interval,KMinCleanupInterval);
	interval = Min(interval,KMaxCleanupInterval);
	IRLOG_DEBUG( "CIRCacheCleanup::GetCleanupInterval - Exiting" );
	return interval;
	}