windows-nt/Source/XPSP1/NT/termsrv/reskit/tsver/exe/constraintspage.cpp
2020-09-26 16:20:57 +08:00

888 lines
21 KiB
C++

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
ConstraintsPage.cpp
Abstract:
Functions for "Constraints" page of the wizard.
Author:
Sergey Kuzin (a-skuzin@microsoft.com) 09-August-1999
Environment:
Revision History:
--*/
#include "tsverui.h"
#include "resource.h"
void AddSelectedItemsToControl(HWND hwndDlg,int iCtrl);
void AddOneSelectedItemToControl(HWND hwndDlg,int iCtrl);
void AddSelectedRangeToControl(HWND hwndDlg);
void AssembleContraints(HWND hwndDlg,LPSHAREDWIZDATA pdata);
void InitConstraintsPage(HWND hwndDlg);
void AddToControl(HWND hwndDlg, int iCtrl,int &i, TCHAR *szConstraints);
void AddOneToControl(HWND hwndDlg, int iCtrl,int &i, TCHAR *szConstraints);
void AddRangeToControl(HWND hwndDlg, int &i, TCHAR *szConstraints);
BOOL CheckSyntax(HWND hwndDlg, WORD wCtrlId);
BOOL CheckRangeSyntax(HWND hwndDlg);
/*++
Routine Description :
dialog box procedure for the "Constraints" page.
Arguments :
IN HWND hwndDlg - handle to dialog box.
IN UINT uMsg - message to be acted upon.
IN WPARAM wParam - value specific to wMsg.
IN LPARAM lParam - value specific to wMsg.
Return Value :
TRUE if it processed the message
FALSE if it did not.
--*/
INT_PTR CALLBACK
ConstraintsPageProc (
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
//Retrieve the shared user data from GWL_USERDATA
LPSHAREDWIZDATA pdata = (LPSHAREDWIZDATA) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (uMsg)
{
case WM_INITDIALOG :
{
//Get the shared data from PROPSHEETPAGE lParam value
//and load it into GWL_USERDATA
pdata = (LPSHAREDWIZDATA) ((LPPROPSHEETPAGE) lParam) -> lParam;
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR) pdata);
InitConstraintsPage(hwndDlg);
break;
}
case WM_NOTIFY :
{
LPNMHDR lpnm = (LPNMHDR) lParam;
switch (lpnm->code)
{
case PSN_SETACTIVE : //Enable the Back and Next buttons
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
if(pdata->pszConstraints){
delete pdata->pszConstraints;
pdata->pszConstraints=NULL;
}
break;
case PSN_WIZNEXT :
//Handle a Next button click here
if(!CheckSyntax(hwndDlg,IDC_ALLOW)||
!CheckSyntax(hwndDlg,IDC_DISALLOW)||
!CheckSyntax(hwndDlg,IDC_HIGHER)||
!CheckSyntax(hwndDlg,IDC_LOWER)||
!CheckRangeSyntax(hwndDlg)){
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
AssembleContraints(hwndDlg,pdata);
break;
case PSN_RESET :
//Handle a Cancel button click, if necessary
break;
default :
break;
}
}
break;
case WM_COMMAND:
switch ( LOWORD(wParam) ) {
case ID_ALLOW:
AddSelectedItemsToControl(hwndDlg,IDC_ALLOW);
break;
case ID_DISALLOW:
AddSelectedItemsToControl(hwndDlg,IDC_DISALLOW);
break;
case ID_HIGHER:
AddOneSelectedItemToControl(hwndDlg,IDC_HIGHER);
break;
case ID_LOWER:
AddOneSelectedItemToControl(hwndDlg,IDC_LOWER);
break;
case ID_RANGE:
AddSelectedRangeToControl(hwndDlg);
break;
default:
break;
}
break;
default:
break;
}
return FALSE;
}
/*++
Routine Description :
Checks validity of entered values
Arguments :
IN HWND hwndDlg - Page handle.
IN int wCtrlId - edit box ID.
Return Value :
FALSE if some invalid values found.
--*/
BOOL
CheckSyntax(
HWND hwndDlg,
WORD wCtrlId
)
{
HWND hwndCtrl=GetDlgItem(hwndDlg,wCtrlId);
TCHAR szBuf[MAX_LEN+1];
TCHAR szTemplate[MAX_LEN-100+1];
TCHAR szCtrlName[100+1];
TCHAR szMsg[MAX_LEN+1];
int size=GetDlgItemText(hwndDlg,wCtrlId,szBuf,MAX_LEN);
if(!size){
return TRUE;
}
do{
size--;
if(!_istdigit(szBuf[size])&&szBuf[size]!=' '){
switch(wCtrlId){
case IDC_HIGHER:
case IDC_LOWER:
LoadString(g_hInst,IDS_INVALID_VALUE,szTemplate,MAX_LEN-100);
LoadString(g_hInst,wCtrlId,szCtrlName,100);
wsprintf(szMsg,szTemplate,szCtrlName);
MessageBox(hwndDlg,szMsg,NULL,MB_OK);
return FALSE;
case IDC_ALLOW:
case IDC_DISALLOW:
if(szBuf[size]!=','){
LoadString(g_hInst,IDS_INVALID_VALUE,szTemplate,MAX_LEN-100);
LoadString(g_hInst,wCtrlId,szCtrlName,100);
wsprintf(szMsg,szTemplate,szCtrlName);
MessageBox(hwndDlg,szMsg,NULL,MB_OK);
return FALSE;
}else{
break;
}
default:
break;
}
}
}while(size);
return TRUE;
}
/*++
Routine Description :
Checks validity of entered values
for IDC_RANGE edit box
Arguments :
IN HWND hwndDlg - Page handle.
Return Value :
FALSE if some invalid values found.
--*/
BOOL
CheckRangeSyntax(
HWND hwndDlg)
{
HWND hwndCtrl=GetDlgItem(hwndDlg,IDC_RANGE);
TCHAR szBuf[MAX_LEN+1];
TCHAR szTemplate[MAX_LEN-100+1];
TCHAR szCtrlName[100+1];
TCHAR szMsg[MAX_LEN+1];
int size=GetDlgItemText(hwndDlg,IDC_RANGE,szBuf,MAX_LEN);
if(!size){
return TRUE;
}
BOOL bBracket=FALSE;
BOOL bColon=FALSE;
BOOL bDigit=FALSE;
do{
size--;
if(!bBracket)//outside of brackets
{
if(szBuf[size]!=';' && szBuf[size]!=')' && szBuf[size]!=' '){ //illegal symbol
LoadString(g_hInst,IDS_INVALID_VALUE,szTemplate,MAX_LEN-100);
LoadString(g_hInst,IDC_RANGE,szCtrlName,100);
wsprintf(szMsg,szTemplate,szCtrlName);
MessageBox(hwndDlg,szMsg,NULL,MB_OK);
return FALSE;
}
} else {//inside of brackets
if((!_istdigit(szBuf[size]) && szBuf[size]!=':' && szBuf[size]!='(' && szBuf[size]!=' ')|| //illegal symbol
(szBuf[size]==':' && bColon)|| // two conons inside brackets
(szBuf[size]=='(' && !bColon)|| // no colons inside brackets
(szBuf[size]==':' && !bDigit)|| // no number after colon '(123:)'
(szBuf[size]=='(' && !bDigit)){ // no number after bracket '(:123)'
LoadString(g_hInst,IDS_INVALID_VALUE,szTemplate,MAX_LEN-100);
LoadString(g_hInst,IDC_RANGE,szCtrlName,100);
wsprintf(szMsg,szTemplate,szCtrlName);
MessageBox(hwndDlg,szMsg,NULL,MB_OK);
return FALSE;
}
}
if(szBuf[size]==')'){
bBracket=TRUE;
bColon=FALSE;
bDigit=FALSE;
continue;
}
if(szBuf[size]=='('){
bBracket=FALSE;
bColon=FALSE;
bDigit=FALSE;
continue;
}
if(szBuf[size]==':'){
bColon=TRUE;
bDigit=FALSE;
continue;
}
if(_istdigit(szBuf[size])){
bDigit=TRUE;
continue;
}
}while(size);
return TRUE;
}
/*++
Routine Description :
Get IDs of selected listbox items
Arguments :
IN HWND hwndList - handle to list box.
OUT int **ppItems - pointer to pointer to array of
IDs of selected items
Return Value :
number of selected items.
--*/
//
int
GetSelectedItems(
HWND hwndList,
int **ppItems)
{
*ppItems=NULL;
int nItems=(int)SendMessage(hwndList,LB_GETSELCOUNT,(WPARAM)0,(LPARAM)0);
if(nItems){
*ppItems=new int[nItems];
if(*ppItems) {
SendMessage(hwndList,LB_GETSELITEMS,(WPARAM)nItems,(LPARAM)*ppItems);
} else {
return 0;
}
}
return nItems;
}
/*++
Routine Description :
Adds selected items from list to
IDC_ALLOW or IDC_DISALLOW edit box
Arguments :
IN HWND hwndDlg - Page handle.
IN int iCtrl - edit box ID.
Return Value :
none
--*/
void
AddSelectedItemsToControl(
HWND hwndDlg,
int iCtrl)
{
static HWND hwndList=NULL;
if(!hwndList){
hwndList=GetDlgItem(hwndDlg,IDC_VERSION_LIST);
}
int *pItemIDs;
int nItems=GetSelectedItems(hwndList,&pItemIDs);
if(nItems){
_TCHAR szNumber[11];//assume that list contains only numbers
_TCHAR szCtrlText[MAX_LEN+1];
for(int i=0;i<nItems;i++){
SendMessage(hwndList,LB_GETTEXT,(WPARAM)pItemIDs[i],(LPARAM)szNumber);
GetDlgItemText(hwndDlg,iCtrl,szCtrlText,MAX_LEN);
if(_tcslen(szCtrlText)<=(MAX_LEN-11)){//10 digits+','
if(_tcslen(szCtrlText)){
_tcscat(szCtrlText,TEXT(","));
}
_tcscat(szCtrlText,szNumber);
SetDlgItemText(hwndDlg,iCtrl,szCtrlText);
}
}
delete pItemIDs;
//deselect all items
SendMessage(hwndList,LB_SETSEL,(WPARAM)0,(LPARAM)-1);
}
}
/*++
Routine Description :
Adds selected items from list to
IDC_HIGHER or IDC_LOWER edit box
Arguments :
IN HWND hwndDlg - Page handle.
IN int iCtrl - edit box ID.
Return Value :
none
--*/
void
AddOneSelectedItemToControl(
HWND hwndDlg,
int iCtrl)
{
static HWND hwndList=NULL;
if(!hwndList){
hwndList=GetDlgItem(hwndDlg,IDC_VERSION_LIST);
}
int *pItemIDs;
int nItems=GetSelectedItems(hwndList,&pItemIDs);
if(nItems){
if(nItems==1){
TCHAR szNumber[11];//assume that list contains only numbers
SendMessage(hwndList,LB_GETTEXT,(WPARAM)pItemIDs[0],(LPARAM)szNumber);
SetDlgItemText(hwndDlg,iCtrl,szNumber);
}else{
TCHAR szMsg[256];
LoadString(g_hInst,IDS_SELECT_ONE,szMsg,255);
MessageBox(hwndDlg,szMsg,NULL,MB_OK);
}
delete pItemIDs;
//deselect all items
SendMessage(hwndList,LB_SETSEL,(WPARAM)0,(LPARAM)-1);
}
}
/*++
Routine Description :
Adds selected items from list to
IDC_RANGE edit box
Arguments :
IN HWND hwndDlg - Page handle.
Return Value :
none
--*/
void
AddSelectedRangeToControl(
HWND hwndDlg)
{
static HWND hwndList=NULL;
if(!hwndList){
hwndList=GetDlgItem(hwndDlg,IDC_VERSION_LIST);
}
int *pItemIDs;
int nItems=GetSelectedItems(hwndList,&pItemIDs);
if(nItems){
if(nItems==2){
TCHAR szNumber1[11];//assume that list contains only numbers
TCHAR szNumber2[11];
SendMessage(hwndList,LB_GETTEXT,(WPARAM)pItemIDs[0],(LPARAM)szNumber1);
SendMessage(hwndList,LB_GETTEXT,(WPARAM)pItemIDs[1],(LPARAM)szNumber2);
TCHAR szRange[24];
//versions in list are sorted, so Number1<=Number2
_tcscpy(szRange,TEXT("("));
_tcscat(szRange,szNumber1);
_tcscat(szRange,TEXT(":"));
_tcscat(szRange,szNumber2);
_tcscat(szRange,TEXT(")"));
TCHAR szCtrlText[MAX_LEN+1];
GetDlgItemText(hwndDlg,IDC_RANGE,szCtrlText,MAX_LEN);
if(_tcslen(szCtrlText)<(MAX_LEN-24)){//23+',' do not count '\0'
if(_tcslen(szCtrlText)){
_tcscat(szCtrlText,TEXT(";"));
}
_tcscat(szCtrlText,szRange);
SetDlgItemText(hwndDlg,IDC_RANGE,szCtrlText);
}
}else{
TCHAR szMsg[256];
LoadString(g_hInst,IDS_SELECT_TWO,szMsg,255);
MessageBox(hwndDlg,szMsg,NULL,MB_OK);
}
delete pItemIDs;
//deselect all items
SendMessage(hwndList,LB_SETSEL,(WPARAM)0,(LPARAM)-1);
}
}
/*++
Routine Description :
Initializes controls with values from registry.
Arguments :
IN HWND hwndDlg - Page handle.
Return Value :
none
--*/
void
InitConstraintsPage(
HWND hwndDlg)
{
//Set string size limits
HWND hwndAllow=GetDlgItem(hwndDlg,IDC_ALLOW);
HWND hwndDisallow=GetDlgItem(hwndDlg,IDC_DISALLOW);
HWND hwndHigher=GetDlgItem(hwndDlg,IDC_HIGHER);
HWND hwndLower=GetDlgItem(hwndDlg,IDC_LOWER);
HWND hwndRange=GetDlgItem(hwndDlg,IDC_RANGE);
SendMessage(hwndAllow,EM_LIMITTEXT,(WPARAM)MAX_LEN,(LPARAM)0);
SendMessage(hwndDisallow,EM_LIMITTEXT,(WPARAM)MAX_LEN,(LPARAM)0);
SendMessage(hwndHigher,EM_LIMITTEXT,(WPARAM)10,(LPARAM)0);//max number length
SendMessage(hwndLower,EM_LIMITTEXT,(WPARAM)10,(LPARAM)0);//max number length
SendMessage(hwndRange,EM_LIMITTEXT,(WPARAM)MAX_LEN,(LPARAM)0);
//Fill List of client versions
//get list from registry
TCHAR *pBuffer=NULL;
HWND hwndList=GetDlgItem(hwndDlg,IDC_VERSION_LIST);
GetRegMultiString(HKEY_USERS, szConstraintsKeyPath, KeyName[VERSIONS], &pBuffer);
if(pBuffer){
for(int i=0;pBuffer[i]!=0;i++){
SendMessage(hwndList,LB_ADDSTRING,(WPARAM)0,(LPARAM)&pBuffer[i]);
i+=_tcslen(pBuffer+i);
}
delete pBuffer;
pBuffer=NULL;
}
//#ifdef TEST
else{
//Load version numbers from string table.
TCHAR szTmp[MAX_LEN+1];
ZeroMemory(szTmp,MAX_LEN+1);
TCHAR *pszTmp=szTmp;
LoadString(g_hInst,IDS_CLIENT_VERSIONS,szTmp,MAX_LEN);
for(int i=0;szTmp[i]!=0;i++)
{
if(szTmp[i]==','){
szTmp[i]=0;
}
}
for(i=0;szTmp[i]!=0;i++){
SendMessage(hwndList,LB_ADDSTRING,(WPARAM)0,(LPARAM)&szTmp[i]);
i+=_tcslen(szTmp+i);
}
/*
TCHAR *pTmp[9]={TEXT("2031"),TEXT("2072"),TEXT("2087"),TEXT("2092"),TEXT("2099"),
TEXT("1877"),TEXT("9109"),TEXT("9165"),TEXT("9213")};
for(int i=0;i<9;i++){
SendMessage(hwndList,LB_ADDSTRING,(WPARAM)0,(LPARAM)pTmp[i]);
}*/
}
//#endif TEST
//--------------------------------------------------------------------------
//Parse constraint string
pBuffer=GetRegString(HKEY_USERS, szConstraintsKeyPath, KeyName[CONSTRAINTS]);
if(pBuffer){
for (int i = 0; i < (int)_tcslen(pBuffer); i++){
switch (pBuffer[i])
{
case '=':
// skip the case where the = sign follows a !
if (pBuffer[i-1] != '!'){
AddToControl(hwndDlg, IDC_ALLOW,i, pBuffer);
}
break;
case '<':
AddOneToControl(hwndDlg, IDC_LOWER,i, pBuffer);
break;
case '>':
AddOneToControl(hwndDlg, IDC_HIGHER,i, pBuffer);
break;
case '!':
i++; // increment past the = sign
AddToControl(hwndDlg, IDC_DISALLOW,i, pBuffer);
break;
case '(':
AddRangeToControl(hwndDlg, i, pBuffer);
break;
default:
break;
}
}
delete pBuffer;
pBuffer=NULL;
}
//--------------------------------------------------------------------------
//END "Parse constraint string"
}
/*++
Routine Description :
Adds values from constraint string to
IDC_ALLOW or IDC_DISALLOW edit box
Arguments :
IN HWND hwndDlg - Page handle.
IN int iCtrl - edit box ID.
IN,OUT int &i - reference to current position in string
IN TCHAR *szConstraints - constraint string
Return Value :
none
--*/
void
AddToControl(
HWND hwndDlg,
int iCtrl,
int &i,
TCHAR *szConstraints)
{
int index;
TCHAR szNumber[11];//max 10 digits + '\0'
TCHAR szItemText[MAX_LEN+1];
// parse a number out of the registry string
index = 0;
i++; //pass '=' or '>' or '<' or ',' symbol
while ( ( _istdigit(szConstraints[i]) || szConstraints[i] == ' ' ) &&
index < 10 )
{
if(szConstraints[i] != ' '){
szNumber[index] = szConstraints[i];
index++;
}
i++;
}
szNumber[index] = '\0';
GetDlgItemText(hwndDlg,iCtrl,szItemText,MAX_LEN);
if(_tcslen(szItemText)<=(MAX_LEN-11)){//10 digits+','
if(_tcslen(szItemText)){
_tcscat(szItemText,TEXT(","));
}
_tcscat(szItemText,szNumber);
SetDlgItemText(hwndDlg,iCtrl,szItemText);
}
if(szConstraints[i]==','){
AddToControl(hwndDlg, iCtrl, i, szConstraints);
}
}
/*++
Routine Description :
Adds values from constraint string to
IDC_HIGHER or IDC_LOWER edit box
Arguments :
IN HWND hwndDlg - Page handle.
IN int iCtrl - edit box ID.
IN,OUT int &i - reference to current position in string
IN TCHAR *szConstraints - constraint string
Return Value :
none
--*/
void
AddOneToControl(
HWND hwndDlg,
int iCtrl,
int &i,
TCHAR *szConstraints)
{
int index;
TCHAR szNumber[11];//max 10 digits + '\0'
// parse a number out of the registry string
index = 0;
i++; //pass '=' or '>' or '<' or ',' symbol
while ( ( _istdigit(szConstraints[i]) || szConstraints[i] == ' ' ) &&
index < 10 )
{
if(szConstraints[i] != ' '){
szNumber[index] = szConstraints[i];
index++;
}
i++;
}
szNumber[index] = '\0';
SetDlgItemText(hwndDlg,iCtrl,szNumber);
}
/*++
Routine Description :
Adds values from constraint string to
IDC_RANGE edit box
Arguments :
IN HWND hwndDlg - Page handle.
IN,OUT int &i - reference to current position in string
IN TCHAR *szConstraints - constraint string
Return Value :
none
--*/
void
AddRangeToControl(
HWND hwndDlg,
int &i,
TCHAR *szConstraints)
{
int index;
TCHAR szRange[24];//10+10+'('+':'+')'+'\0'
index = 0;
while (szConstraints[i] != ')' && index < 22 ){
if(szConstraints[i]!=' '){//delete all spaces
szRange[index] = szConstraints[i];
index++;
}
i++;
}
szRange[index]=')';//index max - 22
index++;
szRange[index] = '\0';//index max - 23
TCHAR szItemText[MAX_LEN+1];
GetDlgItemText(hwndDlg,IDC_RANGE,szItemText,MAX_LEN);
if(_tcslen(szItemText)<(MAX_LEN-24)){//23+',' do not count '\0'
if(_tcslen(szItemText)){
_tcscat(szItemText,TEXT(";"));
}
_tcscat(szItemText,szRange);
SetDlgItemText(hwndDlg,IDC_RANGE,szItemText);
}
}
/*++
Routine Description :
Assembles constraint string from values in edit boxes
and writes it in data structure.
Arguments :
IN HWND hwndDlg - Page handle.
LPSHAREDWIZDATA pdata - pointer to data structure
Return Value :
none
--*/
void AssembleContraints(HWND hwndDlg,LPSHAREDWIZDATA pdata)
{
TCHAR szAllow[MAX_LEN+1];
TCHAR szDisallow[MAX_LEN+1];
TCHAR szHigher[MAX_LEN+1];
TCHAR szLower[MAX_LEN+1];
TCHAR szRange[MAX_LEN+1];
GetDlgItemText(hwndDlg,IDC_ALLOW,szAllow,MAX_LEN);
GetDlgItemText(hwndDlg,IDC_DISALLOW,szDisallow,MAX_LEN);
GetDlgItemText(hwndDlg,IDC_HIGHER,szHigher,MAX_LEN);
GetDlgItemText(hwndDlg,IDC_LOWER,szLower,MAX_LEN);
GetDlgItemText(hwndDlg,IDC_RANGE,szRange,MAX_LEN);
int Size=_tcslen(szAllow)+_tcslen(szDisallow)+_tcslen(szHigher)+
_tcslen(szLower)+_tcslen(szRange)+10;//'='+'!='+'<'+'>'+4*';'+'\0'=10
pdata->pszConstraints=new TCHAR[Size];
if(pdata->pszConstraints != NULL) {
pdata->pszConstraints[0]=0;
}
else {
return;
}
if(_tcslen(szAllow)){
_tcscpy(pdata->pszConstraints,TEXT("="));
_tcscat(pdata->pszConstraints,szAllow);
}
if(_tcslen(szDisallow)){
if(_tcslen(pdata->pszConstraints)){
_tcscat(pdata->pszConstraints,TEXT(";!="));
}else{
_tcscat(pdata->pszConstraints,TEXT("!="));
}
_tcscat(pdata->pszConstraints,szDisallow);
}
if(_tcslen(szHigher)){
if(_tcslen(pdata->pszConstraints)){
_tcscat(pdata->pszConstraints,TEXT(";>"));
}else{
_tcscat(pdata->pszConstraints,TEXT(">"));
}
_tcscat(pdata->pszConstraints,szHigher);
}
if(_tcslen(szLower)){
if(_tcslen(pdata->pszConstraints)){
_tcscat(pdata->pszConstraints,TEXT(";<"));
}else{
_tcscat(pdata->pszConstraints,TEXT("<"));
}
_tcscat(pdata->pszConstraints,szLower);
}
if(_tcslen(szRange)){
if(_tcslen(pdata->pszConstraints)){
_tcscat(pdata->pszConstraints,TEXT(";"));
}
_tcscat(pdata->pszConstraints,szRange);
}
}