windows-nt/Source/XPSP1/NT/admin/snapin/certmgr/policyprecedencepropertypage.cpp
2020-09-26 16:20:57 +08:00

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");
}