windows-nt/Source/XPSP1/NT/net/wlbs/nlbmgr/exe/clusterconnectindirectpage.cpp

262 lines
6.5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "ClusterConnectIndirectPage.h"
#include "LeftView.h"
#include "CommonUtils.h"
#include "CommonNLB.h"
#include "MWmiError.h"
#include "IpSubnetMaskControl.h"
#include "MIPAddress.h"
#include "ResourceString.h"
BEGIN_MESSAGE_MAP( ClusterConnectIndirectPage, CPropertyPage )
ON_BN_CLICKED(IDC_ADD_MACHINE, OnButtonAdd)
ON_BN_CLICKED(IDC_DEL_MACHINE, OnButtonDel)
ON_WM_HELPINFO()
ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
ClusterConnectIndirectPage::ClusterConnectIndirectPage( ClusterData* clusterData,
CWnd* parent )
:
CPropertyPage( IDD ),
DataSinkI(),
m_clusterData( clusterData ),
myParent( parent ),
dataStore(L" ")
{}
void
ClusterConnectIndirectPage::DoDataExchange( CDataExchange* pDX )
{
CPropertyPage::DoDataExchange( pDX );
DDX_Control( pDX, IDC_CLUSTER_IP, clusterIP);
DDX_Control( pDX, IDC_MACHINE, machineIP );
DDX_Control( pDX, IDC_MACHINE_IP_LIST, machineIPList );
DDX_Control( pDX, IDC_ADD_MACHINE, addButton );
DDX_Control( pDX, IDC_DEL_MACHINE, removeButton );
DDX_Control( pDX, IDC_CLUSTER_CONNECTION_STATUS, connectionStatus );
}
void
ClusterConnectIndirectPage::OnOK()
{
CPropertyPage::OnOK();
}
BOOL
ClusterConnectIndirectPage::OnKillActive()
{
// clear the old status if any.
dataStore = L" ";
// get cluster ip.
//
_bstr_t clusterIPAddress =
CommonUtils::getCIPAddressCtrlString( clusterIP );
// validate this ip.
bool isIPValid = MIPAddress::checkIfValid( clusterIPAddress );
if( isIPValid == false )
{
// invalid ip.
dataSink( GETRESOURCEIDSTRING( IDS_WARNING_IP_INVALID ) + clusterIPAddress );
CPropertyPage::OnCancel();
return 0;
}
// check if this cluster already exists in view.
if( myParent != 0 )
{
bool isClusterDuplicate = ( (LeftView * )myParent)->doesClusterExistInView( clusterIPAddress );
if( isClusterDuplicate == true )
{
dataSink( clusterIPAddress + L":" + GETRESOURCEIDSTRING (IDS_CLUSTER_ALREADY ) );
CPropertyPage::OnCancel();
return 0;
}
}
// get all the ips in the machine ip list.
// this list should not be empty.
if( machineIPList.GetCount() == 0 )
{
// machine ip list is empty
dataSink( GETRESOURCEIDSTRING (IDS_MACHINE_LIST_EMPTY ) );
CPropertyPage::OnCancel();
return 0;
}
wchar_t ipBuf[1000];
vector<_bstr_t> connectionIPS;
for( int i = 0; i < machineIPList.GetCount(); ++i )
{
machineIPList.GetText( i, ipBuf );
connectionIPS.push_back( ipBuf );
}
try
{
#if 1
CommonNLB::connectToClusterIndirect( clusterIPAddress,
connectionIPS,
m_clusterData,
this );
#else
vector<ClusterData> clusterDataStore;
bool clusterPropertiesMatched;
CommonNLB::connectToClusterIndirectNew( clusterIPAddress,
connectionIPS,
&clusterDataStore,
clusterPropertiesMatched,
this );
*(m_clusterData) = clusterDataStore[0];
#endif
}
catch( _com_error e )
{
_bstr_t errText;
GetErrorCodeText( e.Error(), errText );
dataSink( errText );
CPropertyPage::OnCancel();
return 0;
}
return CPropertyPage::OnKillActive();
}
BOOL
ClusterConnectIndirectPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// fill in cluster ip but only if not null.
//
if( m_clusterData->cp.cIP != _bstr_t( L"0.0.0.0" ) )
{
CommonUtils::fillCIPAddressCtrlString( clusterIP,
m_clusterData->cp.cIP );
// fill in machine ip list.
// connect to each host.
map<_bstr_t, HostData >::iterator top;
for( top = m_clusterData->hosts.begin();
top != m_clusterData->hosts.end();
++top )
{
machineIPList.InsertString( -1, (*top).second.connectionIP );
}
// select the first ip in machine IP list.
machineIPList.SetCurSel( 0 );
}
return TRUE;
}
void
ClusterConnectIndirectPage::dataSink( _bstr_t data )
{
dataStore += data;
dataStore += L"\r\n";
connectionStatus.SetWindowText( dataStore );
UpdateWindow();
}
void ClusterConnectIndirectPage::OnButtonAdd()
{
// get and check if machine ip is valid.
_bstr_t machineIPAddress =
CommonUtils::getCIPAddressCtrlString( machineIP );
bool isIPValid = MIPAddress::checkIfValid( machineIPAddress );
if( isIPValid == false )
{
// invalid ip.
dataSink( GETRESOURCEIDSTRING( IDS_WARNING_IP_INVALID ) + machineIPAddress );
return;
}
// check if machine ip to add already exists in list.
//
wchar_t ipBuf[1000];
for( int i = 0; i < machineIPList.GetCount(); ++i )
{
machineIPList.GetText( i, ipBuf );
if( machineIPAddress == _bstr_t( ipBuf ) )
{
// duplicate, cannot add.
dataSink( GETRESOURCEIDSTRING( IDS_MACHINE_ALREADY ) + L":" + machineIPAddress );
// select this duplicate string in list.
machineIPList.SetCurSel( i );
return;
}
}
// add it to list.
int index = machineIPList.InsertString( -1, machineIPAddress );
// select this string.
machineIPList.SetCurSel( index );
}
void ClusterConnectIndirectPage::OnButtonDel()
{
// delete the ip selected from the list.
int index = machineIPList.GetCurSel();
if( index != LB_ERR )
{
machineIPList.DeleteString( index );
}
}
BOOL
ClusterConnectIndirectPage::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_CLUSTER_CONNECT_INDIRECT_PAGE);
}
return TRUE;
}
void
ClusterConnectIndirectPage::OnContextMenu( CWnd* pWnd, CPoint point )
{
::WinHelp( m_hWnd,
CVY_CTXT_HELP_FILE,
HELP_CONTEXTMENU,
(ULONG_PTR ) g_aHelpIDs_IDD_CLUSTER_CONNECT_INDIRECT_PAGE);
}