windows-nt/Source/XPSP1/NT/net/wlbs/nlbmgr/exe/portspage.cpp
2020-09-26 16:20:57 +08:00

1301 lines
38 KiB
C++

#include "stdafx.h"
#include "PortsPage.h"
#include "ClusterPortsDlg.h"
#include "HostPortsDlg.h"
#include "Document.h"
#include "wlbsparm.h"
#include "ResourceString.h"
#include "MNLBUIData.h"
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
BEGIN_MESSAGE_MAP(PortsPage, CPropertyPage)
ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel)
ON_BN_CLICKED(IDC_BUTTON_MODIFY, OnButtonModify)
ON_NOTIFY( NM_DBLCLK, IDC_LIST_PORT_RULE, OnDoubleClick )
ON_NOTIFY( LVN_ITEMCHANGED, IDC_LIST_PORT_RULE, OnSelchanged )
ON_NOTIFY( LVN_COLUMNCLICK, IDC_LIST_PORT_RULE, OnColumnClick )
ON_WM_HELPINFO()
ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
PortsPage::PortData::PortData()
{
wchar_t buf[Common::BUF_SIZE];
swprintf( buf, L"%d", CVY_MIN_PORT );
start_port = buf;
swprintf( buf, L"%d", CVY_MAX_PORT );
end_port = buf;
protocol = GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH );
mode = GETRESOURCEIDSTRING( IDS_REPORT_MODE_MULTIPLE );
load = GETRESOURCEIDSTRING( IDS_REPORT_LOAD_EQUAL );
affinity = GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_SINGLE );
}
PortsPage::PortsPage( ClusterData* p_clusterData,
UINT ID)
: m_clusterData( p_clusterData ),
m_isClusterLevel( true ),
CPropertyPage(ID),
m_sort_column( -1 )
{}
PortsPage::PortsPage( const _bstr_t& myMachineName,
ClusterData* p_clusterData,
UINT ID)
: m_clusterData( p_clusterData ),
machine( myMachineName ),
m_isClusterLevel( false ),
CPropertyPage(ID),
m_sort_column( -1 )
{}
PortsPage:: ~PortsPage()
{}
void PortsPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_PORT_RULE, m_portList);
DDX_Control(pDX, IDC_BUTTON_ADD, buttonAdd );
DDX_Control(pDX, IDC_BUTTON_MODIFY, buttonModify );
DDX_Control(pDX, IDC_BUTTON_DEL, buttonDel );
}
void
PortsPage::OnOK()
{
CPropertyPage::OnOK();
}
BOOL
PortsPage::OnKillActive()
{
// get present port rules
vector<PortData> ports;
getPresentPorts( &ports );
// now form the new port structure.
PortDataELB elbPortRule;
PortDataULB ulbPortRule;
PortDataF fPortRule;
PortDataD dPortRule;
map< long, PortDataELB> portELB;
map< long, PortDataULB> portULB;
map< long, PortDataD> portD;
map< long, PortDataF> portF;
for( int i = 0; i < ports.size(); ++i )
{
// check which type of port rule it is.
//
if( ports[i].mode == GETRESOURCEIDSTRING( IDS_REPORT_MODE_MULTIPLE )
&&
ports[i].load == GETRESOURCEIDSTRING( IDS_REPORT_LOAD_EQUAL )
)
{
// equal load balanced
elbPortRule._startPort = _wtoi( ports[i].start_port );
elbPortRule._endPort = _wtoi( ports[i].end_port );
if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ) )
{
elbPortRule._trafficToHandle = MNLBPortRule::both;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ) )
{
elbPortRule._trafficToHandle = MNLBPortRule::tcp;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ) )
{
elbPortRule._trafficToHandle = MNLBPortRule::udp;
}
if( ports[i].affinity == GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_NONE ) )
{
elbPortRule._affinity = MNLBPortRule::none;
}
else if( ports[i].affinity == GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_SINGLE ) )
{
elbPortRule._affinity = MNLBPortRule::single;
}
else if( ports[i].affinity == GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_CLASSC ) )
{
elbPortRule._affinity = MNLBPortRule::classC;
}
elbPortRule._key = elbPortRule._startPort;
portELB[ elbPortRule._startPort ] = elbPortRule;
}
else if( ports[i].mode == GETRESOURCEIDSTRING( IDS_REPORT_MODE_MULTIPLE )
&&
ports[i].load != GETRESOURCEIDSTRING( IDS_REPORT_LOAD_EQUAL )
)
{
// unequal load balanced
ulbPortRule._startPort = _wtoi( ports[i].start_port );
ulbPortRule._endPort = _wtoi( ports[i].end_port );
if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ) )
{
ulbPortRule._trafficToHandle = MNLBPortRule::both;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ) )
{
ulbPortRule._trafficToHandle = MNLBPortRule::tcp;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ) )
{
ulbPortRule._trafficToHandle = MNLBPortRule::udp;
}
if( ports[i].affinity == GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_NONE ) )
{
ulbPortRule._affinity = MNLBPortRule::none;
}
else if( ports[i].affinity == GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_SINGLE ) )
{
ulbPortRule._affinity = MNLBPortRule::single;
}
else if( ports[i].affinity == GETRESOURCEIDSTRING( IDS_REPORT_AFFINITY_CLASSC ) )
{
ulbPortRule._affinity = MNLBPortRule::classC;
}
if( ports[i].key == -1
||
( m_clusterData->portULB.find( ports[i].key )
==
m_clusterData->portULB.end() )
)
{
// new port rule.
// user may change the rule completely if so
// consider it as new.
if( m_isClusterLevel == true )
{
map< _bstr_t, HostData >::iterator top;
for( top = m_clusterData->hosts.begin();
top != m_clusterData->hosts.end();
++top )
{
// default value is 50 load weight
// for each machine
ulbPortRule.machineMapToLoadWeight[(*top).first] = 50;
}
}
else
{
ulbPortRule.machineMapToLoadWeight =
m_clusterData->portULB[ ports[i].key ].machineMapToLoadWeight;
ulbPortRule.machineMapToLoadWeight[machine]
= _wtoi( ports[i].load );
}
}
else
{
// existing port rule.
ulbPortRule.machineMapToLoadWeight =
m_clusterData->portULB[ ports[i].key ].machineMapToLoadWeight;
if( m_isClusterLevel == false )
{
ulbPortRule.machineMapToLoadWeight[machine]
= _wtoi( ports[i].load );
}
}
ulbPortRule._key = ulbPortRule._startPort;
portULB[ ulbPortRule._startPort ] = ulbPortRule;
}
else if( ports[i].mode == GETRESOURCEIDSTRING( IDS_REPORT_MODE_SINGLE ) )
{
// failover
fPortRule._startPort = _wtoi( ports[i].start_port );
fPortRule._endPort = _wtoi( ports[i].end_port );
if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ) )
{
fPortRule._trafficToHandle = MNLBPortRule::both;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ) )
{
fPortRule._trafficToHandle = MNLBPortRule::tcp;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ) )
{
fPortRule._trafficToHandle = MNLBPortRule::udp;
}
if( ports[i].key == -1
||
( m_clusterData->portF.find( ports[i].key )
==
m_clusterData->portF.end() )
)
{
// new port rule.
// by default make priority equal to host id.
if( m_isClusterLevel == true )
{
map< _bstr_t, HostData >::iterator top;
for( top = m_clusterData->hosts.begin();
top != m_clusterData->hosts.end();
++top )
{
fPortRule.machineMapToPriority[(*top).first] = (*top).second.hp.hID;
}
}
else
{
fPortRule.machineMapToPriority =
m_clusterData->portF[ ports[i].key ].machineMapToPriority;
fPortRule.machineMapToPriority[machine]
= _wtoi( ports[i].priority );
}
}
else
{
fPortRule.machineMapToPriority =
m_clusterData->portF[ ports[i].key ].machineMapToPriority;
if( m_isClusterLevel == false )
{
fPortRule.machineMapToPriority[machine]
= _wtoi( ports[i].priority );
}
}
fPortRule._key = fPortRule._startPort;
portF[ fPortRule._startPort ] = fPortRule;
}
else if( ports[i].mode == GETRESOURCEIDSTRING( IDS_REPORT_MODE_DISABLED ) )
{
// disabled
dPortRule._startPort = _wtoi( ports[i].start_port );
dPortRule._endPort = _wtoi( ports[i].end_port );
if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_BOTH ) )
{
dPortRule._trafficToHandle = MNLBPortRule::both;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_TCP ) )
{
dPortRule._trafficToHandle = MNLBPortRule::tcp;
}
else if( ports[i].protocol == GETRESOURCEIDSTRING( IDS_REPORT_PROTOCOL_UDP ) )
{
dPortRule._trafficToHandle = MNLBPortRule::udp;
}
dPortRule._key = dPortRule._startPort;
portD[ dPortRule._startPort ] = dPortRule;
}
}
m_clusterData->portELB = portELB;
m_clusterData->portULB = portULB;
m_clusterData->portF = portF;
m_clusterData->portD = portD;
return CPropertyPage::OnKillActive();
}
BOOL
PortsPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// the size of columns is equal
// to core. Wish there were some defines somewhere.
//
m_portList.InsertColumn( 0,
GETRESOURCEIDSTRING( IDS_HEADER_P_START ) ,
LVCFMT_LEFT,
43 );
m_portList.InsertColumn( 1,
GETRESOURCEIDSTRING( IDS_HEADER_P_END ),
LVCFMT_LEFT,
43 );
m_portList.InsertColumn( 2,
GETRESOURCEIDSTRING( IDS_HEADER_P_PROTOCOL ),
LVCFMT_LEFT,
51 );
m_portList.InsertColumn( 3,
GETRESOURCEIDSTRING( IDS_HEADER_P_MODE ),
LVCFMT_LEFT,
53 );
m_portList.InsertColumn( 4,
GETRESOURCEIDSTRING( IDS_HEADER_P_PRIORITY ),
LVCFMT_LEFT,
45 );
// load is bigger than core size of 39, because we could be saying "unequal"
m_portList.InsertColumn( 5,
GETRESOURCEIDSTRING( IDS_HEADER_P_LOAD ),
LVCFMT_LEFT,
53 );
m_portList.InsertColumn( 6,
GETRESOURCEIDSTRING( IDS_HEADER_P_AFFINITY ),
LVCFMT_LEFT,
47 );
m_portList.SetExtendedStyle( m_portList.GetExtendedStyle() | LVS_EX_FULLROWSELECT );
SetControlData();
int numItems = m_portList.GetItemCount();
if( numItems > 0 )
{
buttonModify.EnableWindow( TRUE );
buttonDel.EnableWindow( TRUE );
if( numItems >= CVY_MAX_USABLE_RULES )
{
// greater should not happen,
// but just to be sure.
buttonAdd.EnableWindow( FALSE );
}
else
{
buttonAdd.EnableWindow( TRUE );
}
// make selection the first item in list.
//
m_portList.SetItemState( 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
else
{
buttonAdd.EnableWindow( TRUE );
// disable the edit and remove buttons.
buttonModify.EnableWindow( FALSE );
buttonDel.EnableWindow( FALSE );
}
return TRUE;
}
void
PortsPage::SetControlData()
{
int index = 0;
map< long, PortDataELB>::iterator topELB;
for( topELB = m_clusterData->portELB.begin();
topELB != m_clusterData->portELB.end();
++topELB )
{
wchar_t buf[Common::BUF_SIZE];
// start port
swprintf( buf, L"%d", (*topELB).second._startPort );
LVITEM item;
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.iItem = index;
item.iSubItem = 0;
item.iImage = 2;
item.pszText = buf;
item.lParam = (*topELB).second._startPort;
item.cchTextMax = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.SetItem( &item );
// mode
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 3;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_MULTIPLE );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// priority
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 4;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// load
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 5;
item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_LOAD_EQUAL );
item.cchTextMax = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.SetItem( &item );
++index;
}
index = 0;
map< long, PortDataULB>::iterator topULB;
for( topULB = m_clusterData->portULB.begin();
topULB != m_clusterData->portULB.end();
++topULB )
{
wchar_t buf[Common::BUF_SIZE];
// start port
swprintf( buf, L"%d", (*topULB).second._startPort );
LVITEM item;
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.iItem = index;
item.iSubItem = 0;
item.iImage = 2;
item.lParam = (*topULB).second._startPort;
item.pszText = buf;
item.cchTextMax = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.SetItem( &item );
// mode
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 3;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_MULTIPLE );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// priority
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 4;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// load
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 5;
if( m_isClusterLevel == true )
{
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_LOAD_UNEQUAL );
}
else
{
swprintf( buf, L"%d", (*topULB).second.machineMapToLoadWeight[machine] );
item.pszText = buf;
}
item.cchTextMax = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.SetItem( &item );
++index;
}
index = 0;
map< long, PortDataF>::iterator topF;
for( topF = m_clusterData->portF.begin();
topF != m_clusterData->portF.end();
++topF )
{
wchar_t buf[Common::BUF_SIZE];
// start port
swprintf( buf, L"%d", (*topF).second._startPort );
LVITEM item;
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.iItem = index;
item.iSubItem = 0;
item.iImage = 2;
item.lParam = (*topF).second._startPort;
item.pszText = buf;
item.cchTextMax = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.SetItem( &item );
// mode
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 3;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_SINGLE );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// priority
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 4;
if( m_isClusterLevel )
{
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_NA );
}
else
{
swprintf( buf, L"%d", (*topF).second.machineMapToPriority[machine] );
item.pszText = buf;
}
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// load
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 5;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// affinity
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 6;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
++index;
}
index = 0;
map< long, PortDataD>::iterator topD;
for( topD = m_clusterData->portD.begin();
topD != m_clusterData->portD.end();
++topD )
{
wchar_t buf[Common::BUF_SIZE];
// start port
swprintf( buf, L"%d", (*topD).second._startPort );
LVITEM item;
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.iItem = index;
item.iSubItem = 0;
item.iImage = 2;
item.lParam = (*topD).second._startPort;
item.pszText = buf;
item.cchTextMax = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.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 = Common::BUF_SIZE;
m_portList.SetItem( &item );
// mode
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 3;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_MODE_DISABLED );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// priority
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 4;
item.pszText = GETRESOURCEIDSTRING(IDS_REPORT_EMPTY );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// load
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 5;
item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_EMPTY );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// affinity
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 6;
item.pszText = GETRESOURCEIDSTRING( IDS_REPORT_EMPTY );
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
++index;
}
}
void
PortsPage::OnButtonAdd()
{
PortData portData;
ClusterPortsDlg clusterPortRuleDialog( portData, this );
int rc = clusterPortRuleDialog.DoModal();
if( rc != IDOK )
{
return;
}
else
{
// add this port rule.
int index = 0;
// start port
LVITEM item;
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.iItem = index;
item.iSubItem = 0;
item.iImage = 2;
item.lParam = -1;
item.pszText = portData.start_port;
item.cchTextMax = Common::BUF_SIZE;
m_portList.InsertItem( &item );
// end port
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 1;
item.pszText = portData.end_port;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// protocol
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 2;
item.pszText = portData.protocol;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// mode
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 3;
item.pszText = portData.mode;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// priority
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 4;
item.pszText = portData.priority;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// load
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 5;
item.pszText = portData.load;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// affinity
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 6;
item.pszText = portData.affinity;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// check if max port limit reached.
if( m_portList.GetItemCount() >= CVY_MAX_USABLE_RULES )
{
// as max port rule limit reached.
// disable further additions.
buttonAdd.EnableWindow( FALSE );
buttonDel.EnableWindow( TRUE );
buttonModify.EnableWindow( TRUE );
buttonDel.SetFocus();
}
else
{
buttonAdd.EnableWindow( TRUE );
buttonDel.EnableWindow( TRUE );
buttonModify.EnableWindow( TRUE );
}
// set focus to this item
m_portList.SetItemState( index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
}
void
PortsPage::OnButtonDel()
{
// get the current selection.
POSITION pos = m_portList.GetFirstSelectedItemPosition();
if( pos == NULL )
{
return;
}
int index = m_portList.GetNextSelectedItem( pos );
// delete it.
m_portList.DeleteItem( index );
// if this was the last port rule.
if( m_portList.GetItemCount() == 0 )
{
// as no more port rules in list
// disable modify and remove buttons.
// also set focus to add button
buttonAdd.EnableWindow( TRUE );
buttonModify.EnableWindow( FALSE );
buttonDel.EnableWindow( FALSE );
buttonAdd.SetFocus();
}
else
{
// enable the add, modify button.
buttonAdd.EnableWindow( TRUE );
buttonModify.EnableWindow( TRUE );
buttonDel.EnableWindow( TRUE );
// make selection the first item in list.
//
m_portList.SetItemState( 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
}
void
PortsPage::OnButtonModify()
{
// get the current selection.
POSITION pos = m_portList.GetFirstSelectedItemPosition();
if( pos == NULL )
{
return;
}
int index = m_portList.GetNextSelectedItem( pos );
PortData portData;
wchar_t buffer[Common::BUF_SIZE];
m_portList.GetItemText( index, 0, buffer, Common::BUF_SIZE );
portData.start_port = buffer;
m_portList.GetItemText( index, 1, buffer, Common::BUF_SIZE );
portData.end_port = buffer;
m_portList.GetItemText( index, 2, buffer, Common::BUF_SIZE );
portData.protocol = buffer;
m_portList.GetItemText( index, 3, buffer, Common::BUF_SIZE );
portData.mode = buffer;
m_portList.GetItemText( index, 4, buffer, Common::BUF_SIZE );
portData.priority = buffer;
m_portList.GetItemText( index, 5, buffer, Common::BUF_SIZE );
portData.load = buffer;
m_portList.GetItemText( index, 6, buffer, Common::BUF_SIZE );
portData.affinity = buffer;
ClusterPortsDlg clusterPortRuleDialog( portData, this, index );
HostPortsDlg hostPortRuleDialog( portData, this );
int rc;
if( m_isClusterLevel == true )
{
rc = clusterPortRuleDialog.DoModal();
}
else
{
rc = hostPortRuleDialog.DoModal();
}
if( rc != IDOK )
{
return;
}
else
{
// delete the old item and add the new item.
// before you delete the old item find its param
// value
DWORD key = m_portList.GetItemData( index );
m_portList.DeleteItem( index );
// as this is being modified the
// key remains the old one.
// start port
LVITEM item;
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.iItem = index;
item.iSubItem = 0;
item.iImage = 2;
item.lParam = key;
item.pszText = portData.start_port;
item.cchTextMax = Common::BUF_SIZE;
m_portList.InsertItem( &item );
// end port
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 1;
item.pszText = portData.end_port;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// protocol
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 2;
item.pszText = portData.protocol;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// mode
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 3;
item.pszText = portData.mode;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// priority
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 4;
item.pszText = portData.priority;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// load
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 5;
item.pszText = portData.load;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// affinity
item.mask = LVIF_TEXT;
item.iItem = index;
item.iSubItem = 6;
item.pszText = portData.affinity;
item.cchTextMax = Common::BUF_SIZE;
m_portList.SetItem( &item );
// set focus to this item
m_portList.SetItemState( index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
}
void
PortsPage::OnDoubleClick( NMHDR * pNotifyStruct, LRESULT * result )
{
if( buttonModify.IsWindowEnabled() == TRUE )
{
OnButtonModify();
}
}
void
PortsPage::OnSelchanged( NMHDR * pNotifyStruct, LRESULT * result )
{
// if it is not cluster level, which means host level.
if( m_isClusterLevel == false )
{
// get the current selection.
POSITION pos = m_portList.GetFirstSelectedItemPosition();
if( pos == NULL )
{
return;
}
// disable the add, and delete buttons.
// enable the modify button only if the
// selection is an unequal load balanced
// or single host port rule.
buttonAdd.EnableWindow( FALSE );
buttonDel.EnableWindow( FALSE );
// initially disable modify button
buttonModify.EnableWindow( FALSE );
int index = m_portList.GetNextSelectedItem( pos );
PortData portData;
wchar_t buffer[Common::BUF_SIZE];
m_portList.GetItemText( index, 3, buffer, Common::BUF_SIZE );
portData.mode = buffer;
if( portData.mode == GETRESOURCEIDSTRING( IDS_REPORT_MODE_MULTIPLE ) )
{
m_portList.GetItemText( index, 5, buffer, Common::BUF_SIZE );
portData.load = buffer;
if( portData.load != GETRESOURCEIDSTRING( IDS_REPORT_LOAD_EQUAL ) )
{
buttonModify.EnableWindow( TRUE );
}
}
else if( portData.mode == GETRESOURCEIDSTRING( IDS_REPORT_MODE_SINGLE ) )
{
buttonModify.EnableWindow( TRUE );
}
}
}
BOOL
PortsPage::OnHelpInfo (HELPINFO* helpInfo )
{
if( helpInfo->iContextType == HELPINFO_WINDOW )
{
::WinHelp( static_cast<HWND> ( helpInfo->hItemHandle ), CVY_CTXT_HELP_FILE, HELP_WM_HELP, (ULONG_PTR ) g_aHelpIDs_IDD_DIALOG_PORTS);
}
return TRUE;
}
void
PortsPage::OnContextMenu( CWnd* pWnd, CPoint point )
{
::WinHelp( m_hWnd, CVY_CTXT_HELP_FILE, HELP_CONTEXTMENU, (ULONG_PTR ) g_aHelpIDs_IDD_DIALOG_PORTS);
}
void
PortsPage::OnColumnClick( NMHDR * pNotifyStruct, LRESULT * result )
{
// get present port rules in list.
vector<PortData> ports;
getPresentPorts( &ports );
LPNMLISTVIEW lv = ( LPNMLISTVIEW) pNotifyStruct;
// sort these port rules depending upon the header which has
// been clicked.
switch( lv->iSubItem )
{
case 0 :
// user has clicked start port.
sort( ports.begin(), ports.end(), comp_start_port() );
break;
case 1:
// user has clicked end port
sort( ports.begin(), ports.end(), comp_end_port() );
break;
case 2:
// user has clicked protocol
sort( ports.begin(), ports.end(), comp_protocol() );
break;
case 3:
// user has clicked mode
sort( ports.begin(), ports.end(), comp_mode() );
break;
case 4:
// user has clicked priority
if( m_isClusterLevel == true )
{
sort( ports.begin(), ports.end(), comp_priority_string() );
}
else
{
sort( ports.begin(), ports.end(), comp_priority_int() );
}
break;
case 5:
// user has clicked load
if( m_isClusterLevel == true )
{
sort( ports.begin(), ports.end(), comp_load_string() );
}
else
{
sort( ports.begin(), ports.end(), comp_load_int() );
}
break;
case 6:
// user has clicked affinity
sort( ports.begin(), ports.end(), comp_affinity() );
break;
default:
break;
}
/* If we are sorting by the same column we were previously sorting by,
then we reverse the sort order. */
if( m_sort_column == lv->iSubItem )
{
m_sort_ascending = !m_sort_ascending;
}
else
{
// default sort is ascending.
m_sort_ascending = true;
}
m_sort_column = lv->iSubItem;
int portIndex;
int itemCount = m_portList.GetItemCount();
for( int index = 0; index < itemCount; ++index )
{
if( m_sort_ascending == true )
{
portIndex = index;
}
else
{
portIndex = ( itemCount - 1 ) - index;
}
m_portList.SetItemData( index, ports[portIndex].key );
m_portList.SetItemText( index, 0, ports[portIndex].start_port );
m_portList.SetItemText( index, 1, ports[portIndex].end_port );
m_portList.SetItemText( index, 2, ports[portIndex].protocol );
m_portList.SetItemText( index, 3, ports[portIndex].mode );
m_portList.SetItemText( index, 4, ports[portIndex].priority );
m_portList.SetItemText( index, 5, ports[portIndex].load );
m_portList.SetItemText( index, 6, ports[portIndex].affinity );
}
return;
}
void
PortsPage::getPresentPorts( vector<PortData>* ports )
{
// get all the port rules presently in the list.
for( int index = 0; index < m_portList.GetItemCount(); ++index )
{
PortData portData;
wchar_t buffer[Common::BUF_SIZE];
portData.key = m_portList.GetItemData( index );
m_portList.GetItemText( index, 0, buffer, Common::BUF_SIZE );
portData.start_port = buffer;
m_portList.GetItemText( index, 1, buffer, Common::BUF_SIZE );
portData.end_port = buffer;
m_portList.GetItemText( index, 2, buffer, Common::BUF_SIZE );
portData.protocol = buffer;
m_portList.GetItemText( index, 3, buffer, Common::BUF_SIZE );
portData.mode = buffer;
m_portList.GetItemText( index, 4, buffer, Common::BUF_SIZE );
portData.priority = buffer;
m_portList.GetItemText( index, 5, buffer, Common::BUF_SIZE );
portData.load = buffer;
m_portList.GetItemText( index, 6, buffer, Common::BUF_SIZE );
portData.affinity = buffer;
ports->push_back( portData );
}
}