windows-nt/Source/XPSP1/NT/net/rras/ras/ui/rassrvui/ipxui.c

301 lines
11 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
File ipxui.c
Dialog that edits the ipx properties.
Paul Mayfield, 10/9/97
*/
#include "rassrv.h"
// Help maps
static const DWORD phmIpxui[] =
{
CID_NetTab_Ipxui_RB_AutoAssign, IDH_NetTab_Ipxui_RB_AutoAssign,
CID_NetTab_Ipxui_RB_ManualAssign, IDH_NetTab_Ipxui_RB_ManualAssign,
CID_NetTab_Ipxui_CB_AssignSame, IDH_NetTab_Ipxui_CB_AssignSame,
CID_NetTab_Ipxui_EB_Netnum, IDH_NetTab_Ipxui_EB_Netnum,
//CID_NetTab_Ipxui_ST_Network, IDH_NetTab_Ipxui_ST_Network,
CID_NetTab_Ipxui_CB_CallerSpec, IDH_NetTab_Ipxui_CB_CallerSpec,
//CID_NetTab_Ipxui_CB_ExposeNetwork, IDH_NetTab_Ipxui_CB_ExposeNetwork,
0, 0
};
void IpxUiDisplayError(HWND hwnd, DWORD dwErr) {
ErrDisplayError(hwnd, dwErr, ERR_IPXPROP_CATAGORY, 0, Globals.dwErrorData);
}
// Enables/disables windows in the dialog box depending
// on the ipx parameters
DWORD IpxEnableWindows(HWND hwndDlg, IPX_PARAMS * pIpxParams) {
// If auto assign is selected, disable address and global wan fields
EnableWindow(GetDlgItem(hwndDlg, CID_NetTab_Ipxui_EB_Netnum), !pIpxParams->bAutoAssign);
//EnableWindow(GetDlgItem(hwndDlg, CID_NetTab_Ipxui_CB_AssignSame), !pIpxParams->bAutoAssign);
return NO_ERROR;
}
// Adjusts the label that determines whether internal net numbers
// are automatically assigned.
DWORD IpxAdjustNetNumberLabel(HWND hwndDlg, BOOL bGlobalWan) {
PWCHAR pszManAssignLabel, pszAutoAssignLabel;
// Modify the net num label according to the global wan setting
if (bGlobalWan) {
pszManAssignLabel =
(PWCHAR) PszLoadString(Globals.hInstDll, SID_NETWORKNUMBERLABEL);
pszAutoAssignLabel =
(PWCHAR) PszLoadString(Globals.hInstDll, SID_AUTO_NETNUM_LABEL);
}
else {
pszManAssignLabel =
(PWCHAR) PszLoadString(Globals.hInstDll, SID_STARTNETNUMLABEL);
pszAutoAssignLabel =
(PWCHAR) PszLoadString(Globals.hInstDll, SID_AUTO_NETNUMS_LABEL);
}
SetWindowTextW(GetDlgItem(hwndDlg, CID_NetTab_Ipxui_RB_ManualAssign), pszManAssignLabel);
SetWindowTextW(GetDlgItem(hwndDlg, CID_NetTab_Ipxui_RB_AutoAssign), pszAutoAssignLabel);
return NO_ERROR;
}
#define isBetween(b,a,c) ((b >= a) && (b <= c))
// Filters characters that can be edited into an ipx net number control
BOOL IpxValidNetNumberChar(WCHAR wcNumChar) {
return (iswdigit(wcNumChar) ||
isBetween(wcNumChar, (WCHAR)'A', (WCHAR)'F') ||
isBetween(wcNumChar, (WCHAR)'a', (WCHAR)'f') );
}
// Returns TRUE if buf points to a valid ipx net number (8 digit hex)
// Otherwise returns FALSE and puts a corrected version of the number
// in pszCorrect. pszCorrect will always contain the correct version.
BOOL IpxValidNetNumber(PWCHAR pszNum, PWCHAR pszCorrect) {
BOOL cFlag = TRUE;
int i, j=0, len = (int) wcslen(pszNum);
// Validate the name
if (len > 8) {
lstrcpynW(pszCorrect, pszNum, 8);
pszCorrect[8] = (WCHAR)0;
return FALSE;
}
// Validate the characters
for (i = 0; i < len; i++) {
if (IpxValidNetNumberChar(pszNum[i]))
pszCorrect[j++] = pszNum[i];
else
cFlag = FALSE;
}
pszCorrect[j] = (WCHAR)0;
return cFlag;
}
// We subclass the ipx address text fields so that they don't
// allow bogus values to be typed.
LRESULT CALLBACK IpxNetNumProc (HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam) {
WNDPROC wProc = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (uMsg == WM_CHAR) {
if ((wParam != VK_BACK) && (!IpxValidNetNumberChar((WCHAR)wParam)))
return FALSE;
}
return CallWindowProc(wProc, hwnd, uMsg, wParam, lParam);
}
// Initializes the Ipx Properties Dialog
DWORD IpxInitDialog(HWND hwndDlg, LPARAM lParam) {
WCHAR pszAddr[16];
IPX_PARAMS * pIpxParams = (IPX_PARAMS *)(((PROT_EDIT_DATA*)lParam)->pbData);
ULONG_PTR pOldWndProc;
HWND hwndEdit;
// Store the parameters with the window handle
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
// Subclass the edit control(s)
hwndEdit = GetDlgItem(hwndDlg, CID_NetTab_Ipxui_EB_Netnum);
pOldWndProc = SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, (LONG_PTR)IpxNetNumProc);
SetWindowLongPtr(hwndEdit, GWLP_USERDATA, (LONG_PTR)pOldWndProc);
// Set the network exposure check
SendDlgItemMessage(hwndDlg,
CID_NetTab_Ipxui_CB_ExposeNetwork,
BM_SETCHECK,
(((PROT_EDIT_DATA*)lParam)->bExpose) ? BST_CHECKED : BST_UNCHECKED,
0);
// Set the address assignmnet radio buttons
SendDlgItemMessage(hwndDlg,
CID_NetTab_Ipxui_RB_AutoAssign,
BM_SETCHECK,
(pIpxParams->bAutoAssign) ? BST_CHECKED : BST_UNCHECKED,
0);
// Set the address assignmnet radio buttons
SendDlgItemMessage(hwndDlg,
CID_NetTab_Ipxui_RB_ManualAssign,
BM_SETCHECK,
(pIpxParams->bAutoAssign) ? BST_UNCHECKED : BST_CHECKED,
0);
// Set the "allow caller to request an ipx node number" check
SendDlgItemMessage(hwndDlg,
CID_NetTab_Ipxui_CB_CallerSpec,
BM_SETCHECK,
(pIpxParams->bCaller) ? BST_CHECKED : BST_UNCHECKED,
0);
// Set the global wan number check
SendDlgItemMessage(hwndDlg,
CID_NetTab_Ipxui_CB_AssignSame,
BM_SETCHECK,
(pIpxParams->bGlobalWan) ? BST_CHECKED : BST_UNCHECKED,
0);
// Set the maximum amount of text that can be entered into the edit control
SendDlgItemMessage(hwndDlg, CID_NetTab_Ipxui_EB_Netnum, EM_SETLIMITTEXT , 8, 0);
// Set the text of the ip addresses
wsprintfW(pszAddr, L"%x", pIpxParams->dwIpxAddress);
SetDlgItemTextW(hwndDlg, CID_NetTab_Ipxui_EB_Netnum, pszAddr);
// Enable/disable windows as per the settings
IpxEnableWindows(hwndDlg, pIpxParams);
IpxAdjustNetNumberLabel(hwndDlg, pIpxParams->bGlobalWan);
return NO_ERROR;
}
// Gets the settings from the ui and puts them into
// the ipx parameter structure.
DWORD IpxGetUISettings(HWND hwndDlg, PROT_EDIT_DATA * pEditData) {
IPX_PARAMS * pIpxParams = (IPX_PARAMS *) pEditData->pbData;
WCHAR pszAddr[10];
GetDlgItemTextW(hwndDlg, CID_NetTab_Ipxui_EB_Netnum, pszAddr, 10);
pIpxParams->dwIpxAddress = wcstoul(pszAddr, (WCHAR)NULL, 16);
// A configuration that specificies a wan net pool begining with
// zero or 0xffffffff is illegal. Force the user to enter a
// valid config
if ((!pIpxParams->bAutoAssign) &&
((pIpxParams->dwIpxAddress == 0x0) ||
(pIpxParams->dwIpxAddress == 0xFFFFFFFF)))
{
IpxUiDisplayError(hwndDlg, ERR_IPX_BAD_POOL_CONFIG);
return ERROR_CAN_NOT_COMPLETE;
}
pEditData->bExpose = SendDlgItemMessage(hwndDlg, CID_NetTab_Ipxui_CB_ExposeNetwork, BM_GETCHECK, 0, 0) == BST_CHECKED;
return NO_ERROR;
}
// Dialog proc that governs the ipx settings dialog
INT_PTR CALLBACK IpxSettingsDialogProc (HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam) {
switch (uMsg) {
case WM_INITDIALOG:
IpxInitDialog(hwndDlg, lParam);
return FALSE;
case WM_HELP:
case WM_CONTEXTMENU:
{
RasSrvHelp (hwndDlg, uMsg, wParam, lParam, phmIpxui);
break;
}
case WM_DESTROY:
// Cleanup the work done at WM_INITDIALOG
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0);
break;
case WM_COMMAND:
{
IPX_PARAMS * pIpxParams = (IPX_PARAMS *)(((PROT_EDIT_DATA*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA))->pbData);
switch (wParam) {
case IDOK:
if (IpxGetUISettings(hwndDlg, (PROT_EDIT_DATA*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA)) == NO_ERROR)
EndDialog(hwndDlg, 1);
break;
case IDCANCEL:
EndDialog(hwndDlg, 0);
break;
case CID_NetTab_Ipxui_RB_AutoAssign:
pIpxParams->bAutoAssign = TRUE;
IpxEnableWindows(hwndDlg, pIpxParams);
break;
case CID_NetTab_Ipxui_RB_ManualAssign:
pIpxParams->bAutoAssign = FALSE;
IpxEnableWindows(hwndDlg, pIpxParams);
break;
case CID_NetTab_Ipxui_CB_CallerSpec:
pIpxParams->bCaller = (BOOL)SendDlgItemMessage(hwndDlg,
CID_NetTab_Ipxui_CB_CallerSpec,
BM_GETCHECK,
0,
0);
break;
case CID_NetTab_Ipxui_CB_AssignSame:
pIpxParams->bGlobalWan = (BOOL)SendDlgItemMessage(hwndDlg,
CID_NetTab_Ipxui_CB_AssignSame,
BM_GETCHECK,
0,
0);
IpxAdjustNetNumberLabel(hwndDlg, pIpxParams->bGlobalWan);
break;
}
// Adjust the values written to the ipx address edit control
if (HIWORD(wParam) == EN_UPDATE) {
WCHAR wbuf[10], wcorrect[10];
POINT pt;
GetWindowTextW((HWND)lParam, wbuf, 10);
if (!IpxValidNetNumber(wbuf, wcorrect)) {
GetCaretPos(&pt);
SetWindowTextW((HWND)lParam, wcorrect);
SetCaretPos(pt.x, pt.y);
}
}
break;
}
}
return FALSE;
}
// Edits tcp ip protocol properties
DWORD IpxEditProperties(HWND hwndParent, PROT_EDIT_DATA * pEditData, BOOL * pbCommit) {
DWORD dwErr;
int ret;
// Popup the dialog box
ret = (int) DialogBoxParam(Globals.hInstDll,
MAKEINTRESOURCE(DID_NetTab_Ipxui),
hwndParent,
IpxSettingsDialogProc,
(LPARAM)pEditData);
if (ret == -1) {
IpxUiDisplayError(hwndParent, ERR_IPX_CANT_DISPLAY);
}
// If ok was pressed, save off the new settings
*pbCommit = FALSE;
if (ret && ret != -1)
*pbCommit = TRUE;
return NO_ERROR;
}