1301 lines
38 KiB
C++
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 );
|
||
|
}
|
||
|
}
|