|
|
/****************************************************************************************
* NAME: TimeOfDay.cpp * * OVERVIEW * * APIs for getting the Time of Day constraint * * Copyright (C) Microsoft Corporation, 1998 - 1999 . All Rights Reserved. * * History: * 2/14/98 Created by Byao * *****************************************************************************************/ #include "precompiled.h"
//
// declarations for IAS mapping APIs
//
#include "textmap.h"
//
// declaration for the API
#include "TimeOfDay.h"
#include "iasdebug.h"
static BYTE bitSetting[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
//+---------------------------------------------------------------------------
//
// Function: ReverseHourMap
//
// Synopsis: reverse each byte in the hour map
//
// we have to do this because LogonUI changes the way HourMap is stored(they
// reversed all the bit. We need to do this so our conversion code can leave
// intact.
//
// Arguments: [in] BYTE* map - hour map
// [in] INT nByte - how many bytes are in this hour map
//
// History: byao 4/10/98 10:33:57 PM
//
//+---------------------------------------------------------------------------
void ReverseHourMap(BYTE *map, int nByte) { int i, j; BYTE temp;
for (i=0; i<nByte; i++) { temp = 0; for (j=0;j<8;j++) { // set the value temp
if ( map[i] & bitSetting[j] ) { temp |= bitSetting[7-j]; } } map[i] = temp; } }
//+---------------------------------------------------------------------------
//
// Function: HourMapToStr
//
// Synopsis: convert the 21-byte hour map to a text string in the following
// format:
// 0 8:30-9:30 10:30-15:30; 2 10:00-14:00
//
//
// Arguments: [in] BYTE* map - hour map
// [out] ATL::CString& strHourMap - hour map in string format
//
// History: Created Header byao 2/14/98 10:33:57 PM
//
//+---------------------------------------------------------------------------
void HourMapToStr(BYTE* map, ATL::CString& strHourMap) { int sh, eh; // start hour, (min), end hour (min)
BYTE* pHourMap; int i, j;
//
// todo: change to a safer allocation method
//
WCHAR wzTmpStr[128] = L""; WCHAR wzStr[2048] = L""; WCHAR wzHourStr[8192] = L"";
BOOL bFirstDay=TRUE;
pHourMap = map; for( i = 0; i < 7; i++) // for each day
{ // if any value for this day
if(*pHourMap || *(pHourMap + 1) || *(pHourMap + 2)) { // the string for this day
if (bFirstDay) { wsprintf(wzTmpStr, _T("%1d"), i); bFirstDay = FALSE; } else { wsprintf(wzTmpStr, _T("; %1d"), i); } wcscpy(wzStr, wzTmpStr);
sh = -1; eh = -1; // not start yet
for(j = 0; j < 24; j++) // for every hour
{ int k = j / 8; int m = j % 8; if(*(pHourMap + k) & bitSetting[m]) // this hour is on
{ if(sh == -1) sh = j; // set start hour is empty
eh = j; // extend end hour
} else // this is not on
{ if(sh != -1) // some hours need to write out
{ wsprintf(wzTmpStr,_T(" %02d:00-%02d:00"), sh, eh + 1); wcscat(wzStr, wzTmpStr); sh = -1; eh = -1; } } } if(sh != -1) { wsprintf(wzTmpStr, _T(" %02d:00-%02d:00"), sh, eh + 1); wcscat(wzStr, wzTmpStr); sh = -1; eh = -1; } wcscat(wzHourStr, wzStr); } pHourMap += 3; }
strHourMap = wzHourStr;
return; }
//+---------------------------------------------------------------------------
//
// Function: GetTODConstaint
//
// Synopsis: Get the time of day constraint
// This is implemented by calling an API in NT team
// LogonScheduleDialog(...);
//
// Arguments: [in/out] ATL::CString &strHourMap - TOD constraint in text format
//
// Returns: HRESULT -
//
// History: Created Header byao 2/14/98 10:36:27 PM
//
//+---------------------------------------------------------------------------
typedef HRESULT (APIENTRY *PFN_LOGONSCHEDULEDIALOGEX)( HWND hwndParent // parent window
, BYTE ** pprgbData // pointer to pointer to array of 21 bytes
, LPCTSTR pszTitle // dialog title
, DWORD dwFlags // in what format to accept the time
);
HRESULT GetTODConstaint( ATL::CString &strHourMap ) { TRACE_FUNCTION("::GetTODConstraint");
BYTE TimeOfDayHoursMap[21]; BYTE* pMap = &(TimeOfDayHoursMap[0]); ATL::CString strDialogTitle; DWORD dwRet; HRESULT hr = S_OK; PFN_LOGONSCHEDULEDIALOGEX pfnLogonScheduleDialogEx = NULL; HMODULE hLogonScheduleDLL = NULL;
ZeroMemory(TimeOfDayHoursMap, 21);
//
// convert the TOD constraint string to HourMap
//
dwRet = IASHourMapFromText(strHourMap, pMap); if (NO_ERROR != dwRet) goto win32_error;
// ReverseHourMap() will reverse each byte of the hour map, basically
// reverse every bit in the byte.
// we have to do this because LogonUI changes the way HourMap is stored(they
// reversed all the bit. We need to do this so our conversion code can leave
// intact.
//
// We reverse it here so it can be understood by the LogonSchedule api
//
ReverseHourMap(pMap,21);
//
// get the new TOD Constaint
//
if (!strDialogTitle.LoadString(IDS_TOD_DIALOG_TITLE)) goto win32_error;
hLogonScheduleDLL = LoadLibrary(_T("loghours.dll")); if ( NULL == hLogonScheduleDLL ) { hr = HRESULT_FROM_WIN32(GetLastError()); ErrorTrace(ERROR_NAPMMC_TIMEOFDAY, "LoadLibrary() failed, err = %x", hr);
ShowErrorDialog(NULL, IDS_ERROR_CANT_FIND_LOGHOURSDLL, NULL, hr); goto win32_error; } pfnLogonScheduleDialogEx = (PFN_LOGONSCHEDULEDIALOGEX) GetProcAddress(hLogonScheduleDLL, "DialinHoursDialogEx"); if ( ! pfnLogonScheduleDialogEx ) { hr = HRESULT_FROM_WIN32(GetLastError()); ErrorTrace(ERROR_NAPMMC_TIMEOFDAY, "GetProcAddress() failed for DialinHoursDialogEx, err = %x", hr);
ShowErrorDialog(NULL, IDS_ERROR_CANT_FIND_LOGHOURSAPI, NULL, hr); FreeLibrary(hLogonScheduleDLL); goto win32_error; } //
// now we do have this DLL, call the API
//
hr = pfnLogonScheduleDialogEx( NULL // We don't have an HWND available to pass, but NULL asks the dialog to display itself modally as desired.
, (BYTE**)&pMap , strDialogTitle , 1 // This is defined in loghrapi.h (which we don't have access to) to mean "accept in local time".
); FreeLibrary(hLogonScheduleDLL); DebugTrace(DEBUG_NAPMMC_TIMEOFDAY, "LogonScheduleDialogEx() returned %x", hr);
if ( FAILED(hr) ) { goto win32_error; }
//
// convert the hourmap to a text string
//
// We need to reverse it first so our conversion code can understand it.
//
ReverseHourMap(pMap,21); HourMapToStr(pMap, strHourMap) ;
return S_OK;
win32_error: ShowErrorDialog(NULL, IDS_ERROR_TIMEOFDAY, NULL, HRESULT_FROM_WIN32(GetLastError()) ); return hr; }
|