mirror of https://github.com/tongzx/nt5src
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.
380 lines
5.5 KiB
380 lines
5.5 KiB
/*++
|
|
|
|
Copyright (c) 1994-1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
dnsnamed.cpp
|
|
|
|
Abstract:
|
|
|
|
DNS name resolution dialog
|
|
|
|
Author:
|
|
|
|
Ronald Meijer (ronaldm)
|
|
|
|
Project:
|
|
|
|
Internet Services Manager
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
#include <winsock2.h>
|
|
|
|
#include "comprop.h"
|
|
#include "dnsnamed.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
|
|
CDnsNameDlg::CDnsNameDlg(
|
|
IN CIPAddressCtl * pIpControl OPTIONAL,
|
|
IN CWnd * pParent OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Construct with optional associated IP address control
|
|
|
|
Arguments:
|
|
|
|
CWndIpAddress * pIpControl : Associated IP control
|
|
CWnd * pParent : Pointer to parent window
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: m_pIpControl(pIpControl),
|
|
m_dwIPValue(0L),
|
|
CDialog(CDnsNameDlg::IDD, pParent)
|
|
{
|
|
#if 0 // Keep class wizard happy
|
|
|
|
//{{AFX_DATA_INIT(CDnsNameDlg)
|
|
//}}AFX_DATA_INIT
|
|
|
|
#endif // 0
|
|
|
|
if (m_pIpControl)
|
|
{
|
|
m_pIpControl->GetAddress(&m_dwIPValue);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
CDnsNameDlg::CDnsNameDlg(
|
|
IN DWORD dwIPValue,
|
|
IN CWnd * pParent OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Construct with associated IP value
|
|
|
|
Arguments:
|
|
|
|
DWORD dwIPValue : IP Value
|
|
CWnd * pParent : Pointer to parent window
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: m_pIpControl(NULL),
|
|
m_dwIPValue(dwIPValue),
|
|
CDialog(CDnsNameDlg::IDD, pParent)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CDnsNameDlg::DoDataExchange(
|
|
IN CDataExchange * pDX
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialise/Store control data
|
|
|
|
Arguments:
|
|
|
|
CDataExchange * pDX - DDX/DDV control structure
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CDnsNameDlg)
|
|
DDX_Control(pDX, IDC_EDIT_DNS_NAME, m_edit_DNSName);
|
|
DDX_Control(pDX, IDOK, m_button_OK);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Message Map
|
|
//
|
|
BEGIN_MESSAGE_MAP(CDnsNameDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CDnsNameDlg)
|
|
ON_EN_CHANGE(IDC_EDIT_DNS_NAME, OnChangeEditDnsName)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
DWORD
|
|
CDnsNameDlg::FillIpControlFromName()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Do a DNS lookup from the hostname in the edit control, and place
|
|
the ip value in the ip control if we have one.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
Error return code
|
|
|
|
--*/
|
|
{
|
|
CString str;
|
|
DWORD err = 0;
|
|
HOSTENT * pHostent = NULL;
|
|
|
|
m_edit_DNSName.GetWindowText(str);
|
|
|
|
BeginWaitCursor();
|
|
|
|
#ifdef _UNICODE
|
|
|
|
CHAR * pAnsi = AllocAnsiString(str);
|
|
|
|
if (pAnsi == NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
pHostent = ::gethostbyname(pAnsi);
|
|
|
|
#else
|
|
|
|
pHostent = ::gethostbyname((LPCTSTR)str);
|
|
|
|
#endif // _UNICODE;
|
|
|
|
if (pHostent != NULL)
|
|
{
|
|
//
|
|
// Got a valid lookup. Convert the value to host order,
|
|
// optionally set the value in the associated ip control
|
|
//
|
|
m_dwIPValue = ::ntohl(*((u_long *)pHostent->h_addr_list[0]));
|
|
if (m_pIpControl)
|
|
{
|
|
m_pIpControl->SetAddress(m_dwIPValue);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
err = ::WSAGetLastError();
|
|
}
|
|
|
|
EndWaitCursor();
|
|
|
|
#ifdef _UNICODE
|
|
|
|
FreeMem(pAnsi);
|
|
|
|
#endif // _UNICODE
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
CDnsNameDlg::FillNameFromIpValue()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Given the ip value, fill, do a reverse lookup, and fill the name in
|
|
the edit control.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
Error return code
|
|
|
|
--*/
|
|
{
|
|
DWORD err = ERROR_SUCCESS;
|
|
|
|
if (m_dwIPValue == 0L)
|
|
{
|
|
//
|
|
// Don't bother filling this
|
|
// one in -- not an error, though
|
|
//
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Call the Winsock API to get host name and alias information.
|
|
//
|
|
u_long ulAddrInNetOrder = ::htonl((u_long)m_dwIPValue);
|
|
|
|
BeginWaitCursor();
|
|
HOSTENT * pHostInfo = ::gethostbyaddr(
|
|
(CHAR *)&ulAddrInNetOrder,
|
|
sizeof ulAddrInNetOrder,
|
|
PF_INET
|
|
);
|
|
EndWaitCursor();
|
|
|
|
if (pHostInfo == NULL)
|
|
{
|
|
return ::WSAGetLastError();
|
|
}
|
|
|
|
try
|
|
{
|
|
CString str(pHostInfo->h_name);
|
|
m_edit_DNSName.SetWindowText(str);
|
|
}
|
|
catch(CException * e)
|
|
{
|
|
err = ::GetLastError();
|
|
e->Delete();
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Message Handlers
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
void
|
|
CDnsNameDlg::OnOK()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Attempt to resolve the the IP address in response to the OK button
|
|
being pressed. Don't dismiss the dialog if the name is not
|
|
resolvable.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CError err(FillIpControlFromName());
|
|
if (err.MessageBoxOnFailure())
|
|
{
|
|
//
|
|
// Failed, don't dismiss the dialog
|
|
//
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Dismiss the dialog
|
|
//
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CDnsNameDlg::OnChangeEditDnsName()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Enable/disable the ok button depending on the contents of the edit control.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
m_button_OK.EnableWindow(m_edit_DNSName.GetWindowTextLength() > 0);
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CDnsNameDlg::OnInitDialog()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
WM_INITDIALOG handler. Initialize the dialog.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
TRUE if focus is to be set automatically, FALSE if the focus
|
|
is already set.
|
|
|
|
--*/
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
//
|
|
// If an address has been pre-set do a reverse lookup
|
|
//
|
|
if (m_dwIPValue)
|
|
{
|
|
CError err(FillNameFromIpValue());
|
|
err.MessageBoxOnFailure();
|
|
}
|
|
|
|
OnChangeEditDnsName();
|
|
|
|
return TRUE;
|
|
}
|
|
|