windows-nt/Source/XPSP1/NT/termsrv/clcreator/servconn.c

989 lines
27 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
SERVCONN.C
Abstract:
Show server connection configuration dialog box
Author:
Bob Watson (a-robw)
Revision History:
17 Feb 94 Written
--*/
//
// Windows Include Files
//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <tchar.h> // unicode macros
#include <commdlg.h> // common dialog defines
#include <lmcons.h> // lanman API constant definitions
#include <lmserver.h> // server info API's
//
// app include files
//
#include "otnboot.h"
#include "otnbtdlg.h"
//
#define IP_CHARLIMIT 15
//
#define NCDU_BROWSE_DEST_PATH (WM_USER + 101)
//
// Local data structures
//
typedef struct _NETWORK_PROTOCOL_NAMES {
UINT nDisplayName;
UINT nTransportName;
DWORD dwTransportNameLength;
BOOL bLoaded;
int nListBoxEntry;
} NETWORK_PROTOCOL_NAMES, *PNETWORK_PROTOCOL_NAMES;
//
// static data
//
static NETWORK_PROTOCOL_NAMES NetProtocolList[] = {
{CSZ_NW_LINK_PROTOCOL, NCDU_NW_LINK_TRANSPORT, 0, FALSE, CB_ERR},
{CSZ_TCP_IP_PROTOCOL, NCDU_TCP_IP_TRANSPORT, 0, FALSE, CB_ERR},
{CSZ_NETBEUI_PROTOCOL, NCDU_NETBEUI_TRANSPORT, 0, FALSE, CB_ERR},
// "terminating" entry in array
{0, 0, 0, FALSE, CB_ERR}
};
static
LPCTSTR
GetDefaultDomain (
)
/*++
Routine Description:
Returns the domain the system is logged in to from the registry.
Arguments:
None
Return Value:
pointer to domain name string if successful or pointer to an
empty strin if not.
--*/
{
DWORD dwBufLen;
DWORD dwDomainLen;
static TCHAR szDomainName[32];
TCHAR szUserName[MAX_USERNAME + 1];
PSID pSid;
SID_NAME_USE snu;
szDomainName[0] = 0;
dwBufLen = MAX_USERNAME;
if (GetUserName(szUserName, &dwBufLen)) {
pSid = (PSID)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
if (pSid != NULL) {
dwBufLen = (DWORD)GlobalSize(pSid);
dwDomainLen = sizeof (szDomainName) / sizeof(TCHAR);
LookupAccountName (
NULL, // Local system
szUserName, // username to look up
pSid, // SID buffer
&dwBufLen, // SID buffer size
szDomainName, // return buffer for domain name
&dwDomainLen, // size of buffer
&snu);
FREE_IF_ALLOC(pSid);
}
}
return szDomainName;
}
static
LPCTSTR
GetDefaultUsername (
)
/*++
Routine Description:
Returns the user name of the account running the app
Arguments:
None
Return Value:
pointer to user name string if successful or pointer to an empty
string if not.
--*/
{
DWORD dwBufLen;
static TCHAR szUserName[32];
szUserName[0] = 0;
dwBufLen = sizeof(szUserName) / sizeof(TCHAR); // compute # of chars
GetUserName(szUserName, &dwBufLen);
return szUserName;
}
static
LPCTSTR
MakeIpAddrString (
IN USHORT IpAddr[]
)
/*++
Routine Description:
formats integer array into an address string for display
Arguments:
IP Address info structure
Return Value:
pointer to formatted IP address string if successful or pointer to
an empty string if not.
--*/
{
static TCHAR szAddrBuffer[32];
szAddrBuffer[0] = 0;
_stprintf (szAddrBuffer, fmtIpAddr,
IpAddr[0], IpAddr[1], IpAddr[2], IpAddr[3]);
return szAddrBuffer;
}
static
LONG
ListNetworkTransports (
IN HWND hwndDlg,
IN LPTSTR szServerName
)
/*++
Routine Description:
reads the registry and builds a list of the network protocols that are
supported on the selected server and loads the combo box with all
possible transports.
Arguments:
IN HWND hwndDlg
handle to dialog box window
IN LPTSTR szServerName
server to validate protocols on
Return Value:
ERROR_SUCCESS if successful or WIN32 error value if not
--*/
{
DWORD dwIndex;
BOOL bDefaultFound;
DWORD dwSumOfEntries;
DWORD dwEntriesRead;
DWORD dwTotalEntries;
DWORD dwResumeHandle;
LONG lStatus = ERROR_SUCCESS;
PNETWORK_PROTOCOL_NAMES pThisNetProtocol;
PSERVER_TRANSPORT_INFO_0 pSrvrTransportInfo;
PSERVER_TRANSPORT_INFO_0 pThisSrvrTransport;
NET_API_STATUS netStatus;
pSrvrTransportInfo = (PSERVER_TRANSPORT_INFO_0)GlobalAlloc(GPTR, MEDIUM_BUFFER_SIZE);
if (pSrvrTransportInfo == NULL) {
return ERROR_OUTOFMEMORY;
}
// initialize static data
for (pThisNetProtocol = &NetProtocolList[0];
pThisNetProtocol->nDisplayName != 0;
pThisNetProtocol = &pThisNetProtocol[1]) {
pThisNetProtocol->dwTransportNameLength =
lstrlen (GetStringResource (pThisNetProtocol->nTransportName));
pThisNetProtocol->bLoaded = FALSE;
pThisNetProtocol->nListBoxEntry = CB_ERR;
}
// build list of available network transports on server
dwEntriesRead = 0L;
dwSumOfEntries = 0L;
dwTotalEntries = 0xFFFFFFFF;
dwResumeHandle = 0L;
while (dwSumOfEntries != dwTotalEntries) {
netStatus = NetServerTransportEnum (
szServerName,
0L,
(LPBYTE *)&pSrvrTransportInfo,
MEDIUM_BUFFER_SIZE,
&dwEntriesRead,
&dwTotalEntries,
&dwResumeHandle);
if (netStatus == NO_ERROR) {
dwSumOfEntries += dwEntriesRead;
for (dwIndex = 0; dwIndex < dwEntriesRead; dwIndex++) {
pThisSrvrTransport = &pSrvrTransportInfo[dwIndex];
for (pThisNetProtocol = &NetProtocolList[0];
pThisNetProtocol->nDisplayName != 0;
pThisNetProtocol = &pThisNetProtocol[1]) {
if (_tcsnicmp (GetStringResource(pThisNetProtocol->nTransportName),
pThisSrvrTransport->svti0_transportname,
pThisNetProtocol->dwTransportNameLength) == 0) {
if (lstrcmp (pThisSrvrTransport->svti0_networkaddress,
cszZeroNetAddress) != 0) {
pThisNetProtocol->bLoaded = TRUE;
break;
}
}
}
}
} else {
// bail out of loop if an error is encountered
break;
}
}
// so all the supported protocols have been identified here, now
// reload the combo box.
bDefaultFound = FALSE;
dwIndex = 0;
// empty the combo box
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
CB_RESETCONTENT, 0, 0);
for (pThisNetProtocol = &NetProtocolList[0];
pThisNetProtocol->nDisplayName != 0;
pThisNetProtocol = &pThisNetProtocol[1]) {
// load combo box with each "transports"
pThisNetProtocol->nListBoxEntry = (int)SendDlgItemMessage (hwndDlg,
NCDU_PROTOCOL_COMBO_BOX, CB_ADDSTRING, (WPARAM)0,
(LPARAM)GetStringResource (pThisNetProtocol->nDisplayName));
if (!bDefaultFound) {
if (pThisNetProtocol->bLoaded) {
bDefaultFound = TRUE;
dwIndex = (DWORD)pThisNetProtocol->nListBoxEntry;
}
}
}
// select default entry
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
CB_SETCURSEL, (WPARAM)dwIndex, 0);
FREE_IF_ALLOC(pSrvrTransportInfo);
return lStatus;
}
static
BOOL
LoadIpAddrArray (
IN LPCTSTR szIpString,
OUT USHORT nAddrItem[]
)
/*++
Routine Description:
Parses the display string into the IP address array
Arguments:
IN LPCTSTR szIpString
input string to parse
OUT USHORT nAddrItem[]
array to receive the address elements. Element 0 is the
left-most element in the display string.
Return Value:
TRUE if parsed successfully
FALSE if error
--*/
{
int nArgs;
int nThisArg;
DWORD dw[4];
nArgs = _stscanf (szIpString, fmtIpAddrParse,
&dw[0], &dw[1], &dw[2], &dw[3]);
if (nArgs == 4) {
for (nThisArg = 0; nThisArg < nArgs; nThisArg++) {
if (dw[nThisArg] > 255) {
// bad value
return FALSE;
} else {
// valid so copy the low byte of the value since that's
// all that's allowed for an IP address or mask
nAddrItem[nThisArg] = (USHORT)(dw[nThisArg] & 0x000000FF);
}
}
} else {
return FALSE;
}
return TRUE;
}
static
VOID
SetTcpIpWindowState (
IN HWND hwndDlg
)
/*++
Routine Description:
enables the IP address fields when TCP/IP protocol is enabled and
disabled the IP address fields when it is not selected.
Arguments:
IN HWND hwndDlg
handle to the dialog box window
Return Value:
NONE
--*/
{
LPTSTR szProtocol;
int nComboItem;
BOOL bFrameState, bAddrState;
szProtocol = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
if (szProtocol == NULL) return;
nComboItem = (int)SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
CB_GETCURSEL, 0, 0);
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_GETLBTEXT,
(WPARAM)nComboItem, (LPARAM)szProtocol);
if (_tcsnicmp(szProtocol, cszTcpKey, lstrlen(cszTcpKey)) == 0) {
bFrameState = TRUE;
if (IsDlgButtonChecked(hwndDlg, NCDU_USE_DHCP) == CHECKED) {
bAddrState = FALSE;
} else {
bAddrState = TRUE;
}
} else {
bFrameState = FALSE;
bAddrState = FALSE;
}
EnableWindow (GetDlgItem(hwndDlg,NCDU_USE_DHCP), bFrameState);
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_IP_ADDR_LABEL), bAddrState);
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_IP_ADDR), bAddrState);
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_SUBNET_LABEL), bAddrState);
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_SUBNET_MASK), bAddrState);
EnableWindow (GetDlgItem(hwndDlg,NCDU_DEFAULT_GATEWAY_LABEL), bFrameState);
EnableWindow (GetDlgItem(hwndDlg,NCDU_DEFAULT_GATEWAY), bFrameState);
EnableWindow (GetDlgItem(hwndDlg,NCDU_TCPIP_INFO_FRAME), bFrameState);
FREE_IF_ALLOC (szProtocol);
}
static
BOOL
ComputeDefaultDefaultGateway (
IN HWND hwndDlg
)
/*++
Routine Description:
Generates a default value for the default gateway using the
IP address and Sub Net mask
Arguments:
Handle to the dialog box window
Return Value:
TRUE if a default value was entered,
FALSE if not
--*/
{
TCHAR szIpAddr[IP_CHARLIMIT+1];
TCHAR szSubNet[IP_CHARLIMIT+1];
TCHAR szDefGate[IP_CHARLIMIT+1];
USHORT usIpArray[4], usSnArray[4], usDgArray[4];
// if not initialized, then preset to
// default value
GetDlgItemText (hwndDlg, NCDU_FLOPPY_IP_ADDR, szIpAddr, IP_CHARLIMIT);
if (LoadIpAddrArray(szIpAddr, &usIpArray[0])) {
GetDlgItemText (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, szSubNet, IP_CHARLIMIT);
if (LoadIpAddrArray(szSubNet, &usSnArray[0])) {
GetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY, szDefGate, IP_CHARLIMIT);
if (LoadIpAddrArray(szDefGate, &usDgArray[0])) {
if ((usDgArray[0] == 0) &&
(usDgArray[1] == 0) &&
(usDgArray[2] == 0) &&
(usDgArray[3] == 0)) {
usDgArray[0] = usIpArray[0] & usSnArray[0];
usDgArray[1] = usIpArray[1] & usSnArray[1];
usDgArray[2] = usIpArray[2] & usSnArray[2];
usDgArray[3] = usIpArray[3] & usSnArray[3];
SetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY,
MakeIpAddrString(&usDgArray[0]));
return TRUE; // value updated
}
}
}
}
return FALSE; // value not updated
}
static
BOOL
ServerConnDlg_WM_INITDIALOG (
IN HWND hwndDlg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Processes the WM_INITDIALOG windows message by initializing the
display fields in the dialog box and setting focus to the first
entry field
Arguments:
IN HWND hwndDlg
Handle to the dialog box window
IN WPARAM wParam
Not Used
IN LPARAM lParam
Not Used
Return Value:
FALSE
--*/
{
LONG lProtocolNdx;
LPTSTR szServerArg;
LPTSTR szServerName;
LPTSTR szPathOnServer;
szServerName = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
szPathOnServer = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
if ((szServerName == NULL) ||
(szPathOnServer == NULL)) {
SetLastError (ERROR_OUTOFMEMORY);
EndDialog (hwndDlg, (int)WM_CLOSE);
return FALSE;
}
RemoveMaximizeFromSysMenu (hwndDlg);
PositionWindow (hwndDlg);
// get name of server with client tree
lstrcpy (szServerName, cszDoubleBackslash);
if (!GetNetPathInfo (pAppInfo->szDistPath,
&szServerName[2], szPathOnServer)) {
// unable to look up server, so use local path
szServerArg = NULL;
} else {
szServerArg = szServerName;
}
ListNetworkTransports (hwndDlg, szServerArg);
// select current protocol (if any)
if (*pAppInfo->piFloppyProtocol.szName != 0) {
lProtocolNdx = (LONG)SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_FINDSTRING,
(WPARAM)0, (LPARAM)pAppInfo->piFloppyProtocol.szName);
if (lProtocolNdx == CB_ERR) {
// selection not found so apply default
lProtocolNdx = 0;
}
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_SETCURSEL,
(WPARAM)lProtocolNdx, 0);
}
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_USERNAME, EM_LIMITTEXT, MAX_USERNAME, 0);
if (pAppInfo->szUsername[0] == 0) {
SetDlgItemText (hwndDlg, NCDU_FLOPPY_USERNAME, GetDefaultUsername());
} else {
SetDlgItemText (hwndDlg, NCDU_FLOPPY_USERNAME, pAppInfo->szUsername);
}
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME, EM_LIMITTEXT, MAX_COMPUTERNAME_LENGTH, 0);
SetDlgItemText (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME, pAppInfo->szComputerName);
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_DOMAIN, EM_LIMITTEXT, MAX_DOMAINNAME, 0);
if (pAppInfo->szDomain[0] == 0) {
SetDlgItemText (hwndDlg, NCDU_FLOPPY_DOMAIN, GetDefaultDomain());
} else {
SetDlgItemText (hwndDlg, NCDU_FLOPPY_DOMAIN, pAppInfo->szDomain);
}
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_IP_ADDR, EM_LIMITTEXT, (WPARAM)IP_CHARLIMIT, 0);
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, EM_LIMITTEXT, (WPARAM)IP_CHARLIMIT, 0);
SetDlgItemText (hwndDlg, NCDU_FLOPPY_IP_ADDR, MakeIpAddrString(&pAppInfo->tiTcpIpInfo.IpAddr[0]));
SetDlgItemText (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, MakeIpAddrString(&pAppInfo->tiTcpIpInfo.SubNetMask[0]));
SetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY, MakeIpAddrString(&pAppInfo->tiTcpIpInfo.DefaultGateway[0]));
if (pAppInfo->bUseDhcp) {
CheckDlgButton (hwndDlg, NCDU_USE_DHCP, CHECKED);
} else {
CheckDlgButton (hwndDlg, NCDU_USE_DHCP, UNCHECKED);
}
SendDlgItemMessage (hwndDlg, NCDU_TARGET_DRIVEPATH, EM_LIMITTEXT,
(WPARAM)(MAX_PATH-1), (LPARAM)0);
if (*pAppInfo->szBootFilesPath == 0) {
SetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, cszADriveRoot);
} else {
SetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, pAppInfo->szBootFilesPath);
}
SetTcpIpWindowState (hwndDlg);
SetFocus (GetDlgItem(hwndDlg, NCDU_FLOPPY_COMPUTER_NAME));
// clear old Dialog and register current
PostMessage (GetParent(hwndDlg), NCDU_CLEAR_DLG, (WPARAM)hwndDlg, IDOK);
PostMessage (GetParent(hwndDlg), NCDU_REGISTER_DLG,
NCDU_SERVER_CFG_DLG, (LPARAM)hwndDlg);
FREE_IF_ALLOC(szServerName);
FREE_IF_ALLOC(szPathOnServer);
return FALSE;
}
static
BOOL
ServerConnDlg_IDOK (
IN HWND hwndDlg
)
/*++
Routine Description:
Processes the OK button command by validating the entries and
storing them in the global application data structure. If an
invalid value is detected a message box is displayed and the
focus is set to the offending field, otherwise, the dialog
box is terminated.
Arguments:
IN HWND hwndDlg
Handle to the dialog box window
Return Value:
FALSE
--*/
{
int nComboItem;
int nMbResult;
TCHAR szIp[IP_CHARLIMIT*2];
MEDIA_TYPE mtDest;
BOOL bProtocolLoaded;
PNETWORK_PROTOCOL_NAMES pThisNetProtocol;
// save settings
GetDlgItemText (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME, pAppInfo->szComputerName, MAX_COMPUTERNAME_LENGTH);
TrimSpaces (pAppInfo->szComputerName);
// see if there is a string...signal if no entry
if (lstrlen(pAppInfo->szComputerName) == 0) {
DisplayMessageBox (
hwndDlg,
NCDU_INVALID_MACHINENAME,
0,
MB_OK_TASK_EXCL);
SetFocus (GetDlgItem (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME));
return TRUE;
}
GetDlgItemText (hwndDlg, NCDU_FLOPPY_USERNAME, pAppInfo->szUsername, MAX_USERNAME);
TrimSpaces (pAppInfo->szUsername);
GetDlgItemText (hwndDlg, NCDU_FLOPPY_DOMAIN, pAppInfo->szDomain, MAX_DOMAINNAME);
TrimSpaces (pAppInfo->szDomain);
nComboItem = (int)SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
CB_GETCURSEL, 0, 0);
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_GETLBTEXT,
(WPARAM)nComboItem, (LPARAM)pAppInfo->piFloppyProtocol.szName);
// look up keyname from protocol name
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszTcpKey, lstrlen(cszTcpKey)) == 0) {
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszTcpIpEntry);
} else if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszNetbeuiKey, lstrlen(cszNetbeuiKey)) == 0) {
AddMessageToExitList (pAppInfo, NCDU_NETBEUI_NOT_ROUT);
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszNetbeuiEntry);
} else if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszIpxKey, lstrlen(cszIpxKey)) == 0) {
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszIpxEntry);
} else {
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszEmptyString);
}
// see if this protocol is supported by the server
bProtocolLoaded = FALSE;
for (pThisNetProtocol = &NetProtocolList[0];
pThisNetProtocol->nDisplayName != 0;
pThisNetProtocol = &pThisNetProtocol[1]) {
// load combo box with "transports"
if (pThisNetProtocol->nListBoxEntry == nComboItem) {
if (pThisNetProtocol->bLoaded) {
bProtocolLoaded = TRUE;
}
}
}
if (!bProtocolLoaded) {
nMbResult = DisplayMessageBox (hwndDlg,
NCDU_UNSUP_PROTOCOL,
0,
MB_OKCANCEL_TASK_EXCL);
if (nMbResult != IDOK) {
return TRUE;
}
}
//
// Get target drive and path
//
GetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, pAppInfo->szBootFilesPath, MAX_PATH);
TrimSpaces (pAppInfo->szBootFilesPath);
mtDest = GetDriveTypeFromPath(pAppInfo->szBootFilesPath);
if (mtDest == Unknown) {
nMbResult = DisplayMessageBox (
hwndDlg,
NCDU_NO_MEDIA,
0,
MB_OKCANCEL_TASK_EXCL);
switch (nMbResult) {
case IDOK:
break;
case IDCANCEL:
// they want to go back to the dialog and insert a disk so bail out
return TRUE;
}
} else if (mtDest != pAppInfo->mtBootDriveType) {
nMbResult = DisplayMessageBox (
hwndDlg,
NCDU_DEST_NOT_FLOPPY,
0,
MB_OKCANCEL_TASK_EXCL);
switch (nMbResult) {
case IDOK:
break;
case IDCANCEL:
// they want to go back to the dialog so bail out
SetFocus (GetDlgItem(hwndDlg, NCDU_TARGET_DRIVEPATH));
return TRUE;
}
}
if (IsDlgButtonChecked(hwndDlg, NCDU_USE_DHCP) == CHECKED) {
pAppInfo->bUseDhcp = TRUE;
pAppInfo->tiTcpIpInfo.IpAddr[0] = 0;
pAppInfo->tiTcpIpInfo.IpAddr[1] = 0;
pAppInfo->tiTcpIpInfo.IpAddr[2] = 0;
pAppInfo->tiTcpIpInfo.IpAddr[3] = 0;
pAppInfo->tiTcpIpInfo.SubNetMask[0] = 0;
pAppInfo->tiTcpIpInfo.SubNetMask[1] = 0;
pAppInfo->tiTcpIpInfo.SubNetMask[2] = 0;
pAppInfo->tiTcpIpInfo.SubNetMask[3] = 0;
PostMessage (GetParent(hwndDlg), NCDU_SHOW_CONFIRM_DLG, 0, 0);
} else {
pAppInfo->bUseDhcp = FALSE;
GetDlgItemText (hwndDlg, NCDU_FLOPPY_IP_ADDR, szIp, (IP_CHARLIMIT *2));
if (LoadIpAddrArray(szIp, &pAppInfo->tiTcpIpInfo.IpAddr[0])) {
GetDlgItemText (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, szIp, (IP_CHARLIMIT *2));
if (LoadIpAddrArray(szIp, &pAppInfo->tiTcpIpInfo.SubNetMask[0])) {
GetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY, szIp, (IP_CHARLIMIT *2));
if (LoadIpAddrArray(szIp, &pAppInfo->tiTcpIpInfo.DefaultGateway[0])) {
PostMessage (GetParent(hwndDlg), NCDU_SHOW_CONFIRM_DLG, 0, 0);
} else {
// bad Default Gateway
DisplayMessageBox (
hwndDlg,
NCDU_BAD_DEFAULT_GATEWAY,
0,
MB_OK_TASK_EXCL);
SetFocus (GetDlgItem (hwndDlg, NCDU_DEFAULT_GATEWAY));
SendDlgItemMessage (hwndDlg, NCDU_DEFAULT_GATEWAY, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
}
} else {
// bad Subnet Mask
DisplayMessageBox (
hwndDlg,
NCDU_BAD_SUBNET_MASK,
0,
MB_OK_TASK_EXCL);
SetFocus (GetDlgItem (hwndDlg, NCDU_FLOPPY_SUBNET_MASK));
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
}
} else {
// bad IP
DisplayMessageBox (
hwndDlg,
NCDU_BAD_IP_ADDR,
0,
MB_OK_TASK_EXCL);
SetFocus (GetDlgItem (hwndDlg, NCDU_FLOPPY_IP_ADDR));
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_IP_ADDR, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
}
}
return FALSE;
}
static
BOOL
ServerConnDlg_WM_COMMAND (
IN HWND hwndDlg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Dispatches to the correct routine based on the user input.
Enables/disables the TCP/IP address info fields when
the Protocol is changed
Ends the dialog box if Cancel is selected
Dispatches to the IDOK function if OK selected.
Arguments:
IN HWND hwndDlg
Handle to dialog box window
IN WPARAM wParam
LOWORD contains the ID of the control issuing the command
IN LPARAM lParam
Not used
Return Value:
FALSE if processed
TRUE if not processed
--*/
{
switch (LOWORD(wParam)) {
case NCDU_USE_DHCP:
case NCDU_PROTOCOL_COMBO_BOX:
SetTcpIpWindowState (hwndDlg);
return TRUE;
case NCDU_BROWSE:
PostMessage (hwndDlg, NCDU_BROWSE_DEST_PATH, 0, 0);
return TRUE;
case IDCANCEL:
PostMessage (GetParent(hwndDlg), NCDU_SHOW_TARGET_WS_DLG, 0, 0);
return TRUE;
case NCDU_DEFAULT_GATEWAY:
if (HIWORD(wParam) == EN_SETFOCUS) {
ComputeDefaultDefaultGateway (hwndDlg);
return TRUE;
} else {
return FALSE;
}
case IDOK: return ServerConnDlg_IDOK(hwndDlg);
case NCDU_SERVER_CONN_CFG_HELP:
switch (HIWORD(wParam)) {
case BN_CLICKED:
// return ShowAppHelp (hwndDlg, LOWORD(wParam));
return PostMessage (GetParent(hwndDlg), WM_HOTKEY,
(WPARAM)NCDU_HELP_HOT_KEY, 0);
default:
return FALSE;
}
default: return FALSE;
}
}
static
BOOL
ServerConnDlg_NCDU_BROWSE_DEST_PATH (
IN HWND hwndDlg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Displays the file /dir browser to enter the destination path entry
Arguments:
IN HWND hwndDlg
Handle to dialog box window
IN WPARAM wParam
Not Used
IN LPARAM lParam
Not Used
Return Value:
FALSE
--*/
{
DB_DATA BrowseInfo;
TCHAR szTempPath[MAX_PATH+1];
GetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, szTempPath, MAX_PATH);
BrowseInfo.dwTitle = NCDU_BROWSE_COPY_DEST_PATH;
BrowseInfo.szPath = szTempPath;
BrowseInfo.Flags = PDB_FLAGS_NOCHECKDIR;
if (DialogBoxParam (
(HINSTANCE)GetWindowLongPtr(hwndDlg, GWLP_HINSTANCE),
MAKEINTRESOURCE(NCDU_DIR_BROWSER),
hwndDlg,
DirBrowseDlgProc,
(LPARAM)&BrowseInfo) == IDOK) {
SetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, szTempPath);
}
SetFocus( GetDlgItem(hwndDlg, NCDU_TARGET_DRIVEPATH));
return TRUE;
}
static
BOOL
ServerConnDlg_NCDU_WM_NCDESTROY (
IN HWND hwndDlg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
return TRUE;
}
INT_PTR CALLBACK
ServerConnDlgProc (
IN HWND hwndDlg,
IN UINT message,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Dialog box procedure for the Server connection configuration dialog
box. The following windows messages are processed by this
function:
WM_INITDIALOG: Dialog box initialization
WM_COMMAND: user input
WM_NCDESTROY: to free memory before leaving
all other messages are sent to the default dialog box proc.
Arguments:
Standard WNDPROC arguments
Return Value:
FALSE if message not processed by this module, otherwise the
value returned by the dispatched routine.
--*/
{
switch (message) {
case WM_INITDIALOG: return (ServerConnDlg_WM_INITDIALOG (hwndDlg, wParam, lParam));
case WM_COMMAND: return (ServerConnDlg_WM_COMMAND (hwndDlg, wParam, lParam));
case NCDU_BROWSE_DEST_PATH:
return (ServerConnDlg_NCDU_BROWSE_DEST_PATH (hwndDlg, wParam, lParam));
case WM_PAINT: return (Dlg_WM_PAINT (hwndDlg, wParam, lParam));
case WM_MOVE: return (Dlg_WM_MOVE (hwndDlg, wParam, lParam));
case WM_SYSCOMMAND: return (Dlg_WM_SYSCOMMAND (hwndDlg, wParam, lParam));
case WM_NCDESTROY: return (ServerConnDlg_NCDU_WM_NCDESTROY (hwndDlg, wParam, lParam));
default: return FALSE;
}
}