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.
 
 
 
 
 
 

777 lines
25 KiB

/*++
Copyright(c) 1998,99 Microsoft Corporation
Module Name:
CommonClusterPage.cpp
Abstract:
Windows Load Balancing Service (WLBS)
Cluster page UI. Shared by Notifier object and NLB Manager
Author:
kyrilf
shouse
// History:
// --------
//
// Revised by : mhakim
// Date : 02-09-01
// Reason : Igmp box was enabled when it needed to be grayed out.
//
// Revised by : mhakim
// Date : 02-12-01
// Reason : Mac address was not being retrieved fully.
--*/
//
// To share the code with notifier object
// share string resurce
// share the common structure
// call SetChangedFlag() in OnInitDialog
// add trace, assert
// Share help file and add help handler
//
//
#include "precomp.h"
#pragma hdrstop
#include "private.h"
#include <process.h>
#include "wlbsutil.h"
#include "CommonClusterPage.h"
#define DUMMY_PASSWORD L"somepassword"
#define EMPTY_PASSWORD L""
//
// No trace/assert for now
//
#define TraceMsg(x)
#define Assert(x)
//+---------------------------------------------------------------------------
//
// Function: SzLoadStringPcch
//
// Purpose: Load a resource string. (This function will never return NULL.)
//
// Arguments:
// hinst [in] Instance handle of module with the string resource.
// unId [in] Resource ID of the string to load.
// pcch [out] Pointer to returned character length.
//
// Returns: Pointer to the constant string.
//
// Author: shaunco 24 Mar 1997
// fengsun copied from net\config\common\ncbase\ncstring.cpp
//
// Notes: The loaded string is pointer directly into the read-only
// resource section. Any attempt to write through this pointer
// will generate an access violation.
//
// The implementations is referenced from "Win32 Binary Resource
// Formats" (MSDN) 4.8 String Table Resources
//
// User must have RCOPTIONS = -N turned on in your sources file.
//
PCWSTR
SzLoadStringPcch (
IN HINSTANCE hinst,
IN UINT unId,
OUT int* pcch)
{
Assert(hinst);
Assert(unId);
Assert(pcch);
static const WCHAR c_szSpace[] = L" ";
PCWSTR psz = c_szSpace;
int cch = 1;
// String Tables are broken up into 16 string segments. Find the segment
// containing the string we are interested in.
HRSRC hrsrcInfo = FindResource (hinst,
(PWSTR)ULongToPtr( ((LONG)(((USHORT)unId >> 4) + 1)) ),
RT_STRING);
if (hrsrcInfo)
{
// Page the resource segment into memory.
HGLOBAL hglbSeg = LoadResource (hinst, hrsrcInfo);
if (hglbSeg)
{
// Lock the resource.
psz = (PCWSTR)LockResource(hglbSeg);
if (psz)
{
// Move past the other strings in this segment.
// (16 strings in a segment -> & 0x0F)
unId &= 0x0F;
cch = 0;
do
{
psz += cch; // Step to start of next string
cch = *((WCHAR*)psz++); // PASCAL like string count
}
while (unId--);
// If we have a non-zero count, it includes the
// null-terminiator. Subtract this off for the return value.
//
if (cch)
{
cch--;
}
else
{
// AssertSz(0, "String resource not found");
psz = c_szSpace;
cch = 1;
}
}
else
{
psz = c_szSpace;
cch = 1;
// TraceLastWin32Error("SzLoadStringPcch: LockResource failed.");
}
}
// else
// TraceLastWin32Error("SzLoadStringPcch: LoadResource failed.");
}
// else
// TraceLastWin32Error("SzLoadStringPcch: FindResource failed.");
*pcch = cch;
Assert(*pcch);
Assert(psz);
return psz;
}
//+---------------------------------------------------------------------------
//
// Function: SzLoadString
//
// Purpose: Load a resource string. (This function will never return NULL.)
//
// Arguments:
// hinst [in] Instance handle of module with the string resource.
// unId [in] Resource ID of the string to load.
//
// Returns: Pointer to the constant string.
//
// Author: shaunco 24 Mar 1997
// fengsun copied from net\config\common\ncbase\ncstring.cpp
//
// Notes: See SzLoadStringPcch()
//
PCWSTR
SzLoadString (
HINSTANCE hinst,
UINT unId)
{
int cch;
return SzLoadStringPcch(hinst, unId, &cch);
}
//+---------------------------------------------------------------------------
//
// Function: NcMsgBox
//
// Purpose: Displays a message box using resource strings and replaceable
// parameters.
//
// Arguments:
// hinst [in] hinstance for resource strings
// hwnd [in] parent window handle
// unIdCaption [in] resource id of caption string
// unIdFormat [in] resource id of text string (with %1, %2, etc.)
// unStyle [in] standard message box styles
// ... [in] replaceable parameters (optional)
// (these must be PCWSTRs as that is all
// FormatMessage handles.)
//
// Returns: the return value of MessageBox()
//
// Author: shaunco 24 Mar 1997
// fengsun copied from net\config\common\ncbase\ncui.cpp
//
// Notes: FormatMessage is used to do the parameter substitution.
//
INT
WINAPIV
NcMsgBox (
IN HINSTANCE hinst,
IN HWND hwnd,
IN UINT unIdCaption,
IN UINT unIdFormat,
IN UINT unStyle,
IN ...)
{
PCWSTR pszCaption = SzLoadString (hinst, unIdCaption);
PCWSTR pszFormat = SzLoadString (hinst, unIdFormat);
PWSTR pszText = NULL;
va_list val;
va_start (val, unStyle);
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,
pszFormat, 0, 0, (PWSTR)&pszText, 0, &val);
va_end (val);
INT nRet = MessageBox (hwnd, pszText, pszCaption, unStyle);
LocalFree (pszText);
return nRet;
}
//+----------------------------------------------------------------------------
//
// Function: CCommonClusterPage::CCommonClusterPage
//
// Description:
//
// Arguments: HINSTANCE hInstance - instance handle for string resources
// NETCFG_WLBS_CONFIG * paramp - IN/OUT NLB properties
// bool fDisablePassword - whether do disable password editing
// const DWORD * adwHelpIDs - a list of help ID pairs, or NULL.
// The pointer has to be valid through the lifetime of this dialog.
//
// Returns: Nothing
//
// History: fengsun Created Header 1/4/01
//
//+----------------------------------------------------------------------------
CCommonClusterPage::CCommonClusterPage(HINSTANCE hInstance,
NETCFG_WLBS_CONFIG * paramp,
bool fDisablePassword, const DWORD * adwHelpIDs) :
m_IpSubnetControl(IDC_EDIT_CL_IP, IDC_EDIT_CL_MASK)
{
TraceMsg(L"CCommonClusterPage::CCommonClusterPage\n");
m_paramp = paramp;
m_adwHelpIDs = adwHelpIDs;
m_rct_warned = FALSE;
m_igmp_warned = FALSE;
m_igmp_mcast_warned = FALSE;
m_hInstance = hInstance;
m_fDisablePassword = fDisablePassword;
}
/*
* Method: CCommonClusterPage
* Description: The class destructor.
*/
CCommonClusterPage::~CCommonClusterPage () {
TraceMsg(L"CCommonClusterPage::~CCommonClusterPage\n");
}
/*
* Method: OnInitDialog
* Description: Called to initialize the cluster properties dialog.
*/
LRESULT CCommonClusterPage::OnInitDialog (HWND hWnd)
{
TraceMsg(L"CCommonClusterPage::OnInitDialog\n");
m_hWnd = hWnd;
/* Limit the field ranges for the address and password fields. */
::SendDlgItemMessage(m_hWnd, IDC_EDIT_DOMAIN, EM_SETLIMITTEXT, CVY_MAX_DOMAIN_NAME, 0);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_ETH, EM_SETLIMITTEXT, CVY_MAX_NETWORK_ADDR, 0);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_PASSW, EM_SETLIMITTEXT, CVY_MAX_RCT_CODE, 0);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_PASSW2, EM_SETLIMITTEXT, CVY_MAX_RCT_CODE, 0);
/* Disable the MAC address field. It should be read-only. */
if (m_paramp->fConvertMac) ::EnableWindow(::GetDlgItem (m_hWnd, IDC_EDIT_ETH), FALSE);
/* Copy a dummy password into the parameter set. */
wcsncpy(m_passw, DUMMY_PASSWORD, CVY_MAX_RCT_CODE);
wcsncpy(m_passw2, DUMMY_PASSWORD, CVY_MAX_RCT_CODE);
m_IpSubnetControl.OnInitDialog(m_hWnd, AfxGetInstanceHandle());
return 0;
}
/*
* Method: OnContextMenu
* Description:
*/
LRESULT CCommonClusterPage::OnContextMenu ()
{
TraceMsg(L"CCommonClusterPage::OnContextMenu\n");
/* Spawn a help window. */
if (m_adwHelpIDs != NULL)
::WinHelp(m_hWnd, CVY_CTXT_HELP_FILE, HELP_CONTEXTMENU, (ULONG_PTR)m_adwHelpIDs);
return 0;
}
/*
* Method: OnHelp
* Description:
*/
LRESULT CCommonClusterPage::OnHelp (UINT uMsg, WPARAM wParam, LPARAM lParam) {
TraceMsg(L"CCommonClusterPage::OnHelp\n");
LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam);
/* Spawn a help window. */
if ((HELPINFO_WINDOW == lphi->iContextType) && (m_adwHelpIDs != NULL))
::WinHelp(static_cast<HWND>(lphi->hItemHandle), CVY_CTXT_HELP_FILE, HELP_WM_HELP, (ULONG_PTR)m_adwHelpIDs);
return 0;
}
/*
* Method: Load
* Description: Called when the cluster settings tab becomes active (is clicked).
*/
BOOL CCommonClusterPage::Load (void)
{
TraceMsg(L"CCommonClusterPage::Load\n");
/* Populate the UI with the current configuration. */
SetInfo();
//
// NLB mamager always has password editing disabled
//
/* Enable/disable the password entry boxes based on the state of the remote control checkbox.
Edited( mhakim 02-09-01)
but only when remote control is enabled.
*/
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW),
::IsDlgButtonChecked(m_hWnd, IDC_CHECK_RCT)
&&
::IsWindowEnabled( ::GetDlgItem( m_hWnd, IDC_CHECK_RCT ) ) );
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW2),
::IsDlgButtonChecked(m_hWnd, IDC_CHECK_RCT)
&&
::IsWindowEnabled( ::GetDlgItem( m_hWnd, IDC_CHECK_RCT ) ) );
/* Enable/disable the IGMP checkbox based on the state of the multicast checkbox.
Edited( mhakim 02-09-01)
but only when multicast button is enabled.
*/
::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_IGMP),
::IsDlgButtonChecked (m_hWnd, IDC_RADIO_MULTICAST)
&&
::IsWindowEnabled( ::GetDlgItem( m_hWnd, IDC_RADIO_MULTICAST) ) );
/* Fill in the cluster MAC address, based on the values of multicast, IGMP, and the cluster IP. */
SetClusterMACAddress();
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
/*
* Method: Save
* Description: Called When the focus moves away from the cluster settings tab.
*/
BOOL CCommonClusterPage::Save (void)
{
LRESULT lRet;
TraceMsg(L"CCommonClusterPage::OnKillActive\n");
/* Get the new configuration from the UI. */
UpdateInfo();
lRet = ValidateInfo();
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, lRet);
return lRet==PSNRET_NOERROR;
}
/*
* Method: OnButtonHelp
* Description: Called when the user clicks the NLB "Help" button.
*/
LRESULT CCommonClusterPage::OnButtonHelp (WORD wNotifyCode, WORD wID, HWND hWndCtl) {
WCHAR wbuf[CVY_STR_SIZE];
TraceMsg(L"CCommonClusterPage::OnButtonHelp\n");
switch (wNotifyCode) {
case BN_CLICKED:
/* Spawn the windows help process. */
StringCbPrintf(wbuf, sizeof(wbuf), L"%%WINDIR%%\\help\\%ls::/installation.htm", CVY_HELP_FILE);
_wspawnlp(P_NOWAIT, L"hh.exe", L"hh.exe", wbuf, NULL);
break;
}
return 0;
}
/*
* Method: OnEditClIp
* Description: Called when the user edits the cluster IP address.
*/
LRESULT CCommonClusterPage::OnEditClIp (WORD wNotifyCode, WORD wID, HWND hWndCtl) {
TraceMsg(L"CCommonClusterPage::OnEditClIp\n");
switch (wNotifyCode) {
case EN_CHANGE:
/* Update the cluster MAC address. */
SetClusterMACAddress();
break;
}
return 0;
}
/*
* Method: OnIpFieldChange
* Description: Called wnen a field (byte) of the cluster IP address changes. We use this
* to make sure the first byte of the IP is not < 1 or > 223.
*/
LRESULT CCommonClusterPage::OnIpFieldChange (int idCtrl, LPNMHDR pnmh, BOOL & fHandled)
{
return m_IpSubnetControl.OnIpFieldChange(idCtrl, pnmh);
}
/*
* Method: OnEditClMask
* Description: Called when the user modifies the cluster netmask.
*/
LRESULT CCommonClusterPage::OnEditClMask (WORD wNotifyCode, WORD wID, HWND hWndCtl)
{
return m_IpSubnetControl.OnSubnetMask(wNotifyCode);
}
/*
* Method: OnCheckRct
* Description: Called when the user checks/unchecks the remote control enabled checkbox.
*/
LRESULT CCommonClusterPage::OnCheckRct (WORD wNotifyCode, WORD wID, HWND hWndCtl) {
TraceMsg(L"CCommonClusterPage::OnCheckRct\n");
switch (wNotifyCode) {
case BN_CLICKED:
/* Decide whether to enable or diable the password entry boxes based on the value of the remote checkbox. */
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW), ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_RCT));
::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_PASSW2), ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_RCT));
/* Warn the user about the implications of enabling remote control. */
if (::IsDlgButtonChecked(m_hWnd, IDC_CHECK_RCT) && !m_rct_warned) {
/* Alert the user. */
int iResponse = NcMsgBox(m_hInstance, m_hWnd, IDS_PARM_WARN, IDS_PARM_RCT_WARN,
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2);
if (iResponse == IDYES)
{
//
// Dialog button is already checked, so don't do anything in this case.
//
/* Only warn the user once. */
m_rct_warned = TRUE;
}
else
{
//
// Any response other than Yes means No
//
if (::CheckDlgButton(m_hWnd, IDC_CHECK_RCT, BST_UNCHECKED))
{
TraceMsg(L"CDialogCluster::OnCheckRct unchecking remote control option failed\n");
}
}
}
break;
}
return 0;
}
/*
* Method: OnCheckMode
* Description: Called when the user changes cluster mode.
*/
LRESULT CCommonClusterPage::OnCheckMode (WORD wNotifyCode, WORD wID, HWND hWndCtl) {
TraceMsg(L"CCommonClusterPage::OnCheckMode\n");
switch (wNotifyCode) {
case BN_CLICKED:
/* If the user has IGMP checked, but is turning off multicast support, warn them. */
if (::IsDlgButtonChecked(m_hWnd, IDC_CHECK_IGMP) && !::IsDlgButtonChecked(m_hWnd, IDC_RADIO_MULTICAST)) {
if (!m_igmp_mcast_warned) {
/* Alert the user. */
NcMsgBox(m_hInstance, ::GetActiveWindow(), IDS_PARM_WARN, IDS_PARM_IGMP_MCAST,
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
/* Only warn the user once. */
m_igmp_mcast_warned = TRUE;
}
/* Uncheck and disable the IGMP checkbox and set the IGMP support flag to FALSE. */
::CheckDlgButton(m_hWnd, IDC_CHECK_IGMP, FALSE);
::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_IGMP), FALSE);
m_paramp->fIGMPSupport = FALSE;
} else {
/* Enable/disable and check/uncheck the IGMP checkbox based on the value of the cluster mode radio buttons. */
::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_IGMP), ::IsDlgButtonChecked(m_hWnd, IDC_RADIO_MULTICAST));
}
/* Update the cluster MAC address. */
SetClusterMACAddress();
break;
}
return 0;
}
/*
* Method: OnCheckIGMP
* Description: Called when the user checks/unchecks the IGMP support checkbox.
*/
LRESULT CCommonClusterPage::OnCheckIGMP (WORD wNotifyCode, WORD wID, HWND hWndCtl) {
TraceMsg(L"CCommonClusterPage::OnCheckIGMP\n");
switch (wNotifyCode) {
case BN_CLICKED:
/* Update the cluster MAC address. */
SetClusterMACAddress();
/* Warn the user about the implications of enabling remote control. */
if (::IsDlgButtonChecked(m_hWnd, IDC_CHECK_IGMP) && !m_igmp_warned) {
/* Alert the user. */
NcMsgBox(m_hInstance, ::GetActiveWindow(), IDS_PARM_WARN, IDS_PARM_IGMP_WARN,
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
/* Only warn the user once. */
m_igmp_warned = TRUE;
}
break;
}
return 0;
}
/*
* Method: SetClusterMACAddress
* Description: Used to determine the cluster MAC address based on the cluster IP, and the
* state of multicast and IGMP support.
*/
void CCommonClusterPage::SetClusterMACAddress () {
WCHAR cl_ip_addr[CVY_MAX_CL_IP_ADDR + 1];
WCHAR cl_mac_addr[CVY_MAX_NETWORK_ADDR + 1];
TraceMsg(L"CCommonClusterPage::SetClusterMACAddress\n");
/* If the convert MAC flag isn't set, the bail out. */
if (!m_paramp->fConvertMac) return;
/* Retrieve the cluster IP address from the UI. */
::SendDlgItemMessage(m_hWnd, IDC_EDIT_CL_IP, WM_GETTEXT, CVY_MAX_CL_IP_ADDR + 1, (LPARAM)cl_ip_addr);
/* Generate the cluster MAC address. */
ParamsGenerateMAC(cl_ip_addr, cl_mac_addr, ASIZECCH(cl_mac_addr), m_paramp->szMCastIpAddress, ASIZECCH(m_paramp->szMCastIpAddress), m_paramp->fConvertMac, ::IsDlgButtonChecked(m_hWnd, IDC_RADIO_MULTICAST),
::IsDlgButtonChecked(m_hWnd, IDC_CHECK_IGMP), m_paramp->fIpToMCastIp);
/* Set the cluster MAC address. */
::SendDlgItemMessage(m_hWnd, IDC_EDIT_ETH, WM_SETTEXT, 0, (LPARAM)cl_mac_addr);
}
/*
* Method: CheckClusterMACAddress
* Description: Used to check the cluster MAC address in the case where we aren't generating it ourselves.
*/
BOOL CCommonClusterPage::CheckClusterMACAddress () {
PWCHAR p1, p2;
WCHAR mac_addr[WLBS_MAX_NETWORK_ADDR + 1];
DWORD i, j;
BOOL flag = TRUE;
/* Valid formats include:
02:bf:0b:0b:01:01
02-bf-0b-0b-01-01
02:bf:0b:b:01:1 */
/* Make a copy of the MAC address. */
ARRAYSTRCPY(mac_addr, m_paramp->cl_mac_addr);
/* Point to the beginning of the MAC. */
p2 = p1 = mac_addr;
/* Loop through all six bytes. */
for (i = 0 ; i < 6 ; i++) {
/* If we are pointing at the end of the string, its invalid. */
if (*p2 == _TEXT('\0')) return FALSE;
/* Convert the hex characters into decimal. */
j = _tcstoul(p1, &p2, 16);
/* If the number is greater than 255, then the format is bad. */
if (j > 255) return FALSE;
/* If the NEXT character is neither a -, :, nor the NUL character, then the format is bad. */
if (!((*p2 == _TEXT('-')) || (*p2 == _TEXT(':')) || (*p2 == _TEXT('\0')))) return FALSE;
/* If the NEXT character is the end of the string, but we don't have enough bytes yet, bail out. */
if (*p2 == _TEXT('\0') && i < 5) return FALSE;
/* Repoint to the NEXT character. */
p1 = p2 + 1;
p2 = p1;
}
return TRUE;
}
/*
* Method: SetInfo
* Description: Called to populate the UI with the current cluster settings.
*/
void CCommonClusterPage::SetInfo () {
/* Check (or uncheck) the checkboxes. */
::CheckDlgButton(m_hWnd, IDC_CHECK_RCT, m_paramp->fRctEnabled);
/* Check the appropriate radio button for cluster mode. */
if (m_paramp->fMcastSupport) {
::CheckDlgButton(m_hWnd, IDC_RADIO_MULTICAST, TRUE);
if (m_paramp->fIGMPSupport) ::CheckDlgButton(m_hWnd, IDC_CHECK_IGMP, TRUE);
} else
::CheckDlgButton(m_hWnd, IDC_RADIO_UNICAST, TRUE);
m_IpSubnetControl.SetInfo(m_paramp->cl_ip_addr, m_paramp->cl_net_mask);
/* Fill in the edit boxes. */
::SendDlgItemMessage(m_hWnd, IDC_EDIT_DOMAIN, WM_SETTEXT, 0, (LPARAM)m_paramp->domain_name);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_ETH, WM_SETTEXT, 0, (LPARAM)m_paramp->cl_mac_addr);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_PASSW, WM_SETTEXT, 0, (LPARAM)m_passw);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_PASSW2, WM_SETTEXT, 0, (LPARAM)m_passw2);
}
/*
* Method: UpdateInfo
* Description: Called to copy the UI state to the cluster configuration.
*/
void CCommonClusterPage::UpdateInfo () {
TraceMsg(L"CCommonClusterPage::UpdateInfo\n");
/* Retrieve the checkbox values. */
m_paramp->fRctEnabled = ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_RCT) == 1;
/* Retrieve the cluster mode radio button value. */
m_paramp->fIGMPSupport = ::IsDlgButtonChecked(m_hWnd, IDC_CHECK_IGMP) == 1;
m_paramp->fMcastSupport = ::IsDlgButtonChecked(m_hWnd, IDC_RADIO_MULTICAST) == 1;
m_IpSubnetControl.UpdateInfo(m_paramp->cl_ip_addr, m_paramp->cl_net_mask);
/* Retrieve the entry box values. */
// Edited ( mhakim 02-12-01 )
// We need to retrieve one more byte for the domain name and network address.
// ::SendDlgItemMessage(m_hWnd, IDC_EDIT_DOMAIN, WM_GETTEXT, CVY_MAX_DOMAIN_NAME, (LPARAM)m_paramp->domain_name);
// ::SendDlgItemMessage(m_hWnd, IDC_EDIT_ETH, WM_GETTEXT, CVY_MAX_NETWORK_ADDR, (LPARAM)m_paramp->cl_mac_addr);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_DOMAIN, WM_GETTEXT, CVY_MAX_DOMAIN_NAME + 1, (LPARAM)m_paramp->domain_name);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_ETH, WM_GETTEXT, CVY_MAX_NETWORK_ADDR + 1, (LPARAM)m_paramp->cl_mac_addr);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_PASSW, WM_GETTEXT, CVY_MAX_RCT_CODE + 1, (LPARAM)m_passw);
::SendDlgItemMessage(m_hWnd, IDC_EDIT_PASSW2, WM_GETTEXT, CVY_MAX_RCT_CODE + 1, (LPARAM)m_passw2);
}
/*
* Method: ValidateInfo
* Description: Called to validate the entries made by the user.
*/
LRESULT CCommonClusterPage::ValidateInfo () {
DWORD IPAddr;
TraceMsg(L"CCommonClusterPage::ValidateInfo\n");
if (!m_IpSubnetControl.ValidateInfo())
{
//
// Check whether IP address and subnet mask pair is valid
//
return PSNRET_INVALID;
}
//
// Get the user input
//
m_IpSubnetControl.UpdateInfo(m_paramp->cl_ip_addr, m_paramp->cl_net_mask);
/* Check to make sure that the dedicated IP and cluster IP are not the same. */
if (!wcscmp(m_paramp->ded_ip_addr, m_paramp->cl_ip_addr)) {
/* Alert the user. */
NcMsgBox(m_hInstance, ::GetActiveWindow(), IDS_PARM_ERROR, IDS_PARM_IP_CONFLICT,
MB_APPLMODAL | MB_ICONSTOP | MB_OK);
/* An error occurred. */
return PSNRET_INVALID;
}
if (!m_paramp->fConvertMac && !CheckClusterMACAddress()) {
/* Alert the user. */
NcMsgBox(m_hInstance, ::GetActiveWindow(), IDS_PARM_ERROR, IDS_PARM_INVAL_MAC,
MB_APPLMODAL | MB_ICONSTOP | MB_OK);
/* An error occurred. */
return PSNRET_INVALID;
}
/* Only check for invalid passwords and update if remote control is enabled. */
if (::IsDlgButtonChecked(m_hWnd, IDC_CHECK_RCT)) {
/* Make sure the passwords match. */
if (wcscmp(m_passw, m_passw2) != 0) {
/* Alert the user. */
NcMsgBox(m_hInstance, ::GetActiveWindow(), IDS_PARM_ERROR, IDS_PARM_PASSWORD,
MB_APPLMODAL | MB_ICONSTOP | MB_OK);
/* Empty the passwords. */
m_passw [0] = m_passw2 [0] = 0;
/* An error occurred. */
return PSNRET_INVALID;
} else {
/* If the new password is not the dummy password, update the password. */
if (wcscmp (m_passw, DUMMY_PASSWORD) != 0) {
ARRAYSTRCPY(m_paramp->szPassword, m_passw);
m_paramp->fChangePassword = true;
}
}
}
return PSNRET_NOERROR;
}