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.
 
 
 
 
 
 

417 lines
11 KiB

// Copyright (c) 1997-1999 Microsoft Corporation
#include "precomp.h"
#include "..\Common\ServiceThread.h"
#include "moredlg.h"
#ifdef EXT_DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "resource.h"
#include "..\common\util.h"
#include "IDDlg.h"
#include "NetUtility.h"
#include "NetHelpIDs.h"
#include "common.h"
static const DWORD _help_map[] =
{
IDC_FULL_NAME, IDH_IDENT_CHANGES_PREVIEW_NAME,
IDC_NEW_NAME, IDH_IDENT_CHANGES_NEW_NAME,
IDC_MORE, IDH_IDENT_CHANGES_MORE_BUTTON,
IDC_DOMAIN_BUTTON, IDH_IDENT_CHANGES_MEMBER_DOMAIN,
IDC_WORKGROUP_BUTTON, IDH_IDENT_CHANGES_MEMBER_WORKGRP,
IDC_DOMAIN, IDH_IDENT_CHANGES_MEMBER_DOMAIN_TEXTBOX,
IDC_WORKGROUP, IDH_IDENT_CHANGES_MEMBER_WORKGRP_TEXTBOX,
IDC_FIND, -1,
0, 0
};
//---------------------------------------------------------------------
IDChangesDialog::IDChangesDialog(WbemServiceThread *serviceThread,
State &state)
: WBEMPageHelper(serviceThread),
m_state(state)
{
}
//-------------------------------------------------------------
IDChangesDialog::~IDChangesDialog()
{
}
//----------------------------------------------------------
void IDChangesDialog::enable()
{
bool networking_installed = m_state.IsNetworkingInstalled();
BOOL workgroup = IsDlgButtonChecked(IDC_WORKGROUP_BUTTON) == BST_CHECKED;
::EnableWindow(GetDlgItem(IDC_DOMAIN),
!workgroup && networking_installed);
::EnableWindow(GetDlgItem(IDC_FIND),
!workgroup && networking_installed);
::EnableWindow(GetDlgItem(IDC_WORKGROUP),
workgroup && networking_installed);
bool b = false;
if (workgroup)
{
b = !GetTrimmedDlgItemText(m_hWnd, IDC_WORKGROUP).IsEmpty();
}
else
{
b = !GetTrimmedDlgItemText(m_hWnd, IDC_DOMAIN).IsEmpty();
}
bool enable = m_state.ChangesNeedSaving() && b &&
!GetTrimmedDlgItemText(m_hWnd, IDC_NEW_NAME).IsEmpty();
::EnableWindow(GetDlgItem(IDOK), enable);
}
//----------------------------------------------------------
LRESULT IDChangesDialog::OnInit(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_hDlg = m_hWnd;
SetDlgItemText(IDC_FULL_NAME, m_state.GetFullComputerName());
SetDlgItemText(IDC_NEW_NAME, m_state.GetShortComputerName());
bool joined_to_workgroup = m_state.IsMemberOfWorkgroup();
CheckDlgButton(IDC_WORKGROUP_BUTTON,
joined_to_workgroup ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(IDC_DOMAIN_BUTTON,
joined_to_workgroup ? BST_UNCHECKED : BST_CHECKED);
SetDlgItemText(joined_to_workgroup ? IDC_WORKGROUP : IDC_DOMAIN,
m_state.GetDomainName());
bool networking_installed = m_state.IsNetworkingInstalled();
bool tcp_installed = networking_installed && IsTCPIPInstalled();
int show = tcp_installed ? SW_SHOW : SW_HIDE;
::ShowWindow(GetDlgItem(IDC_FULL_LABEL), show);
::ShowWindow(GetDlgItem(IDC_FULL_NAME), show);
::ShowWindow(GetDlgItem(IDC_MORE), show);
HWND new_name_edit = GetDlgItem(IDC_NEW_NAME);
HWND domain_name_edit = GetDlgItem(IDC_DOMAIN);
// Edit_LimitText(domain_name_edit, tcp_installed ? DNS::MAX_NAME_LENGTH : DNLEN);
// Edit_LimitText(new_name_edit, tcp_installed ? DNS::MAX_LABEL_LENGTH : MAX_COMPUTERNAME_LENGTH);
if (!tcp_installed)
{
// Set the uppercase style on the new name & domain edit boxes
LONG style = ::GetWindowLong(new_name_edit, GWL_STYLE);
style |= ES_UPPERCASE;
::SetWindowLong(new_name_edit, GWL_STYLE, style);
style = ::GetWindowLong(domain_name_edit, GWL_STYLE);
style |= ES_UPPERCASE;
::SetWindowLong(domain_name_edit, GWL_STYLE, style);
}
//TODO::Edit_LimitText(GetDlgItem(IDC_WORKGROUP), DNLEN);
// no networking at all further restricts the UI to just NetBIOS-like
// computer name changes.
if (!networking_installed)
{
::EnableWindow(GetDlgItem(IDC_DOMAIN_BUTTON), false);
::EnableWindow(GetDlgItem(IDC_WORKGROUP_BUTTON), false);
::EnableWindow(GetDlgItem(IDC_DOMAIN), false);
::EnableWindow(GetDlgItem(IDC_WORKGROUP), false);
::EnableWindow(GetDlgItem(IDC_GROUP), false);
TCHAR temp[256] = {0};
StringLoad(IDS_NAME_MESSAGE, temp, 256);
::SetWindowText(GetDlgItem(IDC_MESSAGE), temp);
}
else
{
TCHAR temp[256] = {0};
StringLoad(IDS_NAME_AND_MEMBERSHIP_MESSAGE, temp, 256);
::SetWindowText(GetDlgItem(IDC_MESSAGE), temp);
}
enable();
return S_OK;
}
//----------------------------------------------------------
NET_API_STATUS IDChangesDialog::myNetValidateName(const CHString& name,
NETSETUP_NAME_TYPE nameType)
{
/* ATLASSERT(!name.IsEmpty());
if(!name.IsEmpty())
{
NET_API_STATUS status;// = ::NetValidateName(0, name,
// 0, 0, nameType);
return status;
}
*/
return ERROR_INVALID_PARAMETER;
}
//----------------------------------------------------------
bool IDChangesDialog::validateName(HWND dialog,
int nameResID,
const CHString &name,
NETSETUP_NAME_TYPE nameType)
{
/* ATLASSERT(IsWindow(dialog));
ATLASSERT(nameResID);
NET_API_STATUS status;// = myNetValidateName(name, nameType);
if(status != NERR_Success)
{
TCHAR temp[256] = {0};
StringLoad(IDS_VALIDATE_NAME_FAILED, temp, 256);
gripe(dialog,
nameResID,
HRESULT_FROM_WIN32(status),
temp,
IDS_APP_TITLE);
return false;
}
*/
return true;
}
// this is also good for the tcp/ip not installed case, as the edit control
// limits the text length, and we decided not to allow '.' in netbios names
// any longer
//----------------------------------------------------------
bool IDChangesDialog::validateShortComputerName(HWND dialog)
{
/* ATLASSERT(IsWindow(dialog));
if(!m_state.WasShortComputerNameChanged())
{
return true;
}
CHString name = m_state.GetShortComputerName();
CHString message;
switch (DNS::ValidateDNSLabelSyntax(name))
{
case DNS::VALID_LABEL:
{
if (state.IsNetworkingInstalled())
{
return validateName(dialog, IDC_NEW_NAME, name, NetSetupMachine);
}
else
{
return true;
}
}
case DNS::LABEL_TOO_LONG:
{
message = String::format(IDS_COMPUTER_NAME_TOO_LONG,
name.c_str(),
DNS::MAX_LABEL_LENGTH);
break;
}
case DNS::NON_RFC_LABEL:
{
message = String::format(IDS_NON_RFC_COMPUTER_NAME_SYNTAX,
name.c_str());
if(MessageBox(dialog, message,
String::load(IDS_APP_TITLE),
MB_ICONWARNING | MB_YESNO) == IDYES)
{
return validateName(dialog, IDC_NEW_NAME, name, NetSetupMachine);
}
HWND edit = GetDlgItem(IDC_NEW_NAME);
::SendMessage(edit, EM_SETSEL, 0, -1);
::SetFocus(edit);
return false;
}
case DNS::INVALID_LABEL:
{
message = CHString::format(IDS_BAD_COMPUTER_NAME_SYNTAX,
name.c_str());
break;
}
default:
{
ATLASSERT(false);
message = CHString::format(IDS_BAD_COMPUTER_NAME_SYNTAX,
name.c_str());
break;
}
}
gripe(dialog, IDC_NEW_NAME,
message, IDS_APP_TITLE);
*/
return false;
}
//----------------------------------------------------------
bool IDChangesDialog::validateDomainOrWorkgroupName(HWND dialog)
{
/* ATLASSERT(IsWindow(dialog));
if (!State::GetInstance().WasMembershipChanged())
{
return true;
}
NETSETUP_NAME_TYPE name_type = NetSetupWorkgroup;
int name_id = IDC_WORKGROUP;
if(IsDlgButtonChecked(IDC_DOMAIN_BUTTON) == BST_CHECKED)
{
name_type = NetSetupDomain;
name_id = IDC_DOMAIN;
}
CHString name = GetTrimmedDlgItemText(m_hWnd, name_id);
return validateName(dialog, name_id, name, name_type);
*/
return false;
}
//----------------------------------------------------------
bool IDChangesDialog::onOKButton()
{
ATLASSERT(m_state.ChangesNeedSaving());
HourGlass(true);
// computer primary DNS name has already been validated by
// MoreChangesDialog
// this is redundant, really, but I'm paranoid.
m_state.SetShortComputerName(GetTrimmedDlgItemText(m_hWnd, IDC_NEW_NAME));
bool workgroup = IsDlgButtonChecked(IDC_WORKGROUP_BUTTON) == BST_CHECKED;
m_state.SetIsMemberOfWorkgroup(workgroup);
if(workgroup)
{
m_state.SetDomainName(GetTrimmedDlgItemText(m_hWnd, IDC_WORKGROUP));
}
else
{
m_state.SetDomainName(GetTrimmedDlgItemText(m_hWnd, IDC_DOMAIN));
}
if(!validateShortComputerName(m_hWnd) ||
!validateDomainOrWorkgroupName(m_hWnd))
{
HourGlass(false);
return false;
}
if(m_state.SaveChanges(m_hWnd))
{
AppMessage(m_hWnd, IDS_MUST_REBOOT);
m_state.SetMustRebootFlag(true);
return true;
}
HourGlass(false);
return false;
}
//----------------------------------------------------------
LRESULT IDChangesDialog::OnCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
switch(wID)
{
case IDC_MORE:
{
if (wNotifyCode == BN_CLICKED)
{
MoreChangesDialog dlg(g_serviceThread, m_state);
if (dlg.DoModal() == MoreChangesDialog::CHANGES_MADE)
{
SetDlgItemText(IDC_FULL_NAME, m_state.GetFullComputerName());
enable();
}
}
break;
}
case IDC_WORKGROUP_BUTTON:
case IDC_DOMAIN_BUTTON:
{
if (wNotifyCode == BN_CLICKED)
{
bool workgroup = IsDlgButtonChecked(IDC_WORKGROUP_BUTTON) == BST_CHECKED;
m_state.SetIsMemberOfWorkgroup(workgroup);
if(workgroup)
{
m_state.SetDomainName(GetTrimmedDlgItemText(m_hWnd, IDC_WORKGROUP));
}
else
{
m_state.SetDomainName(GetTrimmedDlgItemText(m_hWnd, IDC_DOMAIN));
}
enable();
}
break;
}
case IDC_WORKGROUP: // the editboxes
case IDC_DOMAIN:
{
if (wNotifyCode == EN_CHANGE)
{
//TODOSetModified(wID);
m_state.SetDomainName(GetTrimmedDlgItemText(m_hWnd, wID));
enable();
}
break;
}
case IDC_NEW_NAME:
{
if (wNotifyCode == EN_CHANGE)
{
//TODOSetChanged(wID);
m_state.SetShortComputerName(GetTrimmedDlgItemText(m_hWnd, wID));
SetDlgItemText(IDC_FULL_NAME, m_state.GetFullComputerName());
enable();
}
break;
}
case IDOK:
{
if(wNotifyCode == BN_CLICKED)
{
if(onOKButton())
{
EndDialog(wID);
}
}
break;
}
case IDCANCEL:
{
if(wNotifyCode == BN_CLICKED)
{
EndDialog(wID);
}
break;
}
default:
{
bHandled = false;
break;
}
}
return true;
}