/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/ /* ClassMod.cpp This file contains all of the prototypes for the option class modification dialog. FILE HISTORY: */ #include "stdafx.h" #include "ClassMod.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /*--------------------------------------------------------------------------- Class CWndHexEdit implementation ---------------------------------------------------------------------------*/ // Static class-level data // Super window proc address WNDPROC CWndHexEdit::m_wproc_super = NULL; // Window class initialization flag BOOL CWndHexEdit::m_b_inited = FALSE; WNDPROC * CWndHexEdit::GetSuperWndProcAddr() { return &m_wproc_super; } BOOL CWndHexEdit::CreateWindowClass ( HINSTANCE hInstance ) { Trace0("CWndHexEdit::CreateWindowClass\n"); if ( ! m_b_inited ) { m_b_inited = ::RegisterHexEditClass( hInstance ) ; } return m_b_inited ; } IMPLEMENT_DYNAMIC(CWndHexEdit, CWnd) CWndHexEdit::CWndHexEdit() { } CWndHexEdit::~CWndHexEdit() { DestroyWindow(); } BOOL CWndHexEdit::Create ( LPCTSTR lpszText, DWORD dwStyle, const RECT & rect, CWnd * pParentWnd, UINT nID ) { return CWnd::Create( TEXT("HEX"), lpszText, dwStyle, rect, pParentWnd, nID); } /*--------------------------------------------------------------------------- Class CClassInfoArray implementation ---------------------------------------------------------------------------*/ CClassInfoArray::CClassInfoArray() { } CClassInfoArray::~CClassInfoArray() { } DWORD CClassInfoArray::RefreshData(LPCTSTR pServer) { DWORD dwErr; HRESULT hr = hrOK; DHCP_RESUME_HANDLE dhcpResumeHandle = NULL; LPDHCP_CLASS_INFO_ARRAY pClassInfoArray = NULL; DWORD dwRead = 0, dwTotal = 0; CClassInfo ClassInfo; UINT i, j; Assert(pServer != NULL); if (pServer == NULL) return ERROR_INVALID_PARAMETER; // clear all of the old entries RemoveAll(); dwErr = ::DhcpEnumClasses((LPTSTR) pServer, 0, &dhcpResumeHandle, 0xFFFFFFFF, &pClassInfoArray, &dwRead, &dwTotal); Trace3("CClassInfoArray::RefreshData - DhcpEnumClasses returned %d, dwRead %d, dwTotal %d.\n", dwErr, dwRead, dwTotal); if (dwErr == ERROR_NO_MORE_ITEMS) return ERROR_SUCCESS; if (dwErr != ERROR_SUCCESS) return dwErr; Assert(pClassInfoArray); for (i = 0; i < pClassInfoArray->NumElements; i++) { COM_PROTECT_TRY { // fill in our internal class info structure ClassInfo.strName = pClassInfoArray->Classes[i].ClassName; ClassInfo.strComment = pClassInfoArray->Classes[i].ClassComment; ClassInfo.bIsVendor = pClassInfoArray->Classes[i].IsVendor; ClassInfo.baData.RemoveAll(); // now copy out the data for (j = 0; j < pClassInfoArray->Classes[i].ClassDataLength; j++) { ClassInfo.baData.Add(pClassInfoArray->Classes[i].ClassData[j]); } Add(ClassInfo); } COM_PROTECT_CATCH } if (pClassInfoArray) ::DhcpRpcFreeMemory(pClassInfoArray); if (dwErr == ERROR_NO_MORE_ITEMS) dwErr = ERROR_SUCCESS; return dwErr; } BOOL CClassInfoArray::RemoveClass(LPCTSTR pClassName) { BOOL bRemoved = FALSE; for (int i = 0; i < GetSize(); i++) { if (GetAt(i).strName.CompareNoCase(pClassName) == 0) { RemoveAt(i); bRemoved = TRUE; break; } } return bRemoved; } DWORD CClassInfoArray::ModifyClass(LPCTSTR pServer, CClassInfo & classInfo) { DWORD dwError = 0; DHCP_CLASS_INFO dhcpClassInfo; dhcpClassInfo.ClassName = (LPWSTR) ((LPCTSTR) classInfo.strName); dhcpClassInfo.ClassComment = (LPWSTR) ((LPCTSTR) classInfo.strComment); dhcpClassInfo.ClassDataLength = (DWORD) classInfo.baData.GetSize(); dhcpClassInfo.ClassData = classInfo.baData.GetData(); dhcpClassInfo.IsVendor = classInfo.bIsVendor; dwError = ::DhcpModifyClass((LPWSTR) ((LPCTSTR) pServer), 0, &dhcpClassInfo); if (dwError == ERROR_SUCCESS) { for (int i = 0; i < GetSize(); i++) { if (GetAt(i).strName.CompareNoCase(classInfo.strName) == 0) { m_pData[i].strComment = classInfo.strComment; m_pData[i].baData.RemoveAll(); for (int j = 0; j < classInfo.baData.GetSize(); j++) { m_pData[i].baData.Add(classInfo.baData[j]); } break; } } } return dwError; } BOOL CClassInfoArray::IsValidClass(LPCTSTR pClassName) { BOOL bExists = FALSE; if (pClassName == NULL) return TRUE; for (int i = 0; i < GetSize(); i++) { if (GetAt(i).strName.CompareNoCase(pClassName) == 0) { bExists = TRUE; break; } } return bExists; } DWORD CClassInfoArray::AddClass(LPCTSTR pServer, CClassInfo & classInfo) { DWORD dwError = 0; DHCP_CLASS_INFO dhcpClassInfo; dhcpClassInfo.ClassName = (LPWSTR) ((LPCTSTR) classInfo.strName); dhcpClassInfo.ClassComment = (LPWSTR) ((LPCTSTR) classInfo.strComment); dhcpClassInfo.ClassDataLength = (DWORD) classInfo.baData.GetSize(); dhcpClassInfo.ClassData = classInfo.baData.GetData(); dhcpClassInfo.IsVendor = classInfo.bIsVendor; dwError = ::DhcpCreateClass((LPWSTR) ((LPCTSTR) pServer), 0, &dhcpClassInfo); if (dwError == ERROR_SUCCESS) { Add(classInfo); } return dwError; } ///////////////////////////////////////////////////////////////////////////// // CDhcpModifyClass dialog CDhcpModifyClass::CDhcpModifyClass(CClassInfoArray * pClassArray, LPCTSTR pszServer, BOOL bCreate, DWORD dwType, CWnd* pParent /*=NULL*/) : CBaseDialog(CDhcpModifyClass::IDD, pParent) { //{{AFX_DATA_INIT(CDhcpModifyClass) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_strServer = pszServer; m_pClassInfoArray = pClassArray; m_pHexEditData = NULL; m_bDirty = FALSE; m_dwType = dwType; m_bCreate = bCreate; } void CDhcpModifyClass::DoDataExchange(CDataExchange* pDX) { CBaseDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDhcpModifyClass) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP DDX_Control(pDX, IDC_VALUEDATA, m_hexData); } BEGIN_MESSAGE_MAP(CDhcpModifyClass, CBaseDialog) //{{AFX_MSG_MAP(CDhcpModifyClass) ON_EN_CHANGE(IDC_VALUENAME, OnChangeValuename) ON_EN_CHANGE(IDC_VALUECOMMENT, OnChangeValuecomment) //}}AFX_MSG_MAP ON_EN_CHANGE(IDC_VALUEDATA, OnChangeValueData) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDhcpModifyClass message handlers BOOL CDhcpModifyClass::OnInitDialog() { CBaseDialog::OnInitDialog(); CString strTitle; // initialze the name and comment if (!m_bCreate) { int len; SetDlgItemText(IDC_VALUENAME, m_EditValueParam.pValueName); SetDlgItemText(IDC_VALUECOMMENT, m_EditValueParam.pValueComment); ((CEdit *) GetDlgItem(IDC_VALUENAME))->SetReadOnly(TRUE); // initialize the hexedit data // since the data can grow, we need to supply a buffer big enough // If it exceeds the size, limit it to the buffer size ZeroMemory(m_buffer, sizeof(m_buffer)); len = ( m_EditValueParam.cbValueData <= sizeof( m_buffer )) ? m_EditValueParam.cbValueData : sizeof( m_buffer ); memcpy( m_buffer, m_EditValueParam.pValueData, len ); m_EditValueParam.cbValueData = len; strTitle.LoadString(IDS_EDIT_CLASS_TITLE); } else { // we're creating a new class. No data yet. m_EditValueParam.cbValueData = 0; memset(m_buffer, 0, sizeof(m_buffer)); strTitle.LoadString(IDS_NEW_CLASS_TITLE); } this->SetWindowText(strTitle); SendDlgItemMessage(IDC_VALUEDATA, HEM_SETBUFFER, (WPARAM) m_EditValueParam.cbValueData, (LPARAM) m_buffer); SetDirty(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDhcpModifyClass::OnChangeValuename() { SetDirty(TRUE); } void CDhcpModifyClass::OnChangeValuecomment() { SetDirty(TRUE); } void CDhcpModifyClass::OnChangeValueData() { SetDirty(TRUE); } void CDhcpModifyClass::OnOK() { DWORD dwError = 0; DHCP_CLASS_INFO dhcpClassInfo; GetDlgItemText(IDC_VALUENAME, m_strName); GetDlgItemText(IDC_VALUECOMMENT, m_strComment); m_pHexEditData = (HEXEDITDATA *) GetWindowLongPtr(GetDlgItem(IDC_VALUEDATA)->GetSafeHwnd(), GWLP_USERDATA); Assert(m_pHexEditData); if (m_strName.IsEmpty()) { // user didn't enter any data to describe the class AfxMessageBox(IDS_CLASSID_NO_NAME); GetDlgItem(IDC_VALUENAME)->SetFocus(); return; } if (m_pHexEditData->cbBuffer == 0) { // user didn't enter any data to describe the class AfxMessageBox(IDS_CLASSID_NO_DATA); GetDlgItem(IDC_VALUEDATA)->SetFocus(); return; } CClassInfo ClassInfo; ClassInfo.strName = m_strName; ClassInfo.strComment = m_strComment; ClassInfo.bIsVendor = (m_dwType == CLASS_TYPE_VENDOR) ? TRUE : FALSE; // now the data for (int i = 0; i < m_pHexEditData->cbBuffer; i++) { ClassInfo.baData.Add(m_pHexEditData->pBuffer[i]); } if (m_bCreate) { // create the class now dwError = m_pClassInfoArray->AddClass(m_strServer, ClassInfo); if (dwError != ERROR_SUCCESS) { ::DhcpMessageBox(dwError); return; } } else { if (m_bDirty) { // we are modifing a class and something has changed. Update now. BEGIN_WAIT_CURSOR; dwError = m_pClassInfoArray->ModifyClass(m_strServer, ClassInfo); if (dwError != ERROR_SUCCESS) { DhcpMessageBox(dwError); GetDlgItem(IDC_VALUENAME)->SetFocus(); return; } END_WAIT_CURSOR; } } CBaseDialog::OnOK(); }