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