Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

389 lines
11 KiB

  1. /////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 2000-2002.
  5. //
  6. // File: ViewOIDDlg.cpp
  7. //
  8. // Contents: Implementation of CViewOIDDlg
  9. //
  10. //----------------------------------------------------------------------------
  11. // ViewOIDDlg.cpp : implementation file
  12. //
  13. #include "stdafx.h"
  14. #include "certtmpl.h"
  15. #include "ViewOIDDlg.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. extern POLICY_OID_LIST g_policyOIDList;
  22. extern PCWSTR pcszNEWLINE;
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CViewOIDDlg dialog
  25. CViewOIDDlg::CViewOIDDlg(CWnd* pParent /*=NULL*/)
  26. : CHelpDialog(CViewOIDDlg::IDD, pParent)
  27. {
  28. //{{AFX_DATA_INIT(CViewOIDDlg)
  29. // NOTE: the ClassWizard will add member initialization here
  30. //}}AFX_DATA_INIT
  31. }
  32. void CViewOIDDlg::DoDataExchange(CDataExchange* pDX)
  33. {
  34. CHelpDialog::DoDataExchange(pDX);
  35. //{{AFX_DATA_MAP(CViewOIDDlg)
  36. DDX_Control(pDX, IDC_OID_LIST, m_oidList);
  37. //}}AFX_DATA_MAP
  38. }
  39. BEGIN_MESSAGE_MAP(CViewOIDDlg, CHelpDialog)
  40. //{{AFX_MSG_MAP(CViewOIDDlg)
  41. ON_NOTIFY(LVN_ITEMCHANGED, IDC_OID_LIST, OnItemchangedOidList)
  42. ON_BN_CLICKED(IDC_COPY_OID, OnCopyOid)
  43. ON_NOTIFY(LVN_COLUMNCLICK, IDC_OID_LIST, OnColumnclickOidList)
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CViewOIDDlg message handlers
  48. BOOL CViewOIDDlg::OnInitDialog()
  49. {
  50. CHelpDialog::OnInitDialog();
  51. GetDlgItem (IDC_COPY_OID)->EnableWindow (FALSE);
  52. // Set up list control
  53. int colWidths[NUM_COLS] = {200, 150, 100, 100};
  54. // Set to full-row select
  55. DWORD dwExstyle = m_oidList.GetExtendedStyle ();
  56. m_oidList.SetExtendedStyle (dwExstyle | LVS_EX_FULLROWSELECT);
  57. // Add "Policy Name" column
  58. CString szText;
  59. VERIFY (szText.LoadString (IDS_POLICY_NAME));
  60. VERIFY (m_oidList.InsertColumn (COL_POLICY_NAME, (LPCWSTR) szText,
  61. LVCFMT_LEFT, colWidths[COL_POLICY_NAME], COL_POLICY_NAME) != -1);
  62. VERIFY (szText.LoadString (IDS_OID));
  63. VERIFY (m_oidList.InsertColumn (COL_OID, (LPCWSTR) szText,
  64. LVCFMT_LEFT, colWidths[COL_OID], COL_OID) != -1);
  65. VERIFY (szText.LoadString (IDS_POLICY_TYPE));
  66. VERIFY (m_oidList.InsertColumn (COL_POLICY_TYPE, (LPCWSTR) szText,
  67. LVCFMT_LEFT, colWidths[COL_POLICY_TYPE], COL_POLICY_TYPE) != -1);
  68. VERIFY (szText.LoadString (IDS_CPS_LOCATION));
  69. VERIFY (m_oidList.InsertColumn (COL_CPS_LOCATION, (LPCWSTR) szText,
  70. LVCFMT_LEFT, colWidths[COL_CPS_LOCATION], COL_CPS_LOCATION) != -1);
  71. m_oidList.SetColumnWidth (COL_CPS_LOCATION, LVSCW_AUTOSIZE_USEHEADER);
  72. // Fill list
  73. for (POSITION nextPos = g_policyOIDList.GetHeadPosition (); nextPos; )
  74. {
  75. CPolicyOID* pPolicyOID = g_policyOIDList.GetNext (nextPos);
  76. if ( pPolicyOID )
  77. {
  78. if ( FAILED (InsertItemInList (pPolicyOID)) )
  79. break;
  80. }
  81. }
  82. return TRUE; // return TRUE unless you set the focus to a control
  83. // EXCEPTION: OCX Property Pages should return FALSE
  84. }
  85. HRESULT CViewOIDDlg::InsertItemInList (CPolicyOID* pPolicyOID)
  86. {
  87. ASSERT (pPolicyOID);
  88. if ( !pPolicyOID )
  89. return E_POINTER;
  90. if ( !pPolicyOID->IsApplicationOID () && !pPolicyOID->IsIssuanceOID () )
  91. return S_OK; // not a failure, but don't add
  92. HRESULT hr = S_OK;
  93. LV_ITEM lvItem;
  94. int iItem = m_oidList.GetItemCount ();
  95. int iResult = 0;
  96. // security review 2/20/2002 BryanWal ok
  97. ::ZeroMemory (&lvItem, sizeof (lvItem));
  98. lvItem.mask = LVIF_TEXT | LVIF_PARAM;
  99. lvItem.iItem = iItem;
  100. lvItem.iSubItem = COL_POLICY_NAME;
  101. lvItem.pszText = (PWSTR)(PCWSTR) pPolicyOID->GetDisplayName ();
  102. lvItem.lParam = (LPARAM) pPolicyOID;
  103. iItem = m_oidList.InsertItem (&lvItem);
  104. ASSERT (-1 != iItem);
  105. if ( -1 == iItem )
  106. hr = E_FAIL;
  107. if ( SUCCEEDED (hr) )
  108. {
  109. // security review 2/20/2002 BryanWal ok
  110. ::ZeroMemory (&lvItem, sizeof (lvItem));
  111. lvItem.mask = LVIF_TEXT;
  112. lvItem.iItem = iItem;
  113. lvItem.iSubItem = COL_OID;
  114. lvItem.pszText = (PWSTR)(PCWSTR) pPolicyOID->GetOIDW ();
  115. iResult = m_oidList.SetItem (&lvItem);
  116. ASSERT (-1 != iResult);
  117. if ( -1 == iResult )
  118. hr = E_FAIL;
  119. }
  120. if ( SUCCEEDED (hr) )
  121. {
  122. lvItem.iSubItem = COL_POLICY_TYPE;
  123. CString text;
  124. if ( pPolicyOID->IsApplicationOID () )
  125. VERIFY (text.LoadString (IDS_APPLICATION));
  126. else // Is issuance OID
  127. VERIFY (text.LoadString (IDS_ISSUANCE));
  128. lvItem.pszText = (PWSTR)(PCWSTR) text;
  129. iResult = m_oidList.SetItem (&lvItem);
  130. ASSERT (-1 != iResult);
  131. if ( -1 == iResult )
  132. hr = E_FAIL;
  133. }
  134. if ( SUCCEEDED (hr) && pPolicyOID->IsIssuanceOID () )
  135. {
  136. lvItem.iSubItem = COL_CPS_LOCATION;
  137. PWSTR pszCPS = 0;
  138. hr = CAOIDGetProperty(
  139. pPolicyOID->GetOIDW (),
  140. CERT_OID_PROPERTY_CPS,
  141. &pszCPS);
  142. if ( SUCCEEDED (hr) )
  143. {
  144. lvItem.pszText = pszCPS;
  145. iResult = m_oidList.SetItem (&lvItem);
  146. ASSERT (-1 != iResult);
  147. if ( -1 == iResult )
  148. hr = E_FAIL;
  149. CAOIDFreeProperty (pszCPS);
  150. }
  151. else if ( HRESULT_FROM_WIN32 (ERROR_FILE_NOT_FOUND) == hr ||
  152. HRESULT_FROM_WIN32 (ERROR_DS_OBJ_NOT_FOUND) == hr )
  153. {
  154. hr = S_OK;
  155. }
  156. else
  157. {
  158. _TRACE (0, L"CAOIDGetProperty (%s, CERT_OID_PROPERTY_CPS) failed: 0x%x\n",
  159. (PCWSTR) pPolicyOID->GetOIDW (), hr);
  160. hr = S_OK;
  161. }
  162. }
  163. return hr;
  164. }
  165. void CViewOIDDlg::OnItemchangedOidList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
  166. {
  167. // NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  168. GetDlgItem (IDC_COPY_OID)->EnableWindow (m_oidList.GetSelectedCount () > 0);
  169. *pResult = 0;
  170. }
  171. void CViewOIDDlg::OnCopyOid()
  172. {
  173. CString szText;
  174. int nCnt = m_oidList.GetItemCount ();
  175. if ( nCnt > 0 && m_oidList.GetSelectedCount () > 0 )
  176. {
  177. for (int nItem = 0; nItem < nCnt; nItem++)
  178. {
  179. if ( LVIS_SELECTED == m_oidList.GetItemState (nItem, LVIS_SELECTED) )
  180. {
  181. if ( !szText.IsEmpty () )
  182. szText += pcszNEWLINE;
  183. szText += m_oidList.GetItemText (nItem, COL_OID);
  184. }
  185. }
  186. }
  187. if ( !szText.IsEmpty () )
  188. {
  189. if ( OpenClipboard () )
  190. {
  191. if ( EmptyClipboard () )
  192. {
  193. // security review 2/20/2002 BryanWal ok
  194. size_t nLen = wcslen (szText);
  195. HGLOBAL hglbCopy = GlobalAlloc (GMEM_MOVEABLE,
  196. (nLen + 1) * sizeof (WCHAR));
  197. if ( hglbCopy )
  198. {
  199. PWSTR pszCopy = (PWSTR) GlobalLock (hglbCopy);
  200. if ( pszCopy )
  201. {
  202. // security review 2/20/2002 BryanWal ok
  203. wcscpy (pszCopy, szText);
  204. GlobalUnlock(hglbCopy);
  205. // Place the handle on the clipboard.
  206. if ( !SetClipboardData (CF_UNICODETEXT, hglbCopy) )
  207. {
  208. ASSERT (0);
  209. _TRACE (0, L"SetClipboardData () failed: %d\n", GetLastError ());
  210. GlobalFree (hglbCopy);
  211. }
  212. }
  213. else
  214. GlobalFree (hglbCopy);
  215. }
  216. if ( !CloseClipboard () )
  217. {
  218. ASSERT (0);
  219. _TRACE (0, L"CloseClipboard () failed: %d\n", GetLastError ());
  220. }
  221. }
  222. else
  223. {
  224. ASSERT (0);
  225. _TRACE (0, L"EmptyClipboard () failed: %d\n", GetLastError ());
  226. }
  227. }
  228. else
  229. {
  230. ASSERT (0);
  231. _TRACE (0, L"OpenClipboard () failed: %d\n", GetLastError ());
  232. }
  233. }
  234. }
  235. int CALLBACK CViewOIDDlg::fnCompareOIDItems (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  236. {
  237. int iVal = 0;
  238. if ( lParam1 && lParam2 )
  239. {
  240. CPolicyOID* pPolicyOID1 = (CPolicyOID*) lParam1;
  241. CPolicyOID* pPolicyOID2 = (CPolicyOID*) lParam2;
  242. switch (lParamSort)
  243. {
  244. case COL_POLICY_NAME:
  245. iVal = LocaleStrCmp (pPolicyOID1->GetDisplayName (),
  246. pPolicyOID2->GetDisplayName ());
  247. break;
  248. case COL_OID:
  249. iVal = LocaleStrCmp (pPolicyOID1->GetOIDW (),
  250. pPolicyOID2->GetOIDW ());
  251. break;
  252. case COL_POLICY_TYPE:
  253. {
  254. CString szApplication;
  255. CString szIssuance;
  256. VERIFY (szApplication.LoadString (IDS_APPLICATION));
  257. VERIFY (szIssuance.LoadString (IDS_ISSUANCE));
  258. iVal = LocaleStrCmp (pPolicyOID1->IsApplicationOID () ? szApplication : szIssuance,
  259. pPolicyOID2->IsApplicationOID () ? szApplication : szIssuance);
  260. }
  261. break;
  262. case COL_CPS_LOCATION:
  263. {
  264. CString strItem1;
  265. CString strItem2;
  266. if ( pPolicyOID1->IsIssuanceOID () )
  267. {
  268. PWSTR pszCPS = 0;
  269. if ( SUCCEEDED (CAOIDGetProperty(
  270. pPolicyOID1->GetOIDW (),
  271. CERT_OID_PROPERTY_CPS,
  272. &pszCPS)) )
  273. {
  274. strItem1 = pszCPS;
  275. }
  276. }
  277. if ( pPolicyOID2->IsIssuanceOID () )
  278. {
  279. PWSTR pszCPS = 0;
  280. if ( SUCCEEDED (CAOIDGetProperty(
  281. pPolicyOID2->GetOIDW (),
  282. CERT_OID_PROPERTY_CPS,
  283. &pszCPS)) )
  284. {
  285. strItem2 = pszCPS;
  286. }
  287. }
  288. iVal = LocaleStrCmp (strItem1, strItem2);
  289. }
  290. break;
  291. default:
  292. ASSERT (0);
  293. break;
  294. }
  295. }
  296. return iVal;
  297. }
  298. void CViewOIDDlg::OnColumnclickOidList(NMHDR* pNMHDR, LRESULT* pResult)
  299. {
  300. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  301. if ( pNMListView )
  302. {
  303. m_oidList.SortItems ((PFNLVCOMPARE) fnCompareOIDItems,
  304. (LPARAM) pNMListView->iSubItem);
  305. }
  306. *pResult = 0;
  307. }
  308. void CViewOIDDlg::DoContextHelp (HWND hWndControl)
  309. {
  310. _TRACE(1, L"Entering CViewOIDDlg::DoContextHelp\n");
  311. switch (::GetDlgCtrlID (hWndControl))
  312. {
  313. case IDC_STATIC:
  314. break;
  315. default:
  316. // Display context help for a control
  317. if ( !::WinHelp (
  318. hWndControl,
  319. GetContextHelpFile (),
  320. HELP_WM_HELP,
  321. (DWORD_PTR) g_aHelpIDs_IDD_VIEW_OIDS) )
  322. {
  323. _TRACE (0, L"WinHelp () failed: 0x%x\n", GetLastError ());
  324. }
  325. break;
  326. }
  327. _TRACE(-1, L"Leaving CViewOIDDlg::DoContextHelp\n");
  328. }