|
|
#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 <vector>
#include <algorithm>
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<CommonNLB::NicNLBBound> 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<CommonNLB::NicNLBBound> 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<int> 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<long, PortDataULB>::iterator topULB; for( topULB = newSettings.portULB.begin(); topULB != newSettings.portULB.end(); ++topULB ) { (*topULB).second.machineMapToLoadWeight[ machineServerName ] = 50; }
map<long, PortDataF>::iterator topF; for( topF = newSettings.portF.begin(); topF != newSettings.portF.end(); ++topF ) { set<long> 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<long, PortDataULB>::iterator topULB; for( topULB = p_clusterSettings->portULB.begin(); topULB != p_clusterSettings->portULB.end(); ++topULB ) { (*topULB).second.machineMapToLoadWeight.erase( machine ); }
map<long, PortDataF>::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<bstr_t, HostData>::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 *> ( (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<PortsPage::PortData> 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; } }
|