diff -r 000000000000 -r f979ecb2b13e pimappservices/calendar/shared/src/agmdate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimappservices/calendar/shared/src/agmdate.cpp Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,204 @@ +// Copyright (c) 1997-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: +// + +#include "agmdate.h" +#include "agmtlsproxy.h" +#include "agmtzrules.h" + +const TInt KAgnDateMonthsInAYear = 12; + +EXPORT_C TTime AgnDateTime::MinDate() +/** Gets the minimum date/time allowed for agenda entries as a TTime. + +This value marks the start of the agenda model's valid date range. + +@internalAll +@return The agenda model's minimum date/time. +*/ + { + //Midnight, January 1st 1900 + return (TTime(MAKE_TINT64(0x00D504A2,0xC672E000))); + } + +EXPORT_C TTime AgnDateTime::MaxDate() +/** Gets the maximum date/time allowed for agenda entries as a TTime. + +This value marks the end of the agenda model's valid date range. + +@internalAll +@return The agenda model's maximum date/time. +*/ + { + //Midnight, December 31st 2100 + return (TTime(MAKE_TINT64(0x00eb8d74,0x5a6fc000))); + } + + +void AgnDateTime::AddTo(TDateTime& aDate,TTimeIntervalMonths aMonth) +/** Adds a time interval in months to a date/time. This takes account of the date of the month, which simply +adding the TTimeIntervalMonths would not do. + +@internalAll +@param aDate Reference to a date/time. +@param aMonth The number of months to add to the date/time. +*/ + { + TInt month = aDate.Month() + (aDate.Year()*KAgnDateMonthsInAYear) + aMonth.Int(); + TInt day = aDate.Day(); + TInt year = month / KAgnDateMonthsInAYear; + month %= KAgnDateMonthsInAYear; + TInt daysInMonth = Time::DaysInMonth(year,TMonth(month))-1; + if (day > daysInMonth) + { + day = daysInMonth; + } + aDate.Set(year,TMonth(month),day,aDate.Hour(),aDate.Minute(),aDate.Second(),aDate.MicroSecond()); + } + + + +void AgnDateTime::AddTo(TDateTime& aDate,TTimeIntervalYears aYear) +/** Adds a time interval in years to a date/time. + +@internalAll +@param aDate Reference to a date/time. On return, the date is modified and all +time components are set to zero. +@param aYear The number of years to add to the date/time. +*/ + { + AddTo(aDate,TTimeIntervalMonths(aYear.Int() * KAgnDateMonthsInAYear)); + } + + + +TTimeIntervalMonths AgnDateTime::MonthsFrom(const TDateTime& aStartDate,const TDateTime& aEndDate) +/** Calculates the number of whole months between two date/times. + +@internalAll +@param aStartDate The date to start calculating from. +@param aEndDate The date to calculate to. +@return The number of whole months between the two date/times. +*/ + { + + TInt monthsDifference = (aEndDate.Year()-aStartDate.Year())*12+(aEndDate.Month()-aStartDate.Month()); + + if (aEndDate.Day() < aStartDate.Day()) + { // check relative positions within the month + TInt endDaysInMonth = Time::DaysInMonth(aEndDate.Year(),aEndDate.Month()); + TInt startDaysInMonth = Time::DaysInMonth(aStartDate.Year(),aStartDate.Month()); + if (! ((aEndDate.Day() == (endDaysInMonth-1))&&(aStartDate.Day() == (startDaysInMonth-1)))) + --monthsDifference; + } + return(monthsDifference); + } + + +TTimeIntervalYears AgnDateTime::YearsFrom(const TDateTime& aStartDate,const TDateTime& aEndDate) +/** Calculates the number of whole years between two date/times. + +@internalAll +@param aStartDate The date to start calculating from. +@param aEndDate The date to calculate to. +@return The number of whole years between the two date/times. +*/ + { + + TTimeIntervalMonths mos = MonthsFrom(aStartDate,aEndDate); + TTimeIntervalYears ret = mos.Int() / 12; + return(ret); + } + +TBool AgnDateTime::IsLessThan(const TDateTime& aDateLeft, const TDateTime& aDateRight) +/** Tests whether one TDateTime instance is earlier than another. + +@internalAll +@param aDateLeft First date/time. +@param aDateRight Second date/time. +@return True if the first date/time specified is earlier than the second. False +if it is more recent, or they are the same. +*/ + { + return aDateLeft.Year() < aDateRight.Year() || + (aDateLeft.Year() == aDateRight.Year() && aDateLeft.Month() < aDateRight.Month()) || + (aDateLeft.Year() == aDateRight.Year() && + aDateLeft.Month() == aDateRight.Month() && + aDateLeft.Day() < aDateRight.Day()); + } + +/** Is time between min and max time. */ +EXPORT_C TBool AgnDateTime::IsValidAgendaTTime(const TTime& aDate) + { + return (aDate >= AgnDateTime::MinDate() && aDate <= AgnDateTime::MaxDate()); + } + +/** Fetch a pointer to the fixed time mode converter */ +const MAgnCalendarTimeMode* AgnDateTime::FixedTimeMode() + { + CAgnTlsProxy* proxy = static_cast(Dll::Tls()); + __ASSERT_DEBUG(proxy != NULL, User::Invariant()); + return static_cast(&proxy->FixedTimeMode()); + } + +/** Fetch a pointer to the floating time mode converter */ +const MAgnCalendarTimeMode* AgnDateTime::FloatingTimeMode() + { + + CAgnTlsProxy* proxy = static_cast(Dll::Tls()); + __ASSERT_DEBUG(proxy != NULL, User::Invariant()); + return static_cast(&proxy->FloatingTimeMode()); + } + +/** Convert a time from system local to UTC, without caching the result. */ +EXPORT_C TTime AgnDateTime::ConvertToLocalTimeL(const TTime& aUtcTime) + { + CAgnTlsProxy* proxy = CAgnTlsProxy::CreateL(CAgnTlsProxy::TAgnTlsTzRulesType_None); + CleanupStack::PushL(TCleanupItem(CAgnTlsProxy::Release, proxy)); + TAgnCalendarTime utcTime; + utcTime.SetUtcL(aUtcTime); + TTime ret = utcTime.LocalL(); + CleanupStack::PopAndDestroy(proxy); + return ret; + } + +/** Convert a time from UTC to system local, without caching the result. */ +EXPORT_C TTime AgnDateTime::ConvertToUtcTimeL(const TTime& aLocalTime) + { + CAgnTlsProxy* proxy = CAgnTlsProxy::CreateL(CAgnTlsProxy::TAgnTlsTzRulesType_None); + CleanupStack::PushL(TCleanupItem(CAgnTlsProxy::Release, proxy)); + TAgnCalendarTime utcTime; + utcTime.SetLocalL(aLocalTime); + TTime ret = utcTime.UtcL(); + CleanupStack::PopAndDestroy(proxy); + return ret; + } + +/** This function resets the hours, minutes, seconds and microseconds to 0 +more quickly than using a TDateTime. */ +EXPORT_C TTime AgnDateTime::ResetToMidnight(const TTime& aTime) + { + const TInt64 KMicrosecondsInADay (MAKE_TINT64(0x00000014,0x1DD76000)); + const TInt64 newTime((aTime.Int64() / KMicrosecondsInADay) * KMicrosecondsInADay); + return TTime(newTime); + } + +/** Correctly calculate the number of days between two TTimes. DaysFrom gives unexpected results if the +time of day is different for each TTime. */ +TInt AgnDateTime::DaysBetweenDates(const TTime& aTimeLater, const TTime& aTimeEarlier) + { + TTime later = AgnDateTime::ResetToMidnight(aTimeLater); + TTime earlier = AgnDateTime::ResetToMidnight(aTimeEarlier); + return later.DaysFrom(earlier).Int(); + }