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.

1005 lines
26 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: ods2nds.cxx
  7. //
  8. // Contents: NDS Object to Variant Copy Routines
  9. //
  10. // Functions:
  11. //
  12. // History: 25-Apr-96 KrishnaG Created.
  13. //
  14. //
  15. // Issues: Check null ptrs for AllocADsMem and AllocADsStr
  16. //
  17. //----------------------------------------------------------------------------
  18. #include "nds.hxx"
  19. HRESULT
  20. AdsTypeToNdsTypeCopyDNString(
  21. PADSVALUE lpAdsSrcValue,
  22. PNDSOBJECT lpNdsDestObject
  23. )
  24. {
  25. HRESULT hr = S_OK;
  26. if(lpAdsSrcValue->dwType != ADSTYPE_DN_STRING){
  27. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  28. }
  29. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_1;
  30. lpNdsDestObject->NdsValue.value_1.DNString =
  31. AllocADsStr(
  32. lpAdsSrcValue->DNString
  33. );
  34. if (!lpNdsDestObject->NdsValue.value_1.DNString) {
  35. hr = E_OUTOFMEMORY;
  36. }
  37. RRETURN(hr);
  38. }
  39. HRESULT
  40. AdsTypeToNdsTypeCopyCaseExactString(
  41. PADSVALUE lpAdsSrcValue,
  42. PNDSOBJECT lpNdsDestObject
  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. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_2;
  50. lpNdsDestObject->NdsValue.value_2.CaseExactString =
  51. AllocADsStr(
  52. lpAdsSrcValue->CaseExactString
  53. );
  54. if (!lpNdsDestObject->NdsValue.value_2.CaseExactString) {
  55. hr = E_OUTOFMEMORY;
  56. }
  57. RRETURN(hr);
  58. }
  59. HRESULT
  60. AdsTypeToNdsTypeCopyCaseIgnoreList(
  61. PADSVALUE lpAdsSrcValue,
  62. PNDSOBJECT lpNdsDestObject
  63. )
  64. {
  65. HRESULT hr = S_OK;
  66. PADS_PROV_SPECIFIC test;
  67. PADS_CASEIGNORE_LIST pAdsNext = lpAdsSrcValue->pCaseIgnoreList;
  68. struct _NDS_CI_LIST *pNdsOutput = &lpNdsDestObject->NdsValue.value_6;
  69. struct _NDS_CI_LIST *pNdsCurrent = NULL;
  70. if(lpAdsSrcValue->dwType != ADSTYPE_CASEIGNORE_LIST){
  71. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  72. }
  73. if (pAdsNext == NULL) {
  74. hr = E_FAIL;
  75. BAIL_ON_FAILURE(hr);
  76. }
  77. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_6;
  78. pNdsOutput->String = AllocADsStr(pAdsNext->String);
  79. if (!pNdsOutput->String ) {
  80. hr = E_OUTOFMEMORY;
  81. BAIL_ON_FAILURE(hr);
  82. }
  83. pAdsNext = pAdsNext->Next;
  84. while (pAdsNext) {
  85. pNdsCurrent = (struct _NDS_CI_LIST *)AllocADsMem(sizeof(struct _NDS_CI_LIST));
  86. if (!pNdsCurrent) {
  87. hr = E_OUTOFMEMORY;
  88. BAIL_ON_FAILURE(hr);
  89. }
  90. pNdsCurrent->String = AllocADsStr(pAdsNext->String);
  91. if (!pNdsCurrent->String ) {
  92. hr = E_OUTOFMEMORY;
  93. BAIL_ON_FAILURE(hr);
  94. }
  95. pNdsOutput->Next = pNdsCurrent;
  96. pNdsOutput = pNdsOutput->Next;
  97. pAdsNext = pAdsNext->Next;
  98. }
  99. pNdsOutput->Next = NULL;
  100. error:
  101. RRETURN(hr);
  102. }
  103. HRESULT
  104. AdsTypeToNdsTypeCopyOctetList(
  105. PADSVALUE lpAdsSrcValue,
  106. PNDSOBJECT lpNdsDestObject
  107. )
  108. {
  109. HRESULT hr = S_OK;
  110. PADS_OCTET_LIST pAdsNext = lpAdsSrcValue->pOctetList;
  111. struct _NDS_OCTET_LIST *pNdsOutput = &lpNdsDestObject->NdsValue.value_13;
  112. struct _NDS_OCTET_LIST *pNdsCurrent = NULL;
  113. if(lpAdsSrcValue->dwType != ADSTYPE_OCTET_LIST){
  114. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  115. }
  116. if (pAdsNext == NULL) {
  117. hr = E_FAIL;
  118. RRETURN(hr);
  119. }
  120. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_13;
  121. pNdsOutput->Next = NULL;
  122. pNdsOutput->Data = NULL;
  123. hr = CopyOctetString(pAdsNext->Length,
  124. pAdsNext->Data,
  125. &pNdsOutput->Length,
  126. &pNdsOutput->Data);
  127. BAIL_ON_FAILURE(hr);
  128. pAdsNext = pAdsNext->Next;
  129. while (pAdsNext) {
  130. pNdsCurrent = (struct _NDS_OCTET_LIST *)AllocADsMem(sizeof(struct _NDS_CI_LIST));
  131. if (!pNdsCurrent) {
  132. hr = E_OUTOFMEMORY;
  133. BAIL_ON_FAILURE(hr);
  134. }
  135. pNdsCurrent->Next = NULL;
  136. pNdsCurrent->Data = NULL;
  137. hr = CopyOctetString(pAdsNext->Length,
  138. pAdsNext->Data,
  139. &pNdsCurrent->Length,
  140. &pNdsCurrent->Data);
  141. if (FAILED(hr)) {
  142. FreeADsMem(pNdsCurrent);
  143. BAIL_ON_FAILURE(hr);
  144. }
  145. pNdsOutput->Next = pNdsCurrent;
  146. pNdsOutput = pNdsCurrent;
  147. pAdsNext = pAdsNext->Next;
  148. }
  149. pNdsOutput->Next = NULL;
  150. RRETURN(hr);
  151. error:
  152. if (lpNdsDestObject->NdsValue.value_13.Data) {
  153. FreeADsMem(lpNdsDestObject->NdsValue.value_13.Data);
  154. }
  155. pNdsOutput = lpNdsDestObject->NdsValue.value_13.Next;
  156. while (pNdsOutput) {
  157. if (pNdsOutput->Data) {
  158. FreeADsMem(pNdsOutput->Data);
  159. }
  160. pNdsCurrent = pNdsOutput->Next;
  161. FreeADsMem(pNdsOutput);
  162. pNdsOutput = pNdsCurrent;
  163. }
  164. RRETURN(hr);
  165. }
  166. HRESULT
  167. AdsTypeToNdsTypeCopyPath(
  168. PADSVALUE lpAdsSrcValue,
  169. PNDSOBJECT lpNdsDestObject
  170. )
  171. {
  172. HRESULT hr = S_OK;
  173. if(lpAdsSrcValue->dwType != ADSTYPE_PATH){
  174. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  175. }
  176. if (lpAdsSrcValue->pPath == NULL) {
  177. hr = E_FAIL;
  178. BAIL_ON_FAILURE(hr);
  179. }
  180. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_15;
  181. lpNdsDestObject->NdsValue.value_15.VolumeName =
  182. AllocADsStr(
  183. lpAdsSrcValue->pPath->VolumeName
  184. );
  185. if (!lpNdsDestObject->NdsValue.value_15.VolumeName) {
  186. hr = E_OUTOFMEMORY;
  187. BAIL_ON_FAILURE(hr);
  188. }
  189. lpNdsDestObject->NdsValue.value_15.Path=
  190. AllocADsStr(
  191. lpAdsSrcValue->pPath->Path
  192. );
  193. if (!lpNdsDestObject->NdsValue.value_15.Path) {
  194. hr = E_OUTOFMEMORY;
  195. BAIL_ON_FAILURE(hr);
  196. }
  197. lpNdsDestObject->NdsValue.value_15.Type =
  198. lpAdsSrcValue->pPath->Type;
  199. error:
  200. RRETURN(hr);
  201. }
  202. HRESULT
  203. AdsTypeToNdsTypeCopyPostalAddress(
  204. PADSVALUE lpAdsSrcValue,
  205. PNDSOBJECT lpNdsDestObject
  206. )
  207. {
  208. HRESULT hr = S_OK;
  209. long i;
  210. if(lpAdsSrcValue->dwType != ADSTYPE_POSTALADDRESS){
  211. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  212. }
  213. if (lpAdsSrcValue->pPostalAddress == NULL) {
  214. hr = E_FAIL;
  215. BAIL_ON_FAILURE(hr);
  216. }
  217. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_18;
  218. for (i=0;i<6;i++) {
  219. if (lpAdsSrcValue->pPostalAddress->PostalAddress[i]) {
  220. lpNdsDestObject->NdsValue.value_18.PostalAddress[i] =
  221. AllocADsStr(
  222. lpAdsSrcValue->pPostalAddress->PostalAddress[i]
  223. );
  224. if (!lpNdsDestObject->NdsValue.value_18.PostalAddress[i]) {
  225. hr = E_OUTOFMEMORY;
  226. BAIL_ON_FAILURE(hr);
  227. }
  228. }
  229. else {
  230. lpNdsDestObject->NdsValue.value_18.PostalAddress[i] =
  231. AllocADsStr(
  232. L""
  233. );
  234. }
  235. }
  236. error:
  237. RRETURN(hr);
  238. }
  239. HRESULT
  240. AdsTypeToNdsTypeCopyNdsTime(
  241. PADSVALUE lpAdsSrcValue,
  242. PNDSOBJECT lpNdsDestObject
  243. )
  244. {
  245. HRESULT hr = S_OK;
  246. if(lpAdsSrcValue->dwType != ADSTYPE_TIMESTAMP){
  247. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  248. }
  249. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_19;
  250. lpNdsDestObject->NdsValue.value_19.WholeSeconds =
  251. lpAdsSrcValue->Timestamp.WholeSeconds;
  252. lpNdsDestObject->NdsValue.value_19.EventID =
  253. lpAdsSrcValue->Timestamp.EventID;
  254. RRETURN(hr);
  255. }
  256. HRESULT
  257. AdsTypeToNdsTypeCopyBackLink(
  258. PADSVALUE lpAdsSrcValue,
  259. PNDSOBJECT lpNdsDestObject
  260. )
  261. {
  262. HRESULT hr = S_OK;
  263. if(lpAdsSrcValue->dwType != ADSTYPE_BACKLINK){
  264. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  265. }
  266. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_23;
  267. lpNdsDestObject->NdsValue.value_23.ObjectName =
  268. AllocADsStr(
  269. lpAdsSrcValue->BackLink.ObjectName
  270. );
  271. if (!lpNdsDestObject->NdsValue.value_23.ObjectName) {
  272. hr = E_OUTOFMEMORY;
  273. BAIL_ON_FAILURE(hr);
  274. }
  275. lpNdsDestObject->NdsValue.value_23.RemoteID =
  276. lpAdsSrcValue->BackLink.RemoteID;
  277. error:
  278. RRETURN(hr);
  279. }
  280. HRESULT
  281. AdsTypeToNdsTypeCopyTypedName(
  282. PADSVALUE lpAdsSrcValue,
  283. PNDSOBJECT lpNdsDestObject
  284. )
  285. {
  286. HRESULT hr = S_OK;
  287. if(lpAdsSrcValue->dwType != ADSTYPE_TYPEDNAME){
  288. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  289. }
  290. if (lpAdsSrcValue->pTypedName == NULL) {
  291. hr = E_FAIL;
  292. BAIL_ON_FAILURE(hr);
  293. }
  294. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_25;
  295. lpNdsDestObject->NdsValue.value_25.ObjectName=
  296. AllocADsStr(
  297. lpAdsSrcValue->pTypedName->ObjectName
  298. );
  299. if (!lpNdsDestObject->NdsValue.value_25.ObjectName) {
  300. hr = E_OUTOFMEMORY;
  301. BAIL_ON_FAILURE(hr);
  302. }
  303. lpNdsDestObject->NdsValue.value_25.Level=
  304. lpAdsSrcValue->pTypedName->Level;
  305. lpNdsDestObject->NdsValue.value_25.Interval=
  306. lpAdsSrcValue->pTypedName->Interval;
  307. error:
  308. RRETURN(hr);
  309. }
  310. HRESULT
  311. AdsTypeToNdsTypeCopyHold(
  312. PADSVALUE lpAdsSrcValue,
  313. PNDSOBJECT lpNdsDestObject
  314. )
  315. {
  316. HRESULT hr = S_OK;
  317. if(lpAdsSrcValue->dwType != ADSTYPE_HOLD){
  318. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  319. }
  320. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_26;
  321. lpNdsDestObject->NdsValue.value_26.ObjectName=
  322. AllocADsStr(
  323. lpAdsSrcValue->Hold.ObjectName
  324. );
  325. if (!lpNdsDestObject->NdsValue.value_26.ObjectName) {
  326. hr = E_OUTOFMEMORY;
  327. BAIL_ON_FAILURE(hr);
  328. }
  329. lpNdsDestObject->NdsValue.value_26.Amount=
  330. lpAdsSrcValue->Hold.Amount;
  331. error:
  332. RRETURN(hr);
  333. }
  334. HRESULT
  335. AdsTypeToNdsTypeCopyEmail(
  336. PADSVALUE lpAdsSrcValue,
  337. PNDSOBJECT lpNdsDestObject
  338. )
  339. {
  340. HRESULT hr = S_OK;
  341. if(lpAdsSrcValue->dwType != ADSTYPE_EMAIL){
  342. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  343. }
  344. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_14;
  345. lpNdsDestObject->NdsValue.value_14.Address=
  346. AllocADsStr(
  347. lpAdsSrcValue->Email.Address
  348. );
  349. if (!lpNdsDestObject->NdsValue.value_14.Address) {
  350. hr = E_OUTOFMEMORY;
  351. BAIL_ON_FAILURE(hr);
  352. }
  353. lpNdsDestObject->NdsValue.value_14.Type=
  354. lpAdsSrcValue->Email.Type;
  355. error:
  356. RRETURN(hr);
  357. }
  358. HRESULT
  359. AdsTypeToNdsTypeCopyNetAddress(
  360. PADSVALUE lpAdsSrcValue,
  361. PNDSOBJECT lpNdsDestObject
  362. )
  363. {
  364. HRESULT hr = S_OK;
  365. if(lpAdsSrcValue->dwType != ADSTYPE_NETADDRESS){
  366. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  367. }
  368. if (lpAdsSrcValue->pNetAddress == NULL) {
  369. hr = E_FAIL;
  370. BAIL_ON_FAILURE(hr);
  371. }
  372. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_12;
  373. lpNdsDestObject->NdsValue.value_12.AddressType =
  374. lpAdsSrcValue->pNetAddress->AddressType;
  375. hr = CopyOctetString(lpAdsSrcValue->pNetAddress->AddressLength,
  376. lpAdsSrcValue->pNetAddress->Address,
  377. &lpNdsDestObject->NdsValue.value_12.AddressLength,
  378. &lpNdsDestObject->NdsValue.value_12.Address);
  379. BAIL_ON_FAILURE(hr);
  380. error:
  381. RRETURN(hr);
  382. }
  383. HRESULT
  384. AdsTypeToNdsTypeCopyFaxNumber(
  385. PADSVALUE lpAdsSrcValue,
  386. PNDSOBJECT lpNdsDestObject
  387. )
  388. {
  389. HRESULT hr = S_OK;
  390. if(lpAdsSrcValue->dwType != ADSTYPE_FAXNUMBER){
  391. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  392. }
  393. if (lpAdsSrcValue->pFaxNumber == NULL) {
  394. hr = E_FAIL;
  395. BAIL_ON_FAILURE(hr);
  396. }
  397. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_11;
  398. lpNdsDestObject->NdsValue.value_11.TelephoneNumber =
  399. AllocADsStr(lpAdsSrcValue->pFaxNumber->TelephoneNumber);
  400. if (!lpNdsDestObject->NdsValue.value_11.TelephoneNumber) {
  401. hr = E_OUTOFMEMORY;
  402. BAIL_ON_FAILURE(hr);
  403. }
  404. hr = CopyOctetString(lpAdsSrcValue->pFaxNumber->NumberOfBits,
  405. lpAdsSrcValue->pFaxNumber->Parameters,
  406. &lpNdsDestObject->NdsValue.value_11.NumberOfBits,
  407. &lpNdsDestObject->NdsValue.value_11.Parameters);
  408. BAIL_ON_FAILURE(hr);
  409. error:
  410. RRETURN(hr);
  411. }
  412. HRESULT
  413. AdsTypeToNdsTypeCopyReplicaPointer(
  414. PADSVALUE lpAdsSrcValue,
  415. PNDSOBJECT lpNdsDestObject
  416. )
  417. {
  418. HRESULT hr = S_OK;
  419. if(lpAdsSrcValue->dwType != ADSTYPE_REPLICAPOINTER){
  420. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  421. }
  422. if (lpAdsSrcValue->pReplicaPointer == NULL) {
  423. hr = E_FAIL;
  424. BAIL_ON_FAILURE(hr);
  425. }
  426. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_16;
  427. lpNdsDestObject->NdsValue.value_16.ServerName=
  428. AllocADsStr(
  429. lpAdsSrcValue->pReplicaPointer->ServerName
  430. );
  431. if (!lpNdsDestObject->NdsValue.value_16.ServerName) {
  432. hr = E_OUTOFMEMORY;
  433. BAIL_ON_FAILURE(hr);
  434. }
  435. lpNdsDestObject->NdsValue.value_16.ReplicaType =
  436. lpAdsSrcValue->pReplicaPointer->ReplicaType;
  437. lpNdsDestObject->NdsValue.value_16.ReplicaNumber =
  438. lpAdsSrcValue->pReplicaPointer->ReplicaNumber;
  439. lpNdsDestObject->NdsValue.value_16.Count =
  440. lpAdsSrcValue->pReplicaPointer->Count;
  441. lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints =
  442. (LPNDS_ASN1_TYPE_12)AllocADsMem(sizeof(NDS_ASN1_TYPE_12 ));
  443. if (!lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints) {
  444. hr = E_OUTOFMEMORY;
  445. BAIL_ON_FAILURE(hr);
  446. }
  447. lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints->AddressType =
  448. lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints->AddressType;
  449. hr = CopyOctetString(lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints->AddressLength,
  450. lpAdsSrcValue->pReplicaPointer->ReplicaAddressHints->Address,
  451. &lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints->AddressLength,
  452. &lpNdsDestObject->NdsValue.value_16.ReplicaAddressHints->Address);
  453. error:
  454. RRETURN(hr);
  455. }
  456. HRESULT
  457. AdsTypeToNdsTypeCopyCaseIgnoreString(
  458. PADSVALUE lpAdsSrcValue,
  459. PNDSOBJECT lpNdsDestObject
  460. )
  461. {
  462. HRESULT hr = S_OK;
  463. if(lpAdsSrcValue->dwType != ADSTYPE_CASE_IGNORE_STRING){
  464. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  465. }
  466. lpNdsDestObject->NdsType = ADSTYPE_CASE_IGNORE_STRING;
  467. lpNdsDestObject->NdsValue.value_3.CaseIgnoreString =
  468. AllocADsStr(
  469. lpAdsSrcValue->CaseIgnoreString
  470. );
  471. if (!lpNdsDestObject->NdsValue.value_3.CaseIgnoreString) {
  472. hr = E_OUTOFMEMORY;
  473. }
  474. RRETURN(hr);
  475. }
  476. HRESULT
  477. AdsTypeToNdsTypeCopyPrintableString(
  478. PADSVALUE lpAdsSrcValue,
  479. PNDSOBJECT lpNdsDestObject
  480. )
  481. {
  482. HRESULT hr = S_OK;
  483. if(lpAdsSrcValue->dwType != ADSTYPE_PRINTABLE_STRING){
  484. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  485. }
  486. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_4;
  487. lpNdsDestObject->NdsValue.value_4.PrintableString =
  488. AllocADsStr(
  489. lpAdsSrcValue->PrintableString
  490. );
  491. if (!lpNdsDestObject->NdsValue.value_4.PrintableString) {
  492. hr = E_OUTOFMEMORY;
  493. BAIL_ON_FAILURE(hr);
  494. }
  495. error:
  496. RRETURN(hr);
  497. }
  498. HRESULT
  499. AdsTypeToNdsTypeCopyNumericString(
  500. PADSVALUE lpAdsSrcValue,
  501. PNDSOBJECT lpNdsDestObject
  502. )
  503. {
  504. HRESULT hr = S_OK;
  505. if(lpAdsSrcValue->dwType != ADSTYPE_NUMERIC_STRING){
  506. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  507. }
  508. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_5;
  509. lpNdsDestObject->NdsValue.value_5.NumericString =
  510. AllocADsStr(
  511. lpAdsSrcValue->NumericString
  512. );
  513. if (!lpNdsDestObject->NdsValue.value_5.NumericString) {
  514. hr = E_OUTOFMEMORY;
  515. BAIL_ON_FAILURE(hr);
  516. }
  517. error:
  518. RRETURN(hr);
  519. }
  520. HRESULT
  521. AdsTypeToNdsTypeCopyBoolean(
  522. PADSVALUE lpAdsSrcValue,
  523. PNDSOBJECT lpNdsDestObject
  524. )
  525. {
  526. HRESULT hr = S_OK;
  527. if(lpAdsSrcValue->dwType != ADSTYPE_BOOLEAN){
  528. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  529. }
  530. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_7;
  531. lpNdsDestObject->NdsValue.value_7.Boolean =
  532. lpAdsSrcValue->Boolean;
  533. RRETURN(hr);
  534. }
  535. HRESULT
  536. AdsTypeToNdsTypeCopyInteger(
  537. PADSVALUE lpAdsSrcValue,
  538. PNDSOBJECT lpNdsDestObject
  539. )
  540. {
  541. HRESULT hr = S_OK;
  542. if(lpAdsSrcValue->dwType != ADSTYPE_INTEGER){
  543. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  544. }
  545. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_8;
  546. lpNdsDestObject->NdsValue.value_8.Integer =
  547. lpAdsSrcValue->Integer;
  548. RRETURN(hr);
  549. }
  550. HRESULT
  551. AdsTypeToNdsTypeCopyOctetString(
  552. PADSVALUE lpAdsSrcValue,
  553. PNDSOBJECT lpNdsDestObject
  554. )
  555. {
  556. LPBYTE lpByteStream = NULL;
  557. DWORD dwNumBytes = 0;
  558. HRESULT hr = S_OK;
  559. if(lpAdsSrcValue->dwType != ADSTYPE_OCTET_STRING){
  560. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  561. }
  562. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_9;
  563. dwNumBytes = lpAdsSrcValue->OctetString.dwLength;
  564. lpByteStream = (LPBYTE)AllocADsMem(dwNumBytes);
  565. if (!lpByteStream) {
  566. hr = E_OUTOFMEMORY;
  567. BAIL_ON_FAILURE(hr);
  568. }
  569. memcpy(
  570. lpByteStream,
  571. lpAdsSrcValue->OctetString.lpValue,
  572. dwNumBytes
  573. );
  574. lpNdsDestObject->NdsValue.value_9.Length = dwNumBytes;
  575. lpNdsDestObject->NdsValue.value_9.OctetString = lpByteStream;
  576. error:
  577. RRETURN(hr);
  578. }
  579. HRESULT
  580. AdsTypeToNdsTypeCopyTime(
  581. PADSVALUE lpAdsSrcValue,
  582. PNDSOBJECT lpNdsDestObject
  583. )
  584. {
  585. HRESULT hr = S_OK;
  586. if(lpAdsSrcValue->dwType != ADSTYPE_UTC_TIME){
  587. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  588. }
  589. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_24;
  590. hr = ConvertSYSTEMTIMEtoDWORD(
  591. &(lpAdsSrcValue->UTCTime),
  592. &(lpNdsDestObject->NdsValue.value_24.Time)
  593. );
  594. RRETURN(hr);
  595. }
  596. HRESULT
  597. AdsTypeToNdsTypeCopyObjectClass(
  598. PADSVALUE lpAdsSrcValue,
  599. PNDSOBJECT lpNdsDestObject
  600. )
  601. {
  602. HRESULT hr = S_OK;
  603. if(lpAdsSrcValue->dwType != ADSTYPE_OBJECT_CLASS){
  604. RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
  605. }
  606. lpNdsDestObject->NdsType = NDS_SYNTAX_ID_20;
  607. lpNdsDestObject->NdsValue.value_20.ClassName =
  608. AllocADsStr(
  609. lpAdsSrcValue->ClassName
  610. );
  611. if (!lpNdsDestObject->NdsValue.value_20.ClassName) {
  612. hr = E_OUTOFMEMORY;
  613. BAIL_ON_FAILURE(hr);
  614. }
  615. error:
  616. RRETURN(hr);
  617. }
  618. HRESULT
  619. AdsTypeToNdsTypeCopy(
  620. PADSVALUE lpAdsSrcValue,
  621. PNDSOBJECT lpNdsDestObject
  622. )
  623. {
  624. HRESULT hr = S_OK;
  625. switch (lpAdsSrcValue->dwType){
  626. case ADSTYPE_DN_STRING:
  627. hr = AdsTypeToNdsTypeCopyDNString(
  628. lpAdsSrcValue,
  629. lpNdsDestObject
  630. );
  631. break;
  632. case ADSTYPE_CASE_EXACT_STRING:
  633. hr = AdsTypeToNdsTypeCopyCaseExactString(
  634. lpAdsSrcValue,
  635. lpNdsDestObject
  636. );
  637. break;
  638. case ADSTYPE_CASE_IGNORE_STRING:
  639. hr = AdsTypeToNdsTypeCopyCaseIgnoreString(
  640. lpAdsSrcValue,
  641. lpNdsDestObject
  642. );
  643. break;
  644. case ADSTYPE_PRINTABLE_STRING:
  645. hr = AdsTypeToNdsTypeCopyPrintableString(
  646. lpAdsSrcValue,
  647. lpNdsDestObject
  648. );
  649. break;
  650. case ADSTYPE_NUMERIC_STRING:
  651. hr = AdsTypeToNdsTypeCopyNumericString(
  652. lpAdsSrcValue,
  653. lpNdsDestObject
  654. );
  655. break;
  656. case ADSTYPE_BOOLEAN:
  657. hr = AdsTypeToNdsTypeCopyBoolean(
  658. lpAdsSrcValue,
  659. lpNdsDestObject
  660. );
  661. break;
  662. case ADSTYPE_INTEGER:
  663. hr = AdsTypeToNdsTypeCopyInteger(
  664. lpAdsSrcValue,
  665. lpNdsDestObject
  666. );
  667. break;
  668. case ADSTYPE_OCTET_STRING:
  669. hr = AdsTypeToNdsTypeCopyOctetString(
  670. lpAdsSrcValue,
  671. lpNdsDestObject
  672. );
  673. break;
  674. case ADSTYPE_UTC_TIME:
  675. hr = AdsTypeToNdsTypeCopyTime(
  676. lpAdsSrcValue,
  677. lpNdsDestObject
  678. );
  679. break;
  680. case ADSTYPE_OBJECT_CLASS:
  681. hr = AdsTypeToNdsTypeCopyObjectClass(
  682. lpAdsSrcValue,
  683. lpNdsDestObject
  684. );
  685. break;
  686. case ADSTYPE_CASEIGNORE_LIST:
  687. hr = AdsTypeToNdsTypeCopyCaseIgnoreList(
  688. lpAdsSrcValue,
  689. lpNdsDestObject
  690. );
  691. break;
  692. case ADSTYPE_FAXNUMBER:
  693. hr = AdsTypeToNdsTypeCopyFaxNumber(
  694. lpAdsSrcValue,
  695. lpNdsDestObject
  696. );
  697. break;
  698. case ADSTYPE_NETADDRESS:
  699. hr = AdsTypeToNdsTypeCopyNetAddress(
  700. lpAdsSrcValue,
  701. lpNdsDestObject
  702. );
  703. break;
  704. case ADSTYPE_OCTET_LIST:
  705. hr = AdsTypeToNdsTypeCopyOctetList(
  706. lpAdsSrcValue,
  707. lpNdsDestObject
  708. );
  709. break;
  710. case ADSTYPE_EMAIL:
  711. hr = AdsTypeToNdsTypeCopyEmail(
  712. lpAdsSrcValue,
  713. lpNdsDestObject
  714. );
  715. break;
  716. case ADSTYPE_PATH:
  717. hr = AdsTypeToNdsTypeCopyPath(
  718. lpAdsSrcValue,
  719. lpNdsDestObject
  720. );
  721. break;
  722. case ADSTYPE_REPLICAPOINTER:
  723. hr = AdsTypeToNdsTypeCopyReplicaPointer(
  724. lpAdsSrcValue,
  725. lpNdsDestObject
  726. );
  727. break;
  728. case ADSTYPE_TIMESTAMP:
  729. hr = AdsTypeToNdsTypeCopyNdsTime(
  730. lpAdsSrcValue,
  731. lpNdsDestObject
  732. );
  733. break;
  734. case ADSTYPE_POSTALADDRESS:
  735. hr = AdsTypeToNdsTypeCopyPostalAddress(
  736. lpAdsSrcValue,
  737. lpNdsDestObject
  738. );
  739. break;
  740. case ADSTYPE_BACKLINK:
  741. hr = AdsTypeToNdsTypeCopyBackLink(
  742. lpAdsSrcValue,
  743. lpNdsDestObject
  744. );
  745. break;
  746. case ADSTYPE_TYPEDNAME:
  747. hr = AdsTypeToNdsTypeCopyTypedName(
  748. lpAdsSrcValue,
  749. lpNdsDestObject
  750. );
  751. break;
  752. case ADSTYPE_HOLD:
  753. hr = AdsTypeToNdsTypeCopyHold(
  754. lpAdsSrcValue,
  755. lpNdsDestObject
  756. );
  757. break;
  758. default:
  759. hr = E_FAIL;
  760. break;
  761. }
  762. RRETURN(hr);
  763. }
  764. HRESULT
  765. AdsTypeToNdsTypeCopyConstruct(
  766. LPADSVALUE pAdsSrcValues,
  767. DWORD dwNumObjects,
  768. LPNDSOBJECT * ppNdsDestObjects,
  769. PDWORD pdwNumNdsObjects,
  770. PDWORD pdwNdsSyntaxId
  771. )
  772. {
  773. DWORD i = 0;
  774. LPNDSOBJECT pNdsDestObjects = NULL;
  775. HRESULT hr = S_OK;
  776. if (dwNumObjects == 0) {
  777. *ppNdsDestObjects = NULL;
  778. *pdwNumNdsObjects = 0;
  779. RRETURN(S_OK);
  780. }
  781. pNdsDestObjects = (LPNDSOBJECT)AllocADsMem(
  782. dwNumObjects * sizeof(NDSOBJECT)
  783. );
  784. if (!pNdsDestObjects) {
  785. RRETURN(E_FAIL);
  786. }
  787. for (i = 0; i < dwNumObjects; i++ ) {
  788. hr = AdsTypeToNdsTypeCopy(
  789. pAdsSrcValues + i,
  790. pNdsDestObjects + i
  791. );
  792. BAIL_ON_FAILURE(hr);
  793. }
  794. *ppNdsDestObjects = pNdsDestObjects;
  795. *pdwNumNdsObjects = dwNumObjects;
  796. *pdwNdsSyntaxId = pNdsDestObjects->NdsType;
  797. RRETURN(S_OK);
  798. error:
  799. if (pNdsDestObjects) {
  800. NdsTypeFreeNdsObjects(
  801. pNdsDestObjects,
  802. dwNumObjects
  803. );
  804. }
  805. *ppNdsDestObjects = NULL;
  806. *pdwNumNdsObjects = 0;
  807. RRETURN(hr);
  808. }