Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

385 lines
9.9 KiB

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include <urlint.h>
#include <map_kv.h>
#include "coll.hxx"
#include "ctime.hxx"
/*
#include "stdafx.h"
#ifdef AFX_AUX_SEG
#pragma code_seg(AFX_AUX_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
*/
/////////////////////////////////////////////////////////////////////////////
// CTime - absolute time
CTime::CTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, int nDST)
{
struct tm atm;
atm.tm_sec = nSec;
atm.tm_min = nMin;
atm.tm_hour = nHour;
ASSERT(nDay >= 1 && nDay <= 31);
atm.tm_mday = nDay;
ASSERT(nMonth >= 1 && nMonth <= 12);
atm.tm_mon = nMonth - 1; // tm_mon is 0 based
ASSERT(nYear >= 1900);
atm.tm_year = nYear - 1900; // tm_year is 1900 based
atm.tm_isdst = nDST;
m_time = mktime(&atm);
ASSERT(m_time != -1); // indicates an illegal input time
}
CTime::CTime(WORD wDosDate, WORD wDosTime, int nDST)
{
struct tm atm;
atm.tm_sec = (wDosTime & ~0xFFE0) << 1;
atm.tm_min = (wDosTime & ~0xF800) >> 5;
atm.tm_hour = wDosTime >> 11;
atm.tm_mday = wDosDate & ~0xFFE0;
atm.tm_mon = ((wDosDate & ~0xFE00) >> 5) - 1;
atm.tm_year = (wDosDate >> 9) + 80;
atm.tm_isdst = nDST;
m_time = mktime(&atm);
ASSERT(m_time != -1); // indicates an illegal input time
}
CTime::CTime(const SYSTEMTIME& sysTime, int nDST)
{
if (sysTime.wYear < 1900)
{
time_t time0 = 0L;
CTime timeT(time0);
*this = timeT;
}
else
{
CTime timeT(
(int)sysTime.wYear, (int)sysTime.wMonth, (int)sysTime.wDay,
(int)sysTime.wHour, (int)sysTime.wMinute, (int)sysTime.wSecond,
nDST);
*this = timeT;
}
}
CTime::CTime(const FILETIME& fileTime, int nDST)
{
// first convert file time (UTC time) to local time
FILETIME localTime;
if (!FileTimeToLocalFileTime(&fileTime, &localTime))
{
m_time = 0;
return;
}
// then convert that time to system time
SYSTEMTIME sysTime;
if (!FileTimeToSystemTime(&localTime, &sysTime))
{
m_time = 0;
return;
}
// then convert the system time to a time_t (C-runtime local time)
CTime timeT(sysTime, nDST);
*this = timeT;
}
CTime PASCAL CTime::GetCurrentTime()
// return the current system time
{
return CTime(::time(NULL));
}
struct tm* CTime::GetGmtTm(struct tm* ptm) const
{
if (ptm != NULL)
{
*ptm = *gmtime(&m_time);
return ptm;
}
else
return gmtime(&m_time);
}
struct tm* CTime::GetLocalTm(struct tm* ptm) const
{
if (ptm != NULL)
{
struct tm* ptmTemp = localtime(&m_time);
if (ptmTemp == NULL)
return NULL; // indicates the m_time was not initialized!
*ptm = *ptmTemp;
return ptm;
}
else
return localtime(&m_time);
}
#ifdef _DEBUG
CDumpContext& AFXAPI operator <<(CDumpContext& dc, CTime time)
{
char* psz = ctime(&time.m_time);
if ((psz == NULL) || (time.m_time == 0))
return dc << "CTime(invalid #" << time.m_time << ")";
// format it
psz[24] = '\0'; // nuke newline
return dc << "CTime(\"" << psz << "\")";
}
#endif
CArchive& AFXAPI operator <<(CArchive& ar, CTime time)
{
//return ar << (DWORD) time.m_time;
ASSERT(FALSE);
return ar;
}
CArchive& AFXAPI operator >>(CArchive& ar, CTime& rtime)
{
//return ar >> (DWORD&) rtime.m_time;
ASSERT(FALSE);
return ar;
}
/////////////////////////////////////////////////////////////////////////////
// CTimeSpan - relative time
#ifdef _DEBUG
CDumpContext& AFXAPI operator <<(CDumpContext& dc, CTimeSpan timeSpan)
{
return dc << "CTimeSpan(" << timeSpan.GetDays() << " days, " <<
timeSpan.GetHours() << " hours, " <<
timeSpan.GetMinutes() << " minutes and " <<
timeSpan.GetSeconds() << " seconds)";
}
#endif
CArchive& AFXAPI operator <<(CArchive& ar, CTimeSpan timeSpan)
{
//return ar << (DWORD) timeSpan.m_timeSpan;
ASSERT(FALSE);
return ar;
}
CArchive& AFXAPI operator >>(CArchive& ar, CTimeSpan& rtimeSpan)
{
//return ar >> (DWORD&) rtimeSpan.m_timeSpan;
ASSERT(FALSE);
return ar;
}
/////////////////////////////////////////////////////////////////////////////
// String formatting
#define maxTimeBufferSize 128
// Verifies will fail if the needed buffer size is too large
#ifdef _UNICODE
#endif
CString CTimeSpan::Format(LPCTSTR pFormat) const
// formatting timespans is a little trickier than formatting CTimes
// * we are only interested in relative time formats, ie. it is illegal
// to format anything dealing with absolute time (i.e. years, months,
// day of week, day of year, timezones, ...)
// * the only valid formats:
// %D - # of days -- NEW !!!
// %H - hour in 24 hour format
// %M - minute (0-59)
// %S - seconds (0-59)
// %% - percent sign
{
TCHAR szBuffer[maxTimeBufferSize];
TCHAR ch;
LPTSTR pch = szBuffer;
while ((ch = *pFormat++) != '\0')
{
ASSERT(pch < &szBuffer[maxTimeBufferSize]);
if (ch == '%')
{
switch (ch = *pFormat++)
{
default:
ASSERT(FALSE); // probably a bad format character
case '%':
*pch++ = ch;
break;
case 'D':
pch += wsprintf(pch, _T("%ld"), GetDays());
break;
case 'H':
pch += wsprintf(pch, _T("%02d"), GetHours());
break;
case 'M':
pch += wsprintf(pch, _T("%02d"), GetMinutes());
break;
case 'S':
pch += wsprintf(pch, _T("%02d"), GetSeconds());
break;
}
}
else
{
*pch++ = ch;
if (_istlead(ch))
{
ASSERT(pch < &szBuffer[maxTimeBufferSize]);
*pch++ = *pFormat++;
}
}
}
*pch = '\0';
return szBuffer;
}
CString CTime::Format(LPCTSTR pFormat) const
// formatting timespans is a little trickier than formatting CTimes
// * we are only interested in relative time formats, ie. it is illegal
// to format anything dealing with absolute time (i.e. years, months,
// day of week, day of year, timezones, ...)
// * the only valid formats:
// %D - # of days -- NEW !!!
// %H - hour in 24 hour format
// %M - minute (0-59)
// %S - seconds (0-59)
// %% - percent sign
{
TCHAR szBuffer[maxTimeBufferSize];
TCHAR ch;
LPTSTR pch = szBuffer;
while ((ch = *pFormat++) != '\0')
{
ASSERT(pch < &szBuffer[maxTimeBufferSize]);
if (ch == '%')
{
switch (ch = *pFormat++)
{
default:
ASSERT(FALSE); // probably a bad format character
case '%':
*pch++ = ch;
break;
case 'D':
pch += wsprintf(pch, _T("%ld"), GetDay());
break;
case 'H':
pch += wsprintf(pch, _T("%02d"), GetHour());
break;
case 'M':
pch += wsprintf(pch, _T("%02d"), GetMinute());
break;
case 'S':
pch += wsprintf(pch, _T("%02d"), GetSecond());
break;
}
}
else
{
*pch++ = ch;
if (_istlead(ch))
{
ASSERT(pch < &szBuffer[maxTimeBufferSize]);
*pch++ = *pFormat++;
}
}
}
*pch = '\0';
return szBuffer;
}
#ifdef _ALL_CTIME_FORMATS_
CString CTimeSpan::Format(UINT nFormatID) const
{
CString strFormat;
VERIFY(strFormat.LoadString(nFormatID) != 0);
return Format(strFormat);
}
CString CTime::Format(LPCTSTR pFormat) const
{
TCHAR szBuffer[maxTimeBufferSize];
struct tm* ptmTemp = localtime(&m_time);
if (ptmTemp == NULL ||
!_tcsftime(szBuffer, _countof(szBuffer), pFormat, ptmTemp))
szBuffer[0] = '\0';
return szBuffer;
}
CString CTime::FormatGmt(LPCTSTR pFormat) const
{
TCHAR szBuffer[maxTimeBufferSize];
struct tm* ptmTemp = gmtime(&m_time);
if (ptmTemp == NULL ||
!_tcsftime(szBuffer, _countof(szBuffer), pFormat, ptmTemp))
szBuffer[0] = '\0';
return szBuffer;
}
CString CTime::Format(UINT nFormatID) const
{
CString strFormat;
VERIFY(strFormat.LoadString(nFormatID) != 0);
return Format(strFormat);
}
CString CTime::FormatGmt(UINT nFormatID) const
{
CString strFormat;
VERIFY(strFormat.LoadString(nFormatID) != 0);
return FormatGmt(strFormat);
}
#ifdef _UNICODE
// These functions are provided for compatibility with MFC 3.x
CString CTime::Format(LPCSTR pFormat) const
{
CString strFormat(pFormat);
return Format((LPCTSTR)strFormat);
}
CString CTime::FormatGmt(LPCSTR pFormat) const
{
CString strFormat(pFormat);
return FormatGmt((LPCTSTR)strFormat);
}
CString CTimeSpan::Format(LPCSTR pFormat) const
{
CString strFormat = pFormat;
return Format((LPCTSTR)strFormat);
}
#endif //_ALL_CTIME_FORMATS_
#endif // _UNICODE
/////////////////////////////////////////////////////////////////////////////