Windows2000/private/windows/shell/lmui/netobjs/pages.cxx
2020-09-30 17:12:32 +02:00

581 lines
12 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::DlgProcPage, static public
// Synopsis: Dialog Procedure for all CPage
INT_PTR 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 = new CPage(hwnd, psp->lParam);
if (NULL != pThis)
{
if (FAILED(pThis->InitInstance()))
{
delete pThis;
pThis = NULL;
}
}
SetWindowLongPtr(hwnd,GWLP_USERDATA,(LPARAM)pThis);
}
else
{
pThis = (CPage*) GetWindowLongPtr(hwnd,GWLP_USERDATA);
}
if (pThis != NULL)
{
return pThis->_PageProc(hwnd,msg,wParam,lParam);
}
else
{
return FALSE;
}
}
// Method: CPage::CPage, public
// Synopsis: Constructor
CPage::CPage(
IN HWND hwndPage,
IN LPARAM lParam
)
:
_hwndPage(hwndPage),
_pNetObj( (CNetObj*)lParam )
{
INIT_SIG(CPage);
}
// Method: CPage::~CPage, public
// Synopsis: Destructor
CPage::~CPage()
{
CHECK_SIG(CPage);
}
// 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
INT_PTR
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:
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_PTR)aHelpIds);
}
break;
}
case WM_CONTEXTMENU:
{
WCHAR szHelp[50];
LoadString(g_hInstance, IDS_HELPFILENAME, szHelp, ARRAYLEN(szHelp));
WinHelp(
(HWND)wParam,
szHelp,
HELP_CONTEXTMENU,
(DWORD_PTR)aHelpIds);
break;
}
case WM_DESTROY:
if (NULL != _pNetObj)
{
_pNetObj->Release();
}
return TRUE;
case WM_NCDESTROY:
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)NULL);
delete this; // do this LAST!
return TRUE;
} // 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
SetWindowLongPtr(hwnd, DWLP_MSGRESULT, FALSE); // go away
return TRUE;
case PSN_KILLACTIVE: // change to another page
SetWindowLongPtr(hwnd, DWLP_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
)
{
// Determine the server's type (NT, LM, etc) and role.
DWORD type = pinfo->sv101_type;
UINT verMajor = pinfo->sv101_version_major & MAJOR_VERSION_MASK;
UINT verMinor = pinfo->sv101_version_minor;
UINT idType = IDS_SERVER_TYPE_LANMAN;
if (type & SV_TYPE_NT)
{
if (verMajor <= 4)
idType = IDS_SERVER_TYPE_WINNT;
else if (verMajor == 5 && verMinor == 0)
idType = IDS_SERVER_TYPE_WIN2K;
else
idType = IDS_SERVER_TYPE_POSTWIN2K;
}
else
if (type & SV_TYPE_WINDOWS)
{
idType = IDS_SERVER_TYPE_WINDOWS95;
}
else
if (type & SV_TYPE_WFW)
{
idType = IDS_SERVER_TYPE_WFW;
}
UINT idRole = IDS_ROLE_PROFESSIONAL;
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
if (verMajor <= 4)
{
idRole = IDS_ROLE_WKSTA;
}
HRESULT msgFormat = MSG_TYPE_FORMAT;
if ( verMajor < MIN_DISPLAY_VER || (type & SV_TYPE_WINDOWS) || (verMajor >= 5))
{
msgFormat = MSG_TYPE_FORMAT_UNKNOWN;
}
WCHAR szType[80];
LoadString(g_hInstance, idType, szType, ARRAYLEN(szType));
WCHAR szRole[80];
LoadString(g_hInstance, idRole, szRole, ARRAYLEN(szRole));
DWORD_PTR aInserts[4];
aInserts[0] = (DWORD_PTR)szType;
aInserts[1] = verMajor;
aInserts[2] = verMinor;
aInserts[3] = (DWORD_PTR)szRole;
WCHAR szBuffer[256];
DWORD dwReturn = FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
g_hInstance,
msgFormat,
LANG_USER_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);
}