genericservices/taskscheduler/SCHSVR/SCHENTRY.CPP
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericservices/taskscheduler/SCHSVR/SCHENTRY.CPP	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,182 @@
+// Copyright (c) 2004-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:
+//
+
+// User includes
+#include "SCHENTRY.H"
+#include "SchLogger.h"
+
+//	
+NONSHARABLE_CLASS(TScheduleEntryHourly) : public TScheduleEntry
+	{
+public:
+	TScheduleEntryHourly(TScheduleEntryInfo2& aInfo);
+	void CalculateNextPossibleRunDate(TTime& aTime) const;
+	};
+
+NONSHARABLE_CLASS(TScheduleEntryDaily) : public TScheduleEntry
+	{
+public:
+	TScheduleEntryDaily(TScheduleEntryInfo2& aInfo);
+	void CalculateNextPossibleRunDate(TTime& aTime) const;
+	};
+
+NONSHARABLE_CLASS(TScheduleEntryMonthly) : public TScheduleEntry
+	{
+public:
+	TScheduleEntryMonthly(TScheduleEntryInfo2& aInfo);
+	void CalculateNextPossibleRunDate(TTime& aTime) const;
+	};
+
+NONSHARABLE_CLASS(TScheduleEntryYearly) : public TScheduleEntry
+	{
+public:
+	TScheduleEntryYearly(TScheduleEntryInfo2& aInfo);
+	void CalculateNextPossibleRunDate(TTime& aTime) const;
+	};
+//	
+
+TScheduleEntry* ScheduleEntryFactory::CreateL(TScheduleEntryInfo2& aInfo)
+	{
+	switch (aInfo.IntervalType())
+		{
+		case EHourly:
+			{
+			return new(ELeave) TScheduleEntryHourly(aInfo);
+			}
+		case EDaily:
+			{
+			return new(ELeave) TScheduleEntryDaily(aInfo);
+			}
+		case EMonthly:
+			{
+			return new(ELeave) TScheduleEntryMonthly(aInfo);
+			}
+		case EYearly:
+			{
+			return new(ELeave) TScheduleEntryYearly(aInfo);
+			}
+		}
+	User::Leave(KErrArgument);
+	return NULL;//never gets to here!!
+	}
+
+//	
+//TScheduleEntry (generic code)
+TScheduleEntry::TScheduleEntry(TScheduleEntryInfo2& aInfo)
+:	iEntryInfo(aInfo)
+	{
+	TTsTime time;
+	time.SetUtcTime(Time::MaxTTime());
+	iDueTime = time;
+	}
+
+const TTsTime& TScheduleEntry::DueTime() const
+	{
+	return iDueTime;
+	}
+
+TInt TScheduleEntry::Offset()
+	{
+	return (_FOFF(TScheduleEntry, iLink));
+	}
+
+const TScheduleEntryInfo2& TScheduleEntry::Info() const
+	{
+	return iEntryInfo;
+	}
+/**
+returns the next due time for this schedule entry.  aTime is the minimum time
+for which this due time should be.*/
+const TTsTime& TScheduleEntry::NextScheduledTime(const TTsTime& aTime)
+	{
+	// update start time in case of any timezone/DST changes
+	// do this before calculating next scheduled time so that it is taken into
+	// account in the calculation
+	iEntryInfo.ProcessOffsetEvent();
+	
+	// if start time = max time then algorithm below doesnt work
+	// so we need to jump out of it here.
+	if (iEntryInfo.StartTime().GetUtcTime() == Time::MaxTTime() 
+		|| iEntryInfo.StartTime().GetLocalTime() == Time::MaxTTime() 
+		|| aTime.GetUtcTime() < (iEntryInfo.StartTime().GetUtcTime() + iEntryInfo.ValidityPeriod())) 
+		iDueTime = iEntryInfo.StartTime();
+	else
+		{
+		// Work out when this schedule entry can next run, by adding interval steps
+		// Due times should be UTC based or local time based, 
+		// in accordance with the start time set by the user
+		TTime nextDueTime;
+
+		if (iEntryInfo.StartTime().IsUtc())
+			{
+			nextDueTime = iEntryInfo.StartTime().GetUtcTime();
+			while (aTime.GetUtcTime() > (nextDueTime + iEntryInfo.ValidityPeriod()))	
+				CalculateNextPossibleRunDate(nextDueTime);
+			
+			iDueTime.SetUtcTime(nextDueTime);
+			}
+		else	//is hometime based
+			{
+			nextDueTime = iEntryInfo.StartTime().GetLocalTime();
+			while (aTime.GetLocalTime() > (nextDueTime + iEntryInfo.ValidityPeriod()))	
+				CalculateNextPossibleRunDate(nextDueTime);
+			
+			iDueTime.SetLocalTime(nextDueTime);
+			}
+		}
+	return iDueTime;	
+	}
+
+
+//subclass-specific code...
+TScheduleEntryHourly::TScheduleEntryHourly(TScheduleEntryInfo2& aInfo)
+			:TScheduleEntry(aInfo)
+	{
+	}
+
+void TScheduleEntryHourly::CalculateNextPossibleRunDate(TTime& aTime) const
+	{
+	aTime+=TTimeIntervalHours(Info().Interval());
+	}
+
+TScheduleEntryDaily::TScheduleEntryDaily(TScheduleEntryInfo2& aInfo)
+			:TScheduleEntry(aInfo)
+	{
+	}
+
+void TScheduleEntryDaily::CalculateNextPossibleRunDate(TTime& aTime) const
+	{
+	aTime+=TTimeIntervalDays(Info().Interval());
+	}
+
+TScheduleEntryMonthly::TScheduleEntryMonthly(TScheduleEntryInfo2& aInfo)
+			:TScheduleEntry(aInfo)
+	{
+	}
+
+void TScheduleEntryMonthly::CalculateNextPossibleRunDate(TTime& aTime) const
+	{
+	aTime+=TTimeIntervalMonths(Info().Interval());
+	}
+
+TScheduleEntryYearly::TScheduleEntryYearly(TScheduleEntryInfo2& aInfo)
+			:TScheduleEntry(aInfo)
+	{
+	}
+
+void TScheduleEntryYearly::CalculateNextPossibleRunDate(TTime& aTime) const
+	{
+	aTime+=TTimeIntervalYears(Info().Interval());
+	}