412 lines
11 KiB
C++
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);
|
|
}
|
|
} |