mirror of
https://github.com/reactos/reactos.git
synced 2025-01-05 22:12:46 +00:00
[NET] Implement a parser for the '/times' option of the 'user' command.
Work in progress: - Does not obey to the users time zone. - Accepts english abbreviations of the days of week only.
This commit is contained in:
parent
2db0e159a4
commit
ccd95b9880
1 changed files with 261 additions and 18 deletions
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
#define SECONDS_PER_DAY (60 * 60 * 24)
|
#define SECONDS_PER_DAY (60 * 60 * 24)
|
||||||
#define SECONDS_PER_HOUR (60 * 60)
|
#define SECONDS_PER_HOUR (60 * 60)
|
||||||
|
#define HOURS_PER_DAY 24
|
||||||
|
#define DAYS_PER_WEEK 7
|
||||||
|
|
||||||
typedef struct _COUNTY_TABLE
|
typedef struct _COUNTY_TABLE
|
||||||
{
|
{
|
||||||
|
@ -48,6 +50,8 @@ static COUNTRY_TABLE CountryTable[] =
|
||||||
{785, 5103}, // Arabic
|
{785, 5103}, // Arabic
|
||||||
{972, 5104} }; // Hebrew
|
{972, 5104} }; // Hebrew
|
||||||
|
|
||||||
|
//static PWSTR DaysArray[] = {L"So", L"Mo", L"Di", L"Mi", L"Do", L"Fr", L"Sa"};
|
||||||
|
static PWSTR DaysArray[] = {L"Sun", L"Mon", L"Tue", L"Wed", L"Thu", L"Fri", L"Sat"};
|
||||||
|
|
||||||
static
|
static
|
||||||
int
|
int
|
||||||
|
@ -226,14 +230,27 @@ GetCountryFromCountryCode(
|
||||||
|
|
||||||
static
|
static
|
||||||
BOOL
|
BOOL
|
||||||
BitValue(
|
GetBitValue(
|
||||||
PBYTE pLogonHours,
|
PBYTE pBitmap,
|
||||||
DWORD dwBitNumber)
|
DWORD dwBitNumber)
|
||||||
{
|
{
|
||||||
DWORD dwIndex = dwBitNumber / 8;
|
DWORD dwIndex = dwBitNumber / 8;
|
||||||
BYTE Mask = 1 << (dwBitNumber & 7);
|
BYTE Mask = 1 << (dwBitNumber & 7);
|
||||||
|
|
||||||
return ((pLogonHours[dwIndex] & Mask) != 0);
|
return ((pBitmap[dwIndex] & Mask) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
SetBitValue(
|
||||||
|
PBYTE pBitmap,
|
||||||
|
DWORD dwBitNumber)
|
||||||
|
{
|
||||||
|
DWORD dwIndex = dwBitNumber / 8;
|
||||||
|
BYTE Mask = 1 << (dwBitNumber & 7);
|
||||||
|
|
||||||
|
pBitmap[dwIndex] |= Mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -262,7 +279,7 @@ PrintLogonHours(
|
||||||
|
|
||||||
for (dwBitNumber = 0; dwBitNumber < dwUnitsPerWeek; dwBitNumber++)
|
for (dwBitNumber = 0; dwBitNumber < dwUnitsPerWeek; dwBitNumber++)
|
||||||
{
|
{
|
||||||
bBitValue = BitValue(pLogonHours, dwBitNumber);
|
bBitValue = GetBitValue(pLogonHours, dwBitNumber);
|
||||||
if (bBitValue)
|
if (bBitValue)
|
||||||
{
|
{
|
||||||
dwStartTime = dwSecondsPerUnit * dwBitNumber;
|
dwStartTime = dwSecondsPerUnit * dwBitNumber;
|
||||||
|
@ -271,7 +288,7 @@ PrintLogonHours(
|
||||||
{
|
{
|
||||||
dwBitNumber++;
|
dwBitNumber++;
|
||||||
if (dwBitNumber < dwUnitsPerWeek)
|
if (dwBitNumber < dwUnitsPerWeek)
|
||||||
bBitValue = BitValue(pLogonHours, dwBitNumber);
|
bBitValue = GetBitValue(pLogonHours, dwBitNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
dwEndTime = dwSecondsPerUnit * dwBitNumber;
|
dwEndTime = dwSecondsPerUnit * dwBitNumber;
|
||||||
|
@ -291,6 +308,8 @@ PrintLogonHours(
|
||||||
|
|
||||||
PrintMessageString(4307 + dwStartDay);
|
PrintMessageString(4307 + dwStartDay);
|
||||||
ConPuts(StdOut, L" ");
|
ConPuts(StdOut, L" ");
|
||||||
|
|
||||||
|
// FIXME: Check if this is a converion from GMT to local timezone
|
||||||
PrintLocalTime((dwStartTime % SECONDS_PER_DAY) + SECONDS_PER_HOUR);
|
PrintLocalTime((dwStartTime % SECONDS_PER_DAY) + SECONDS_PER_HOUR);
|
||||||
|
|
||||||
ConPrintf(StdOut, L" - ");
|
ConPrintf(StdOut, L" - ");
|
||||||
|
@ -300,6 +319,7 @@ PrintLogonHours(
|
||||||
ConPuts(StdOut, L" ");
|
ConPuts(StdOut, L" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Check if this is a converion from GMT to local timezone
|
||||||
PrintLocalTime((dwEndTime % SECONDS_PER_DAY) + SECONDS_PER_HOUR);
|
PrintLocalTime((dwEndTime % SECONDS_PER_DAY) + SECONDS_PER_HOUR);
|
||||||
ConPuts(StdOut, L"\n");
|
ConPuts(StdOut, L"\n");
|
||||||
}
|
}
|
||||||
|
@ -809,20 +829,100 @@ ParseDate(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
BOOL
|
||||||
|
ParseHour(
|
||||||
|
PWSTR pszString,
|
||||||
|
PDWORD pdwHour)
|
||||||
|
{
|
||||||
|
PWCHAR pChar;
|
||||||
|
DWORD dwHour = 0;
|
||||||
|
|
||||||
|
if (!iswdigit(pszString[0]))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
pChar = pszString;
|
||||||
|
while (iswdigit(*pChar))
|
||||||
|
{
|
||||||
|
dwHour = dwHour * 10 + *pChar - L'0';
|
||||||
|
pChar++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwHour > 24)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (dwHour == 24)
|
||||||
|
dwHour = 0;
|
||||||
|
|
||||||
|
if ((*pChar != UNICODE_NULL) &&
|
||||||
|
(dwHour >= 1) &&
|
||||||
|
(dwHour <= 12))
|
||||||
|
{
|
||||||
|
if ((_wcsicmp(pChar, L"am") == 0) ||
|
||||||
|
(_wcsicmp(pChar, L"a.m.") == 0))
|
||||||
|
{
|
||||||
|
if (dwHour == 12)
|
||||||
|
dwHour = 0;
|
||||||
|
}
|
||||||
|
else if ((_wcsicmp(pChar, L"pm") == 0) ||
|
||||||
|
(_wcsicmp(pChar, L"p.m.") == 0))
|
||||||
|
{
|
||||||
|
if (dwHour != 12)
|
||||||
|
dwHour += 12;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*pdwHour = dwHour;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
BOOL
|
||||||
|
ParseDay(
|
||||||
|
PWSTR pszString,
|
||||||
|
PDWORD pdwDay)
|
||||||
|
{
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAYSIZE(DaysArray); i++)
|
||||||
|
{
|
||||||
|
if (_wcsicmp(pszString, DaysArray[i]) == 0)
|
||||||
|
{
|
||||||
|
*pdwDay = i;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
DWORD
|
DWORD
|
||||||
ParseLogonHours(
|
ParseLogonHours(
|
||||||
PWSTR pszParams,
|
PWSTR pszParams,
|
||||||
PBYTE *ppLogonHours,
|
PBYTE *ppLogonBitmap,
|
||||||
PDWORD pdwUnitsPerWeek)
|
PDWORD pdwUnitsPerWeek)
|
||||||
{
|
{
|
||||||
PBYTE pLogonHours = NULL;
|
PBYTE pLogonBitmap = NULL;
|
||||||
DWORD dwError = ERROR_SUCCESS;
|
DWORD dwError = ERROR_SUCCESS;
|
||||||
|
WCHAR szBuffer[32];
|
||||||
|
PWSTR ptr1, ptr2;
|
||||||
|
WCHAR prevSep, nextSep;
|
||||||
|
DWORD dwStartHour, dwEndHour, dwStartDay, dwEndDay, i, j;
|
||||||
|
BYTE DayBitmap;
|
||||||
|
BYTE HourBitmap[6];
|
||||||
|
|
||||||
pLogonHours = HeapAlloc(GetProcessHeap(),
|
pLogonBitmap = HeapAlloc(GetProcessHeap(),
|
||||||
HEAP_ZERO_MEMORY,
|
HEAP_ZERO_MEMORY,
|
||||||
UNITS_PER_WEEK / 8);
|
UNITS_PER_WEEK / 8);
|
||||||
if (pLogonHours == NULL)
|
if (pLogonBitmap == NULL)
|
||||||
return ERROR_OUTOFMEMORY;
|
return ERROR_OUTOFMEMORY;
|
||||||
|
|
||||||
if (*pszParams == UNICODE_NULL)
|
if (*pszParams == UNICODE_NULL)
|
||||||
|
@ -832,24 +932,167 @@ ParseLogonHours(
|
||||||
|
|
||||||
if (wcsicmp(pszParams, L"all") == 0)
|
if (wcsicmp(pszParams, L"all") == 0)
|
||||||
{
|
{
|
||||||
FillMemory(pLogonHours, UNITS_PER_WEEK / 8, 0xFF);
|
FillMemory(pLogonBitmap, UNITS_PER_WEEK / 8, 0xFF);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME */
|
ZeroMemory(&DayBitmap, sizeof(DayBitmap));
|
||||||
/* Mockup error because we do not parse the line yet */
|
ZeroMemory(HourBitmap, sizeof(HourBitmap));
|
||||||
|
|
||||||
|
ZeroMemory(szBuffer, sizeof(szBuffer));
|
||||||
|
ptr1 = pszParams;
|
||||||
|
ptr2 = szBuffer;
|
||||||
|
prevSep = UNICODE_NULL;
|
||||||
|
nextSep = UNICODE_NULL;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (*ptr1 != L'-' && *ptr1 != L',' && *ptr1 != L';' && *ptr1 != UNICODE_NULL)
|
||||||
|
{
|
||||||
|
*ptr2 = *ptr1;
|
||||||
|
ptr2++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prevSep = nextSep;
|
||||||
|
nextSep = *ptr1;
|
||||||
|
|
||||||
|
// printf("Token: '%S'\n", szBuffer);
|
||||||
|
if (*ptr1 != UNICODE_NULL)
|
||||||
|
printf("Separator: '%C'\n", *ptr1);
|
||||||
|
|
||||||
|
if (prevSep != L'-')
|
||||||
|
{
|
||||||
|
// Set first value
|
||||||
|
if (iswdigit(szBuffer[0]))
|
||||||
|
{
|
||||||
|
// parse hour
|
||||||
|
if (!ParseHour(szBuffer, &dwStartHour))
|
||||||
|
{
|
||||||
|
dwError = 3769;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: Check if this is a converion from local timezone to GMT
|
||||||
|
if (dwStartHour > 0)
|
||||||
|
dwStartHour--;
|
||||||
|
else
|
||||||
|
dwStartHour = UNITS_PER_WEEK - 1;
|
||||||
|
|
||||||
|
SetBitValue(HourBitmap, dwStartHour);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// parse day
|
||||||
|
if (!ParseDay(szBuffer, &dwStartDay))
|
||||||
|
{
|
||||||
dwError = 3768;
|
dwError = 3768;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetBitValue(&DayBitmap, dwStartDay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Set second value
|
||||||
|
if (iswdigit(szBuffer[0]))
|
||||||
|
{
|
||||||
|
// parse hour
|
||||||
|
if (!ParseHour(szBuffer, &dwEndHour))
|
||||||
|
{
|
||||||
|
dwError = 3769;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwEndHour < dwStartHour)
|
||||||
|
dwEndHour += HOURS_PER_DAY;
|
||||||
|
else if (dwEndHour == dwStartHour)
|
||||||
|
dwEndHour = dwStartHour + HOURS_PER_DAY;
|
||||||
|
|
||||||
|
// FIXME: Check if this is a converion from local timezone to GMT
|
||||||
|
if (dwEndHour > 0)
|
||||||
|
dwEndHour--;
|
||||||
|
else
|
||||||
|
dwEndHour = UNITS_PER_WEEK - 1;
|
||||||
|
|
||||||
|
for (i = dwStartHour; i < dwEndHour; i++)
|
||||||
|
SetBitValue(HourBitmap, i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// parse day
|
||||||
|
if (!ParseDay(szBuffer, &dwEndDay))
|
||||||
|
{
|
||||||
|
dwError = 3768;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwEndDay <= dwStartDay)
|
||||||
|
dwEndDay += DAYS_PER_WEEK;
|
||||||
|
|
||||||
|
for (i = dwStartDay; i <= dwEndDay; i++)
|
||||||
|
SetBitValue(&DayBitmap, i % DAYS_PER_WEEK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*ptr1 == L';' || *ptr1 == UNICODE_NULL)
|
||||||
|
{
|
||||||
|
// Process the data
|
||||||
|
// printf("DayBitmap: %02x HourBitmap: %02x%02x%02x%02x%02x%02x\n",
|
||||||
|
// DayBitmap, HourBitmap[5], HourBitmap[4], HourBitmap[3], HourBitmap[2], HourBitmap[1], HourBitmap[0]);
|
||||||
|
|
||||||
|
for (i = 0; i < DAYS_PER_WEEK; i++)
|
||||||
|
{
|
||||||
|
if (GetBitValue(&DayBitmap, i))
|
||||||
|
{
|
||||||
|
for (j = 0; j < 48; j++)
|
||||||
|
{
|
||||||
|
if (GetBitValue(HourBitmap, j))
|
||||||
|
SetBitValue(pLogonBitmap, ((i * HOURS_PER_DAY) + j) % UNITS_PER_WEEK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the Bitmaps
|
||||||
|
ZeroMemory(&DayBitmap, sizeof(DayBitmap));
|
||||||
|
ZeroMemory(HourBitmap, sizeof(HourBitmap));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*ptr1 == UNICODE_NULL)
|
||||||
|
{
|
||||||
|
// printf("Done\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZeroMemory(szBuffer, sizeof(szBuffer));
|
||||||
|
ptr2 = szBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr1++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
printf("LogonBitmap:\n");
|
||||||
|
for (i = 0; i < DAYS_PER_WEEK; i++)
|
||||||
|
{
|
||||||
|
j = i * 3;
|
||||||
|
printf("%lu: %02x%02x%02x\n", i, pLogonHours[j + 2], pLogonHours[j + 1], pLogonHours[j + 0]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (dwError == ERROR_SUCCESS)
|
if (dwError == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
*ppLogonHours = pLogonHours;
|
*ppLogonBitmap = pLogonBitmap;
|
||||||
*pdwUnitsPerWeek = UNITS_PER_WEEK;
|
*pdwUnitsPerWeek = UNITS_PER_WEEK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (pLogonHours != NULL)
|
if (pLogonBitmap != NULL)
|
||||||
HeapFree(GetProcessHeap(), 0, pLogonHours);
|
HeapFree(GetProcessHeap(), 0, pLogonBitmap);
|
||||||
|
*ppLogonBitmap = NULL;
|
||||||
|
*pdwUnitsPerWeek = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return dwError;
|
return dwError;
|
||||||
|
|
Loading…
Reference in a new issue