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.

243 lines
4.2 KiB

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996 - 1999
  5. //
  6. // File: column.cpp
  7. //
  8. // Contents: Cert Server Database interface implementation
  9. //
  10. //---------------------------------------------------------------------------
  11. #include <pch.cpp>
  12. #pragma hdrstop
  13. #include "csprop.h"
  14. #include "column.h"
  15. #include "enum.h"
  16. #include "db.h"
  17. #include "row.h"
  18. #include "dbw.h"
  19. #define __dwFILE__ __dwFILE_CERTDB_COLUMN_CPP__
  20. #if DBG
  21. LONG g_cCertDBColumn;
  22. LONG g_cCertDBColumnTotal;
  23. #endif
  24. CEnumCERTDBCOLUMN::CEnumCERTDBCOLUMN()
  25. {
  26. DBGCODE(InterlockedIncrement(&g_cCertDBColumn));
  27. DBGCODE(InterlockedIncrement(&g_cCertDBColumnTotal));
  28. m_pdb = NULL;
  29. m_ielt = 0;
  30. m_dwTable = CVRC_TABLE_REQCERT;
  31. m_cRef = 1;
  32. }
  33. CEnumCERTDBCOLUMN::~CEnumCERTDBCOLUMN()
  34. {
  35. DBGCODE(InterlockedDecrement(&g_cCertDBColumn));
  36. if (NULL != m_pdb)
  37. {
  38. m_pdb->Release();
  39. m_pdb = NULL;
  40. }
  41. }
  42. HRESULT
  43. CEnumCERTDBCOLUMN::Open(
  44. IN DWORD dwTable, // CVRC_TABLE_*
  45. IN ICertDB *pdb)
  46. {
  47. HRESULT hr;
  48. if (NULL == pdb)
  49. {
  50. hr = E_POINTER;
  51. _JumpError(hr, error, "NULL parm");
  52. }
  53. m_dwTable = dwTable;
  54. m_pdb = pdb;
  55. m_pdb->AddRef();
  56. hr = S_OK;
  57. error:
  58. return(hr);
  59. }
  60. STDMETHODIMP
  61. CEnumCERTDBCOLUMN::Next(
  62. /* [in] */ ULONG celt,
  63. /* [out] */ CERTDBCOLUMN *rgelt,
  64. /* [out] */ ULONG *pceltFetched)
  65. {
  66. HRESULT hr;
  67. DWORD ieltNext;
  68. if (NULL == rgelt || NULL == pceltFetched)
  69. {
  70. hr = E_POINTER;
  71. _JumpError(hr, error, "NULL parm");
  72. }
  73. if (NULL == m_pdb)
  74. {
  75. hr = E_UNEXPECTED;
  76. _JumpError(hr, error, "NULL m_pdb");
  77. }
  78. hr = ((CCertDB *) m_pdb)->EnumCertDBColumnNext(
  79. m_dwTable,
  80. m_ielt,
  81. celt,
  82. rgelt,
  83. &ieltNext,
  84. pceltFetched);
  85. if (S_FALSE != hr)
  86. {
  87. _JumpIfError(hr, error, "EnumCertDBColumnNext");
  88. }
  89. m_ielt = ieltNext;
  90. error:
  91. return(hr);
  92. }
  93. STDMETHODIMP
  94. CEnumCERTDBCOLUMN::Skip(
  95. /* [in] */ LONG celt,
  96. /* [out] */ LONG *pielt)
  97. {
  98. HRESULT hr;
  99. if (NULL == pielt)
  100. {
  101. hr = E_POINTER;
  102. _JumpError(hr, error, "NULL parm");
  103. }
  104. m_ielt += celt;
  105. *pielt = m_ielt;
  106. hr = S_OK;
  107. error:
  108. return(hr);
  109. }
  110. STDMETHODIMP
  111. CEnumCERTDBCOLUMN::Reset(VOID)
  112. {
  113. m_ielt = 0;
  114. return(S_OK);
  115. }
  116. STDMETHODIMP
  117. CEnumCERTDBCOLUMN::Clone(
  118. /* [out] */ IEnumCERTDBCOLUMN **ppenum)
  119. {
  120. HRESULT hr;
  121. LONG iDummy;
  122. IEnumCERTDBCOLUMN *penum = NULL;
  123. if (NULL == ppenum)
  124. {
  125. hr = E_POINTER;
  126. _JumpError(hr, error, "NULL parm");
  127. }
  128. hr = m_pdb->EnumCertDBColumn(m_dwTable, &penum);
  129. _JumpIfError(hr, error, "EnumCertDBColumn");
  130. if (0 != m_ielt)
  131. {
  132. penum->Skip(m_ielt, &iDummy);
  133. }
  134. error:
  135. if (NULL != ppenum)
  136. {
  137. *ppenum = penum;
  138. }
  139. return(hr);
  140. }
  141. // IUnknown implementation
  142. STDMETHODIMP
  143. CEnumCERTDBCOLUMN::QueryInterface(const IID& iid, void **ppv)
  144. {
  145. HRESULT hr;
  146. if (NULL == ppv)
  147. {
  148. hr = E_POINTER;
  149. _JumpError(hr, error, "NULL parm");
  150. }
  151. if (iid == IID_IUnknown)
  152. {
  153. *ppv = static_cast<IEnumCERTDBCOLUMN *>(this);
  154. }
  155. else if (iid == IID_IEnumCERTDBCOLUMN)
  156. {
  157. *ppv = static_cast<IEnumCERTDBCOLUMN *>(this);
  158. }
  159. else
  160. {
  161. *ppv = NULL;
  162. hr = E_NOINTERFACE;
  163. _JumpError(hr, error, "IID");
  164. }
  165. reinterpret_cast<IUnknown *>(*ppv)->AddRef();
  166. hr = S_OK;
  167. error:
  168. return(hr);
  169. }
  170. ULONG STDMETHODCALLTYPE
  171. CEnumCERTDBCOLUMN::AddRef()
  172. {
  173. return(InterlockedIncrement(&m_cRef));
  174. }
  175. ULONG STDMETHODCALLTYPE
  176. CEnumCERTDBCOLUMN::Release()
  177. {
  178. ULONG cRef = InterlockedDecrement(&m_cRef);
  179. if (0 == cRef)
  180. {
  181. delete this;
  182. }
  183. return(cRef);
  184. }
  185. #if 0
  186. STDMETHODIMP
  187. CEnumCERTDBCOLUMN::InterfaceSupportsErrorInfo(
  188. IN REFIID riid)
  189. {
  190. static const IID *arr[] =
  191. {
  192. &IID_IEnumCERTDBCOLUMN,
  193. };
  194. for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
  195. {
  196. if (InlineIsEqualGUID(*arr[i], riid))
  197. {
  198. return(S_OK);
  199. }
  200. }
  201. return(S_FALSE);
  202. }
  203. #endif