From a36621099899c80cf07b6b6cb59073b61cecc3f6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 7 Jan 2005 12:58:46 +0000 Subject: [PATCH] RtlCutoverTimeToSystemTime(): The 4th argument determines whether the cutover time of the current year or the next cutover time is calculated. svn path=/trunk/; revision=12864 --- reactos/include/ntos/rtl.h | 6 +-- reactos/lib/rtl/time.c | 88 ++++++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/reactos/include/ntos/rtl.h b/reactos/include/ntos/rtl.h index c800fcd47df..b4fc9c4d9f6 100755 --- a/reactos/include/ntos/rtl.h +++ b/reactos/include/ntos/rtl.h @@ -112,7 +112,7 @@ static __inline VOID InsertHeadList( IN PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry) -{ +{ PLIST_ENTRY OldFlink; OldFlink = ListHead->Flink; Entry->Flink = OldFlink; @@ -140,7 +140,7 @@ static __inline VOID InsertTailList( IN PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry) -{ +{ PLIST_ENTRY OldBlink; OldBlink = ListHead->Blink; Entry->Flink = ListHead; @@ -882,7 +882,7 @@ BOOLEAN STDCALL RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields, OUT PLARGE_INTEGER SystemTime, IN PLARGE_INTEGER CurrentTime, - IN ULONG Unknown); + IN BOOLEAN ThisYearsCutoverOnly); NTSTATUS STDCALL RtlDecompressBuffer(IN USHORT CompressionFormat, diff --git a/reactos/lib/rtl/time.c b/reactos/lib/rtl/time.c index b84b1467de1..3e5d54364d8 100644 --- a/reactos/lib/rtl/time.c +++ b/reactos/lib/rtl/time.c @@ -74,7 +74,7 @@ BOOLEAN STDCALL RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields, OUT PLARGE_INTEGER SystemTime, IN PLARGE_INTEGER CurrentTime, - IN ULONG Unknown) + IN BOOLEAN ThisYearsCutoverOnly) { TIME_FIELDS AdjustedTimeFields; TIME_FIELDS CurrentTimeFields; @@ -82,6 +82,7 @@ RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields, LARGE_INTEGER CutoverSystemTime; CSHORT MonthLength; CSHORT Days; + BOOLEAN NextYearsCutover = FALSE; /* Check fixed cutover time */ if (CutoverTimeFields->Year != 0) @@ -105,45 +106,60 @@ RtlCutoverTimeToSystemTime(IN PTIME_FIELDS CutoverTimeFields, RtlTimeToTimeFields(CurrentTime, &CurrentTimeFields); - /* Compute the cutover time of the first day of the current month */ - AdjustedTimeFields.Year = CurrentTimeFields.Year; - AdjustedTimeFields.Month = CutoverTimeFields->Month; - AdjustedTimeFields.Day = 1; - AdjustedTimeFields.Hour = CutoverTimeFields->Hour; - AdjustedTimeFields.Minute = CutoverTimeFields->Minute; - AdjustedTimeFields.Second = CutoverTimeFields->Second; - AdjustedTimeFields.Milliseconds = CutoverTimeFields->Milliseconds; - - if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime)) - return FALSE; - - RtlTimeToTimeFields(&CutoverSystemTime, &CutoverSystemTimeFields); - - /* Adjust day to first matching weekday */ - if (CutoverSystemTimeFields.Weekday != CutoverTimeFields->Weekday) + while (TRUE) { - if (CutoverSystemTimeFields.Weekday < CutoverTimeFields->Weekday) - Days = CutoverTimeFields->Weekday - CutoverSystemTimeFields.Weekday; - else - Days = DAYSPERWEEK - (CutoverSystemTimeFields.Weekday - CutoverTimeFields->Weekday); + /* Compute the cutover time of the first day of the current month */ + AdjustedTimeFields.Year = CurrentTimeFields.Year; + if (NextYearsCutover == TRUE) + AdjustedTimeFields.Year++; - AdjustedTimeFields.Day += Days; + AdjustedTimeFields.Month = CutoverTimeFields->Month; + AdjustedTimeFields.Day = 1; + AdjustedTimeFields.Hour = CutoverTimeFields->Hour; + AdjustedTimeFields.Minute = CutoverTimeFields->Minute; + AdjustedTimeFields.Second = CutoverTimeFields->Second; + AdjustedTimeFields.Milliseconds = CutoverTimeFields->Milliseconds; + + if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime)) + return FALSE; + + RtlTimeToTimeFields(&CutoverSystemTime, &CutoverSystemTimeFields); + + /* Adjust day to first matching weekday */ + if (CutoverSystemTimeFields.Weekday != CutoverTimeFields->Weekday) + { + if (CutoverSystemTimeFields.Weekday < CutoverTimeFields->Weekday) + Days = CutoverTimeFields->Weekday - CutoverSystemTimeFields.Weekday; + else + Days = DAYSPERWEEK - (CutoverSystemTimeFields.Weekday - CutoverTimeFields->Weekday); + + AdjustedTimeFields.Day += Days; + } + + /* Adjust the number of weeks */ + if (CutoverTimeFields->Day > 1) + { + Days = DAYSPERWEEK * (CutoverTimeFields->Day - 1); + MonthLength = MonthLengths[IsLeapYear(AdjustedTimeFields.Year)][AdjustedTimeFields.Month - 1]; + if ((AdjustedTimeFields.Day + Days) > MonthLength) + Days -= DAYSPERWEEK; + + AdjustedTimeFields.Day += Days; + } + + if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime)) + return FALSE; + + if (ThisYearsCutoverOnly == TRUE || + NextYearsCutover == TRUE || + CutoverSystemTime.QuadPart >= CurrentTime->QuadPart) + { + break; + } + + NextYearsCutover = TRUE; } - /* Adjust the number of weeks */ - if (CutoverTimeFields->Day > 1) - { - Days = DAYSPERWEEK * (CutoverTimeFields->Day - 1); - MonthLength = MonthLengths[IsLeapYear(AdjustedTimeFields.Year)][AdjustedTimeFields.Month - 1]; - if ((AdjustedTimeFields.Day + Days) > MonthLength) - Days -= DAYSPERWEEK; - - AdjustedTimeFields.Day += Days; - } - - if (!RtlTimeFieldsToTime(&AdjustedTimeFields, &CutoverSystemTime)) - return FALSE; - SystemTime->QuadPart = CutoverSystemTime.QuadPart; return TRUE;