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

386 lines
11 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000-2001.
//
// File: ViewOIDDlg.cpp
//
// Contents: Implementation of CViewOIDDlg
//
//----------------------------------------------------------------------------
// ViewOIDDlg.cpp : implementation file
//
#include "stdafx.h"
#include "certtmpl.h"
#include "ViewOIDDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern POLICY_OID_LIST g_policyOIDList;
extern PCWSTR pcszNEWLINE;
/////////////////////////////////////////////////////////////////////////////
// CViewOIDDlg dialog
CViewOIDDlg::CViewOIDDlg(CWnd* pParent /*=NULL*/)
: CHelpDialog(CViewOIDDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CViewOIDDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CViewOIDDlg::DoDataExchange(CDataExchange* pDX)
{
CHelpDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CViewOIDDlg)
DDX_Control(pDX, IDC_OID_LIST, m_oidList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CViewOIDDlg, CHelpDialog)
//{{AFX_MSG_MAP(CViewOIDDlg)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_OID_LIST, OnItemchangedOidList)
ON_BN_CLICKED(IDC_COPY_OID, OnCopyOid)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_OID_LIST, OnColumnclickOidList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CViewOIDDlg message handlers
BOOL CViewOIDDlg::OnInitDialog()
{
CHelpDialog::OnInitDialog();
GetDlgItem (IDC_COPY_OID)->EnableWindow (FALSE);
// Set up list control
int colWidths[NUM_COLS] = {200, 150, 100, 100};
// Set to full-row select
DWORD dwExstyle = m_oidList.GetExtendedStyle ();
m_oidList.SetExtendedStyle (dwExstyle | LVS_EX_FULLROWSELECT);
// Add "Policy Name" column
CString szText;
VERIFY (szText.LoadString (IDS_POLICY_NAME));
VERIFY (m_oidList.InsertColumn (COL_POLICY_NAME, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_POLICY_NAME], COL_POLICY_NAME) != -1);
VERIFY (szText.LoadString (IDS_OID));
VERIFY (m_oidList.InsertColumn (COL_OID, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_OID], COL_OID) != -1);
VERIFY (szText.LoadString (IDS_POLICY_TYPE));
VERIFY (m_oidList.InsertColumn (COL_POLICY_TYPE, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_POLICY_TYPE], COL_POLICY_TYPE) != -1);
VERIFY (szText.LoadString (IDS_CPS_LOCATION));
VERIFY (m_oidList.InsertColumn (COL_CPS_LOCATION, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_CPS_LOCATION], COL_CPS_LOCATION) != -1);
m_oidList.SetColumnWidth (COL_CPS_LOCATION, LVSCW_AUTOSIZE_USEHEADER);
// Fill list
for (POSITION nextPos = g_policyOIDList.GetHeadPosition (); nextPos; )
{
CPolicyOID* pPolicyOID = g_policyOIDList.GetNext (nextPos);
if ( pPolicyOID )
{
if ( FAILED (InsertItemInList (pPolicyOID)) )
break;
}
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
HRESULT CViewOIDDlg::InsertItemInList (CPolicyOID* pPolicyOID)
{
ASSERT (pPolicyOID);
if ( !pPolicyOID )
return E_POINTER;
if ( !pPolicyOID->IsApplicationOID () && !pPolicyOID->IsIssuanceOID () )
return S_OK; // not a failure, but don't add
HRESULT hr = S_OK;
LV_ITEM lvItem;
int iItem = m_oidList.GetItemCount ();
int iResult = 0;
::ZeroMemory (&lvItem, sizeof (lvItem));
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.iItem = iItem;
lvItem.iSubItem = COL_POLICY_NAME;
lvItem.pszText = (PWSTR)(PCWSTR) pPolicyOID->GetDisplayName ();
lvItem.lParam = (LPARAM) pPolicyOID;
iItem = m_oidList.InsertItem (&lvItem);
ASSERT (-1 != iItem);
if ( -1 == iItem )
hr = E_FAIL;
if ( SUCCEEDED (hr) )
{
::ZeroMemory (&lvItem, sizeof (lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iItem;
lvItem.iSubItem = COL_OID;
lvItem.pszText = (PWSTR)(PCWSTR) pPolicyOID->GetOIDW ();
iResult = m_oidList.SetItem (&lvItem);
ASSERT (-1 != iResult);
if ( -1 == iResult )
hr = E_FAIL;
}
if ( SUCCEEDED (hr) )
{
lvItem.iSubItem = COL_POLICY_TYPE;
CString text;
if ( pPolicyOID->IsApplicationOID () )
VERIFY (text.LoadString (IDS_APPLICATION));
else // Is issuance OID
VERIFY (text.LoadString (IDS_ISSUANCE));
lvItem.pszText = (PWSTR)(PCWSTR) text;
iResult = m_oidList.SetItem (&lvItem);
ASSERT (-1 != iResult);
if ( -1 == iResult )
hr = E_FAIL;
}
if ( SUCCEEDED (hr) && pPolicyOID->IsIssuanceOID () )
{
lvItem.iSubItem = COL_CPS_LOCATION;
PWSTR pszCPS = 0;
hr = CAOIDGetProperty(
pPolicyOID->GetOIDW (),
CERT_OID_PROPERTY_CPS,
&pszCPS);
if ( SUCCEEDED (hr) )
{
lvItem.pszText = pszCPS;
iResult = m_oidList.SetItem (&lvItem);
ASSERT (-1 != iResult);
if ( -1 == iResult )
hr = E_FAIL;
CAOIDFreeProperty (pszCPS);
}
else if ( HRESULT_FROM_WIN32 (ERROR_FILE_NOT_FOUND) == hr ||
HRESULT_FROM_WIN32 (ERROR_DS_OBJ_NOT_FOUND) == hr )
{
hr = S_OK;
}
else
{
_TRACE (0, L"CAOIDGetProperty (%s, CERT_OID_PROPERTY_CPS) failed: 0x%x\n",
(PCWSTR) pPolicyOID->GetOIDW (), hr);
hr = S_OK;
}
}
return hr;
}
void CViewOIDDlg::OnItemchangedOidList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
// NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
GetDlgItem (IDC_COPY_OID)->EnableWindow (m_oidList.GetSelectedCount () > 0);
*pResult = 0;
}
void CViewOIDDlg::OnCopyOid()
{
CString szText;
int nCnt = m_oidList.GetItemCount ();
if ( nCnt > 0 && m_oidList.GetSelectedCount () > 0 )
{
for (int nItem = 0; nItem < nCnt; nItem++)
{
if ( LVIS_SELECTED == m_oidList.GetItemState (nItem, LVIS_SELECTED) )
{
if ( !szText.IsEmpty () )
szText += pcszNEWLINE;
szText += m_oidList.GetItemText (nItem, COL_OID);
}
}
}
if ( !szText.IsEmpty () )
{
if ( OpenClipboard () )
{
if ( EmptyClipboard () )
{
size_t nLen = wcslen (szText);
HGLOBAL hglbCopy = GlobalAlloc (GMEM_MOVEABLE,
(nLen + 1) * sizeof (WCHAR));
if ( hglbCopy )
{
PWSTR pszCopy = (PWSTR) GlobalLock (hglbCopy);
if ( pszCopy )
{
wcscpy (pszCopy, szText);
GlobalUnlock(hglbCopy);
// Place the handle on the clipboard.
if ( !SetClipboardData (CF_UNICODETEXT, hglbCopy) )
{
ASSERT (0);
_TRACE (0, L"SetClipboardData () failed: %d\n", GetLastError ());
GlobalFree (hglbCopy);
}
}
else
GlobalFree (hglbCopy);
}
if ( !CloseClipboard () )
{
ASSERT (0);
_TRACE (0, L"CloseClipboard () failed: %d\n", GetLastError ());
}
}
else
{
ASSERT (0);
_TRACE (0, L"EmptyClipboard () failed: %d\n", GetLastError ());
}
}
else
{
ASSERT (0);
_TRACE (0, L"OpenClipboard () failed: %d\n", GetLastError ());
}
}
}
int CALLBACK CViewOIDDlg::fnCompareOIDItems (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int iVal = 0;
if ( lParam1 && lParam2 )
{
CPolicyOID* pPolicyOID1 = (CPolicyOID*) lParam1;
CPolicyOID* pPolicyOID2 = (CPolicyOID*) lParam2;
switch (lParamSort)
{
case COL_POLICY_NAME:
iVal = LocaleStrCmp (pPolicyOID1->GetDisplayName (),
pPolicyOID2->GetDisplayName ());
break;
case COL_OID:
iVal = LocaleStrCmp (pPolicyOID1->GetOIDW (),
pPolicyOID2->GetOIDW ());
break;
case COL_POLICY_TYPE:
{
CString szApplication;
CString szIssuance;
VERIFY (szApplication.LoadString (IDS_APPLICATION));
VERIFY (szIssuance.LoadString (IDS_ISSUANCE));
iVal = LocaleStrCmp (pPolicyOID1->IsApplicationOID () ? szApplication : szIssuance,
pPolicyOID2->IsApplicationOID () ? szApplication : szIssuance);
}
break;
case COL_CPS_LOCATION:
{
CString strItem1;
CString strItem2;
if ( pPolicyOID1->IsIssuanceOID () )
{
PWSTR pszCPS = 0;
if ( SUCCEEDED (CAOIDGetProperty(
pPolicyOID1->GetOIDW (),
CERT_OID_PROPERTY_CPS,
&pszCPS)) )
{
strItem1 = pszCPS;
}
}
if ( pPolicyOID2->IsIssuanceOID () )
{
PWSTR pszCPS = 0;
if ( SUCCEEDED (CAOIDGetProperty(
pPolicyOID2->GetOIDW (),
CERT_OID_PROPERTY_CPS,
&pszCPS)) )
{
strItem2 = pszCPS;
}
}
iVal = LocaleStrCmp (strItem1, strItem2);
}
break;
default:
ASSERT (0);
break;
}
}
return iVal;
}
void CViewOIDDlg::OnColumnclickOidList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if ( pNMListView )
{
m_oidList.SortItems ((PFNLVCOMPARE) fnCompareOIDItems,
(LPARAM) pNMListView->iSubItem);
}
*pResult = 0;
}
void CViewOIDDlg::DoContextHelp (HWND hWndControl)
{
_TRACE(1, L"Entering CViewOIDDlg::DoContextHelp\n");
switch (::GetDlgCtrlID (hWndControl))
{
case IDC_STATIC:
break;
default:
// Display context help for a control
if ( !::WinHelp (
hWndControl,
GetContextHelpFile (),
HELP_WM_HELP,
(DWORD_PTR) g_aHelpIDs_IDD_VIEW_OIDS) )
{
_TRACE (0, L"WinHelp () failed: 0x%x\n", GetLastError ());
}
break;
}
_TRACE(-1, L"Leaving CViewOIDDlg::DoContextHelp\n");
}