windows-nt/Source/XPSP1/NT/shell/osshell/lmui/netobjs/fixes/pages.cxx
2020-09-26 16:20:57 +08:00

609 lines
15 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1995.
//
// File: pages.cxx
//
// Contents: property pages for provider, domain/workgroup, server, share
//
// History: 26-Sep-95 BruceFo Created
//
//--------------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
#include "resource.h"
#include "helpids.h"
#include "ext.hxx"
#include "pages.hxx"
#include "util.hxx"
////////////////////////////////////////////////////////////////////////////
//
// This is the minimum version number necessary to
// actually display a version number. If we get a
// machine with a major version number less that this
// value, we don't display the version number.
//
#define MIN_DISPLAY_VER 2
////////////////////////////////////////////////////////////////////////////
//+-------------------------------------------------------------------------
//
// Method: CPage::PageCallback, static public
//
// Synopsis:
//
//--------------------------------------------------------------------------
UINT CALLBACK
CPage::PageCallback(
IN HWND hwnd,
IN UINT uMsg,
IN LPPROPSHEETPAGE ppsp
)
{
switch (uMsg)
{
case PSPCB_CREATE:
return 1; // allow creation
case PSPCB_RELEASE:
{
CPage* pThis = (CPage*)ppsp->lParam;
delete pThis; // do this LAST!
return 0; // ignored
}
default:
appDebugOut((DEB_ERROR, "CPage::PageCallback, unknown page callback message %d\n", uMsg));
return 0;
} // end switch
}
//+-------------------------------------------------------------------------
//
// Method: CPage::DlgProcPage, static public
//
// Synopsis: Dialog Procedure for all CPage
//
//--------------------------------------------------------------------------
BOOL CALLBACK
CPage::DlgProcPage(
IN HWND hwnd,
IN UINT msg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
CPage* pThis = NULL;
if (msg==WM_INITDIALOG)
{
PROPSHEETPAGE* psp = (PROPSHEETPAGE*)lParam;
pThis = (CPage*)psp->lParam;
SetWindowLong(hwnd,GWL_USERDATA,(LPARAM)pThis);
}
else
{
pThis = (CPage*) GetWindowLong(hwnd,GWL_USERDATA);
}
if (pThis != NULL)
{
return pThis->_PageProc(hwnd,msg,wParam,lParam);
}
else
{
return FALSE;
}
}
//+--------------------------------------------------------------------------
//
// Method: CPage::CPage, public
//
// Synopsis: Constructor
//
//---------------------------------------------------------------------------
CPage::CPage(
IN CNetObj* pNetObj
)
:
_pNetObj(pNetObj)
{
INIT_SIG(CPage);
if (NULL != _pNetObj)
{
//
// We need to addref this because we are using member variable
// of this class.
//
_pNetObj->AddRef();
}
}
//+--------------------------------------------------------------------------
//
// Method: CPage::~CPage, public
//
// Synopsis: Destructor
//
//---------------------------------------------------------------------------
CPage::~CPage()
{
CHECK_SIG(CPage);
if (NULL != _pNetObj)
{
_pNetObj->Release();
}
}
//+-------------------------------------------------------------------------
//
// Method: CPage::InitInstance, public
//
// Synopsis: Part II of the constuctor process
//
// Notes: We don't want to handle any errors in constuctor, so this
// method is necessary for the second phase error detection.
//
//--------------------------------------------------------------------------
HRESULT
CPage::InitInstance(
VOID
)
{
CHECK_SIG(CPage);
appDebugOut((DEB_ITRACE, "CPage::InitInstance\n"));
return S_OK;
}
//+-------------------------------------------------------------------------
//
// Method: CPage::_PageProc, private
//
// Synopsis: Dialog Procedure for this object
//
//--------------------------------------------------------------------------
BOOL
CPage::_PageProc(
IN HWND hwnd,
IN UINT msg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
CHECK_SIG(CPage);
static DWORD aHelpIds[] =
{
IDC_NETWORK, IDH_NET_NETWORK,
IDC_NETWORK_ICON, IDH_NET_NETWORK,
IDC_SERVER, IDH_NET_SERVER,
IDC_SERVER_ICON, IDH_NET_SERVER,
IDC_SERVER_TEXT, IDH_NET_SERVER,
IDC_COMMENT, IDH_NET_COMMENT,
IDC_COMMENT_TEXT, IDH_NET_COMMENT,
IDC_WORKGROUP_OR_DOMAIN, IDH_NET_WORKGROUP_OR_DOMAIN_NAME,
IDC_WORKGROUP_OR_DOMAIN_NAME, IDH_NET_WORKGROUP_OR_DOMAIN_NAME,
IDC_WORKGROUP_OR_DOMAIN_NAME_2_ICON, IDH_NET_WORKGROUP_OR_DOMAIN_NAME_2,
IDC_WORKGROUP_OR_DOMAIN_NAME_2, IDH_NET_WORKGROUP_OR_DOMAIN_NAME_2,
IDC_TYPE, IDH_NET_TYPE,
IDC_TYPE_TEXT, IDH_NET_TYPE,
IDC_SHARE, IDH_NET_SHARE,
IDC_SHARE_ICON, IDH_NET_SHARE,
IDC_WRKGRP_TYPE, IDH_NET_WRKGRP_TYPE,
IDC_WRKGRP_TYPE_TEXT, IDH_NET_WRKGRP_TYPE,
0,0
};
switch (msg)
{
case WM_INITDIALOG:
_hwndPage = hwnd;
return _OnInitDialog(hwnd, (HWND)wParam, lParam);
case WM_NOTIFY:
return _OnNotify(hwnd, (int)wParam, (LPNMHDR)lParam);
case WM_HELP:
{
LPHELPINFO lphi = (LPHELPINFO)lParam;
if (lphi->iContextType == HELPINFO_WINDOW) // a control
{
WCHAR szHelp[50];
LoadString(g_hInstance, IDS_HELPFILENAME, szHelp, ARRAYLEN(szHelp));
WinHelp(
(HWND)lphi->hItemHandle,
szHelp,
HELP_WM_HELP,
(DWORD)(LPVOID)aHelpIds);
}
break;
}
case WM_CONTEXTMENU:
{
WCHAR szHelp[50];
LoadString(g_hInstance, IDS_HELPFILENAME, szHelp, ARRAYLEN(szHelp));
WinHelp(
(HWND)wParam,
szHelp,
HELP_CONTEXTMENU,
(DWORD)(LPVOID)aHelpIds);
break;
}
} // end switch (msg)
return FALSE;
}
//+-------------------------------------------------------------------------
//
// Method: CPage::_OnInitDialog, private
//
// Synopsis: WM_INITDIALOG handler
//
//--------------------------------------------------------------------------
BOOL
CPage::_OnInitDialog(
IN HWND hwnd,
IN HWND hwndFocus,
IN LPARAM lInitParam
)
{
CHECK_SIG(CPage);
appDebugOut((DEB_ITRACE, "_OnInitDialog\n"));
appAssert(NULL != _pNetObj);
LPNETRESOURCE pnr = (LPNETRESOURCE)_pNetObj->_bufNetResource;
appAssert(NULL != pnr);
if (RESOURCEDISPLAYTYPE_NETWORK == pnr->dwDisplayType)
{
return _OnInitNetwork(hwnd, pnr);
}
else if (RESOURCEDISPLAYTYPE_DOMAIN == pnr->dwDisplayType)
{
return _OnInitDomain(hwnd, pnr);
}
else if (RESOURCEDISPLAYTYPE_SERVER == pnr->dwDisplayType)
{
return _OnInitServerOrShare(hwnd, pnr, TRUE);
}
else if (RESOURCEDISPLAYTYPE_SHARE == pnr->dwDisplayType)
{
return _OnInitServerOrShare(hwnd, pnr, FALSE);
}
else
{
appAssert(!"CNetObj::AddPages. Unknown net resource type!\n");
return TRUE;
}
}
//+-------------------------------------------------------------------------
//
// Method: CPage::_OnInitNetwork, private
//
// Synopsis: WM_INITDIALOG handler
//
//--------------------------------------------------------------------------
BOOL
CPage::_OnInitNetwork(
IN HWND hwnd,
IN LPNETRESOURCE pnr
)
{
CHECK_SIG(CPage);
appAssert(NULL != pnr);
SetDlgItemText(hwnd, IDC_NETWORK, pnr->lpProvider);
return TRUE;
}
//+-------------------------------------------------------------------------
//
// Method: CPage::_OnInitDomain, private
//
// Synopsis: WM_INITDIALOG handler
//
//--------------------------------------------------------------------------
BOOL
CPage::_OnInitDomain(
IN HWND hwnd,
LPNETRESOURCE pnr
)
{
CHECK_SIG(CPage);
appAssert(NULL != pnr);
SetDlgItemText(hwnd, IDC_WORKGROUP_OR_DOMAIN_NAME_2, pnr->lpRemoteName);
SetDlgItemText(hwnd, IDC_WRKGRP_TYPE, pnr->lpProvider);
return TRUE;
}
//+-------------------------------------------------------------------------
//
// Method: CPage::_OnInitServerOrShare, private
//
// Synopsis: WM_INITDIALOG handler for Server and Share objects
//
//--------------------------------------------------------------------------
BOOL
CPage::_OnInitServerOrShare(
IN HWND hwnd,
IN LPNETRESOURCE pnr,
IN BOOL fServer // TRUE == server, FALSE == share
)
{
CHECK_SIG(CPage);
appAssert(NULL != pnr);
CWaitCursor wait;
NET_API_STATUS err;
LPTSTR pszRealServerName = pnr->lpRemoteName;
appAssert(NULL != pszRealServerName);
// Figure out server name without UNC prefix
if (pszRealServerName[0] == TEXT('\\') && pszRealServerName[1] == TEXT('\\'))
{
pszRealServerName += 2;
}
if (!fServer)
{
// Get share name
LPTSTR pszShareName = wcschr(pszRealServerName, TEXT('\\'));
appAssert(NULL != pszShareName);
*pszShareName++ = TEXT('\0'); // NOTE: NULL-terminating server name
SetDlgItemText(hwnd, IDC_SHARE, pszShareName);
}
SetDlgItemText(hwnd, IDC_SERVER, pszRealServerName);
// Get server information
PSERVER_INFO_101 pServerInfo = NULL;
err = NetServerGetInfo(pnr->lpRemoteName, 101, (LPBYTE*)&pServerInfo);
if (NERR_Success != err)
{
MyErrorDialog(hwnd, MessageFromError(err), pszRealServerName);
return TRUE;
}
// NOTE: I now have a pServerInfo to delete
appAssert(NULL != pServerInfo);
if (fServer)
{
if (NULL != pServerInfo->sv101_comment)
{
SetDlgItemText(hwnd, IDC_COMMENT, pServerInfo->sv101_comment);
}
}
_SetServerType(hwnd, IDC_TYPE, pServerInfo);
DWORD svtype = pServerInfo->sv101_type; // save type for later use
NetApiBufferFree(pServerInfo); // get rid of it so we don't have to worry about it
UINT idLogonType = IDS_LOGON_WORKGROUP;
if (svtype & SV_TYPE_NT)
{
// It's an NT server. See if it is in a workgroup or a domain.
LPWSTR pszDomainName;
BOOL bIsWorkgroupName;
err = MyNetpGetDomainNameEx(pnr->lpRemoteName, &pszDomainName, &bIsWorkgroupName);
if (err != NERR_Success)
{
MyErrorDialog(hwnd, MessageFromError(err), pszRealServerName);
return TRUE;
}
SetDlgItemText(hwnd, IDC_WORKGROUP_OR_DOMAIN_NAME, pszDomainName);
NetApiBufferFree(pszDomainName);
if (!bIsWorkgroupName)
{
idLogonType = IDS_LOGON_DOMAIN;
}
}
else
{
// It's not an NT server, so assume it's a workgroup.
PWKSTA_INFO_100 pWorkstationInfo = NULL;
err = NetWkstaGetInfo(pnr->lpRemoteName, 100, (LPBYTE*)&pWorkstationInfo);
if (NERR_Success != err)
{
MyErrorDialog(hwnd, MessageFromError(err), pszRealServerName);
return TRUE;
}
appAssert(NULL != pWorkstationInfo);
if (NULL != pWorkstationInfo->wki100_langroup)
{
SetDlgItemText(hwnd, IDC_WORKGROUP_OR_DOMAIN_NAME, pWorkstationInfo->wki100_langroup);
}
NetApiBufferFree(pWorkstationInfo);
}
WCHAR szLogonType[80];
LoadString(g_hInstance, idLogonType, szLogonType, ARRAYLEN(szLogonType));
SetDlgItemText(hwnd, IDC_WORKGROUP_OR_DOMAIN, szLogonType);
return TRUE;
}
//+-------------------------------------------------------------------------
//
// Method: CPage::_OnNotify, private
//
// Synopsis: WM_NOTIFY handler
//
//--------------------------------------------------------------------------
BOOL
CPage::_OnNotify(
IN HWND hwnd,
IN int idCtrl,
IN LPNMHDR phdr
)
{
CHECK_SIG(CPage);
switch (phdr->code)
{
case PSN_APPLY:
case PSN_RESET: // cancel
SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); // go away
return TRUE;
case PSN_KILLACTIVE: // change to another page
SetWindowLong(hwnd, DWL_MSGRESULT, PSNRET_NOERROR);
return FALSE;
case PSN_SETACTIVE:
case PSN_QUERYCANCEL:
return FALSE;
} // end switch (phdr->code)
return FALSE;
}
//+-------------------------------------------------------------------------
//
// Method: CPage::_SetServerType, private
//
// Synopsis: Sets a server type control
//
//--------------------------------------------------------------------------
VOID
CPage::_SetServerType(
HWND hwnd,
int idControl,
PSERVER_INFO_101 pinfo
)
{
UINT idType, idRole;
HRESULT msgFormat;
//
// Determine the server's type (NT, LM, etc) and role.
//
DWORD type = pinfo->sv101_type;
if (type & SV_TYPE_NT)
{
idType = IDS_SERVER_TYPE_WINNT;
}
else
if (type & SV_TYPE_WINDOWS)
{
idType = IDS_SERVER_TYPE_WINDOWS95;
}
else
if (type & SV_TYPE_WFW)
{
idType = IDS_SERVER_TYPE_WFW;
}
else
{
idType = IDS_SERVER_TYPE_LANMAN;
}
if (type & SV_TYPE_DOMAIN_CTRL)
{
idRole = IDS_ROLE_PRIMARY;
}
else
if (type & SV_TYPE_DOMAIN_BAKCTRL)
{
idRole = IDS_ROLE_BACKUP;
}
else
if (type & SV_TYPE_SERVER_NT)
{
idRole = IDS_ROLE_SERVER;
}
else
{
idRole = IDS_ROLE_WKSTA;
}
UINT verMajor = pinfo->sv101_version_major & MAJOR_VERSION_MASK;
UINT verMinor = pinfo->sv101_version_minor;
msgFormat = (verMajor < MIN_DISPLAY_VER || (type & SV_TYPE_WINDOWS))
? MSG_TYPE_FORMAT_UNKNOWN
: MSG_TYPE_FORMAT
;
WCHAR szType[80];
LoadString(g_hInstance, idType, szType, ARRAYLEN(szType));
WCHAR szRole[80];
LoadString(g_hInstance, idRole, szRole, ARRAYLEN(szRole));
DWORD aInserts[4];
aInserts[0] = (DWORD)szType;
aInserts[1] = verMajor;
aInserts[2] = verMinor;
aInserts[3] = (DWORD)szRole;
WCHAR szBuffer[256];
DWORD dwReturn = FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE
| FORMAT_MESSAGE_ARGUMENT_ARRAY,
g_hInstance,
msgFormat,
LANG_SYSTEM_DEFAULT,
szBuffer,
ARRAYLEN(szBuffer),
(va_list*)aInserts);
if (0 == dwReturn) // couldn't find message
{
appDebugOut((DEB_IERROR,
"FormatMessage failed, 0x%08lx\n",
GetLastError()));
szBuffer[0] = TEXT('\0');
}
SetDlgItemText(hwnd, idControl, szBuffer);
}