Windows2003-3790/inetcore/connectionwizard/inetcfg/tcpui.cpp
2020-09-30 16:53:55 +02:00

504 lines
14 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1994 **
//*********************************************************************
//
// TCPUI.C - Functions for Wizard TCP/IP pages
//
//
// HISTORY:
//
// 1/9/95 jeremys Created.
// 96/03/10 markdu Made all TCP/IP stuff be per-connectoid.
// 96/03/11 markdu Set RASEO_ flags for ip and dns addresses.
// 96/03/22 markdu Remove IP setup from LAN path.
// 96/03/23 markdu Remove all LAN path leftovers.
// 96/03/23 markdu Removed ReadTCPIPSettings.
// 96/03/25 markdu If a fatal error occurs, set gfQuitWizard.
// 96/03/26 markdu Store values from UI even when back is pressed.
// 96/04/04 markdu Added pfNeedsRestart to WarnIfServerBound
// 96/04/06 markdu Moved CommitConfigurationChanges call to last page.
// 96/05/06 markdu NASH BUG 15637 Removed unused code.
// 96/05/14 markdu NASH BUG 22681 Took out mail and news pages.
// 96/05/16 markdu NASH BUG 21810 Perform same IP address validation as RNA.
//
#include "wizard.h"
#include "icwextsn.h"
#include "icwaprtc.h"
#include "imnext.h"
VOID EnableDNSAddressControls(HWND hDlg);
VOID EnableIPControls(HWND hDlg);
VOID DisplayInvalidIPAddrMsg(HWND hDlg,UINT uCtrl,TCHAR * pszAddr);
/*******************************************************************
NAME: EnableIPControls
SYNOPSIS: If "Use DHCP" is checked, disables controls for
specific IP selection; if not, enables them.
********************************************************************/
VOID EnableIPControls(HWND hDlg)
{
BOOL fDHCP = IsDlgButtonChecked(hDlg,IDC_USE_DHCP);
EnableDlgItem(hDlg,IDC_IP_ADDR_LABEL,!fDHCP);
EnableDlgItem(hDlg,IDC_IPADDR,!fDHCP);
EnableDlgItem(hDlg,IDC_TX_IPADDR,!fDHCP);
}
/*******************************************************************
NAME: IPAddressInitProc
SYNOPSIS: Called when IP address page is displayed
ENTRY: hDlg - dialog window
fFirstInit - TRUE if this is the first time the dialog
is initialized, FALSE if this InitProc has been called
before (e.g. went past this page and backed up)
********************************************************************/
BOOL CALLBACK IPAddressInitProc(HWND hDlg,BOOL fFirstInit)
{
TCHAR szAddr[IP_ADDRESS_LEN+1];
if (fFirstInit)
{
// limit IP address control text lengths
SendDlgItemMessage(hDlg,IDC_IPADDR,EM_LIMITTEXT,IP_ADDRESS_LEN,0L);
}
// check either the "use DHCP" or "use specific IP" buttons.
// if IP address is set to 0.0.0.0, that means use DHCP.
// (The "0.0.0.0 == DHCP" convention is used by the TCP/IP
// VxDs, we might as well play along.)
BOOL fDHCP = (gpRasEntry->dwfOptions & RASEO_SpecificIpAddr) ? FALSE : TRUE;
CheckDlgButton(hDlg,(IDC_USE_DHCP),fDHCP);
CheckDlgButton(hDlg,(IDC_USE_IP),!fDHCP);
// set the IP address in dialog control
// 11/25/96 jmazner Normandy #10222
// don't use return value of DwFromIa as basis of deciding whether or
// not to fill in IP address field; rely only on the SpecificIPAddr flag.
//if ((gpRasEntry->dwfOptions & RASEO_SpecificIpAddr) &&
// DwFromIa(&gpRasEntry->ipaddr))
if (gpRasEntry->dwfOptions & RASEO_SpecificIpAddr)
{
IPLongToStr(DwFromIa(&gpRasEntry->ipaddr),
szAddr,sizeof(szAddr));
SetDlgItemText(hDlg,IDC_IPADDR,szAddr);
}
else
{
SetDlgItemText(hDlg,IDC_IPADDR,szNull);
}
// enable IP address controls appropriately
EnableIPControls(hDlg);
return TRUE;
}
/*******************************************************************
NAME: IPAddressOKProc
SYNOPSIS: Called when Next or Back btns pressed from IP address page
ENTRY: hDlg - dialog window
EXIT: returns TRUE to allow page to be turned, FALSE
to keep the same page.
********************************************************************/
BOOL CALLBACK IPAddressOKProc(HWND hDlg)
{
ASSERT(puNextPage);
// check the radio buttons to determine if DHCP or not
BOOL fDHCP = IsDlgButtonChecked(hDlg,IDC_USE_DHCP);
if (fDHCP)
{
// for DHCP, set IP address to 0.0.0.0
CopyDw2Ia(0, &gpRasEntry->ipaddr);
// Turn off Specific IP address flag
gpRasEntry->dwfOptions &= ~RASEO_SpecificIpAddr;
}
else
{
TCHAR szAddr[IP_ADDRESS_LEN+1];
DWORD dwAddr;
// get IP address
GetDlgItemText(hDlg,IDC_IPADDR,szAddr,ARRAYSIZE(szAddr));
if (!lstrlen(szAddr))
{
// IP address field is blank, warn user and stay on this page
DisplayFieldErrorMsg(hDlg,IDC_IPADDR,IDS_NEED_IPADDR);
return FALSE;
}
//
// 5/17/97 jmazner Olympus #137
// check for DBCS chars.
//
#if !defined(WIN16)
if (!IsSBCSString(szAddr))
{
DisplayFieldErrorMsg(hDlg,IDC_IPADDR,IDS_SBCSONLY);
return FALSE;
}
#endif
// convert text to numeric address
if (IPStrToLong(szAddr,&dwAddr))
{
CopyDw2Ia(dwAddr, &gpRasEntry->ipaddr);
// 96/05/16 markdu NASH BUG 21810 Perform same IP address validation as RNA.
/* if (!FValidIa(&gpRasEntry->ipaddr))
{
// IP address field is invalid, warn user and stay on this page
DisplayInvalidIPAddrMsg(hDlg,IDC_IPADDR,szAddr);
return FALSE;
}
*/
}
else
{
// conversion failed, the string is not valid
DisplayInvalidIPAddrMsg(hDlg,IDC_IPADDR,szAddr);
return FALSE;
}
// Turn on Specific IP address flag
gpRasEntry->dwfOptions |= RASEO_SpecificIpAddr;
}
return TRUE;
}
/*******************************************************************
NAME: IPAddressCmdProc
SYNOPSIS: Called when dlg control pressed on IP address page
ENTRY: hDlg - dialog window
uCtrlID - control ID of control that was touched
EXIT: returns TRUE to allow page to be turned, FALSE
to keep the same page.
********************************************************************/
BOOL CALLBACK IPAddressCmdProc(HWND hDlg,UINT uCtrlID)
{
switch (uCtrlID) {
case IDC_USE_DHCP:
case IDC_USE_IP:
// if radio buttons pushed, enable IP controls appropriately
EnableIPControls(hDlg);
break;
}
return TRUE;
}
/*******************************************************************
NAME: EnableDNSAddressControls
SYNOPSIS: If static DNS address is checked, enable controls to
enter DNS addresses. If not, disable them.
********************************************************************/
VOID EnableDNSAddressControls(HWND hDlg)
{
BOOL fEnable = IsDlgButtonChecked(hDlg,IDC_STATIC_DNS);
EnableDlgItem(hDlg,IDC_DNSADDR1,fEnable);
EnableDlgItem(hDlg,IDC_DNSADDR2,fEnable);
EnableDlgItem(hDlg,IDC_TX_DNSADDR1,fEnable);
EnableDlgItem(hDlg,IDC_TX_DNSADDR2,fEnable);
EnableDlgItem(hDlg,IDC_PRIM_LABEL,fEnable);
EnableDlgItem(hDlg,IDC_SEC_LABEL,fEnable);
}
/*******************************************************************
NAME: DNSAddressInitProc
SYNOPSIS: Called when DNS page is displayed
ENTRY: hDlg - dialog window
fFirstInit - TRUE if this is the first time the dialog
is initialized, FALSE if this InitProc has been called
before (e.g. went past this page and backed up)
********************************************************************/
BOOL CALLBACK DNSAddressInitProc(HWND hDlg,BOOL fFirstInit)
{
if (fFirstInit)
{
// if file server is bound to instance of TCP/IP that will be
// used to access the internet, warn user and remove
BOOL fTemp;
WarnIfServerBound(hDlg, INSTANCE_PPPDRIVER, &fTemp);
if (TRUE == fTemp)
{
gpWizardState->fNeedReboot = TRUE;
}
// limit DNS address control text lengths
SendDlgItemMessage(hDlg,IDC_DNSADDR1,EM_LIMITTEXT,IP_ADDRESS_LEN,0L);
SendDlgItemMessage(hDlg,IDC_DNSADDR2,EM_LIMITTEXT,IP_ADDRESS_LEN,0L);
// set radio buttons
CheckDlgButton(hDlg,IDC_AUTO_DNS,gpUserInfo->fAutoDNS);
CheckDlgButton(hDlg,IDC_STATIC_DNS,!gpUserInfo->fAutoDNS);
}
TCHAR szAddr[IP_ADDRESS_LEN+1];
// set primary DNS server
// 11/25/96 jmazner Normandy #10222
// don't use return value of DwFromIa as basis of deciding whether or
// not to fill in IP address field; rely only on the SpecificNameServers flag.
//if ((gpRasEntry->dwfOptions & RASEO_SpecificNameServers) &&
// DwFromIa(&gpRasEntry->ipaddrDns))
if (gpRasEntry->dwfOptions & RASEO_SpecificNameServers)
{
IPLongToStr(DwFromIa(&gpRasEntry->ipaddrDns),
szAddr,sizeof(szAddr));
SetDlgItemText(hDlg,IDC_DNSADDR1,szAddr);
}
else
{
SetDlgItemText(hDlg,IDC_DNSADDR1,szNull);
}
// set backup DNS server
// 11/25/96 jmazner Normandy #10222
//if ((gpRasEntry->dwfOptions & RASEO_SpecificNameServers) &&
// DwFromIa(&gpRasEntry->ipaddrDnsAlt))
if (gpRasEntry->dwfOptions & RASEO_SpecificNameServers)
{
IPLongToStr(DwFromIa(&gpRasEntry->ipaddrDnsAlt),
szAddr,sizeof(szAddr));
SetDlgItemText(hDlg,IDC_DNSADDR2,szAddr);
}
else
{
SetDlgItemText(hDlg,IDC_DNSADDR2,szNull);
}
EnableDNSAddressControls(hDlg);
return TRUE;
}
/*******************************************************************
NAME: DNSAddressOKProc
SYNOPSIS: Called when Next or Back btns pressed from DNS address page
ENTRY: hDlg - dialog window
fForward - TRUE if 'Next' was pressed, FALSE if 'Back'
puNextPage - if 'Next' was pressed,
proc can fill this in with next page to go to. This
parameter is ingored if 'Back' was pressed.
pfKeepHistory - page will not be kept in history if
proc fills this in with FALSE.
EXIT: returns TRUE to allow page to be turned, FALSE
to keep the same page.
********************************************************************/
BOOL CALLBACK DNSAddressOKProc(HWND hDlg)
{
ASSERT(puNextPage);
UINT uServers = 0;
TCHAR szAddr[IP_ADDRESS_LEN+1];
DWORD dwAddr;
gpUserInfo->fAutoDNS = IsDlgButtonChecked(hDlg, IDC_AUTO_DNS);
if (gpUserInfo->fAutoDNS)
{
// Turn off Specific Name servers address flag
gpRasEntry->dwfOptions &= ~RASEO_SpecificNameServers;
}
else
{
// get primary DNS server address
GetDlgItemText(hDlg,IDC_DNSADDR1,szAddr,ARRAYSIZE(szAddr));
if (lstrlen(szAddr))
{
//
// 5/17/97 jmazner Olympus #137
// check for DBCS chars.
//
#if !defined(WIN16)
if (!IsSBCSString(szAddr))
{
DisplayFieldErrorMsg(hDlg,IDC_DNSADDR1,IDS_SBCSONLY);
return FALSE;
}
#endif
// convert text to numeric address
if (IPStrToLong(szAddr,&dwAddr))
{
CopyDw2Ia(dwAddr, &gpRasEntry->ipaddrDns);
// 96/05/16 markdu NASH BUG 21810 Perform same IP address validation as RNA.
/* if (!FValidIaOrZero(&gpRasEntry->ipaddrDns))
{
// DNS address field is invalid, warn user and stay on this page
DisplayInvalidIPAddrMsg(hDlg,IDC_DNSADDR1,szAddr);
return FALSE;
}
*/
}
else
{
// conversion failed, the string is not valid
DisplayInvalidIPAddrMsg(hDlg,IDC_DNSADDR1,szAddr);
return FALSE;
}
uServers++;
}
else
{
CopyDw2Ia(0, &gpRasEntry->ipaddrDns);
}
// get alternate DNS server address
GetDlgItemText(hDlg,IDC_DNSADDR2,szAddr,ARRAYSIZE(szAddr));
if (lstrlen(szAddr))
{
//
// 5/17/97 jmazner Olympus #137
// check for DBCS chars.
//
#if !defined(WIN16)
if (!IsSBCSString(szAddr))
{
DisplayFieldErrorMsg(hDlg,IDC_DNSADDR2,IDS_SBCSONLY);
return FALSE;
}
#endif
// convert text to numeric address
if (IPStrToLong(szAddr,&dwAddr))
{
CopyDw2Ia(dwAddr, &gpRasEntry->ipaddrDnsAlt);
// 96/05/16 markdu NASH BUG 21810 Perform same IP address validation as RNA.
/* if (!FValidIaOrZero(&gpRasEntry->ipaddrDnsAlt))
{
// DNS address field is invalid, warn user and stay on this page
DisplayInvalidIPAddrMsg(hDlg,IDC_DNSADDR2,szAddr);
return FALSE;
}
*/
}
else
{
// conversion failed, the string is not valid
DisplayInvalidIPAddrMsg(hDlg,IDC_DNSADDR2,szAddr);
return FALSE;
}
uServers++;
}
else
{
CopyDw2Ia(0, &gpRasEntry->ipaddrDnsAlt);
}
if (uServers)
{
// Turn on Specific name servers
gpRasEntry->dwfOptions |= RASEO_SpecificNameServers;
}
else
{
// no DNS servers entered, warn user (but let her proceed if
// she really wants to)
if (!WarnFieldIsEmpty(hDlg,IDC_DNSADDR1,IDS_WARN_EMPTY_DNS))
return FALSE; // user heeded warning, stay on this page
// Turn off Specific Name servers address flag
gpRasEntry->dwfOptions &= ~RASEO_SpecificNameServers;
}
}
return TRUE;
}
/*******************************************************************
NAME: DNSAddressCmdProc
SYNOPSIS: Called when dlg control pressed on DNS address page
ENTRY: hDlg - dialog window
uCtrlID - control ID of control that was touched
EXIT: returns TRUE to allow page to be turned, FALSE
to keep the same page.
********************************************************************/
BOOL CALLBACK DNSAddressCmdProc(HWND hDlg,UINT uCtrlID)
{
switch (uCtrlID) {
case IDC_AUTO_DNS:
case IDC_STATIC_DNS:
// if radio buttons pushed, enable IP controls appropriately
EnableDNSAddressControls(hDlg);
break;
}
return TRUE;
}
/*******************************************************************
NAME: DisplayInvalidIPAddrMsg
SYNOPSIS: Displays a message that the address the user typed
is invalid and adds a tip on who to contact if they
don't know what address to type
********************************************************************/
VOID DisplayInvalidIPAddrMsg(HWND hDlg,UINT uCtrl,TCHAR * pszAddr)
{
MsgBoxParam(hDlg,IDS_INVALID_IPADDR,MB_ICONINFORMATION,MB_OK,
pszAddr);
SetFocus(GetDlgItem(hDlg,uCtrl));
SendDlgItemMessage(hDlg,uCtrl,EM_SETSEL,0,-1);
}