windows-nt/Source/XPSP1/NT/net/mmc/dhcp/rclntpp.cpp
2020-09-26 16:20:57 +08:00

437 lines
11 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
RClntPP.cpp
This file contains all of the implementation for the
reserved client property page.
FILE HISTORY:
*/
#include "stdafx.h"
#include "rclntpp.h"
#include "scope.h"
#include "nodes.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define RADIO_CLIENT_TYPE_BOTH 0
#define RADIO_CLIENT_TYPE_DHCP 1
#define RADIO_CLIENT_TYPE_BOOTP 2
/////////////////////////////////////////////////////////////////////////////
//
// CReservedClientProperties holder
//
/////////////////////////////////////////////////////////////////////////////
CReservedClientProperties::CReservedClientProperties
(
ITFSNode * pNode,
IComponentData * pComponentData,
ITFSComponentData * pTFSCompData,
LPCTSTR pszSheetName
) : CPropertyPageHolderBase(pNode, pComponentData, pszSheetName)
{
//ASSERT(pFolderNode == GetContainerNode());
m_bAutoDeletePages = FALSE; // we have the pages as embedded members
AddPageToList((CPropertyPageBase*) &m_pageGeneral);
Assert(pTFSCompData != NULL);
m_spTFSCompData.Set(pTFSCompData);
}
CReservedClientProperties::~CReservedClientProperties()
{
RemovePageFromList((CPropertyPageBase*) &m_pageGeneral, FALSE);
if (m_liVersion.QuadPart >= DHCP_NT5_VERSION)
{
RemovePageFromList((CPropertyPageBase*) &m_pageDns, FALSE);
}
}
void
CReservedClientProperties::SetVersion
(
LARGE_INTEGER & liVersion
)
{
m_liVersion = liVersion;
if (m_liVersion.QuadPart >= DHCP_NT5_VERSION)
{
AddPageToList((CPropertyPageBase*) &m_pageDns);
}
}
void
CReservedClientProperties::SetClientType
(
BYTE bClientType
)
{
m_pageGeneral.m_bClientType = bClientType;
// this must come first
if ((bClientType & CLIENT_TYPE_BOTH) == CLIENT_TYPE_BOTH)
{
m_pageGeneral.m_nClientType = RADIO_CLIENT_TYPE_BOTH;
}
else
if (bClientType & CLIENT_TYPE_DHCP)
{
m_pageGeneral.m_nClientType = RADIO_CLIENT_TYPE_DHCP;
}
else
if (bClientType & CLIENT_TYPE_BOOTP)
{
m_pageGeneral.m_nClientType = RADIO_CLIENT_TYPE_BOOTP;
}
else
{
// CLIENT_TYPE_NONE:
// CLIENT_TYPE_UNSPECIFIED:
m_pageGeneral.m_nClientType = -1;
}
}
void
CReservedClientProperties::SetDnsRegistration
(
DWORD dnsRegOption,
DHCP_OPTION_SCOPE_TYPE dhcpOptionType
)
{
m_pageDns.m_dwFlags = dnsRegOption;
m_pageDns.m_dhcpOptionType = dhcpOptionType;
}
/////////////////////////////////////////////////////////////////////////////
// CReservedClientPropGeneral property page
IMPLEMENT_DYNCREATE(CReservedClientPropGeneral, CPropertyPageBase)
CReservedClientPropGeneral::CReservedClientPropGeneral() : CPropertyPageBase(CReservedClientPropGeneral::IDD)
{
//{{AFX_DATA_INIT(CReservedClientPropGeneral)
m_strComment = _T("");
m_strName = _T("");
m_strUID = _T("");
m_nClientType = -1;
//}}AFX_DATA_INIT
}
CReservedClientPropGeneral::~CReservedClientPropGeneral()
{
}
void CReservedClientPropGeneral::DoDataExchange(CDataExchange* pDX)
{
CPropertyPageBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReservedClientPropGeneral)
DDX_Control(pDX, IDC_EDIT_COMMENT, m_editComment);
DDX_Control(pDX, IDC_EDIT_NAME, m_editName);
DDX_Control(pDX, IDC_EDIT_UNIQUE_IDENTIFIER, m_editUID);
DDX_Text(pDX, IDC_EDIT_COMMENT, m_strComment);
DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
DDX_Text(pDX, IDC_EDIT_UNIQUE_IDENTIFIER, m_strUID);
DDX_Radio(pDX, IDC_RADIO_TYPE_BOTH, m_nClientType);
//}}AFX_DATA_MAP
DDX_Control(pDX, IDC_IPADDR_RES_CLIENT_ADDRESS, m_ipaClientIpAddress);
}
BEGIN_MESSAGE_MAP(CReservedClientPropGeneral, CPropertyPageBase)
//{{AFX_MSG_MAP(CReservedClientPropGeneral)
ON_EN_CHANGE(IDC_EDIT_COMMENT, OnChangeEditComment)
ON_EN_CHANGE(IDC_EDIT_NAME, OnChangeEditName)
ON_EN_CHANGE(IDC_EDIT_UNIQUE_IDENTIFIER, OnChangeEditUniqueIdentifier)
ON_BN_CLICKED(IDC_RADIO_TYPE_BOOTP, OnRadioTypeBootp)
ON_BN_CLICKED(IDC_RADIO_TYPE_BOTH, OnRadioTypeBoth)
ON_BN_CLICKED(IDC_RADIO_TYPE_DHCP, OnRadioTypeDhcp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReservedClientPropGeneral message handlers
BOOL CReservedClientPropGeneral::OnInitDialog()
{
CPropertyPageBase::OnInitDialog();
m_ipaClientIpAddress.SetAddress(m_dwClientAddress);
m_ipaClientIpAddress.SetReadOnly(TRUE);
m_ipaClientIpAddress.EnableWindow(FALSE);
if (m_nClientType == -1)
{
// no valid client type. Must be running something before
// NT4 SP2. Hide the client type controls.
//
GetDlgItem(IDC_STATIC_CLIENT_TYPE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_RADIO_TYPE_DHCP)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_RADIO_TYPE_BOOTP)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_RADIO_TYPE_BOTH)->ShowWindow(SW_HIDE);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CReservedClientPropGeneral::OnChangeEditComment()
{
SetDirty(TRUE);
}
void CReservedClientPropGeneral::OnChangeEditName()
{
SetDirty(TRUE);
}
void CReservedClientPropGeneral::OnChangeEditUniqueIdentifier()
{
SetDirty(TRUE);
}
BOOL CReservedClientPropGeneral::OnApply()
{
UpdateData();
DWORD err = 0;
CString str;
DATE_TIME dt;
DHCP_IP_ADDRESS dhipa;
CByteArray cabUid;
int i;
BOOL fValidUID = TRUE;
CATCH_MEM_EXCEPTION
{
do
{
dt.dwLowDateTime = DHCP_DATE_TIME_ZERO_LOW;
dt.dwHighDateTime = DHCP_DATE_TIME_ZERO_HIGH;
m_dhcpClient.SetExpiryDateTime( dt );
m_ipaClientIpAddress.GetAddress( &dhipa );
if ( dhipa == 0 )
{
err = IDS_ERR_INVALID_CLIENT_IPADDR ;
m_ipaClientIpAddress.SetFocusField(-1);
break ;
}
m_dhcpClient.SetIpAddress(dhipa);
m_editUID.GetWindowText(str);
if (str.IsEmpty())
{
err = IDS_ERR_INVALID_UID ;
m_editUID.SetSel(0,-1);
m_editUID.SetFocus();
break ;
}
//
// Client UIDs should be 48 bits (6 bytes or 12 hex characters)
//
if (str.GetLength() != 6 * 2)
fValidUID = FALSE;
for (i = 0; i < str.GetLength(); i++)
{
if (!wcschr(rgchHex, str[i]))
fValidUID = FALSE;
}
if (!::UtilCvtHexString(str, cabUid) && fValidUID)
{
err = IDS_ERR_INVALID_UID ;
m_editUID.SetSel(0,-1);
m_editUID.SetFocus();
break ;
}
if (!fValidUID)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
if (IDYES != AfxMessageBox(IDS_UID_MAY_BE_WRONG, MB_ICONQUESTION | MB_YESNO))
{
m_editUID.SetSel(0,-1);
m_editUID.SetFocus();
err = IDS_UID_MAY_BE_WRONG;
break;
}
}
m_dhcpClient.SetHardwareAddress( cabUid ) ;
m_editName.GetWindowText( str ) ;
if ( str.GetLength() == 0 )
{
err = IDS_ERR_INVALID_CLIENT_NAME ;
m_editName.SetFocus();
break ;
}
//
// Convert client name to oem
//
m_dhcpClient.SetName( str ) ;
m_editComment.GetWindowText( str ) ;
m_dhcpClient.SetComment( str ) ;
// Set the client type
BYTE bClientType;
switch (m_nClientType)
{
case RADIO_CLIENT_TYPE_DHCP:
bClientType = CLIENT_TYPE_DHCP;
break;
case RADIO_CLIENT_TYPE_BOOTP:
bClientType = CLIENT_TYPE_BOOTP;
break;
case RADIO_CLIENT_TYPE_BOTH:
bClientType = CLIENT_TYPE_BOTH;
break;
default:
Assert(FALSE); // should never get here
bClientType = CLIENT_TYPE_UNSPECIFIED;
break;
}
m_dhcpClient.SetClientType(bClientType);
}
while ( FALSE ) ;
}
END_MEM_EXCEPTION( err ) ;
if (err)
{
if (err != IDS_UID_MAY_BE_WRONG)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
::DhcpMessageBox(err);
}
return FALSE;
}
BOOL bRet = CPropertyPageBase::OnApply();
if (bRet == FALSE)
{
// Something bad happened... grab the error code
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
::DhcpMessageBox(GetHolder()->GetError());
}
return bRet;
}
BOOL CReservedClientPropGeneral::OnPropertyChange(BOOL bScope, LONG_PTR *ChangeMask)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
SPITFSNode spResClientNode, spActiveLeasesNode;
CDhcpReservationClient * pResClient;
CDhcpScope * pScope;
DWORD err;
spResClientNode = GetHolder()->GetNode();
pResClient = GETHANDLER(CDhcpReservationClient, spResClientNode);
pScope = pResClient->GetScopeObject(spResClientNode, TRUE);
pScope->GetActiveLeasesNode(&spActiveLeasesNode);
// First tell the server to update the client information
BEGIN_WAIT_CURSOR;
err = pScope->UpdateReservation(&m_dhcpClient, pResClient->GetOptionValueEnum());
END_WAIT_CURSOR;
if (err != ERROR_SUCCESS)
{
GetHolder()->SetError(err);
return FALSE;
}
*ChangeMask = SCOPE_PANE_CHANGE_ITEM_DATA;
// now update our reserved client information
pResClient->SetName(m_dhcpClient.QueryName());
pResClient->SetComment(m_dhcpClient.QueryComment());
pResClient->SetUID(m_dhcpClient.QueryHardwareAddress());
pResClient->SetClientType(m_dhcpClient.QueryClientType());
// Now we need to update the active lease record if it exists
SPITFSNodeEnum spNodeEnum;
SPITFSNode spCurrentNode;
ULONG nNumReturned = 0;
CDhcpActiveLease *pActiveLease = NULL;
spActiveLeasesNode->GetEnum(&spNodeEnum);
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
while (nNumReturned)
{
pActiveLease = GETHANDLER(CDhcpActiveLease, spCurrentNode);
if (m_dhcpClient.QueryIpAddress() == pActiveLease->GetIpAddress())
{
// Update the name and client type
pActiveLease->SetClientName(m_dhcpClient.QueryName());
spCurrentNode.Release();
break;
}
spCurrentNode.Release();
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
}
return FALSE;
}
void CReservedClientPropGeneral::OnRadioTypeBootp()
{
if (!IsDirty() &&
m_bClientType != CLIENT_TYPE_BOOTP)
{
SetDirty(TRUE);
}
}
void CReservedClientPropGeneral::OnRadioTypeBoth()
{
if (!IsDirty() &&
m_bClientType != CLIENT_TYPE_BOTH)
{
SetDirty(TRUE);
}
}
void CReservedClientPropGeneral::OnRadioTypeDhcp()
{
if (!IsDirty() &&
m_bClientType != CLIENT_TYPE_DHCP)
{
SetDirty(TRUE);
}
}