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.

838 lines
20 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1997.
  5. //
  6. // File: ods2ldap.cxx
  7. //
  8. // Contents: DSObject to LDAP Object Copy Routines
  9. //
  10. // Functions:
  11. //
  12. // History: 25-Feb-97 yihsins Created.
  13. //
  14. //
  15. //----------------------------------------------------------------------------
  16. #include "ldapc.hxx"
  17. HRESULT
  18. AdsTypeToLdapTypeCopyDNString(
  19. PADSVALUE lpAdsSrcValue,
  20. PLDAPOBJECT lpLdapDestObject,
  21. PDWORD pdwSyntaxId
  22. )
  23. {
  24. HRESULT hr = S_OK;
  25. if(lpAdsSrcValue->dwType != ADSTYPE_DN_STRING){
  26. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  27. }
  28. LDAPOBJECT_STRING(lpLdapDestObject) =
  29. (LPTSTR) AllocADsStr( lpAdsSrcValue->DNString );
  30. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  31. {
  32. hr = E_OUTOFMEMORY;
  33. RRETURN(hr);
  34. }
  35. *pdwSyntaxId = LDAPTYPE_DN;
  36. RRETURN(S_OK);
  37. }
  38. HRESULT
  39. AdsTypeToLdapTypeCopyCaseExactString(
  40. PADSVALUE lpAdsSrcValue,
  41. PLDAPOBJECT lpLdapDestObject,
  42. PDWORD pdwSyntaxId
  43. )
  44. {
  45. HRESULT hr = S_OK;
  46. if(lpAdsSrcValue->dwType != ADSTYPE_CASE_EXACT_STRING){
  47. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  48. }
  49. LDAPOBJECT_STRING(lpLdapDestObject) =
  50. (LPTSTR) AllocADsStr(lpAdsSrcValue->CaseExactString);
  51. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  52. {
  53. hr = E_OUTOFMEMORY;
  54. RRETURN(hr);
  55. }
  56. *pdwSyntaxId = LDAPTYPE_CASEEXACTSTRING;
  57. RRETURN(S_OK);
  58. }
  59. HRESULT
  60. AdsTypeToLdapTypeCopyCaseIgnoreString(
  61. PADSVALUE lpAdsSrcValue,
  62. PLDAPOBJECT lpLdapDestObject,
  63. PDWORD pdwSyntaxId
  64. )
  65. {
  66. HRESULT hr = S_OK;
  67. if(lpAdsSrcValue->dwType != ADSTYPE_CASE_IGNORE_STRING){
  68. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  69. }
  70. LDAPOBJECT_STRING(lpLdapDestObject) =
  71. (LPTSTR) AllocADsStr(lpAdsSrcValue->CaseIgnoreString);
  72. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  73. {
  74. hr = E_OUTOFMEMORY;
  75. RRETURN(hr);
  76. }
  77. *pdwSyntaxId = LDAPTYPE_CASEIGNORESTRING;
  78. RRETURN(S_OK);
  79. }
  80. HRESULT
  81. AdsTypeToLdapTypeCopyPrintableString(
  82. PADSVALUE lpAdsSrcValue,
  83. PLDAPOBJECT lpLdapDestObject,
  84. PDWORD pdwSyntaxId
  85. )
  86. {
  87. HRESULT hr = S_OK;
  88. if(lpAdsSrcValue->dwType != ADSTYPE_PRINTABLE_STRING){
  89. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  90. }
  91. LDAPOBJECT_STRING(lpLdapDestObject) =
  92. (LPTSTR) AllocADsStr( lpAdsSrcValue->PrintableString);
  93. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  94. {
  95. hr = E_OUTOFMEMORY;
  96. RRETURN(hr);
  97. }
  98. *pdwSyntaxId = LDAPTYPE_PRINTABLESTRING;
  99. RRETURN(S_OK);
  100. }
  101. HRESULT
  102. AdsTypeToLdapTypeCopyNumericString(
  103. PADSVALUE lpAdsSrcValue,
  104. PLDAPOBJECT lpLdapDestObject,
  105. PDWORD pdwSyntaxId
  106. )
  107. {
  108. HRESULT hr = S_OK;
  109. if(lpAdsSrcValue->dwType != ADSTYPE_NUMERIC_STRING){
  110. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  111. }
  112. LDAPOBJECT_STRING(lpLdapDestObject) =
  113. (LPTSTR) AllocADsStr( lpAdsSrcValue->NumericString );
  114. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  115. {
  116. hr = E_OUTOFMEMORY;
  117. RRETURN(hr);
  118. }
  119. *pdwSyntaxId = LDAPTYPE_NUMERICSTRING;
  120. RRETURN(S_OK);
  121. }
  122. HRESULT
  123. AdsTypeToLdapTypeCopyBoolean(
  124. PADSVALUE lpAdsSrcValue,
  125. PLDAPOBJECT lpLdapDestObject,
  126. PDWORD pdwSyntaxId
  127. )
  128. {
  129. HRESULT hr = S_OK;
  130. LPTSTR pszStr = NULL;
  131. if(lpAdsSrcValue->dwType != ADSTYPE_BOOLEAN){
  132. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  133. }
  134. if ( lpAdsSrcValue->Boolean )
  135. pszStr = TEXT("TRUE");
  136. else
  137. pszStr = TEXT("FALSE");
  138. LDAPOBJECT_STRING(lpLdapDestObject) = (LPTSTR) AllocADsStr( pszStr );
  139. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  140. {
  141. hr = E_OUTOFMEMORY;
  142. RRETURN(hr);
  143. }
  144. *pdwSyntaxId = LDAPTYPE_BOOLEAN;
  145. RRETURN(S_OK);
  146. }
  147. HRESULT
  148. AdsTypeToLdapTypeCopyInteger(
  149. PADSVALUE lpAdsSrcValue,
  150. PLDAPOBJECT lpLdapDestObject,
  151. PDWORD pdwSyntaxId
  152. )
  153. {
  154. HRESULT hr = S_OK;
  155. TCHAR Buffer[64];
  156. if(lpAdsSrcValue->dwType != ADSTYPE_INTEGER){
  157. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  158. }
  159. _itot( lpAdsSrcValue->Integer, Buffer, 10 );
  160. LDAPOBJECT_STRING(lpLdapDestObject) = (LPTSTR) AllocADsStr( Buffer );
  161. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  162. {
  163. hr = E_OUTOFMEMORY;
  164. RRETURN(hr);
  165. }
  166. *pdwSyntaxId = LDAPTYPE_INTEGER;
  167. RRETURN(S_OK);
  168. }
  169. HRESULT
  170. AdsTypeToLdapTypeCopyOctetString(
  171. PADSVALUE lpAdsSrcValue,
  172. PLDAPOBJECT pLdapDestObject,
  173. PDWORD pdwSyntaxId
  174. )
  175. {
  176. DWORD dwNumBytes = 0;
  177. HRESULT hr = S_OK;
  178. if(lpAdsSrcValue->dwType != ADSTYPE_OCTET_STRING){
  179. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  180. }
  181. dwNumBytes = lpAdsSrcValue->OctetString.dwLength;
  182. LDAPOBJECT_BERVAL(pLdapDestObject) =
  183. (struct berval *) AllocADsMem( sizeof(struct berval) + dwNumBytes );
  184. if ( LDAPOBJECT_BERVAL(pLdapDestObject) == NULL )
  185. {
  186. hr = E_OUTOFMEMORY;
  187. BAIL_ON_FAILURE(hr);
  188. }
  189. LDAPOBJECT_BERVAL_LEN(pLdapDestObject) = dwNumBytes;
  190. LDAPOBJECT_BERVAL_VAL(pLdapDestObject) = (CHAR *) ((LPBYTE) LDAPOBJECT_BERVAL(pLdapDestObject) + sizeof(struct berval));
  191. memcpy( LDAPOBJECT_BERVAL_VAL(pLdapDestObject),
  192. lpAdsSrcValue->OctetString.lpValue,
  193. dwNumBytes );
  194. *pdwSyntaxId = LDAPTYPE_OCTETSTRING;
  195. error:
  196. RRETURN(hr);
  197. }
  198. HRESULT
  199. AdsTypeToLdapTypeCopySecurityDescriptor(
  200. PADSVALUE lpAdsSrcValue,
  201. PLDAPOBJECT pLdapDestObject,
  202. PDWORD pdwSyntaxId
  203. )
  204. {
  205. DWORD dwNumBytes = 0;
  206. HRESULT hr = S_OK;
  207. if(lpAdsSrcValue->dwType != ADSTYPE_NT_SECURITY_DESCRIPTOR){
  208. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  209. }
  210. dwNumBytes = lpAdsSrcValue->SecurityDescriptor.dwLength;
  211. LDAPOBJECT_BERVAL(pLdapDestObject) =
  212. (struct berval *) AllocADsMem( sizeof(struct berval) + dwNumBytes );
  213. if ( LDAPOBJECT_BERVAL(pLdapDestObject) == NULL )
  214. {
  215. hr = E_OUTOFMEMORY;
  216. BAIL_ON_FAILURE(hr);
  217. }
  218. LDAPOBJECT_BERVAL_LEN(pLdapDestObject) = dwNumBytes;
  219. LDAPOBJECT_BERVAL_VAL(pLdapDestObject) =
  220. (CHAR *) ((LPBYTE) LDAPOBJECT_BERVAL(pLdapDestObject)
  221. + sizeof(struct berval));
  222. memcpy( LDAPOBJECT_BERVAL_VAL(pLdapDestObject),
  223. lpAdsSrcValue->SecurityDescriptor.lpValue,
  224. dwNumBytes );
  225. // Note that the type is set to OctetString as
  226. // LDAP does not know about the ntSecurityDescriptor type.
  227. *pdwSyntaxId = LDAPTYPE_SECURITY_DESCRIPTOR;
  228. error:
  229. RRETURN(hr);
  230. }
  231. HRESULT
  232. AdsTypeToLdapTypeCopyTime(
  233. PADSVALUE pAdsSrcValue,
  234. PLDAPOBJECT pLdapDestObject,
  235. PDWORD pdwSyntaxId
  236. )
  237. {
  238. HRESULT hr = S_OK;
  239. SYSTEMTIME *st = &pAdsSrcValue->UTCTime;
  240. //
  241. // For ldap server, we can only handle 1950 to 2049. So return an
  242. // error to user instead of translating time incorrectly without
  243. // warning. GeneralizedTime handles a much larger range and should
  244. // be used for new attributes.
  245. //
  246. if ( st->wYear<1950 || st->wYear>2049)
  247. RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
  248. if (pAdsSrcValue->dwType != ADSTYPE_UTC_TIME)
  249. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  250. // The string is just "YYMMDDHHMMSSZ".
  251. LDAPOBJECT_STRING(pLdapDestObject) =
  252. (PWSTR) AllocADsMem((13 + 1) * sizeof(WCHAR));
  253. if (LDAPOBJECT_STRING(pLdapDestObject) == NULL)
  254. RRETURN(hr = E_OUTOFMEMORY);
  255. wsprintf(LDAPOBJECT_STRING(pLdapDestObject),
  256. TEXT("%02d%02d%02d%02d%02d%02dZ"),
  257. st->wYear % 100, st->wMonth, st->wDay,
  258. st->wHour, st->wMinute, st->wSecond);
  259. *pdwSyntaxId = LDAPTYPE_UTCTIME;
  260. RRETURN(hr);
  261. }
  262. //
  263. // This is currently only used in ldapc\var2ldap.cxx.
  264. //
  265. HRESULT
  266. AdsTypeToLdapTypeCopyGeneralizedTime(
  267. PADSVALUE pAdsSrcValue,
  268. PLDAPOBJECT pLdapDestObject,
  269. PDWORD pdwSyntaxId
  270. )
  271. {
  272. HRESULT hr = S_OK;
  273. SYSTEMTIME *st = &pAdsSrcValue->UTCTime;
  274. if (pAdsSrcValue->dwType != ADSTYPE_UTC_TIME)
  275. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  276. //
  277. // ASN.1 spec says a GeneralizedTime can be no more than 24 chars.
  278. //
  279. LDAPOBJECT_STRING(pLdapDestObject) =
  280. (PWSTR) AllocADsMem((24 + 1) * sizeof(WCHAR));
  281. if (LDAPOBJECT_STRING(pLdapDestObject) == NULL)
  282. RRETURN(hr = E_OUTOFMEMORY);
  283. wsprintf(LDAPOBJECT_STRING(pLdapDestObject),
  284. TEXT("%04d%02d%02d%02d%02d%02d.%03dZ"),
  285. st->wYear, st->wMonth, st->wDay,
  286. st->wHour, st->wMinute, st->wSecond,
  287. st->wMilliseconds);
  288. *pdwSyntaxId = LDAPTYPE_GENERALIZEDTIME;
  289. RRETURN(hr);
  290. }
  291. HRESULT
  292. AdsTypeToLdapTypeCopyLargeInteger(
  293. PADSVALUE lpAdsSrcValue,
  294. PLDAPOBJECT lpLdapDestObject,
  295. PDWORD pdwSyntaxId
  296. )
  297. {
  298. HRESULT hr = S_OK;
  299. TCHAR Buffer[64];
  300. if(lpAdsSrcValue->dwType != ADSTYPE_LARGE_INTEGER){
  301. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  302. }
  303. swprintf (Buffer, L"%I64d", lpAdsSrcValue->LargeInteger);
  304. LDAPOBJECT_STRING(lpLdapDestObject) = (LPTSTR) AllocADsStr( Buffer );
  305. if ( LDAPOBJECT_STRING(lpLdapDestObject) == NULL )
  306. {
  307. hr = E_OUTOFMEMORY;
  308. RRETURN(hr);
  309. }
  310. *pdwSyntaxId = LDAPTYPE_INTEGER8;
  311. RRETURN(S_OK);
  312. }
  313. HRESULT
  314. AdsTypeToLdapTypeCopyProvSpecific(
  315. PADSVALUE lpAdsSrcValue,
  316. PLDAPOBJECT pLdapDestObject,
  317. PDWORD pdwSyntaxId
  318. )
  319. {
  320. DWORD dwNumBytes = 0;
  321. HRESULT hr = S_OK;
  322. if(lpAdsSrcValue->dwType != ADSTYPE_PROV_SPECIFIC){
  323. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  324. }
  325. dwNumBytes = lpAdsSrcValue->ProviderSpecific.dwLength;
  326. LDAPOBJECT_BERVAL(pLdapDestObject) =
  327. (struct berval *) AllocADsMem( sizeof(struct berval) + dwNumBytes );
  328. if ( LDAPOBJECT_BERVAL(pLdapDestObject) == NULL )
  329. {
  330. hr = E_OUTOFMEMORY;
  331. BAIL_ON_FAILURE(hr);
  332. }
  333. LDAPOBJECT_BERVAL_LEN(pLdapDestObject) = dwNumBytes;
  334. LDAPOBJECT_BERVAL_VAL(pLdapDestObject) = (CHAR *) ((LPBYTE) LDAPOBJECT_BERVAL(pLdapDestObject) + sizeof(struct berval));
  335. memcpy( LDAPOBJECT_BERVAL_VAL(pLdapDestObject),
  336. lpAdsSrcValue->ProviderSpecific.lpValue,
  337. dwNumBytes );
  338. *pdwSyntaxId = LDAPTYPE_OCTETSTRING;
  339. error:
  340. RRETURN(hr);
  341. }
  342. //
  343. // Conversion routine for DN With String.
  344. // Dn With String has the format :
  345. //
  346. // S:9:OurDomain:dc=ntdev,dc=microsoft,dc=com
  347. //
  348. // (9 chars in OurDomain) on the server.
  349. //
  350. //
  351. HRESULT
  352. AdsTypeToLdapTypeCopyDNWithString(
  353. PADSVALUE lpAdsSrcValue,
  354. PLDAPOBJECT lpLdapDestObject,
  355. PDWORD pdwSyntaxId
  356. )
  357. {
  358. HRESULT hr = S_OK;
  359. LPWSTR pszLdapStrVal = NULL;
  360. DWORD dwLengthStr = 0;
  361. DWORD dwTotalLength = 0;
  362. PADS_DN_WITH_STRING pDNStr = NULL;
  363. if (lpAdsSrcValue->dwType != ADSTYPE_DN_WITH_STRING) {
  364. BAIL_ON_FAILURE(hr = E_ADS_CANT_CONVERT_DATATYPE);
  365. }
  366. if (!lpAdsSrcValue->pDNWithString) {
  367. RRETURN(hr = E_FAIL);
  368. }
  369. pDNStr = lpAdsSrcValue->pDNWithString;
  370. //
  371. // Length is S:dwLength:Strval:
  372. // 2 10+1 dwLengthStr+2 (the : and \0)
  373. //
  374. dwTotalLength = 2 + 11 + 2;
  375. if (pDNStr->pszStringValue) {
  376. dwLengthStr = wcslen(pDNStr->pszStringValue);
  377. dwTotalLength += dwLengthStr;
  378. }
  379. if (pDNStr->pszDNString) {
  380. dwTotalLength += wcslen(pDNStr->pszDNString) + 1;
  381. }
  382. pszLdapStrVal = (LPWSTR) AllocADsMem(dwTotalLength * sizeof(WCHAR));
  383. if (!pszLdapStrVal) {
  384. BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
  385. }
  386. wsprintf(pszLdapStrVal, L"S:%lu:",dwLengthStr);
  387. //
  388. // tag on the string val if appropriate
  389. //
  390. if (dwLengthStr) {
  391. wcscat(pszLdapStrVal, pDNStr->pszStringValue);
  392. }
  393. wcscat(pszLdapStrVal, L":");
  394. //
  395. // Now for the actual DN - if one is there
  396. //
  397. if (pDNStr->pszDNString) {
  398. wcscat(pszLdapStrVal, pDNStr->pszDNString);
  399. }
  400. LDAPOBJECT_STRING(lpLdapDestObject) = pszLdapStrVal;
  401. *pdwSyntaxId = LDAPTYPE_DNWITHSTRING;
  402. error:
  403. RRETURN(hr);
  404. }
  405. //
  406. // Conversion routine for DN With Binary.
  407. // Dn With Binary has the format :
  408. //
  409. // B:32:a9d1ca15768811d1aded00c04fd8d5cd:dc=ntdev,dc=microsoft,dc=com
  410. //
  411. // (32 wchars = 16 bytes in this case a guid).
  412. //
  413. //
  414. HRESULT
  415. AdsTypeToLdapTypeCopyDNWithBinary(
  416. PADSVALUE lpAdsSrcValue,
  417. PLDAPOBJECT lpLdapDestObject,
  418. PDWORD pdwSyntaxId
  419. )
  420. {
  421. HRESULT hr = S_OK;
  422. WCHAR pszSmallStr[5];
  423. LPWSTR pszLdapStrVal = NULL;
  424. DWORD dwTotalLength = 0;
  425. PADS_DN_WITH_BINARY pDNBin = NULL;
  426. if (lpAdsSrcValue->dwType != ADSTYPE_DN_WITH_BINARY) {
  427. RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
  428. }
  429. if (!lpAdsSrcValue->pDNWithBinary) {
  430. RRETURN(E_FAIL);
  431. }
  432. pDNBin = lpAdsSrcValue->pDNWithBinary;
  433. //
  434. // B:xxx:octStr:DNString\0 at the end
  435. // 2+11+ x + 1 + y + 1 = 15 + x + y
  436. //
  437. dwTotalLength = 15;
  438. if (pDNBin->dwLength) {
  439. //
  440. // Add 2 * OctetString length as it is encoded as str.
  441. //
  442. dwTotalLength += 2 * (pDNBin->dwLength);
  443. }
  444. if (pDNBin->pszDNString) {
  445. dwTotalLength += wcslen(pDNBin->pszDNString);
  446. }
  447. pszLdapStrVal = (LPWSTR) AllocADsMem(dwTotalLength * sizeof(WCHAR));
  448. if (!pszLdapStrVal) {
  449. BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
  450. }
  451. wsprintf(pszLdapStrVal, L"B:%lu:",(pDNBin->dwLength) * 2);
  452. //
  453. // tag on the hex encoded string if appropriate
  454. //
  455. if (pDNBin->dwLength) {
  456. if (!pDNBin->lpBinaryValue) {
  457. BAIL_ON_FAILURE(hr = E_ADS_BAD_PARAMETER);
  458. }
  459. for (DWORD i = 0; i < pDNBin->dwLength; i++) {
  460. wsprintf(pszSmallStr, L"%02x", pDNBin->lpBinaryValue[i]);
  461. wcscat(pszLdapStrVal, pszSmallStr);
  462. }
  463. }
  464. wcscat(pszLdapStrVal, L":");
  465. //
  466. // Now for the actual DN - if one is there
  467. //
  468. if (pDNBin->pszDNString) {
  469. wcscat(pszLdapStrVal, pDNBin->pszDNString);
  470. }
  471. LDAPOBJECT_STRING(lpLdapDestObject) = pszLdapStrVal;
  472. *pdwSyntaxId = LDAPTYPE_DNWITHBINARY;
  473. error:
  474. if (FAILED(hr)) {
  475. FreeADsMem(pszLdapStrVal);
  476. }
  477. RRETURN(hr);
  478. }
  479. HRESULT
  480. AdsTypeToLdapTypeCopy(
  481. PADSVALUE lpAdsSrcValue,
  482. PLDAPOBJECT lpLdapDestObject,
  483. BOOL *pfIsString,
  484. PDWORD pdwSyntaxId,
  485. BOOL fGenTime
  486. )
  487. {
  488. HRESULT hr = S_OK;
  489. *pfIsString = TRUE; // This will only be FALSE when the ADSVALUE
  490. // contains octet strings
  491. switch (lpAdsSrcValue->dwType){
  492. case ADSTYPE_DN_STRING:
  493. hr = AdsTypeToLdapTypeCopyDNString(
  494. lpAdsSrcValue,
  495. lpLdapDestObject,
  496. pdwSyntaxId
  497. );
  498. break;
  499. case ADSTYPE_CASE_EXACT_STRING:
  500. hr = AdsTypeToLdapTypeCopyCaseExactString(
  501. lpAdsSrcValue,
  502. lpLdapDestObject,
  503. pdwSyntaxId
  504. );
  505. break;
  506. case ADSTYPE_CASE_IGNORE_STRING:
  507. hr = AdsTypeToLdapTypeCopyCaseIgnoreString(
  508. lpAdsSrcValue,
  509. lpLdapDestObject,
  510. pdwSyntaxId
  511. );
  512. break;
  513. case ADSTYPE_PRINTABLE_STRING:
  514. hr = AdsTypeToLdapTypeCopyPrintableString(
  515. lpAdsSrcValue,
  516. lpLdapDestObject,
  517. pdwSyntaxId
  518. );
  519. break;
  520. case ADSTYPE_NUMERIC_STRING:
  521. hr = AdsTypeToLdapTypeCopyNumericString(
  522. lpAdsSrcValue,
  523. lpLdapDestObject,
  524. pdwSyntaxId
  525. );
  526. break;
  527. case ADSTYPE_BOOLEAN:
  528. hr = AdsTypeToLdapTypeCopyBoolean(
  529. lpAdsSrcValue,
  530. lpLdapDestObject,
  531. pdwSyntaxId
  532. );
  533. break;
  534. case ADSTYPE_INTEGER:
  535. hr = AdsTypeToLdapTypeCopyInteger(
  536. lpAdsSrcValue,
  537. lpLdapDestObject,
  538. pdwSyntaxId
  539. );
  540. break;
  541. case ADSTYPE_OCTET_STRING:
  542. *pfIsString = FALSE;
  543. hr = AdsTypeToLdapTypeCopyOctetString(
  544. lpAdsSrcValue,
  545. lpLdapDestObject,
  546. pdwSyntaxId
  547. );
  548. break;
  549. case ADSTYPE_UTC_TIME:
  550. if (fGenTime) {
  551. //
  552. // Treat as gentime not UTCTime
  553. //
  554. hr = AdsTypeToLdapTypeCopyGeneralizedTime(
  555. lpAdsSrcValue,
  556. lpLdapDestObject,
  557. pdwSyntaxId
  558. );
  559. }
  560. else {
  561. hr = AdsTypeToLdapTypeCopyTime(
  562. lpAdsSrcValue,
  563. lpLdapDestObject,
  564. pdwSyntaxId
  565. );
  566. }
  567. break;
  568. case ADSTYPE_LARGE_INTEGER:
  569. hr = AdsTypeToLdapTypeCopyLargeInteger(
  570. lpAdsSrcValue,
  571. lpLdapDestObject,
  572. pdwSyntaxId
  573. );
  574. break;
  575. case ADSTYPE_PROV_SPECIFIC:
  576. *pfIsString = FALSE;
  577. hr = AdsTypeToLdapTypeCopyProvSpecific(
  578. lpAdsSrcValue,
  579. lpLdapDestObject,
  580. pdwSyntaxId
  581. );
  582. break;
  583. case ADSTYPE_NT_SECURITY_DESCRIPTOR:
  584. *pfIsString = FALSE;
  585. hr = AdsTypeToLdapTypeCopySecurityDescriptor(
  586. lpAdsSrcValue,
  587. lpLdapDestObject,
  588. pdwSyntaxId
  589. );
  590. break;
  591. case ADSTYPE_DN_WITH_BINARY:
  592. *pfIsString = TRUE;
  593. hr = AdsTypeToLdapTypeCopyDNWithBinary(
  594. lpAdsSrcValue,
  595. lpLdapDestObject,
  596. pdwSyntaxId
  597. );
  598. break;
  599. case ADSTYPE_DN_WITH_STRING:
  600. *pfIsString = TRUE;
  601. hr = AdsTypeToLdapTypeCopyDNWithString(
  602. lpAdsSrcValue,
  603. lpLdapDestObject,
  604. pdwSyntaxId
  605. );
  606. break;
  607. default:
  608. hr = E_ADS_CANT_CONVERT_DATATYPE;
  609. *pdwSyntaxId =0;
  610. break;
  611. }
  612. RRETURN(hr);
  613. }
  614. HRESULT
  615. AdsTypeToLdapTypeCopyConstruct(
  616. LPADSVALUE pAdsSrcValues,
  617. DWORD dwNumObjects,
  618. LDAPOBJECTARRAY *pLdapDestObjects,
  619. PDWORD pdwSyntaxId,
  620. BOOL fGenTime
  621. )
  622. {
  623. DWORD i = 0;
  624. HRESULT hr = S_OK;
  625. if ( dwNumObjects == 0 )
  626. {
  627. pLdapDestObjects->dwCount = 0;
  628. pLdapDestObjects->pLdapObjects = NULL;
  629. RRETURN(S_OK);
  630. }
  631. pLdapDestObjects->pLdapObjects = (PLDAPOBJECT)AllocADsMem(
  632. (dwNumObjects+1) * sizeof(LDAPOBJECT));
  633. if ( pLdapDestObjects->pLdapObjects == NULL )
  634. RRETURN(E_OUTOFMEMORY);
  635. pLdapDestObjects->dwCount = dwNumObjects;
  636. for (i = 0; i < dwNumObjects; i++ ) {
  637. hr = AdsTypeToLdapTypeCopy(
  638. pAdsSrcValues + i,
  639. pLdapDestObjects->pLdapObjects + i,
  640. &(pLdapDestObjects->fIsString),
  641. pdwSyntaxId,
  642. fGenTime
  643. );
  644. BAIL_ON_FAILURE(hr);
  645. }
  646. RRETURN(S_OK);
  647. error:
  648. LdapTypeFreeLdapObjects( pLdapDestObjects );
  649. RRETURN(hr);
  650. }