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

209 lines
5.3 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1999 - 1999 **/
/**********************************************************************/
/*
bootppp.cpp
The bootp properties page
FILE HISTORY:
*/
#include "stdafx.h"
#include "bootppp.h"
#include "nodes.h"
#include "server.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
// CBootpProperties holder
//
/////////////////////////////////////////////////////////////////////////////
CBootpProperties::CBootpProperties
(
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);
}
CBootpProperties::~CBootpProperties()
{
RemovePageFromList((CPropertyPageBase*) &m_pageGeneral, FALSE);
}
/////////////////////////////////////////////////////////////////////////////
// CBootpPropGeneral property page
IMPLEMENT_DYNCREATE(CBootpPropGeneral, CPropertyPageBase)
CBootpPropGeneral::CBootpPropGeneral() : CPropertyPageBase(CBootpPropGeneral::IDD)
{
//{{AFX_DATA_INIT(CBootpPropGeneral)
m_strFileName = _T("");
m_strFileServer = _T("");
m_strImageName = _T("");
//}}AFX_DATA_INIT
}
CBootpPropGeneral::~CBootpPropGeneral()
{
}
void CBootpPropGeneral::DoDataExchange(CDataExchange* pDX)
{
CPropertyPageBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBootpPropGeneral)
DDX_Text(pDX, IDC_EDIT_BOOTP_FILE_NAME, m_strFileName);
DDX_Text(pDX, IDC_EDIT_BOOTP_FILE_SERVER, m_strFileServer);
DDX_Text(pDX, IDC_EDIT_BOOTP_IMAGE_NAME, m_strImageName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBootpPropGeneral, CPropertyPageBase)
//{{AFX_MSG_MAP(CBootpPropGeneral)
ON_EN_CHANGE(IDC_EDIT_BOOTP_FILE_NAME, OnChangeEditBootpFileName)
ON_EN_CHANGE(IDC_EDIT_BOOTP_FILE_SERVER, OnChangeEditBootpFileServer)
ON_EN_CHANGE(IDC_EDIT_BOOTP_IMAGE_NAME, OnChangeEditBootpImageName)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBootpPropGeneral message handlers
BOOL CBootpPropGeneral::OnApply()
{
UpdateData();
BOOL bRet = CPropertyPageBase::OnApply();
if (bRet == FALSE)
{
// Something bad happened... grab the error code
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
::DhcpMessageBox(GetHolder()->GetError());
}
return bRet;
}
BOOL CBootpPropGeneral::OnPropertyChange(BOOL bScope, LONG_PTR *ChangeMask)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
SPITFSNode spBootpNode, spBootpFolder;
spBootpNode = GetHolder()->GetNode();
CDhcpBootpEntry * pBootpEntry = GETHANDLER(CDhcpBootpEntry, spBootpNode);
spBootpNode->GetParent(&spBootpFolder);
// update the node's data
pBootpEntry->SetBootImage(m_strImageName);
pBootpEntry->SetFileServer(m_strFileServer);
pBootpEntry->SetFileName(m_strFileName);
*ChangeMask = RESULT_PANE_CHANGE_ITEM_DATA;
// now we need to calculate how big of a string to allocate
// for the bootp table
int nBootpTableLength = 0;
SPITFSNodeEnum spNodeEnum;
SPITFSNode spCurrentNode;
ULONG nNumReturned = 0;
spBootpFolder->GetEnum(&spNodeEnum);
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
while (nNumReturned)
{
CDhcpBootpEntry * pCurBootpEntry = GETHANDLER(CDhcpBootpEntry, spCurrentNode);
nBootpTableLength += pCurBootpEntry->CchGetDataLength();
spCurrentNode.Release();
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
}
// allocate the memory
int nBootpTableLengthBytes = nBootpTableLength * sizeof(WCHAR);
WCHAR * pBootpTable = (WCHAR *) _alloca(nBootpTableLengthBytes);
WCHAR * pBootpTableTemp = pBootpTable;
ZeroMemory(pBootpTable, nBootpTableLengthBytes);
spNodeEnum->Reset();
// now enumerate again and store the strings
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
while (nNumReturned)
{
CDhcpBootpEntry * pCurBootpEntry = GETHANDLER(CDhcpBootpEntry, spCurrentNode);
pBootpTableTemp = pCurBootpEntry->PchStoreData(pBootpTableTemp);
spCurrentNode.Release();
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
}
// now write to the server
DWORD dwError = 0;
DHCP_SERVER_CONFIG_INFO_V4 dhcpServerInfo;
::ZeroMemory(&dhcpServerInfo, sizeof(dhcpServerInfo));
dhcpServerInfo.cbBootTableString = (DWORD) ((pBootpTableTemp - pBootpTable) + 1) * sizeof(WCHAR);
dhcpServerInfo.wszBootTableString = pBootpTable;
CDhcpBootp * pBootpFolder = GETHANDLER(CDhcpBootp, spBootpFolder);
BEGIN_WAIT_CURSOR;
dwError = ::DhcpServerSetConfigV4(pBootpFolder->GetServerObject(spBootpFolder)->GetIpAddress(),
Set_BootFileTable,
&dhcpServerInfo);
END_WAIT_CURSOR;
if (dwError != ERROR_SUCCESS)
{
GetHolder()->SetError(dwError);
return FALSE;
}
return FALSE;
}
void CBootpPropGeneral::OnChangeEditBootpFileName()
{
SetDirty(TRUE);
}
void CBootpPropGeneral::OnChangeEditBootpFileServer()
{
SetDirty(TRUE);
}
void CBootpPropGeneral::OnChangeEditBootpImageName()
{
SetDirty(TRUE);
}