windows-nt/Source/XPSP1/NT/net/config/netcfg/tcpipcfg/dlgbkup.cpp
2020-09-26 16:20:57 +08:00

412 lines
11 KiB
C++

//-----------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: DLBBKUP.CPP
//
// Contents: Implementation for CIpBackUpDlg
//
// Notes: CIpBackUpDlg is the modal dialog to handle the fallback static
// TCP/IP settings
//
// Author: nsun 02/15/2000
//-----------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "tcpipobj.h"
#include "ncatlui.h"
#include "ncstl.h"
#include "ncui.h"
#include "ncreg.h"
#include "resource.h"
#include "tcpconst.h"
//#include "tcphelp.h"
#include "tcpmacro.h"
#include "tcputil.h"
#include "ncbase.h"
#include "dlgbkup.h"
#include "tcperror.h"
//
// CIpBackUpDlg
//
CIpBackUpDlg::CIpBackUpDlg (CTcpipcfg * ptcpip,
const DWORD* adwHelpIDs) :
m_ptcpip(ptcpip),
m_fModified(FALSE)
{
m_pAdapterInfo = ptcpip->GetConnectionAdapterInfo();
m_adwHelpIDs = adwHelpIDs;
}
CIpBackUpDlg::~CIpBackUpDlg()
{
}
LRESULT CIpBackUpDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled)
{
// limit the field ranges for the address fields
m_ipAddr.Create(m_hWnd, IDC_BKUP_IPADDR);
m_ipAddr.SetFieldRange(0, c_iIPADDR_FIELD_1_LOW, c_iIPADDR_FIELD_1_HIGH);
m_ipMask.Create(m_hWnd, IDC_BKUP_SUBNET);
m_ipDefGw.Create(m_hWnd, IDC_BKUP_GATEWAY);
m_ipDefGw.SetFieldRange(0, c_iIPADDR_FIELD_1_LOW, c_iIPADDR_FIELD_1_HIGH);
m_ipPrefferredDns.Create(m_hWnd, IDC_BKUP_PREF_DNS);
m_ipPrefferredDns.SetFieldRange(0, c_iIPADDR_FIELD_1_LOW, c_iIPADDR_FIELD_1_HIGH);
m_ipAlternateDns.Create(m_hWnd, IDC_BKUP_ALT_DNS);
m_ipAlternateDns.SetFieldRange(0, c_iIPADDR_FIELD_1_LOW, c_iIPADDR_FIELD_1_HIGH);
m_ipPrefferredWins.Create(m_hWnd, IDC_BKUP_WINS1);
m_ipPrefferredWins.SetFieldRange(0, c_iIPADDR_FIELD_1_LOW, c_iIPADDR_FIELD_1_HIGH);
m_ipAlternateWins.Create(m_hWnd, IDC_BKUP_WINS2);
m_ipAlternateWins.SetFieldRange(0, c_iIPADDR_FIELD_1_LOW, c_iIPADDR_FIELD_1_HIGH);
int nIdRdbutton;
if (m_pAdapterInfo->m_BackupInfo.m_fAutoNet)
{
nIdRdbutton = IDC_BKUP_RD_AUTO;
}
else
{
nIdRdbutton = IDC_BKUP_RD_USER;
}
CheckDlgButton(IDC_BKUP_RD_AUTO,
m_pAdapterInfo->m_BackupInfo.m_fAutoNet ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(IDC_BKUP_RD_USER,
m_pAdapterInfo->m_BackupInfo.m_fAutoNet ? BST_UNCHECKED : BST_CHECKED);
if (!m_pAdapterInfo->m_BackupInfo.m_fAutoNet)
{
m_ipAddr.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strIpAddr.c_str());
m_ipMask.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strSubnetMask.c_str());
m_ipDefGw.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strDefGw.c_str());
m_ipPrefferredDns.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strPreferredDns.c_str());
m_ipAlternateDns.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strAlternateDns.c_str());
m_ipPrefferredWins.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strPreferredWins.c_str());
m_ipAlternateWins.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strAlternateWins.c_str());
}
EnableControls();
m_fModified = FALSE;
return 0;
}
LRESULT CIpBackUpDlg::OnDestroyDialog(UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& fHandled)
{
return 0;
}
LRESULT CIpBackUpDlg::OnContextMenu(UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& fHandled)
{
ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs);
return 0;
}
LRESULT CIpBackUpDlg::OnHelp(UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& fHandled)
{
LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam);
Assert(lphi);
if (HELPINFO_WINDOW == lphi->iContextType)
{
ShowContextHelp(static_cast<HWND>(lphi->hItemHandle), HELP_WM_HELP,
m_adwHelpIDs);
}
return 0;
}
LRESULT CIpBackUpDlg::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
{
return 0;
}
LRESULT CIpBackUpDlg::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
{
BOOL nResult = PSNRET_NOERROR;
BOOL fError = FALSE; // Allow page to lose active status
HWND hWndFocus = 0;
// If the ip address and subnet mask on this page mismatch,
// just raise error and do not update the UI
if (m_ipAddr.IsBlank() && !m_ipMask.IsBlank())
{
NcMsgBox(m_hWnd, IDS_MSFT_TCP_TEXT, IDS_INVALID_NO_IP,
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
hWndFocus = (HWND) m_ipAddr;
fError = TRUE;
}
else if (!m_ipAddr.IsBlank() && m_ipMask.IsBlank())
{
NcMsgBox(m_hWnd, IDS_MSFT_TCP_TEXT, IDS_INVALID_NOSUBNET,
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
hWndFocus = (HWND) m_ipMask;
fError = TRUE;
}
// Now, update in memory structure
if (!fError && m_fModified)
{
UpdateInfo();
if (!m_pAdapterInfo->m_BackupInfo.m_fAutoNet)
{
IP_VALIDATION_ERR err = IsValidIpandSubnet(m_pAdapterInfo->m_BackupInfo.m_strIpAddr.c_str(),
m_pAdapterInfo->m_BackupInfo.m_strSubnetMask.c_str());
// validate IP address and subnet mask
if (ERR_NONE != err)
{
NcMsgBox(m_hWnd, IDS_MSFT_TCP_TEXT, GetIPValidationErrorMessageID(err),
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
fError = TRUE;
hWndFocus = (HWND) m_ipMask;
}
if (!fError && !IsContiguousSubnet(m_pAdapterInfo->m_BackupInfo.m_strSubnetMask.c_str()))
{
NcMsgBox(m_hWnd, IDS_MSFT_TCP_TEXT, IDS_ERROR_UNCONTIGUOUS_SUBNET,
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
fError = TRUE;
hWndFocus = (HWND) m_ipMask;
}
}
}
//we need to change focus to the control that contains invalidate data
if (fError && hWndFocus)
::SetFocus(hWndFocus);
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, fError);
return fError;
}
LRESULT CIpBackUpDlg::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
{
BOOL nResult = PSNRET_NOERROR;
if (m_fModified)
{
m_pAdapterInfo->m_fBackUpSettingChanged = TRUE;
m_ptcpip->SetSecondMemoryModified();
m_fModified = FALSE; // this page is no longer modified
}
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult);
return nResult;
}
LRESULT CIpBackUpDlg::OnIpFieldChange(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
{
LPNMIPADDRESS lpnmipa;
int iLow = c_iIpLow;
int iHigh = c_iIpHigh;
switch(idCtrl)
{
case IDC_BKUP_IPADDR:
case IDC_BKUP_GATEWAY:
case IDC_BKUP_PREF_DNS:
case IDC_BKUP_ALT_DNS:
case IDC_BKUP_WINS1:
case IDC_BKUP_WINS2:
lpnmipa = (LPNMIPADDRESS) pnmh;
if (0==lpnmipa->iField)
{
iLow = c_iIPADDR_FIELD_1_LOW;
iHigh = c_iIPADDR_FIELD_1_HIGH;
};
IpCheckRange(lpnmipa,
m_hWnd,
iLow,
iHigh,
(IDC_BKUP_IPADDR == idCtrl || IDC_BKUP_GATEWAY == idCtrl)
);
break;
case IDC_BKUP_SUBNET:
lpnmipa = (LPNMIPADDRESS) pnmh;
IpCheckRange(lpnmipa, m_hWnd, iLow, iHigh);
break;
default:
break;
}
return 0;
}
void CIpBackUpDlg::UpdateInfo()
{
m_pAdapterInfo->m_BackupInfo.m_fAutoNet = IsDlgButtonChecked(IDC_BKUP_RD_AUTO);
if (!m_pAdapterInfo->m_BackupInfo.m_fAutoNet)
{
GetIpCtrlAddress(m_ipAddr, &m_pAdapterInfo->m_BackupInfo.m_strIpAddr);
GetIpCtrlAddress(m_ipMask, &m_pAdapterInfo->m_BackupInfo.m_strSubnetMask);
GetIpCtrlAddress(m_ipDefGw, &m_pAdapterInfo->m_BackupInfo.m_strDefGw);
GetIpCtrlAddress(m_ipPrefferredDns, &m_pAdapterInfo->m_BackupInfo.m_strPreferredDns);
GetIpCtrlAddress(m_ipAlternateDns, &m_pAdapterInfo->m_BackupInfo.m_strAlternateDns);
GetIpCtrlAddress(m_ipPrefferredWins, &m_pAdapterInfo->m_BackupInfo.m_strPreferredWins);
GetIpCtrlAddress(m_ipAlternateWins, &m_pAdapterInfo->m_BackupInfo.m_strAlternateWins);
}
}
LRESULT CIpBackUpDlg::OnAutoNet(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled)
{
switch(wNotifyCode)
{
case BN_CLICKED:
case BN_DOUBLECLICKED:
EnableControls();
break;
}
return 0;
}
LRESULT CIpBackUpDlg::OnUseConfig(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled)
{
switch(wNotifyCode)
{
case BN_CLICKED:
case BN_DOUBLECLICKED:
EnableControls();
break;
}
return 0;
}
LRESULT CIpBackUpDlg::OnIpctrl(WORD wNotifyCode, WORD wID,
HWND hWndCtl, BOOL& fHandled)
{
switch (wNotifyCode)
{
case EN_CHANGE:
PageModified();
break;
}
return 0;
}
LRESULT CIpBackUpDlg::OnIpAddrSub(WORD wNotifyCode, WORD wID,
HWND hWndCtl, BOOL& fHandled)
{
switch (wNotifyCode)
{
case EN_CHANGE:
PageModified();
break;
case EN_SETFOCUS:
// if the subnet mask is blank, create a mask and insert it into
// the control
if (!m_ipAddr.IsBlank() && m_ipMask.IsBlank())
{
tstring strSubnetMask;
tstring strIpAddress;
m_ipAddr.GetAddress(&strIpAddress);
// generate the mask and update the control, and internal structure
GenerateSubnetMask(m_ipAddr, &strSubnetMask);
m_ipMask.SetAddress(strSubnetMask.c_str());
ReplaceFirstAddress(&(m_pAdapterInfo->m_vstrSubnetMask),
strSubnetMask.c_str());
}
break;
}
return 0;
}
void CIpBackUpDlg::EnableControls()
{
BOOL fEnableUserConfig = !IsDlgButtonChecked(IDC_BKUP_RD_AUTO);
::EnableWindow(GetDlgItem(IDC_BKUP_IPADDR_TEXT), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_IPADDR), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_SUBNET_TEXT), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_SUBNET), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_GATEWAY_TEXT), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_GATEWAY), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_PREF_DNS_TEXT), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_PREF_DNS), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_ALT_DNS_TEXT), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_ALT_DNS), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_WINS1_TEXT), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_WINS1), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_WINS2_TEXT), fEnableUserConfig);
::EnableWindow(GetDlgItem(IDC_BKUP_WINS2), fEnableUserConfig);
if (fEnableUserConfig)
{
m_ipAddr.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strIpAddr.c_str());
m_ipMask.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strSubnetMask.c_str());
m_ipDefGw.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strDefGw.c_str());
m_ipPrefferredDns.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strPreferredDns.c_str());
m_ipAlternateDns.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strAlternateDns.c_str());
m_ipPrefferredWins.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strPreferredWins.c_str());
m_ipAlternateWins.SetAddress(m_pAdapterInfo->m_BackupInfo.m_strAlternateWins.c_str());
}
else
{
m_ipAddr.ClearAddress();
m_ipMask.ClearAddress();
m_ipDefGw.ClearAddress();
m_ipPrefferredDns.ClearAddress();
m_ipAlternateDns.ClearAddress();
m_ipPrefferredWins.ClearAddress();
m_ipAlternateWins.ClearAddress();
}
}
void CIpBackUpDlg::GetIpCtrlAddress(IpControl & IpCtrl, tstring * pstr)
{
Assert(pstr);
if (IpCtrl.IsBlank())
{
*pstr = c_szEmpty;
}
else
{
IpCtrl.GetAddress(pstr);
}
}