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.

553 lines
10 KiB

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996 - 1999
  5. //
  6. // File: column.cpp
  7. //
  8. // Contents: Cert Server Data Base interface implementation
  9. //
  10. //---------------------------------------------------------------------------
  11. #include <pch.cpp>
  12. #pragma hdrstop
  13. #include "csdisp.h"
  14. #include "csprop.h"
  15. #include "column.h"
  16. #include "view.h"
  17. #define __dwFILE__ __dwFILE_CERTVIEW_COLUMN_CPP__
  18. #if DBG_CERTSRV
  19. LONG g_cCertViewColumn;
  20. LONG g_cCertViewColumnTotal;
  21. #endif
  22. CEnumCERTVIEWCOLUMN::CEnumCERTVIEWCOLUMN()
  23. {
  24. DBGCODE(InterlockedIncrement(&g_cCertViewColumn));
  25. DBGCODE(InterlockedIncrement(&g_cCertViewColumnTotal));
  26. m_pvw = NULL;
  27. m_prow = NULL;
  28. m_cRef = 1;
  29. }
  30. CEnumCERTVIEWCOLUMN::~CEnumCERTVIEWCOLUMN()
  31. {
  32. DBGCODE(InterlockedDecrement(&g_cCertViewColumn));
  33. #if DBG_CERTSRV
  34. if (m_cRef > 1)
  35. {
  36. DBGPRINT((
  37. DBG_SS_CERTVIEWI,
  38. "%hs has %d instances left over\n",
  39. "CEnumCERTVIEWCOLUMN",
  40. m_cRef));
  41. }
  42. #endif
  43. if (NULL != m_pvw)
  44. {
  45. m_pvw->Release();
  46. }
  47. if (NULL != m_prow)
  48. {
  49. LocalFree(m_prow);
  50. }
  51. }
  52. HRESULT
  53. CEnumCERTVIEWCOLUMN::Open(
  54. IN LONG Flags,
  55. IN LONG iRow,
  56. IN ICertView *pvw,
  57. OPTIONAL IN CERTTRANSDBRESULTROW const *prow)
  58. {
  59. HRESULT hr;
  60. if (NULL == pvw)
  61. {
  62. hr = E_POINTER;
  63. _JumpError(hr, error, "NULL parm");
  64. }
  65. CSASSERT(0 == (CVRC_TABLE_MASK & CVRC_COLUMN_MASK));
  66. hr = E_INVALIDARG;
  67. if (~(CVRC_TABLE_MASK | CVRC_COLUMN_MASK) & Flags)
  68. {
  69. _JumpError(hr, error, "Flags");
  70. }
  71. switch (CVRC_COLUMN_MASK & Flags)
  72. {
  73. case CVRC_COLUMN_SCHEMA:
  74. case CVRC_COLUMN_RESULT:
  75. case CVRC_COLUMN_VALUE:
  76. break;
  77. default:
  78. _JumpError(hr, error, "Flags column");
  79. }
  80. switch (CVRC_TABLE_MASK & Flags)
  81. {
  82. case CVRC_TABLE_REQCERT:
  83. case CVRC_TABLE_EXTENSIONS:
  84. case CVRC_TABLE_ATTRIBUTES:
  85. case CVRC_TABLE_CRL:
  86. break;
  87. default:
  88. _JumpError(hr, error, "Flags table");
  89. }
  90. m_Flags = Flags;
  91. m_iRow = iRow;
  92. m_pvw = pvw;
  93. m_pvw->AddRef();
  94. DBGPRINT((
  95. DBG_SS_CERTVIEWI,
  96. "CEnumCERTVIEWCOLUMN::Open(cvrcTable=%x, cvrcColumn=%x)\n",
  97. CVRC_TABLE_MASK & Flags,
  98. CVRC_COLUMN_MASK & Flags));
  99. if (NULL != prow)
  100. {
  101. m_prow = (CERTTRANSDBRESULTROW *) LocalAlloc(LMEM_FIXED, prow->cbrow);
  102. if (NULL == m_prow)
  103. {
  104. hr = E_OUTOFMEMORY;
  105. _JumpError(hr, error, "LocalAlloc");
  106. }
  107. CopyMemory(m_prow, prow, prow->cbrow);
  108. }
  109. hr = m_pvw->GetColumnCount(m_Flags, &m_celt);
  110. _JumpIfError(hr, error, "GetColumnCount");
  111. Reset();
  112. error:
  113. return(hr);
  114. }
  115. STDMETHODIMP
  116. CEnumCERTVIEWCOLUMN::Next(
  117. /* [out, retval] */ LONG *pIndex)
  118. {
  119. HRESULT hr;
  120. if (NULL == pIndex)
  121. {
  122. hr = E_POINTER;
  123. _JumpError(hr, error, "NULL parm");
  124. }
  125. if (-1 > m_ielt || m_ielt >= m_celt - 1)
  126. {
  127. *pIndex = -1;
  128. hr = S_FALSE;
  129. goto error;
  130. }
  131. m_ielt++;
  132. hr = ((CCertView *) m_pvw)->FindColumn(
  133. m_Flags,
  134. m_ielt,
  135. &m_pcol,
  136. &m_pwszDisplayName);
  137. _JumpIfError(hr, error, "FindColumn");
  138. *pIndex = m_ielt;
  139. error:
  140. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::Next"));
  141. }
  142. STDMETHODIMP
  143. CEnumCERTVIEWCOLUMN::GetName(
  144. /* [out, retval] */ BSTR *pstrOut)
  145. {
  146. HRESULT hr;
  147. if (NULL == pstrOut)
  148. {
  149. hr = E_POINTER;
  150. _JumpError(hr, error, "NULL parm");
  151. }
  152. if (NULL == m_pcol)
  153. {
  154. hr = E_UNEXPECTED;
  155. _JumpError(hr, error, "m_pcol NULL");
  156. }
  157. if (!ConvertWszToBstr(pstrOut, m_pcol->pwszName, -1))
  158. {
  159. hr = E_OUTOFMEMORY;
  160. _JumpError(hr, error, "ConvertWszToBstr");
  161. }
  162. hr = S_OK;
  163. error:
  164. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetName"));
  165. }
  166. STDMETHODIMP
  167. CEnumCERTVIEWCOLUMN::GetDisplayName(
  168. /* [out, retval] */ BSTR *pstrOut)
  169. {
  170. HRESULT hr;
  171. if (NULL == pstrOut)
  172. {
  173. hr = E_POINTER;
  174. _JumpError(hr, error, "NULL parm");
  175. }
  176. if (NULL == m_pwszDisplayName)
  177. {
  178. hr = E_UNEXPECTED;
  179. _JumpError(hr, error, "m_pwszDisplayName NULL");
  180. }
  181. if (!ConvertWszToBstr(pstrOut, m_pwszDisplayName, -1))
  182. {
  183. hr = E_OUTOFMEMORY;
  184. _JumpError(hr, error, "ConvertWszToBstr");
  185. }
  186. hr = S_OK;
  187. error:
  188. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetDisplayName"));
  189. }
  190. STDMETHODIMP
  191. CEnumCERTVIEWCOLUMN::GetType(
  192. /* [out, retval] */ LONG *pType)
  193. {
  194. HRESULT hr;
  195. if (NULL == pType)
  196. {
  197. hr = E_POINTER;
  198. _JumpError(hr, error, "NULL parm");
  199. }
  200. if (NULL == m_pcol)
  201. {
  202. hr = E_UNEXPECTED;
  203. _JumpError(hr, error, "m_pcol NULL");
  204. }
  205. *pType = PROPTYPE_MASK & m_pcol->Type;
  206. hr = S_OK;
  207. error:
  208. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetType"));
  209. }
  210. STDMETHODIMP
  211. CEnumCERTVIEWCOLUMN::IsIndexed(
  212. /* [out, retval] */ LONG *pIndexed)
  213. {
  214. HRESULT hr;
  215. if (NULL == pIndexed)
  216. {
  217. hr = E_POINTER;
  218. _JumpError(hr, error, "NULL parm");
  219. }
  220. if (NULL == m_pcol)
  221. {
  222. hr = E_UNEXPECTED;
  223. _JumpError(hr, error, "m_pcol NULL");
  224. }
  225. *pIndexed = (PROPFLAGS_INDEXED & m_pcol->Type)? TRUE : FALSE;
  226. hr = S_OK;
  227. error:
  228. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::IsIndexed"));
  229. }
  230. STDMETHODIMP
  231. CEnumCERTVIEWCOLUMN::GetMaxLength(
  232. /* [out, retval] */ LONG *pMaxLength)
  233. {
  234. HRESULT hr;
  235. if (NULL == pMaxLength)
  236. {
  237. hr = E_POINTER;
  238. _JumpError(hr, error, "NULL parm");
  239. }
  240. if (NULL == m_pcol)
  241. {
  242. hr = E_UNEXPECTED;
  243. _JumpError(hr, error, "m_pcol NULL");
  244. }
  245. *pMaxLength = m_pcol->cbMax;
  246. hr = S_OK;
  247. error:
  248. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetMaxLength"));
  249. }
  250. DWORD
  251. AsnPropId(
  252. IN LONG Flags,
  253. IN WCHAR const *pwszName)
  254. {
  255. DWORD PropId = CR_PROP_NONE;
  256. switch (CVRC_TABLE_MASK & Flags)
  257. {
  258. case CVRC_TABLE_CRL:
  259. if (0 == LSTRCMPIS(pwszName, wszPROPCRLRAWCRL))
  260. {
  261. PropId = CR_PROP_BASECRL;
  262. }
  263. break;
  264. case CVRC_TABLE_REQCERT:
  265. if (0 == LSTRCMPIS(pwszName, wszPROPREQUESTRAWREQUEST))
  266. {
  267. PropId = MAXDWORD;
  268. }
  269. break;
  270. }
  271. return(PropId);
  272. }
  273. STDMETHODIMP
  274. CEnumCERTVIEWCOLUMN::GetValue(
  275. /* [in] */ LONG Flags,
  276. /* [out, retval] */ VARIANT *pvarValue)
  277. {
  278. HRESULT hr = E_UNEXPECTED;
  279. BYTE const *pbValue;
  280. CERTTRANSDBRESULTCOLUMN const *pColResult;
  281. if (NULL == pvarValue)
  282. {
  283. hr = E_POINTER;
  284. _JumpError(hr, error, "NULL parm");
  285. }
  286. VariantInit(pvarValue);
  287. if (CVRC_COLUMN_VALUE != (CVRC_COLUMN_MASK & m_Flags))
  288. {
  289. _JumpError(hr, error, "No Value");
  290. }
  291. if (NULL == m_pcol)
  292. {
  293. _JumpError(hr, error, "m_pcol NULL");
  294. }
  295. pColResult = &((CERTTRANSDBRESULTCOLUMN const *) (m_prow + 1))[m_ielt];
  296. CSASSERT(m_pcol->Type == pColResult->Type);
  297. if (0 == pColResult->obValue)
  298. {
  299. hr = S_OK; // leave VariantClear()'s VT_EMPTY tag
  300. goto error;
  301. }
  302. pbValue = (BYTE const *) Add2ConstPtr(m_prow, pColResult->obValue);
  303. hr = myUnmarshalFormattedVariant(
  304. Flags,
  305. AsnPropId(m_Flags, m_pcol->pwszName),
  306. m_pcol->Type,
  307. pColResult->cbValue,
  308. pbValue,
  309. pvarValue);
  310. _JumpIfError(hr, error, "myUnmarshalFormattedVariant");
  311. error:
  312. if (S_OK != hr)
  313. {
  314. VariantClear(pvarValue);
  315. }
  316. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::GetValue"));
  317. }
  318. STDMETHODIMP
  319. CEnumCERTVIEWCOLUMN::Skip(
  320. /* [in] */ LONG celt)
  321. {
  322. HRESULT hr;
  323. LONG ieltnew = m_ielt + celt;
  324. if (-1 > ieltnew)
  325. {
  326. hr = E_INVALIDARG;
  327. _JumpError(hr, error, "Skip back to before start");
  328. }
  329. m_ielt = ieltnew;
  330. m_pcol = NULL;
  331. hr = S_OK;
  332. error:
  333. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::Skip"));
  334. }
  335. STDMETHODIMP
  336. CEnumCERTVIEWCOLUMN::Reset(VOID)
  337. {
  338. m_ielt = -1;
  339. m_pcol = NULL;
  340. return(S_OK);
  341. }
  342. STDMETHODIMP
  343. CEnumCERTVIEWCOLUMN::Clone(
  344. /* [out] */ IEnumCERTVIEWCOLUMN **ppenum)
  345. {
  346. HRESULT hr;
  347. IEnumCERTVIEWCOLUMN *penum = NULL;
  348. if (NULL == ppenum)
  349. {
  350. hr = E_POINTER;
  351. _JumpError(hr, error, "NULL parm");
  352. }
  353. *ppenum = NULL;
  354. penum = new CEnumCERTVIEWCOLUMN;
  355. if (NULL == penum)
  356. {
  357. hr = E_OUTOFMEMORY;
  358. _JumpError(hr, error, "new CEnumCERTVIEWCOLUMN");
  359. }
  360. hr = ((CEnumCERTVIEWCOLUMN *) penum)->Open(
  361. m_Flags,
  362. -1,
  363. m_pvw,
  364. m_prow);
  365. _JumpIfError(hr, error, "Open");
  366. if (-1 != m_ielt)
  367. {
  368. hr = penum->Skip(m_ielt);
  369. _JumpIfError(hr, error, "Skip");
  370. if (NULL != m_pcol)
  371. {
  372. LONG Index;
  373. hr = penum->Next(&Index);
  374. _JumpIfError(hr, error, "Next");
  375. CSASSERT(Index == m_ielt);
  376. }
  377. }
  378. *ppenum = penum;
  379. penum = NULL;
  380. hr = S_OK;
  381. error:
  382. if (NULL != penum)
  383. {
  384. penum->Release();
  385. }
  386. return(_SetErrorInfo(hr, L"CEnumCERTVIEWCOLUMN::Clone"));
  387. }
  388. HRESULT
  389. CEnumCERTVIEWCOLUMN::_SetErrorInfo(
  390. IN HRESULT hrError,
  391. IN WCHAR const *pwszDescription)
  392. {
  393. CSASSERT(FAILED(hrError) || S_OK == hrError || S_FALSE == hrError);
  394. if (FAILED(hrError))
  395. {
  396. HRESULT hr;
  397. hr = DispatchSetErrorInfo(
  398. hrError,
  399. pwszDescription,
  400. wszCLASS_CERTVIEW L".CEnumCERTVIEWCOLUMN",
  401. &IID_IEnumCERTVIEWCOLUMN);
  402. CSASSERT(hr == hrError);
  403. }
  404. return(hrError);
  405. }
  406. #if 1
  407. // IUnknown implementation
  408. STDMETHODIMP
  409. CEnumCERTVIEWCOLUMN::QueryInterface(
  410. const IID& iid,
  411. void **ppv)
  412. {
  413. HRESULT hr;
  414. if (NULL == ppv)
  415. {
  416. hr = E_POINTER;
  417. _JumpError(hr, error, "NULL parm");
  418. }
  419. if (iid == IID_IUnknown)
  420. {
  421. *ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
  422. }
  423. else if (iid == IID_IDispatch)
  424. {
  425. *ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
  426. }
  427. else if (iid == IID_ISupportErrorInfo)
  428. {
  429. *ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
  430. }
  431. else if (iid == IID_IEnumCERTVIEWCOLUMN)
  432. {
  433. *ppv = static_cast<IEnumCERTVIEWCOLUMN *>(this);
  434. }
  435. else
  436. {
  437. *ppv = NULL;
  438. hr = E_NOINTERFACE;
  439. _JumpError(hr, error, "IID");
  440. }
  441. reinterpret_cast<IUnknown *>(*ppv)->AddRef();
  442. hr = S_OK;
  443. error:
  444. return(hr);
  445. }
  446. ULONG STDMETHODCALLTYPE
  447. CEnumCERTVIEWCOLUMN::AddRef()
  448. {
  449. return(InterlockedIncrement(&m_cRef));
  450. }
  451. ULONG STDMETHODCALLTYPE
  452. CEnumCERTVIEWCOLUMN::Release()
  453. {
  454. ULONG cRef = InterlockedDecrement(&m_cRef);
  455. if (0 == cRef)
  456. {
  457. delete this;
  458. }
  459. return(cRef);
  460. }
  461. #endif