//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: time.hxx // // Contents: Time/date common routines. // // History: 08-Sep-95 EricB Created. // 01-Dec-95 MarkBl Split from util.hxx. // //---------------------------------------------------------------------------- #ifndef __TIME_HXX__ #define __TIME_HXX__ //#include "runobj.hxx" // // Time/date constants // const WORD JOB_MIN_MONTH = 1; const WORD JOB_MAX_MONTH = 12; const WORD JOB_MONTHS_PER_YEAR = JOB_MAX_MONTH ; const WORD JOB_MIN_DAY = 1; const WORD JOB_MAX_DAY = 31; const WORD JOB_DAYS_PER_MONTHMAX = JOB_MAX_DAY; const WORD JOB_MIN_HOUR = 0; const WORD JOB_MAX_HOUR = 23; const WORD JOB_MIN_MINUTE = 0; const WORD JOB_MAX_MINUTE = 59; const WORD JOB_MILLISECONDS_PER_SECOND = 1000; const WORD JOB_MILLISECONDS_PER_MINUTE = 60 * JOB_MILLISECONDS_PER_SECOND; const WORD JOB_MINS_PER_HOUR = 60; const WORD JOB_HOURS_PER_DAY = 24; const WORD JOB_MINS_PER_DAY = JOB_HOURS_PER_DAY * JOB_MINS_PER_HOUR; const WORD JOB_DAYS_PER_WEEK = 7; const DWORD JOB_RGFDAYS_MAX = 0x7fffffff; const WORD JOB_RGFDOW_MAX = 0x7f; const WORD JOB_RGFMONTHS_MAX = 0xfff; const WORD JOB_MONTH_FEBRUARY = 2; const int JOB_TIMEBUF_LEN = 40; const short MAX_INTERVAL_MINUTES = 720; const short MAX_INTERVAL_HOURS = 12; const unsigned long FILETIMES_PER_MILLISECOND = 10000; const DWORD FILETIMES_PER_SECOND = JOB_MILLISECONDS_PER_SECOND * FILETIMES_PER_MILLISECOND; const DWORD FILETIMES_PER_MINUTE = FILETIMES_PER_MILLISECOND * JOB_MILLISECONDS_PER_MINUTE; // // BUGBUG: neither of these are currently working without CRT initialization. // BUG # 37752. // //const __int64 FILETIMES_PER_HOUR = (__int64)FILETIMES_PER_MINUTE // * JOB_MINS_PER_HOUR; //const __int64 FILETIMES_PER_DAY = FILETIMES_PER_HOUR * JOB_HOURS_PER_DAY; // // Logically, this should be MAX_FILETIME = { MAXDWORD, MAXDWORD }; // but CompareFileTime on NT 4 is broken for FILETIMEs larger than the // one below (NT bug 88901). // Also, the FILETIME below is the largest FILETIME accepted by // FileTimeToSystemTime(). // const FILETIME MAX_FILETIME = { MAXULONG, 0x7fffffff }; const BYTE g_rgMonthDays[] = { 0, // make January's index 1 31, // January 28, // February 31, // March 30, // April 31, // May 30, // June 31, // July 31, // August 30, // September 31, // October 30, // November 31 // December }; // // Time/date common routines. // HRESULT MonthDays(WORD wMonth, WORD wYear, WORD *pwDays); BOOL IsLeapYear(WORD wYear); BOOL IsValidDate(WORD wMonth, WORD wDay, WORD wYear); //+---------------------------------------------------------------------------- // // Function: IsFirstDateEarlier // // Synopsis: Compares the date portion of the two params // // Arguments: [pstFirst, pstSecond] - the dates to compare // // Returns: TRUE if the first date is earlier than the second // //----------------------------------------------------------------------------- inline BOOL IsFirstDateEarlier(const SYSTEMTIME * pstFirst, const SYSTEMTIME * pstSecond) { if (pstFirst->wYear > pstSecond->wYear || (pstFirst->wYear == pstSecond->wYear && (pstFirst->wMonth > pstSecond->wMonth || (pstFirst->wMonth == pstSecond->wMonth && pstFirst->wDay >= pstSecond->wDay)))) { return FALSE; } return TRUE; } //+---------------------------------------------------------------------------- // // Function: IsFirstTimeEarlier // // Synopsis: Compares two SYSTEMTIMES // // Arguments: [pstFirst, pstSecond] - the dates to compare // // Returns: TRUE if the first date-time is earlier than the second // //----------------------------------------------------------------------------- inline BOOL IsFirstTimeEarlier(const SYSTEMTIME *pstFirst, const SYSTEMTIME *pstSecond) { FILETIME ftFirst, ftSecond; SystemTimeToFileTime(pstFirst, &ftFirst); SystemTimeToFileTime(pstSecond, &ftSecond); return (CompareFileTime(&ftFirst, &ftSecond) < 0); } //+---------------------------------------------------------------------------- // // Function: IncrementMonth // // Synopsis: increases the SYSTEMTIME month value by one and corrects for // overflow // // Arguments: [pst] - the date to increment // //----------------------------------------------------------------------------- inline void IncrementMonth(LPSYSTEMTIME pst) { if (pst->wMonth < JOB_MONTHS_PER_YEAR) { pst->wMonth++; } else { pst->wMonth = 1; pst->wYear++; } } //+---------------------------------------------------------------------------- // // Function: IncrementDau // // Synopsis: increases the SYSTEMTIME day value by one and corrects for // overflow // // Arguments: [pst] - the date to increment // //----------------------------------------------------------------------------- void IncrementDay(LPSYSTEMTIME pst); #ifdef YANK //+---------------------------------------------------------------------------- // // Gregorian calendar functions // //----------------------------------------------------------------------------- const WORD GREG_MAXMONTH = 12; const WORD GREG_MINMONTH = 1; const WORD JUL_DOW_MONDAY = 0; const WORD JUL_DOW_TUESDAY = 1; const WORD JUL_DOW_WEDNESDAY = 2; const WORD JUL_DOW_THURSDAY = 3; const WORD JUL_DOW_FRIDAY = 4; const WORD JUL_DOW_SATURDAY = 5; const WORD JUL_DOW_SUNDAY = 6; WORD DayOfWeek(long lDayNum); void MakeDate(long lDayNum, WORD *pwMonth, WORD *pwDay, WORD *pwYear); HRESULT MakeJulianDayNumber(WORD wMonth, WORD wDay, WORD wYear, long *plDayNum); // // Forward declaration. // class CTimeList; //+---------------------------------------------------------------------------- // // Time list node class // //----------------------------------------------------------------------------- class CTimeNode : public CDLink { friend CTimeList; public: CTimeNode(LPSYSTEMTIME pst) : m_dwMaxRunTime(MAX_RUN_TIME_DEFAULT) {SystemTimeToFileTime(pst, &m_ft);} CTimeNode(LPFILETIME pft) : m_ft(*pft), m_dwMaxRunTime(MAX_RUN_TIME_DEFAULT) {} CTimeNode(LPFILETIME pft, DWORD MaxRunTime) : m_ft(*pft), m_dwMaxRunTime(MaxRunTime) {} CTimeNode(void) {m_ft.dwLowDateTime = 0; m_ft.dwHighDateTime = 0; m_dwMaxRunTime = RUN_TIME_NO_END;} ~CTimeNode() {} CTimeNode * Next(void) {return((CTimeNode *)CDLink::Next());} CTimeNode * Prev(void) {return((CTimeNode *)CDLink::Prev());} private: }; //+---------------------------------------------------------------------------- // // Time/job list class // //----------------------------------------------------------------------------- class CTimeList { public: CTimeList() : m_ptnHead(NULL) {}; ~CTimeList() {}; HRESULT SetList(SYSTEMTIME rgst[], WORD cList); void Clear(void); void Add(CTimeNode * pte); HRESULT Add(LPSYSTEMTIME pst); HRESULT Add(LPFILETIME pft); HRESULT PeekHeadTime(LPFILETIME pft); CTimeNode * Pop(void); void Merge(CTimeList * ptl); private: CTimeNode * m_ptnHead; }; #endif // YANK #endif // __TIME_HXX__