sysstatemgmt/systemstarter/sysmonsrc/timerlist.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstarter/sysmonsrc/timerlist.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,152 @@
+// Copyright (c) 2007-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:
+// timerlist.h
+// 
+//
+
+/**
+ @file
+ @internalComponent 
+*/
+
+#include "timerlist.h"
+#include "../src/SysStartDebug.h"
+
+CTimerList* CTimerList::NewL(TInt aPriority)
+	{
+	CTimerList* self = new(ELeave) CTimerList(aPriority);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CTimerList::CTimerList(TInt aPriority) : CTimer(aPriority)
+	{ 
+	CActiveScheduler::Add(this);		
+	}
+
+CTimerList::~CTimerList()
+	{
+	Cancel();
+	iTimerList.ResetAndDestroy();
+	}
+
+void CTimerList::ConstructL()
+	{
+	CTimer::ConstructL();
+	}
+
+TInt32 CTimerList::AddL(const TTimeIntervalMicroSeconds32& aInterval, const TCallBack& aCallBack)
+	{
+	TTimerInfo* info = new(ELeave) TTimerInfo;
+	
+	info->iCallBack = aCallBack;
+	info->iTime.UniversalTime();
+	info->iTime += TTimeIntervalMicroSeconds32(aInterval);
+	
+	AddL(info);
+	
+	return reinterpret_cast<TInt32>(info);
+	}
+
+TInt32 CTimerList::AddL(const TTime& aTime, const TCallBack& aCallBack)
+	{
+	TTimerInfo* info = new(ELeave) TTimerInfo;
+	
+	info->iCallBack = aCallBack;
+	info->iTime = aTime;
+
+	AddL(info);
+	
+	return reinterpret_cast<TInt32>(info);
+	}
+
+void CTimerList::AddL(const TTimerInfo* aInfo)
+	{
+	TInt64 last = 0;
+	
+	TInt count = iTimerList.Count();
+	if (count > 0)
+		{
+		last = iTimerList[count-1]->iTime.Int64();
+		}
+	
+	TLinearOrder<TTimerInfo> timerSortOrder(CTimerList::TimerSortOrder);
+	
+	iTimerList.InsertInOrderAllowRepeatsL(aInfo, timerSortOrder);
+	
+	// Only reset timer if necessary.
+	count++;
+	if (last != iTimerList[count-1]->iTime.Int64())
+		{
+		// reset timer to the new last-of-the-list
+		Cancel();
+		AtUTC(iTimerList[count-1]->iTime);
+		}
+	}
+	
+void CTimerList::Remove(TInt32 aTimer)
+	{
+	TInt index = iTimerList.FindInAddressOrder(reinterpret_cast<TTimerInfo*>(aTimer));
+	
+	if (index != KErrNotFound)
+		{
+		delete reinterpret_cast<TTimerInfo*>(aTimer);
+		iTimerList.Remove(index);
+		}
+	}
+
+void CTimerList::RunL()
+	{ // Leavescan, this implementation of this method does not leave but further derived implementations may if they choose
+	TTime now;
+
+	now.UniversalTime();
+	
+	TInt count;
+
+	for (count = iTimerList.Count(); 
+		((count > 0) && (iTimerList[count-1]->iTime <= now));
+		count--)
+		{
+		// Always remove from the end of the sorted list
+		
+		iTimerList[count-1]->iCallBack.CallBack();
+		delete iTimerList[count-1];
+		iTimerList.Remove(count-1);
+		};
+		
+	// reschedule to run again at the expiry date of next repository on the list, if any
+	count = iTimerList.Count();
+	if (count > 0)
+		{
+		AtUTC(iTimerList[count-1]->iTime);
+		}
+	}
+
+TInt CTimerList::TimerSortOrder(const TTimerInfo &aInfo1, const TTimerInfo &aInfo2)
+	{
+	return static_cast<TInt>(aInfo2.iTime.Int64() - aInfo1.iTime.Int64());
+	}
+
+#ifdef _DEBUG
+TInt CTimerList::RunError(TInt aError)
+#else
+TInt CTimerList::RunError(TInt /*aError*/)
+#endif
+	{
+	DEBUGPRINT2(_L("CTimerList: RunError called with error=%d"), aError);
+
+	return KErrNone;
+	}