|
|
/*
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; }
|