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.

520 lines
10 KiB

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