Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

457 lines
12 KiB

#include "pch.h"
#pragma hdrstop
#include "button.h"
#include "odb.h"
#include "const.h"
#include "resource.h"
#include "ipctrl.h"
#include "tcpsht.h"
CTcpWinsPage::CTcpWinsPage(CTcpSheet* pSheet) : PropertyPage(pSheet)
{
m_bScopeModified = FALSE;
m_hCardCombo = 0;
String text;
text.LoadString(hTcpCfgInstance, IDS_COMMONDLG_TEXT);
TCHAR* pch;
// gives double NULL by default
memset(m_filter, 0, sizeof(m_filter));
memset(&m_ofn, 0, sizeof(OPENFILENAME));
wsprintf(m_filter, _T("%s|%s"), (LPCTSTR)text, _T("*.*"));
// replace '|' with NULL, required by common dialog
pch = m_filter;
while ((pch = _tcschr(pch, '|')) != NULL)
*pch++ = '\0';
m_ofn.lStructSize = sizeof(OPENFILENAME);
m_ofn.hInstance = hTcpCfgInstance;
m_ofn.lpstrFilter = m_filter;
m_ofn.nFilterIndex = 1L;
m_ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
}
CTcpWinsPage::~CTcpWinsPage()
{
}
BOOL CTcpWinsPage::OnInitDialog() // must call the base
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
HWND hDlg = (HWND)*this;
// add adapter to combobox
m_hCardCombo = GetDlgItem(hDlg, IDC_WINS_CARD);
VERIFY(m_primary.Create(hDlg, IDC_WINS_PRIMARY));
m_primary.SetFieldRange(0, 1, 223);
VERIFY(m_secondary.Create(hDlg, IDC_WINS_SECONDARY));
m_secondary.SetFieldRange(0, 1, 223);
InitPage();
return TRUE;
}
BOOL CTcpWinsPage::InitPage()
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
HWND hDlg = (HWND)*this;
ASSERT(m_hCardCombo);
int numCards = pSheet->m_globalInfo.nNumCard;
// Disable Primary and Secondary Wins Server addresses
if (numCards == 0)
{
EnableWindow(GetDlgItem(hDlg, IDC_WINS_PRIMARY), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_WINS_SECONDARY), FALSE);
}
if (m_hCardCombo)
{
// add the cards to the list and select the first one
for (int i = 0; i < numCards; i++)
SendMessage(m_hCardCombo, CB_ADDSTRING, 0, (LPARAM)((LPCTSTR)pSheet->m_pAdapterInfo[i].nlsTitle));
OnActive(); // Select card based on first page
}
// update controls
CheckDlgButton(hDlg, IDC_WINS_LOOKUP, pSheet->m_globalInfo.fEnableLMHOSTS);
CheckDlgButton(hDlg, IDC_WINS_DNS, pSheet->m_globalInfo.fDNSEnableWINS );
#ifdef WINS_PROXY
if (IsWINSInstalled())
{
EnableWindow(GetDlgItem(hDlg, IDC_WINS_PROXY), FALSE);
CheckDlgButton(hDlg, IDC_WINS_PROXY, FALSE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_WINS_PROXY), TRUE);
CheckDlgButton(hDlg, IDC_WINS_PROXY, pSheet->m_globalInfo.fEnableWINSProxy);
}
#endif
SetDlgItemText(hDlg, IDC_WINS_SCOPE, pSheet->m_globalInfo.nlsScopeID);
return TRUE;
}
int CTcpWinsPage::OnActive()
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
int numCards = pSheet->m_globalInfo.nNumCard;
ASSERT(IsWindow(m_hCardCombo));
if (ComboBox_GetCount(m_hCardCombo))
{
// select the same adapter that is on the IP Address Page
int nCurrentSelection = pSheet->m_general.GetCurrentAdapterIndex();
int nAdapterOnThisPage = ComboBox_GetCurSel(m_hCardCombo);
// select the same card as the IP Address page
if (nCurrentSelection != -1 && nCurrentSelection != nAdapterOnThisPage)
{
ComboBox_SetCurSel(m_hCardCombo, nCurrentSelection);
SetIPInfo();
}
SetFocus(m_hCardCombo);
}
return PropertyPage::OnActive();
}
void CTcpWinsPage::SetIPInfo()
{
int i = GetCurrentAdapterIndex();
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
if (i != -1)
{
m_oldCard = pSheet->m_pAdapterInfo[i].nlsTitle;
if (pSheet->m_pAdapterInfo[i].nlsPrimaryWINS.QueryTextLength())
m_primary.SetAddress(pSheet->m_pAdapterInfo[i].nlsPrimaryWINS);
else
m_primary.ClearAddress();
if (pSheet->m_pAdapterInfo[i].nlsSecondaryWINS.QueryTextLength())
m_secondary.SetAddress(pSheet->m_pAdapterInfo[i].nlsSecondaryWINS);
else
m_secondary.ClearAddress();
}
}
void CTcpWinsPage::UpdateIPInfo()
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
int i = GetCurrentAdapterIndex();
if (i != -1)
{
int i = SendMessage(m_hCardCombo, CB_FINDSTRINGEXACT, (WPARAM)-1,
(LPARAM)((LPCTSTR)m_oldCard));
if (i == CB_ERR)
return;
ASSERT(m_oldCard.strcmp(pSheet->m_pAdapterInfo[i].nlsTitle) == 0);
if (!m_primary.IsBlank())
m_primary.GetAddress(&pSheet->m_pAdapterInfo[i].nlsPrimaryWINS);
else
pSheet->m_pAdapterInfo[i].nlsPrimaryWINS = _T("");
if(!m_secondary.IsBlank())
m_secondary.GetAddress(&pSheet->m_pAdapterInfo[i].nlsSecondaryWINS);
else
pSheet->m_pAdapterInfo[i].nlsSecondaryWINS = _T("");
}
}
int CTcpWinsPage::GetCurrentAdapterIndex()
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
String adapter;
int i;
ASSERT(m_hCardCombo);
adapter.ReleaseBuffer(GetWindowText(m_hCardCombo, adapter.GetBuffer(256), 256));
i = SendMessage(m_hCardCombo, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)((LPCTSTR)adapter));
#ifdef DBG
if (i != CB_ERR)
ASSERT(adapter == (LPCTSTR)pSheet->m_pAdapterInfo[i].nlsTitle);
#endif
return ((i != CB_ERR) ? i : -1);
}
BOOL CTcpWinsPage::IsWINSInstalled()
{
REG_KEY rkLocalMachine(HKEY_LOCAL_MACHINE);
if (rkLocalMachine.QueryError())
return FALSE;
NLS_STR nlsWINS = RGAS_WINS_SERVICE;
REG_KEY RegKeyWINS(rkLocalMachine, nlsWINS, MAXIMUM_ALLOWED);
if (RegKeyWINS.QueryError())
return FALSE;
return TRUE;
}
BOOL CTcpWinsPage::OnCommand(WPARAM wParam, LPARAM lParam)
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
BOOL bResult = FALSE;
WORD nID = LOWORD(wParam);
WORD notifyCode = HIWORD(wParam);
switch(nID)
{
case IDC_WINS_PRIMARY:
OnPrimary(notifyCode);
break;
case IDC_WINS_SECONDARY:
OnSecondary(notifyCode);
break;
case IDC_WINS_SCOPE:
OnScope(notifyCode);
break;
case IDC_WINS_PROXY:
OnProxy();
break;
case IDC_WINS_LOOKUP:
OnLookUp();
break;
case IDC_WINS_DNS:
OnDNS();
break;
case IDC_WINS_LMHOST:
OnLMHost();
break;
case IDC_WINS_CARD:
OnAdapterChange();
break;
default:
break;
}
return bResult;
}
void CTcpWinsPage::OnPrimary(WORD notifyCode)
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
int i;
if ((i = GetCurrentAdapterIndex()) != -1)
{
NLS_STR newPrimaryAddress;
m_primary.GetAddress(&newPrimaryAddress);
// see if the address changed
if (!m_primary.IsBlank())
if (newPrimaryAddress != pSheet->m_pAdapterInfo[i].nlsPrimaryWINS)
PageModified();
}
}
void CTcpWinsPage::OnSecondary(WORD notifyCode)
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
int i;
if ((i = GetCurrentAdapterIndex()) != -1)
{
NLS_STR newSecondaryAddress;
m_secondary.GetAddress(&newSecondaryAddress);
// see if the address changed
if (!m_secondary.IsBlank())
if (newSecondaryAddress != pSheet->m_pAdapterInfo[i].nlsSecondaryWINS)
PageModified();
}
}
void CTcpWinsPage::OnScope(WORD notifyCode)
{
// ignore changes due to OnInitDialog changes
if (notifyCode == EN_CHANGE)
{
if (m_bScopeModified == TRUE)
PageModified();
m_bScopeModified = TRUE;
}
}
void CTcpWinsPage::OnProxy()
{
PageModified();
}
void CTcpWinsPage::OnLookUp()
{
PageModified();
}
void CTcpWinsPage::OnDNS()
{
PageModified();
}
void CTcpWinsPage::OnLMHost()
{
TCHAR fileName[MAX_PATH] = {NULL}; // initialize first character
TCHAR fileTitle[MAX_PATH] = {NULL}; // initialize first character
HWND hDlg = (HWND)*this;
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
// see if the Lookup check-box is checked
if (IsDlgButtonChecked(hDlg, IDC_WINS_LOOKUP) == BST_UNCHECKED)
{
pSheet->MessageBox(IDS_LOOKUP_DISABLED);
return;
}
// add runtime info
m_ofn.hwndOwner = hDlg;
m_ofn.lpstrFile = fileName;
m_ofn.nMaxFile = _countof(fileName);
m_ofn.lpstrFileTitle = fileTitle;
m_ofn.nMaxFileTitle = _countof(fileTitle);
TCHAR pszSysPath[MAX_PATH];
BOOL bSysPathFound = (GetSystemDirectory(pszSysPath, MAX_PATH) != 0);
if (bSysPathFound == TRUE && GetOpenFileName(&m_ofn))
{
_tcscat(pszSysPath, RGAS_LMHOSTS_PATH);
if (CopyFile(fileName, pszSysPath, FALSE) == 0)
{
String fmt, file;
// cannot copy the file to the %system32%\drivers\etc dir
fmt.LoadString(hTcpCfgInstance, IDS_CANNOT_CREATE_LMHOST_ERROR);
file.Format(fmt, pszSysPath);
String txt;
txt.LoadString(hTcpCfgInstance, IDS_SYSERROR_TEXT);
MessageBox((HWND)*this, file, txt, MB_OK | MB_ICONSTOP | MB_APPLMODAL);
return;
}
TRACE(_T("File Selected: %s\n"), pszSysPath);
}
else
{
// syspath failed
if (bSysPathFound == FALSE)
pSheet->MessageBox(IDS_SYSTEM_PATH);
else if (fileName[0] != NULL) // get open failed
{
String fmt;
fmt.LoadString(hTcpCfgInstance, IDS_LMHOSTS_FAILED);
String text;
text.Format(fmt, pszSysPath);
pSheet->MessageBox(text);
}
}
}
void CTcpWinsPage::OnAdapterChange()
{
UpdateIPInfo();
SetIPInfo();
}
int CTcpWinsPage::OnApply()
{
BOOL nResult = PSNRET_NOERROR;
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
HWND hDlg = (HWND)*this;
UpdateIPInfo(); // save current adapter information
// check for an adapter that has a static IP and no Wins Primary
for (int i = 0; i < pSheet->m_globalInfo.nNumCard; i ++)
{
// check whether the primary wins address is empty or not
if ((!pSheet->m_pAdapterInfo[i].fEnableDHCP) && (pSheet->m_pAdapterInfo[i].nlsPrimaryWINS.strcmp (RGAS_SZ_NULL) == 0))
{
if (pSheet->MessageBox(IDS_EMPTY_PRIMARY_WINS, MB_YESNO|MB_DEFBUTTON2|MB_APPLMODAL|MB_ICONEXCLAMATION) == IDNO)
{
SetFocus(GetDlgItem(*this, IDC_WINS_PRIMARY));
return PSNRET_INVALID_NOCHANGEPAGE;
}
else
{
break;
}
}
}
// save check box states
pSheet->m_globalInfo.fEnableLMHOSTS = IsDlgButtonChecked(hDlg, IDC_WINS_LOOKUP);
pSheet->m_globalInfo.fDNSEnableWINS = IsDlgButtonChecked(hDlg, IDC_WINS_DNS);
#ifdef WINS_PROXY
if (!IsWINSInstalled())
pSheet->m_globalInfo.fEnableWINSProxy = IsDlgButtonChecked(hDlg, IDC_WINS_PROXY);
#endif
// save scope ID
String scope;
scope.ReleaseBuffer(GetDlgItemText(hDlg, IDC_WINS_SCOPE, scope.GetBuffer(256), 256));
pSheet->m_globalInfo.nlsScopeID = (LPCTSTR)scope;
SaveRegistry(&pSheet->m_globalInfo, pSheet->m_pAdapterInfo);
SetModifiedTo(FALSE); // this page is no longer modified
pSheet->SetSheetModifiedTo(TRUE);
return nResult;
}
void CTcpWinsPage::OnHelp()
{
CTcpSheet* pSheet = GetParentObject(CTcpSheet, m_wins);
// pSheet->DisplayHelp(GetParent((HWND)*this), HC_IPX_HELP);
}
void CTcpWinsPage::OnCancel()
{
}