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.

147 lines
3.4 KiB

  1. /**********************************************************************/
  2. /** Microsoft Passport **/
  3. /** Copyright(c) Microsoft Corporation, 1999 - 2001 **/
  4. /**********************************************************************/
  5. /*
  6. variantutils.h
  7. helper funcs for Variant
  8. FILE HISTORY:
  9. */
  10. #ifndef PP_VARIANT_UTILS
  11. #define PP_VARIANT_UTILS
  12. #define DEFAULTARG(v) (v.vt==VT_ERROR && v.scode==DISP_E_PARAMNOTFOUND)
  13. #define HASARG(v) (v.vt!=VT_ERROR || v.scode!=DISP_E_PARAMNOTFOUND)
  14. #define CV_OK 0
  15. #define CV_DEFAULT 1
  16. #define CV_BAD 2
  17. #define CV_FREE 3
  18. inline int GetIntArg(VARIANT &vIn, int *out)
  19. {
  20. if (DEFAULTARG(vIn))
  21. return CV_DEFAULT;
  22. switch (vIn.vt)
  23. {
  24. case VT_I4:
  25. *out = vIn.lVal;
  26. return CV_OK;
  27. case VT_I2:
  28. *out = vIn.iVal;
  29. return CV_OK;
  30. case VT_I4 | VT_BYREF:
  31. *out = *vIn.plVal;
  32. return CV_OK;
  33. case VT_I2 | VT_BYREF:
  34. *out = *vIn.piVal;
  35. return CV_OK;
  36. }
  37. VARIANT vConv;
  38. VariantInit(&vConv);
  39. if (VariantChangeType(&vConv, &vIn, 0, VT_I4) == S_OK)
  40. {
  41. *out = vConv.lVal;
  42. return CV_OK;
  43. }
  44. else
  45. return CV_BAD;
  46. }
  47. inline int GetShortArg(VARIANT &vIn, USHORT *out)
  48. {
  49. if (DEFAULTARG(vIn))
  50. return CV_DEFAULT;
  51. switch (vIn.vt)
  52. {
  53. case VT_I4:
  54. *out = static_cast<unsigned short>(vIn.lVal);
  55. return CV_OK;
  56. case VT_UI4:
  57. *out = static_cast<unsigned short>(vIn.ulVal);
  58. return CV_OK;
  59. case VT_I2:
  60. *out = static_cast<unsigned short>(vIn.iVal);
  61. return CV_OK;
  62. case VT_UI2:
  63. *out = static_cast<unsigned short>(vIn.uiVal);
  64. return CV_OK;
  65. case VT_I4 | VT_BYREF:
  66. *out = static_cast<unsigned short>(*vIn.plVal);
  67. return CV_OK;
  68. case VT_UI4 | VT_BYREF:
  69. *out = static_cast<unsigned short>(*vIn.pulVal);
  70. return CV_OK;
  71. case VT_I2 | VT_BYREF:
  72. *out = static_cast<unsigned short>(*vIn.piVal);
  73. return CV_OK;
  74. case VT_UI2 | VT_BYREF:
  75. *out = static_cast<unsigned short>(*vIn.puiVal);
  76. return CV_OK;
  77. }
  78. VARIANT vConv;
  79. VariantInit(&vConv);
  80. if (VariantChangeType(&vConv, &vIn, 0, VT_UI2) == S_OK)
  81. {
  82. *out = vConv.iVal;
  83. return CV_OK;
  84. }
  85. else
  86. return CV_BAD;
  87. }
  88. inline int GetBoolArg(VARIANT &vIn, VARIANT_BOOL *out)
  89. {
  90. if (DEFAULTARG(vIn))
  91. return CV_DEFAULT;
  92. switch (vIn.vt)
  93. {
  94. case VT_BOOL:
  95. *out = vIn.boolVal;
  96. return CV_OK;
  97. case VT_BOOL | VT_BYREF:
  98. *out = *vIn.pboolVal;
  99. return CV_OK;
  100. }
  101. VARIANT vConv;
  102. VariantInit(&vConv);
  103. if (VariantChangeType(&vConv, &vIn, 0, VT_BOOL) == S_OK)
  104. {
  105. *out = vConv.boolVal;
  106. return CV_OK;
  107. }
  108. else
  109. return CV_BAD;
  110. }
  111. inline int GetBstrArg(VARIANT &vIn, BSTR *out)
  112. {
  113. if (DEFAULTARG(vIn))
  114. return CV_DEFAULT;
  115. switch (vIn.vt)
  116. {
  117. case VT_BSTR:
  118. *out = vIn.bstrVal;
  119. return CV_OK;
  120. case VT_BSTR | VT_BYREF:
  121. *out = *vIn.pbstrVal;
  122. return CV_OK;
  123. case VT_VARIANT | VT_BYREF:
  124. return GetBstrArg(*vIn.pvarVal, out);
  125. }
  126. VARIANT vConv;
  127. VariantInit(&vConv);
  128. if (VariantChangeType(&vConv, &vIn, 0, VT_BSTR) == S_OK)
  129. {
  130. *out = vConv.bstrVal;
  131. return CV_FREE;
  132. }
  133. else
  134. return CV_BAD;
  135. }
  136. #endif