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