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.

4043 lines
101 KiB

  1. #define _LARGE_INTEGER_SUPPORT_
  2. #include "stdafx.h"
  3. #include "winnls.h"
  4. #include "resource.h"
  5. #include "errordlg.h"
  6. typedef DWORD ( *LARGEINTTOSTRING )( LARGE_INTEGER*, ULONG, LONG, PSZ );
  7. LARGEINTTOSTRING LargeIntegerToString;
  8. /***********************************************************
  9. Function:
  10. Arguments:
  11. Return:
  12. Purpose:
  13. Author(s):
  14. Revision:
  15. Date:
  16. ***********************************************************/
  17. ADSTYPE ADsTypeFromString( CString& strText )
  18. {
  19. if( !strText.CompareNoCase( _T("ADSTYPE_DN_STRING") ) )
  20. return ADSTYPE_DN_STRING;
  21. if( !strText.CompareNoCase( _T("ADSTYPE_CASE_EXACT_STRING") ) )
  22. return ADSTYPE_CASE_EXACT_STRING;
  23. if( !strText.CompareNoCase( _T("ADSTYPE_CASE_IGNORE_STRING") ) )
  24. return ADSTYPE_CASE_IGNORE_STRING;
  25. if( !strText.CompareNoCase( _T("ADSTYPE_PRINTABLE_STRING") ) )
  26. return ADSTYPE_PRINTABLE_STRING;
  27. if( !strText.CompareNoCase( _T("ADSTYPE_NUMERIC_STRING") ) )
  28. return ADSTYPE_NUMERIC_STRING;
  29. if( !strText.CompareNoCase( _T("ADSTYPE_BOOLEAN") ) )
  30. return ADSTYPE_BOOLEAN;
  31. if( !strText.CompareNoCase( _T("ADSTYPE_INTEGER") ) )
  32. return ADSTYPE_INTEGER;
  33. if( !strText.CompareNoCase( _T("ADSTYPE_OCTET_STRING") ) )
  34. return ADSTYPE_OCTET_STRING;
  35. if( !strText.CompareNoCase( _T("ADSTYPE_UTC_TIME") ) )
  36. return ADSTYPE_UTC_TIME;
  37. if( !strText.CompareNoCase( _T("ADSTYPE_LARGE_INTEGER") ) )
  38. return ADSTYPE_LARGE_INTEGER;
  39. if( !strText.CompareNoCase( _T("ADSTYPE_PROV_SPECIFIC") ) )
  40. return ADSTYPE_PROV_SPECIFIC;
  41. if( !strText.CompareNoCase( _T("ADSTYPE_CASEIGNORE_LIST") ) )
  42. return ADSTYPE_CASEIGNORE_LIST;
  43. if( !strText.CompareNoCase( _T("ADSTYPE_POSTALADDRESS") ) )
  44. return ADSTYPE_POSTALADDRESS;
  45. if( !strText.CompareNoCase( _T("ADSTYPE_OCTET_LIST") ) )
  46. return ADSTYPE_OCTET_LIST;
  47. if( !strText.CompareNoCase( _T("ADSTYPE_PATH") ) )
  48. return ADSTYPE_PATH;
  49. if( !strText.CompareNoCase( _T("ADSTYPE_POSTALADDRESS") ) )
  50. return ADSTYPE_POSTALADDRESS;
  51. if( !strText.CompareNoCase( _T("ADSTYPE_TIMESTAMP") ) )
  52. return ADSTYPE_TIMESTAMP;
  53. if( !strText.CompareNoCase( _T("ADSTYPE_BACKLINK") ) )
  54. return ADSTYPE_BACKLINK;
  55. if( !strText.CompareNoCase( _T("ADSTYPE_TYPEDNAME") ) )
  56. return ADSTYPE_TYPEDNAME;
  57. if( !strText.CompareNoCase( _T("ADSTYPE_HOLD") ) )
  58. return ADSTYPE_HOLD;
  59. if( !strText.CompareNoCase( _T("ADSTYPE_NETADDRESS") ) )
  60. return ADSTYPE_NETADDRESS;
  61. if( !strText.CompareNoCase( _T("ADSTYPE_REPLICAPOINTER") ) )
  62. return ADSTYPE_REPLICAPOINTER;
  63. if( !strText.CompareNoCase( _T("ADSTYPE_FAXNUMBER") ) )
  64. return ADSTYPE_FAXNUMBER;
  65. if( !strText.CompareNoCase( _T("ADSTYPE_EMAIL") ) )
  66. return ADSTYPE_EMAIL;
  67. return ADSTYPE_INVALID;
  68. }
  69. /***********************************************************
  70. Function:
  71. Arguments:
  72. Return:
  73. Purpose:
  74. Author(s):
  75. Revision:
  76. Date:
  77. ***********************************************************/
  78. ADSTYPE ADsTypeFromSyntaxString( WCHAR* pszSyntax )
  79. {
  80. ADSTYPE eType = ADSTYPE_CASE_IGNORE_STRING;
  81. if( !_wcsicmp( pszSyntax, L"String" ) )
  82. {
  83. eType = ADSTYPE_CASE_IGNORE_STRING;
  84. }
  85. else if( !_wcsicmp( pszSyntax, L"DN" ) )
  86. {
  87. eType = ADSTYPE_DN_STRING;
  88. }
  89. else if( !_wcsicmp( pszSyntax, L"ObjectSecurityDescriptor" ) )
  90. {
  91. eType = ADSTYPE_CASE_IGNORE_STRING;
  92. }
  93. else if( !_wcsicmp( pszSyntax, L"OID" ) )
  94. {
  95. eType = ADSTYPE_CASE_IGNORE_STRING;
  96. }
  97. else if( !_wcsicmp( pszSyntax, L"Object Class" ) )
  98. {
  99. eType = ADSTYPE_OBJECT_CLASS;
  100. }
  101. else if( !_wcsicmp( pszSyntax, L"DirectoryString" ) )
  102. {
  103. eType = ADSTYPE_CASE_IGNORE_STRING;
  104. }
  105. else if( !_wcsicmp( pszSyntax, L"ORName" ) )
  106. {
  107. eType = ADSTYPE_CASE_IGNORE_STRING;
  108. }
  109. else if( !_wcsicmp( pszSyntax, L"IA5String" ) )
  110. {
  111. eType = ADSTYPE_NUMERIC_STRING;
  112. }
  113. else if( !_wcsicmp( pszSyntax, L"NumericString" ) )
  114. {
  115. eType = ADSTYPE_NUMERIC_STRING;
  116. }
  117. else if( !_wcsicmp( pszSyntax, L"CaseIgnoreString" ) )
  118. {
  119. eType = ADSTYPE_CASE_IGNORE_STRING;
  120. }
  121. else if( !_wcsicmp( pszSyntax, L"PrintableString" ) )
  122. {
  123. eType = ADSTYPE_CASE_IGNORE_STRING;
  124. }
  125. else if( !_wcsicmp( pszSyntax, L"Counter" ) )
  126. {
  127. eType = ADSTYPE_INTEGER;
  128. }
  129. else if( !_wcsicmp( pszSyntax, L"OleDsPath" ) )
  130. {
  131. eType = ADSTYPE_CASE_IGNORE_STRING;
  132. }
  133. else if( !_wcsicmp( pszSyntax, L"Email" ) )
  134. {
  135. eType = ADSTYPE_EMAIL;
  136. }
  137. else if( !_wcsicmp( pszSyntax, L"Hold" ) )
  138. {
  139. eType = ADSTYPE_HOLD;
  140. }
  141. else if( !_wcsicmp( pszSyntax, L"Octet" ) )
  142. {
  143. eType = ADSTYPE_OCTET_STRING;
  144. }
  145. else if( !_wcsicmp( pszSyntax, L"Back Link" ) )
  146. {
  147. eType = ADSTYPE_BACKLINK;
  148. }
  149. else if( !_wcsicmp( pszSyntax, L"Typed Name" ) )
  150. {
  151. eType = ADSTYPE_TYPEDNAME;
  152. }
  153. else if( !_wcsicmp( pszSyntax, L"EmailAddress" ) )
  154. {
  155. eType = ADSTYPE_EMAIL;
  156. }
  157. else if( !_wcsicmp( pszSyntax, L"Path" ) )
  158. {
  159. eType = ADSTYPE_PATH;
  160. }
  161. else if( !_wcsicmp( pszSyntax, L"Case Ignore List" ) )
  162. {
  163. eType = ADSTYPE_CASEIGNORE_LIST;
  164. }
  165. else if( !_wcsicmp( pszSyntax, L"Octet List" ) )
  166. {
  167. eType = ADSTYPE_OCTET_LIST;
  168. }
  169. else if( !_wcsicmp( pszSyntax, L"FaxNumber" ) )
  170. {
  171. eType = ADSTYPE_FAXNUMBER;
  172. }
  173. else if( !_wcsicmp( pszSyntax, L"Integer" ) )
  174. {
  175. eType = ADSTYPE_INTEGER;
  176. }
  177. else if( !_wcsicmp( pszSyntax, L"Integer8" ) )
  178. {
  179. eType = ADSTYPE_LARGE_INTEGER;
  180. }
  181. else if( !_wcsicmp( pszSyntax, L"Postal Address" ) )
  182. {
  183. eType = ADSTYPE_POSTALADDRESS;
  184. }
  185. else if( !_wcsicmp( pszSyntax, L"Interval" ) )
  186. {
  187. eType = ADSTYPE_INTEGER;
  188. }
  189. else if( !_wcsicmp( pszSyntax, L"List" ) )
  190. {
  191. eType = ADSTYPE_CASE_IGNORE_STRING;
  192. }
  193. else if( !_wcsicmp( pszSyntax, L"NetAddress" ) )
  194. {
  195. eType = ADSTYPE_NETADDRESS;
  196. }
  197. else if( !_wcsicmp( pszSyntax, L"OctetString" ) )
  198. {
  199. eType = ADSTYPE_OCTET_STRING;
  200. }
  201. else if( !_wcsicmp( pszSyntax, L"Path" ) )
  202. {
  203. eType = ADSTYPE_PATH;
  204. }
  205. else if( !_wcsicmp( pszSyntax, L"PhoneNumber" ) )
  206. {
  207. eType = ADSTYPE_CASE_IGNORE_STRING;
  208. }
  209. else if( !_wcsicmp( pszSyntax, L"PostalAddress" ) )
  210. {
  211. eType = ADSTYPE_POSTALADDRESS;
  212. }
  213. else if( !_wcsicmp( pszSyntax, L"SmallInterval" ) )
  214. {
  215. eType = ADSTYPE_INTEGER;
  216. }
  217. else if( !_wcsicmp( pszSyntax, L"Time" ) )
  218. {
  219. eType = ADSTYPE_UTC_TIME;
  220. }
  221. else if( !_wcsicmp( pszSyntax, L"TimeStamp" ) )
  222. {
  223. eType = ADSTYPE_TIMESTAMP;
  224. }
  225. else if( !_wcsicmp( pszSyntax, L"UTCTime" ) )
  226. {
  227. eType = ADSTYPE_UTC_TIME;
  228. }
  229. else if( !_wcsicmp( pszSyntax, L"GeneralizedTime" ) )
  230. {
  231. eType = ADSTYPE_UTC_TIME;
  232. }
  233. else if( !_wcsicmp( pszSyntax, L"boolean" ) )
  234. {
  235. eType = ADSTYPE_BOOLEAN;
  236. }
  237. else
  238. {
  239. TCHAR szText[ 128 ];
  240. Convert( szText, pszSyntax );
  241. TRACE( _T("ERROR: unknown %s syntax\n"), szText );
  242. //ASSERT( FALSE );
  243. }
  244. return eType;
  245. }
  246. /***********************************************************
  247. Function:
  248. Arguments:
  249. Return:
  250. Purpose:
  251. Author(s):
  252. Revision:
  253. Date:
  254. ***********************************************************/
  255. CString StringFromADsType( ADSTYPE eType )
  256. {
  257. switch( eType )
  258. {
  259. case ADSTYPE_DN_STRING:
  260. return CString( _T("ADSTYPE_DN_STRING") );
  261. case ADSTYPE_CASE_EXACT_STRING:
  262. return CString( _T("ADSTYPE_CASE_EXACT_STRING") );
  263. case ADSTYPE_CASE_IGNORE_STRING:
  264. return CString( _T("ADSTYPE_CASE_IGNORE_STRING") );
  265. case ADSTYPE_PRINTABLE_STRING:
  266. return CString( _T("ADSTYPE_PRINTABLE_STRING") );
  267. case ADSTYPE_NUMERIC_STRING:
  268. return CString( _T("ADSTYPE_NUMERIC_STRING") );
  269. case ADSTYPE_BOOLEAN:
  270. return CString( _T("ADSTYPE_BOOLEAN") );
  271. case ADSTYPE_INTEGER:
  272. return CString( _T("ADSTYPE_INTEGER") );
  273. case ADSTYPE_OCTET_STRING:
  274. return CString( _T("ADSTYPE_OCTET_STRING") );
  275. case ADSTYPE_UTC_TIME:
  276. return CString( _T("ADSTYPE_UTC_TIME") );
  277. case ADSTYPE_LARGE_INTEGER:
  278. return CString( _T("ADSTYPE_LARGE_INTEGER") );
  279. case ADSTYPE_PROV_SPECIFIC:
  280. return CString( _T("ADSTYPE_PROV_SPECIFIC") );
  281. default:
  282. return CString( _T("ADSTYPE_UNKNOWN") );
  283. }
  284. }
  285. /***********************************************************
  286. Function:
  287. Arguments:
  288. Return:
  289. Purpose:
  290. Author(s):
  291. Revision:
  292. Date:
  293. ***********************************************************/
  294. DWORD TypeFromString( LPWSTR lpszBuffer )
  295. {
  296. if( !lpszBuffer )
  297. return OTHER;
  298. if( !_wcsicmp( lpszBuffer, L"Namespace" ) )
  299. return NAMESPACE;
  300. if( !_wcsicmp( lpszBuffer, L"Namespaces" ) )
  301. return NAMESPACES;
  302. if( !_wcsicmp( lpszBuffer, L"User" ) )
  303. return USER;
  304. if( !_wcsicmp( lpszBuffer, L"Group" ) )
  305. return GROUP;
  306. if( !_wcsicmp( lpszBuffer, L"LocalGroup" ) )
  307. return GROUP;
  308. if( !_wcsicmp( lpszBuffer, L"GlobalGroup" ) )
  309. return GROUP;
  310. if( !_wcsicmp( lpszBuffer, L"groupofuniquenames" ) )
  311. return GROUP;
  312. if( !_wcsicmp( lpszBuffer, L"Domain" ) )
  313. return DOMAIN;
  314. if( !_wcsicmp( lpszBuffer, L"Computer" ) )
  315. return COMPUTER;
  316. if( !_wcsicmp( lpszBuffer, L"Service" ) )
  317. return SERVICE;
  318. if( !_wcsicmp( lpszBuffer, L"FileService" ) )
  319. return FILESERVICE;
  320. if( !_wcsicmp( lpszBuffer, L"Printqueue" ) )
  321. return PRINTQUEUE;
  322. if( !_wcsicmp( lpszBuffer, L"Printer" ) )
  323. return PRINTER;
  324. if( !_wcsicmp( lpszBuffer, L"Printjob" ) )
  325. return PRINTJOB;
  326. if( !_wcsicmp( lpszBuffer, L"PrintDevice" ) )
  327. return PRINTDEVICE;
  328. if( !_wcsicmp( lpszBuffer, L"Session" ) )
  329. return SESSION;
  330. if( !_wcsicmp( lpszBuffer, L"Resource" ) )
  331. return RESOURCE;
  332. if( !_wcsicmp( lpszBuffer, L"FileShare" ) )
  333. return FILESHARE;
  334. if( !_wcsicmp( lpszBuffer, L"Organization" ) )
  335. return NDSORG;
  336. if( !_wcsicmp( lpszBuffer, L"Root" ) )
  337. return NDSROOT;
  338. if( !_wcsicmp( lpszBuffer, L"Tree" ) )
  339. return NDSROOT;
  340. if( !_wcsicmp( lpszBuffer, L"Top" ) )
  341. return NDSROOT;
  342. if( !_wcsicmp( lpszBuffer, L"Organizational Unit" ) )
  343. return NDSOU;
  344. if( !_wcsicmp( lpszBuffer, L"OrganizationalUnit" ) )
  345. return NDSOU;
  346. if( !_wcsicmp( lpszBuffer, L"DomainOrganizationalUnit" ) )
  347. return NDSOU;
  348. if( !_wcsicmp( lpszBuffer, L"Alias" ) )
  349. return NDSALIAS;
  350. if( !_wcsicmp( lpszBuffer, L"Directory Map" ) )
  351. return NDSDIRECTORYMAP;
  352. if( !_wcsicmp( lpszBuffer, L"Distribution List" ) )
  353. return NDSDISTRIBUTIONLIST;
  354. if( !_wcsicmp( lpszBuffer, L"AFP Server" ) )
  355. return NDSAFPSERVER;
  356. if( !_wcsicmp( lpszBuffer, L"Communications Server" ) )
  357. return NDSCOMMUNICATIONSSERVER;
  358. if( !_wcsicmp( lpszBuffer, L"Message Routing Group" ) )
  359. return NDSMESSAGEROUTINGGROUP;
  360. if( !_wcsicmp( lpszBuffer, L"NCP Server" ) )
  361. return NDSNETWARESERVER;
  362. if( !_wcsicmp( lpszBuffer, L"Organizational Role" ) )
  363. return NDSORGANIZATIONALROLE;
  364. if( !_wcsicmp( lpszBuffer, L"Queue" ) )
  365. return NDSPRINTQUEUE;
  366. if( !_wcsicmp( lpszBuffer, L"Print Server" ) )
  367. return NDSPRINTSERVER;
  368. if( !_wcsicmp( lpszBuffer, L"Profile" ) )
  369. return NDSPROFILE;
  370. if( !_wcsicmp( lpszBuffer, L"Volume" ) )
  371. return NDSVOLUME;
  372. if( !_wcsicmp( lpszBuffer, L"Class" ) )
  373. return CLASS;
  374. if( !_wcsicmp( lpszBuffer, L"Schema" ) )
  375. return SCHEMA;
  376. if( !_wcsicmp( lpszBuffer, L"Syntax" ) )
  377. return SYNTAX;
  378. if( !_wcsicmp( lpszBuffer, L"Property" ) )
  379. return PROPERTY;
  380. return OTHER;
  381. }
  382. /***********************************************************
  383. Function:
  384. Arguments:
  385. Return:
  386. Purpose:
  387. Author(s):
  388. Revision:
  389. Date:
  390. ***********************************************************/
  391. DWORD TypeFromString( LPSTR lpszBuffer )
  392. {
  393. int nLength;
  394. WCHAR* pszwType;
  395. DWORD dwType;
  396. nLength = strlen( lpszBuffer );
  397. pszwType = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) );
  398. if ( pszwType ) {
  399. memset( pszwType, 0, ( nLength + 1 ) * sizeof(WCHAR) );
  400. MultiByteToWideChar( CP_ACP,
  401. MB_PRECOMPOSED,
  402. lpszBuffer,
  403. nLength,
  404. pszwType,
  405. nLength + 1 );
  406. }
  407. dwType = TypeFromString( pszwType );
  408. if ( pszwType )
  409. free( pszwType );
  410. return dwType;
  411. }
  412. /***********************************************************
  413. Function:
  414. Arguments:
  415. Return:
  416. Purpose:
  417. Author(s):
  418. Revision:
  419. Date:
  420. ***********************************************************/
  421. void StringFromType( DWORD dwType, CString& rString )
  422. {
  423. TCHAR szText[ 128 ];
  424. StringFromType( dwType, szText );
  425. rString = szText;
  426. }
  427. /***********************************************************
  428. Function:
  429. Arguments:
  430. Return:
  431. Purpose:
  432. Author(s):
  433. Revision:
  434. Date:
  435. ***********************************************************/
  436. void StringFromType( DWORD dwType, TCHAR* lpszBuffer )
  437. {
  438. switch( dwType )
  439. {
  440. case NAMESPACE:
  441. _tcscpy( lpszBuffer, _T("Namespace") );
  442. break;
  443. case NAMESPACES:
  444. _tcscpy( lpszBuffer, _T("Namespaces") );
  445. break;
  446. case USER:
  447. _tcscpy( lpszBuffer, _T("User") );
  448. break;
  449. case GROUP:
  450. _tcscpy( lpszBuffer, _T("Group") );
  451. break;
  452. case DOMAIN:
  453. _tcscpy( lpszBuffer, _T("Domain") );
  454. break;
  455. case COMPUTER:
  456. _tcscpy( lpszBuffer, _T("Computer") );
  457. break;
  458. case SERVICE:
  459. _tcscpy( lpszBuffer, _T("Service") );
  460. break;
  461. case FILESERVICE:
  462. _tcscpy( lpszBuffer, _T("FileService") );
  463. break;
  464. case PRINTQUEUE:
  465. _tcscpy( lpszBuffer, _T("Printqueue") );
  466. break;
  467. case PRINTER:
  468. _tcscpy( lpszBuffer, _T("Printer") );
  469. break;
  470. case PRINTJOB:
  471. _tcscpy( lpszBuffer, _T("PrintJob") );
  472. break;
  473. case PRINTDEVICE:
  474. _tcscpy( lpszBuffer, _T("PrintDevice") );
  475. break;
  476. case SESSION:
  477. _tcscpy( lpszBuffer, _T("Session") );
  478. break;
  479. case FILESHARE:
  480. _tcscpy( lpszBuffer, _T("FileShare") );
  481. break;
  482. case RESOURCE:
  483. _tcscpy( lpszBuffer, _T("Resource") );
  484. break;
  485. case NDSORG:
  486. _tcscpy( lpszBuffer, _T("Organization") );
  487. break;
  488. case NDSROOT:
  489. _tcscpy( lpszBuffer, _T("Tree") );
  490. break;
  491. case NDSOU:
  492. _tcscpy( lpszBuffer, _T("Organizational Unit") );
  493. break;
  494. case NDSALIAS:
  495. _tcscpy( lpszBuffer, _T("Alias") );
  496. break;
  497. case NDSDIRECTORYMAP:
  498. _tcscpy( lpszBuffer, _T("Directory Map") );
  499. break;
  500. case NDSDISTRIBUTIONLIST:
  501. _tcscpy( lpszBuffer, _T("Distribution List") );
  502. break;
  503. case NDSAFPSERVER:
  504. _tcscpy( lpszBuffer, _T("AFP Server") );
  505. break;
  506. case NDSCOMMUNICATIONSSERVER:
  507. _tcscpy( lpszBuffer, _T("Communications Server") );
  508. break;
  509. case NDSMESSAGEROUTINGGROUP:
  510. _tcscpy( lpszBuffer, _T("Message Routing Group") );
  511. break;
  512. case NDSNETWARESERVER:
  513. _tcscpy( lpszBuffer, _T("NCP Server") );
  514. break;
  515. case NDSORGANIZATIONALROLE:
  516. _tcscpy( lpszBuffer, _T("Organizational Role") );
  517. break;
  518. case NDSPRINTQUEUE:
  519. _tcscpy( lpszBuffer, _T("Queue") );
  520. break;
  521. case NDSPRINTSERVER:
  522. _tcscpy( lpszBuffer, _T("Print Server") );
  523. break;
  524. case NDSPROFILE:
  525. _tcscpy( lpszBuffer, _T("Profile") );
  526. break;
  527. case NDSVOLUME:
  528. _tcscpy( lpszBuffer, _T("Volume") );
  529. break;
  530. case SCHEMA:
  531. _tcscpy( lpszBuffer, _T("Schema") );
  532. break;
  533. case OTHER:
  534. _tcscpy( lpszBuffer, _T("Other") );
  535. break;
  536. case CLASS:
  537. _tcscpy( lpszBuffer, _T("Class") );
  538. break;
  539. case PROPERTY:
  540. _tcscpy( lpszBuffer, _T("Property") );
  541. break;
  542. case SYNTAX:
  543. _tcscpy( lpszBuffer, _T("Syntax") );
  544. break;
  545. default:
  546. ASSERT( FALSE );
  547. _tcscpy( lpszBuffer, _T("") );
  548. }
  549. }
  550. /***********************************************************
  551. Function:
  552. Arguments:
  553. Return:
  554. Purpose:
  555. Author(s):
  556. Revision:
  557. Date:
  558. ***********************************************************/
  559. BOOL MakeQualifiedName( TCHAR* strDest, TCHAR* strName, DWORD dwType )
  560. {
  561. TCHAR szTemp[ 128 ];
  562. _tcscpy( strDest, strName );
  563. if( OTHER == dwType )
  564. return TRUE;
  565. StringFromType( dwType, szTemp );
  566. if( _tcslen( szTemp ) )
  567. {
  568. _tcscat( strDest, _T(",") );
  569. }
  570. _tcscat( strDest, szTemp );
  571. return TRUE;
  572. }
  573. /***********************************************************
  574. Function:
  575. Arguments:
  576. Return:
  577. Purpose:
  578. Author(s):
  579. Revision:
  580. Date:
  581. ***********************************************************/
  582. BOOL MakeQualifiedName ( CString& strDest, CString& strName, DWORD dwType )
  583. {
  584. TCHAR szTemp[ 128 ];
  585. strDest = strName;
  586. if( OTHER != dwType )
  587. {
  588. StringFromType( dwType, szTemp );
  589. strDest = strDest + _T(',');
  590. strDest = strDest + CString( szTemp );
  591. }
  592. return TRUE;
  593. }
  594. /***********************************************************
  595. Function:
  596. Arguments:
  597. Return:
  598. Purpose:
  599. Author(s):
  600. Revision:
  601. Date:
  602. ***********************************************************/
  603. BOOL TryThisFilter( BSTR bstrObjectType, MEMBERS* pIGroup )
  604. {
  605. VARIANT v, varFilter, varOld;
  606. SAFEARRAY *psaTry = NULL;
  607. SAFEARRAYBOUND sabTryArray;
  608. HRESULT hr;
  609. long i;
  610. sabTryArray.cElements = 1;
  611. sabTryArray.lLbound = LBOUND;
  612. psaTry = SafeArrayCreate( VT_VARIANT, 1, &sabTryArray );
  613. if (!psaTry)
  614. {
  615. return FALSE;
  616. }
  617. VariantInit(&v);
  618. V_VT(&v) = VT_BSTR;
  619. V_BSTR(&v) = SysAllocString( bstrObjectType );
  620. i = LBOUND;
  621. hr = SafeArrayPutElement( psaTry, (long FAR *)&i, &v );
  622. while( TRUE )
  623. {
  624. if( FAILED( hr ) )
  625. break;
  626. hr = pIGroup->get_Filter( &varOld );
  627. if( FAILED( hr ) )
  628. break;
  629. VariantInit(&varFilter);
  630. V_VT(&varFilter) = VT_VARIANT | VT_ARRAY;
  631. V_ARRAY( &varFilter) = psaTry;
  632. hr = pIGroup->put_Filter( varFilter );
  633. if( FAILED( hr ) )
  634. break;
  635. hr = pIGroup->put_Filter( varOld );
  636. ASSERT( SUCCEEDED( hr ) );
  637. hr = VariantClear( &varOld );
  638. ASSERT( SUCCEEDED( hr ) );
  639. break;
  640. }
  641. SafeArrayDestroy( psaTry );
  642. return SUCCEEDED( hr );
  643. }
  644. /***********************************************************
  645. Function:
  646. Arguments:
  647. Return:
  648. Purpose:
  649. Author(s):
  650. Revision:
  651. Date:
  652. ***********************************************************/
  653. HRESULT BuildFilter( BOOL* pFilters, DWORD dwFilters, VARIANT* pvarFilter )
  654. {
  655. VARIANT varFilter;
  656. DWORD dwIter, dwCount, dwType;
  657. SAFEARRAY *psaFilter = NULL;
  658. HRESULT hResult;
  659. SAFEARRAYBOUND sabFilterArray;
  660. BSTR bstrTexts[ LIMIT ];
  661. TCHAR szType[ 128 ];
  662. dwCount = 0L;
  663. for( dwType = 0L ; dwType < dwFilters ; dwType++ )
  664. {
  665. if( OTHER == dwType )
  666. continue;
  667. if( pFilters[ dwType ] )
  668. {
  669. StringFromType( dwType, szType );
  670. bstrTexts[ dwCount++ ] = AllocBSTR( szType );
  671. }
  672. }
  673. sabFilterArray.cElements = dwCount;
  674. sabFilterArray.lLbound = LBOUND;
  675. psaFilter = SafeArrayCreate( VT_VARIANT, 1, &sabFilterArray );
  676. if ( psaFilter )
  677. {
  678. for( dwIter = LBOUND; dwIter < ( LBOUND + dwCount ); dwIter++ )
  679. {
  680. VariantInit(&varFilter);
  681. V_VT(&varFilter) = VT_BSTR;
  682. V_BSTR(&varFilter) = bstrTexts[ dwIter ];
  683. hResult = SafeArrayPutElement( psaFilter,
  684. (long FAR *)&dwIter, &varFilter );
  685. ASSERT( SUCCEEDED( hResult ) );
  686. VariantClear( &varFilter );
  687. }
  688. V_VT(pvarFilter) = VT_VARIANT | VT_ARRAY;
  689. V_ARRAY(pvarFilter) = psaFilter;
  690. }
  691. else {
  692. hResult = E_OUTOFMEMORY ;
  693. }
  694. // return SUCCEEDED( hResult );
  695. return hResult ;
  696. }
  697. /***********************************************************
  698. Function:
  699. Arguments:
  700. Return:
  701. Purpose:
  702. Author(s):
  703. Revision:
  704. Date:
  705. ***********************************************************/
  706. BOOL SetFilter( IADsCollection* pIColl, BOOL* pFilters, DWORD dwFilters )
  707. {
  708. VARIANT v;
  709. HRESULT hResult;
  710. hResult = BuildFilter( pFilters, dwFilters, &v );
  711. if( SUCCEEDED( hResult ) )
  712. {
  713. /*hResult = pIColl->put_Filter( v );
  714. if( FAILED( hResult ) )
  715. {
  716. TRACE( _T( "ERROR! put_Filter failed") );
  717. } */
  718. VariantClear( &v );
  719. }
  720. return SUCCEEDED( hResult );
  721. }
  722. /***********************************************************
  723. Function:
  724. Arguments:
  725. Return:
  726. Purpose:
  727. Author(s):
  728. Revision:
  729. Date:
  730. ***********************************************************/
  731. BOOL SetFilter( MEMBERS* pIGroup, BOOL* pFilters, DWORD dwFilters )
  732. {
  733. VARIANT v;
  734. HRESULT hResult;
  735. hResult = BuildFilter( pFilters, dwFilters, &v );
  736. if( SUCCEEDED( hResult ) )
  737. {
  738. hResult = pIGroup->put_Filter( v );
  739. if( FAILED( hResult ) )
  740. {
  741. TRACE( _T( "ERROR! put_Filter failed") );
  742. }
  743. VariantClear( &v );
  744. }
  745. return SUCCEEDED( hResult );
  746. }
  747. /***********************************************************
  748. Function:
  749. Arguments:
  750. Return:
  751. Purpose:
  752. Author(s):
  753. Revision:
  754. Date:
  755. ***********************************************************/
  756. BOOL SetFilter( IADsContainer* pIContainer, BOOL* pFilters, DWORD dwFilters )
  757. {
  758. VARIANT v;
  759. HRESULT hResult;
  760. hResult = BuildFilter( pFilters, dwFilters, &v );
  761. if( SUCCEEDED( hResult ) )
  762. {
  763. hResult = pIContainer->put_Filter( v );
  764. if( FAILED( hResult ) )
  765. {
  766. TRACE( _T( "ERROR! put_Filter failed") );
  767. }
  768. VariantClear( &v );
  769. }
  770. return SUCCEEDED( hResult );
  771. }
  772. /***********************************************************
  773. Function:
  774. Arguments:
  775. Return:
  776. Purpose:
  777. Author(s):
  778. Revision:
  779. Date:
  780. ***********************************************************/
  781. CString OleDsGetErrorText ( HRESULT hResult )
  782. {
  783. TCHAR szText[ 128 ];
  784. switch( hResult )
  785. {
  786. case E_ADS_BAD_PATHNAME:
  787. return CString( _T("E_ADS_BAD_PATHNAME") );
  788. break;
  789. case E_ADS_INVALID_DOMAIN_OBJECT:
  790. return CString( _T("E_ADS_INVALID_DOMAIN_OBJECT") );
  791. break;
  792. case E_ADS_INVALID_USER_OBJECT:
  793. return CString( _T("E_ADS_INVALID_USER_OBJECT") );
  794. break;
  795. case E_ADS_INVALID_COMPUTER_OBJECT:
  796. return CString( _T("E_ADS_INVALID_COMPUTER_OBJECT") );
  797. break;
  798. case E_ADS_UNKNOWN_OBJECT:
  799. return CString( _T("E_ADS_UNKNOWN_OBJECT") );
  800. break;
  801. case E_ADS_PROPERTY_NOT_SET:
  802. return CString( _T("E_ADS_PROPERTY_NOT_SET") );
  803. break;
  804. case E_ADS_PROPERTY_NOT_SUPPORTED:
  805. return CString( _T("E_ADS_PROPERTY_NOT_SUPPORTED") );
  806. break;
  807. case E_ADS_PROPERTY_INVALID:
  808. return CString( _T("E_ADS_PROPERTY_INVALID") );
  809. break;
  810. case E_ADS_BAD_PARAMETER:
  811. return CString( _T("E_ADS_BAD_PARAMETER") );
  812. break;
  813. case E_ADS_OBJECT_UNBOUND:
  814. return CString( _T("E_ADS_OBJECT_UNBOUND") );
  815. break;
  816. case E_ADS_PROPERTY_NOT_MODIFIED:
  817. return CString( _T("E_ADS_PROPERTY_NOT_MODIFIED") );
  818. break;
  819. case E_ADS_PROPERTY_MODIFIED:
  820. return CString( _T("E_ADS_PROPERTY_MODIFIED") );
  821. break;
  822. case E_ADS_CANT_CONVERT_DATATYPE:
  823. return CString( _T("E_ADS_CANT_CONVERT_DATATYPE") );
  824. break;
  825. case E_ADS_PROPERTY_NOT_FOUND:
  826. return CString( _T("E_ADS_PROPERTY_NOTFOUND") );
  827. break;
  828. case E_ADS_OBJECT_EXISTS:
  829. return CString( _T("E_ADS_OBJECT_EXISTS") );
  830. break;
  831. case E_ADS_SCHEMA_VIOLATION:
  832. return CString( _T("E_ADS_SCHEMA_VIOLATION") );
  833. break;
  834. case E_ADS_COLUMN_NOT_SET:
  835. return CString( _T("E_ADS_COLUMN_NOT_SET") );
  836. break;
  837. case E_ADS_INVALID_FILTER:
  838. return CString( _T("E_ADS_INVALID_FILTER") );
  839. break;
  840. //case E_ADS_LDAP_BASE:
  841. // return CString( _T("E_ADS_LDAP_BASE") );
  842. // break;
  843. case HRESULT_FROM_WIN32(ERROR_DS_OPERATIONS_ERROR):
  844. return CString( _T("ERROR_DS_OPERATIONS_ERROR") );
  845. break;
  846. case HRESULT_FROM_WIN32(ERROR_DS_PROTOCOL_ERROR):
  847. return CString( _T("ERROR_DS_PROTOCOL_ERROR") );
  848. break;
  849. case HRESULT_FROM_WIN32(ERROR_DS_TIMELIMIT_EXCEEDED):
  850. return CString( _T("ERROR_DS_TIMELIMIT_EXCEEDED") );
  851. break;
  852. case HRESULT_FROM_WIN32(ERROR_DS_SIZELIMIT_EXCEEDED):
  853. return CString( _T("ERROR_DS_SIZELIMIT_EXCEEDED") );
  854. break;
  855. case HRESULT_FROM_WIN32(ERROR_DS_COMPARE_FALSE):
  856. return CString( _T("ERROR_DS_COMPARE_FALSE") );
  857. break;
  858. case HRESULT_FROM_WIN32(ERROR_DS_COMPARE_TRUE):
  859. return CString( _T("ERROR_DS_COMPARE_TRUE") );
  860. break;
  861. case HRESULT_FROM_WIN32(ERROR_DS_AUTH_METHOD_NOT_SUPPORTED):
  862. return CString( _T("ERROR_DS_AUTH_METHOD_NOT_SUPPORTED") );
  863. break;
  864. case HRESULT_FROM_WIN32(ERROR_DS_STRONG_AUTH_REQUIRED):
  865. return CString( _T("ERROR_DS_STRONG_AUTH_REQUIRED") );
  866. break;
  867. case HRESULT_FROM_WIN32(ERROR_MORE_DATA):
  868. return CString( _T("ERROR_MORE_DATA") );
  869. break;
  870. case HRESULT_FROM_WIN32(ERROR_DS_REFERRAL):
  871. return CString( _T("(ERROR_DS_REFERRAL") );
  872. break;
  873. case HRESULT_FROM_WIN32(ERROR_DS_ADMIN_LIMIT_EXCEEDED):
  874. return CString( _T("ERROR_DS_ADMIN_LIMIT_EXCEEDED") );
  875. break;
  876. case HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION):
  877. return CString( _T("(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION") );
  878. break;
  879. case HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED):
  880. return CString( _T("HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED") );
  881. break;
  882. case HRESULT_FROM_WIN32(ERROR_DS_NO_ATTRIBUTE_OR_VALUE):
  883. return CString( _T("ERROR_DS_NO_ATTRIBUTE_OR_VALUE") );
  884. break;
  885. case HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED):
  886. return CString( _T("(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED") );
  887. break;
  888. case HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_MATCHING):
  889. return CString( _T("(ERROR_DS_INAPPROPRIATE_MATCHING") );
  890. break;
  891. case HRESULT_FROM_WIN32(ERROR_DS_CONSTRAINT_VIOLATION):
  892. return CString( _T("ERROR_DS_CONSTRAINT_VIOLATION") );
  893. break;
  894. case HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS):
  895. return CString( _T("ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS") );
  896. break;
  897. case HRESULT_FROM_WIN32(ERROR_DS_INVALID_ATTRIBUTE_SYNTAX):
  898. return CString( _T("ERROR_DS_INVALID_ATTRIBUTE_SYNTAX") );
  899. break;
  900. case HRESULT_FROM_WIN32(ERROR_DS_NO_SUCH_OBJECT):
  901. return CString( _T("ERROR_DS_NO_SUCH_OBJECT") );
  902. break;
  903. // case HRESULT_FROM_WIN32(E_ADS_LDAP_ALIAS_PROBLEM:
  904. // return CString( _T("HRESULT_FROM_WIN32(E_ADS_LDAP_ALIAS_PROBLEM") );
  905. // break;
  906. case HRESULT_FROM_WIN32(ERROR_DS_INVALID_DN_SYNTAX):
  907. return CString( _T("(ERROR_DS_INVALID_DN_SYNTAX") );
  908. break;
  909. case HRESULT_FROM_WIN32(ERROR_DS_IS_LEAF):
  910. return CString( _T("(ERROR_DS_IS_LEAF") );
  911. break;
  912. case HRESULT_FROM_WIN32(ERROR_DS_ALIAS_DEREF_PROBLEM):
  913. return CString( _T("(ERROR_DS_ALIAS_DEREF_PROBLEM") );
  914. break;
  915. case HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_AUTH):
  916. return CString( _T("(ERROR_DS_INAPPROPRIATE_AUTH") );
  917. break;
  918. case HRESULT_FROM_WIN32(ERROR_INVALID_PASSWORD):
  919. return CString( _T("(ERROR_INVALID_PASSWORD") );
  920. break;
  921. case HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED):
  922. return CString( _T("ERROR_ACCESS_DENIED") );
  923. break;
  924. case HRESULT_FROM_WIN32(ERROR_DS_BUSY):
  925. return CString( _T("ERROR_DS_BUSY") );
  926. break;
  927. case HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE):
  928. return CString( _T("ERROR_DS_UNAVAILABLE") );
  929. break;
  930. case HRESULT_FROM_WIN32(ERROR_DS_UNWILLING_TO_PERFORM):
  931. return CString( _T("ERROR_DS_UNWILLING_TO_PERFORM") );
  932. break;
  933. case HRESULT_FROM_WIN32(ERROR_DS_LOOP_DETECT):
  934. return CString( _T("ERROR_DS_LOOP_DETECT") );
  935. break;
  936. case HRESULT_FROM_WIN32(ERROR_DS_NAMING_VIOLATION):
  937. return CString( _T("ERROR_DS_NAMING_VIOLATION") );
  938. break;
  939. case HRESULT_FROM_WIN32(ERROR_DS_OBJ_CLASS_VIOLATION):
  940. return CString( _T("ERROR_DS_OBJ_CLASS_VIOLATION") );
  941. break;
  942. case HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_NON_LEAF):
  943. return CString( _T("ERROR_DS_CANT_ON_NONLEAF") );
  944. break;
  945. case HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_RDN):
  946. return CString( _T("ERROR_DS_CANT_ON_RDN") );
  947. break;
  948. case HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS):
  949. return CString( _T("ERROR_ALREADY_EXISTS") );
  950. break;
  951. case HRESULT_FROM_WIN32(ERROR_DS_CANT_MOD_OBJ_CLASS):
  952. return CString( _T("ERROR_DS_CANT_MOD_OBJ_CLASS") );
  953. break;
  954. case HRESULT_FROM_WIN32(ERROR_DS_OBJECT_RESULTS_TOO_LARGE):
  955. return CString( _T("ERROR_DS_OBJECT_RESULTS_TOO_LARGE") );
  956. break;
  957. case HRESULT_FROM_WIN32(ERROR_DS_AFFECTS_MULTIPLE_DSAS):
  958. return CString( _T("ERROR_DS_AFFECTS_MULTIPLE_DSAS") );
  959. break;
  960. case HRESULT_FROM_WIN32(ERROR_GEN_FAILURE):
  961. return CString( _T("(ERROR_GEN_FAILURE") );
  962. break;
  963. case HRESULT_FROM_WIN32(ERROR_DS_SERVER_DOWN):
  964. return CString( _T("ERROR_DS_SERVER_DOWN") );
  965. break;
  966. case HRESULT_FROM_WIN32(ERROR_DS_LOCAL_ERROR):
  967. return CString( _T("ERROR_DS_LOCAL_ERROR") );
  968. break;
  969. case HRESULT_FROM_WIN32(ERROR_DS_ENCODING_ERROR):
  970. return CString( _T("ERROR_DS_ENCODING_ERROR") );
  971. break;
  972. case HRESULT_FROM_WIN32(ERROR_DS_DECODING_ERROR):
  973. return CString( _T("(ERROR_DS_DECODING_ERROR") );
  974. break;
  975. case HRESULT_FROM_WIN32(ERROR_TIMEOUT):
  976. return CString( _T("(ERROR_TIMEOUT") );
  977. break;
  978. case HRESULT_FROM_WIN32(ERROR_DS_AUTH_UNKNOWN):
  979. return CString( _T("ERROR_DS_AUTH_UNKNOWN") );
  980. break;
  981. case HRESULT_FROM_WIN32(ERROR_DS_FILTER_UNKNOWN):
  982. return CString( _T("(ERROR_DS_FILTER_UNKNOWN") );
  983. break;
  984. case HRESULT_FROM_WIN32(ERROR_CANCELLED):
  985. return CString( _T("(ERROR_CANCELLED") );
  986. break;
  987. case HRESULT_FROM_WIN32(ERROR_DS_PARAM_ERROR):
  988. return CString( _T("ERROR_DS_PARAM_ERROR") );
  989. break;
  990. case HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY):
  991. return CString( _T("ERROR_NOT_ENOUGH_MEMORY") );
  992. break;
  993. case HRESULT_FROM_WIN32(ERROR_CONNECTION_REFUSED):
  994. return CString( _T("ERROR_CONNECTION_REFUSED") );
  995. break;
  996. case HRESULT_FROM_WIN32(ERROR_DS_NOT_SUPPORTED):
  997. return CString( _T("ERROR_DS_NOT_SUPPORTED") );
  998. break;
  999. case HRESULT_FROM_WIN32(ERROR_DS_NO_RESULTS_RETURNED):
  1000. return CString( _T("ERROR_DS_NO_RESULTS_RETURNED") );
  1001. break;
  1002. case HRESULT_FROM_WIN32(ERROR_DS_CONTROL_NOT_FOUND):
  1003. return CString( _T("ERROR_DS_CONTROL_NOT_FOUND") );
  1004. break;
  1005. // case HRESULT_FROM_WIN32(E_ADS_LDAP_MORE_RESULTS_TO_RETURN:
  1006. // return CString( _T("HRESULT_FROM_WIN32(E_ADS_LDAP_MORE_RESULTS_TO_RETURN") );
  1007. // break;
  1008. case HRESULT_FROM_WIN32(ERROR_DS_CLIENT_LOOP):
  1009. return CString( _T("(ERROR_DS_CLIENT_LOOP") );
  1010. break;
  1011. case HRESULT_FROM_WIN32(ERROR_DS_REFERRAL_LIMIT_EXCEEDED):
  1012. return CString( _T("ERROR_DS_REFERRAL_LIMIT_EXCEEDED") );
  1013. break;
  1014. // case HRESULT_FROM_WIN32(E_ADS_LDAP_LAST:
  1015. // return CString( _T("HRESULT_FROM_WIN32(E_ADS_LDAP_LAST") );
  1016. // break;
  1017. case E_FAIL:
  1018. return CString( _T("E_FAIL") );
  1019. break;
  1020. case E_NOTIMPL:
  1021. return CString( _T("E_NOIMPL") );
  1022. break;
  1023. case S_OK:
  1024. return CString( _T("OK") );
  1025. break;
  1026. case 0x800704b8:
  1027. // we have an extended error
  1028. {
  1029. TCHAR szError[ 1024 ];
  1030. WCHAR szErrorBuff[ 1024 ];
  1031. WCHAR szNameBuff[ 1024 ];
  1032. DWORD dwError;
  1033. ADsGetLastError( &dwError,
  1034. szErrorBuff,
  1035. 1023,
  1036. szNameBuff,
  1037. 1023 );
  1038. wcscat( szNameBuff, L" : " );
  1039. wcscat( szNameBuff, szErrorBuff );
  1040. _tcscpy( szError, _T("ERROR: ") );
  1041. Convert( szError + _tcslen( szError ), szNameBuff );
  1042. return CString( szError );
  1043. }
  1044. default:
  1045. {
  1046. LPVOID lpMsgBuf;
  1047. UINT nChars;
  1048. nChars = FormatMessage(
  1049. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  1050. NULL,
  1051. SCODE_CODE(hResult),
  1052. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  1053. (LPTSTR) &lpMsgBuf,
  1054. 0,
  1055. NULL
  1056. );
  1057. if( nChars )
  1058. {
  1059. if( nChars != _tcslen( (LPTSTR)lpMsgBuf ) )
  1060. {
  1061. ((LPTSTR)lpMsgBuf)[nChars] = _T('\0');
  1062. }
  1063. wsprintf( szText, _T("ERROR: %lx - %s"), hResult, (LPTSTR)lpMsgBuf );
  1064. LocalFree( lpMsgBuf );
  1065. }
  1066. else
  1067. {
  1068. DWORD dwLastError;
  1069. wsprintf( szText, _T("ERROR: %lx"), hResult );
  1070. dwLastError = GetLastError();
  1071. }
  1072. return CString( szText );
  1073. break;
  1074. }
  1075. }
  1076. }
  1077. /***********************************************************
  1078. Function: BuildVariantArray
  1079. Arguments:
  1080. Return:
  1081. Purpose:
  1082. Author(s):
  1083. Revision:
  1084. Date:
  1085. ***********************************************************/
  1086. HRESULT BuildVariantArray( VARTYPE vType,
  1087. CString& rText,
  1088. VARIANT& varRes,
  1089. TCHAR cSeparator )
  1090. {
  1091. VARIANT vTemp, vTyped;
  1092. SAFEARRAY* psa;
  1093. SAFEARRAYBOUND sab;
  1094. CStringArray strArray;
  1095. TCHAR* strText;
  1096. int nItems = 0;
  1097. int nIdx;
  1098. int nSize;
  1099. LPTSTR lpName;
  1100. HRESULT hResult;
  1101. strText = (TCHAR*) new TCHAR[ rText.GetLength( ) + 1 ];
  1102. if( !strText )
  1103. {
  1104. return E_FAIL;
  1105. }
  1106. if( VT_I8 == vType )
  1107. {
  1108. vType = VT_R8;
  1109. }
  1110. _tcscpy( strText, rText.GetBuffer( rText.GetLength( ) ) );
  1111. nSize = rText.GetLength( );
  1112. nItems = nSize ? 1 : 0;
  1113. for( nIdx = 0; nIdx < nSize ; nIdx++ )
  1114. {
  1115. if( strText[ nIdx ] == cSeparator )
  1116. {
  1117. nItems++;
  1118. strText[ nIdx ] = _T('\0');
  1119. }
  1120. }
  1121. sab.cElements = nItems;
  1122. sab.lLbound = LBOUND;
  1123. psa = SafeArrayCreate( VT_VARIANT, 1, &sab );
  1124. ASSERT( NULL != psa );
  1125. if ( psa )
  1126. {
  1127. lpName = strText;
  1128. for( nIdx = LBOUND; nIdx < ( LBOUND + nItems ) ; nIdx++ )
  1129. {
  1130. while( *lpName == _T(' ') )
  1131. {
  1132. lpName++;
  1133. }
  1134. VariantInit( &vTemp );
  1135. V_VT(&vTemp) = VT_BSTR;
  1136. V_BSTR(&vTemp) = AllocBSTR( lpName );
  1137. lpName = lpName + ( _tcslen( lpName ) + 1 );
  1138. VariantInit( &vTyped );
  1139. hResult = VariantChangeType( &vTyped, &vTemp, VARIANT_NOVALUEPROP, vType );
  1140. hResult = SafeArrayPutElement( psa, (long FAR *)&nIdx, &vTyped );
  1141. VariantClear( &vTyped );
  1142. VariantClear( &vTemp );
  1143. ASSERT( SUCCEEDED( hResult ) );
  1144. }
  1145. V_VT( &varRes ) = VT_VARIANT | VT_ARRAY;
  1146. V_ARRAY( &varRes ) = psa;
  1147. }
  1148. else {
  1149. hResult = E_OUTOFMEMORY ;
  1150. } ;
  1151. delete [] strText;
  1152. //return SUCCEEDED( hResult );
  1153. return hResult ;
  1154. }
  1155. /***********************************************************
  1156. Function: FromVariantArrayToString
  1157. Arguments:
  1158. Return:
  1159. Purpose:
  1160. Author(s):
  1161. Revision:
  1162. Date:
  1163. ***********************************************************/
  1164. CString FromVariantArrayToString( VARIANT& v, TCHAR* pszSeparator )
  1165. {
  1166. SAFEARRAY* pSafeArray;
  1167. TCHAR szText[ 2048 ];
  1168. VARIANT var, varString;
  1169. long lBound, uBound, lItem;
  1170. HRESULT hResult;
  1171. BOOL bFirst;
  1172. CString strResult;
  1173. // array of VT_UI1 (probably OctetString)
  1174. if( (VT_ARRAY | VT_UI1) == V_VT( &v ) )
  1175. {
  1176. BYTE bValue;
  1177. pSafeArray = V_ARRAY( &v );
  1178. hResult = SafeArrayGetLBound(pSafeArray, 1, &lBound);
  1179. hResult = SafeArrayGetUBound(pSafeArray, 1, &uBound);
  1180. szText[ 0 ] = _T('\0');
  1181. for( lItem = lBound; lItem <= uBound ; lItem++ )
  1182. {
  1183. hResult = SafeArrayGetElement( pSafeArray, &lItem, &bValue );
  1184. if( FAILED( hResult ) )
  1185. {
  1186. break;
  1187. }
  1188. _stprintf( szText + _tcslen(szText), _T(" x%02x"), bValue );
  1189. if( _tcslen( szText ) > 2044 )
  1190. break;
  1191. }
  1192. return CString( szText );
  1193. }
  1194. if( V_VT( &v ) != (VT_VARIANT | VT_ARRAY) )
  1195. {
  1196. VARIANT vString;
  1197. TRACE( _T("Warning: Non array variant!!!\n") );
  1198. VariantInit( &vString );
  1199. hResult = VariantChangeType( &vString, &v, VARIANT_NOVALUEPROP, VT_BSTR );
  1200. if( FAILED( hResult ) )
  1201. {
  1202. V_VT( &vString ) = VT_BSTR;
  1203. V_BSTR( &vString ) = AllocBSTR( _T("ERROR on conversion") );
  1204. }
  1205. _tcscpy( szText, _T("") );
  1206. StringCat( szText, V_BSTR(&vString) );
  1207. VariantClear( &vString);
  1208. return CString( szText );
  1209. }
  1210. pSafeArray = V_ARRAY( &v );
  1211. hResult = SafeArrayGetLBound(pSafeArray, 1, &lBound);
  1212. hResult = SafeArrayGetUBound(pSafeArray, 1, &uBound);
  1213. VariantInit( &varString );
  1214. szText[ 0 ] = _T('\0');
  1215. bFirst = TRUE;
  1216. for( lItem = lBound; lItem <= uBound ; lItem++ )
  1217. {
  1218. hResult = SafeArrayGetElement( pSafeArray, &lItem, &var );
  1219. if( FAILED( hResult ) )
  1220. {
  1221. break;
  1222. }
  1223. if( ConvertFromPropertyValue( var, szText ) )
  1224. {
  1225. V_VT( &varString ) = VT_BSTR;
  1226. V_BSTR( &varString ) = AllocBSTR( szText );
  1227. hResult = S_OK;
  1228. }
  1229. else
  1230. {
  1231. hResult = VariantChangeType( &varString, &var,
  1232. VARIANT_NOVALUEPROP, VT_BSTR );
  1233. }
  1234. if( SUCCEEDED( hResult ) )
  1235. {
  1236. _tcscpy( szText, _T("") );
  1237. if( !bFirst )
  1238. {
  1239. if( NULL == pszSeparator )
  1240. {
  1241. _tcscat( szText, SEPARATOR_S );
  1242. }
  1243. else
  1244. {
  1245. _tcscat( szText, pszSeparator );
  1246. }
  1247. }
  1248. StringCat( szText, V_BSTR( &varString ) );
  1249. bFirst = FALSE;
  1250. VariantClear( &varString );
  1251. strResult += szText;
  1252. }
  1253. VariantClear( &var );
  1254. }
  1255. return strResult;
  1256. }
  1257. /***********************************************************
  1258. Function:
  1259. Arguments:
  1260. Return:
  1261. Purpose:
  1262. Author(s):
  1263. Revision:
  1264. Date:
  1265. ***********************************************************/
  1266. CString FromVariantToString( VARIANT& v)
  1267. {
  1268. return FromVariantArrayToString( v );
  1269. }
  1270. /***********************************************************
  1271. Function:
  1272. Arguments:
  1273. Return:
  1274. Purpose:
  1275. Author(s):
  1276. Revision:
  1277. Date:
  1278. ***********************************************************/
  1279. COleDsObject* CreateOleDsObject( DWORD dwType, IUnknown* pIUnk )
  1280. {
  1281. COleDsObject* pObject;
  1282. switch( dwType )
  1283. {
  1284. case DOMAIN:
  1285. pObject = new COleDsDomain( pIUnk );
  1286. break;
  1287. case COMPUTER:
  1288. pObject = new COleDsComputer( pIUnk );
  1289. break;
  1290. case USER:
  1291. pObject = new COleDsUser( pIUnk );
  1292. break;
  1293. case GROUP:
  1294. pObject = new COleDsGroup( pIUnk );
  1295. break;
  1296. case SERVICE:
  1297. pObject = new COleDsService( pIUnk );
  1298. break;
  1299. case FILESERVICE:
  1300. pObject = new COleDsFileService( pIUnk );
  1301. break;
  1302. case PRINTQUEUE:
  1303. pObject = new COleDsPrintQueue( pIUnk );
  1304. break;
  1305. case PRINTJOB:
  1306. pObject = new COleDsPrintJob( pIUnk );
  1307. break;
  1308. case PRINTDEVICE:
  1309. pObject = new COleDsPrintDevice( pIUnk );
  1310. break;
  1311. case SESSION:
  1312. pObject = new COleDsSession( pIUnk );
  1313. break;
  1314. case FILESHARE:
  1315. pObject = new COleDsFileShare( pIUnk );
  1316. break;
  1317. case RESOURCE:
  1318. pObject = new COleDsResource( pIUnk );
  1319. break;
  1320. case NAMESPACE:
  1321. pObject = new COleDsNamespace( pIUnk );
  1322. break;
  1323. case NAMESPACES:
  1324. pObject = new COleDsNamespaces( pIUnk );
  1325. break;
  1326. case NDSROOT:
  1327. case NDSORG:
  1328. case NDSOU:
  1329. case PRINTER:
  1330. case NDSALIAS:
  1331. case NDSDIRECTORYMAP:
  1332. case NDSDISTRIBUTIONLIST:
  1333. case NDSAFPSERVER:
  1334. case NDSCOMMUNICATIONSSERVER:
  1335. case NDSMESSAGEROUTINGGROUP:
  1336. case NDSNETWARESERVER:
  1337. case NDSORGANIZATIONALROLE:
  1338. case NDSPRINTQUEUE:
  1339. case NDSPRINTSERVER:
  1340. case NDSPROFILE:
  1341. case NDSVOLUME:
  1342. case OTHER:
  1343. case CLASS:
  1344. case SCHEMA:
  1345. case PROPERTY:
  1346. case SYNTAX:
  1347. pObject = new COleDsGeneric( pIUnk );
  1348. break;
  1349. default:
  1350. ASSERT( FALSE );
  1351. pObject = new COleDsObject( pIUnk );
  1352. break;
  1353. }
  1354. return pObject;
  1355. }
  1356. /***********************************************************
  1357. Function:
  1358. Arguments:
  1359. Return:
  1360. Purpose:
  1361. Author(s):
  1362. Revision:
  1363. Date:
  1364. ***********************************************************/
  1365. void ErrorOnPutProperty( CString& strFuncSet,
  1366. CString& strProperty,
  1367. CString& strPropValue,
  1368. HRESULT hResult,
  1369. BOOL bGeneric,
  1370. BOOL bUseEx )
  1371. {
  1372. CErrorDialog aErrorDialog;
  1373. CString strOperation;
  1374. if( !bGeneric )
  1375. {
  1376. strOperation = _T("put_");
  1377. strOperation += strProperty;
  1378. }
  1379. else
  1380. {
  1381. strOperation = _T("Put");
  1382. if( bUseEx )
  1383. {
  1384. strOperation += _T("Ex");
  1385. }
  1386. strOperation += _T("( ");
  1387. strOperation += strProperty;
  1388. strOperation += _T(", ...)");
  1389. }
  1390. //aErrorDialog.m_FuncSet = strFuncSet;
  1391. aErrorDialog.m_Operation = strOperation;
  1392. aErrorDialog.m_Value = strPropValue;
  1393. aErrorDialog.m_Result = OleDsGetErrorText( hResult );
  1394. aErrorDialog.DoModal( );
  1395. }
  1396. /***********************************************************
  1397. Function:
  1398. Arguments:
  1399. Return:
  1400. Purpose:
  1401. Author(s):
  1402. Revision:
  1403. Date:
  1404. ***********************************************************/
  1405. BOOL CheckIfValidClassName( WCHAR* lpszClassName )
  1406. {
  1407. TCHAR szClassName[ 512 ];
  1408. BSTR bszClassName = NULL ;
  1409. if( !lpszClassName )
  1410. {
  1411. TRACE( _T("Oops! Found NULL class name: %s\n"), lpszClassName );
  1412. return TRUE;
  1413. }
  1414. if( !_wcsicmp( lpszClassName, L"Namespace") )
  1415. return TRUE;
  1416. if( !_wcsicmp( lpszClassName, L"Namespaces") )
  1417. return TRUE;
  1418. if( !_wcsicmp( lpszClassName, L"User") )
  1419. return TRUE;
  1420. if( !_wcsicmp( lpszClassName, L"Group") )
  1421. return TRUE;
  1422. if( !_wcsicmp( lpszClassName, L"Domain") )
  1423. return TRUE;
  1424. if( !_wcsicmp( lpszClassName, L"Computer") )
  1425. return TRUE;
  1426. if( !_wcsicmp( lpszClassName, L"Service") )
  1427. return TRUE;
  1428. if( !_wcsicmp( lpszClassName, L"FileService") )
  1429. return TRUE;
  1430. if( !_wcsicmp( lpszClassName, L"Printqueue") )
  1431. return TRUE;
  1432. if( !_wcsicmp( lpszClassName, L"Printjob") )
  1433. return TRUE;
  1434. if( !_wcsicmp( lpszClassName, L"PrintDevice") )
  1435. return TRUE;
  1436. if( !_wcsicmp( lpszClassName, L"Session") )
  1437. return TRUE;
  1438. if( !_wcsicmp( lpszClassName, L"Resource") )
  1439. return TRUE;
  1440. if( !_wcsicmp( lpszClassName, L"FileShare") )
  1441. return TRUE;
  1442. if( !_wcsicmp( lpszClassName, L"Tree") )
  1443. return TRUE;
  1444. if( !_wcsicmp( lpszClassName, L"Organization") )
  1445. return TRUE;
  1446. if( !_wcsicmp( lpszClassName, L"Organizational Unit") )
  1447. return TRUE;
  1448. if( !_wcsicmp( lpszClassName, L"OrganizationalUnit") )
  1449. return TRUE;
  1450. if( !_wcsicmp( lpszClassName, L"Printer") )
  1451. return TRUE;
  1452. if( !_wcsicmp( lpszClassName, L"Class") )
  1453. return TRUE;
  1454. if( !_wcsicmp( lpszClassName, L"Property") )
  1455. return TRUE;
  1456. if( !_wcsicmp( lpszClassName, L"Syntax") )
  1457. return TRUE;
  1458. if( !_wcsicmp( lpszClassName, L"Schema") )
  1459. return TRUE;
  1460. _tcscpy( szClassName, _T("") );
  1461. bszClassName = ::SysAllocString( lpszClassName ) ;
  1462. StringCat( szClassName, bszClassName );
  1463. if ( bszClassName ) {
  1464. ::SysFreeString( bszClassName ) ;
  1465. }
  1466. TRACE( _T("Oops! Found unknown class name: %s\n"), szClassName );
  1467. return TRUE;
  1468. }
  1469. /***********************************************************
  1470. Function:
  1471. Arguments:
  1472. Return:
  1473. Purpose:
  1474. Author(s):
  1475. Revision:
  1476. Date:
  1477. ***********************************************************/
  1478. BOOL CheckIfValidClassName( CHAR* pszClassName )
  1479. {
  1480. int nLength;
  1481. WCHAR* pszwClassName;
  1482. BOOL bRez = FALSE ;
  1483. nLength = strlen( pszClassName );
  1484. pszwClassName = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) );
  1485. if ( pszwClassName ) {
  1486. memset( pszwClassName, 0, ( nLength + 1 ) * sizeof(WCHAR) );
  1487. MultiByteToWideChar( CP_ACP,
  1488. MB_PRECOMPOSED,
  1489. pszClassName,
  1490. nLength,
  1491. pszwClassName,
  1492. nLength + 1 );
  1493. bRez = CheckIfValidClassName( pszwClassName );
  1494. free( pszwClassName );
  1495. }
  1496. return bRez;
  1497. return TRUE;
  1498. }
  1499. /***********************************************************
  1500. Function:
  1501. Arguments:
  1502. Return:
  1503. Purpose:
  1504. Author(s):
  1505. Revision:
  1506. Date:
  1507. ***********************************************************/
  1508. int GetImageListIndex( DWORD dwObjectType )
  1509. {
  1510. int nIndex;
  1511. nIndex = 0;
  1512. dwObjectType = dwObjectType >> 1;
  1513. while( dwObjectType )
  1514. {
  1515. nIndex++;
  1516. dwObjectType = dwObjectType >> 1;
  1517. }
  1518. return nIndex;
  1519. }
  1520. /***********************************************************
  1521. Function: GetBitmapImageId
  1522. Arguments:
  1523. Return:
  1524. Purpose:
  1525. Author(s):
  1526. Revision:
  1527. Date:
  1528. ***********************************************************/
  1529. UINT GetBitmapImageId( DWORD dwObjectType )
  1530. {
  1531. switch( dwObjectType )
  1532. {
  1533. case USER:
  1534. return IDB_USER;
  1535. case SERVICE:
  1536. return IDB_SERVICE;
  1537. case DOMAIN:
  1538. return IDB_DOMAIN;
  1539. case COMPUTER:
  1540. return IDB_COMPUTER;
  1541. case PRINTQUEUE:
  1542. case PRINTER:
  1543. return IDB_PRINTQUEUE;
  1544. case FILESHARE:
  1545. return IDB_FILESHARE;
  1546. case GROUP:
  1547. return IDB_GROUP;
  1548. case SESSION:
  1549. return IDB_SESSION;
  1550. case RESOURCE:
  1551. return IDB_RESOURCE;
  1552. case PRINTJOB:
  1553. return IDB_PRINTJOB;
  1554. case NDSROOT:
  1555. return IDB_ROOT;
  1556. case NDSORG:
  1557. return IDB_ORGANISATION;
  1558. case NDSOU:
  1559. return IDB_ORGANISATIONUNIT;
  1560. case NAMESPACES:
  1561. return IDB_NAMESPACES;
  1562. case NAMESPACE:
  1563. return IDB_NAMESPACE;
  1564. case NDSALIAS:
  1565. return IDB_NDS_ALIAS;
  1566. case NDSDIRECTORYMAP:
  1567. return IDB_NDS_DIRECTORY_MAP;
  1568. case NDSDISTRIBUTIONLIST:
  1569. return IDB_NDS_DISTRIBUTION_LIST;
  1570. case NDSAFPSERVER:
  1571. return IDB_NDS_AFP_SERVER;
  1572. case NDSCOMMUNICATIONSSERVER:
  1573. return IDB_NDS_COMMUNICATIONS_SERVER;
  1574. case NDSMESSAGEROUTINGGROUP:
  1575. return IDB_NDS_MESSAGE_ROUTING_GROUP;
  1576. case NDSNETWARESERVER:
  1577. return IDB_NDS_NETWARE_SERVER;
  1578. case NDSORGANIZATIONALROLE:
  1579. return IDB_NDS_ORGANIZATIONAL_ROLE;
  1580. case NDSPRINTQUEUE:
  1581. return IDB_NDS_PRINT_QUEUE;
  1582. case NDSPRINTSERVER:
  1583. return IDB_NDS_PRINT_SERVER;
  1584. case NDSPROFILE:
  1585. return IDB_NDS_PROFILE;
  1586. case NDSVOLUME:
  1587. return IDB_NDS_VOLUME;
  1588. case SYNTAX:
  1589. return IDB_SYNTAX;
  1590. case PROPERTY:
  1591. return IDB_PROPERTY;
  1592. case CLASS:
  1593. case SCHEMA:
  1594. return IDB_CLASS;
  1595. default:
  1596. return IDB_DUMMY;
  1597. }
  1598. }
  1599. /***********************************************************
  1600. Function: AllocBSTR
  1601. Arguments:
  1602. Return:
  1603. Purpose:
  1604. Author(s):
  1605. Revision:
  1606. Date:
  1607. ***********************************************************/
  1608. BSTR AllocBSTR( WCHAR* pszwString )
  1609. {
  1610. return SysAllocString( pszwString );
  1611. }
  1612. /***********************************************************
  1613. Function: AllocBSTR
  1614. Arguments:
  1615. Return:
  1616. Purpose:
  1617. Author(s):
  1618. Revision:
  1619. Date:
  1620. ***********************************************************/
  1621. BSTR AllocBSTR( CHAR* pszString )
  1622. {
  1623. int nLength;
  1624. WCHAR* pszwString;
  1625. BSTR bstrText;
  1626. nLength = strlen( pszString );
  1627. pszwString = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) );
  1628. if ( pszwString ) {
  1629. memset( pszwString, 0, ( nLength + 1 ) * sizeof(WCHAR) );
  1630. MultiByteToWideChar( CP_ACP,
  1631. MB_PRECOMPOSED,
  1632. pszString,
  1633. nLength,
  1634. pszwString,
  1635. nLength + 1 );
  1636. }
  1637. bstrText = AllocBSTR( pszwString );
  1638. if ( pszwString ) {
  1639. free( pszwString );
  1640. }
  1641. return bstrText;
  1642. }
  1643. /*******************************************************************
  1644. Function: Get
  1645. Arguments:
  1646. Return:
  1647. Purpose:
  1648. Author(s):
  1649. Revision:
  1650. Date:
  1651. *******************************************************************/
  1652. HRESULT Get( IADs* pIOleDs, CHAR* pszProperty, VARIANT* pVar)
  1653. {
  1654. int nLength;
  1655. WCHAR* pszwProperty;
  1656. HRESULT hResult;
  1657. nLength = strlen( pszProperty );
  1658. pszwProperty = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) );
  1659. if ( pszwProperty ) {
  1660. memset( pszwProperty, 0, ( nLength + 1 ) * sizeof(WCHAR) );
  1661. MultiByteToWideChar( CP_ACP,
  1662. MB_PRECOMPOSED,
  1663. pszProperty,
  1664. nLength,
  1665. pszwProperty,
  1666. nLength + 1 );
  1667. hResult = Get( pIOleDs, pszwProperty, pVar );
  1668. free( pszwProperty );
  1669. }
  1670. else {
  1671. hResult = E_OUTOFMEMORY ;
  1672. }
  1673. return hResult;
  1674. }
  1675. /*******************************************************************
  1676. Function: Get
  1677. Arguments:
  1678. Return:
  1679. Purpose:
  1680. Author(s):
  1681. Revision:
  1682. Date:
  1683. *******************************************************************/
  1684. HRESULT Get( IADs* pIOleDs, WCHAR* pszwProperty, VARIANT* pVar)
  1685. {
  1686. HRESULT hResult;
  1687. BSTR bszProperty = ::SysAllocString( pszwProperty ) ;
  1688. VariantInit( pVar );
  1689. hResult = pIOleDs->Get( bszProperty, pVar );
  1690. if ( bszProperty ) {
  1691. ::SysFreeString( bszProperty ) ;
  1692. }
  1693. return hResult;
  1694. }
  1695. /*******************************************************************
  1696. Function: Put
  1697. Arguments:
  1698. Return:
  1699. Purpose:
  1700. Author(s):
  1701. Revision:
  1702. Date:
  1703. *******************************************************************/
  1704. HRESULT Put( IADs* pIOleDs, CHAR* pszProperty, VARIANT Var)
  1705. {
  1706. int nLength;
  1707. WCHAR* pszwProperty;
  1708. HRESULT hResult;
  1709. nLength = strlen( pszProperty );
  1710. pszwProperty = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) );
  1711. if ( pszwProperty ) {
  1712. memset( pszwProperty, 0, ( nLength + 1 ) * sizeof(WCHAR) );
  1713. MultiByteToWideChar( CP_ACP,
  1714. MB_PRECOMPOSED,
  1715. pszProperty,
  1716. nLength,
  1717. pszwProperty,
  1718. nLength + 1 );
  1719. hResult = Put( pIOleDs, pszwProperty, Var ) ;
  1720. free( pszwProperty );
  1721. }
  1722. else {
  1723. hResult = E_OUTOFMEMORY ;
  1724. } ;
  1725. return hResult;
  1726. }
  1727. /*******************************************************************
  1728. Function: Put
  1729. Arguments:
  1730. Return:
  1731. Purpose:
  1732. Author(s):
  1733. Revision:
  1734. Date:
  1735. *******************************************************************/
  1736. HRESULT Put( IADs* pIOleDs, WCHAR* pszwProperty, VARIANT Var)
  1737. {
  1738. HRESULT hResult;
  1739. BSTR bszProperty = ::SysAllocString( pszwProperty ) ;
  1740. hResult = pIOleDs->Put( bszProperty, Var );
  1741. if ( bszProperty ) {
  1742. ::SysFreeString( bszProperty ) ;
  1743. }
  1744. return hResult;
  1745. }
  1746. /*******************************************************************
  1747. Function: XGetOleDsObject
  1748. Arguments:
  1749. Return:
  1750. Purpose:
  1751. Author(s):
  1752. Revision:
  1753. Date:
  1754. *******************************************************************/
  1755. HRESULT XOleDsGetObject( WCHAR* pszwPath, REFIID refiid, void** pVoid )
  1756. {
  1757. // cahged to add the hack for Win95.
  1758. HRESULT hResult;
  1759. hResult = ADsGetObject( pszwPath, refiid, pVoid );
  1760. if( FAILED( hResult ) )
  1761. {
  1762. // now's the hack.
  1763. // Danilo says take OLE DS paths and prepent a "@"
  1764. // to and change the first ":" into a "!"
  1765. WCHAR szHackPath[ 256 ];
  1766. // first, add @
  1767. wcscpy( szHackPath, L"@" );
  1768. wcscat( szHackPath, pszwPath );
  1769. // second, change the first ":" into a "!"
  1770. for( UINT nIdx = 0 ; nIdx < wcslen( szHackPath ); nIdx++ )
  1771. {
  1772. if( szHackPath[ nIdx ] == L':' )
  1773. {
  1774. szHackPath[ nIdx ] = L'!';
  1775. break;
  1776. }
  1777. }
  1778. hResult = ADsGetObject( szHackPath, refiid, pVoid );
  1779. }
  1780. return hResult;
  1781. }
  1782. /*******************************************************************
  1783. Function: XGetOleDsObject
  1784. Arguments:
  1785. Return:
  1786. Purpose:
  1787. Author(s):
  1788. Revision:
  1789. Date:
  1790. *******************************************************************/
  1791. HRESULT XOleDsGetObject( CHAR* pszPath, REFIID refiid, void** pVoid )
  1792. {
  1793. int nLength;
  1794. WCHAR* pszwPath;
  1795. HRESULT hResult;
  1796. nLength = strlen( pszPath );
  1797. pszwPath = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) );
  1798. if ( pszwPath ) {
  1799. memset( pszwPath, 0, ( nLength + 1 ) * sizeof(WCHAR) );
  1800. MultiByteToWideChar( CP_ACP,
  1801. MB_PRECOMPOSED,
  1802. pszPath,
  1803. nLength,
  1804. pszwPath,
  1805. nLength + 1 );
  1806. hResult = XOleDsGetObject( pszwPath, refiid, pVoid );
  1807. free( pszwPath );
  1808. }
  1809. else {
  1810. hResult = E_OUTOFMEMORY ;
  1811. }
  1812. return hResult;
  1813. }
  1814. /*******************************************************************
  1815. Function: XOleDsOpenObject
  1816. Arguments:
  1817. Return:
  1818. Purpose:
  1819. Author(s):
  1820. Revision:
  1821. Date:
  1822. *******************************************************************/
  1823. HRESULT XOleDsOpenObject( WCHAR* lpszPathName,
  1824. WCHAR* lpszUserName,
  1825. WCHAR* lpszPassword,
  1826. REFIID refiid,
  1827. void** pVoid )
  1828. {
  1829. HRESULT hResult;
  1830. hResult = ADsOpenObject(
  1831. lpszPathName,
  1832. lpszUserName,
  1833. lpszPassword,
  1834. NULL,
  1835. refiid,
  1836. pVoid );
  1837. if( FAILED( hResult ) )
  1838. {
  1839. // now's the hack.
  1840. // Danilo says take OLE DS paths and prepent a "@"
  1841. // to and change the first ":" into a "!"
  1842. WCHAR szHackPath[ 256 ];
  1843. // first, add @
  1844. wcscpy( szHackPath, L"@" );
  1845. wcscat( szHackPath, lpszPathName );
  1846. // second, change the first ":" into a "!"
  1847. for( UINT nIdx = 0 ; nIdx < wcslen( szHackPath ); nIdx++ )
  1848. {
  1849. if( szHackPath[ nIdx ] == L':' )
  1850. {
  1851. szHackPath[ nIdx ] = L'!';
  1852. break;
  1853. }
  1854. }
  1855. hResult = ADsOpenObject( szHackPath,
  1856. lpszUserName,
  1857. lpszPassword,
  1858. NULL,
  1859. refiid,
  1860. pVoid );
  1861. }
  1862. return hResult;
  1863. }
  1864. /*******************************************************************
  1865. Function: XOleDsOpenObject
  1866. Arguments:
  1867. Return:
  1868. Purpose:
  1869. Author(s):
  1870. Revision:
  1871. Date:
  1872. *******************************************************************/
  1873. HRESULT XOleDsOpenObject( CHAR* lpszPathName,
  1874. CHAR* lpszUserName,
  1875. CHAR* lpszPassword,
  1876. REFIID refiid,
  1877. void** pVoid )
  1878. {
  1879. BSTR bstrPathName, bstrUserName, bstrPassword;
  1880. HRESULT hResult;
  1881. bstrPathName = AllocBSTR( lpszPathName );
  1882. bstrUserName = AllocBSTR( lpszUserName );
  1883. bstrPassword = AllocBSTR( lpszPassword );
  1884. hResult = XOleDsOpenObject( bstrPathName, bstrUserName, bstrPassword,
  1885. refiid, pVoid );
  1886. SysFreeString( bstrPathName );
  1887. SysFreeString( bstrUserName );
  1888. SysFreeString( bstrPassword );
  1889. return hResult;
  1890. }
  1891. /*******************************************************************
  1892. Function: StringCat
  1893. Arguments:
  1894. Return:
  1895. Purpose:
  1896. Author(s):
  1897. Revision:
  1898. Date:
  1899. *******************************************************************/
  1900. void StringCat( WCHAR* pszString, BSTR bstrText )
  1901. {
  1902. wcscat( pszString, bstrText );
  1903. }
  1904. /*******************************************************************
  1905. Function: StringCat
  1906. Arguments:
  1907. Return:
  1908. Purpose:
  1909. Author(s):
  1910. Revision:
  1911. Date:
  1912. *******************************************************************/
  1913. void StringCat( CHAR* pszString, BSTR bstrText )
  1914. {
  1915. CHAR* pszText;
  1916. UINT nLength;
  1917. CHAR defChar = ' ';
  1918. BOOL bUseDefault;
  1919. int nRez;
  1920. DWORD dwError;
  1921. nLength = SysStringLen( bstrText );
  1922. pszText = (CHAR*) malloc( (nLength + 1) * sizeof(CHAR) );
  1923. if ( pszText ) {
  1924. memset( pszText, 0, (nLength + 1) * sizeof(CHAR) );
  1925. nRez = WideCharToMultiByte( CP_ACP,
  1926. 0L,
  1927. bstrText,
  1928. nLength,
  1929. pszText,
  1930. nLength + 1,
  1931. &defChar,
  1932. &bUseDefault );
  1933. if( !nRez )
  1934. {
  1935. dwError = GetLastError( );
  1936. }
  1937. strcat( pszString, pszText );
  1938. }
  1939. free( pszText );
  1940. }
  1941. /*******************************************************************
  1942. Function: XGetOleDsObject
  1943. Arguments:
  1944. Return:
  1945. Purpose:
  1946. Author(s):
  1947. Revision:
  1948. Date:
  1949. *******************************************************************/
  1950. void SetLastProfileString( TCHAR* szSection, CString& rValue )
  1951. {
  1952. WritePrivateProfileString( _T("LastParameters"), szSection,
  1953. rValue.GetBuffer( 256 ), _T("adsvw.ini") );
  1954. }
  1955. /*******************************************************************
  1956. Function: SetLastProfileString
  1957. Arguments:
  1958. Return:
  1959. Purpose:
  1960. Author(s):
  1961. Revision:
  1962. Date:
  1963. *******************************************************************/
  1964. void GetLastProfileString( TCHAR* szSection, CString& rValue )
  1965. {
  1966. TCHAR szValue[ 256 ];
  1967. GetPrivateProfileString( _T("LastParameters"), szSection,
  1968. _T(""), szValue, 255, _T("adsvw.ini") );
  1969. rValue = szValue;
  1970. }
  1971. /*******************************************************************
  1972. Function: GetByteValue
  1973. Arguments:
  1974. Return:
  1975. Purpose:
  1976. Author(s):
  1977. Revision:
  1978. Date:
  1979. *******************************************************************/
  1980. BYTE GetByteValue( TCHAR* szString )
  1981. {
  1982. BYTE bBytes[ 2 ];
  1983. bBytes[ 0 ] = bBytes[ 1 ] = 0;
  1984. for( int i = 0; i < 2 ; i++ )
  1985. {
  1986. if( !szString[ i ] )
  1987. break;
  1988. #ifdef UNICODE
  1989. if( !iswdigit( szString[ i ] ) )
  1990. {
  1991. bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x37;
  1992. }
  1993. #else
  1994. if( !isdigit( szString[ i ] ) )
  1995. {
  1996. bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x37;
  1997. }
  1998. #endif
  1999. else
  2000. {
  2001. bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x30;
  2002. }
  2003. }
  2004. return ( bBytes[ 0 ] << 4 ) + bBytes[ 1 ];
  2005. }
  2006. /*******************************************************************
  2007. Function: CreateBlobArray
  2008. Arguments:
  2009. Return:
  2010. Purpose:
  2011. Author(s):
  2012. Revision:
  2013. Date:
  2014. *******************************************************************/
  2015. HRESULT CreateBlobArrayFromFile( CString& rText, VARIANT& rBlob )
  2016. {
  2017. TCHAR* pszFileName;
  2018. TCHAR pszTemp[ 2 * MAX_PATH ];
  2019. CFile aFile;
  2020. CFileException e;
  2021. rText.TrimLeft( );
  2022. _tcscpy( pszTemp, (LPCTSTR)rText );
  2023. pszFileName = pszTemp;
  2024. pszFileName += _tcslen( _T("[FILE]") );
  2025. while( *pszFileName == _T(' ') )
  2026. pszFileName++;
  2027. if( !aFile.Open( pszFileName, CFile::modeRead, &e ) )
  2028. {
  2029. #ifdef _DEBUG
  2030. afxDump << "File could not be opened " << e.m_cause << "\n";
  2031. #endif
  2032. }
  2033. else
  2034. {
  2035. SAFEARRAY* psa;
  2036. SAFEARRAYBOUND sab;
  2037. LONG lItem;
  2038. DWORD dwIdx;
  2039. DWORD dwRead;
  2040. HRESULT hResult;
  2041. BYTE bBuffer[ 128 ];
  2042. sab.cElements = (ULONG)(aFile.GetLength( ));
  2043. sab.lLbound = LBOUND;
  2044. psa = SafeArrayCreate( VT_UI1, 1, &sab );
  2045. lItem = LBOUND;
  2046. while( TRUE )
  2047. {
  2048. dwRead = aFile.Read( (LPVOID)bBuffer, 128 );
  2049. for( dwIdx = 0; dwIdx < dwRead ; dwIdx++ )
  2050. {
  2051. hResult = SafeArrayPutElement( psa, &lItem, bBuffer + dwIdx );
  2052. ASSERT( SUCCEEDED( hResult ) );
  2053. }
  2054. if( dwRead != 128 )
  2055. break;
  2056. }
  2057. V_VT( &rBlob ) = VT_UI1 | VT_ARRAY;
  2058. V_ARRAY( &rBlob ) = psa;
  2059. aFile.Close( );
  2060. }
  2061. return S_OK;
  2062. }
  2063. /*******************************************************************
  2064. Function: CreateBlobArray
  2065. Arguments:
  2066. Return:
  2067. Purpose:
  2068. Author(s):
  2069. Revision:
  2070. Date:
  2071. *******************************************************************/
  2072. HRESULT CreateBlobArray( CString& rText, VARIANT& rBlob )
  2073. {
  2074. SAFEARRAY* psa;
  2075. SAFEARRAYBOUND sab;
  2076. TCHAR* strText;
  2077. int nItems = 0;
  2078. int nIdx;
  2079. int nSize;
  2080. HRESULT hResult;
  2081. BYTE bVal;
  2082. rText.MakeUpper( );
  2083. rText.TrimLeft( );
  2084. if( !_tcsnicmp( (LPCTSTR)rText,
  2085. _T("[FILE]"),
  2086. min( (int)rText.GetLength( ), (int)_tcslen( _T("[FILE]") ) )
  2087. )
  2088. )
  2089. {
  2090. hResult = CreateBlobArrayFromFile( rText, rBlob );
  2091. return hResult;
  2092. }
  2093. strText = (TCHAR*) new TCHAR[ rText.GetLength( ) + 1 ];
  2094. if( !strText )
  2095. {
  2096. return E_FAIL;
  2097. }
  2098. _tcscpy( strText, rText.GetBuffer( rText.GetLength( ) ) );
  2099. nSize = rText.GetLength( );
  2100. nItems = 0;
  2101. for( nIdx = 0; nIdx < nSize ; nIdx++ )
  2102. {
  2103. if( strText[ nIdx ] == _T('X') )
  2104. {
  2105. nItems++;
  2106. }
  2107. }
  2108. sab.cElements = nItems;
  2109. sab.lLbound = LBOUND;
  2110. psa = SafeArrayCreate( VT_UI1, 1, &sab );
  2111. ASSERT( NULL != psa );
  2112. if ( psa )
  2113. {
  2114. nItems = 0;
  2115. for( nIdx = LBOUND; nIdx < ( LBOUND + nSize ); nIdx++ )
  2116. {
  2117. if( strText[ nIdx ] == _T('X') )
  2118. {
  2119. bVal = GetByteValue( strText + nIdx + 1 );
  2120. hResult = SafeArrayPutElement( psa, (long FAR *)&nItems, &bVal );
  2121. nIdx += 3;
  2122. nItems++;
  2123. }
  2124. }
  2125. V_VT( &rBlob ) = VT_UI1 | VT_ARRAY;
  2126. V_ARRAY( &rBlob ) = psa;
  2127. }
  2128. delete [] strText;
  2129. return hResult;
  2130. }
  2131. /*******************************************************************
  2132. Function: CreateBlobArrayEx
  2133. Arguments:
  2134. Return:
  2135. Purpose:
  2136. Author(s):
  2137. Revision:
  2138. Date:
  2139. *******************************************************************/
  2140. HRESULT CreateBlobArrayEx( CString& rText, VARIANT& rBlob, TCHAR cSeparator )
  2141. {
  2142. SAFEARRAY* psa;
  2143. SAFEARRAYBOUND sab;
  2144. TCHAR* strText;
  2145. TCHAR* strStore;
  2146. int nItems = 0;
  2147. int nIdx;
  2148. int nSize;
  2149. HRESULT hResult;
  2150. rText.MakeUpper( );
  2151. strText = (TCHAR*) new TCHAR[ rText.GetLength( ) + 1 ];
  2152. strStore = strText;
  2153. if( !strText )
  2154. {
  2155. return E_FAIL;
  2156. }
  2157. _tcscpy( strText, rText.GetBuffer( rText.GetLength( ) ) );
  2158. nSize = rText.GetLength( );
  2159. nItems = 1;
  2160. for( nIdx = 0; nIdx < nSize ; nIdx++ )
  2161. {
  2162. if( strText[ nIdx ] == cSeparator )
  2163. {
  2164. strText[ nIdx ] = _T('\0');
  2165. nItems++;
  2166. }
  2167. }
  2168. sab.cElements = nItems;
  2169. sab.lLbound = LBOUND;
  2170. psa = SafeArrayCreate( VT_VARIANT, 1, &sab );
  2171. ASSERT( NULL != psa );
  2172. if ( psa )
  2173. {
  2174. for( nIdx = LBOUND; nIdx < ( LBOUND + nItems ) ; nIdx++ )
  2175. {
  2176. VARIANT var;
  2177. CString strTemp;
  2178. strTemp = strText;
  2179. strText += _tcslen( strText ) + 1;
  2180. CreateBlobArray( strTemp, var );
  2181. hResult = SafeArrayPutElement( psa, (long FAR *)&nIdx, &var );
  2182. VariantClear( &var );
  2183. }
  2184. V_VT( &rBlob ) = VT_VARIANT | VT_ARRAY;
  2185. V_ARRAY( &rBlob ) = psa;
  2186. }
  2187. else {
  2188. hResult = E_OUTOFMEMORY ;
  2189. }
  2190. delete [] strStore;
  2191. return hResult;
  2192. }
  2193. /******************************************************************************
  2194. Function: Convert
  2195. Arguments:
  2196. Return:
  2197. Purpose:
  2198. Author(s):
  2199. Revision:
  2200. Date:
  2201. ******************************************************************************/
  2202. void Convert( CHAR* pszDest, WCHAR* pszwSrc )
  2203. {
  2204. int nRes = 0;
  2205. if( wcslen( pszwSrc ) )
  2206. {
  2207. nRes = WideCharToMultiByte( CP_ACP,
  2208. WC_COMPOSITECHECK,
  2209. pszwSrc,
  2210. wcslen( pszwSrc ),
  2211. pszDest,
  2212. wcslen( pszwSrc ) + 1,
  2213. NULL,
  2214. NULL );
  2215. ASSERT( nRes );
  2216. }
  2217. pszDest[ nRes ] = '\0';
  2218. }
  2219. /******************************************************************************
  2220. Function: Convert
  2221. Arguments:
  2222. Return:
  2223. Purpose:
  2224. Author(s):
  2225. Revision:
  2226. Date:
  2227. ******************************************************************************/
  2228. void Convert ( WCHAR* pszwDest, CHAR* pszSrc )
  2229. {
  2230. BSTR bstrTemp;
  2231. bstrTemp = AllocBSTR( pszSrc );
  2232. wcscpy( pszwDest, bstrTemp );
  2233. SysFreeString( bstrTemp );
  2234. }
  2235. /******************************************************************************
  2236. Function: Convert
  2237. Arguments:
  2238. Return:
  2239. Purpose:
  2240. Author(s):
  2241. Revision:
  2242. Date:
  2243. ******************************************************************************/
  2244. void Convert ( WCHAR* pszwDest, WCHAR* pszwSrc )
  2245. {
  2246. wcscpy( pszwDest, pszwSrc );
  2247. }
  2248. /******************************************************************************
  2249. Function: Convert
  2250. Arguments:
  2251. Return:
  2252. Purpose:
  2253. Author(s):
  2254. Revision:
  2255. Date:
  2256. ******************************************************************************/
  2257. void Convert( CHAR* pszDest, CHAR* pszSrc )
  2258. {
  2259. strcpy( pszDest, pszSrc );
  2260. }
  2261. /******************************************************************************
  2262. Function: StringToLARGE_INTEGER
  2263. Arguments:
  2264. Return:
  2265. Purpose:
  2266. Author(s):
  2267. Revision:
  2268. Date:
  2269. ******************************************************************************/
  2270. HRESULT StringToLARGE_INTEGER( TCHAR* szString, LARGE_INTEGER* pValue )
  2271. {
  2272. if ( 0 == _stscanf( szString, _T("%I64d"), pValue ) ) {
  2273. pValue = NULL ;
  2274. }
  2275. return S_OK;
  2276. HRESULT hResult;
  2277. VARIANT vString, vR8;
  2278. double dLowPart, dHighPart;
  2279. ULONG ulLowPart, ulHighPart;
  2280. WCHAR szValue[ 32 ];
  2281. VariantInit( &vString );
  2282. VariantInit( &vR8 );
  2283. V_VT( &vString ) = VT_BSTR;
  2284. Convert( szValue, szString );
  2285. V_BSTR( &vString ) = szValue;
  2286. hResult = VariantChangeType( &vR8, &vString, VARIANT_NOVALUEPROP, VT_R8 );
  2287. if( SUCCEEDED( hResult ) )
  2288. {
  2289. dHighPart = V_R8( &vR8 ) / ((double) 1.0 + (double)(ULONG_MAX));
  2290. ulHighPart = (ULONG)dHighPart;
  2291. dHighPart = (double)ulHighPart;
  2292. dLowPart = V_R8( &vR8 ) - dHighPart*((double) 1.0 + (double)(ULONG_MAX));
  2293. ulLowPart = (ULONG)dLowPart;
  2294. pValue->HighPart= (LONG)ulHighPart;
  2295. pValue->LowPart = ulHighPart;
  2296. }
  2297. return hResult;
  2298. }
  2299. /******************************************************************************
  2300. Function: StringToLARGE_INTEGER
  2301. Arguments:
  2302. Return:
  2303. Purpose:
  2304. Author(s):
  2305. Revision:
  2306. Date:
  2307. ******************************************************************************/
  2308. HRESULT LARGE_INTEGERToString( TCHAR* szString,
  2309. LARGE_INTEGER* pValue )
  2310. {
  2311. if ( pValue ) {
  2312. _stprintf( szString, _T("%I64d"), pValue->QuadPart );
  2313. }
  2314. return S_OK;
  2315. /*TCHAR szText[ 32 ];
  2316. DWORD dwStatus;
  2317. BOOL bOK = FALSE;
  2318. HMODULE hModule;
  2319. while( TRUE )
  2320. {
  2321. hModule = LoadLibrary( _T("NTDLL.DLL" ) );
  2322. if( NULL == hModule )
  2323. break;
  2324. LargeIntegerToString = (LARGEINTTOSTRING)GetProcAddress( hModule, _T("RtlLargeIntegerToChar") );
  2325. if( NULL == LargeIntegerToString )
  2326. break;
  2327. dwStatus = LargeIntegerToString( pValue, 10, 31, szText );
  2328. if( 0 == dwStatus )
  2329. {
  2330. Convert( szString, szText );
  2331. bOK = TRUE;
  2332. }
  2333. break;
  2334. }
  2335. if( NULL != hModule )
  2336. {
  2337. FreeLibrary( hModule );
  2338. }
  2339. if( bOK )
  2340. {
  2341. return S_OK;
  2342. }
  2343. HRESULT hResult;
  2344. double dVal;
  2345. VARIANT vString, vR8;
  2346. dVal = (double)pValue->HighPart;
  2347. dVal = dVal * ( (double) 1.0 + (double)(ULONG_MAX) );
  2348. dVal = dVal + (double)pValue->LowPart;
  2349. VariantInit( &vString );
  2350. VariantInit( &vR8 );
  2351. V_VT( &vR8 ) = VT_R8;
  2352. V_R8( &vR8 ) = dVal;
  2353. hResult = VariantChangeType( &vString, &vR8, VARIANT_NOVALUEPROP, VT_BSTR );
  2354. ASSERT( SUCCEEDED( hResult ) );
  2355. if( SUCCEEDED( hResult ) )
  2356. {
  2357. Convert( szString, V_BSTR( &vString ) );
  2358. VariantClear( &vString );
  2359. }
  2360. return hResult;*/
  2361. }
  2362. /******************************************************************************
  2363. Function: CopyACE
  2364. Arguments:
  2365. Return:
  2366. Purpose:
  2367. Author(s):
  2368. Revision:
  2369. Date:
  2370. ******************************************************************************/
  2371. IDispatch* CopyACE( IDispatch* pSrc )
  2372. {
  2373. IADsAccessControlEntry* pACE;
  2374. IADsAccessControlEntry* pSrcACE;
  2375. IDispatch* pNewACE = NULL;
  2376. HRESULT hResult;
  2377. LONG lValue;
  2378. BSTR bstrValue = NULL;
  2379. hResult = pSrc->QueryInterface( IID_IADsAccessControlEntry, (void**)&pSrcACE );
  2380. if( FAILED( hResult ) )
  2381. return NULL;
  2382. hResult = CoCreateInstance(
  2383. CLSID_AccessControlEntry,
  2384. NULL,
  2385. CLSCTX_INPROC_SERVER,
  2386. IID_IADsAccessControlEntry,
  2387. (void **)&pACE );
  2388. if( SUCCEEDED( hResult ) )
  2389. {
  2390. //******************************************
  2391. hResult = pSrcACE->get_AccessMask( &lValue );
  2392. ASSERT( SUCCEEDED( hResult ) );
  2393. if( SUCCEEDED( hResult ) )
  2394. {
  2395. hResult = pACE->put_AccessMask( lValue );
  2396. if( FAILED( hResult ) )
  2397. {
  2398. TRACE( _T("[ADSI] Error: put_AccessMask returns %lx\n"), hResult );
  2399. }
  2400. }
  2401. //******************************************
  2402. hResult = pSrcACE->get_AceType( &lValue );
  2403. ASSERT( SUCCEEDED( hResult ) );
  2404. if( SUCCEEDED( hResult ) )
  2405. {
  2406. hResult = pACE->put_AceType( lValue );
  2407. if( FAILED( hResult ) )
  2408. {
  2409. TRACE( _T("[ADSI] Error: put_AceType returns %lx\n"), hResult );
  2410. }
  2411. }
  2412. //******************************************
  2413. hResult = pSrcACE->get_AceFlags( &lValue );
  2414. ASSERT( SUCCEEDED( hResult ) );
  2415. if( SUCCEEDED( hResult ) )
  2416. {
  2417. hResult = pACE->put_AceFlags( lValue );
  2418. if( FAILED( hResult ) )
  2419. {
  2420. TRACE( _T("[ADSI] Error: put_AceFlags returns %lx\n"), hResult );
  2421. }
  2422. }
  2423. //******************************************
  2424. hResult = pSrcACE->get_Flags( &lValue );
  2425. ASSERT( SUCCEEDED( hResult ) );
  2426. if( SUCCEEDED( hResult ) )
  2427. {
  2428. hResult = pACE->put_Flags( lValue );
  2429. if( FAILED( hResult ) )
  2430. {
  2431. TRACE( _T("[ADSI] Error: put_Flags returns %lx\n"), hResult );
  2432. }
  2433. }
  2434. //******************************************
  2435. hResult = pSrcACE->get_ObjectType( &bstrValue );
  2436. ASSERT( SUCCEEDED( hResult ) );
  2437. if( SUCCEEDED( hResult ) )
  2438. {
  2439. hResult = pACE->put_ObjectType( bstrValue );
  2440. if( FAILED( hResult ) )
  2441. {
  2442. TRACE( _T("[ADSI] Error: put_ObjectType returns %lx\n"), hResult );
  2443. }
  2444. SysFreeString( bstrValue );
  2445. bstrValue = NULL;
  2446. }
  2447. //******************************************
  2448. hResult = pSrcACE->get_InheritedObjectType( &bstrValue );
  2449. ASSERT( SUCCEEDED( hResult ) );
  2450. if( SUCCEEDED( hResult ) )
  2451. {
  2452. hResult = pACE->put_InheritedObjectType( bstrValue );
  2453. if( FAILED( hResult ) )
  2454. {
  2455. TRACE( _T("[ADSI] Error: put_InheritedObjectType returns %lx\n"), hResult );
  2456. }
  2457. SysFreeString( bstrValue );
  2458. bstrValue = NULL;
  2459. }
  2460. //******************************************
  2461. hResult = pSrcACE->get_Trustee( &bstrValue );
  2462. ASSERT( SUCCEEDED( hResult ) );
  2463. if( SUCCEEDED( hResult ) )
  2464. {
  2465. hResult = pACE->put_Trustee( bstrValue );
  2466. if( FAILED( hResult ) )
  2467. {
  2468. TRACE( _T("[ADSI] Error: put_Trustee returns %lx\n"), hResult );
  2469. }
  2470. SysFreeString( bstrValue );
  2471. bstrValue = NULL;
  2472. }
  2473. hResult = pACE->QueryInterface( IID_IDispatch, (void**)&pNewACE );
  2474. pACE->Release( );
  2475. }
  2476. pSrcACE->Release( );
  2477. return pNewACE;
  2478. }
  2479. /******************************************************************************
  2480. Function: CopyACL
  2481. Arguments:
  2482. Return:
  2483. Purpose:
  2484. Author(s):
  2485. Revision:
  2486. Date:
  2487. ******************************************************************************/
  2488. IDispatch* CopyACL( IDispatch* pSrcACL )
  2489. {
  2490. IADsAccessControlList* pACL = NULL;
  2491. IADsAccessControlList* pADsNewACL = NULL;
  2492. IDispatch* pNewACL = NULL;
  2493. IUnknown* pEnum = NULL;
  2494. IEnumVARIANT* pEnumVAR = NULL;
  2495. HRESULT hResult;
  2496. LONG lValue;
  2497. ULONG lGet;
  2498. VARIANT var;
  2499. hResult = pSrcACL->QueryInterface( IID_IADsAccessControlList, (void**)&pACL );
  2500. while( TRUE )
  2501. {
  2502. if( FAILED( hResult ) )
  2503. break;
  2504. hResult = pACL->CopyAccessList( &pNewACL );
  2505. if( FAILED( hResult ) )
  2506. {
  2507. TRACE( _T("[ADSI] Error: CopyAccessList returns %lx\n"), hResult );
  2508. }
  2509. if( SUCCEEDED( hResult ) )
  2510. break;
  2511. hResult = CoCreateInstance(
  2512. CLSID_AccessControlList,
  2513. NULL,
  2514. CLSCTX_INPROC_SERVER,
  2515. IID_IADsAccessControlList,
  2516. (void **)&pADsNewACL );
  2517. ASSERT( SUCCEEDED( hResult ) );
  2518. if( FAILED( hResult ) )
  2519. break;
  2520. hResult = pACL->get_AclRevision( &lValue );
  2521. if( SUCCEEDED( hResult ) )
  2522. {
  2523. hResult = pADsNewACL->put_AclRevision( lValue );
  2524. ASSERT( SUCCEEDED( hResult ) );
  2525. }
  2526. hResult = pACL->get__NewEnum( &pEnum );
  2527. ASSERT( SUCCEEDED( hResult ) );
  2528. if( FAILED( hResult ) )
  2529. break;
  2530. hResult = pEnum->QueryInterface( IID_IEnumVARIANT, (void**)&pEnumVAR );
  2531. ASSERT( SUCCEEDED( hResult ) );
  2532. if( FAILED( hResult ) )
  2533. break;
  2534. while( TRUE )
  2535. {
  2536. lGet = 0;
  2537. VariantInit( &var );
  2538. hResult = pEnumVAR->Next( 1, &var, &lGet );
  2539. if( 0 == lGet )
  2540. break;
  2541. hResult = pADsNewACL->AddAce( CopyACE( V_DISPATCH( &var ) ) );
  2542. VariantClear( &var );
  2543. }
  2544. hResult = pADsNewACL->QueryInterface( IID_IDispatch, (void**)& pNewACL );
  2545. break;
  2546. }
  2547. if( NULL != pACL )
  2548. pACL->Release( );
  2549. if( NULL != pADsNewACL )
  2550. pADsNewACL->Release( );
  2551. if( NULL != pEnum )
  2552. pEnum->Release( );
  2553. if( NULL != pEnumVAR )
  2554. pEnumVAR->Release( );
  2555. return pNewACL;
  2556. }
  2557. /******************************************************************************
  2558. Function: CopySD
  2559. Arguments:
  2560. Return:
  2561. Purpose:
  2562. Author(s):
  2563. Revision:
  2564. Date:
  2565. ******************************************************************************/
  2566. IDispatch* CopySD( IDispatch* pSrcSD )
  2567. {
  2568. IADsSecurityDescriptor* pSD;
  2569. IDispatch* pNewSD = NULL;
  2570. IADsSecurityDescriptor* pADsNewSD = NULL;
  2571. HRESULT hResult;
  2572. LONG lValue;
  2573. BSTR bstrValue;
  2574. IDispatch* pACL;
  2575. //hResult = pSrcSD->QueryInterface( IID_IDispatch, (void**)&pNewSD );
  2576. //return pNewSD;
  2577. hResult = pSrcSD->QueryInterface( IID_IADsSecurityDescriptor, (void**)&pSD );
  2578. while( TRUE )
  2579. {
  2580. if( FAILED( hResult ) )
  2581. break;
  2582. hResult = pSD->CopySecurityDescriptor( &pNewSD );
  2583. if( FAILED( hResult ) )
  2584. {
  2585. TRACE( _T("[ADSI] Error: CopySecurityDescriptor returns %lx\n"), hResult );
  2586. }
  2587. if( SUCCEEDED( hResult ) )
  2588. {
  2589. pSD->Release( );
  2590. break;
  2591. }
  2592. hResult = CoCreateInstance(
  2593. CLSID_SecurityDescriptor,
  2594. NULL,
  2595. CLSCTX_INPROC_SERVER,
  2596. IID_IADsSecurityDescriptor,
  2597. (void **)&pADsNewSD );
  2598. ASSERT( SUCCEEDED( hResult ) );
  2599. if( FAILED( hResult ) )
  2600. break;
  2601. hResult = pSD->get_Revision( &lValue );
  2602. if( SUCCEEDED( hResult ) )
  2603. {
  2604. hResult = pADsNewSD->put_Revision( lValue );
  2605. ASSERT( SUCCEEDED( hResult ) );
  2606. }
  2607. hResult = pSD->get_Control( &lValue );
  2608. if( SUCCEEDED( hResult ) )
  2609. {
  2610. hResult = pADsNewSD->put_Control( lValue );
  2611. ASSERT( SUCCEEDED( hResult ) );
  2612. }
  2613. hResult = pSD->get_Owner( &bstrValue );
  2614. if( SUCCEEDED( hResult ) )
  2615. {
  2616. hResult = pADsNewSD->put_Owner( bstrValue );
  2617. ASSERT( SUCCEEDED( hResult ) );
  2618. SysFreeString( bstrValue );
  2619. }
  2620. hResult = pSD->get_Group( &bstrValue );
  2621. if( SUCCEEDED( hResult ) )
  2622. {
  2623. hResult = pADsNewSD->put_Group( bstrValue );
  2624. ASSERT( SUCCEEDED( hResult ) );
  2625. SysFreeString( bstrValue );
  2626. }
  2627. hResult = pSD->get_DiscretionaryAcl( &pACL );
  2628. if( SUCCEEDED( hResult ) && NULL != pACL )
  2629. {
  2630. IDispatch* pCopy;
  2631. pCopy = CopyACL( pACL );
  2632. if( NULL != pCopy )
  2633. {
  2634. hResult = pADsNewSD->put_DiscretionaryAcl( pCopy );
  2635. ASSERT( SUCCEEDED( hResult ) );
  2636. pCopy->Release( );
  2637. }
  2638. pACL->Release( );
  2639. }
  2640. hResult = pSD->get_SystemAcl( &pACL );
  2641. if( SUCCEEDED( hResult ) && NULL != pACL )
  2642. {
  2643. IDispatch* pCopy;
  2644. pCopy = CopyACL( pACL );
  2645. if( NULL != pCopy )
  2646. {
  2647. hResult = pADsNewSD->put_SystemAcl( pCopy );
  2648. ASSERT( SUCCEEDED( hResult ) );
  2649. pCopy->Release( );
  2650. }
  2651. pACL->Release( );
  2652. }
  2653. hResult = pADsNewSD->QueryInterface( IID_IDispatch, (void**)&pNewSD );
  2654. ASSERT( SUCCEEDED( hResult ) );
  2655. pADsNewSD->Release( );
  2656. break;
  2657. }
  2658. return pNewSD;
  2659. }
  2660. /******************************************************************************
  2661. Function: ConvertFromPropertyValue
  2662. Arguments:
  2663. Return:
  2664. Purpose:
  2665. Author(s):
  2666. Revision:
  2667. Date:
  2668. ******************************************************************************/
  2669. BOOL ConvertFromPropertyValue( VARIANT& rVar, TCHAR* szText )
  2670. {
  2671. IADsPropertyValue* pPropValue = NULL;
  2672. HRESULT hResult;
  2673. long lType;
  2674. BSTR bstrVal = NULL;
  2675. if( VT_DISPATCH != V_VT(&rVar ) )
  2676. return FALSE;
  2677. hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsPropertyValue, (void**)&pPropValue );
  2678. if( FAILED( hResult ) )
  2679. return FALSE;
  2680. while( TRUE )
  2681. {
  2682. hResult = pPropValue->get_ADsType( &lType );
  2683. if( FAILED( hResult ) )
  2684. break;
  2685. switch( (ADSTYPEENUM)lType )
  2686. {
  2687. case ADSTYPE_DN_STRING:
  2688. {
  2689. hResult = pPropValue->get_DNString( &bstrVal );
  2690. if( SUCCEEDED( hResult ) )
  2691. {
  2692. Convert( szText, bstrVal );
  2693. SysFreeString( bstrVal );
  2694. }
  2695. else
  2696. {
  2697. TRACE( _T("[ADSVW] Error: get_DNString returns %lx\n"), hResult );
  2698. }
  2699. hResult = pPropValue->get_CaseExactString( &bstrVal );
  2700. if( SUCCEEDED( hResult ) )
  2701. {
  2702. TRACE( _T("[ADSVW] Error: get_CaseExactString should fail\n") );
  2703. SysFreeString( bstrVal );
  2704. }
  2705. break;
  2706. }
  2707. case ADSTYPE_CASE_EXACT_STRING:
  2708. {
  2709. hResult = pPropValue->get_CaseExactString( &bstrVal );
  2710. if( SUCCEEDED( hResult ) )
  2711. {
  2712. Convert( szText, bstrVal );
  2713. SysFreeString( bstrVal );
  2714. }
  2715. else
  2716. {
  2717. TRACE( _T("[ADSVW] Error: get_CaseExactString returns %lx\n"), hResult );
  2718. }
  2719. hResult = pPropValue->get_DNString( &bstrVal );
  2720. if( SUCCEEDED( hResult ) )
  2721. {
  2722. TRACE( _T("[ADSVW] Error: get_DNString should fail\n") );
  2723. SysFreeString( bstrVal );
  2724. }
  2725. break;
  2726. }
  2727. case ADSTYPE_CASE_IGNORE_STRING:
  2728. {
  2729. hResult = pPropValue->get_CaseIgnoreString( &bstrVal );
  2730. if( SUCCEEDED( hResult ) )
  2731. {
  2732. Convert( szText, bstrVal );
  2733. SysFreeString( bstrVal );
  2734. }
  2735. else
  2736. {
  2737. TRACE( _T("[ADSVW] Error: get_CaseIgnoreString returns %lx\n"), hResult );
  2738. }
  2739. hResult = pPropValue->get_DNString( &bstrVal );
  2740. if( SUCCEEDED( hResult ) )
  2741. {
  2742. TRACE( _T("[ADSVW] Error: get_DNString should fail\n") );
  2743. SysFreeString( bstrVal );
  2744. }
  2745. break;
  2746. }
  2747. case ADSTYPE_PRINTABLE_STRING:
  2748. {
  2749. hResult = pPropValue->get_PrintableString( &bstrVal );
  2750. if( SUCCEEDED( hResult ) )
  2751. {
  2752. Convert( szText, bstrVal );
  2753. SysFreeString( bstrVal );
  2754. }
  2755. else
  2756. {
  2757. TRACE( _T("[ADSVW] Error: get_PrintableString returns %lx\n"), hResult );
  2758. }
  2759. hResult = pPropValue->get_DNString( &bstrVal );
  2760. if( SUCCEEDED( hResult ) )
  2761. {
  2762. TRACE( _T("[ADSVW] Error: get_DNString should fail\n") );
  2763. SysFreeString( bstrVal );
  2764. }
  2765. break;
  2766. }
  2767. case ADSTYPE_NUMERIC_STRING:
  2768. {
  2769. hResult = pPropValue->get_NumericString( &bstrVal );
  2770. if( SUCCEEDED( hResult ) )
  2771. {
  2772. Convert( szText, bstrVal );
  2773. SysFreeString( bstrVal );
  2774. }
  2775. else
  2776. {
  2777. TRACE( _T("[ADSVW] Error: get_NumericString returns %lx\n"), hResult );
  2778. }
  2779. hResult = pPropValue->get_DNString( &bstrVal );
  2780. if( SUCCEEDED( hResult ) )
  2781. {
  2782. TRACE( _T("[ADSVW] Error: get_DNString should fail\n") );
  2783. SysFreeString( bstrVal );
  2784. }
  2785. break;
  2786. }
  2787. case ADSTYPE_BOOLEAN:
  2788. {
  2789. long lValue;
  2790. hResult = pPropValue->get_Boolean( &lValue );
  2791. if( SUCCEEDED( hResult ) )
  2792. {
  2793. _ltot( lValue, szText, 10 );
  2794. }
  2795. else
  2796. {
  2797. TRACE( _T("[ADSVW] Error: get_Boolean returns %lx\n"), hResult );
  2798. }
  2799. hResult = pPropValue->get_Integer( &lValue );
  2800. if( SUCCEEDED( hResult ) )
  2801. {
  2802. TRACE( _T("[ADSVW] Error: get_Integer should fail\n") );
  2803. }
  2804. break;
  2805. }
  2806. default:
  2807. ASSERT( FALSE );
  2808. break;
  2809. }
  2810. break;
  2811. }
  2812. pPropValue->Release( );
  2813. return TRUE;
  2814. }
  2815. /******************************************************************************
  2816. Function: PurgeObject
  2817. Arguments:
  2818. Return:
  2819. Purpose:
  2820. Author(s):
  2821. Revision:
  2822. Date:
  2823. ******************************************************************************/
  2824. HRESULT PurgeObject( IADsContainer* pParent, IUnknown* pIUnknown, LPWSTR pszPrefix )
  2825. {
  2826. BSTR bstrName = NULL;
  2827. BSTR bstrClass = NULL;
  2828. VARIANT var;
  2829. HRESULT hResult;
  2830. IUnknown* pIChildUnk = NULL;
  2831. IADs* pIChildOleDs = NULL;
  2832. IADs* pADs;
  2833. BSTR bstrObjName, bstrObjClass;
  2834. IEnumVARIANT* pIEnumVar = NULL;
  2835. IADsContainer* pIContainer = NULL;
  2836. ULONG ulFetch = 0L;
  2837. //BOOL bDelete;
  2838. if( NULL == pParent || NULL == pIUnknown )
  2839. return FALSE;
  2840. hResult = pIUnknown->QueryInterface( IID_IADs,
  2841. (void**)&pADs );
  2842. if( FAILED( hResult ) )
  2843. return FALSE;
  2844. pADs->get_Name( &bstrObjName );
  2845. pADs->get_Class( &bstrObjClass );
  2846. pADs->Release( );
  2847. hResult = pIUnknown->QueryInterface( IID_IADsContainer,
  2848. (void**)&pIContainer );
  2849. if( FAILED( hResult ) )
  2850. {
  2851. if( NULL != pszPrefix && !_wcsnicmp( bstrObjName, pszPrefix, wcslen(pszPrefix) ) )
  2852. {
  2853. hResult = pParent->Delete( bstrObjClass, bstrObjName );
  2854. TRACE( _T("Delete %S returns %lx\n"), bstrObjName, hResult );
  2855. }
  2856. if( NULL == pszPrefix )
  2857. {
  2858. hResult = pParent->Delete( bstrObjClass, bstrObjName );
  2859. TRACE( _T("Delete %S returns %lx\n"), bstrObjName, hResult );
  2860. }
  2861. SysFreeString( bstrObjClass );
  2862. SysFreeString( bstrObjName );
  2863. return S_OK;
  2864. }
  2865. hResult = ADsBuildEnumerator( pIContainer, &pIEnumVar );
  2866. while( SUCCEEDED( hResult ) )
  2867. {
  2868. ulFetch = 0L;
  2869. hResult = ADsEnumerateNext( pIEnumVar, 1, &var, &ulFetch );
  2870. if( FAILED( hResult ) )
  2871. continue;
  2872. if( !ulFetch )
  2873. break;
  2874. V_DISPATCH( &var )->QueryInterface( IID_IUnknown, (void**)&pIChildUnk );
  2875. VariantClear( &var );
  2876. if( NULL != pIChildUnk )
  2877. {
  2878. PurgeObject( pIContainer, pIChildUnk, pszPrefix );
  2879. pIChildUnk->Release( );
  2880. }
  2881. pIChildUnk = NULL;
  2882. }
  2883. if( NULL != pIEnumVar )
  2884. {
  2885. ADsFreeEnumerator( pIEnumVar );
  2886. }
  2887. pIContainer->Release( );
  2888. hResult = pParent->Delete( bstrObjClass, bstrObjName );
  2889. TRACE( _T("\tDelete %S (%S) ends with %lx\n"), bstrObjName, bstrObjClass );
  2890. SysFreeString( bstrObjClass );
  2891. SysFreeString( bstrObjName );
  2892. return hResult;
  2893. }
  2894. /******************************************************************************
  2895. Function: Bolb2String
  2896. Arguments:
  2897. Return:
  2898. Purpose:
  2899. Author(s):
  2900. Revision:
  2901. Date:
  2902. ******************************************************************************/
  2903. CString Blob2String( void* pData, DWORD dwSize )
  2904. {
  2905. DWORD dwIdx;
  2906. TCHAR* pText;
  2907. BYTE* pByte = (BYTE*)pData;
  2908. CString strText;
  2909. pText = (TCHAR*)AllocADsMem( 1 + dwSize * 3 * sizeof( TCHAR ) );
  2910. memset( pText, 0, 1 + dwSize * 3 * sizeof( TCHAR ) );
  2911. for( dwIdx = 0; dwIdx < dwSize ; dwIdx++ )
  2912. {
  2913. _stprintf( pText + _tcslen(pText),
  2914. _T("%02x"),
  2915. ((BYTE*)pData)[ dwIdx ] );
  2916. }
  2917. strText = pText;
  2918. FreeADsMem( pText );
  2919. return strText;
  2920. }
  2921. /******************************************************************************
  2922. Function: String2Blob
  2923. Arguments:
  2924. Return:
  2925. Purpose:
  2926. Author(s):
  2927. Revision:
  2928. Date:
  2929. ******************************************************************************/
  2930. HRESULT String2Blob( TCHAR* pszText, void** ppData, DWORD* pdwLength )
  2931. {
  2932. HRESULT hResult;
  2933. CString strText;
  2934. VARIANT vBlob;
  2935. SAFEARRAY* pSafeArray;
  2936. long lBound, uBound, lItem;
  2937. BYTE* pbData;
  2938. strText = pszText;
  2939. *pdwLength = 0;
  2940. hResult = CreateBlobArray( strText, vBlob );
  2941. if( FAILED( hResult ) )
  2942. {
  2943. return hResult;
  2944. }
  2945. pSafeArray = V_ARRAY( &vBlob );
  2946. hResult = SafeArrayGetLBound(pSafeArray, 1, &lBound);
  2947. hResult = SafeArrayGetUBound(pSafeArray, 1, &uBound);
  2948. *pdwLength = (uBound - lBound + 1);
  2949. pbData = (BYTE*) AllocADsMem( sizeof(BYTE) * (uBound - lBound + 1) );
  2950. for( lItem = lBound; lItem <= uBound ; lItem++ )
  2951. {
  2952. hResult = SafeArrayGetElement( pSafeArray,
  2953. &lItem,
  2954. pbData + (lItem - lBound) );
  2955. if( FAILED( hResult ) )
  2956. {
  2957. ASSERT( FALSE );
  2958. break;
  2959. }
  2960. }
  2961. *ppData = (void*)pbData;
  2962. return hResult;
  2963. }
  2964. /******************************************************************************
  2965. Function: AllocTCHAR
  2966. Arguments:
  2967. Return:
  2968. Purpose:
  2969. Author(s):
  2970. Revision:
  2971. Date:
  2972. ******************************************************************************/
  2973. TCHAR* AllocTCHAR ( CHAR* pszText )
  2974. {
  2975. TCHAR* pszAlloc = NULL;
  2976. while( TRUE )
  2977. {
  2978. ASSERT( NULL != pszText );
  2979. if( NULL == pszText )
  2980. break;
  2981. pszAlloc = (TCHAR*) AllocADsMem( sizeof(TCHAR)*(strlen(pszText) + 1) );
  2982. if( NULL == pszAlloc )
  2983. break;
  2984. Convert( pszAlloc, pszText );
  2985. break;
  2986. }
  2987. return pszAlloc;
  2988. }
  2989. /******************************************************************************
  2990. Function: AllocTCHAR
  2991. Arguments:
  2992. Return:
  2993. Purpose:
  2994. Author(s):
  2995. Revision:
  2996. Date:
  2997. ******************************************************************************/
  2998. WCHAR* AllocWCHAR ( CHAR* pszText )
  2999. {
  3000. WCHAR* pszAlloc = NULL;
  3001. while( TRUE )
  3002. {
  3003. ASSERT( NULL != pszText );
  3004. if( NULL == pszText )
  3005. break;
  3006. pszAlloc = (WCHAR*) AllocADsMem( sizeof(WCHAR)*(strlen(pszText) + 1) );
  3007. if( NULL == pszAlloc )
  3008. break;
  3009. Convert( pszAlloc, pszText );
  3010. break;
  3011. }
  3012. return pszAlloc;
  3013. }
  3014. /******************************************************************************
  3015. Function: AllocTCHAR
  3016. Arguments:
  3017. Return:
  3018. Purpose:
  3019. Author(s):
  3020. Revision:
  3021. Date:
  3022. ******************************************************************************/
  3023. TCHAR* AllocTCHAR( WCHAR* pszText )
  3024. {
  3025. TCHAR* pszAlloc = NULL;
  3026. while( TRUE )
  3027. {
  3028. ASSERT( NULL != pszText );
  3029. if( NULL == pszText )
  3030. break;
  3031. pszAlloc = (TCHAR*) AllocADsMem( sizeof(TCHAR)*(wcslen(pszText) + 1) );
  3032. if( NULL == pszAlloc )
  3033. break;
  3034. Convert( pszAlloc, pszText );
  3035. break;
  3036. }
  3037. return pszAlloc;
  3038. }
  3039. /******************************************************************************
  3040. Function: AllocTCHAR
  3041. Arguments:
  3042. Return:
  3043. Purpose:
  3044. Author(s):
  3045. Revision:
  3046. Date:
  3047. ******************************************************************************/
  3048. WCHAR* AllocWCHAR( WCHAR* pszText )
  3049. {
  3050. WCHAR* pszAlloc = NULL;
  3051. while( TRUE )
  3052. {
  3053. ASSERT( NULL != pszText );
  3054. if( NULL == pszText )
  3055. break;
  3056. pszAlloc = (WCHAR*) AllocADsMem( sizeof(WCHAR)*(wcslen(pszText) + 1) );
  3057. if( NULL == pszAlloc )
  3058. break;
  3059. Convert( pszAlloc, pszText );
  3060. break;
  3061. }
  3062. return pszAlloc;
  3063. }
  3064. /*****************************************************************************
  3065. Function: GetVARIANTSize
  3066. Arguments:
  3067. Return:
  3068. Purpose:
  3069. Author(s):
  3070. Revision:
  3071. Date:
  3072. ******************************************************************************/
  3073. long GetVARIANTSize( VARIANT &rVar )
  3074. {
  3075. SAFEARRAY *psa = NULL;
  3076. HRESULT hResult;
  3077. long lLow, lUp;
  3078. ASSERT( VT_ARRAY & V_VT( &rVar ) );
  3079. if( !( VT_ARRAY & V_VT( &rVar ) ) )
  3080. return -1;
  3081. psa = V_ARRAY(&rVar);
  3082. if( NULL == psa )
  3083. return 0;
  3084. hResult = SafeArrayGetLBound( psa, 1, &lLow );
  3085. hResult = SafeArrayGetUBound( psa, 1, &lUp );
  3086. return (lUp - lLow + 1);
  3087. }
  3088. /*****************************************************************************
  3089. Function: GetVARIANTAt
  3090. Arguments:
  3091. Return:
  3092. Purpose:
  3093. Author(s):
  3094. Revision:
  3095. Date:
  3096. ******************************************************************************/
  3097. HRESULT GetVARIANTAt( long lIdx, VARIANT& vArray, VARIANT &vItem )
  3098. {
  3099. SAFEARRAY *psa = NULL;
  3100. HRESULT hResult;
  3101. long lLow, lUp, lPos;
  3102. if( !( VT_ARRAY & V_VT( &vArray ) ) )
  3103. return E_FAIL;
  3104. psa = V_ARRAY(&vArray);
  3105. if( NULL == psa )
  3106. return E_FAIL;
  3107. VariantInit( &vItem );
  3108. hResult = SafeArrayGetLBound( psa, 1, &lLow );
  3109. hResult = SafeArrayGetUBound( psa, 1, &lUp );
  3110. lPos = lLow + lIdx;
  3111. hResult = SafeArrayGetElement( psa, &lPos, &vItem );
  3112. return hResult;
  3113. }
  3114. /******************************************************************************
  3115. Function: GetValuesCount
  3116. Arguments: szText - ptr to TCHAR string to be "tokanized"
  3117. cSep - Token separator
  3118. Return: number of tokens in szText (cSep being the token separator)
  3119. Purpose: The method id used to parse strings. The most common usage is for
  3120. a string containing multiple values.
  3121. Author(s): cezaru
  3122. Revision: 1
  3123. Date: 08/10/97
  3124. ******************************************************************************/
  3125. long GetValuesCount( CString& szText, TCHAR cSep )
  3126. {
  3127. int nIter;
  3128. long lCount = 0;
  3129. for( nIter = 0; nIter < szText.GetLength( ) ; nIter++ )
  3130. {
  3131. if( cSep == szText.GetAt( nIter ) )
  3132. lCount++;
  3133. }
  3134. return ++lCount;
  3135. }
  3136. /******************************************************************************
  3137. Function: GetElements
  3138. Arguments: szText string to be parsed
  3139. cSep token separator character
  3140. lValues tokens count
  3141. Return: an array of strings, each string being a token
  3142. Purpose: breaks a string into multiple tokens
  3143. Author(s): cezaru
  3144. Revision: 1
  3145. Date: 08/10/97
  3146. ******************************************************************************/
  3147. CString GetValueAt( CString& szText, TCHAR cSep, long lValue )
  3148. {
  3149. TCHAR* pszString;
  3150. long lIter, lPos, lVal, lLength;
  3151. TCHAR* pszTemp;
  3152. CString strRes;
  3153. if( lValue >= GetValuesCount( szText, cSep ) )
  3154. return _T("");
  3155. lIter = 0;
  3156. lPos = 0;
  3157. lLength = sizeof(TCHAR) * ( 1 + szText.GetLength( ) );
  3158. pszTemp = (TCHAR*) AllocADsMem( lLength );
  3159. pszString = (TCHAR*) AllocADsMem( lLength );
  3160. while( lIter < lValue )
  3161. {
  3162. if( szText.GetAt( lPos++ ) == cSep )
  3163. lIter++;
  3164. }
  3165. lVal = 0;
  3166. while( lPos < szText.GetLength( ) && szText.GetAt( lPos ) != cSep )
  3167. {
  3168. pszTemp[ lVal++ ] = szText.GetAt( lPos );
  3169. pszTemp[ lVal ] = _T('\0');
  3170. lPos++;
  3171. }
  3172. strRes = pszTemp;
  3173. FreeADsMem( pszTemp );
  3174. return strRes;
  3175. }
  3176. /******************************************************************************
  3177. Function: CreateLargeInteger
  3178. Arguments:
  3179. Return:
  3180. Purpose:
  3181. Author(s): cezaru
  3182. Revision: 1
  3183. Date: 08/10/97
  3184. ******************************************************************************/
  3185. IDispatch* CreateLargeInteger( CString& strText )
  3186. {
  3187. LARGE_INTEGER aLargeInteger;
  3188. IADsLargeInteger* pLInt = NULL;
  3189. IDispatch* pDisp = NULL;
  3190. HRESULT hResult;
  3191. while( TRUE )
  3192. {
  3193. hResult = StringToLARGE_INTEGER( strText.GetBuffer( 128 ), &aLargeInteger );
  3194. hResult = CoCreateInstance(
  3195. CLSID_LargeInteger,
  3196. NULL,
  3197. CLSCTX_INPROC_SERVER,
  3198. IID_IADsLargeInteger,
  3199. (void **)&pLInt );
  3200. ASSERT( SUCCEEDED( hResult ) );
  3201. if( FAILED( hResult ) )
  3202. {
  3203. TRACE( "\tERROR: CoCreateInstance(CLSID_LargeInteger,...) fails with %lx\n", hResult );
  3204. break;
  3205. }
  3206. pLInt->put_HighPart( (LONG)aLargeInteger.HighPart );
  3207. pLInt->put_LowPart( (LONG)aLargeInteger.LowPart );
  3208. hResult = pLInt->QueryInterface( IID_IDispatch, (void**)&pDisp );
  3209. pLInt->Release( );
  3210. break;
  3211. }
  3212. return pDisp;
  3213. }
  3214. /******************************************************************************
  3215. Function: FromLargeInteger
  3216. Arguments:
  3217. Return:
  3218. Purpose:
  3219. Author(s): cezaru
  3220. Revision: 1
  3221. Date: 08/10/97
  3222. ******************************************************************************/
  3223. CString FromLargeInteger( IDispatch* pDisp )
  3224. {
  3225. LARGE_INTEGER aLargeInteger;
  3226. IADsLargeInteger* pLInt = NULL;
  3227. HRESULT hResult;
  3228. TCHAR szText[ 128 ];
  3229. _tcscpy( szText, _T("") );
  3230. while( TRUE )
  3231. {
  3232. hResult = pDisp->QueryInterface( IID_IADsLargeInteger, (void**)&pLInt );
  3233. if( FAILED( hResult ) )
  3234. break;
  3235. hResult = pLInt->get_HighPart( &aLargeInteger.HighPart );
  3236. hResult = pLInt->get_LowPart( (long*) &aLargeInteger.LowPart );
  3237. pLInt->Release( );
  3238. hResult = LARGE_INTEGERToString( szText, &aLargeInteger );
  3239. break;
  3240. }
  3241. return szText;
  3242. }
  3243.