/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1997 **/ /**********************************************************************/ /* AddBootp.cpp dialog to add a bootp entry FILE HISTORY: */ #include "stdafx.h" #include "addbootp.h" #include "server.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAddBootpEntry dialog CAddBootpEntry::CAddBootpEntry ( ITFSNode * pNode, LPCTSTR pServerAddress, CWnd* pParent /*=NULL*/ ) : CBaseDialog(CAddBootpEntry::IDD, pParent), m_pBootpTable(NULL) { //{{AFX_DATA_INIT(CAddBootpEntry) m_strFileName = _T(""); m_strFileServer = _T(""); m_strImageName = _T(""); //}}AFX_DATA_INIT m_strServerAddress = pServerAddress; m_spNode.Set(pNode); } CAddBootpEntry::~CAddBootpEntry() { if (m_pBootpTable) free(m_pBootpTable); } void CAddBootpEntry::DoDataExchange(CDataExchange* pDX) { CBaseDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAddBootpEntry) DDX_Control(pDX, IDOK, m_buttonOk); DDX_Control(pDX, IDC_EDIT_BOOTP_IMAGE_NAME, m_editImageName); DDX_Control(pDX, IDC_EDIT_BOOTP_FILE_NAME, m_editFileName); DDX_Control(pDX, IDC_EDIT_BOOTP_FILE_SERVER, m_editFileServer); 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(CAddBootpEntry, CBaseDialog) //{{AFX_MSG_MAP(CAddBootpEntry) 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() ///////////////////////////////////////////////////////////////////////////// // CAddBootpEntry message handlers BOOL CAddBootpEntry::OnInitDialog() { CBaseDialog::OnInitDialog(); HandleActivation(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } DWORD CAddBootpEntry::GetBootpTable() { DWORD dwError = 0; LPDHCP_SERVER_CONFIG_INFO_V4 pServerConfig = NULL; BEGIN_WAIT_CURSOR; dwError = ::DhcpServerGetConfigV4(m_strServerAddress, &pServerConfig); END_WAIT_CURSOR; if (dwError != ERROR_SUCCESS) { ::DhcpMessageBox(dwError); return dwError; } Assert(pServerConfig); if (m_pBootpTable) { delete m_pBootpTable; m_pBootpTable = NULL; } m_nBootpTableLength = pServerConfig->cbBootTableString; if (m_nBootpTableLength > 0) { m_pBootpTable = (WCHAR *) malloc(m_nBootpTableLength); if (!m_pBootpTable) return ERROR_NOT_ENOUGH_MEMORY; // copy the bootp table into our local storage so we can modify it ::CopyMemory(m_pBootpTable, pServerConfig->wszBootTableString, m_nBootpTableLength); } // release the rpc memory ::DhcpRpcFreeMemory(pServerConfig); return dwError; } DWORD CAddBootpEntry::AddBootpEntryToTable() { UpdateData(); // calculate the length of the new entry. Entries are stored as: // Image,FileServer,FileName // So the length is the length of the three strings plus 3 characters // (two separators and a terminator). There is also a null terminator // for the entire string. int nNewBootpEntrySize = (m_strImageName.GetLength() + m_strFileServer.GetLength() + m_strFileName.GetLength() + 3) * sizeof(WCHAR); int nNewBootpTableLength, nStartIndex; nNewBootpTableLength = m_nBootpTableLength + nNewBootpEntrySize; WCHAR * pNewBootpTable; if (m_nBootpTableLength > 0) { nStartIndex = m_nBootpTableLength/sizeof(WCHAR) - 1; pNewBootpTable = (WCHAR *) realloc(m_pBootpTable, nNewBootpTableLength); } else { nStartIndex = 0; nNewBootpEntrySize += sizeof(WCHAR); // for the entire string terminator nNewBootpTableLength += sizeof(WCHAR); pNewBootpTable = (WCHAR *) malloc(nNewBootpEntrySize); } if (pNewBootpTable == NULL) return ERROR_NOT_ENOUGH_MEMORY; // format the new entry CString strNewEntry; strNewEntry.Format(_T("%s,%s,%s"), (LPCTSTR)m_strImageName, (LPCTSTR)m_strFileServer, (LPCTSTR)m_strFileName); // copy in the new entry CopyMemory(&pNewBootpTable[nStartIndex], strNewEntry, strNewEntry.GetLength() * sizeof(WCHAR)); // set the null terminator for this entry and the entire list pNewBootpTable[(nNewBootpTableLength/sizeof(WCHAR)) - 2] = '\0'; pNewBootpTable[(nNewBootpTableLength/sizeof(WCHAR)) - 1] = '\0'; m_pBootpTable = pNewBootpTable; m_nBootpTableLength = nNewBootpTableLength; return ERROR_SUCCESS; } DWORD CAddBootpEntry::SetBootpTable() { DWORD dwError = 0; DHCP_SERVER_CONFIG_INFO_V4 dhcpServerInfo; ::ZeroMemory(&dhcpServerInfo, sizeof(dhcpServerInfo)); dhcpServerInfo.cbBootTableString = m_nBootpTableLength; dhcpServerInfo.wszBootTableString = m_pBootpTable; BEGIN_WAIT_CURSOR; dwError = ::DhcpServerSetConfigV4(m_strServerAddress, Set_BootFileTable, &dhcpServerInfo); END_WAIT_CURSOR; if (dwError != ERROR_SUCCESS) { ::DhcpMessageBox(dwError); } return dwError; } void CAddBootpEntry::OnOK() { // If we haven't gotten the information yet, then do so now if (m_pBootpTable == NULL) { if (GetBootpTable() != ERROR_SUCCESS) return; } // Add whatever the user entered to the table if (AddBootpEntryToTable() != ERROR_SUCCESS) return; // write the table out if (SetBootpTable() != ERROR_SUCCESS) return; m_editImageName.SetWindowText(_T("")); m_editFileName.SetWindowText(_T("")); m_editFileServer.SetWindowText(_T("")); m_editImageName.SetFocus(); // tell the bootp folder to update it's contents // this is the easy way to update the info... we could create // and individual entry and add it, but we'll just let the // refresh mechanism handle it CDhcpBootp * pBootp = GETHANDLER(CDhcpBootp, m_spNode); pBootp->OnRefresh(m_spNode, NULL, 0, 0, 0); } void CAddBootpEntry::OnChangeEditBootpFileName() { HandleActivation(); } void CAddBootpEntry::OnChangeEditBootpFileServer() { HandleActivation(); } void CAddBootpEntry::OnChangeEditBootpImageName() { HandleActivation(); } void CAddBootpEntry::HandleActivation() { UpdateData(); if ( (m_strImageName.GetLength() > 0) && (m_strFileName.GetLength() > 0) && (m_strFileServer.GetLength() > 0) ) { m_buttonOk.EnableWindow(TRUE); } else { m_buttonOk.EnableWindow(FALSE); } }