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.
|
|
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corp. All rights reserved.
//
// FILE
//
// textmap.cpp
//
// SYNOPSIS
//
// This file defines functions for converting Time of Day restriction
// hour maps to and from a textual representation.
//
// MODIFICATION HISTORY
//
// 02/05/1998 Original version.
// 04/06/1998 Sunday is day zero again.
//
///////////////////////////////////////////////////////////////////////////////
#include <ias.h>
#include <Parser.h>
#include <textmap.h>
//////////
// Definition of whitespace.
//////////
#define WSP L" "
//////////
// Valid delimiters for days.
//////////
#define DELIM L",;|"
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// TimeOfDayParser
//
// DESCRIPTION
//
// This class extends Parser to extract hour maps from a string.
//
///////////////////////////////////////////////////////////////////////////////
class TimeOfDayParser : public Parser { public:
TimeOfDayParser(PWSTR source) throw () : Parser(source) { }
// Extract time of day in the format hh:mm.
void extractTime(ULONG* hour, ULONG* minute) throw (ParseError) { *hour = extractUnsignedLong(); skip(WSP);
// Minutes are optional.
if (*current == L':') { ++current;
*minute = extractUnsignedLong(); } else { *minute = 0; }
if (*hour > 24 || *minute > 59 || (*hour == 24 && *minute != 0)) { throw ParseError(); } }
// Extracts a single day's hour map.
void extractDay(PBYTE hourMap) throw (ParseError) { // Get the day of week (an integer from 0-6).
ULONG dayOfWeek = extractUnsignedLong(); skip(WSP);
if (dayOfWeek > 6) { throw ParseError(); }
do { // Get the start time of the range.
ULONG startHour, startMinute; extractTime(&startHour, &startMinute); skip(WSP);
ignore(L'-');
// Get the end time of the range.
ULONG endHour, endMinute; extractTime(&endHour, &endMinute); skip(WSP);
// Make sure the values are legit.
if (startHour * 60 + startMinute > endHour * 60 + endMinute) { throw ParseError(); }
// Set all bits in the range.
for (size_t i=startHour; i<endHour; ++i) { hourMap[dayOfWeek * 3 + i / 8] |= 0x80 >> (i % 8); }
} while (more()); } };
///////////////////////////////////////////////////////////////////////////////
//
// FUNCTION
//
// IASTextToHourMap
//
///////////////////////////////////////////////////////////////////////////////
DWORD WINAPI IASHourMapFromText( IN PCWSTR szText, IN BOOL keepMap, IN OUT PBYTE pHourMap ) { if (szText == NULL || pHourMap == NULL) { return ERROR_INVALID_PARAMETER; }
if (keepMap == FALSE) { memset(pHourMap, 0, IAS_HOUR_MAP_LENGTH); }
//////////
// Make a local copy so we can modify the text.
//////////
PWSTR copy = (PWSTR)_alloca((wcslen(szText) + 1) * sizeof(WCHAR));
wcscpy(copy, szText);
//////////
// Parse the text.
//////////
try { // Each day should be separated by a comma or semicolon.
PWSTR token = wcstok(copy, DELIM);
while (token) { TimeOfDayParser parser(token);
parser.extractDay(pHourMap);
token = wcstok(NULL, DELIM); } } catch (Parser::ParseError) { return ERROR_INVALID_DATA; }
return NO_ERROR; }
|