/**********************************************************************/ /** Microsoft Windows NT **/ /** Copyright(c) Microsoft Corporation, 1991 - 1999 **/ /**********************************************************************/ /* DLGBINED Binary Editor dialog FILE HISTORY: */ #include "stdafx.h" #include "dlgbined.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDlgBinEd dialog CDlgBinEd::CDlgBinEd ( CDhcpOption * pdhcType, DHCP_OPTION_SCOPE_TYPE dhcScopeType, CWnd* pParent /*=NULL*/ ) : CBaseDialog(CDlgBinEd::IDD, pParent), m_p_type( pdhcType ), m_b_decimal( TRUE ), m_b_changed( FALSE ), m_option_type( dhcScopeType ) { //{{AFX_DATA_INIT(CDlgBinEd) //}}AFX_DATA_INIT ASSERT( m_p_type != NULL ) ; } void CDlgBinEd::DoDataExchange ( CDataExchange* pDX ) { CBaseDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgBinEd) DDX_Control(pDX, IDC_RADIO_HEX, m_butn_hex); DDX_Control(pDX, IDC_RADIO_DECIMAL, m_butn_decimal); DDX_Control(pDX, IDC_STATIC_UNIT_SIZE, m_static_unit_size); DDX_Control(pDX, IDC_STATIC_OPTION_NAME, m_static_option_name); DDX_Control(pDX, IDC_STATIC_APPLICATION, m_static_application); DDX_Control(pDX, IDC_LIST_VALUES, m_list_values); DDX_Control(pDX, IDC_EDIT_VALUE, m_edit_value); DDX_Control(pDX, IDC_BUTN_DELETE, m_butn_delete); DDX_Control(pDX, IDC_BUTN_ADD, m_butn_add); DDX_Control(pDX, IDC_BUTN_UP, m_button_Up); DDX_Control(pDX, IDC_BUTN_DOWN, m_button_Down); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgBinEd, CBaseDialog) //{{AFX_MSG_MAP(CDlgBinEd) ON_BN_CLICKED(IDC_RADIO_DECIMAL, OnClickedRadioDecimal) ON_BN_CLICKED(IDC_RADIO_HEX, OnClickedRadioHex) ON_BN_CLICKED(IDC_BUTN_ADD, OnClickedButnAdd) ON_BN_CLICKED(IDC_BUTN_DELETE, OnClickedButnDelete) ON_BN_CLICKED(IDC_BUTN_DOWN, OnClickedButnDown) ON_BN_CLICKED(IDC_BUTN_UP, OnClickedButnUp) ON_LBN_SELCHANGE(IDC_LIST_VALUES, OnSelchangeListValues) ON_EN_CHANGE(IDC_EDIT_VALUE, OnChangeEditValue) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgBinEd message handlers BOOL CDlgBinEd::OnInitDialog() { CBaseDialog::OnInitDialog(); CString str ; CString strNum ; DWORD err = 0 ; int cUnitSize = 1 ; int cStrId = m_option_type == DhcpDefaultOptions ? IDS_INFO_TITLE_DEFAULT_OPTIONS : (m_option_type == DhcpGlobalOptions ? IDS_INFO_TITLE_GLOBAL_OPTIONS : IDS_INFO_TITLE_SCOPE_OPTIONS ) ; switch ( m_p_type->QueryValue().QueryDataType() ) { case DhcpWordOption: cUnitSize = 2 ; break ; case DhcpDWordOption: cUnitSize = 4 ; break ; case DhcpDWordDWordOption: cUnitSize = 8 ; break ; } CATCH_MEM_EXCEPTION { strNum.Format(_T("%d"), cUnitSize); m_static_unit_size.SetWindowText( strNum ) ; m_static_option_name.SetWindowText( m_p_type->QueryName() ) ; str.LoadString( cStrId ) ; m_static_application.SetWindowText( str ) ; // // Fill the internal list from the current value. // FillArray() ; Fill( 0, TRUE ) ; // // Set focus on the new value edit control. // m_edit_value.SetFocus() ; m_edit_value.SetModify( FALSE ); // // Fiddle with the buttons. // HandleActivation() ; } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; EndDialog(-1); } return FALSE; // return TRUE unless you set the focus to a control } // CDlgBinEd::OnInitDialog() // // Convert the existing values into an array for dialog manipualation // void CDlgBinEd::FillArray() { // // Fill the internal list from the current value. // INT cMax; DHCP_OPTION_DATA_TYPE optionType = m_p_type->QueryValue().QueryDataType(); switch ( optionType ) { case DhcpBinaryDataOption : case DhcpEncapsulatedDataOption : cMax = (INT)m_p_type->QueryValue().QueryBinaryArray()->GetSize() ; break; default: cMax = (INT)m_p_type->QueryValue().QueryUpperBound() ; break; } for ( INT i = 0 ; i < cMax ; i++ ) { if (optionType == DhcpDWordDWordOption) { m_dwdw_array.SetAtGrow( i, m_p_type->QueryValue().QueryDwordDword( i ) ) ; } else { m_dw_array.SetAtGrow( i, (DWORD) m_p_type->QueryValue().QueryNumber( i ) ) ; } } } BOOL CDlgBinEd :: ConvertValue ( DWORD dwValue, CString & strValue ) { const TCHAR * pszMaskHex = _T("%#x"); const TCHAR * pszMaskDec = _T("%u"); const TCHAR * pszMask = m_b_decimal ? pszMaskDec : pszMaskHex; TCHAR szNum [ STRING_LENGTH_MAX ] ; DWORD err = 0 ; CATCH_MEM_EXCEPTION { ::wsprintf( szNum, pszMask, dwValue ) ; strValue = szNum ; } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; EndDialog( -1 ) ; } return err == 0 ; } BOOL CDlgBinEd :: ConvertValue ( DWORD_DWORD dwdwValue, CString & strValue ) { DWORD err = 0 ; CATCH_MEM_EXCEPTION { ::UtilConvertDwordDwordToString(&dwdwValue, &strValue, m_b_decimal); } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; EndDialog( -1 ) ; } return err == 0 ; } // // Fill the list box // void CDlgBinEd::Fill ( INT cFocus, BOOL bToggleRedraw ) { if ( bToggleRedraw ) { m_list_values.SetRedraw( FALSE ) ; } m_list_values.ResetContent() ; CString strValue ; DHCP_OPTION_DATA_TYPE optionType = m_p_type->QueryValue().QueryDataType(); INT cMax = (INT)((optionType == DhcpDWordDWordOption) ? m_dwdw_array.GetSize() : m_dw_array.GetSize()); INT i ; DWORD_DWORD LongIntValue; DWORD LongValue; for ( i = 0 ; i < cMax ; i++ ) { switch (optionType) { case DhcpDWordDWordOption: if ( ! ConvertValue( m_dwdw_array.GetAt( i ), strValue ) ) { continue ; } break; default: if ( ! ConvertValue( m_dw_array.GetAt( i ), strValue ) ) { continue ; } break; } m_list_values.AddString( strValue ) ; } if ( cFocus >= 0 && cFocus < cMax ) { m_list_values.SetCurSel( cFocus ) ; } else { m_list_values.SetCurSel( 0 ); } if ( bToggleRedraw ) { m_list_values.SetRedraw( TRUE ) ; m_list_values.Invalidate() ; } // convert the value being edited m_edit_value.GetWindowText( strValue ); if ( !strValue.IsEmpty()) { DWORD maxVal; if ( DhcpByteOption == optionType ) { maxVal = 0xff; } else if ( DhcpWordOption == optionType ) { maxVal = 0xffff; } else { maxVal = 0xffffffff; } if ( DhcpDWordDWordOption == optionType ) { UtilConvertStringToDwordDword( strValue, &LongIntValue ); UtilConvertDwordDwordToString( &LongIntValue, &strValue, m_b_decimal ); } else { FGetCtrlDWordValue( m_edit_value.GetSafeHwnd(), &LongValue, 0, maxVal ); ConvertValue( LongValue, strValue ); } m_edit_value.SetWindowText( strValue ); } // if } // CDlgBinEd::Fill() // // Handle changes in the dialog // void CDlgBinEd::HandleActivation() { INT cSel = m_list_values.GetCurSel(); INT cMax = (m_p_type->QueryValue().QueryDataType() == DhcpDWordDWordOption) ? (INT)m_dwdw_array.GetSize() : (INT)m_dw_array.GetSize() ; BOOL bModified = m_edit_value.GetWindowTextLength() > 0; m_button_Up.EnableWindow( cSel >= 1 ) ; m_button_Down.EnableWindow( cSel + 1 < cMax ) ; m_butn_add.EnableWindow( bModified ) ; m_butn_delete.EnableWindow( cSel >= 0 ) ; m_butn_hex.SetCheck( m_b_decimal == 0 ) ; m_butn_decimal.SetCheck( m_b_decimal > 0 ) ; // check if the focus in on a disabled control // If yes, put the focus back to list box if ( !::IsWindowEnabled( ::GetFocus())) { m_list_values.SetFocus(); } } // CDlgBinEd::HandleActivation() void CDlgBinEd::OnClickedRadioDecimal() { m_b_decimal = TRUE ; Fill() ; HandleActivation() ; } void CDlgBinEd::OnClickedRadioHex() { m_b_decimal = FALSE ; Fill() ; HandleActivation() ; } void CDlgBinEd::OnClickedButnAdd() { INT cFocus = m_list_values.GetCurSel() ; DWORD dwValue; DWORD_DWORD dwdw; DHCP_OPTION_DATA_TYPE optionType = m_p_type->QueryValue().QueryDataType(); DWORD dwMask = 0xFFFFFFFF ; ASSERT(m_p_type); switch ( optionType ) { case DhcpBinaryDataOption : case DhcpEncapsulatedDataOption : case DhcpByteOption: dwMask = 0xFF ; break ; case DhcpWordOption: dwMask = 0xFFFF ; break ; } // switch if (optionType == DhcpDWordDWordOption) { CString strValue; m_edit_value.GetWindowText(strValue); UtilConvertStringToDwordDword(strValue, &dwdw); } else { if (!FGetCtrlDWordValue(m_edit_value.m_hWnd, &dwValue, 0, dwMask)) return; } DWORD err = 0 ; CATCH_MEM_EXCEPTION { if ( cFocus < 0 ) { cFocus = 0 ; } (optionType == DhcpDWordDWordOption) ? m_dwdw_array.InsertAt( cFocus, dwdw ) : m_dw_array.InsertAt( cFocus, dwValue ) ; } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; } else { m_b_changed = TRUE ; } // // Refill listbox, update controls. clear the edit control // m_edit_value.SetWindowText(_T("")); m_edit_value.SetFocus(); Fill( cFocus ) ; HandleActivation() ; } // CDlgBinEd::OnClickedButnAdd() void CDlgBinEd::OnClickedButnDelete() { INT cFocus = m_list_values.GetCurSel() ; if ( cFocus < 0 ) { return ; } DWORD err = 0 ; CString strValue ; DWORD dwValue; DWORD_DWORD dwdw; DHCP_OPTION_DATA_TYPE optionType = m_p_type->QueryValue().QueryDataType(); CATCH_MEM_EXCEPTION { if (optionType == DhcpDWordDWordOption) { dwdw = m_dwdw_array.GetAt( cFocus ) ; m_dwdw_array.RemoveAt( cFocus ) ; ConvertValue( dwdw, strValue ) ; } else { dwValue = m_dw_array.GetAt( cFocus ) ; m_dw_array.RemoveAt( cFocus ) ; ConvertValue( dwValue, strValue ) ; } } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; EndDialog( -1 ) ; } else { m_b_changed = TRUE ; } cFocus--; if ( cFocus < 0 ) { cFocus = 0; } m_edit_value.SetWindowText( strValue ) ; m_edit_value.SetFocus(); Fill( cFocus ) ; HandleActivation() ; } void CDlgBinEd::OnClickedButnDown() { INT cFocus = m_list_values.GetCurSel() ; INT cItems = m_list_values.GetCount() ; if ( cFocus < 0 || cFocus + 1 >= cItems ) { return ; } DWORD dwValue ; DWORD err = 0 ; DWORD_DWORD dwdw; DHCP_OPTION_DATA_TYPE optionType = m_p_type->QueryValue().QueryDataType(); CATCH_MEM_EXCEPTION { if (optionType == DhcpDWordDWordOption) { dwdw = m_dwdw_array.GetAt( cFocus ) ; m_dwdw_array.RemoveAt( cFocus ) ; m_dwdw_array.InsertAt( cFocus + 1, dwdw ) ; } else { dwValue = m_dw_array.GetAt( cFocus ) ; m_dw_array.RemoveAt( cFocus ) ; m_dw_array.InsertAt( cFocus + 1, dwValue ) ; } } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; } else { m_b_changed = TRUE ; } Fill( cFocus + 1 ) ; HandleActivation() ; } void CDlgBinEd::OnClickedButnUp() { INT cFocus = m_list_values.GetCurSel() ; INT cItems = m_list_values.GetCount() ; if ( cFocus <= 0 ) { return ; } DWORD dwValue ; DWORD err = 0 ; DWORD_DWORD dwdw; DHCP_OPTION_DATA_TYPE optionType = m_p_type->QueryValue().QueryDataType(); CATCH_MEM_EXCEPTION { if (optionType == DhcpDWordDWordOption) { dwdw = m_dwdw_array.GetAt( cFocus ) ; m_dwdw_array.RemoveAt( cFocus ) ; m_dwdw_array.InsertAt( cFocus - 1, dwdw ) ; } else { dwValue = m_dw_array.GetAt( cFocus ) ; m_dw_array.RemoveAt( cFocus ) ; m_dw_array.InsertAt( cFocus - 1, dwValue ) ; } } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; } else { m_b_changed = TRUE ; } Fill( cFocus - 1 ) ; HandleActivation() ; } void CDlgBinEd::OnSelchangeListValues() { HandleActivation() ; } void CDlgBinEd::OnOK() { DWORD err = 0 ; if ( m_b_changed ) { CDhcpOptionValue & cValue = m_p_type->QueryValue() ; DHCP_OPTION_DATA_TYPE optionType = m_p_type->QueryValue().QueryDataType(); CATCH_MEM_EXCEPTION { if (optionType == DhcpDWordDWordOption) { cValue.SetUpperBound( (INT)m_dwdw_array.GetSize() ) ; for ( int i = 0 ; i < m_dwdw_array.GetSize() ; i++ ) { cValue.SetDwordDword( m_dwdw_array.GetAt( i ), i ) ; } } else { cValue.SetUpperBound( (INT)m_dw_array.GetSize() ) ; for ( int i = 0 ; i < m_dw_array.GetSize() ; i++ ) { cValue.SetNumber( m_dw_array.GetAt( i ), i ) ; } } } END_MEM_EXCEPTION( err ) ; if ( err ) { ::DhcpMessageBox( err ) ; EndDialog( -1 ) ; } else { m_p_type->SetDirty() ; CBaseDialog::OnOK(); } } else { OnCancel() ; } } void CDlgBinEd::OnCancel() { CBaseDialog::OnCancel(); } void CDlgBinEd::OnChangeEditValue() { HandleActivation() ; }