|
|
//-----------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: T C P D N S . C P P
//
// Contents: CTcpDnsPage, CServerDialog and CSuffixDialog implementation
//
// Notes: The DNS page and related dialogs
//
// Author: tongl 11 Nov 1997
//
//-----------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "tcpipobj.h"
#include "ncatlui.h"
#include "ncstl.h"
#include "tcpconst.h"
#include "dlgaddr.h"
#include "dlgdns.h"
#include "tcphelp.h"
#include "tcpmacro.h"
#include "tcputil.h"
#include "dnslib.h"
#define MAX_RAS_DNS_SERVER 2
#define MAX_HOSTNAME_LENGTH 64
#define MAX_DOMAINNAME_LENGTH 255
CTcpDnsPage::CTcpDnsPage(CTcpAddrPage * pTcpAddrPage, ADAPTER_INFO * pAdapterDlg, GLOBAL_INFO * pGlbDlg, const DWORD* adwHelpIDs) { // Save everything passed to us
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; }
CTcpDnsPage::~CTcpDnsPage() { }
LRESULT CTcpDnsPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { m_fEditState = FALSE;
// Cache hwnds
// Server
m_hServers.m_hList = GetDlgItem(IDC_DNS_SERVER_LIST); m_hServers.m_hAdd = GetDlgItem(IDC_DNS_SERVER_ADD); m_hServers.m_hEdit = GetDlgItem(IDC_DNS_SERVER_EDIT); m_hServers.m_hRemove = GetDlgItem(IDC_DNS_SERVER_REMOVE); m_hServers.m_hUp = GetDlgItem(IDC_DNS_SERVER_UP); m_hServers.m_hDown = GetDlgItem(IDC_DNS_SERVER_DOWN);
// Suffix
m_hSuffix.m_hList = GetDlgItem(IDC_DNS_SUFFIX_LIST); m_hSuffix.m_hAdd = GetDlgItem(IDC_DNS_SUFFIX_ADD); m_hSuffix.m_hEdit = GetDlgItem(IDC_DNS_SUFFIX_EDIT); m_hSuffix.m_hRemove = GetDlgItem(IDC_DNS_SUFFIX_REMOVE); m_hSuffix.m_hUp = GetDlgItem(IDC_DNS_SUFFIX_UP); m_hSuffix.m_hDown = GetDlgItem(IDC_DNS_SUFFIX_DOWN);
// Set the up\down arrow icons
SendDlgItemMessage(IDC_DNS_SERVER_UP, BM_SETIMAGE, IMAGE_ICON, reinterpret_cast<LPARAM>(g_hiconUpArrow)); SendDlgItemMessage(IDC_DNS_SERVER_DOWN, BM_SETIMAGE, IMAGE_ICON, reinterpret_cast<LPARAM>(g_hiconDownArrow));
SendDlgItemMessage(IDC_DNS_SUFFIX_UP, BM_SETIMAGE, IMAGE_ICON, reinterpret_cast<LPARAM>(g_hiconUpArrow)); SendDlgItemMessage(IDC_DNS_SUFFIX_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]; WCHAR szAddSuffix[16];
GetDlgItemText(IDC_DNS_SERVER_ADD, szAddServer, celems(szAddServer)); GetDlgItemText(IDC_DNS_SERVER_ADD, szAddSuffix, celems(szAddSuffix));
szAddServer[lstrlenW(szAddServer) - c_cchRemoveCharatersFromEditOrAddButton]= 0; szAddSuffix[lstrlenW(szAddSuffix) - c_cchRemoveCharatersFromEditOrAddButton]= 0;
m_strAddServer = szAddServer; m_strAddSuffix = szAddSuffix;
// Initialize controls on this page
// DNS server list box
int nResult= LB_ERR; for(VSTR_ITER iterNameServer = m_pAdapterInfo->m_vstrDnsServerList.begin() ; iterNameServer != m_pAdapterInfo->m_vstrDnsServerList.end() ; ++iterNameServer) { nResult = Tcp_ListBox_InsertString(m_hServers.m_hList, -1, (*iterNameServer)->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_DNS_SERVER : -1);
// DNS domain edit box
::SendMessage(GetDlgItem(IDC_DNS_DOMAIN), EM_SETLIMITTEXT, DOMAIN_LIMIT, 0); ::SetWindowText(GetDlgItem(IDC_DNS_DOMAIN), m_pAdapterInfo->m_strDnsDomain.c_str());
// DNS dynamic registration
CheckDlgButton(IDC_DNS_ADDR_REG, !m_pAdapterInfo->m_fDisableDynamicUpdate); CheckDlgButton(IDC_DNS_NAME_REG, m_pAdapterInfo->m_fEnableNameRegistration);
// Bug #266461 need disable IDC_DNS_NAME_REG if IDC_DNS_ADDR_REG is unchecked
if(m_pAdapterInfo->m_fDisableDynamicUpdate) ::EnableWindow(GetDlgItem(IDC_DNS_NAME_REG), FALSE);
// DNS domain serach methods
if (m_pglb->m_vstrDnsSuffixList.size() >0) //If suffix list not empty
{ CheckDlgButton(IDC_DNS_USE_SUFFIX_LIST, TRUE); CheckDlgButton(IDC_DNS_SEARCH_DOMAIN, FALSE); CheckDlgButton(IDC_DNS_SEARCH_PARENT_DOMAIN, FALSE);
EnableSuffixGroup(TRUE); ::EnableWindow(GetDlgItem(IDC_DNS_SEARCH_PARENT_DOMAIN), FALSE);
// DNS suffix list box
nResult= LB_ERR; for(VSTR_CONST_ITER iterSearchList = (m_pglb->m_vstrDnsSuffixList).begin() ; iterSearchList != (m_pglb->m_vstrDnsSuffixList).end() ; ++iterSearchList) { nResult = Tcp_ListBox_InsertString(m_hSuffix.m_hList, -1, (*iterSearchList)->c_str()); }
// set slection to first item
if (nResult >= 0) { Tcp_ListBox_SetCurSel(m_hSuffix.m_hList, 0); }
SetButtons(m_hSuffix, DNS_MAX_SEARCH_LIST_ENTRIES); } else { CheckDlgButton(IDC_DNS_USE_SUFFIX_LIST, FALSE); CheckDlgButton(IDC_DNS_SEARCH_DOMAIN, TRUE); CheckDlgButton(IDC_DNS_SEARCH_PARENT_DOMAIN, m_pglb->m_fUseDomainNameDevolution);
EnableSuffixGroup(FALSE); }
//this is a ras connection and a non-admin user, disable all the controls
//for globl settings
if (m_pAdapterInfo->m_fIsRasFakeAdapter && m_pParentDlg->m_fRasNotAdmin) { ::EnableWindow(GetDlgItem(IDC_DNS_STATIC_GLOBAL), FALSE); ::EnableWindow(GetDlgItem(IDC_DNS_SEARCH_DOMAIN), FALSE); ::EnableWindow(GetDlgItem(IDC_DNS_SEARCH_PARENT_DOMAIN), FALSE); ::EnableWindow(GetDlgItem(IDC_DNS_USE_SUFFIX_LIST), FALSE); EnableSuffixGroup(FALSE); }
return 0; }
LRESULT CTcpDnsPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; }
LRESULT CTcpDnsPage::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 CTcpDnsPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; }
LRESULT CTcpDnsPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { BOOL nResult = PSNRET_NOERROR;
if (!IsModified()) { ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult); return nResult; }
// server list
FreeCollectionAndItem(m_pAdapterInfo->m_vstrDnsServerList);
WCHAR szServer[IP_LIMIT];
int nCount = Tcp_ListBox_GetCount(m_hServers.m_hList);
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, szServer); m_pAdapterInfo->m_vstrDnsServerList.push_back(new tstring(szServer)); }
// DNS domain
// update second memory with what's in the controls
WCHAR szDomain[DOMAIN_LIMIT + 1]; ::GetWindowText(GetDlgItem(IDC_DNS_DOMAIN), szDomain, celems(szDomain)); m_pAdapterInfo->m_strDnsDomain = szDomain;
m_pAdapterInfo->m_fDisableDynamicUpdate = !IsDlgButtonChecked(IDC_DNS_ADDR_REG); m_pAdapterInfo->m_fEnableNameRegistration = IsDlgButtonChecked(IDC_DNS_NAME_REG);
// suffix list and radio button options
FreeCollectionAndItem(m_pglb->m_vstrDnsSuffixList);
WCHAR szSuffix[SUFFIX_LIMIT]; if (IsDlgButtonChecked(IDC_DNS_USE_SUFFIX_LIST)) { int nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList); AssertSz(nCount > 0, "Why isn't the error caught by OnKillActive?");
for (int i = 0; i < nCount; i++) { #ifdef DBG
int len = Tcp_ListBox_GetTextLen(m_hSuffix.m_hList, i); Assert(len != LB_ERR && len < SUFFIX_LIMIT); #endif
Tcp_ListBox_GetText(m_hSuffix.m_hList, i, szSuffix); m_pglb->m_vstrDnsSuffixList.push_back(new tstring(szSuffix)); } } else { m_pglb->m_fUseDomainNameDevolution = IsDlgButtonChecked(IDC_DNS_SEARCH_PARENT_DOMAIN); }
// pass the info back to its parent dialog
m_pParentDlg->m_fPropShtOk = TRUE;
if(!m_pParentDlg->m_fPropShtModified) m_pParentDlg->m_fPropShtModified = IsModified();
SetModifiedTo(FALSE); // this page is no longer modified
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult); return nResult; }
LRESULT CTcpDnsPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; }
LRESULT CTcpDnsPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { BOOL fErr = FALSE;
if (IsDlgButtonChecked(IDC_DNS_USE_SUFFIX_LIST)) { int nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList);
if (0 == nCount) { // If the list is empty
NcMsgBox(m_hWnd, IDS_MSFT_TCP_TEXT, IDS_INVALID_NO_SUFFIX, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); fErr = TRUE; } }
WCHAR szDomain[DOMAIN_LIMIT + 1]; ::GetWindowText(GetDlgItem(IDC_DNS_DOMAIN), szDomain, celems(szDomain)); if (lstrlenW(szDomain) > 0 && lstrcmpiW(m_pAdapterInfo->m_strDnsDomain.c_str(), szDomain) != 0) {
DNS_STATUS status;
status = DnsValidateName(szDomain, DnsNameDomain); if (ERROR_INVALID_NAME == status || DNS_ERROR_INVALID_NAME_CHAR == status) { NcMsgBox(m_hWnd, IDS_MSFT_TCP_TEXT, IDS_INVALID_DOMAIN_NAME, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK, szDomain); ::SetFocus(GetDlgItem(IDC_DNS_DOMAIN)); fErr = TRUE; } else if (DNS_ERROR_NON_RFC_NAME == status) { //the dns domain name is not RFC compaliant, should we give a warning here?
} }
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, fErr); return fErr; }
// DNS server related controls
LRESULT CTcpDnsPage::OnAddServer(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fEditState = FALSE;
CServerDialog * pDlgSrv = new CServerDialog(this, g_aHelpIDs_IDD_DNS_SERVER);
if (pDlgSrv->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_DNS_SERVER : -1);
// empty strings, this removes the saved address from RemoveIP
m_strNewIpAddress = L""; } }
// release dialog object
delete pDlgSrv;
return 0; }
LRESULT CTcpDnsPage::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);
CServerDialog * pDlgSrv = new CServerDialog(this, g_aHelpIDs_IDD_DNS_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 (pDlgSrv->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""; } }
delete pDlgSrv;
return 0; }
LRESULT CTcpDnsPage::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_DNS_SERVER : -1); } return 0; }
LRESULT CTcpDnsPage::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_DNS_SERVER : -1);
return 0; }
LRESULT CTcpDnsPage::OnDnsDomain(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch (wNotifyCode) { case EN_CHANGE: // update second memory with what's in the controls
WCHAR szBuf[DOMAIN_LIMIT + 1]; ::GetWindowText(GetDlgItem(IDC_DNS_DOMAIN), szBuf, celems(szBuf)); if (m_pAdapterInfo->m_strDnsDomain != szBuf) PageModified();
break;
default: break; }
return 0; }
LRESULT CTcpDnsPage::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_DNS_SERVER : -1);
return 0; }
// DNS domain search related controls
LRESULT CTcpDnsPage::OnSearchDomain(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case BN_CLICKED: case BN_DOUBLECLICKED:
if (::IsWindowEnabled(m_hSuffix.m_hList)) { PageModified();
// Update in memory structure
FreeCollectionAndItem(m_pglb->m_vstrDnsSuffixList);
// delete all items from the list
int nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList); while (nCount>0) { Tcp_ListBox_DeleteString(m_hSuffix.m_hList, 0); nCount --; } EnableSuffixGroup(FALSE); ::EnableWindow(GetDlgItem(IDC_DNS_SEARCH_PARENT_DOMAIN), TRUE); } break; } // switch
return 0; }
LRESULT CTcpDnsPage::OnSearchParentDomain(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case BN_CLICKED: case BN_DOUBLECLICKED:
PageModified(); break; } // switch
return 0; }
LRESULT CTcpDnsPage::OnAddressRegister(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case BN_CLICKED: case BN_DOUBLECLICKED:
// Bug #266461 need disable and uncheck IDC_DNS_NAME_REG
// if IDC_DNS_ADDR_REG is unchecked
if(!IsDlgButtonChecked(IDC_DNS_ADDR_REG)) { CheckDlgButton(IDC_DNS_NAME_REG, FALSE); ::EnableWindow(GetDlgItem(IDC_DNS_NAME_REG), FALSE); } else ::EnableWindow(GetDlgItem(IDC_DNS_NAME_REG), TRUE);
PageModified(); break; }
return 0; }
LRESULT CTcpDnsPage::OnDomainNameRegister(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case BN_CLICKED: case BN_DOUBLECLICKED:
PageModified(); break; }
return 0; }
LRESULT CTcpDnsPage::OnUseSuffix(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch(wNotifyCode) { case BN_CLICKED: case BN_DOUBLECLICKED:
if (!::IsWindowEnabled(m_hSuffix.m_hList)) { PageModified(); EnableSuffixGroup(TRUE); CheckDlgButton(IDC_DNS_SEARCH_PARENT_DOMAIN, FALSE); ::EnableWindow(GetDlgItem(IDC_DNS_SEARCH_PARENT_DOMAIN), FALSE); }
break; } // switch
return 0; }
LRESULT CTcpDnsPage::OnAddSuffix(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fEditState = FALSE;
CSuffixDialog * pDlgSuffix = new CSuffixDialog(this, g_aHelpIDs_IDD_DNS_SUFFIX);
int nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList);
if (pDlgSuffix->DoModal() == IDOK) { nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList); int idx = Tcp_ListBox_InsertString(m_hSuffix.m_hList, -1, m_strNewSuffix.c_str());
PageModified();
Assert(idx >= 0);
if (idx >= 0) { Tcp_ListBox_SetCurSel(m_hSuffix.m_hList, idx);
SetButtons(m_hSuffix, DNS_MAX_SEARCH_LIST_ENTRIES); m_strNewSuffix =L""; } }
delete pDlgSuffix; return 0; }
LRESULT CTcpDnsPage::OnEditSuffix(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { m_fEditState = TRUE;
Assert(Tcp_ListBox_GetCount(m_hSuffix.m_hList));
int idx = Tcp_ListBox_GetCurSel(m_hSuffix.m_hList); Assert(idx >= 0);
CSuffixDialog * pDlgSuffix = new CSuffixDialog(this, g_aHelpIDs_IDD_DNS_SUFFIX, idx);
// save off the removed address and delete if from the listview
if (idx >= 0) { WCHAR buf[SUFFIX_LIMIT];
if (Tcp_ListBox_GetTextLen(m_hSuffix.m_hList, idx) >= celems(buf)) { Assert(FALSE); return 0; }
Tcp_ListBox_GetText(m_hSuffix.m_hList, idx, buf);
m_strNewSuffix = buf;
if (pDlgSuffix->DoModal() == IDOK) { // replace the item in the listview with the new information
Tcp_ListBox_DeleteString(m_hSuffix.m_hList, idx); PageModified();
m_strMovingEntry = m_strNewSuffix; ListBoxInsertAfter(m_hSuffix.m_hList, idx, m_strMovingEntry.c_str());
Tcp_ListBox_SetCurSel(m_hSuffix.m_hList, idx);
m_strNewSuffix = buf; // save off old address
} else { // empty strings, this removes the saved address from RemoveIP
m_strNewSuffix = L""; } }
delete pDlgSuffix; return 0; }
LRESULT CTcpDnsPage::OnRemoveSuffix(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { int idx = Tcp_ListBox_GetCurSel(m_hSuffix.m_hList);
Assert(idx >=0);
if (idx >=0) { WCHAR buf[SUFFIX_LIMIT];
if(Tcp_ListBox_GetTextLen(m_hSuffix.m_hList, idx) >= celems(buf)) { Assert(FALSE); return 0; }
Tcp_ListBox_GetText(m_hSuffix.m_hList, idx, buf);
m_strNewSuffix = buf; Tcp_ListBox_DeleteString(m_hSuffix.m_hList, idx); PageModified();
// select a new item
int nCount; if ((nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList)) != LB_ERR)
if(nCount != LB_ERR) { // select the previous item in the list
if (idx) --idx;
Tcp_ListBox_SetCurSel(m_hSuffix.m_hList, idx); } SetButtons(m_hSuffix, DNS_MAX_SEARCH_LIST_ENTRIES); }
return 0; }
LRESULT CTcpDnsPage::OnSuffixUp(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { Assert(m_hSuffix.m_hList); int nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList);
Assert(nCount); int idx = Tcp_ListBox_GetCurSel(m_hSuffix.m_hList);
Assert(idx != 0);
if (ListBoxRemoveAt(m_hSuffix.m_hList, idx, &m_strMovingEntry) == FALSE) { Assert(FALSE); return 0; }
--idx; PageModified(); ListBoxInsertAfter(m_hSuffix.m_hList, idx, m_strMovingEntry.c_str());
Tcp_ListBox_SetCurSel(m_hSuffix.m_hList, idx);
SetButtons(m_hSuffix, DNS_MAX_SEARCH_LIST_ENTRIES);
return 0; }
LRESULT CTcpDnsPage::OnSuffixDown(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { Assert(m_hSuffix.m_hList); int nCount = Tcp_ListBox_GetCount(m_hSuffix.m_hList);
Assert(nCount); int idx = Tcp_ListBox_GetCurSel(m_hSuffix.m_hList); --nCount;
Assert(idx != nCount);
if (ListBoxRemoveAt(m_hSuffix.m_hList, idx, &m_strMovingEntry) == FALSE) { Assert(FALSE); return 0; }
++idx; PageModified();
ListBoxInsertAfter(m_hSuffix.m_hList, idx, m_strMovingEntry.c_str()); Tcp_ListBox_SetCurSel(m_hSuffix.m_hList, idx);
SetButtons(m_hSuffix, DNS_MAX_SEARCH_LIST_ENTRIES);
return 0; }
LRESULT CTcpDnsPage::OnServerList(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch (wNotifyCode) { case LBN_SELCHANGE: SetButtons(m_hServers, (m_pAdapterInfo->m_fIsRasFakeAdapter) ? MAX_RAS_DNS_SERVER : -1); break;
default: break; }
return 0; }
LRESULT CTcpDnsPage::OnSuffixList(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { switch (wNotifyCode) { case LBN_SELCHANGE: SetButtons(m_hSuffix, DNS_MAX_SEARCH_LIST_ENTRIES); break;
default: break; }
return 0; }
void CTcpDnsPage::EnableSuffixGroup(BOOL fEnable) { ::EnableWindow(m_hSuffix.m_hList, fEnable);
if (fEnable) { SetButtons(m_hSuffix, DNS_MAX_SEARCH_LIST_ENTRIES); } else { ::EnableWindow(m_hSuffix.m_hAdd, fEnable); ::EnableWindow(m_hSuffix.m_hEdit, fEnable); ::EnableWindow(m_hSuffix.m_hRemove, fEnable); ::EnableWindow(m_hSuffix.m_hUp, fEnable); ::EnableWindow(m_hSuffix.m_hDown, fEnable); } }
//
// CServerDialog
//
CServerDialog::CServerDialog(CTcpDnsPage * pTcpDnsPage, const DWORD * adwHelpIDs, int iIndex) { m_pParentDlg = pTcpDnsPage; m_hButton = 0; m_adwHelpIDs = adwHelpIDs; m_iIndex = iIndex; }
LRESULT CServerDialog::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_DNS_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_DNS_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 CServerDialog::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; }
LRESULT CServerDialog::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 CServerDialog::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 CServerDialog::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; }
//check whether this is a duplicate
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_DNS_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 CServerDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { EndDialog(IDCANCEL); return 0; }
//+---------------------------------------------------------------------------
//
// Purpose: Ensure the mouse cursor over the dialog is an Arrow.
//
LRESULT CServerDialog::OnSetCursor ( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (LOWORD(lParam) == HTCLIENT) { SetCursor(LoadCursor(NULL, IDC_ARROW)); } return 0; }
LRESULT CServerDialog::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; }
//
// CSuffixDialog
//
// iIndex - the index of the current suffix in the suffix list, default value
// is -1, which means new suffix
CSuffixDialog::CSuffixDialog(CTcpDnsPage * pTcpDnsPage, const DWORD * adwHelpIDs, int iIndex) { m_pParentDlg = pTcpDnsPage; m_hButton = 0; m_adwHelpIDs = adwHelpIDs; m_iIndex = iIndex; }
LRESULT CSuffixDialog::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_strAddSuffix.c_str());
// Set the position of the pop up dialog to be right over the listbox
// on parent dialog
HWND hList = ::GetDlgItem(m_pParentDlg->m_hWnd, IDC_DNS_SUFFIX_LIST); RECT rect;
::GetWindowRect(hList, &rect); SetWindowPos(NULL, rect.left, rect.top, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
// Save handles to the "Ok" button and the edit box
m_hButton = GetDlgItem(IDOK); m_hEdit = GetDlgItem(IDC_DNS_CHANGE_SUFFIX);
// suffixes have a 255 character limit
::SendMessage(m_hEdit, EM_SETLIMITTEXT, SUFFIX_LIMIT, 0);
// add the address that was just removed
if (m_pParentDlg->m_strNewSuffix.size()) { ::SetWindowText(m_hEdit, m_pParentDlg->m_strNewSuffix.c_str()); ::SendMessage(m_hEdit, EM_SETSEL, 0, -1); ::EnableWindow(m_hButton, TRUE); } else { m_pParentDlg->m_strNewSuffix = L""; ::EnableWindow(m_hButton, FALSE); }
::SetFocus(m_hEdit); return TRUE; }
LRESULT CSuffixDialog::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; }
LRESULT CSuffixDialog::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 CSuffixDialog::OnChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { WCHAR buf[2];
// Enable or disable the "Ok" button
// based on whether the edit box is empty
if (::GetWindowText(m_hEdit, buf, celems(buf)) == 0) ::EnableWindow(m_hButton, FALSE); else ::EnableWindow(m_hButton, TRUE);
return 0; }
LRESULT CSuffixDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { WCHAR szSuffix[SUFFIX_LIMIT];
// Get the current address from the control and
// add them to the adapter if valid
::GetWindowText(m_hEdit, szSuffix, SUFFIX_LIMIT);
DNS_STATUS status;
status = DnsValidateName(szSuffix, DnsNameDomain);
if (ERROR_INVALID_NAME == status || DNS_ERROR_INVALID_NAME_CHAR == status) { TraceTag(ttidTcpip,"Invalid Domain Suffix");
NcMsgBox(::GetActiveWindow(), IDS_MSFT_TCP_TEXT, IDS_INVALID_SUFFIX, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
::SetFocus(m_hEdit);
return 0; }
//check whether this is a duplicate
int indexDup = Tcp_ListBox_FindStrExact(m_pParentDlg->m_hSuffix.m_hList, szSuffix); if (indexDup != LB_ERR && indexDup != m_iIndex) { NcMsgBox(m_hWnd, IDS_MSFT_TCP_TEXT, IDS_DUP_DNS_SUFFIX, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK, szSuffix);
::SetFocus(m_hEdit);
return 0; }
if (m_pParentDlg->m_fEditState == FALSE) // Add new address
{ m_pParentDlg->m_strNewSuffix = szSuffix; } else // see if either changed
{ if(m_pParentDlg->m_strNewSuffix != szSuffix) m_pParentDlg->m_strNewSuffix = szSuffix; // update save addresses
else EndDialog(IDCANCEL); }
EndDialog(IDOK);
return 0; }
LRESULT CSuffixDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { EndDialog(IDCANCEL); return 0; }
//+---------------------------------------------------------------------------
//
// Purpose: Ensure the mouse cursor over the dialog is an Arrow.
//
LRESULT CSuffixDialog::OnSetCursor ( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (LOWORD(lParam) == HTCLIENT) { SetCursor(LoadCursor(NULL, IDC_ARROW)); } return 0; }
|