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