//+------------------------------------------------------------------------- // // 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); }