#include "LeftView.h" #include "ClusterConnectPage.h" #include "ClusterConnectIndirectPage.h" #include "ManageVirtualIPSPage.h" #include "MachineConnectPage.h" #include "PortsControlPage.h" #include "HostPage.h" #include "ClusterPage.h" #include "ResourceString.h" #include "PortsPage.h" #include "CommonNLB.h" #include "MNLBUIData.h" #include "MNLBNetCfg.h" #include "MWmiError.h" #include "MIPAddress.h" #include "MIPAddressAdmin.h" #include "resource.h" #include #include using namespace std; IMPLEMENT_DYNCREATE( LeftView, CTreeView ) BEGIN_MESSAGE_MAP( LeftView, CTreeView ) ON_WM_RBUTTONDOWN() ON_COMMAND( ID_WORLD_CONNECT, OnWorldConnect ) ON_COMMAND( ID_WORLD_CONNECT_INDIRECT, OnWorldConnectIndirect ) ON_COMMAND( ID_WORLD_NEW, OnWorldNewCluster ) ON_COMMAND( ID_REFRESH, OnRefresh ) ON_COMMAND( ID_CLUSTER_PROPERTIES, OnClusterProperties ) ON_COMMAND( ID_CLUSTER_MANAGE_VIPS, OnClusterManageVIPS ) ON_COMMAND( ID_CLUSTER_REMOVE, OnClusterRemove ) ON_COMMAND( ID_CLUSTER_UNMANAGE, OnClusterUnmanage ) ON_COMMAND( ID_CLUSTER_ADD_HOST, OnClusterAddHost ) ON_COMMAND_RANGE( ID_CLUSTER_EXE_QUERY, ID_CLUSTER_EXE_SUSPEND, OnClusterControl ) ON_COMMAND_RANGE( ID_CLUSTER_EXE_ENABLE, ID_CLUSTER_EXE_DRAIN, OnClusterPortControl ) ON_COMMAND( ID_HOST_PROPERTIES, OnHostProperties ) ON_COMMAND( ID_HOST_REMOVE, OnHostRemove ) ON_COMMAND_RANGE( ID_HOST_EXE_QUERY, ID_HOST_EXE_SUSPEND, OnHostControl ) ON_COMMAND_RANGE( ID_HOST_EXE_ENABLE, ID_HOST_EXE_DRAIN, OnHostPortControl ) ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged) END_MESSAGE_MAP() // Sort the item in reverse alphabetical order. LeftView::LeftView() { // This is a hack as when ::dataSink calls // SetWindowText it sets both the caption // and the edit control. Thus what is written // in the log pane also comes in caption. By // making the caption initially very big // this hack ensures that the caption only shows // the title and nothing else. // This is crazy stuff, but that is what you get // when you work with mfc and its very poor doc. // One disadvantage of this is that the bottom // pane will now show a horizontal scroll bar // when it really is not required, but that is // a tradeoff if a message pane title is required. title = GETRESOURCEIDSTRING( IDS_BOTTOM_PANE_TITLE ) + L" " + GETRESOURCEIDSTRING( IDS_INFO_NEWLINE ); } LeftView::~LeftView() { } Document* LeftView::GetDocument() { return ( Document *) m_pDocument; } void LeftView::OnInitialUpdate() { CTreeView::OnInitialUpdate(); // get present style. LONG presentStyle; presentStyle = GetWindowLong( m_hWnd, GWL_STYLE ); // Set the last error to zero to avoid confusion. See sdk for SetWindowLong. SetLastError(0); // set new style. LONG rcLong; rcLong = SetWindowLong( m_hWnd, GWL_STYLE, presentStyle | TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_LINESATROOT ); // // Get and set the image list which is used by this // tree view from document. // GetTreeCtrl().SetImageList( GetDocument()->m_images48x48, TVSIL_NORMAL ); // insert root icon which is world const _bstr_t& worldLevel = GETRESOURCEIDSTRING( IDS_WORLD_NAME ); rootItem.hParent = TVI_ROOT; rootItem.hInsertAfter = TVI_FIRST; rootItem.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; rootItem.item.pszText = worldLevel; rootItem.item.cchTextMax= worldLevel.length() + 1; rootItem.item.iImage = 0; rootItem.item.iSelectedImage = 0; rootItem.item.lParam = 0; rootItem.item.cChildren = 1; GetTreeCtrl().InsertItem( &rootItem ); // // we will register // with the document class, // as we are the left pane // GetDocument()->registerLeftPane( this ); } void LeftView::OnRButtonDown( UINT nFlags, CPoint point ) { // do a hit test // here we are checking that right button is down on // a tree view item or icon. TVHITTESTINFO hitTest; hitTest.pt = point; GetTreeCtrl().HitTest( &hitTest ); if( !(hitTest.flags == TVHT_ONITEMLABEL ) && !(hitTest.flags == TVHT_ONITEMICON ) ) { return; } // make the item right clicked on the // selected item. GetTreeCtrl().SelectItem( hitTest.hItem ); LRESULT result; OnSelchanged( NULL, &result ); HTREEITEM hdlSelItem = hitTest.hItem; // get the image of the item which // has been selected. From this we can make out it it is // world level, cluster level or host level. TVITEM selItem; selItem.hItem = hdlSelItem; selItem.mask = TVIF_IMAGE ; GetTreeCtrl().GetItem( &selItem ); /// Depending upon item selected show the pop up menu. int menuIndex; switch( selItem.iImage ) { case 0: // this is world level. menuIndex = 0; break; case 1: // this is some cluster menuIndex = 1; break; case 2: // this has to be host. menuIndex = 2; break; default: // don't know how to handle this image. return; } CMenu menu; menu.LoadMenu( IDR_POPUP ); CMenu* pContextMenu = menu.GetSubMenu( menuIndex ); ClientToScreen( &point ); pContextMenu->TrackPopupMenu( TPM_RIGHTBUTTON, point.x, point.y, this ); CTreeView::OnRButtonDown(nFlags, point); } void LeftView::OnRefresh() { // Refresh is the following steps: // // * Remove the present cluster being refreshed from view. // // * Connect direct if cluster has connectedDirect = true, else indirect. // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterData = (ClusterData *) selectedItem.lParam; if( p_clusterData->connectedDirect == true ) { RefreshDirect(); } else { RefreshIndirect(); } } void LeftView::RefreshDirect() { // Refresh is the following steps: // * Remove the present cluster being refreshed from view. // * Connect direct back to the cluster. // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterData = (ClusterData *) selectedItem.lParam; // now reconnect. // ClusterConnectPage clusterConnect( p_clusterData ); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_REFRESH_CLUSTER ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &clusterConnect ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } else { // connection successful, thus remove old item. // GetTreeCtrl().DeleteItem( hdlSelectedItem ); // deleting memory of host needs to be done. // TODO // form the tree // TVINSERTSTRUCT item; item.hParent = GetTreeCtrl().GetRootItem(); item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = p_clusterData->cp.cIP; item.item.cchTextMax= p_clusterData->cp.cIP.length() + 1; item.item.iImage = 1; item.item.iSelectedImage = 1; item.item.lParam = (LPARAM ) p_clusterData; item.item.cChildren = 1; HTREEITEM clusterParent = GetTreeCtrl().InsertItem( &item ); GetTreeCtrl().Expand( GetTreeCtrl().GetRootItem(), TVE_EXPAND ); map<_bstr_t, HostData>::iterator topHostData; for( topHostData = p_clusterData->hosts.begin(); topHostData != p_clusterData->hosts.end(); ++topHostData ) { item.hParent = clusterParent; item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = (*topHostData).second.hp.machineName; item.item.cchTextMax= (*topHostData).second.hp.machineName.length() + 1; item.item.iImage = 2; item.item.iSelectedImage = 2; item.item.lParam = (LPARAM ) new _bstr_t((*topHostData).second.hp.machineName ); item.item.cChildren = 0; GetTreeCtrl().InsertItem( &item ); } GetTreeCtrl().Expand( clusterParent, TVE_EXPAND ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::RefreshIndirect() { // Refresh is the following steps: // Remove the present cluster being refreshed from view. // Connect direct or indirectly back to the cluster. // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterData = (ClusterData *) selectedItem.lParam; // now reconnect. // ClusterConnectIndirectPage clusterConnect( p_clusterData ); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_REFRESH_CLUSTER ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &clusterConnect ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } else { // connection successful, thus remove old item. // GetTreeCtrl().DeleteItem( hdlSelectedItem ); // deleting memory of host needs to be done. // TODO // form the tree // TVINSERTSTRUCT item; item.hParent = GetTreeCtrl().GetRootItem(); item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = p_clusterData->cp.cIP; item.item.cchTextMax= p_clusterData->cp.cIP.length() + 1; item.item.iImage = 1; item.item.iSelectedImage = 1; item.item.lParam = (LPARAM ) p_clusterData; item.item.cChildren = 1; HTREEITEM clusterParent = GetTreeCtrl().InsertItem( &item ); GetTreeCtrl().Expand( GetTreeCtrl().GetRootItem(), TVE_EXPAND ); map<_bstr_t, HostData>::iterator topHostData; for( topHostData = p_clusterData->hosts.begin(); topHostData != p_clusterData->hosts.end(); ++topHostData ) { item.hParent = clusterParent; item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = (*topHostData).second.hp.machineName; item.item.cchTextMax= (*topHostData).second.hp.machineName.length() + 1; item.item.iImage = 2; item.item.iSelectedImage = 2; item.item.lParam = (LPARAM ) new _bstr_t((*topHostData).second.hp.machineName ); item.item.cChildren = 0; GetTreeCtrl().InsertItem( &item ); } GetTreeCtrl().Expand( clusterParent, TVE_EXPAND ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnWorldConnect() { ClusterData* p_clusterData = new ClusterData; ClusterConnectPage clusterConnect( p_clusterData, this ); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_CONNECT_CLUSTER_CAPTION ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &clusterConnect ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { delete p_clusterData; return; } else { // we have connected directly. p_clusterData->connectedDirect = true; // form the tree // TVINSERTSTRUCT item; item.hParent = GetTreeCtrl().GetRootItem(); item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = p_clusterData->cp.cIP; item.item.cchTextMax= p_clusterData->cp.cIP.length() + 1; item.item.iImage = 1; item.item.iSelectedImage = 1; item.item.lParam = (LPARAM ) p_clusterData; item.item.cChildren = 1; HTREEITEM clusterParent = GetTreeCtrl().InsertItem( &item ); GetTreeCtrl().Expand( GetTreeCtrl().GetRootItem(), TVE_EXPAND ); map<_bstr_t, HostData>::iterator topHostData; for( topHostData = p_clusterData->hosts.begin(); topHostData != p_clusterData->hosts.end(); ++topHostData ) { item.hParent = clusterParent; item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = (*topHostData).second.hp.machineName; item.item.cchTextMax= (*topHostData).second.hp.machineName.length() + 1; item.item.iImage = 2; item.item.iSelectedImage = 2; item.item.lParam = (LPARAM ) new _bstr_t((*topHostData).second.hp.machineName ); item.item.cChildren = 0; GetTreeCtrl().InsertItem( &item ); } GetTreeCtrl().Expand( clusterParent, TVE_EXPAND ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnWorldConnectIndirect() { ClusterData* p_clusterData = new ClusterData; ClusterConnectIndirectPage clusterConnect( p_clusterData, this ); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_CONNECT_CLUSTER_CAPTION ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &clusterConnect ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { delete p_clusterData; return; } else { // form the tree // // we have connected indirectly. p_clusterData->connectedDirect = false; TVINSERTSTRUCT item; item.hParent = GetTreeCtrl().GetRootItem(); item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = p_clusterData->cp.cIP; item.item.cchTextMax= p_clusterData->cp.cIP.length() + 1; item.item.iImage = 1; item.item.iSelectedImage = 1; item.item.lParam = (LPARAM ) p_clusterData; item.item.cChildren = 1; HTREEITEM clusterParent = GetTreeCtrl().InsertItem( &item ); GetTreeCtrl().Expand( GetTreeCtrl().GetRootItem(), TVE_EXPAND ); map<_bstr_t, HostData>::iterator topHostData; for( topHostData = p_clusterData->hosts.begin(); topHostData != p_clusterData->hosts.end(); ++topHostData ) { item.hParent = clusterParent; item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = (*topHostData).second.hp.machineName; item.item.cchTextMax= (*topHostData).second.hp.machineName.length() + 1; item.item.iImage = 2; item.item.iSelectedImage = 2; item.item.lParam = (LPARAM ) new _bstr_t((*topHostData).second.hp.machineName ); item.item.cChildren = 0; GetTreeCtrl().InsertItem( &item ); } GetTreeCtrl().Expand( clusterParent, TVE_EXPAND ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnWorldNewCluster() { ClusterData* p_clusterData = new ClusterData; // set up default values. // defaults for cluster. p_clusterData->cp.cIP = L"0.0.0.0"; p_clusterData->cp.cSubnetMask = L"0.0.0.0"; p_clusterData->cp.cFullInternetName = L"www.cluster.com"; p_clusterData->cp.cNetworkAddress = L"00-00-00-00-00-00"; // defaults for port rules. PortDataELB portRule; portRule._startPort = 0; portRule._key = portRule._startPort; portRule._endPort = 65535; portRule._trafficToHandle = MNLBPortRule::Protocol::both; portRule._isEqualLoadBalanced = true; p_clusterData->portELB[0] = portRule; // // fDisablePage = false // ClusterPage clusterPage( &p_clusterData->cp, false ); PortsPage portsPage( p_clusterData ); CPropertySheet tabbedDlg( GETRESOURCEIDSTRING( IDS_PROPERTIES_CAPTION ) ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &clusterPage ); tabbedDlg.AddPage( &portsPage ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { delete p_clusterData; return; } else { // when creating assume indirect. // p_clusterData->connectedDirect = false; // check if this cluster already exists in nlbmgr view. // bool isClusterDuplicate = doesClusterExistInView( p_clusterData->cp.cIP ); if( isClusterDuplicate == true ) { MessageBox( p_clusterData->cp.cIP + L":" + GETRESOURCEIDSTRING (IDS_CLUSTER_ALREADY ), GETRESOURCEIDSTRING (IDR_MAINFRAME ), MB_ICONEXCLAMATION ); delete p_clusterData; return; } // form the tree // TVINSERTSTRUCT item; item.hParent = GetTreeCtrl().GetRootItem(); item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = p_clusterData->cp.cIP; item.item.cchTextMax= p_clusterData->cp.cIP.length() + 1; item.item.iImage = 1; item.item.iSelectedImage = 1; item.item.lParam = (LPARAM ) p_clusterData; item.item.cChildren = 1; HTREEITEM clusterParent = GetTreeCtrl().InsertItem( &item ); GetTreeCtrl().Expand( GetTreeCtrl().GetRootItem(), TVE_EXPAND ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnClusterProperties() { // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_oldSettings = (ClusterData *) selectedItem.lParam; ClusterData newSettings = *( (ClusterData *) selectedItem.lParam ); ClusterData* p_clusterData = (ClusterData *) selectedItem.lParam; ClusterPage clusterPage( &newSettings.cp, false ); PortsPage portsPage( &newSettings ); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_PROPERTIES_CAPTION ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &clusterPage ); tabbedDlg.AddPage( &portsPage ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } else { // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); dumpClusterData( &newSettings ); try { bool bClusterIpChanged; CommonNLB::changeNLBClusterAndPortSettings( p_oldSettings, &newSettings, this, &bClusterIpChanged); *p_clusterData = newSettings; if (bClusterIpChanged) { GetTreeCtrl().SetItemText(hdlSelectedItem, newSettings.cp.cIP); } } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnClusterManageVIPS() { return; // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterSettings = (ClusterData *) selectedItem.lParam; ClusterData newSettings = *( (ClusterData *) selectedItem.lParam ); ManageVirtualIPSPage manageVirtualIPSPage( &newSettings ); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_VIRTUAL_IPS_CAPTION ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &manageVirtualIPSPage ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnHostProperties() { // find tree view host member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); // get parent cluster of the selected host member. HTREEITEM hdlParentItem; hdlParentItem = GetTreeCtrl().GetParentItem( hdlSelectedItem ); TVITEM parentItem; parentItem.hItem = hdlParentItem; parentItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &parentItem ); ClusterData* p_oldSettings = (ClusterData *) parentItem.lParam; ClusterData newSettings = *( (ClusterData *) parentItem.lParam ); _bstr_t machine = *( (_bstr_t *) (selectedItem.lParam)); ClusterData* p_clusterData = (ClusterData *) parentItem.lParam; vector listOfNics; CommonNLB::NicNLBBound nicInfo; nicInfo.fullNicName = p_clusterData->hosts[machine].hp.nicInfo.fullNicName; nicInfo.adapterGuid = p_clusterData->hosts[machine].hp.nicInfo.adapterGuid; nicInfo.friendlyName = p_clusterData->hosts[machine].hp.nicInfo.friendlyName; nicInfo.ipsOnNic = p_clusterData->hosts[machine].hp.nicInfo.ipsOnNic; nicInfo.subnetMasks = p_clusterData->hosts[machine].hp.nicInfo.subnetMasks; nicInfo.isBoundToNLB = true; listOfNics.push_back( nicInfo ); HostPage hostPage( machine, &newSettings, listOfNics, false ); PortsPage portsPage( machine, &newSettings ); // // fDisablePage = true // ClusterPage clusterPage( &newSettings.cp, true ); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_PROPERTIES_CAPTION ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; // // Display the host page first // tabbedDlg.m_psh.nStartPage = 1; tabbedDlg.AddPage( &clusterPage ); tabbedDlg.AddPage( &hostPage ); tabbedDlg.AddPage( &portsPage ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } else { // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); try { CommonNLB::changeNLBHostSettings( p_oldSettings, &newSettings, machine, this ); CommonNLB::changeNLBHostPortSettings( p_oldSettings, &newSettings, machine, this ); *p_clusterData = newSettings; } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnClusterRemove() { // verify once again that user really wants to remove. int userSelection = MessageBox( GETRESOURCEIDSTRING (IDS_WARNING_CLUSTER_REMOVE ), GETRESOURCEIDSTRING (IDR_MAINFRAME ), MB_YESNO | MB_ICONEXCLAMATION ); if( userSelection == IDNO ) { return; } // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterSettings = (ClusterData *) selectedItem.lParam; // remove cluster try { // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); CommonNLB::removeCluster( p_clusterSettings, this ); // need to remove it from our view too. // and free allocated memory. GetTreeCtrl().DeleteItem( hdlSelectedItem ); // deleting memory of host needs to be done. // TODO delete p_clusterSettings; // free up the memory for the all the hosts // TODO } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnClusterUnmanage() { // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterSettings = (ClusterData *) selectedItem.lParam; // need to remove it from our view // and free allocated memory. GetTreeCtrl().DeleteItem( hdlSelectedItem ); // deleting memory of host needs to be done. // TODO delete p_clusterSettings; LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnClusterAddHost() { // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterSettings = (ClusterData *) selectedItem.lParam; ClusterData newSettings = *( (ClusterData *) selectedItem.lParam ); // get machine which needs to be added. // _bstr_t machineToConnect; MachineConnectPage machineConnectPage( &machineToConnect ); _bstr_t tabbedDlgCaptionConnect = GETRESOURCEIDSTRING( IDS_CONNECT_CAPTION ); CPropertySheet tabbedDlgConnect( tabbedDlgCaptionConnect ); tabbedDlgConnect.m_psh.dwFlags = tabbedDlgConnect.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlgConnect.AddPage( &machineConnectPage ); int rc = tabbedDlgConnect.DoModal(); if( rc != IDOK ) { return; } // connect to machine, and find nics which are there on // this machine and which have nlb bound. Also find // server name of this machine. // dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); // check if ip provided to connect is valid. bool isIPValid = MIPAddress::checkIfValid( machineToConnect ); if( isIPValid == false ) { // invalid ip. dataSink( GETRESOURCEIDSTRING( IDS_WARNING_IP_INVALID ) + machineToConnect ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); return; } // the machine ip should not be the cluster ip. if( machineToConnect == p_clusterSettings->cp.cIP ) { // cluster ip and member are same. // This is not allowed. // invalid ip. dataSink( GETRESOURCEIDSTRING( IDS_WARNING_CL_CONN_SAME ) ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); return; } vector listOfNics; _bstr_t machineServerName; try { dataSink( GETRESOURCEIDSTRING( IDS_INFO_CONNECTING ) + machineToConnect ); CommonNLB::connectToMachine( machineToConnect, machineServerName, listOfNics, this ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); return; } // check if machine has any nics if( listOfNics.size() == 0 ) { // no nics on this machine, then how the hell did we connect? dataSink( GETRESOURCEIDSTRING( IDS_WLBS_UNKNOWN ) ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); return; } // check if machine already is part of cluster. // if so we cannot add. if ( newSettings.hosts.find( machineServerName ) != newSettings.hosts.end() ) { // this host is already part of the cluster // we cannot readd. dataSink( GETRESOURCEIDSTRING( IDS_HOST_ALREADY ) ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); return; } set availHostIDS = newSettings.getAvailableHostIDS(); if( availHostIDS.size() == 0 ) { // no more available host ids. // max cluster size limit reached. dataSink( GETRESOURCEIDSTRING( IDS_CLUSTER_MAX ) ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); return; } // this machine is new // set up all defaults. // newSettings.hosts[ machineServerName ].connectionIP = machineToConnect; // need to fill in host ip and subnet. newSettings.hosts[ machineServerName ].hp.hID = *(availHostIDS.begin() ); newSettings.hosts[ machineServerName ].hp.initialClusterStateActive = true; newSettings.hosts[ machineServerName ].hp.machineName = machineServerName; newSettings.hosts[ machineServerName ].hp.hIP = machineToConnect; // find subnet corresponding to machineToConnect. // _bstr_t machineToConnectSubnet; MIPAddress::getDefaultSubnetMask( machineToConnect, machineToConnectSubnet ); newSettings.hosts[ machineServerName ].hp.hSubnetMask = machineToConnectSubnet; // make the nic selection to be the connection nic. // int i; for( i = 0; i < listOfNics.size(); ++i ) { if( find( listOfNics[i].ipsOnNic.begin(), listOfNics[i].ipsOnNic.end(), machineToConnect ) != listOfNics[i].ipsOnNic.end() ) { // connection nic found. break; } } newSettings.hosts[ machineServerName ].hp.nicInfo.fullNicName = listOfNics[i].fullNicName; newSettings.hosts[ machineServerName ].hp.nicInfo.adapterGuid = listOfNics[i].adapterGuid; newSettings.hosts[ machineServerName ].hp.nicInfo.friendlyName = listOfNics[i].friendlyName; newSettings.hosts[ machineServerName ].hp.nicInfo.ipsOnNic = listOfNics[i].ipsOnNic; newSettings.hosts[ machineServerName ].hp.nicInfo.subnetMasks = listOfNics[i].subnetMasks; // set up all port rule defaults. map::iterator topULB; for( topULB = newSettings.portULB.begin(); topULB != newSettings.portULB.end(); ++topULB ) { (*topULB).second.machineMapToLoadWeight[ machineServerName ] = 50; } map::iterator topF; for( topF = newSettings.portF.begin(); topF != newSettings.portF.end(); ++topF ) { set availPriorities = (*topF).second.getAvailablePriorities(); (*topF).second.machineMapToPriority[ machineServerName ] = *(availPriorities.begin()); } HostPage hostPage( machineServerName, &newSettings, listOfNics, true ); PortsPage portsPage( machineServerName, &newSettings ); // // fDisablePage = true // ClusterPage clusterPage( &newSettings.cp, true); _bstr_t tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_PROPERTIES_CAPTION ); CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; // // Display the host page first // tabbedDlg.m_psh.nStartPage = 1; tabbedDlg.AddPage( &clusterPage ); tabbedDlg.AddPage( &hostPage ); tabbedDlg.AddPage( &portsPage ); rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } try { // check if host to add has nlb bound on nic // specified. MNLBNetCfg nlbNetCfg( newSettings.hosts[machineServerName].connectionIP, newSettings.hosts[machineServerName].hp.nicInfo.fullNicName ); if( nlbNetCfg.isBound() == MNLBNetCfg::BOUND ) { // nlb is already bound on this machine. // ask user if he wants to really proceed. // TODO // if yes need to remove old cluster ip from // machine. _bstr_t clusterIP = Common::mapNicToClusterIP( newSettings.hosts[machineServerName].connectionIP, newSettings.hosts[machineServerName].hp.nicInfo.fullNicName ); // ask user if he wants to continue. wchar_t buffer[Common::BUF_SIZE]; swprintf( buffer, GETRESOURCEIDSTRING( IDS_NLB_ALREADY ), (wchar_t * ) newSettings.hosts[machineServerName].hp.nicInfo.friendlyName, (wchar_t * ) clusterIP ); int ignoreWarning = MessageBox( buffer, GETRESOURCEIDSTRING( IDS_PARM_WARN ), MB_ICONEXCLAMATION | MB_YESNO ); if( ignoreWarning == IDNO ) { return; } dataSink( GETRESOURCEIDSTRING( IDS_NIC_BOUND ) ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_REMOVING_CL_IP ) ); MIPAddressAdmin ipAdmin( newSettings.hosts[machineServerName].connectionIP, newSettings.hosts[machineServerName].hp.nicInfo.fullNicName ); ipAdmin.deleteIPAddress( clusterIP ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } dataSink( GETRESOURCEIDSTRING( IDS_HOST_ADDING ) ); CommonNLB::addHostToCluster( &newSettings, machineServerName, this ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_REQUEST ) ); } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); return; } // host has been added successfully, add it to nlbmanager // view. *p_clusterSettings = newSettings; TVINSERTSTRUCT item; item.hParent = hdlSelectedItem; item.hInsertAfter = TVI_LAST; item.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_CHILDREN; item.item.pszText = machineServerName; item.item.cchTextMax= machineServerName.length() + 1; item.item.iImage = 2; item.item.iSelectedImage = 2; item.item.lParam = (LPARAM ) new _bstr_t ( machineServerName ); item.item.cChildren = 0; GetTreeCtrl().InsertItem( &item ); GetTreeCtrl().Expand( hdlSelectedItem, TVE_EXPAND ); LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnHostRemove() { // verify once again that user really wants to remove. int userSelection = MessageBox( GETRESOURCEIDSTRING (IDS_WARNING_HOST_REMOVE ), GETRESOURCEIDSTRING (IDR_MAINFRAME ), MB_YESNO | MB_ICONEXCLAMATION ); if( userSelection == IDNO ) { return; } // find tree view host member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); // get parent cluster of the selected host member. HTREEITEM hdlParentItem; hdlParentItem = GetTreeCtrl().GetParentItem( hdlSelectedItem ); TVITEM parentItem; parentItem.hItem = hdlParentItem; parentItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &parentItem ); ClusterData* p_clusterSettings = (ClusterData *) parentItem.lParam; _bstr_t machine = *( (_bstr_t *) (selectedItem.lParam)); try { // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); CommonNLB::removeHost( p_clusterSettings, machine, this ); // delete this host from host list. p_clusterSettings->hosts.erase( machine ); // delete this host from ULB and F port rules map::iterator topULB; for( topULB = p_clusterSettings->portULB.begin(); topULB != p_clusterSettings->portULB.end(); ++topULB ) { (*topULB).second.machineMapToLoadWeight.erase( machine ); } map::iterator topF; for( topF = p_clusterSettings->portF.begin(); topF != p_clusterSettings->portF.end(); ++topF ) { (*topF).second.machineMapToPriority.erase( machine ); } // need to remove it from our view too. // and modify p_clusterSettings to reflect this host // no longer present GetTreeCtrl().DeleteItem( hdlSelectedItem ); // free up the memory for the display delete ( (_bstr_t *) (selectedItem.lParam)); } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnClusterControl( UINT nID ) { // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_oldSettings = (ClusterData *) selectedItem.lParam; ClusterData newSettings = *( (ClusterData *) selectedItem.lParam ); // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); dataSink( L"cluster control"); try { switch( nID ) { case ID_CLUSTER_EXE_QUERY : CommonNLB::runControlMethodOnCluster( &newSettings, this, L"query", 0 ); break; case ID_CLUSTER_EXE_START : CommonNLB::runControlMethodOnCluster( &newSettings, this, L"start", 0 ); break; case ID_CLUSTER_EXE_STOP : CommonNLB::runControlMethodOnCluster( &newSettings, this, L"stop", 0 ); break; case ID_CLUSTER_EXE_DRAINSTOP : CommonNLB::runControlMethodOnCluster( &newSettings, this, L"drainstop", 0 ); break; case ID_CLUSTER_EXE_RESUME : CommonNLB::runControlMethodOnCluster( &newSettings, this, L"resume", 0 ); break; case ID_CLUSTER_EXE_SUSPEND : CommonNLB::runControlMethodOnCluster( &newSettings, this, L"suspend", 0 ); break; default: break; } dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnClusterPortControl( UINT nID ) { // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); // find tree view cluster member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); ClusterData* p_clusterSettings = (ClusterData *) selectedItem.lParam; // check if there are any ports on which // control methods can be run. if( ( p_clusterSettings->portELB.size() == 0 ) && ( p_clusterSettings->portULB.size() == 0 ) && ( p_clusterSettings->portD.size() == 0 ) && ( p_clusterSettings->portF.size() == 0 ) ) { // there are no ports to run control method on. dataSink( GETRESOURCEIDSTRING( IDS_PORTS_CONTROL_NONE ) ); return; } unsigned long portAffected; PortsControlPage portsControlPage( p_clusterSettings, &portAffected ); _bstr_t tabbedDlgCaption; switch( nID ) { case ID_CLUSTER_EXE_ENABLE : tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_COMMAND_ENABLE ); break; case ID_CLUSTER_EXE_DISABLE : tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_COMMAND_DISABLE ); break; case ID_CLUSTER_EXE_DRAIN : tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_COMMAND_DRAIN ); break; default: break; } CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &portsControlPage ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } try { switch( nID ) { case ID_CLUSTER_EXE_ENABLE : CommonNLB::runControlMethodOnCluster( p_clusterSettings, this, L"enable", portAffected ); break; case ID_CLUSTER_EXE_DISABLE : CommonNLB::runControlMethodOnCluster( p_clusterSettings, this, L"disable", portAffected ); break; case ID_CLUSTER_EXE_DRAIN : CommonNLB::runControlMethodOnCluster( p_clusterSettings, this, L"drain", portAffected ); break; default: break; } dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnHostControl( UINT nID ) { // find tree view host member which has been selected. // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); // get parent cluster of the selected host member. HTREEITEM hdlParentItem; hdlParentItem = GetTreeCtrl().GetParentItem( hdlSelectedItem ); TVITEM parentItem; parentItem.hItem = hdlParentItem; parentItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &parentItem ); ClusterData* p_oldSettings = (ClusterData *) parentItem.lParam; ClusterData newSettings = *( (ClusterData *) parentItem.lParam ); _bstr_t machine = *( (_bstr_t *) (selectedItem.lParam)); ClusterData* p_clusterData = (ClusterData *) parentItem.lParam; // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); dataSink( L"host control"); try { switch( nID ) { case ID_HOST_EXE_QUERY : CommonNLB::runControlMethodOnHost( &newSettings, machine, this, L"query", 0 ); break; case ID_HOST_EXE_START : CommonNLB::runControlMethodOnHost( &newSettings, machine, this, L"start", 0 ); break; case ID_HOST_EXE_STOP : CommonNLB::runControlMethodOnHost( &newSettings, machine, this, L"stop", 0 ); break; case ID_HOST_EXE_DRAINSTOP : CommonNLB::runControlMethodOnHost( &newSettings, machine, this, L"drainstop", 0 ); break; case ID_HOST_EXE_RESUME : CommonNLB::runControlMethodOnHost( &newSettings, machine, this, L"resume", 0 ); break; case ID_HOST_EXE_SUSPEND : CommonNLB::runControlMethodOnHost( &newSettings, machine, this, L"suspend", 0 ); break; default: break; } dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::OnHostPortControl( UINT nID ) { // clear the old status if any. dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); // HTREEITEM hdlSelectedItem = GetTreeCtrl().GetSelectedItem(); TVITEM selectedItem; selectedItem.hItem = hdlSelectedItem; selectedItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selectedItem ); // get parent cluster of the selected host member. HTREEITEM hdlParentItem; hdlParentItem = GetTreeCtrl().GetParentItem( hdlSelectedItem ); TVITEM parentItem; parentItem.hItem = hdlParentItem; parentItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &parentItem ); ClusterData* p_clusterSettings = (ClusterData *) parentItem.lParam; // check if there are any ports on which // control methods can be run. if( ( p_clusterSettings->portELB.size() == 0 ) && ( p_clusterSettings->portULB.size() == 0 ) && ( p_clusterSettings->portD.size() == 0 ) && ( p_clusterSettings->portF.size() == 0 ) ) { // there are no ports to run control method on. dataSink( GETRESOURCEIDSTRING( IDS_PORTS_CONTROL_NONE ) ); return; } _bstr_t machine = *( (_bstr_t *) (selectedItem.lParam)); unsigned long portAffected; PortsControlPage portsControlPage( p_clusterSettings, &portAffected ); _bstr_t tabbedDlgCaption; switch( nID ) { case ID_HOST_EXE_ENABLE : tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_COMMAND_ENABLE ); break; case ID_HOST_EXE_DISABLE : tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_COMMAND_DISABLE ); break; case ID_HOST_EXE_DRAIN : tabbedDlgCaption = GETRESOURCEIDSTRING( IDS_COMMAND_DRAIN ); break; default: break; } CPropertySheet tabbedDlg( tabbedDlgCaption ); tabbedDlg.m_psh.dwFlags = tabbedDlg.m_psh.dwFlags | PSH_NOAPPLYNOW; tabbedDlg.AddPage( &portsControlPage ); int rc = tabbedDlg.DoModal(); if( rc != IDOK ) { return; } try { switch( nID ) { case ID_HOST_EXE_ENABLE : CommonNLB::runControlMethodOnHost( p_clusterSettings, machine, this, L"enable", portAffected ); break; case ID_HOST_EXE_DISABLE : CommonNLB::runControlMethodOnHost( p_clusterSettings, machine, this, L"disable", portAffected ); break; case ID_HOST_EXE_DRAIN : CommonNLB::runControlMethodOnHost( p_clusterSettings, machine, this, L"drain", portAffected ); break; default: break; } dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } catch( _com_error e ) { _bstr_t errText; GetErrorCodeText( e.Error(), errText ); dataSink( errText ); dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } LRESULT result; OnSelchanged( NULL, &result ); } void LeftView::dataSink( _bstr_t data ) { dataStore += data; dataStore += GETRESOURCEIDSTRING( IDS_INFO_NEWLINE ); GetDocument()->getStatusPane().SetWindowText( title + dataStore ); // scroll int numLines = GetDocument()->getStatusPane().GetLineCount(); GetDocument()->getStatusPane().LineScroll( numLines - 1); UpdateWindow(); } void LeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) { BOOL rcBOOL; // get selected item. // HTREEITEM hdlSelItem; hdlSelItem = GetTreeCtrl().GetSelectedItem(); TVITEM selItem; selItem.hItem = hdlSelItem; selItem.mask = TVIF_PARAM | TVIF_IMAGE; GetTreeCtrl().GetItem( &selItem ); // delete all previous items. // GetDocument()->getListPane().DeleteAllItems(); // Delete all of the previous columns. int nColumnCount = GetDocument()->getListPane().GetHeaderCtrl()->GetItemCount(); for (int i = 0; i < nColumnCount; i++) { GetDocument()->getListPane().DeleteColumn(0); } int index = 0; map::iterator top; ClusterData* p_clusterData; CWnd* pMain = AfxGetMainWnd(); CMenu* pMenu = pMain->GetMenu(); CMenu* subMenu; UINT retValue; BOOL retBool; switch( selItem.iImage ) { case 0: // this is root icon. // disable all commands at cluster and host level. // cluster menu subMenu = pMenu->GetSubMenu( 1 ); retValue = subMenu->EnableMenuItem( ID_CLUSTER_ADD_HOST, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_PROPERTIES, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_REFRESH, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_UNMANAGE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_QUERY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_START, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_STOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DRAINSTOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_RESUME, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_ENABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DISABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DRAIN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); // host menu subMenu = pMenu->GetSubMenu( 2 ); retValue = subMenu->EnableMenuItem( ID_HOST_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_PROPERTIES, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_QUERY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_START, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_STOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DRAINSTOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_RESUME, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_ENABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DISABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DRAIN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); pMain->DrawMenuBar(); GetDocument()->getListPane().InsertColumn( 0, GETRESOURCEIDSTRING( IDS_HEADER_C_IP ) , LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 1, GETRESOURCEIDSTRING( IDS_HEADER_C_SUBNET ), LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 2, GETRESOURCEIDSTRING( IDS_HEADER_INTERNET_NAME ), LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 3, GETRESOURCEIDSTRING( IDS_HEADER_MAC_ADDRESS ), LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 4, GETRESOURCEIDSTRING( IDS_HEADER_C_MODE ), LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 5, GETRESOURCEIDSTRING( IDS_HEADER_REMOTE_CTRL ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); // get children of the selected item. if( GetTreeCtrl().ItemHasChildren( hdlSelItem ) ) { HTREEITEM hNextItem; HTREEITEM hChildItem = GetTreeCtrl().GetChildItem( hdlSelItem ); index = 0; while( hChildItem != NULL ) { hNextItem = GetTreeCtrl().GetNextItem( hChildItem, TVGN_NEXT ); selItem.hItem = hChildItem; selItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &selItem ); p_clusterData = (ClusterData *) selItem.lParam; LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = index; item.iSubItem = 0; item.iImage = 1; item.pszText = p_clusterData->cp.cIP; item.cchTextMax = p_clusterData->cp.cIP.length() + 1; GetDocument()->getListPane().InsertItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 1; item.pszText = p_clusterData->cp.cSubnetMask; item.cchTextMax = p_clusterData->cp.cSubnetMask.length() + 1; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 2; item.pszText = p_clusterData->cp.cFullInternetName; item.cchTextMax = p_clusterData->cp.cFullInternetName.length() + 1; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 3; item.pszText = p_clusterData->cp.cNetworkAddress; item.cchTextMax = p_clusterData->cp.cNetworkAddress.length() + 1; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 4; if( p_clusterData->cp.multicastSupportEnabled && p_clusterData->cp.igmpSupportEnabled ) { item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_IGMP ); } else if( p_clusterData->cp.multicastSupportEnabled ) { item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_MULTICAST ); } else { item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_UNICAST ); } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 5; if( p_clusterData->cp.remoteControlEnabled ) { item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_ON ); } else { item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_OFF ); } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); hChildItem = hNextItem; ++index; } } break; case 1: // this is some cluster // enable all commands at cluster level menu. // disable all commands at host level. // cluster menu subMenu = pMenu->GetSubMenu( 1 ); retValue = subMenu->EnableMenuItem( ID_CLUSTER_ADD_HOST, MF_BYCOMMAND | MF_ENABLED ); retValue = subMenu->EnableMenuItem( ID_CLUSTER_REMOVE, MF_BYCOMMAND | MF_ENABLED ); retValue = subMenu->EnableMenuItem( ID_CLUSTER_PROPERTIES, MF_BYCOMMAND | MF_ENABLED ); retValue = subMenu->EnableMenuItem( ID_REFRESH, MF_BYCOMMAND | MF_ENABLED ); retValue = subMenu->EnableMenuItem( ID_CLUSTER_UNMANAGE, MF_BYCOMMAND | MF_ENABLED ); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_QUERY, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_START, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_STOP, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DRAINSTOP, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_RESUME, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_SUSPEND, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_SUSPEND, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_ENABLE, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DISABLE, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DRAIN, MF_BYCOMMAND | MF_ENABLED); // host menu subMenu = pMenu->GetSubMenu( 2 ); retValue = subMenu->EnableMenuItem( ID_HOST_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_PROPERTIES, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_QUERY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_START, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_STOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DRAINSTOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_RESUME, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_ENABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DISABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DRAIN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); pMain->DrawMenuBar(); GetDocument()->getListPane().InsertColumn( 0, GETRESOURCEIDSTRING( IDS_HEADER_MACHINE ) , LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 1, GETRESOURCEIDSTRING( IDS_HEADER_D_IP ) , LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 2, GETRESOURCEIDSTRING( IDS_HEADER_D_SUBNET ), LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); GetDocument()->getListPane().InsertColumn( 3, GETRESOURCEIDSTRING( IDS_HEADER_PRIORITY ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 4, GETRESOURCEIDSTRING( IDS_HEADER_INITIAL_STATE ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 5, GETRESOURCEIDSTRING( IDS_HEADER_NIC ), LVCFMT_LEFT, Document::LV_COLUMN_LARGE ); p_clusterData = (ClusterData *) selItem.lParam; index = 0; for( top = p_clusterData->hosts.begin(); top != p_clusterData->hosts.end(); ++top ) { LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = index; item.iSubItem = 0; item.iImage = 2; item.pszText = (*top).second.hp.machineName; item.cchTextMax = (*top).second.hp.machineName.length() + 1; GetDocument()->getListPane().InsertItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 1; item.pszText = (*top).second.hp.hIP; item.cchTextMax = (*top).second.hp.hIP.length() + 1; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 2; item.pszText = (*top).second.hp.hSubnetMask; item.cchTextMax = (*top).second.hp.hSubnetMask.length() + 1; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 3; wchar_t buf[Common::BUF_SIZE]; swprintf( buf, L"%d", (*top).second.hp.hID ); item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 4; if( (*top).second.hp.initialClusterStateActive ) { item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_ON ); } else { item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_OFF ); } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 5; item.pszText = (*top).second.hp.nicInfo.friendlyName; item.cchTextMax = (*top).second.hp.nicInfo.fullNicName.length() + 1; GetDocument()->getListPane().SetItem( &item ); ++index; } break; case 2: // this is some node. // disable all commands at cluster level. // enable all commands at host level. // cluster menu subMenu = pMenu->GetSubMenu( 1 ); retValue = subMenu->EnableMenuItem( ID_CLUSTER_ADD_HOST, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_PROPERTIES, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_REFRESH, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_UNMANAGE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_QUERY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_START, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_STOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DRAINSTOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_RESUME, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_SUSPEND, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_ENABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DISABLE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); retValue = subMenu->EnableMenuItem( ID_CLUSTER_EXE_DRAIN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); // host menu subMenu = pMenu->GetSubMenu( 2 ); retValue = subMenu->EnableMenuItem( ID_HOST_REMOVE, MF_BYCOMMAND | MF_ENABLED ); retValue = subMenu->EnableMenuItem( ID_HOST_PROPERTIES, MF_BYCOMMAND | MF_ENABLED ); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_QUERY, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_START, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_STOP, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DRAINSTOP, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_RESUME, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_SUSPEND, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_SUSPEND, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_ENABLE, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DISABLE, MF_BYCOMMAND | MF_ENABLED); retValue = subMenu->EnableMenuItem( ID_HOST_EXE_DRAIN, MF_BYCOMMAND | MF_ENABLED); pMain->DrawMenuBar(); GetDocument()->getListPane().InsertColumn( 0, GETRESOURCEIDSTRING( IDS_HEADER_P_START ) , LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 1, GETRESOURCEIDSTRING( IDS_HEADER_P_END ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 2, GETRESOURCEIDSTRING( IDS_HEADER_P_PROTOCOL ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 3, GETRESOURCEIDSTRING( IDS_HEADER_P_MODE ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 4, GETRESOURCEIDSTRING( IDS_HEADER_P_PRIORITY ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 5, GETRESOURCEIDSTRING( IDS_HEADER_P_LOAD ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); GetDocument()->getListPane().InsertColumn( 6, GETRESOURCEIDSTRING( IDS_HEADER_P_AFFINITY ), LVCFMT_LEFT, Document::LV_COLUMN_SMALL ); // get parent cluster of the selected host member. HTREEITEM hdlParentItem; hdlParentItem = GetTreeCtrl().GetParentItem( hdlSelItem ); TVITEM parentItem; parentItem.hItem = hdlParentItem; parentItem.mask = TVIF_PARAM; GetTreeCtrl().GetItem( &parentItem ); ClusterData* p_clusterSettings = const_cast ( (ClusterData *) parentItem.lParam ); _bstr_t machine = *( (_bstr_t *) (selItem.lParam)); wchar_t buf[Common::BUF_SIZE]; index = 0; map< long, PortDataELB>::iterator topELB; for( topELB = p_clusterSettings->portELB.begin(); topELB != p_clusterSettings->portELB.end(); ++topELB ) { // start port swprintf( buf, L"%d", (*topELB).second._startPort ); LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE;; item.iItem = index; item.iSubItem = 0; item.iImage = 4; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().InsertItem( &item ); // end port swprintf( buf, L"%d", (*topELB).second._endPort ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 1; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // protocol item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 2; switch( (*topELB).second._trafficToHandle ) { case MNLBPortRule::both : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ); break; case MNLBPortRule::tcp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ); break; case MNLBPortRule::udp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ); break; } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // mode item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 3; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_MULTIPLE ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // priority item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 4; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // load item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 5; item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_LOAD_EQUAL ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // affinity item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 6; switch( (*topELB).second._affinity ) { case MNLBPortRule::none : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_NONE ); break; case MNLBPortRule::single : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_SINGLE ); break; case MNLBPortRule::classC : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_CLASSC ); break; } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); ++index; } index = 0; map< long, PortDataULB>::iterator topULB; for( topULB = p_clusterSettings->portULB.begin(); topULB != p_clusterSettings->portULB.end(); ++topULB ) { // start port swprintf( buf, L"%d", (*topULB).second._startPort ); LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = index; item.iSubItem = 0; item.iImage = 4; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().InsertItem( &item ); // end port swprintf( buf, L"%d", (*topULB).second._endPort ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 1; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // protocol item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 2; switch( (*topULB).second._trafficToHandle ) { case MNLBPortRule::both : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ); break; case MNLBPortRule::tcp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ); break; case MNLBPortRule::udp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ); break; } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // mode item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 3; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_MULTIPLE ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // priority item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 4; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // load item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 5; swprintf( buf, L"%d", (*topULB).second.machineMapToLoadWeight[machine] ); item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // affinity item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 6; switch( (*topULB).second._affinity ) { case MNLBPortRule::none : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_NONE ); break; case MNLBPortRule::single : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_SINGLE ); break; case MNLBPortRule::classC : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_CLASSC ); break; } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); ++index; } index = 0; map< long, PortDataF>::iterator topF; for( topF = p_clusterSettings->portF.begin(); topF != p_clusterSettings->portF.end(); ++topF ) { // start port swprintf( buf, L"%d", (*topF).second._startPort ); LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = index; item.iSubItem = 0; item.iImage = 4; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().InsertItem( &item ); // end port swprintf( buf, L"%d", (*topF).second._endPort ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 1; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // protocol item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 2; switch( (*topF).second._trafficToHandle ) { case MNLBPortRule::both : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ); break; case MNLBPortRule::tcp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ); break; case MNLBPortRule::udp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ); break; } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // mode item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 3; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_SINGLE ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // priority item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 4; swprintf( buf, L"%d", (*topF).second.machineMapToPriority[machine] ); item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // load item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 5; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // affinity item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 6; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); ++index; } index = 0; map< long, PortDataD>::iterator topD; for( topD = p_clusterSettings->portD.begin(); topD != p_clusterSettings->portD.end(); ++topD ) { // start port swprintf( buf, L"%d", (*topD).second._startPort ); LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = index; item.iSubItem = 0; item.iImage = 4; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().InsertItem( &item ); // end port swprintf( buf, L"%d", (*topD).second._endPort ); item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 1; item.pszText = buf; item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // protocol item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 2; switch( (*topD).second._trafficToHandle ) { case MNLBPortRule::both : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ); break; case MNLBPortRule::tcp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ); break; case MNLBPortRule::udp : item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ); break; } item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // mode item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 3; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_DISABLED ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // priority item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 4; item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // load item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 5; item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_EMPTY ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); // affinity item.mask = LVIF_TEXT; item.iItem = index; item.iSubItem = 6; item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_EMPTY ); item.cchTextMax = 100; GetDocument()->getListPane().SetItem( &item ); ++index; } // sort it based on start port vector ports; int index; // get all the port rules presently in the list. for( index = 0; index < GetDocument()->getListPane().GetItemCount(); ++index ) { PortsPage::PortData portData; GetDocument()->getListPane().GetItemText( index, 0, buf, Common::BUF_SIZE ); portData.start_port = buf; GetDocument()->getListPane().GetItemText( index, 1, buf, Common::BUF_SIZE ); portData.end_port = buf; GetDocument()->getListPane().GetItemText( index, 2, buf, Common::BUF_SIZE ); portData.protocol = buf; GetDocument()->getListPane().GetItemText( index, 3, buf, Common::BUF_SIZE ); portData.mode = buf; GetDocument()->getListPane().GetItemText( index, 4, buf, Common::BUF_SIZE ); portData.priority = buf; GetDocument()->getListPane().GetItemText( index, 5, buf, Common::BUF_SIZE ); portData.load = buf; GetDocument()->getListPane().GetItemText( index, 6, buf, Common::BUF_SIZE ); portData.affinity = buf; ports.push_back( portData ); } sort( ports.begin(), ports.end(), comp_start_port() ); int portIndex; int itemCount = GetDocument()->getListPane().GetItemCount(); for( index = 0; index < itemCount; ++index ) { portIndex = index; GetDocument()->getListPane().SetItemText( index, 0, ports[portIndex].start_port ); GetDocument()->getListPane().SetItemText( index, 1, ports[portIndex].end_port ); GetDocument()->getListPane().SetItemText( index, 2, ports[portIndex].protocol ); GetDocument()->getListPane().SetItemText( index, 3, ports[portIndex].mode ); GetDocument()->getListPane().SetItemText( index, 4, ports[portIndex].priority ); GetDocument()->getListPane().SetItemText( index, 5, ports[portIndex].load ); GetDocument()->getListPane().SetItemText( index, 6, ports[portIndex].affinity ); } break; } *pResult = 0; } bool LeftView::doesClusterExistInView( const _bstr_t& clusterToCheck ) { HTREEITEM rootItem = GetTreeCtrl().GetRootItem(); ClusterData* p_clusterDataItem; if( GetTreeCtrl().ItemHasChildren( rootItem ) ) { HTREEITEM hNextItem; HTREEITEM hChildItem = GetTreeCtrl().GetChildItem(rootItem); while (hChildItem != NULL) { hNextItem = GetTreeCtrl().GetNextItem(hChildItem, TVGN_NEXT); p_clusterDataItem = ( ClusterData * ) GetTreeCtrl().GetItemData( hChildItem ); if( p_clusterDataItem->cp.cIP == clusterToCheck ) { // this cluster already exists. return true; } hChildItem = hNextItem; } } return false; } void LeftView::OnTest() { MIPAddressAdmin ipAdmin( L"Intel 8255x-based PCI Ethernet Adapter (10/100)" ); for( int i = 0; i < 100; ++i ) { dataSink( GETRESOURCEIDSTRING( IDS_INFO_LINE_SEPARATOR ) ); if ( ipAdmin.addIPAddress( L"1.1.1.121", L"255.0.0.0" ) != MIPAddressAdmin::MIPAddressAdmin_SUCCESS ) { dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } else { dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } if ( ipAdmin.deleteIPAddress( L"1.1.1.121" ) != MIPAddressAdmin::MIPAddressAdmin_SUCCESS ) { dataSink( GETRESOURCEIDSTRING( IDS_INFO_FAILED ) ); } else { dataSink( GETRESOURCEIDSTRING( IDS_INFO_DONE ) ); } } } void LeftView::dumpClusterData( const ClusterData* clusterData ) { map< long, PortDataELB>::iterator topELB; PortDataELB portELB; for( topELB = clusterData->portELB.begin(); topELB != clusterData->portELB.end(); ++topELB ) { portELB = (*topELB).second; } map< long, PortDataULB>::iterator topULB; PortDataULB portULB; int loadWeight; for( topULB = clusterData->portULB.begin(); topULB != clusterData->portULB.end(); ++topULB ) { portULB = (*topULB).second; map< _bstr_t, HostData>::iterator topHosts; for( topHosts = clusterData->hosts.begin(); topHosts != clusterData->hosts.end(); ++topHosts ) { loadWeight = portULB.machineMapToLoadWeight[ (*topHosts).first ]; } } map< long, PortDataF>::iterator topF; PortDataF portF; int priority; for( topF = clusterData->portF.begin(); topF != clusterData->portF.end(); ++topF ) { portF = (*topF).second; map< _bstr_t, HostData>::iterator topHosts; for( topHosts = clusterData->hosts.begin(); topHosts != clusterData->hosts.end(); ++topHosts ) { loadWeight = portF.machineMapToPriority[ (*topHosts).first ]; } } map< long, PortDataD>::iterator topD; PortDataD portD; for( topD = clusterData->portD.begin(); topD != clusterData->portD.end(); ++topD ) { portD = (*topD).second; } }