windows-nt/Source/XPSP1/NT/ds/security/gina/snapins/gpedit/compspp.cpp

356 lines
11 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1998.
//
// File: CompsPP.cpp
//
// Contents: Implementation for the "computers" property page of the GPO
// browser.
//
// Classes: CCompsPP
//
// History: 04-30-1998 stevebl Created
//
//---------------------------------------------------------------------------
#include "main.h"
#include "CompsPP.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Help ids
//
DWORD aBrowserComputerHelpIds[] =
{
IDC_RADIO1, IDH_BROWSER_LOCALCOMPUTER,
IDC_RADIO2, IDH_BROWSER_REMOTECOMPUTER,
IDC_EDIT1, IDH_BROWSER_REMOTECOMPUTER,
IDC_BUTTON1, IDH_BROWSER_BROWSE,
0, 0
};
CCompsPP::CCompsPP()
{
m_szComputer = _T("");
m_iSelection = 0;
m_ppActive = NULL;
m_pGBI;
}
//+--------------------------------------------------------------------------
//
// Member: CCompsPP::Initialize
//
// Synopsis: Initializes the property page.
//
// Arguments: [dwPageType] - used to identify which page this is. (See
// notes.)
// [pGBI] - pointer to the browse info structure passed
// by caller
// [ppActive] - pointer to a common variable that remembers
// which object was last given the focus.
// Needed because only the page with the focus
// is allowed to return data to the caller when
// the property sheet is dismissed.
//
// Returns: Handle to the newly created property page.
//
// Modifies:
//
// Derivation:
//
// History: 04-30-1998 stevebl Created
//
// Notes: This class implements the PAGETYPE_COMPUTERS page. The
// other pages are all implemented by CBrowserPP:
//
// PAGETYPE_DOMAINS - GPO's linked to domains
// PAGETYPE_SITES - GPO's linked to sites
// PAGETYPE_ALL - All GPO's in a selected
//
//---------------------------------------------------------------------------
HPROPSHEETPAGE CCompsPP::Initialize(DWORD dwPageType, LPGPOBROWSEINFO pGBI, void ** ppActive)
{
m_ppActive = ppActive;
m_dwPageType = dwPageType;
m_pGBI = pGBI;
PROPSHEETPAGE psp;
memset(&psp, 0, sizeof(psp));
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE_COMPUTERS);
return CreatePropertySheetPage(&psp);
}
CCompsPP::~CCompsPP()
{
}
#include "objsel.h"
//+--------------------------------------------------------------------------
//
// Member: CCompsPP::OnBrowseComputers
//
// Synopsis: browses for computers in the entire directory
//
// Arguments: [in] hwndDlg : the handle to the window to which the computer
// selection dialog is made modal.
//
// Returns: nothing
//
// History: 1/8/1999 RahulTh created
//
// Notes: in case of errors, this function bails out silently
//
//---------------------------------------------------------------------------
void CCompsPP::OnBrowseComputers (HWND hwndDlg)
{
HRESULT hr;
IDsObjectPicker * pDsObjectPicker = NULL;
const ULONG cbNumScopes = 4; //make sure this number matches the number of scopes initialized
DSOP_SCOPE_INIT_INFO ascopes [cbNumScopes];
DSOP_INIT_INFO InitInfo;
IDataObject * pdo = NULL;
STGMEDIUM stgmedium = {
TYMED_HGLOBAL,
NULL
};
UINT cf = 0;
FORMATETC formatetc = {
(CLIPFORMAT)cf,
NULL,
DVASPECT_CONTENT,
-1,
TYMED_HGLOBAL
};
BOOL bAllocatedStgMedium = FALSE;
PDS_SELECTION_LIST pDsSelList = NULL;
PDS_SELECTION pDsSelection = NULL;
PCWSTR lpAttributes [] = {L"dNSHostName", 0};
VARIANT * pVarAttributes;
hr = CoInitialize (NULL);
if (FAILED(hr))
goto BrowseComps_Cleanup;
hr = CoCreateInstance (CLSID_DsObjectPicker,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDsObjectPicker,
(void **) & pDsObjectPicker
);
if (FAILED(hr))
goto BrowseComps_Cleanup;
//Initialize the scopes.
ZeroMemory (ascopes, cbNumScopes * sizeof (DSOP_SCOPE_INIT_INFO));
ascopes[0].cbSize = ascopes[1].cbSize = ascopes[2].cbSize = ascopes[3].cbSize
= sizeof (DSOP_SCOPE_INIT_INFO);
ascopes[0].flType = DSOP_SCOPE_TYPE_GLOBAL_CATALOG;
ascopes[0].flScope = DSOP_SCOPE_FLAG_STARTING_SCOPE;
ascopes[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS;
ascopes[1].flType = DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN;
ascopes[1].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS;
ascopes[2].flType = DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN |
DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN |
DSOP_SCOPE_TYPE_WORKGROUP;
ascopes[2].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS;
ascopes[2].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS;
ascopes[3].flType = DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE |
DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE;
ascopes[3].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS;
ascopes[3].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS;
//populate the InitInfo structure that will be used to initialize the
//object picker
ZeroMemory (&InitInfo, sizeof (DSOP_INIT_INFO));
InitInfo.cbSize = sizeof (DSOP_INIT_INFO);
InitInfo.cDsScopeInfos = cbNumScopes;
InitInfo.aDsScopeInfos = ascopes;
InitInfo.apwzAttributeNames = lpAttributes;
InitInfo.cAttributesToFetch = 1;
hr = pDsObjectPicker->Initialize (&InitInfo);
if (FAILED(hr))
goto BrowseComps_Cleanup;
hr = pDsObjectPicker->InvokeDialog (hwndDlg, &pdo);
//if the computer selection dialog cannot be invoked or if the user
//hits cancel, bail out.
if (FAILED(hr) || S_FALSE == hr)
goto BrowseComps_Cleanup;
//if we are here, the user chose, OK, so find out what group was chosen
cf = RegisterClipboardFormat (CFSTR_DSOP_DS_SELECTION_LIST);
if (0 == cf)
goto BrowseComps_Cleanup;
//set the clipboard format for the FORMATETC structure
formatetc.cfFormat = (CLIPFORMAT)cf;
hr = pdo->GetData (&formatetc, &stgmedium);
if (FAILED (hr))
goto BrowseComps_Cleanup;
bAllocatedStgMedium = TRUE;
pDsSelList = (PDS_SELECTION_LIST) GlobalLock (stgmedium.hGlobal);
//
// Since the dialog was in single-select mode and the user was able
// to hit OK, there should be exactly one selection.
//
ASSERT (1 == pDsSelList->cItems);
pDsSelection = &(pDsSelList->aDsSelection[0]);
pVarAttributes = pDsSelection->pvarFetchedAttributes;
if (pVarAttributes->vt != VT_EMPTY)
{
//
// Put the machine name in the edit control
//
SetWindowText (GetDlgItem (hwndDlg, IDC_EDIT1), pVarAttributes->bstrVal);
}
else
{
//
// Put the machine name in the edit control
//
SetWindowText (GetDlgItem (hwndDlg, IDC_EDIT1), pDsSelection->pwzName);
}
BrowseComps_Cleanup:
if (pDsSelList)
GlobalUnlock (pDsSelList);
if (bAllocatedStgMedium)
ReleaseStgMedium (&stgmedium);
if (pdo)
pdo->Release();
if (pDsObjectPicker)
pDsObjectPicker->Release();
return;
}
BOOL CCompsPP::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
// Initialize dialog data
SendMessage(GetDlgItem(hwndDlg, IDC_RADIO1), BM_SETCHECK, TRUE, 0);
EnableWindow (GetDlgItem(GetParent(hwndDlg), IDOK), TRUE);
}
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR) lParam;
switch (pnmh->code)
{
case PSN_APPLY:
{
if (*m_ppActive == this)
{
if (SendMessage(GetDlgItem(hwndDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
{
// local computer is selected
m_pGBI->gpoType = GPOTypeLocal;
}
else
{
// other computer is selected
m_pGBI->gpoType = GPOTypeRemote;
int cch = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EDIT1));
LPWSTR sz = new WCHAR[cch + 1];
if (sz)
{
GetWindowText(GetDlgItem(hwndDlg, IDC_EDIT1), sz, cch+1);
wcsncpy(m_pGBI->lpName, sz, m_pGBI->dwNameSize);
delete [] sz;
}
}
}
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, FALSE); // accept changes
}
break;
case PSN_SETACTIVE:
*m_ppActive = this;
EnableWindow (GetDlgItem(GetParent(hwndDlg), IDOK), TRUE);
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, 0);
break;
default:
break;
}
}
break;
case WM_COMMAND:
if (IDC_BUTTON1 == LOWORD(wParam))
{
OnBrowseComputers (hwndDlg);
return TRUE;
}
if (IDC_RADIO1 == LOWORD(wParam))
{
EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON1), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), FALSE);
return TRUE;
}
if (IDC_RADIO2 == LOWORD(wParam))
{
EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON1), TRUE);
EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT1), TRUE);
SetFocus (GetDlgItem(hwndDlg, IDC_EDIT1));
return TRUE;
}
break;
case WM_ACTIVATE:
if (WA_INACTIVE != LOWORD(wParam))
{
*m_ppActive = this;
}
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aBrowserComputerHelpIds);
break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aBrowserComputerHelpIds);
return (TRUE);
default:
break;
}
return (FALSE);
}