267 lines
6.7 KiB
C++
267 lines
6.7 KiB
C++
|
/****************************************************************************************
|
||
|
* 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;
|
||
|
}
|