Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

213 lines
8.1 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
DATETIMEPARSER.H
Abstract:
Validates a date/time string and converts into it's component values.
History:
--*/
#ifndef _datetimeparser_
#define _datetimeparser_
#include "corepol.h"
class POLARITY CDateTimeParser
{
public:
enum { ok = 0, failed, nothingLeft };
//nDayFormatPreference values
typedef enum { dmy, dym, mdy, myd, ydm, ymd } DayFormatPreference;
//Constructor. This takes a DateTime string and parses it.
CDateTimeParser(const TCHAR *pszDateTime);
//Destructor. Tidies up after itself.
~CDateTimeParser();
//Tidies up and parses a new date and time.
BOOL SetDateTime(const TCHAR *pszDateTime);
//Returns the status of the currently parsed date/time.
BOOL IsValidDateTime() { return m_bValidDateTime; }
//Retrieves the bits and pieces we found. Zero means it was not
//found or was zero! This may change!
unsigned char GetDay() { return m_nDay; }
unsigned char GetMonth() { return m_nMonth; }
unsigned int GetYear() { return m_nYear; }
unsigned char GetHours() { return m_nHours; }
unsigned char GetMinutes() { return m_nMinutes; }
unsigned char GetSeconds() { return m_nSeconds; }
unsigned int GetMicroseconds() { return m_nMicroseconds; }
int GetUTC() { return m_nUTC; }
int FillDMTF(WCHAR* pwszBuffer);
// Static helper functions to allow other code to perform quick DMTF DateTime validation
// without executing a lot of unnecessary NLS code.
static BOOL CheckDMTFDateTimeFormat(const TCHAR *wszDateTime, BOOL bFailIfRelative = FALSE,
BOOL bFailIfUnzoned = FALSE);
static BOOL CheckDMTFDateTimeInterval(const TCHAR *wszInterval);
protected:
// Protected constructor, to keep outside code from instantiating us in a half-initialized
// state. This constructor is used by a static helper function for validating DMTF formats.
CDateTimeParser(void);
// Prevents others from accessing
//Resets all the date/time values to the default values.
//If bSQL is TRUE it sets to the SQL default. Otherwise
//sets to the DMTF default.
void ResetDateTime(BOOL bSQL);
void ResetDate(BOOL bSQL);
void ResetTime(BOOL bSQL);
//Does a check to make sure the date/time is in the DMTF
//date/time format.
//Fills in the class date/time elements.
BOOL CheckDMTFDateTimeFormatInternal(const TCHAR *pszDateTime);
//Does a check from the start of the string specified. If
//bCheckTimeAfter set a call to CheckTimeFormat is called
//after each successful parse of the date.
//Fills in the class date/time elements.
BOOL CheckDateFormat(const TCHAR *pszDate, BOOL bCheckTimeAfter);
//Does a check from the start of the string specified. If
//bCheckDateAfter set a call to CheckDateFormat is called
//after each successful parse of the time.
//Fills in the class date/time elements.
BOOL CheckTimeFormat(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL DateFormat1(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat2(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat3(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat4(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat5(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat6(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat7(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat8(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL DateFormat9(const TCHAR *pszDate, const TCHAR *pszDateSeparator, BOOL bCheckTimeAfter);
BOOL DateFormat10(const TCHAR *pszDate, const TCHAR *pszDateSeparator, BOOL bCheckTimeAfter);
BOOL DateFormat11(const TCHAR *pszDate, const TCHAR *pszDateSeparator, BOOL bCheckTimeAfter);
BOOL DateFormat12(const TCHAR *pszDate, const TCHAR *pszDateSeparator, BOOL bCheckTimeAfter);
BOOL DateFormat13(const TCHAR *pszDate, const TCHAR *pszDateSeparator, BOOL bCheckTimeAfter);
BOOL DateFormat14(const TCHAR *pszDate, const TCHAR *pszDateSeparator, BOOL bCheckTimeAfter);
BOOL DateFormat15(const TCHAR *pszDate, BOOL bCheckTimeAfter);
BOOL TimeFormat1(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat2(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat3(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat4(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat5(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat6(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat7(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat8(const TCHAR *pszTime, BOOL bCheckDateAfter);
BOOL TimeFormat9(const TCHAR *pszTime, BOOL bCheckDateAfter);
//Checks for long and short month string. Leading spaces allowed.
int IsValidMonthString(TCHAR *pszString,
const TCHAR *pszSeparator,
TCHAR *pszFullMonth[13],
TCHAR *pszShortMonth[13]);
//Checks for a month as a numeric string. Leading spaces allowed.
//Checks to make sure month is in range 1-12
int IsValidMonthNumber(TCHAR *pszString,
const TCHAR *pszSeparator);
//Checks for valid day number. Does no validation of
//number except checking it is in range of 1-31
//Leading spaces allowed.
int IsValidDayNumber(TCHAR *pszString,
const TCHAR *pszSeparator);
//Checks for valid year number. Does conversion for
//2 digit years. Leading spaces allowed.
int IsValidYearNumber(TCHAR *pszString,
const TCHAR *pszSeparator,
BOOL bFourDigitsOnly);
//Checks for valid hours. Validates for range 0-23
//Leading spaces allowed.
int IsValidHourNumber(TCHAR *pszString,
const TCHAR *pszSeparator);
//Checks for valid minutes. Validates for range 0-59.
//No leading spaces allowed.
int IsValidMinuteNumber(TCHAR *pszString,
const TCHAR *pszSeparator);
//Checks for valid minutes. Validates for range 0-59.
//No leading spaces allowed.
int IsValidSecondNumber(TCHAR *pszString,
const TCHAR *pszSeparator);
//treats the number as thousandth of a second.
int IsValidColonMillisecond(TCHAR *pszString,
const TCHAR *pszSeparator);
//converts value to a thousandth of a second based on number
//of digits included.
int IsValidDotMillisecond(TCHAR *pszString,
const TCHAR *pszSeparator);
//Checks for valid AM/PM string. Leading space is allowed. If
//PM, adds 12 onto hours. Validates hours so it is < 23.
BOOL IsValidAmPmString(TCHAR *pszString,
const TCHAR *pszSeparator,
TCHAR *pszAmPm[2]);
//Checks for a valid [yy]yyMMdd or yyyy day. Validates
//month to 1..12 and day to 1..31
BOOL IsValidYearMonthDayNumber(TCHAR *pszString);
void GetLocalInfoAndAlloc(LCTYPE LCType, LPTSTR &lpLCData);
void GetPreferedDateFormat();
TCHAR* AllocAmPm();
private:
//Localised strings retrieved from GetLocalInfo which holds the long month strings
TCHAR * m_pszFullMonth[13];
//Localised strings retrieved from GetLocalInfo which holds the short month strings
TCHAR * m_pszShortMonth[13];
//Localised strings retrieved from GetLocalInfo which holds the short am/pm strings
TCHAR *m_pszAmPm[2];
//Lets us know if the string is valid or not.
BOOL m_bValidDateTime;
//These are the values which get filled in as we find then throughout the
//parsing.
unsigned char m_nDay;
unsigned char m_nMonth;
unsigned int m_nYear;
unsigned char m_nHours;
unsigned char m_nMinutes;
unsigned char m_nSeconds;
unsigned int m_nMicroseconds;
int m_nUTC;
//Preference for date decoding
DayFormatPreference m_nDayFormatPreference;
};
BOOL POLARITY NormalizeCimDateTime(
IN LPCWSTR pszSrc,
OUT BSTR *strAdjusted
);
#endif