--- /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());
+ }