Source code of Windows XP (NT5)
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.

362 lines
6.9 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: var2winnt.cxx
  7. //
  8. // Contents:
  9. //
  10. // Functions:
  11. //
  12. // History: 13-June-1996 RamV Created.
  13. //
  14. //
  15. // Issues: Check null ptrs for AllocADsMem and AllocADsStr
  16. //
  17. //----------------------------------------------------------------------------
  18. #include "winnt.hxx"
  19. #pragma hdrstop
  20. #define INITGUID
  21. //
  22. // WinNT objects copy code
  23. //
  24. HRESULT
  25. VarTypeToWinNTTypeCopyBOOL(
  26. PVARIANT lpVarSrcObject,
  27. PNTOBJECT pNTDestValue
  28. )
  29. {
  30. HRESULT hr = S_OK;
  31. if(!lpVarSrcObject){
  32. RRETURN(E_POINTER);
  33. }
  34. if(lpVarSrcObject->vt != VT_BOOL){
  35. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  36. }
  37. pNTDestValue->NTType = NT_SYNTAX_ID_BOOL;
  38. if(lpVarSrcObject->boolVal){
  39. (pNTDestValue->NTValue).fValue = TRUE;
  40. } else {
  41. (pNTDestValue->NTValue).fValue = FALSE;
  42. }
  43. RRETURN(hr);
  44. }
  45. HRESULT
  46. VarTypeToWinNTTypeCopySYSTEMTIME(
  47. PVARIANT lpVarSrcObject,
  48. PNTOBJECT pNTDestValue
  49. )
  50. {
  51. HRESULT hr = S_OK;
  52. if(!lpVarSrcObject){
  53. RRETURN(E_POINTER);
  54. }
  55. if(lpVarSrcObject->vt != VT_DATE){
  56. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  57. }
  58. hr = ConvertDATEToSYSTEMTIME(lpVarSrcObject->date,
  59. &(pNTDestValue->NTValue.stSystemTimeValue) );
  60. RRETURN( hr );
  61. }
  62. HRESULT
  63. VarTypeToWinNTTypeCopyDWORD(
  64. PVARIANT lpVarSrcObject,
  65. PNTOBJECT pNTDestValue
  66. )
  67. {
  68. HRESULT hr = S_OK;
  69. if(lpVarSrcObject->vt == VT_I4){
  70. (pNTDestValue->NTValue).dwValue =
  71. (DWORD)lpVarSrcObject->lVal;
  72. }
  73. else if (lpVarSrcObject->vt == VT_I2) {
  74. (pNTDestValue->NTValue).dwValue =
  75. (DWORD)lpVarSrcObject->iVal;
  76. }
  77. else {
  78. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  79. }
  80. pNTDestValue->NTType = NT_SYNTAX_ID_DWORD;
  81. RRETURN(hr);
  82. }
  83. HRESULT
  84. VarTypeToWinNTTypeCopyDATE(
  85. PVARIANT lpVarSrcObject,
  86. PNTOBJECT pNTDestValue
  87. )
  88. {
  89. HRESULT hr = S_OK;
  90. SYSTEMTIME stTime;
  91. if(lpVarSrcObject->vt != VT_DATE){
  92. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  93. }
  94. pNTDestValue->NTType = NT_SYNTAX_ID_DATE;
  95. //
  96. // Note carefully! date is supplied as a value which is < 1 however
  97. // VariantTimeToDosDateTime complains when given a value < 30000.
  98. // (Number of days between 1900 and 1980). So
  99. // we add 35000 to make it a legal value.
  100. //
  101. hr = ConvertDATEToSYSTEMTIME(lpVarSrcObject->date+ 35000,
  102. &stTime);
  103. BAIL_ON_FAILURE(hr);
  104. (pNTDestValue->NTValue).dwValue = stTime.wHour*60 + stTime.wMinute ;
  105. error:
  106. RRETURN(hr);
  107. }
  108. HRESULT
  109. VarTypeToWinNTTypeCopyDATE70(
  110. PVARIANT lpVarSrcObject,
  111. PNTOBJECT pNTDestValue
  112. )
  113. {
  114. HRESULT hr = S_OK;
  115. SYSTEMTIME stTime;
  116. DWORD dwSeconds1970 = 0;
  117. if(lpVarSrcObject->vt != VT_DATE){
  118. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  119. }
  120. pNTDestValue->NTType = NT_SYNTAX_ID_DATE_1970;
  121. hr = ConvertDATEtoDWORD(
  122. lpVarSrcObject->date,
  123. &dwSeconds1970
  124. );
  125. BAIL_ON_FAILURE(hr);
  126. (pNTDestValue->NTValue).dwSeconds1970 = dwSeconds1970 ;
  127. error:
  128. RRETURN(hr);
  129. }
  130. HRESULT
  131. VarTypeToWinNTTypeCopyLPTSTR(
  132. PVARIANT lpVarSrcObject,
  133. PNTOBJECT pNTDestValue
  134. )
  135. {
  136. HRESULT hr = S_OK;
  137. if(lpVarSrcObject->vt != VT_BSTR){
  138. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  139. }
  140. pNTDestValue->NTType = NT_SYNTAX_ID_LPTSTR;
  141. (pNTDestValue->NTValue).pszValue =
  142. AllocADsStr(lpVarSrcObject->bstrVal);
  143. if(!(pNTDestValue->NTValue).pszValue){
  144. hr = E_OUTOFMEMORY;
  145. }
  146. RRETURN(hr);
  147. }
  148. HRESULT
  149. VarTypeToWinNTTypeCopyOctetString(
  150. PVARIANT lpVarSrcObject,
  151. PNTOBJECT pNTDestValue
  152. )
  153. {
  154. HRESULT hr = S_OK;
  155. pNTDestValue->NTType = NT_SYNTAX_ID_OCTETSTRING;
  156. hr = VariantToBinary(
  157. lpVarSrcObject,
  158. &(pNTDestValue->NTValue).octetstring.dwSize,
  159. &(pNTDestValue->NTValue).octetstring.pByte);
  160. RRETURN(hr);
  161. }
  162. HRESULT
  163. VarTypeToNtTypeCopy(
  164. DWORD dwNtType,
  165. PVARIANT lpVarSrcObject,
  166. PNTOBJECT lpNtDestObject
  167. )
  168. {
  169. HRESULT hr = S_OK;
  170. switch (dwNtType){
  171. case NT_SYNTAX_ID_BOOL:
  172. hr = VarTypeToWinNTTypeCopyBOOL(
  173. lpVarSrcObject,
  174. lpNtDestObject
  175. );
  176. break;
  177. case NT_SYNTAX_ID_SYSTEMTIME:
  178. hr = VarTypeToWinNTTypeCopySYSTEMTIME(
  179. lpVarSrcObject,
  180. lpNtDestObject
  181. );
  182. break;
  183. case NT_SYNTAX_ID_DWORD:
  184. hr = VarTypeToWinNTTypeCopyDWORD(
  185. lpVarSrcObject,
  186. lpNtDestObject
  187. );
  188. break;
  189. case NT_SYNTAX_ID_DATE:
  190. hr = VarTypeToWinNTTypeCopyDATE(
  191. lpVarSrcObject,
  192. lpNtDestObject
  193. );
  194. break;
  195. case NT_SYNTAX_ID_DATE_1970:
  196. hr = VarTypeToWinNTTypeCopyDATE70(
  197. lpVarSrcObject,
  198. lpNtDestObject
  199. );
  200. break;
  201. case NT_SYNTAX_ID_LPTSTR:
  202. hr = VarTypeToWinNTTypeCopyLPTSTR(
  203. lpVarSrcObject,
  204. lpNtDestObject
  205. );
  206. break;
  207. case NT_SYNTAX_ID_DelimitedString:
  208. hr = VarTypeToWinNTTypeCopyLPTSTR(
  209. lpVarSrcObject,
  210. lpNtDestObject
  211. );
  212. lpNtDestObject->NTType = NT_SYNTAX_ID_DelimitedString;
  213. break;
  214. case NT_SYNTAX_ID_NulledString:
  215. hr = VarTypeToWinNTTypeCopyLPTSTR(
  216. lpVarSrcObject,
  217. lpNtDestObject
  218. );
  219. lpNtDestObject->NTType = NT_SYNTAX_ID_NulledString;
  220. break;
  221. case NT_SYNTAX_ID_OCTETSTRING:
  222. hr = VarTypeToWinNTTypeCopyOctetString(
  223. lpVarSrcObject,
  224. lpNtDestObject
  225. );
  226. lpNtDestObject->NTType = NT_SYNTAX_ID_OCTETSTRING;
  227. break;
  228. default:
  229. hr = E_FAIL;
  230. break;
  231. }
  232. RRETURN(hr);
  233. }
  234. HRESULT
  235. VarTypeToNtTypeCopyConstruct(
  236. DWORD dwNtType,
  237. LPVARIANT pVarSrcObjects,
  238. DWORD dwNumObjects,
  239. LPNTOBJECT * ppNtDestObjects
  240. )
  241. {
  242. DWORD i = 0;
  243. LPNTOBJECT pNtDestObjects = NULL;
  244. HRESULT hr = S_OK;
  245. pNtDestObjects = (LPNTOBJECT)AllocADsMem(
  246. dwNumObjects * sizeof(NTOBJECT)
  247. );
  248. if (!pNtDestObjects) {
  249. RRETURN(E_FAIL);
  250. }
  251. for (i = 0; i < dwNumObjects; i++ ) {
  252. hr = VarTypeToNtTypeCopy(
  253. dwNtType,
  254. pVarSrcObjects + i,
  255. pNtDestObjects + i
  256. );
  257. BAIL_ON_FAILURE(hr);
  258. }
  259. *ppNtDestObjects = pNtDestObjects;
  260. RRETURN(S_OK);
  261. error:
  262. if (pNtDestObjects) {
  263. FreeADsMem(pNtDestObjects);
  264. }
  265. *ppNtDestObjects = NULL;
  266. RRETURN(hr);
  267. }