588 lines
14 KiB
C++
588 lines
14 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);
|
||
|
}
|