/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1995 - 1999 **/ /**********************************************************************/ /* dhcpipar.cpp IP Array dialog FILE HISTORY: */ #include "stdafx.h" #include "dlgiparr.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDhcpIpArrayDlg dialog CDhcpIpArrayDlg::CDhcpIpArrayDlg( CDhcpOption * pdhcType, DHCP_OPTION_SCOPE_TYPE dhcScopeType, CWnd* pParent /*=NULL*/ ) : CBaseDialog(CDhcpIpArrayDlg::IDD, pParent), m_p_type( pdhcType ), m_option_type( dhcScopeType ) { //{{AFX_DATA_INIT(CDhcpIpArrayDlg) //}}AFX_DATA_INIT ASSERT( m_p_type != NULL ) ; } void CDhcpIpArrayDlg::DoDataExchange( CDataExchange* pDX ) { CBaseDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDhcpIpArrayDlg) DDX_Control(pDX, IDC_BUTN_RESOLVE, m_butn_resolve); 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_IP_ADDRS, m_list_ip_addrs); DDX_Control(pDX, IDC_EDIT_SERVER_NAME, m_edit_server); DDX_Control(pDX, IDC_BUTN_ADD, m_butn_add); DDX_Control(pDX, IDC_BUTN_DELETE, m_butn_delete); DDX_Control(pDX, IDC_BUTN_UP, m_button_Up); DDX_Control(pDX, IDC_BUTN_DOWN, m_button_Down); //}}AFX_DATA_MAP // The IP address custom control DDX_Control(pDX, IDC_IPADDR_NEW, m_ipa_new ); } BEGIN_MESSAGE_MAP(CDhcpIpArrayDlg, CBaseDialog) //{{AFX_MSG_MAP(CDhcpIpArrayDlg) 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_BN_CLICKED(IDC_HELP, OnClickedHelp) ON_LBN_SELCHANGE(IDC_LIST_IP_ADDRS, OnSelchangeListIpAddrs) ON_EN_CHANGE(IDC_EDIT_SERVER_NAME, OnChangeEditServerName) ON_BN_CLICKED(IDC_BUTN_RESOLVE, OnClickedButnResolve) ON_COMMAND(EN_SETFOCUS, OnSetFocusEditIpAddr) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDhcpIpArrayDlg message handlers BOOL CDhcpIpArrayDlg::OnInitDialog() { CBaseDialog::OnInitDialog(); DWORD err = 0 ; 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 ) ; CString str ; CATCH_MEM_EXCEPTION { 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. // INT cMax = m_p_type->QueryValue().QueryUpperBound() ; for (int i = 0; i < cMax; i++) { if (m_p_type->QueryValue().QueryIpAddr(i)) { m_dw_array.Add((DWORD) m_p_type->QueryValue().QueryIpAddr( i ) ) ; } } // // Fill the list box without toggling redraw // Fill( 0, FALSE ) ; // // Set focus on the new IP address control. // m_ipa_new.SetFocus() ; m_ipa_new.SetModify( FALSE ) ; m_edit_server.SetModify( FALSE ) ; // // Set proper button states. // HandleActivation() ; } END_MEM_EXCEPTION( err ) ; if ( err ) { ::DhcpMessageBox( err ) ; EndDialog(-1); } return FALSE ; } void CDhcpIpArrayDlg :: Fill ( INT cFocus, BOOL bToggleRedraw ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strIp; if ( bToggleRedraw ) { m_list_ip_addrs.SetRedraw( FALSE ) ; } m_list_ip_addrs.ResetContent() ; if (m_dw_array.GetSize()) { for ( INT i = 0 ; i < m_dw_array.GetSize() ; i++ ) { ASSERT(m_dw_array.GetAt(i)); ::UtilCvtIpAddrToWstr( m_dw_array.GetAt(i), &strIp ) ; m_list_ip_addrs.AddString( strIp ) ; } } else { // Set the string to "" iff the list is empty strIp.LoadString(IDS_INFO_FORMAT_IP_NONE); m_list_ip_addrs.AddString( strIp ) ; } if ( cFocus >= 0 ) { m_list_ip_addrs.SetCurSel( cFocus ) ; } if ( bToggleRedraw ) { m_list_ip_addrs.SetRedraw( TRUE ) ; m_list_ip_addrs.Invalidate() ; } } void CDhcpIpArrayDlg :: HandleActivation () { INT cItems = m_list_ip_addrs.GetCount() ; INT cFocus = m_list_ip_addrs.GetCurSel() ; m_button_Up.EnableWindow(cFocus > 0) ; m_button_Down.EnableWindow(cFocus < cItems - 1) ; m_butn_delete.EnableWindow(m_dw_array.GetSize()>0) ; m_butn_resolve.EnableWindow( m_edit_server.GetModify() ) ; // check if the focus in on a disabled control // If yes, put the focus back to list box if ( !::IsWindowEnabled( ::GetFocus())) { m_list_ip_addrs.SetFocus(); } } // CDhcpIpArrayDlg::HandleActivation() void CDhcpIpArrayDlg::OnOK() { INT cItems = (INT)m_dw_array.GetSize() ; DWORD err = 0 ; // Check for special case standard options 21 and 33 if (( !m_p_type->IsVendor()) && (( 21 == m_p_type->QueryId()) || ( 33 == m_p_type->QueryId())) && ( 0 != cItems % 2 )) { ::DhcpMessageBox( IDS_ERR_OPTION_ADDR_PAIRS ); return; } // if CATCH_MEM_EXCEPTION { CDhcpOptionValue * pdhcValue = & m_p_type->QueryValue() ; pdhcValue->SetUpperBound( cItems ) ; for ( INT i = 0 ; i < cItems ; i++ ) { pdhcValue->SetIpAddr( m_dw_array.GetAt(i), i ) ; } pdhcValue->SetIpAddr(0, i); // 0.0.0.0 IP Terminator m_p_type->SetDirty() ; } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; OnCancel() ; } else { CBaseDialog::OnOK(); } } void CDhcpIpArrayDlg::OnCancel() { CBaseDialog::OnCancel(); } void CDhcpIpArrayDlg::OnClickedButnAdd() { INT cFocus = m_list_ip_addrs.GetCurSel() ; DWORD dhipa ; m_ipa_new.GetAddress( & dhipa ) ; // Empty IP address if (!dhipa) return; DWORD err = 0 ; CATCH_MEM_EXCEPTION { if ( cFocus < 0 ) { cFocus = 0 ; } m_dw_array.InsertAt( cFocus, dhipa ) ; } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; } // // Refill listbox, update controls. // m_ipa_new.ClearAddress(); m_ipa_new.SetFocus(); Fill( cFocus ) ; HandleActivation() ; } void CDhcpIpArrayDlg::OnClickedButnDelete() { INT cFocus = m_list_ip_addrs.GetCurSel() ; if ( cFocus < 0) { return ; } DHCP_IP_ADDRESS dhipa = m_dw_array.GetAt( cFocus ) ; if (!dhipa) return; m_dw_array.RemoveAt( cFocus ) ; m_ipa_new.SetAddress( dhipa ) ; m_ipa_new.SetFocus(); Fill( cFocus ) ; HandleActivation() ; } void CDhcpIpArrayDlg::OnClickedButnDown() { INT cFocus = m_list_ip_addrs.GetCurSel() ; INT cItems = m_list_ip_addrs.GetCount() ; if ( cFocus < 0 || cFocus + 1 >= cItems ) { return ; } DHCP_IP_ADDRESS dhipa ; DWORD err = 0 ; CATCH_MEM_EXCEPTION { dhipa = m_dw_array.GetAt( cFocus ) ; m_dw_array.RemoveAt( cFocus ) ; m_dw_array.InsertAt( cFocus + 1, dhipa ) ; } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; } Fill( cFocus + 1 ) ; HandleActivation() ; } void CDhcpIpArrayDlg::OnClickedButnUp() { INT cFocus = m_list_ip_addrs.GetCurSel() ; INT cItems = m_list_ip_addrs.GetCount() ; if ( cFocus <= 0 ) { return ; } DHCP_IP_ADDRESS dhipa ; DWORD err = 0 ; CATCH_MEM_EXCEPTION { dhipa = m_dw_array.GetAt( cFocus ) ; m_dw_array.RemoveAt( cFocus ) ; m_dw_array.InsertAt( cFocus - 1, dhipa ) ; } END_MEM_EXCEPTION(err) if ( err ) { ::DhcpMessageBox( err ) ; } Fill( cFocus - 1 ) ; HandleActivation() ; } void CDhcpIpArrayDlg::OnClickedHelp() { } void CDhcpIpArrayDlg::OnSetFocusEditIpAddr() { // REVIEW t-danmo // Add code to change the default push button } void CDhcpIpArrayDlg::OnSelchangeListIpAddrs() { HandleActivation() ; } void CDhcpIpArrayDlg::OnChangeEditServerName() { HandleActivation() ; } void CDhcpIpArrayDlg::OnClickedButnResolve() { CString strHost ; DHCP_IP_ADDRESS dhipa ; DWORD err = 0 ; CATCH_MEM_EXCEPTION { m_edit_server.GetWindowText( strHost ) ; } END_MEM_EXCEPTION( err ) ; if ( err == 0 ) { if ( strHost.GetLength() == 0 ) { err = IDS_ERR_BAD_HOST_NAME ; } else { err = ::UtilGetHostAddress( strHost, & dhipa ) ; } if ( err == 0 ) { m_ipa_new.SetAddress( dhipa ) ; } } if ( err ) { ::DhcpMessageBox( err ) ; } }