787 lines
22 KiB
C++
787 lines
22 KiB
C++
|
//-----------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1997.
|
||
|
//
|
||
|
// File: T C P W I N S . C P P
|
||
|
//
|
||
|
// Contents: CTcpWinsPage implementation
|
||
|
//
|
||
|
// Notes: The "WINS Address" page
|
||
|
//
|
||
|
// Author: tongl 12 Nov 1997
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
|
||
|
#include "pch.h"
|
||
|
#pragma hdrstop
|
||
|
#include "ncatlui.h"
|
||
|
#include "ncstl.h"
|
||
|
#include "ncui.h"
|
||
|
#include "ncmisc.h"
|
||
|
#include "tcpconst.h"
|
||
|
#include "tcpipobj.h"
|
||
|
#include "resource.h"
|
||
|
#include "tcpmacro.h"
|
||
|
#include "dlgaddr.h"
|
||
|
#include "dlgwins.h"
|
||
|
|
||
|
#include "tcpconst.h"
|
||
|
#include "tcputil.h"
|
||
|
#include "tcphelp.h"
|
||
|
|
||
|
#define MAX_WINS_SERVER 12
|
||
|
#define MAX_RAS_WINS_SERVER 2
|
||
|
|
||
|
CTcpWinsPage::CTcpWinsPage( CTcpipcfg * ptcpip,
|
||
|
CTcpAddrPage * pTcpAddrPage,
|
||
|
ADAPTER_INFO * pAdapterDlg,
|
||
|
GLOBAL_INFO * pGlbDlg,
|
||
|
const DWORD * adwHelpIDs)
|
||
|
{
|
||
|
// Save everything passed to us
|
||
|
Assert(ptcpip != NULL);
|
||
|
m_ptcpip = ptcpip;
|
||
|
|
||
|
Assert(pTcpAddrPage != NULL);
|
||
|
m_pParentDlg = pTcpAddrPage;
|
||
|
|
||
|
Assert(pAdapterDlg != NULL);
|
||
|
m_pAdapterInfo = pAdapterDlg;
|
||
|
|
||
|
Assert(pGlbDlg != NULL);
|
||
|
m_pglb = pGlbDlg;
|
||
|
|
||
|
m_adwHelpIDs = adwHelpIDs;
|
||
|
|
||
|
// Initialize internal states
|
||
|
m_fModified = FALSE;
|
||
|
m_fLmhostsFileReset = FALSE;
|
||
|
|
||
|
WCHAR* pch;
|
||
|
|
||
|
// gives double NULL by default
|
||
|
ZeroMemory(m_szFilter, sizeof(m_szFilter));
|
||
|
ZeroMemory(&m_ofn, sizeof(m_ofn));
|
||
|
wsprintfW(m_szFilter, L"%s|%s", (PCWSTR)SzLoadIds(IDS_COMMONDLG_TEXT), L"*.*");
|
||
|
|
||
|
// replace '|' with NULL, required by common dialog
|
||
|
pch = m_szFilter;
|
||
|
while ((pch = wcschr(pch, '|')) != NULL)
|
||
|
*pch++ = L'\0';
|
||
|
|
||
|
m_ofn.lStructSize = sizeof(OPENFILENAME);
|
||
|
m_ofn.hInstance = _Module.GetModuleInstance();
|
||
|
m_ofn.lpstrFilter = m_szFilter;
|
||
|
m_ofn.nFilterIndex = 1L;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnInitDialog(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
// Initialize the Wins address listbox
|
||
|
m_fEditState = FALSE;
|
||
|
|
||
|
// Cache hwnds
|
||
|
m_hServers.m_hList = GetDlgItem(IDC_WINS_SERVER_LIST);
|
||
|
m_hServers.m_hAdd = GetDlgItem(IDC_WINS_ADD);
|
||
|
m_hServers.m_hEdit = GetDlgItem(IDC_WINS_EDIT);
|
||
|
m_hServers.m_hRemove = GetDlgItem(IDC_WINS_REMOVE);
|
||
|
m_hServers.m_hUp = GetDlgItem(IDC_WINS_UP);
|
||
|
m_hServers.m_hDown = GetDlgItem(IDC_WINS_DOWN);
|
||
|
|
||
|
// Set the up\down arrow icons
|
||
|
SendDlgItemMessage(IDC_WINS_UP, BM_SETIMAGE, IMAGE_ICON,
|
||
|
reinterpret_cast<LPARAM>(g_hiconUpArrow));
|
||
|
SendDlgItemMessage(IDC_WINS_DOWN, BM_SETIMAGE, IMAGE_ICON,
|
||
|
reinterpret_cast<LPARAM>(g_hiconDownArrow));
|
||
|
|
||
|
// Get the Service address Add and Edit button Text and remove ellipse
|
||
|
WCHAR szAddServer[16];
|
||
|
|
||
|
GetDlgItemText(IDC_WINS_ADD, szAddServer, celems(szAddServer));
|
||
|
|
||
|
szAddServer[lstrlenW(szAddServer) - c_cchRemoveCharatersFromEditOrAddButton] = 0;
|
||
|
m_strAddServer = szAddServer;
|
||
|
|
||
|
// Initialize controls on this page
|
||
|
// WINS server list box
|
||
|
int nResult= LB_ERR;
|
||
|
for(VSTR_ITER iterWinsServer = m_pAdapterInfo->m_vstrWinsServerList.begin() ;
|
||
|
iterWinsServer != m_pAdapterInfo->m_vstrWinsServerList.end() ;
|
||
|
++iterWinsServer)
|
||
|
{
|
||
|
nResult = Tcp_ListBox_InsertString(m_hServers.m_hList, -1,
|
||
|
(*iterWinsServer)->c_str());
|
||
|
}
|
||
|
|
||
|
// set slection to first item
|
||
|
if (nResult >= 0)
|
||
|
{
|
||
|
Tcp_ListBox_SetCurSel(m_hServers.m_hList, 0);
|
||
|
}
|
||
|
|
||
|
SetButtons(m_hServers,
|
||
|
(m_pAdapterInfo->m_fIsRasFakeAdapter) ? MAX_RAS_WINS_SERVER : MAX_WINS_SERVER);
|
||
|
|
||
|
// Enable LMHosts lookup ?
|
||
|
CheckDlgButton(IDC_WINS_LOOKUP, m_pglb->m_fEnableLmHosts);
|
||
|
::EnableWindow(GetDlgItem(IDC_WINS_LMHOST), m_pglb->m_fEnableLmHosts);
|
||
|
|
||
|
// Enable NetBt ?
|
||
|
CheckDlgButton( IDC_RAD_ENABLE_NETBT,
|
||
|
(c_dwEnableNetbios == m_pAdapterInfo->m_dwNetbiosOptions));
|
||
|
|
||
|
CheckDlgButton( IDC_RAD_DISABLE_NETBT,
|
||
|
(c_dwDisableNetbios == m_pAdapterInfo->m_dwNetbiosOptions));
|
||
|
|
||
|
CheckDlgButton( IDC_RAD_UNSET_NETBT,
|
||
|
(c_dwUnsetNetbios == m_pAdapterInfo->m_dwNetbiosOptions));
|
||
|
|
||
|
if (m_pAdapterInfo->m_fIsRasFakeAdapter)
|
||
|
{
|
||
|
//if this is a ras connection, disable the default Netbt option since it
|
||
|
//doesn't apply to RAS connections
|
||
|
::EnableWindow(GetDlgItem(IDC_RAD_UNSET_NETBT), FALSE);
|
||
|
::EnableWindow(GetDlgItem(IDC_STATIC_DEFALUT_NBT), FALSE);
|
||
|
|
||
|
//this is a ras connection and a non-admin user, disable all the controls
|
||
|
//for globl settings
|
||
|
if (m_pParentDlg->m_fRasNotAdmin)
|
||
|
{
|
||
|
::EnableWindow(GetDlgItem(IDC_WINS_STATIC_GLOBAL), FALSE);
|
||
|
::EnableWindow(GetDlgItem(IDC_WINS_LOOKUP), FALSE);
|
||
|
::EnableWindow(GetDlgItem(IDC_WINS_LMHOST), FALSE);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnContextMenu(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::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 CTcpWinsPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
||
|
{
|
||
|
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, 0);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
||
|
{
|
||
|
BOOL nResult = PSNRET_NOERROR;
|
||
|
|
||
|
// server list
|
||
|
FreeCollectionAndItem(m_pAdapterInfo->m_vstrWinsServerList);
|
||
|
int nCount = Tcp_ListBox_GetCount(m_hServers.m_hList);
|
||
|
|
||
|
WCHAR szBuf[IP_LIMIT];
|
||
|
|
||
|
for (int i = 0; i < nCount; i++)
|
||
|
{
|
||
|
#ifdef DBG
|
||
|
int len = Tcp_ListBox_GetTextLen(m_hServers.m_hList, i);
|
||
|
Assert(len != LB_ERR && len < IP_LIMIT);
|
||
|
#endif
|
||
|
|
||
|
Tcp_ListBox_GetText(m_hServers.m_hList, i, szBuf);
|
||
|
m_pAdapterInfo->m_vstrWinsServerList.push_back(new tstring(szBuf));
|
||
|
}
|
||
|
|
||
|
// save checkbox states
|
||
|
m_pglb->m_fEnableLmHosts = IsDlgButtonChecked(IDC_WINS_LOOKUP);
|
||
|
|
||
|
// pass the info back to its parent dialog
|
||
|
m_pParentDlg->m_fPropShtOk = TRUE;
|
||
|
|
||
|
if(!m_pParentDlg->m_fPropShtModified)
|
||
|
m_pParentDlg->m_fPropShtModified = IsModified();
|
||
|
|
||
|
m_pParentDlg->m_fLmhostsFileReset = m_fLmhostsFileReset;
|
||
|
|
||
|
// reset status
|
||
|
SetModifiedTo(FALSE); // this page is no longer modified
|
||
|
|
||
|
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult);
|
||
|
return nResult;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnQueryCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
||
|
{
|
||
|
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, FALSE);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// WINS server related controls
|
||
|
LRESULT CTcpWinsPage::OnAddServer(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
m_fEditState = FALSE;
|
||
|
|
||
|
CWinsServerDialog DlgSrv(this, g_aHelpIDs_IDD_WINS_SERVER);
|
||
|
|
||
|
if (DlgSrv.DoModal() == IDOK)
|
||
|
{
|
||
|
int nCount = Tcp_ListBox_GetCount(m_hServers.m_hList);
|
||
|
int idx = Tcp_ListBox_InsertString(m_hServers.m_hList,
|
||
|
-1,
|
||
|
m_strNewIpAddress.c_str());
|
||
|
Assert(idx>=0);
|
||
|
if (idx >= 0)
|
||
|
{
|
||
|
PageModified();
|
||
|
|
||
|
Tcp_ListBox_SetCurSel(m_hServers.m_hList, idx);
|
||
|
SetButtons(m_hServers,
|
||
|
(m_pAdapterInfo->m_fIsRasFakeAdapter) ? MAX_RAS_WINS_SERVER : MAX_WINS_SERVER);
|
||
|
|
||
|
// empty strings, this removes the saved address from RemoveIP
|
||
|
m_strNewIpAddress = L"";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnEditServer(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
m_fEditState = TRUE;
|
||
|
|
||
|
|
||
|
Assert(Tcp_ListBox_GetCount(m_hServers.m_hList));
|
||
|
|
||
|
int idx = Tcp_ListBox_GetCurSel(m_hServers.m_hList);
|
||
|
Assert(idx >= 0);
|
||
|
|
||
|
CWinsServerDialog DlgSrv(this, g_aHelpIDs_IDD_WINS_SERVER, idx);
|
||
|
|
||
|
// save off the removed address and delete if from the listbox
|
||
|
if (idx >= 0)
|
||
|
{
|
||
|
WCHAR buf[IP_LIMIT];
|
||
|
|
||
|
Assert(Tcp_ListBox_GetTextLen(m_hServers.m_hList, idx) < celems(buf));
|
||
|
Tcp_ListBox_GetText(m_hServers.m_hList, idx, buf);
|
||
|
|
||
|
m_strNewIpAddress = buf; // used by dialog to display what to edit
|
||
|
|
||
|
if (DlgSrv.DoModal() == IDOK)
|
||
|
{
|
||
|
// replace the item in the listview with the new information
|
||
|
Tcp_ListBox_DeleteString(m_hServers.m_hList, idx);
|
||
|
|
||
|
PageModified();
|
||
|
|
||
|
m_strMovingEntry = m_strNewIpAddress;
|
||
|
ListBoxInsertAfter(m_hServers.m_hList, idx, m_strMovingEntry.c_str());
|
||
|
|
||
|
Tcp_ListBox_SetCurSel(m_hServers.m_hList, idx);
|
||
|
|
||
|
m_strNewIpAddress = buf; // restore the original removed address
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// empty strings, this removes the saved address from RemoveIP
|
||
|
m_strNewIpAddress = L"";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnRemoveServer(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
int idx = Tcp_ListBox_GetCurSel(m_hServers.m_hList);
|
||
|
|
||
|
Assert(idx >=0);
|
||
|
|
||
|
if (idx >=0)
|
||
|
{
|
||
|
WCHAR buf[IP_LIMIT];
|
||
|
|
||
|
Assert(Tcp_ListBox_GetTextLen(m_hServers.m_hList, idx) < celems(buf));
|
||
|
Tcp_ListBox_GetText(m_hServers.m_hList, idx, buf);
|
||
|
|
||
|
m_strNewIpAddress = buf;
|
||
|
Tcp_ListBox_DeleteString(m_hServers.m_hList, idx);
|
||
|
|
||
|
PageModified();
|
||
|
|
||
|
// select a new item
|
||
|
int nCount;
|
||
|
|
||
|
if ((nCount = Tcp_ListBox_GetCount(m_hServers.m_hList)) != LB_ERR)
|
||
|
{
|
||
|
// select the previous item in the list
|
||
|
if (idx)
|
||
|
--idx;
|
||
|
|
||
|
Tcp_ListBox_SetCurSel(m_hServers.m_hList, idx);
|
||
|
}
|
||
|
SetButtons(m_hServers,
|
||
|
(m_pAdapterInfo->m_fIsRasFakeAdapter) ? MAX_RAS_WINS_SERVER : MAX_WINS_SERVER);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnServerUp(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
Assert(m_hServers.m_hList);
|
||
|
int nCount = Tcp_ListBox_GetCount(m_hServers.m_hList);
|
||
|
|
||
|
Assert(nCount);
|
||
|
int idx = Tcp_ListBox_GetCurSel(m_hServers.m_hList);
|
||
|
|
||
|
Assert(idx != 0);
|
||
|
|
||
|
if (ListBoxRemoveAt(m_hServers.m_hList, idx, &m_strMovingEntry) == FALSE)
|
||
|
{
|
||
|
Assert(FALSE);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
--idx;
|
||
|
PageModified();
|
||
|
ListBoxInsertAfter(m_hServers.m_hList, idx, m_strMovingEntry.c_str());
|
||
|
|
||
|
Tcp_ListBox_SetCurSel(m_hServers.m_hList, idx);
|
||
|
|
||
|
SetButtons(m_hServers,
|
||
|
(m_pAdapterInfo->m_fIsRasFakeAdapter) ? MAX_RAS_WINS_SERVER : MAX_WINS_SERVER);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnServerDown(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
Assert(m_hServers.m_hList);
|
||
|
int nCount = Tcp_ListBox_GetCount(m_hServers.m_hList);
|
||
|
|
||
|
Assert(nCount);
|
||
|
|
||
|
int idx = Tcp_ListBox_GetCurSel(m_hServers.m_hList);
|
||
|
--nCount;
|
||
|
|
||
|
Assert(idx != nCount);
|
||
|
|
||
|
if (ListBoxRemoveAt(m_hServers.m_hList, idx, &m_strMovingEntry) == FALSE)
|
||
|
{
|
||
|
Assert(FALSE);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
++idx;
|
||
|
PageModified();
|
||
|
|
||
|
ListBoxInsertAfter(m_hServers.m_hList, idx, m_strMovingEntry.c_str());
|
||
|
Tcp_ListBox_SetCurSel(m_hServers.m_hList, idx);
|
||
|
|
||
|
SetButtons(m_hServers,
|
||
|
(m_pAdapterInfo->m_fIsRasFakeAdapter) ? MAX_RAS_WINS_SERVER : MAX_WINS_SERVER);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnServerList(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
switch (wNotifyCode)
|
||
|
{
|
||
|
case LBN_SELCHANGE:
|
||
|
SetButtons(m_hServers,
|
||
|
(m_pAdapterInfo->m_fIsRasFakeAdapter) ? MAX_RAS_WINS_SERVER : MAX_WINS_SERVER);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnLookUp(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
|
||
|
::EnableWindow(GetDlgItem(IDC_WINS_LMHOST),
|
||
|
IsDlgButtonChecked(IDC_WINS_LOOKUP) == BST_CHECKED);
|
||
|
|
||
|
|
||
|
PageModified();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnLMHost(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
WCHAR szFileName[MAX_PATH] = {NULL}; // initialize first character
|
||
|
WCHAR szFileTitle[MAX_PATH] = {NULL}; // initialize first character
|
||
|
|
||
|
// see if the Lookup check-box is checked
|
||
|
Assert(IsDlgButtonChecked(IDC_WINS_LOOKUP) == BST_CHECKED);
|
||
|
|
||
|
// add runtime info
|
||
|
m_ofn.hwndOwner = m_hWnd;
|
||
|
m_ofn.lpstrFile = szFileName;
|
||
|
m_ofn.nMaxFile = celems(szFileName);
|
||
|
m_ofn.lpstrFileTitle = szFileTitle;
|
||
|
m_ofn.nMaxFileTitle = celems(szFileTitle);
|
||
|
|
||
|
//if we are in GUI setup mode, explorer is not registered yet.
|
||
|
//we need to use the old style of File Open dialog
|
||
|
m_ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
|
||
|
if (!FInSystemSetup())
|
||
|
{
|
||
|
m_ofn.Flags |= OFN_EXPLORER;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_ofn.Flags |= OFN_ENABLEHOOK;
|
||
|
m_ofn.lpfnHook = HookProcOldStyle;
|
||
|
}
|
||
|
|
||
|
WCHAR szSysPath[MAX_PATH];
|
||
|
WCHAR szSysPathBackup[MAX_PATH];
|
||
|
|
||
|
BOOL fSysPathFound = (GetSystemDirectory(szSysPath, MAX_PATH) != 0);
|
||
|
|
||
|
if (fSysPathFound && GetOpenFileName(&m_ofn)) // bring up common dialog
|
||
|
{
|
||
|
lstrcpyW(szSysPathBackup, szSysPath);
|
||
|
wcscat(szSysPath, RGAS_LMHOSTS_PATH);
|
||
|
|
||
|
// Backup the original lmhosts file if it hasn't been set dirty
|
||
|
if (!m_ptcpip->FIsSecondMemoryLmhostsFileReset())
|
||
|
{
|
||
|
wcscat(szSysPathBackup, RGAS_LMHOSTS_PATH_BACKUP);
|
||
|
|
||
|
WIN32_FIND_DATA FileData;
|
||
|
if (FindFirstFile(szSysPath, &FileData) != INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
BOOL ret;
|
||
|
|
||
|
// Copy lmhosts file to lmhosts.bak if it already exists
|
||
|
ret = CopyFile(szSysPath, szSysPathBackup, FALSE);
|
||
|
AssertSz(ret, "Failed to backup existing lmhosts file!");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (CopyFile(szFileName, szSysPath, FALSE) == 0) // overwrie lmhosts file
|
||
|
{
|
||
|
TraceError("CTcpWinsPage::OnLMHost", HrFromLastWin32Error());
|
||
|
|
||
|
// cannot copy the file to the %system32%\drivers\etc dir
|
||
|
NcMsgBox(::GetActiveWindow(),
|
||
|
IDS_MSFT_TCP_TEXT,
|
||
|
IDS_CANNOT_CREATE_LMHOST_ERROR,
|
||
|
MB_APPLMODAL | MB_ICONSTOP | MB_OK,
|
||
|
szSysPath);
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Set the flag so we can notify netbt of the change
|
||
|
m_fLmhostsFileReset = TRUE;
|
||
|
}
|
||
|
|
||
|
TraceTag(ttidTcpip,"File Selected: %S", szSysPath);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// syspath failed
|
||
|
if (fSysPathFound == FALSE)
|
||
|
NcMsgBox(::GetActiveWindow(),
|
||
|
IDS_MSFT_TCP_TEXT,
|
||
|
IDS_WINS_SYSTEM_PATH,
|
||
|
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
|
||
|
else if (szFileName[0] != NULL) // get open failed
|
||
|
{
|
||
|
NcMsgBox(::GetActiveWindow(),
|
||
|
IDS_MSFT_TCP_TEXT,
|
||
|
IDS_WINS_LMHOSTS_FAILED,
|
||
|
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK,
|
||
|
szSysPath);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnEnableNetbios(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
switch(wNotifyCode)
|
||
|
{
|
||
|
case BN_CLICKED:
|
||
|
case BN_DOUBLECLICKED:
|
||
|
|
||
|
if (m_pAdapterInfo->m_dwNetbiosOptions != c_dwEnableNetbios)
|
||
|
{
|
||
|
PageModified();
|
||
|
|
||
|
// Update in memory structure
|
||
|
m_pAdapterInfo->m_dwNetbiosOptions = c_dwEnableNetbios;
|
||
|
}
|
||
|
break;
|
||
|
} // switch
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnDisableNetbios(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
switch(wNotifyCode)
|
||
|
{
|
||
|
case BN_CLICKED:
|
||
|
case BN_DOUBLECLICKED:
|
||
|
|
||
|
if (m_pAdapterInfo->m_dwNetbiosOptions != c_dwDisableNetbios)
|
||
|
{
|
||
|
PageModified();
|
||
|
|
||
|
// Update in memory structure
|
||
|
m_pAdapterInfo->m_dwNetbiosOptions = c_dwDisableNetbios;
|
||
|
}
|
||
|
break;
|
||
|
} // switch
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CTcpWinsPage::OnUnsetNetBios(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
switch(wNotifyCode)
|
||
|
{
|
||
|
case BN_CLICKED:
|
||
|
case BN_DOUBLECLICKED:
|
||
|
|
||
|
if (m_pAdapterInfo->m_dwNetbiosOptions != c_dwUnsetNetbios)
|
||
|
{
|
||
|
PageModified();
|
||
|
|
||
|
// Update in memory structure
|
||
|
m_pAdapterInfo->m_dwNetbiosOptions = c_dwUnsetNetbios;
|
||
|
}
|
||
|
break;
|
||
|
} // switch
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// CWinsServerDialog
|
||
|
//
|
||
|
|
||
|
CWinsServerDialog::CWinsServerDialog(CTcpWinsPage * pTcpWinsPage,
|
||
|
const DWORD* adwHelpIDs,
|
||
|
int iIndex)
|
||
|
{
|
||
|
Assert(pTcpWinsPage);
|
||
|
m_pParentDlg = pTcpWinsPage;
|
||
|
m_hButton = 0;
|
||
|
m_adwHelpIDs = adwHelpIDs;
|
||
|
m_iIndex = iIndex;
|
||
|
}
|
||
|
|
||
|
LRESULT CWinsServerDialog::OnInitDialog(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
// change the ok button to add if we are not editing
|
||
|
if (m_pParentDlg->m_fEditState == FALSE)
|
||
|
SetDlgItemText(IDOK, m_pParentDlg->m_strAddServer.c_str());
|
||
|
|
||
|
m_ipAddress.Create(m_hWnd, IDC_WINS_CHANGE_SERVER);
|
||
|
m_ipAddress.SetFieldRange(0, c_iIPADDR_FIELD_1_LOW, c_iIPADDR_FIELD_1_HIGH);
|
||
|
|
||
|
// if editing an ip address fill the controls with the current information
|
||
|
// if removing an ip address save it and fill the add dialog with it next time
|
||
|
HWND hList = ::GetDlgItem(m_pParentDlg->m_hWnd, IDC_WINS_SERVER_LIST);
|
||
|
RECT rect;
|
||
|
|
||
|
::GetWindowRect(hList, &rect);
|
||
|
SetWindowPos(NULL, rect.left, rect.top, 0,0,
|
||
|
SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
|
||
|
|
||
|
m_hButton = GetDlgItem(IDOK);
|
||
|
|
||
|
// add the address that was just removed
|
||
|
if (m_pParentDlg->m_strNewIpAddress.size())
|
||
|
{
|
||
|
m_ipAddress.SetAddress(m_pParentDlg->m_strNewIpAddress.c_str());
|
||
|
::EnableWindow(m_hButton, TRUE);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pParentDlg->m_strNewIpAddress = L"";
|
||
|
::EnableWindow(m_hButton, FALSE);
|
||
|
}
|
||
|
|
||
|
::SetFocus(m_ipAddress);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CWinsServerDialog::OnContextMenu(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CWinsServerDialog::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 CWinsServerDialog::OnChange(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
if (m_ipAddress.IsBlank())
|
||
|
::EnableWindow(m_hButton, FALSE);
|
||
|
else
|
||
|
::EnableWindow(m_hButton, TRUE);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CWinsServerDialog::OnOk(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
tstring strIp;
|
||
|
m_ipAddress.GetAddress(&strIp);
|
||
|
|
||
|
// Validate
|
||
|
if (!FIsIpInRange(strIp.c_str()))
|
||
|
{
|
||
|
// makes ip address lose focus so the control gets
|
||
|
// IPN_FIELDCHANGED notification
|
||
|
// also makes it consistent for when short-cut is used
|
||
|
::SetFocus(m_hButton);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int indexDup = Tcp_ListBox_FindStrExact(m_pParentDlg->m_hServers.m_hList, strIp.c_str());
|
||
|
if (indexDup != LB_ERR && indexDup != m_iIndex)
|
||
|
{
|
||
|
NcMsgBox(m_hWnd,
|
||
|
IDS_MSFT_TCP_TEXT,
|
||
|
IDS_DUP_WINS_SERVER,
|
||
|
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK,
|
||
|
strIp.c_str());
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (m_pParentDlg->m_fEditState == FALSE)
|
||
|
{
|
||
|
// Get the current address from the control and
|
||
|
// add them to the adapter if valid
|
||
|
m_pParentDlg->m_strNewIpAddress = strIp;
|
||
|
|
||
|
EndDialog(IDOK);
|
||
|
}
|
||
|
else // see if either changed
|
||
|
{
|
||
|
if (strIp != m_pParentDlg->m_strNewIpAddress)
|
||
|
m_pParentDlg->m_strNewIpAddress = strIp; // update save addresses
|
||
|
else
|
||
|
EndDialog(IDCANCEL);
|
||
|
}
|
||
|
|
||
|
EndDialog(IDOK);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CWinsServerDialog::OnCancel(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
EndDialog(IDCANCEL);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CWinsServerDialog::OnIpFieldChange(int idCtrl, LPNMHDR pnmh,
|
||
|
BOOL& fHandled)
|
||
|
{
|
||
|
LPNMIPADDRESS lpnmipa = (LPNMIPADDRESS) pnmh;
|
||
|
int iLow = c_iIpLow;
|
||
|
int iHigh = c_iIpHigh;
|
||
|
|
||
|
if (0==lpnmipa->iField)
|
||
|
{
|
||
|
iLow = c_iIPADDR_FIELD_1_LOW;
|
||
|
iHigh = c_iIPADDR_FIELD_1_HIGH;
|
||
|
};
|
||
|
|
||
|
IpCheckRange(lpnmipa, m_hWnd, iLow, iHigh);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Purpose: Ensure the mouse cursor over the dialog is an Arrow.
|
||
|
//
|
||
|
LRESULT CWinsServerDialog::OnSetCursor (
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam,
|
||
|
BOOL& bHandled)
|
||
|
{
|
||
|
if (LOWORD(lParam) == HTCLIENT)
|
||
|
{
|
||
|
SetCursor(LoadCursor(NULL, IDC_ARROW));
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|