234 lines
7.4 KiB
C++
234 lines
7.4 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
/////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2000-2001.
|
||
|
//
|
||
|
// File: PolicyPrecedencePropertyPage.cpp
|
||
|
//
|
||
|
// Contents: Implementation of PolicyPrecedencePropertyPage
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
// PolicyPrecedencePropertyPage.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include <gpedit.h>
|
||
|
#include "compdata.h"
|
||
|
#include "PolicyPrecedencePropertyPage.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
enum {
|
||
|
COL_GPO_NAME = 0,
|
||
|
COL_SETTING,
|
||
|
NUM_COLS
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CPolicyPrecedencePropertyPage property page
|
||
|
|
||
|
CPolicyPrecedencePropertyPage::CPolicyPrecedencePropertyPage(
|
||
|
const CCertMgrComponentData* pCompData,
|
||
|
const CString& szRegPath,
|
||
|
PCWSTR pszValueName,
|
||
|
bool bIsComputer)
|
||
|
: CHelpPropertyPage(CPolicyPrecedencePropertyPage::IDD)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CPolicyPrecedencePropertyPage)
|
||
|
// NOTE: the ClassWizard will add member initialization here
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
const CRSOPObjectArray* pObjectArray = bIsComputer ?
|
||
|
pCompData->GetRSOPObjectArrayComputer () : pCompData->GetRSOPObjectArrayUser ();
|
||
|
int nIndex = 0;
|
||
|
// NOTE: rsop object array is sorted first by registry key, then by precedence
|
||
|
INT_PTR nUpperBound = pObjectArray->GetUpperBound ();
|
||
|
bool bFound = false;
|
||
|
size_t nLenRegPath = wcslen (szRegPath);
|
||
|
UINT nLastPrecedenceFound = 0;
|
||
|
|
||
|
while ( nUpperBound >= nIndex )
|
||
|
{
|
||
|
CRSOPObject* pObject = pObjectArray->GetAt (nIndex);
|
||
|
if ( pObject )
|
||
|
{
|
||
|
// Consider only entries from this store
|
||
|
if ( !_wcsnicmp (szRegPath, pObject->GetRegistryKey (), nLenRegPath) )
|
||
|
{
|
||
|
// If the value is present, check for that, too
|
||
|
if ( pszValueName )
|
||
|
{
|
||
|
if ( !wcscmp (STR_BLOB, pszValueName) )
|
||
|
{
|
||
|
// If not equal to "Blob" or "Blob0", then continue
|
||
|
if ( wcscmp (STR_BLOB, pObject->GetValueName ()) &&
|
||
|
wcscmp (STR_BLOB0, pObject->GetValueName ()) )
|
||
|
{
|
||
|
nIndex++;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
else if ( wcscmp (pszValueName, pObject->GetValueName ()) ) // not equal
|
||
|
{
|
||
|
nIndex++;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bFound = true;
|
||
|
// While we are only interested, for example, in the Root store,
|
||
|
// there is no object ending in "Root", so we just want to get
|
||
|
// any object from the root store and to find, essentially, how
|
||
|
// many policies we're dealing with. So get one object from
|
||
|
// each precedence level.
|
||
|
if ( pObject->GetPrecedence () > nLastPrecedenceFound )
|
||
|
{
|
||
|
nLastPrecedenceFound = pObject->GetPrecedence ();
|
||
|
|
||
|
// If there is a value, we want that, otherwise we only want the key
|
||
|
if ( pszValueName || pObject->GetValueName ().IsEmpty () )
|
||
|
{
|
||
|
CRSOPObject* pNewObject = new CRSOPObject (*pObject);
|
||
|
if ( pNewObject )
|
||
|
m_rsopObjectArray.Add (pNewObject);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if ( bFound )
|
||
|
{
|
||
|
// Since the list is sorted, and we've already found the
|
||
|
// desired RSOP objects and no longer are finding them,
|
||
|
// there aren't any more. We can optimize and break here.
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
break;
|
||
|
|
||
|
nIndex++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CPolicyPrecedencePropertyPage::~CPolicyPrecedencePropertyPage()
|
||
|
{
|
||
|
m_rsopObjectArray.RemoveAll ();
|
||
|
}
|
||
|
|
||
|
void CPolicyPrecedencePropertyPage::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CHelpPropertyPage::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CPolicyPrecedencePropertyPage)
|
||
|
DDX_Control(pDX, IDC_POLICY_PRECEDENCE, m_precedenceTable);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CPolicyPrecedencePropertyPage, CHelpPropertyPage)
|
||
|
//{{AFX_MSG_MAP(CPolicyPrecedencePropertyPage)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CPolicyPrecedencePropertyPage message handlers
|
||
|
|
||
|
BOOL CPolicyPrecedencePropertyPage::OnInitDialog()
|
||
|
{
|
||
|
CHelpPropertyPage::OnInitDialog();
|
||
|
|
||
|
int colWidths[NUM_COLS] = {200, 100};
|
||
|
|
||
|
// Add "Policy Name" column
|
||
|
CString szText;
|
||
|
VERIFY (szText.LoadString (IDS_PRECEDENCE_TABLE_GPO_NAME));
|
||
|
VERIFY (m_precedenceTable.InsertColumn (COL_GPO_NAME, (LPCWSTR) szText,
|
||
|
LVCFMT_LEFT, colWidths[COL_GPO_NAME], COL_GPO_NAME) != -1);
|
||
|
|
||
|
// Add "Setting" column
|
||
|
VERIFY (szText.LoadString (IDS_PRECEDENCE_TABLE_SETTING));
|
||
|
VERIFY (m_precedenceTable.InsertColumn (COL_SETTING, (LPCWSTR) szText,
|
||
|
LVCFMT_LEFT, colWidths[COL_SETTING], COL_SETTING) != -1);
|
||
|
|
||
|
// Set to full-row select
|
||
|
DWORD dwExstyle = m_precedenceTable.GetExtendedStyle ();
|
||
|
m_precedenceTable.SetExtendedStyle (dwExstyle | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
|
||
|
|
||
|
int nIndex = 0;
|
||
|
INT_PTR nUpperBound = m_rsopObjectArray.GetUpperBound ();
|
||
|
|
||
|
while ( nUpperBound >= nIndex )
|
||
|
{
|
||
|
CRSOPObject* pObject = m_rsopObjectArray.GetAt (nIndex);
|
||
|
if ( pObject )
|
||
|
{
|
||
|
InsertItemInList (pObject);
|
||
|
}
|
||
|
else
|
||
|
break;
|
||
|
|
||
|
nIndex++;
|
||
|
}
|
||
|
|
||
|
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||
|
}
|
||
|
|
||
|
void CPolicyPrecedencePropertyPage::InsertItemInList(const CRSOPObject * pObject)
|
||
|
{
|
||
|
_TRACE (1, L"CPolicyPrecedencePropertyPage::InsertItemInList\n");
|
||
|
LV_ITEM lvItem;
|
||
|
int iItem = m_precedenceTable.GetItemCount ();
|
||
|
int iResult = 0;
|
||
|
|
||
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
||
|
lvItem.mask = LVIF_TEXT;
|
||
|
lvItem.iItem = iItem;
|
||
|
lvItem.iSubItem = COL_GPO_NAME;
|
||
|
lvItem.pszText = (LPWSTR)(LPCWSTR) pObject->GetPolicyName ();
|
||
|
lvItem.iImage = 0;
|
||
|
lvItem.lParam = 0;
|
||
|
iItem = m_precedenceTable.InsertItem (&lvItem);
|
||
|
ASSERT (-1 != iItem);
|
||
|
if ( -1 == iItem )
|
||
|
return;
|
||
|
|
||
|
CString szEnabled;
|
||
|
CString szDisabled;
|
||
|
|
||
|
VERIFY (szEnabled.LoadString (IDS_ENABLED));
|
||
|
VERIFY (szDisabled.LoadString (IDS_DISABLED));
|
||
|
::ZeroMemory (&lvItem, sizeof (lvItem));
|
||
|
lvItem.mask = LVIF_TEXT;
|
||
|
lvItem.iItem = iItem;
|
||
|
lvItem.iSubItem = COL_SETTING;
|
||
|
lvItem.pszText = (LPWSTR)(LPCWSTR) ((1 == pObject->GetPrecedence ()) ? szEnabled : szDisabled);
|
||
|
iResult = m_precedenceTable.SetItem (&lvItem);
|
||
|
ASSERT (-1 != iResult);
|
||
|
|
||
|
_TRACE (-1, L"Leaving CPolicyPrecedencePropertyPage::InsertItemInList\n");
|
||
|
}
|
||
|
|
||
|
void CPolicyPrecedencePropertyPage::DoContextHelp (HWND hWndControl)
|
||
|
{
|
||
|
_TRACE (1, L"Entering CPolicyPrecedencePropertyPage::DoContextHelp\n");
|
||
|
static const DWORD help_map[] =
|
||
|
{
|
||
|
IDC_POLICY_PRECEDENCE, IDH_POLICY_PRECEDENCE,
|
||
|
0, 0
|
||
|
};
|
||
|
if ( !::WinHelp (
|
||
|
hWndControl,
|
||
|
GetF1HelpFilename(),
|
||
|
HELP_WM_HELP,
|
||
|
(DWORD_PTR) help_map) )
|
||
|
{
|
||
|
_TRACE (0, L"WinHelp () failed: 0x%x\n", GetLastError ());
|
||
|
}
|
||
|
_TRACE (-1, L"Leaving CPolicyPrecedencePropertyPage::DoContextHelp\n");
|
||
|
}
|