/**********************************************************************/ /** 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); }