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

354 lines
11 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000-2001.
//
// File: TemplateV2SupercedesPropertyPage.cpp
//
// Contents: Implementation of CTemplateV2SupercedesPropertyPage
//
//----------------------------------------------------------------------------
// TemplateV2SupercedesPropertyPage.cpp : implementation file
//
#include "stdafx.h"
#include "certtmpl.h"
#include "TemplateV2SupercedesPropertyPage.h"
#include "CompData.h"
#include "SelectTemplateDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTemplateV2SupercedesPropertyPage property page
CTemplateV2SupercedesPropertyPage::CTemplateV2SupercedesPropertyPage(
CCertTemplate& rCertTemplate,
bool& rbIsDirty,
const CCertTmplComponentData* pCompData)
: CHelpPropertyPage(CTemplateV2SupercedesPropertyPage::IDD),
m_rCertTemplate (rCertTemplate),
m_pGlobalTemplateNameList (0),
m_bGlobalListCreatedByDialog (false),
m_rbIsDirty (rbIsDirty),
m_pCompData (pCompData)
{
//{{AFX_DATA_INIT(CTemplateV2SupercedesPropertyPage)
//}}AFX_DATA_INIT
m_rCertTemplate.AddRef ();
if ( m_pCompData )
m_pGlobalTemplateNameList = &(m_pCompData->m_globalTemplateNameList);
if ( !m_pGlobalTemplateNameList )
{
m_bGlobalListCreatedByDialog = true;
m_pGlobalTemplateNameList = new CStringList;
if ( m_pGlobalTemplateNameList )
{
}
}
}
CTemplateV2SupercedesPropertyPage::~CTemplateV2SupercedesPropertyPage()
{
m_rCertTemplate.Release ();
if ( m_bGlobalListCreatedByDialog )
delete m_pGlobalTemplateNameList;
}
void CTemplateV2SupercedesPropertyPage::DoDataExchange(CDataExchange* pDX)
{
CHelpPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTemplateV2SupercedesPropertyPage)
DDX_Control(pDX, IDC_SUPERCEDED_TEMPLATES_LIST, m_templateList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTemplateV2SupercedesPropertyPage, CHelpPropertyPage)
//{{AFX_MSG_MAP(CTemplateV2SupercedesPropertyPage)
ON_BN_CLICKED(IDC_ADD_SUPERCEDED_TEMPLATE, OnAddSupercededTemplate)
ON_BN_CLICKED(IDC_REMOVE_SUPERCEDED_TEMPLATE, OnRemoveSupercededTemplate)
ON_NOTIFY(LVN_DELETEITEM, IDC_SUPERCEDED_TEMPLATES_LIST, OnDeleteitemSupercededTemplatesList)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_SUPERCEDED_TEMPLATES_LIST, OnItemchangedSupercededTemplatesList)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTemplateV2SupercedesPropertyPage message handlers
void CTemplateV2SupercedesPropertyPage::OnAddSupercededTemplate()
{
CStringList supercededTemplateNames;
// Add all the currently superceded templates. These will not be displayed
// in the popup dialog
int nCnt = m_templateList.GetItemCount ();
for (int nIndex = 0; nIndex < nCnt; nIndex++)
{
CString* pszTemplateName = (CString*) m_templateList.GetItemData (nIndex);
if ( pszTemplateName )
supercededTemplateNames.AddTail (*pszTemplateName);
}
// Also add this template name. Templates can't supercede themselves.
supercededTemplateNames.AddTail (m_rCertTemplate.GetTemplateName ());
if ( m_pGlobalTemplateNameList )
{
CSelectTemplateDlg dlg (this, m_pCompData,
supercededTemplateNames);
CThemeContextActivator activator;
if ( IDOK == dlg.DoModal () )
{
POSITION pos = dlg.m_returnedTemplates.GetHeadPosition ();
CString szTemplateName;
for (; pos; )
{
szTemplateName = dlg.m_returnedTemplates.GetNext (pos);
HRESULT hr = m_rCertTemplate.ModifySupercededTemplateList (
szTemplateName, true);
if ( SUCCEEDED (hr) )
{
hr = AddItem (szTemplateName);
SetModified ();
m_rbIsDirty = true;
}
}
}
}
}
void CTemplateV2SupercedesPropertyPage::OnRemoveSupercededTemplate()
{
int nCnt = m_templateList.GetItemCount ();
ASSERT (nCnt >= 1);
UINT flag = 0;
while (--nCnt >= 0)
{
flag = ListView_GetItemState (m_templateList.m_hWnd, nCnt, LVIS_SELECTED);
if ( flag & LVNI_SELECTED )
{
CString* pszTemplateName = (CString*) m_templateList.GetItemData (nCnt);
if ( pszTemplateName )
{
HRESULT hr = m_rCertTemplate.ModifySupercededTemplateList (
*pszTemplateName, false);
if ( SUCCEEDED (hr) )
{
m_templateList.DeleteItem (nCnt);
SetModified ();
m_rbIsDirty = true;
}
}
}
}
}
void CTemplateV2SupercedesPropertyPage::EnableControls()
{
if ( m_rCertTemplate.ReadOnly () )
{
GetDlgItem (IDC_SUPERCEDED_TEMPLATES_LIST)->EnableWindow (FALSE);
GetDlgItem (IDC_REMOVE_SUPERCEDED_TEMPLATE)->EnableWindow (FALSE);
GetDlgItem (IDC_ADD_SUPERCEDED_TEMPLATE)->EnableWindow (FALSE);
}
else
{
BOOL bEnable = (m_templateList.GetSelectedCount () > 0);
GetDlgItem(IDC_REMOVE_SUPERCEDED_TEMPLATE)->EnableWindow (bEnable);
}
}
BOOL CTemplateV2SupercedesPropertyPage::OnInitDialog()
{
CHelpPropertyPage::OnInitDialog ();
// Set up list controls
COLORREF cr = RGB (255, 0, 255);
CThemeContextActivator activator;
VERIFY (m_imageListNormal.Create (IDB_TEMPLATES, 32, 0, cr));
VERIFY (m_imageListSmall.Create (IDB_TEMPLATES, 16, 0, cr));
m_templateList.SetImageList (CImageList::FromHandle (m_imageListSmall), LVSIL_SMALL);
m_templateList.SetImageList (CImageList::FromHandle (m_imageListNormal), LVSIL_NORMAL);
// Set to full-row select
DWORD dwExstyle = m_templateList.GetExtendedStyle ();
m_templateList.SetExtendedStyle (dwExstyle | LVS_EX_FULLROWSELECT);
int colWidths[NUM_COLS] = {200, 200};
// Add "Certificate Extension" column
CString szText;
VERIFY (szText.LoadString (IDS_CERTIFICATE_TEMPLATES));
VERIFY (m_templateList.InsertColumn (COL_CERT_TEMPLATE, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_CERT_TEMPLATE], COL_CERT_TEMPLATE) != -1);
VERIFY (szText.LoadString (IDS_COLUMN_SUPPORTED_CAS));
VERIFY (m_templateList.InsertColumn (COL_CERT_VERSION, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_CERT_VERSION], COL_CERT_VERSION) != -1);
m_templateList.SetColumnWidth (COL_CERT_VERSION, LVSCW_AUTOSIZE_USEHEADER);
// Initialize superceded list
int nTemplateIndex = 0;
CString szTemplateName;
while ( SUCCEEDED ( m_rCertTemplate.GetSupercededTemplate (nTemplateIndex,
szTemplateName)) )
{
VERIFY (SUCCEEDED (AddItem (szTemplateName)));
nTemplateIndex++;
}
EnableControls ();
return TRUE;
}
void CTemplateV2SupercedesPropertyPage::OnDeleteitemSupercededTemplatesList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CString* pszTemplateName = (CString*) m_templateList.GetItemData (pNMListView->iItem);
if ( pszTemplateName )
delete pszTemplateName;
*pResult = 0;
}
HRESULT CTemplateV2SupercedesPropertyPage::AddItem(const CString &szTemplateName)
{
HCERTTYPE hCertType = 0;
HRESULT hr = CAFindCertTypeByName (szTemplateName,
NULL,
CT_ENUM_MACHINE_TYPES | CT_ENUM_USER_TYPES | CT_FLAG_NO_CACHE_LOOKUP,
&hCertType);
_ASSERT (SUCCEEDED (hr));
if ( SUCCEEDED (hr) )
{
PWSTR* rgwszProp = 0;
hr = CAGetCertTypePropertyEx (hCertType,
CERTTYPE_PROP_FRIENDLY_NAME, &rgwszProp);
if ( SUCCEEDED (hr) )
{
DWORD dwVersion = 0;
hr = CAGetCertTypePropertyEx (hCertType,
CERTTYPE_PROP_SCHEMA_VERSION,
&dwVersion);
if ( SUCCEEDED (hr) )
{
LV_ITEM lvItem;
int iItem = m_templateList.GetItemCount ();
int iResult = 0;
::ZeroMemory (&lvItem, sizeof (lvItem));
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvItem.iItem = iItem;
lvItem.iSubItem = COL_CERT_TEMPLATE;
lvItem.pszText = rgwszProp[0];
if ( 1 == dwVersion )
lvItem.iImage = 0; // version is 1
else
lvItem.iImage = 1; // version is 2
lvItem.lParam = (LPARAM) new CString (szTemplateName);
iItem = m_templateList.InsertItem (&lvItem);
ASSERT (-1 != iItem);
if ( -1 != iItem )
{
::ZeroMemory (&lvItem, sizeof (lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iItem;
lvItem.iSubItem = COL_CERT_VERSION;
CString text;
if ( 1 == dwVersion )
VERIFY (text.LoadString (IDS_WINDOWS_2000_AND_LATER));
else
VERIFY (text.LoadString (IDS_WINDOWS_2002_AND_LATER));
lvItem.pszText = (PWSTR)(PCWSTR) text;
iResult = m_templateList.SetItem (&lvItem);
ASSERT (-1 != iResult);
if ( -1 == iResult )
hr = E_FAIL;
}
else
hr = E_FAIL;
}
else
{
_TRACE (0, L"CAGetCertTypePropertyEx (CERTTYPE_PROP_SCHEMA_VERSION) failed: 0x%x\n", hr);
}
CAFreeCertTypeProperty (hCertType, rgwszProp);
}
else
{
_TRACE (0, L"CAGetCertTypePropertyEx (CERTTYPE_PROP_FRIENDLY_NAME) failed: 0x%x\n", hr);
}
hr = CACloseCertType (hCertType);
_ASSERT (SUCCEEDED (hr));
if ( !SUCCEEDED (hr) )
{
_TRACE (0, L"CACloseCertType (%s) failed: 0x%x\n", hr);
}
}
else
{
_TRACE (0, L"CAFindCertTypeByName (%s) failed: 0x%x\n",
(PCWSTR) szTemplateName, hr);
}
return hr;
}
void CTemplateV2SupercedesPropertyPage::OnItemchangedSupercededTemplatesList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
EnableControls ();
*pResult = 0;
}
void CTemplateV2SupercedesPropertyPage::DoContextHelp (HWND hWndControl)
{
_TRACE(1, L"Entering CTemplateV2SupercedesPropertyPage::DoContextHelp\n");
switch (::GetDlgCtrlID (hWndControl))
{
case IDC_SUPERCEDES_LABEL:
case IDC_STATIC:
break;
default:
// Display context help for a control
if ( !::WinHelp (
hWndControl,
GetContextHelpFile (),
HELP_WM_HELP,
(DWORD_PTR) g_aHelpIDs_IDD_TEMPLATE_V2_SUPERCEDES) )
{
_TRACE(0, L"WinHelp () failed: 0x%x\n", GetLastError ());
}
break;
}
_TRACE(-1, L"Leaving CTemplateV2SupercedesPropertyPage::DoContextHelp\n");
}
void CTemplateV2SupercedesPropertyPage::OnDestroy()
{
CHelpPropertyPage::OnDestroy();
m_imageListNormal.Destroy ();
m_imageListSmall.Destroy ();
}