#include "HostPage.h" #include "CommonUtils.h" #include "CommonNLB.h" #include "MIPAddress.h" #include "ResourceString.h" #include #include using namespace std; // // History: // -------- // // Revised by : mhakim // Date : 02-14-01 // Reason : Passing complete nic information instead of only the nic list. // // Reason : If nic selected is the one which has the connection ip, then // dip has to be connection ip. BEGIN_MESSAGE_MAP( HostPage, CPropertyPage ) ON_EN_SETFOCUS( IDC_EDIT_DED_IP, OnGainFocusDedicatedIP ) ON_EN_SETFOCUS( IDC_EDIT_DED_MASK, OnGainFocusDedicatedMask ) ON_LBN_SELCHANGE(IDC_NIC, OnSelectedNicChanged ) ON_WM_HELPINFO() ON_WM_CONTEXTMENU() END_MESSAGE_MAP() HostPage::HostPage( const _bstr_t& machine, ClusterData* p_clusterData, const vector listOfNics, const bool& isNewHost, UINT ID ) : m_machine( machine ), m_clusterData( p_clusterData ), m_nicList( listOfNics ), m_isNewHost( isNewHost ), CPropertyPage( ID ) { } void HostPage::DoDataExchange( CDataExchange* pDX ) { DDX_Control( pDX, IDC_NIC, nicName ); DDX_Control( pDX, IDC_EDIT_PRI, priority ); DDX_Control( pDX, IDC_CHECK_ACTIVE, initialState ); DDX_Control( pDX, IDC_NIC_DETAIL, detailedNicInfo ); DDX_Control( pDX, IDC_EDIT_DED_IP, ipAddress ); DDX_Control( pDX, IDC_EDIT_DED_MASK, subnetMask ); } BOOL HostPage::OnInitDialog() { CPropertyPage::OnInitDialog(); SetControlData(); return TRUE; } void HostPage::SetControlData() { // fill in nic name. for( int i = 0; i < m_nicList.size(); ++i ) { // using insertstring so we can add it to exact position. // nicName.InsertString( i, m_nicList[i].friendlyName ); } // keep a track of nic selection. m_previousSelection = nicName.SelectString( -1, m_clusterData->hosts[m_machine].hp.nicInfo.friendlyName ); // fill in detailed nic info. detailedNicInfo.SetWindowText( m_clusterData->hosts[m_machine].hp.nicInfo.fullNicName ); // fill in priority. wchar_t buf[Common::BUF_SIZE]; set availHostIDS = m_clusterData->getAvailableHostIDS(); // add this hosts priority. availHostIDS.insert( m_clusterData->hosts[m_machine].hp.hID ); set::iterator top; for( top = availHostIDS.begin(); top != availHostIDS.end(); ++top ) { swprintf( buf, L"%d", *top ); priority.AddString( buf ); } // set selection to present hostid swprintf( buf, L"%d", m_clusterData->hosts[m_machine].hp.hID ); priority.SelectString( -1, buf ); // set initial cluster state. initialState.SetCheck( m_clusterData->hosts[m_machine].hp.initialClusterStateActive ); // fill in host ip CommonUtils::fillCIPAddressCtrlString( ipAddress, m_clusterData->hosts[m_machine].hp.hIP ); // set host mask. CommonUtils::fillCIPAddressCtrlString( subnetMask, m_clusterData->hosts[m_machine].hp.hSubnetMask ); } // ReadControlData // void HostPage::ReadControlData() { wchar_t buf[Common::BUF_SIZE ]; // fill in nic name. int currentSelection = nicName.GetCurSel(); m_clusterData->hosts[m_machine].hp.nicInfo.fullNicName = m_nicList[currentSelection].fullNicName; m_clusterData->hosts[m_machine].hp.nicInfo.adapterGuid = m_nicList[currentSelection].adapterGuid; m_clusterData->hosts[m_machine].hp.nicInfo.friendlyName = m_nicList[currentSelection].friendlyName; m_clusterData->hosts[m_machine].hp.nicInfo.dhcpEnabled = m_nicList[currentSelection].dhcpEnabled; m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic = m_nicList[currentSelection].ipsOnNic; m_clusterData->hosts[m_machine].hp.nicInfo.subnetMasks = m_nicList[currentSelection].subnetMasks; // fill in priority. int selectedPriorityIndex = priority.GetCurSel(); priority.GetLBText( selectedPriorityIndex, buf ); m_clusterData->hosts[m_machine].hp.hID = _wtoi( buf ); // fill in host ip m_clusterData->hosts[m_machine].hp.hIP = CommonUtils::getCIPAddressCtrlString( ipAddress ); // set host mask. m_clusterData->hosts[m_machine].hp.hSubnetMask = CommonUtils::getCIPAddressCtrlString( subnetMask ); // set initial cluster state. m_clusterData->hosts[m_machine].hp.initialClusterStateActive = initialState.GetCheck() ? true : false; } void HostPage::OnOK() { CPropertyPage::OnOK(); } bool HostPage::isDipConfiguredOK() { // if nic selected has the connection ip then // connection ip has to match the dip to ensure // future connectivity. // // if connection ip is same as dip then no need // to worry. // if( m_clusterData->hosts[m_machine].hp.hIP == m_clusterData->hosts[m_machine].connectionIP ) { return true; } // check if selected nic has connection ip. if( find( m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.begin(), m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end(), m_clusterData->hosts[m_machine].connectionIP ) != m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end() ) { // the nic selected has the connection ip. return false; } // selected nic does not have connection ip, so dont care. return true; } BOOL HostPage::OnKillActive() { ReadControlData(); // ip is blank // subnet is blank // valid if( ( m_clusterData->hosts[m_machine].hp.hIP == _bstr_t( L"0.0.0.0") ) && ( m_clusterData->hosts[m_machine].hp.hSubnetMask == _bstr_t( L"0.0.0.0") ) ) { // both ip and subnet can be blank or 0.0.0.0 in host page. both but not // either. // // this is empty, we just need to catch this case. } else if( m_clusterData->hosts[m_machine].hp.hIP == _bstr_t( L"0.0.0.0") ) { // if only ip is blank or 0.0.0.0 then this is not allowed MessageBox( GETRESOURCEIDSTRING( IDS_PARM_DED_IP_BLANK ), GETRESOURCEIDSTRING( IDS_PARM_ERROR ), MB_ICONSTOP | MB_OK ); CPropertyPage::OnCancel(); return 0; } else { // check if ip is valid. bool isIPValid = MIPAddress::checkIfValid(m_clusterData->hosts[m_machine].hp.hIP ); if( isIPValid != true ) { MessageBox( GETRESOURCEIDSTRING( IDS_PARM_INVAL_DED_IP ), GETRESOURCEIDSTRING( IDS_PARM_ERROR ), MB_ICONSTOP | MB_OK ); CPropertyPage::OnCancel(); return 0; } // check if subnet is 0.0.0.0 // if so ask user if he wants us to fill it or not. if( m_clusterData->hosts[m_machine].hp.hSubnetMask == _bstr_t( L"0.0.0.0") ) { MessageBox( GETRESOURCEIDSTRING( IDS_PARM_DED_NM_BLANK ), GETRESOURCEIDSTRING( IDS_PARM_ERROR ), MB_ICONSTOP | MB_OK ); MIPAddress::getDefaultSubnetMask( m_clusterData->hosts[m_machine].hp.hIP, m_clusterData->hosts[m_machine].hp.hSubnetMask ); CommonUtils::fillCIPAddressCtrlString( subnetMask, m_clusterData->hosts[m_machine].hp.hSubnetMask ); CPropertyPage::OnCancel(); return 0; } // check if subnet is contiguous bool isSubnetContiguous = MIPAddress::isContiguousSubnetMask( m_clusterData->hosts[m_machine].hp.hSubnetMask ); if( isSubnetContiguous == false ) { MessageBox( GETRESOURCEIDSTRING( IDS_PARM_INVAL_DED_MASK ), GETRESOURCEIDSTRING( IDS_PARM_ERROR ), MB_ICONSTOP | MB_OK ); CPropertyPage::OnCancel(); return 0; } // check if ip address and subnet mask are valid as a pair bool isIPSubnetPairValid = MIPAddress::isValidIPAddressSubnetMaskPair( m_clusterData->hosts[m_machine].hp.hIP, m_clusterData->hosts[m_machine].hp.hSubnetMask ); if( isIPSubnetPairValid == false ) { MessageBox( GETRESOURCEIDSTRING( IDS_PARM_INVAL_DED_IP ), GETRESOURCEIDSTRING( IDS_PARM_ERROR ), MB_ICONSTOP | MB_OK ); CPropertyPage::OnCancel(); return 0; } } // Edited (mhakim 02-14-01 ) // // check if dip is properly configured. // if( isDipConfiguredOK() != true ) { MessageBox( GETRESOURCEIDSTRING( IDS_PARM_DIP_MISCONFIG ), GETRESOURCEIDSTRING( IDS_PARM_ERROR ), MB_ICONSTOP | MB_OK ); // set the dedicated ip back to the connection ip. // and mask to derived from connection ip. // m_clusterData->hosts[m_machine].hp.hIP = m_clusterData->hosts[m_machine].connectionIP; MIPAddress::getDefaultSubnetMask( m_clusterData->hosts[m_machine].hp.hIP, m_clusterData->hosts[m_machine].hp.hSubnetMask ); CommonUtils::fillCIPAddressCtrlString( ipAddress, m_clusterData->hosts[m_machine].hp.hIP ); CommonUtils::fillCIPAddressCtrlString( subnetMask, m_clusterData->hosts[m_machine].hp.hSubnetMask ); CPropertyPage::OnCancel(); return 0; } // check if dip is non zero, it must // be present on nic selected. if( m_clusterData->hosts[m_machine].hp.hIP != _bstr_t(L"0.0.0.0") ) { // check if the dip entered exists on that nic, if not display warning. if( find( m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.begin(), m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end(), m_clusterData->hosts[m_machine].hp.hIP ) == m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end() ) { // the dip specified does not exist on // nic selected. Display warning. int ignoreWarning = MessageBox( GETRESOURCEIDSTRING( IDS_INVAL_DIP ), GETRESOURCEIDSTRING( IDS_PARM_WARN ), MB_ICONEXCLAMATION | MB_YESNO ); if( ignoreWarning == IDNO ) { CPropertyPage::OnCancel(); return 0; } } } // check if nic selected is dhcp and also the connection nic. // if so this is not allowed. if( m_clusterData->hosts[m_machine].hp.nicInfo.dhcpEnabled == true ) { if( find( m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.begin(), m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end(), m_clusterData->hosts[m_machine].connectionIP ) != m_clusterData->hosts[m_machine].hp.nicInfo.ipsOnNic.end() ) { // the nic selected has the connection ip. MessageBox( GETRESOURCEIDSTRING( IDS_INVAL_DHCP_NIC ), GETRESOURCEIDSTRING( IDS_PARM_ERROR ), MB_ICONSTOP | MB_OK ); CPropertyPage::OnCancel(); return 0; } } return CPropertyPage::OnKillActive(); } void HostPage::OnSelectedNicChanged() { // do any changes if in fact // user has changed selection. // get current selection int currentSelection = nicName.GetCurSel(); if( m_previousSelection == currentSelection ) { // the nic is the same so no need // to do anything else. return; } m_previousSelection = currentSelection; detailedNicInfo.SetWindowText( m_nicList[currentSelection].fullNicName ); if( find( m_nicList[currentSelection].ipsOnNic.begin(), m_nicList[currentSelection].ipsOnNic.end(), m_clusterData->hosts[m_machine].connectionIP ) != m_nicList[currentSelection].ipsOnNic.end() ) { // this is the connection nic // make the dip the connectionIP CommonUtils::fillCIPAddressCtrlString( ipAddress, m_clusterData->hosts[m_machine].connectionIP ); _bstr_t defaultConnectionIPSubnet; MIPAddress::getDefaultSubnetMask( m_clusterData->hosts[m_machine].connectionIP, defaultConnectionIPSubnet ); CommonUtils::fillCIPAddressCtrlString( subnetMask, defaultConnectionIPSubnet ); } else { // this is not the connection nic // make the dip blank. CommonUtils::fillCIPAddressCtrlString( ipAddress, L"0.0.0.0" ); // make the subnet also blank. CommonUtils::fillCIPAddressCtrlString( subnetMask, L"0.0.0.0" ); } } BOOL HostPage::OnHelpInfo (HELPINFO* helpInfo ) { if( helpInfo->iContextType == HELPINFO_WINDOW ) { ::WinHelp( static_cast ( helpInfo->hItemHandle ), CVY_CTXT_HELP_FILE, HELP_WM_HELP, (ULONG_PTR ) g_aHelpIDs_IDD_HOST_PAGE); } return TRUE; } void HostPage::OnContextMenu( CWnd* pWnd, CPoint point ) { ::WinHelp( m_hWnd, CVY_CTXT_HELP_FILE, HELP_CONTEXTMENU, (ULONG_PTR ) g_aHelpIDs_IDD_HOST_PAGE); } void HostPage::OnGainFocusDedicatedIP() { } void HostPage::OnGainFocusDedicatedMask() { // if dedicated ip is valid // and subnet mask is blank, then generate // the default subnet mask. _bstr_t ipAddressString = CommonUtils::getCIPAddressCtrlString( ipAddress ); if( ( MIPAddress::checkIfValid( ipAddressString ) == true ) && ( subnetMask.IsBlank() == TRUE ) ) { _bstr_t subnetMaskString; MIPAddress::getDefaultSubnetMask( ipAddressString, subnetMaskString ); CommonUtils::fillCIPAddressCtrlString( subnetMask, subnetMaskString ); } }