Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

205 lines
6.7 KiB

#include "precomp.h"
#pragma hdrstop
#include "private.h"
#include "PortsPage.h"
#include "PortsCtrl.h"
#include "portsctrl.tmh"
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// CPortsCtrl dialog
CPortsCtrl::CPortsCtrl(ENGINEHANDLE ehClusterOrInterfaceId,
NLB_EXTENDED_CLUSTER_CONFIGURATION * pNlbCfg,
bool fIsClusterLevel,
CWnd * pParent /*=NULL*/)
:CDialog(CPortsCtrl::IDD, pParent),
m_ehClusterOrInterfaceId( ehClusterOrInterfaceId ),
m_isClusterLevel( fIsClusterLevel ),
m_pNlbCfg( pNlbCfg ),
m_sort_column( 0 ),
m_sort_ascending( true)
{
}
void CPortsCtrl::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_PORT_RULE, m_portList);
DDX_Control(pDX, IDC_BUTTON_ENABLE, m_Enable);
DDX_Control(pDX, IDC_BUTTON_DISABLE, m_Disable);
DDX_Control(pDX, IDC_BUTTON_DRAIN, m_Drain);
DDX_Control(pDX, IDOK, m_Close);
}
BEGIN_MESSAGE_MAP(CPortsCtrl, CDialog)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_PORT_RULE, OnColumnClick)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_PORT_RULE, OnSelchanged )
ON_BN_CLICKED(IDC_BUTTON_ENABLE, OnEnable)
ON_BN_CLICKED(IDC_BUTTON_DISABLE, OnDisable)
ON_BN_CLICKED(IDC_BUTTON_DRAIN, OnDrain)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPortsCtrl message handlers
BOOL CPortsCtrl::OnInitDialog()
{
TRACE_INFO(L"-> %!FUNC!");
CDialog::OnInitDialog();
// Add column headers & form port rule list
PortListUtils::LoadFromNlbCfg(m_pNlbCfg, REF m_portList, m_isClusterLevel, FALSE);
// If the number of port rules is zero, then, gray out the enable, disable & drain buttons
if (m_portList.GetItemCount() == 0)
{
m_Enable.EnableWindow(FALSE);
m_Disable.EnableWindow(FALSE);
m_Drain.EnableWindow(FALSE);
}
else // there is one or more port rules
{
// selection the first item in list.
m_portList.SetItemState( 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
TRACE_INFO(L"<- %!FUNC! returns TRUE");
return TRUE; // return TRUE unless you set the focus to a control
}
void CPortsCtrl::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
PortListUtils::OnColumnClick((LPNMLISTVIEW) pNMHDR,
REF m_portList,
m_isClusterLevel,
REF m_sort_ascending,
REF m_sort_column);
*pResult = 0;
}
void CPortsCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT * pResult)
{
TRACE_INFO(L"-> %!FUNC!");
// If no port rule is selected, then gray out the enable, disable and drain buttons.
if (m_portList.GetFirstSelectedItemPosition() == NULL)
{
m_Enable.EnableWindow(FALSE);
m_Disable.EnableWindow(FALSE);
m_Drain.EnableWindow(FALSE);
}
else // a port rule is selected, check if the enable, disable, drain buttons are grayed out. If they are, enable them
{
if (m_Enable.IsWindowEnabled() == FALSE)
{
m_Enable.EnableWindow(TRUE);
m_Disable.EnableWindow(TRUE);
m_Drain.EnableWindow(TRUE);
}
}
/*
LPNMLISTVIEW lv = (LPNMLISTVIEW)pNMHDR;
TRACE_INFO(L"%!FUNC! iItem : %d", lv->iItem);
TRACE_INFO(L"%!FUNC! iSubItem : %d", lv->iSubItem);
TRACE_INFO(L"%!FUNC! uNewState : %u", lv->uNewState);
TRACE_INFO(L"%!FUNC! uOldState : %u", lv->uOldState);
TRACE_INFO(L"%!FUNC! uChanged : %u", lv->uChanged);
*/
*pResult = 0;
TRACE_INFO(L"<- %!FUNC!");
return;
}
void CPortsCtrl::OnEnable()
{
CWaitCursor wait;
SetDlgItemText(IDC_OPER_STATUS_TEXT, GETRESOURCEIDSTRING(IDS_INFO_ENABLING_PORTS));
mfn_DoPortControlOperation(WLBS_PORT_ENABLE);
SetDlgItemText(IDC_OPER_STATUS_TEXT, GETRESOURCEIDSTRING(IDS_INFO_DONE));
return;
}
void CPortsCtrl::OnDisable()
{
CWaitCursor wait;
SetDlgItemText(IDC_OPER_STATUS_TEXT, GETRESOURCEIDSTRING(IDS_INFO_DISABLING_PORTS));
mfn_DoPortControlOperation(WLBS_PORT_DISABLE);
SetDlgItemText(IDC_OPER_STATUS_TEXT, GETRESOURCEIDSTRING(IDS_INFO_DONE));
return;
}
void CPortsCtrl::OnDrain()
{
CWaitCursor wait;
SetDlgItemText(IDC_OPER_STATUS_TEXT, GETRESOURCEIDSTRING(IDS_INFO_DRAINING_PORTS));
mfn_DoPortControlOperation(WLBS_PORT_DRAIN);
SetDlgItemText(IDC_OPER_STATUS_TEXT, GETRESOURCEIDSTRING(IDS_INFO_DONE));
return;
}
NLBERROR CPortsCtrl::mfn_DoPortControlOperation(WLBS_OPERATION_CODES Opcode)
{
CString szVipArray[WLBS_MAX_RULES], szTemp;
DWORD pdwStartPortArray[WLBS_MAX_RULES];
DWORD dwNumOfPortRules;
POSITION pos = m_portList.GetFirstSelectedItemPosition();
if (pos == NULL)
{
return NLBERR_INTERNAL_ERROR;
}
// Loop thru the selected port rules and get the VIP & Start Port
dwNumOfPortRules = 0;
do
{
int index = m_portList.GetNextSelectedItem(REF pos);
// Get VIP, Note : 0 is the column index for VIP
szVipArray[dwNumOfPortRules] = m_portList.GetItemText( index, 0 );
// Check for "All Vip" and replace "All" with "255.255.255.255"
if (!lstrcmpi(szVipArray[dwNumOfPortRules], GETRESOURCEIDSTRING(IDS_REPORT_VIP_ALL)))
{
szVipArray[dwNumOfPortRules] = CVY_DEF_ALL_VIP;
}
// Get Start Port, Note : 1 is the column index for Start Port
szTemp = m_portList.GetItemText( index, 1);
pdwStartPortArray[dwNumOfPortRules] = _wtol(szTemp);
++dwNumOfPortRules;
}
while (pos);
if (m_isClusterLevel)
{
return gEngine.ControlClusterOnCluster(m_ehClusterOrInterfaceId,
Opcode,
szVipArray,
pdwStartPortArray,
dwNumOfPortRules);
}
else
{
return gEngine.ControlClusterOnInterface(m_ehClusterOrInterfaceId,
Opcode,
szVipArray,
pdwStartPortArray,
dwNumOfPortRules,
TRUE
);
}
return NLBERR_INTERNAL_ERROR;
}