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.

551 lines
11 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1995 - 1999
  6. //
  7. // File: viewcol.cpp
  8. //
  9. // Contents: IEnumCERTVIEWCOLUMN IDispatch helper functions
  10. //
  11. //--------------------------------------------------------------------------
  12. #include <pch.cpp>
  13. #pragma hdrstop
  14. #include <stdlib.h>
  15. #include "csdisp.h"
  16. #include "csprop.h"
  17. #define __dwFILE__ __dwFILE_CERTLIB_VIEWCOL_CPP__
  18. //+------------------------------------------------------------------------
  19. // IEnumCERTVIEWCOLUMN dispatch support
  20. //+------------------------------------
  21. // OpenConnection method:
  22. static OLECHAR *_apszNext[] = {
  23. TEXT("Next"),
  24. };
  25. //+------------------------------------
  26. // GetName method:
  27. static OLECHAR *_apszGetName[] = {
  28. TEXT("GetName"),
  29. };
  30. //+------------------------------------
  31. // GetDisplayName method:
  32. static OLECHAR *_apszGetDisplayName[] = {
  33. TEXT("GetDisplayName"),
  34. };
  35. //+------------------------------------
  36. // GetType method:
  37. static OLECHAR *_apszGetType[] = {
  38. TEXT("GetType"),
  39. };
  40. //+------------------------------------
  41. // IsIndexed method:
  42. static OLECHAR *_apszIsIndexed[] = {
  43. TEXT("IsIndexed"),
  44. };
  45. //+------------------------------------
  46. // GetMaxLength method:
  47. static OLECHAR *_apszGetMaxLength[] = {
  48. TEXT("GetMaxLength"),
  49. };
  50. //+------------------------------------
  51. // GetValue method:
  52. static OLECHAR *_apszGetValue[] = {
  53. TEXT("GetValue"),
  54. TEXT("Flags"),
  55. };
  56. //+------------------------------------
  57. // Skip method:
  58. static OLECHAR *_apszSkip[] = {
  59. TEXT("Skip"),
  60. TEXT("celt"),
  61. };
  62. //+------------------------------------
  63. // Reset method:
  64. static OLECHAR *_apszReset[] = {
  65. TEXT("Reset"),
  66. };
  67. //+------------------------------------
  68. // Clone method:
  69. static OLECHAR *_apszClone[] = {
  70. TEXT("Clone"),
  71. };
  72. //+------------------------------------
  73. // Dispatch Table:
  74. DISPATCHTABLE g_adtViewColumn[] =
  75. {
  76. #define VIEWCOL_NEXT 0
  77. DECLARE_DISPATCH_ENTRY(_apszNext)
  78. #define VIEWCOL_GETNAME 1
  79. DECLARE_DISPATCH_ENTRY(_apszGetName)
  80. #define VIEWCOL_GETDISPLAYNAME 2
  81. DECLARE_DISPATCH_ENTRY(_apszGetDisplayName)
  82. #define VIEWCOL_GETTYPE 3
  83. DECLARE_DISPATCH_ENTRY(_apszGetType)
  84. #define VIEWCOL_ISINDEXED 4
  85. DECLARE_DISPATCH_ENTRY(_apszIsIndexed)
  86. #define VIEWCOL_GETMAXLENGTH 5
  87. DECLARE_DISPATCH_ENTRY(_apszGetMaxLength)
  88. #define VIEWCOL_GETVALUE 6
  89. DECLARE_DISPATCH_ENTRY(_apszGetValue)
  90. #define VIEWCOL_SKIP 7
  91. DECLARE_DISPATCH_ENTRY(_apszSkip)
  92. #define VIEWCOL_RESET 8
  93. DECLARE_DISPATCH_ENTRY(_apszReset)
  94. #define VIEWCOL_CLONE 9
  95. DECLARE_DISPATCH_ENTRY(_apszClone)
  96. };
  97. #define CVIEWCOLDISPATCH (ARRAYSIZE(g_adtViewColumn))
  98. HRESULT
  99. ViewColumn_Init2(
  100. IN BOOL fIDispatch,
  101. IN IEnumCERTVIEWCOLUMN *pEnumColumn,
  102. OUT DISPATCHINTERFACE *pdiViewColumn)
  103. {
  104. HRESULT hr;
  105. IDispatch *pDispatch = NULL;
  106. static BOOL s_fInitialized = FALSE;
  107. pdiViewColumn->pDispatchTable = NULL;
  108. pdiViewColumn->pDispatch = NULL;
  109. pdiViewColumn->pUnknown = NULL;
  110. if (fIDispatch)
  111. {
  112. hr = pEnumColumn->QueryInterface(
  113. IID_IDispatch,
  114. (VOID **) &pDispatch);
  115. _JumpIfError(hr, error, "QueryInterface");
  116. hr = DispatchGetIds(
  117. pDispatch,
  118. CVIEWCOLDISPATCH,
  119. g_adtViewColumn,
  120. pdiViewColumn);
  121. _JumpIfError(hr, error, "DispatchGetIds");
  122. pdiViewColumn->pDispatch = pDispatch;
  123. pDispatch = NULL;
  124. }
  125. else
  126. {
  127. pEnumColumn->AddRef();
  128. pdiViewColumn->pUnknown = (IUnknown *) pEnumColumn;
  129. hr = S_OK;
  130. }
  131. pdiViewColumn->pDispatchTable = g_adtViewColumn;
  132. error:
  133. if (NULL != pDispatch)
  134. {
  135. pDispatch->Release();
  136. }
  137. return(hr);
  138. }
  139. VOID
  140. ViewColumn_Release(
  141. IN OUT DISPATCHINTERFACE *pdiViewColumn)
  142. {
  143. DispatchRelease(pdiViewColumn);
  144. }
  145. HRESULT
  146. ViewColumn_Next(
  147. IN DISPATCHINTERFACE *pdiViewColumn,
  148. OUT LONG *pIndex)
  149. {
  150. HRESULT hr;
  151. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  152. if (NULL != pdiViewColumn->pDispatch)
  153. {
  154. hr = DispatchInvoke(
  155. pdiViewColumn,
  156. VIEWCOL_NEXT,
  157. 0,
  158. NULL,
  159. VT_I4,
  160. pIndex);
  161. _JumpIfError2(hr, error, "Invoke(Next)", S_FALSE);
  162. }
  163. else
  164. {
  165. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Next(pIndex);
  166. _JumpIfError2(hr, error, "Next", S_FALSE);
  167. }
  168. error:
  169. return(hr);
  170. }
  171. HRESULT
  172. ViewColumn_GetName(
  173. IN DISPATCHINTERFACE *pdiViewColumn,
  174. OUT BSTR *pstrOut)
  175. {
  176. HRESULT hr;
  177. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  178. if (NULL != pdiViewColumn->pDispatch)
  179. {
  180. hr = DispatchInvoke(
  181. pdiViewColumn,
  182. VIEWCOL_GETNAME,
  183. 0,
  184. NULL,
  185. VT_BSTR,
  186. pstrOut);
  187. _JumpIfError(hr, error, "Invoke(GetName)");
  188. }
  189. else
  190. {
  191. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetName(pstrOut);
  192. _JumpIfError(hr, error, "GetName");
  193. }
  194. error:
  195. return(hr);
  196. }
  197. HRESULT
  198. ViewColumn_GetDisplayName(
  199. IN DISPATCHINTERFACE *pdiViewColumn,
  200. OUT BSTR *pstrOut)
  201. {
  202. HRESULT hr;
  203. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  204. if (NULL != pdiViewColumn->pDispatch)
  205. {
  206. hr = DispatchInvoke(
  207. pdiViewColumn,
  208. VIEWCOL_GETDISPLAYNAME,
  209. 0,
  210. NULL,
  211. VT_BSTR,
  212. pstrOut);
  213. _JumpIfError(hr, error, "Invoke(GetDisplayName)");
  214. }
  215. else
  216. {
  217. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetDisplayName(pstrOut);
  218. _JumpIfError(hr, error, "GetDisplayName");
  219. }
  220. error:
  221. return(hr);
  222. }
  223. HRESULT
  224. ViewColumn_GetType(
  225. IN DISPATCHINTERFACE *pdiViewColumn,
  226. OUT LONG *pType)
  227. {
  228. HRESULT hr;
  229. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  230. if (NULL != pdiViewColumn->pDispatch)
  231. {
  232. hr = DispatchInvoke(
  233. pdiViewColumn,
  234. VIEWCOL_GETTYPE,
  235. 0,
  236. NULL,
  237. VT_I4,
  238. pType);
  239. _JumpIfError(hr, error, "Invoke(GetType)");
  240. }
  241. else
  242. {
  243. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetType(pType);
  244. _JumpIfError(hr, error, "GetType");
  245. }
  246. error:
  247. return(hr);
  248. }
  249. HRESULT
  250. ViewColumn_IsIndexed(
  251. IN DISPATCHINTERFACE *pdiViewColumn,
  252. OUT LONG *pIndexed)
  253. {
  254. HRESULT hr;
  255. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  256. if (NULL != pdiViewColumn->pDispatch)
  257. {
  258. hr = DispatchInvoke(
  259. pdiViewColumn,
  260. VIEWCOL_ISINDEXED,
  261. 0,
  262. NULL,
  263. VT_I4,
  264. pIndexed);
  265. _JumpIfError(hr, error, "Invoke(IsIndexed)");
  266. }
  267. else
  268. {
  269. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->IsIndexed(pIndexed);
  270. _JumpIfError(hr, error, "IsIndexed");
  271. }
  272. error:
  273. return(hr);
  274. }
  275. HRESULT
  276. ViewColumn_GetMaxLength(
  277. IN DISPATCHINTERFACE *pdiViewColumn,
  278. OUT LONG *pMaxLength)
  279. {
  280. HRESULT hr;
  281. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  282. if (NULL != pdiViewColumn->pDispatch)
  283. {
  284. hr = DispatchInvoke(
  285. pdiViewColumn,
  286. VIEWCOL_GETMAXLENGTH,
  287. 0,
  288. NULL,
  289. VT_I4,
  290. pMaxLength);
  291. _JumpIfError(hr, error, "Invoke(GetMaxLength)");
  292. }
  293. else
  294. {
  295. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetMaxLength(
  296. pMaxLength);
  297. _JumpIfError(hr, error, "GetMaxLength");
  298. }
  299. error:
  300. return(hr);
  301. }
  302. HRESULT
  303. ViewColumn_GetValue(
  304. IN DISPATCHINTERFACE *pdiViewColumn,
  305. IN LONG Flags,
  306. IN LONG ColumnType,
  307. OUT VOID *pColumnValue)
  308. {
  309. HRESULT hr;
  310. LONG RetType;
  311. VARIANT varResult;
  312. VariantInit(&varResult);
  313. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  314. switch (ColumnType)
  315. {
  316. case PROPTYPE_BINARY:
  317. case PROPTYPE_STRING:
  318. RetType = VT_BSTR;
  319. break;
  320. case PROPTYPE_DATE:
  321. RetType = VT_DATE;
  322. break;
  323. case PROPTYPE_LONG:
  324. RetType = VT_I4;
  325. break;
  326. default:
  327. hr = E_INVALIDARG;
  328. _JumpError(hr, error, "PropertyType");
  329. }
  330. if (NULL != pdiViewColumn->pDispatch)
  331. {
  332. VARIANT avar[1];
  333. avar[0].vt = VT_I4;
  334. avar[0].lVal = Flags;
  335. hr = DispatchInvoke(
  336. pdiViewColumn,
  337. VIEWCOL_GETVALUE,
  338. ARRAYSIZE(avar),
  339. avar,
  340. RetType,
  341. pColumnValue);
  342. _JumpIfError2(hr, error, "Invoke(GetValue)", CERTSRV_E_PROPERTY_EMPTY);
  343. }
  344. else
  345. {
  346. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetValue(
  347. Flags,
  348. &varResult);
  349. _JumpIfError(hr, error, "GetValue");
  350. hr = DispatchGetReturnValue(&varResult, RetType, pColumnValue);
  351. _JumpIfError2(hr, error, "DispatchGetReturnValue", CERTSRV_E_PROPERTY_EMPTY);
  352. }
  353. error:
  354. VariantClear(&varResult);
  355. return(hr);
  356. }
  357. HRESULT
  358. ViewColumn_Skip(
  359. IN DISPATCHINTERFACE *pdiViewColumn,
  360. IN LONG celt)
  361. {
  362. HRESULT hr;
  363. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  364. if (NULL != pdiViewColumn->pDispatch)
  365. {
  366. VARIANT avar[1];
  367. avar[0].vt = VT_I4;
  368. avar[0].lVal = celt;
  369. hr = DispatchInvoke(
  370. pdiViewColumn,
  371. VIEWCOL_SKIP,
  372. ARRAYSIZE(avar),
  373. avar,
  374. 0,
  375. NULL);
  376. _JumpIfError(hr, error, "Invoke(Skip)");
  377. }
  378. else
  379. {
  380. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Skip(celt);
  381. _JumpIfError(hr, error, "Skip");
  382. }
  383. error:
  384. return(hr);
  385. }
  386. HRESULT
  387. ViewColumn_Reset(
  388. IN DISPATCHINTERFACE *pdiViewColumn)
  389. {
  390. HRESULT hr;
  391. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  392. if (NULL != pdiViewColumn->pDispatch)
  393. {
  394. hr = DispatchInvoke(
  395. pdiViewColumn,
  396. VIEWCOL_RESET,
  397. 0,
  398. NULL,
  399. 0,
  400. NULL);
  401. _JumpIfError(hr, error, "Invoke(Reset)");
  402. }
  403. else
  404. {
  405. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Reset();
  406. _JumpIfError(hr, error, "Reset");
  407. }
  408. error:
  409. return(hr);
  410. }
  411. HRESULT
  412. ViewColumn_Clone(
  413. IN DISPATCHINTERFACE *pdiViewColumn,
  414. OUT DISPATCHINTERFACE *pdiViewColumnClone)
  415. {
  416. HRESULT hr;
  417. IEnumCERTVIEWCOLUMN *pEnumColumn = NULL;
  418. CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
  419. if (NULL != pdiViewColumn->pDispatch)
  420. {
  421. hr = DispatchInvoke(
  422. pdiViewColumn,
  423. VIEWCOL_CLONE,
  424. 0,
  425. NULL,
  426. VT_DISPATCH,
  427. &pEnumColumn);
  428. _JumpIfError(hr, error, "Invoke(Clone)");
  429. }
  430. else
  431. {
  432. hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Clone(
  433. &pEnumColumn);
  434. _JumpIfError(hr, error, "Clone");
  435. }
  436. hr = ViewColumn_Init2(
  437. NULL != pdiViewColumn->pDispatch,
  438. pEnumColumn,
  439. pdiViewColumnClone);
  440. _JumpIfError(hr, error, "ViewColumn_Init2");
  441. error:
  442. if (NULL != pEnumColumn)
  443. {
  444. pEnumColumn->Release();
  445. }
  446. return(hr);
  447. }