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.

557 lines
13 KiB

  1. //---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995
  5. //
  6. // File: cOrganization.cxx
  7. //
  8. // Contents: Organization object
  9. //
  10. // History: 11-1-95 krishnag Created.
  11. //
  12. //----------------------------------------------------------------------------
  13. #include "nds.hxx"
  14. #pragma hdrstop
  15. struct _propmap
  16. {
  17. LPTSTR pszADsProp;
  18. LPTSTR pszNDSProp;
  19. } aOrgPropMapping[] =
  20. { { TEXT("Description"), TEXT("Description") },
  21. { TEXT("LocalityName"), TEXT("L") },
  22. { TEXT("PostalAddress"), TEXT("Postal Address") },
  23. { TEXT("TelephoneNumber"), TEXT("Telephone Number") },
  24. { TEXT("FaxNumber"), TEXT("Facsimile Telephone Number") },
  25. { TEXT("SeeAlso"), TEXT("See Also") }
  26. };
  27. // Class CNDSOrganization
  28. DEFINE_IDispatch_Implementation(CNDSOrganization)
  29. DEFINE_CONTAINED_IADs_Implementation(CNDSOrganization)
  30. DEFINE_CONTAINED_IDirectoryObject_Implementation(CNDSOrganization)
  31. DEFINE_CONTAINED_IDirectorySearch_Implementation(CNDSOrganization)
  32. DEFINE_CONTAINED_IDirectorySchemaMgmt_Implementation(CNDSOrganization)
  33. DEFINE_CONTAINED_IADsPropertyList_Implementation(CNDSOrganization)
  34. DEFINE_CONTAINED_IADsPutGet_Implementation(CNDSOrganization, aOrgPropMapping)
  35. CNDSOrganization::CNDSOrganization():
  36. _pADs(NULL),
  37. _pDSObject(NULL),
  38. _pDSSearch(NULL),
  39. _pDSSchemaMgmt(NULL),
  40. _pADsContainer(NULL),
  41. _pADsPropList(NULL),
  42. _pDispMgr(NULL)
  43. {
  44. ENLIST_TRACKING(CNDSOrganization);
  45. }
  46. HRESULT
  47. CNDSOrganization::CreateOrganization(
  48. IADs * pADs,
  49. REFIID riid,
  50. void **ppvObj
  51. )
  52. {
  53. CNDSOrganization FAR * pOrganization = NULL;
  54. HRESULT hr = S_OK;
  55. hr = AllocateOrganizationObject(pADs, &pOrganization);
  56. BAIL_ON_FAILURE(hr);
  57. hr = pOrganization->QueryInterface(riid, ppvObj);
  58. BAIL_ON_FAILURE(hr);
  59. pOrganization->Release();
  60. RRETURN(hr);
  61. error:
  62. delete pOrganization;
  63. RRETURN_EXP_IF_ERR(hr);
  64. }
  65. CNDSOrganization::~CNDSOrganization( )
  66. {
  67. if ( _pADs )
  68. _pADs->Release();
  69. if ( _pADsContainer )
  70. _pADsContainer->Release();
  71. if (_pDSObject) {
  72. _pDSObject->Release();
  73. }
  74. if (_pDSSearch) {
  75. _pDSSearch->Release();
  76. }
  77. if (_pDSSchemaMgmt) {
  78. _pDSSchemaMgmt->Release();
  79. }
  80. if (_pADsPropList) {
  81. _pADsPropList->Release();
  82. }
  83. delete _pDispMgr;
  84. }
  85. STDMETHODIMP
  86. CNDSOrganization::QueryInterface(
  87. REFIID iid,
  88. LPVOID FAR* ppv
  89. )
  90. {
  91. if (ppv == NULL) {
  92. RRETURN(E_POINTER);
  93. }
  94. if (IsEqualIID(iid, IID_IUnknown))
  95. {
  96. *ppv = (IADsO FAR *) this;
  97. }
  98. else if (IsEqualIID(iid, IID_IADsO))
  99. {
  100. *ppv = (IADsO FAR *) this;
  101. }
  102. else if (IsEqualIID(iid, IID_IADs))
  103. {
  104. *ppv = (IADsO FAR *) this;
  105. }
  106. else if (IsEqualIID(iid, IID_IDispatch))
  107. {
  108. *ppv = (IADsO FAR *) this;
  109. }
  110. else if (IsEqualIID(iid, IID_ISupportErrorInfo))
  111. {
  112. *ppv = (ISupportErrorInfo FAR *) this;
  113. }
  114. else if (IsEqualIID(iid, IID_IADsContainer) && _pADsContainer)
  115. {
  116. *ppv = (IADsContainer FAR *) this;
  117. }
  118. else if (IsEqualIID(iid, IID_IDirectoryObject))
  119. {
  120. *ppv = (IDirectoryObject FAR *) this;
  121. }
  122. else if (IsEqualIID(iid, IID_IDirectorySearch))
  123. {
  124. *ppv = (IDirectorySearch FAR *) this;
  125. }
  126. else if (IsEqualIID(iid, IID_IDirectorySchemaMgmt))
  127. {
  128. *ppv = (IDirectorySchemaMgmt FAR *) this;
  129. }
  130. else if (IsEqualIID(iid, IID_IADsPropertyList) && _pADsPropList)
  131. {
  132. *ppv = (IADsPropertyList FAR *) this;
  133. }
  134. else
  135. {
  136. *ppv = NULL;
  137. return E_NOINTERFACE;
  138. }
  139. AddRef();
  140. return NOERROR;
  141. }
  142. HRESULT
  143. CNDSOrganization::AllocateOrganizationObject(
  144. IADs *pADs,
  145. CNDSOrganization ** ppOrganization
  146. )
  147. {
  148. CNDSOrganization FAR * pOrganization = NULL;
  149. CDispatchMgr FAR * pDispMgr = NULL;
  150. HRESULT hr = S_OK;
  151. IADsContainer FAR * pADsContainer = NULL;
  152. IDirectoryObject * pDSObject = NULL;
  153. IDirectorySearch * pDSSearch = NULL;
  154. IDirectorySchemaMgmt * pDSSchemaMgmt = NULL;
  155. IADsPropertyList * pADsPropList = NULL;
  156. pOrganization = new CNDSOrganization();
  157. if (pOrganization == NULL) {
  158. hr = E_OUTOFMEMORY;
  159. }
  160. BAIL_ON_FAILURE(hr);
  161. pDispMgr = new CDispatchMgr;
  162. if (pDispMgr == NULL) {
  163. hr = E_OUTOFMEMORY;
  164. }
  165. BAIL_ON_FAILURE(hr);
  166. hr = LoadTypeInfoEntry(
  167. pDispMgr,
  168. LIBID_ADs,
  169. IID_IADsO,
  170. (IADsO *)pOrganization,
  171. DISPID_REGULAR
  172. );
  173. BAIL_ON_FAILURE(hr);
  174. hr = LoadTypeInfoEntry(
  175. pDispMgr,
  176. LIBID_ADs,
  177. IID_IADsContainer,
  178. (IADsContainer *)pOrganization,
  179. DISPID_NEWENUM
  180. );
  181. BAIL_ON_FAILURE(hr);
  182. hr = LoadTypeInfoEntry(
  183. pDispMgr,
  184. LIBID_ADs,
  185. IID_IADsPropertyList,
  186. (IADsPropertyList *)pOrganization,
  187. DISPID_VALUE
  188. );
  189. BAIL_ON_FAILURE(hr);
  190. hr = pADs->QueryInterface(
  191. IID_IDirectoryObject,
  192. (void **)&pDSObject
  193. );
  194. BAIL_ON_FAILURE(hr);
  195. pOrganization->_pDSObject = pDSObject;
  196. hr = pADs->QueryInterface(
  197. IID_IDirectorySearch,
  198. (void **)&pDSSearch
  199. );
  200. BAIL_ON_FAILURE(hr);
  201. pOrganization->_pDSSearch = pDSSearch;
  202. hr = pADs->QueryInterface(
  203. IID_IDirectorySchemaMgmt,
  204. (void **)&pDSSchemaMgmt
  205. );
  206. BAIL_ON_FAILURE(hr);
  207. pOrganization->_pDSSchemaMgmt = pDSSchemaMgmt;
  208. hr = pADs->QueryInterface(
  209. IID_IADsPropertyList,
  210. (void **)&pADsPropList
  211. );
  212. BAIL_ON_FAILURE(hr);
  213. pOrganization->_pADsPropList = pADsPropList;
  214. //
  215. // Store the pointer to the internal generic object
  216. // AND add ref this pointer
  217. //
  218. pOrganization->_pADs = pADs;
  219. pADs->AddRef();
  220. //
  221. // Store a pointer to the Container interface
  222. //
  223. hr = pADs->QueryInterface(
  224. IID_IADsContainer,
  225. (void **)&pADsContainer
  226. );
  227. BAIL_ON_FAILURE(hr);
  228. pOrganization->_pADsContainer = pADsContainer;
  229. pOrganization->_pDispMgr = pDispMgr;
  230. *ppOrganization = pOrganization;
  231. RRETURN(hr);
  232. error:
  233. delete pOrganization;
  234. delete pDispMgr;
  235. *ppOrganization = NULL;
  236. RRETURN(hr);
  237. }
  238. /* ISupportErrorInfo method */
  239. STDMETHODIMP
  240. CNDSOrganization::InterfaceSupportsErrorInfo(
  241. THIS_ REFIID riid
  242. )
  243. {
  244. if (IsEqualIID(riid, IID_IADs) ||
  245. #if 0
  246. IsEqualIID(riid, IID_IDirectoryObject) ||
  247. IsEqualIID(riid, IID_IDirectorySearch) ||
  248. IsEqualIID(riid, IID_IDirectorySchemaMgmt) ||
  249. #endif
  250. IsEqualIID(riid, IID_IADsO) ||
  251. IsEqualIID(riid, IID_IADsContainer) ||
  252. IsEqualIID(riid, IID_IADsPropertyList)) {
  253. RRETURN(S_OK);
  254. } else {
  255. RRETURN(S_FALSE);
  256. }
  257. }
  258. STDMETHODIMP CNDSOrganization::get_Description(THIS_ BSTR FAR* retval)
  259. {
  260. GET_PROPERTY_BSTR((IADsO *)this,Description);
  261. }
  262. STDMETHODIMP CNDSOrganization::put_Description(THIS_ BSTR bstrDescription)
  263. {
  264. PUT_PROPERTY_BSTR((IADsO *)this,Description);
  265. }
  266. STDMETHODIMP CNDSOrganization::get_LocalityName(THIS_ BSTR FAR* retval)
  267. {
  268. GET_PROPERTY_BSTR((IADsO *)this,LocalityName);
  269. }
  270. STDMETHODIMP CNDSOrganization::put_LocalityName(THIS_ BSTR bstrLocalityName)
  271. {
  272. PUT_PROPERTY_BSTR((IADsO *)this,LocalityName);
  273. }
  274. STDMETHODIMP CNDSOrganization::get_PostalAddress(THIS_ BSTR FAR* retval)
  275. {
  276. GET_PROPERTY_BSTR((IADsO *)this,PostalAddress);
  277. }
  278. STDMETHODIMP CNDSOrganization::put_PostalAddress(THIS_ BSTR bstrPostalAddress)
  279. {
  280. PUT_PROPERTY_BSTR((IADsO *)this,PostalAddress);
  281. }
  282. STDMETHODIMP CNDSOrganization::get_TelephoneNumber(THIS_ BSTR FAR* retval)
  283. {
  284. GET_PROPERTY_BSTR((IADsO *)this,TelephoneNumber);
  285. }
  286. STDMETHODIMP CNDSOrganization::put_TelephoneNumber(THIS_ BSTR bstrTelephoneNumber)
  287. {
  288. PUT_PROPERTY_BSTR((IADsO *)this,TelephoneNumber);
  289. }
  290. STDMETHODIMP CNDSOrganization::get_FaxNumber(THIS_ BSTR FAR* retval)
  291. {
  292. GET_PROPERTY_BSTR((IADsO *)this,FaxNumber);
  293. }
  294. STDMETHODIMP CNDSOrganization::put_FaxNumber(THIS_ BSTR bstrFaxNumber)
  295. {
  296. PUT_PROPERTY_BSTR((IADsO *)this,FaxNumber);
  297. }
  298. STDMETHODIMP CNDSOrganization::get_SeeAlso(THIS_ VARIANT FAR* retval)
  299. {
  300. GET_PROPERTY_VARIANT((IADsO *)this,SeeAlso);
  301. }
  302. STDMETHODIMP CNDSOrganization::put_SeeAlso(THIS_ VARIANT vSeeAlso)
  303. {
  304. PUT_PROPERTY_VARIANT((IADsO *)this,SeeAlso);
  305. }
  306. /* IADsContainer methods */
  307. STDMETHODIMP
  308. CNDSOrganization::get_Count(long FAR* retval)
  309. {
  310. HRESULT hr = E_NOTIMPL;
  311. if (_pADsContainer) {
  312. hr = _pADsContainer->get_Count(
  313. retval
  314. );
  315. }
  316. RRETURN_EXP_IF_ERR(hr);
  317. }
  318. STDMETHODIMP
  319. CNDSOrganization::get_Filter(THIS_ VARIANT FAR* pVar)
  320. {
  321. HRESULT hr = E_NOTIMPL;
  322. if (_pADsContainer) {
  323. hr = _pADsContainer->get_Filter(
  324. pVar
  325. );
  326. }
  327. RRETURN_EXP_IF_ERR(hr);
  328. }
  329. STDMETHODIMP
  330. CNDSOrganization::put_Filter(THIS_ VARIANT Var)
  331. {
  332. HRESULT hr = E_NOTIMPL;
  333. if (_pADsContainer) {
  334. hr = _pADsContainer->put_Filter(
  335. Var
  336. );
  337. }
  338. RRETURN_EXP_IF_ERR(hr);
  339. }
  340. STDMETHODIMP
  341. CNDSOrganization::put_Hints(THIS_ VARIANT Var)
  342. {
  343. HRESULT hr = E_NOTIMPL;
  344. if (_pADsContainer) {
  345. hr = _pADsContainer->put_Hints(
  346. Var
  347. );
  348. }
  349. RRETURN_EXP_IF_ERR(hr);
  350. }
  351. STDMETHODIMP
  352. CNDSOrganization::get_Hints(THIS_ VARIANT FAR* pVar)
  353. {
  354. HRESULT hr = E_NOTIMPL;
  355. if (_pADsContainer) {
  356. hr = _pADsContainer->get_Hints(
  357. pVar
  358. );
  359. }
  360. RRETURN_EXP_IF_ERR(hr);
  361. }
  362. STDMETHODIMP
  363. CNDSOrganization::GetObject(
  364. BSTR ClassName,
  365. BSTR RelativeName,
  366. IDispatch * FAR* ppObject
  367. )
  368. {
  369. HRESULT hr = E_NOTIMPL;
  370. if (_pADsContainer) {
  371. hr = _pADsContainer->GetObject(
  372. ClassName,
  373. RelativeName,
  374. ppObject
  375. );
  376. }
  377. RRETURN_EXP_IF_ERR(hr);
  378. }
  379. STDMETHODIMP
  380. CNDSOrganization::get__NewEnum(
  381. THIS_ IUnknown * FAR* retval
  382. )
  383. {
  384. HRESULT hr = E_NOTIMPL;
  385. if (_pADsContainer) {
  386. hr = _pADsContainer->get__NewEnum(
  387. retval
  388. );
  389. }
  390. RRETURN_EXP_IF_ERR(hr);
  391. }
  392. STDMETHODIMP
  393. CNDSOrganization::Create(
  394. THIS_ BSTR ClassName,
  395. BSTR RelativeName,
  396. IDispatch * FAR* ppObject
  397. )
  398. {
  399. HRESULT hr = E_NOTIMPL;
  400. if (_pADsContainer) {
  401. hr = _pADsContainer->Create(
  402. ClassName,
  403. RelativeName,
  404. ppObject
  405. );
  406. }
  407. RRETURN_EXP_IF_ERR(hr);
  408. }
  409. STDMETHODIMP
  410. CNDSOrganization::Delete(
  411. THIS_ BSTR bstrClassName,
  412. BSTR bstrRelativeName
  413. )
  414. {
  415. HRESULT hr = E_NOTIMPL;
  416. if (_pADsContainer) {
  417. hr = _pADsContainer->Delete(
  418. bstrClassName,
  419. bstrRelativeName
  420. );
  421. }
  422. RRETURN_EXP_IF_ERR(hr);
  423. }
  424. STDMETHODIMP
  425. CNDSOrganization::CopyHere(
  426. THIS_ BSTR SourceName,
  427. BSTR NewName,
  428. IDispatch * FAR* ppObject
  429. )
  430. {
  431. HRESULT hr = E_NOTIMPL;
  432. if (_pADsContainer) {
  433. hr = _pADsContainer->CopyHere(
  434. SourceName,
  435. NewName,
  436. ppObject
  437. );
  438. }
  439. RRETURN_EXP_IF_ERR(hr);
  440. }
  441. STDMETHODIMP
  442. CNDSOrganization::MoveHere(
  443. THIS_ BSTR SourceName,
  444. BSTR NewName,
  445. IDispatch * FAR* ppObject
  446. )
  447. {
  448. HRESULT hr = E_NOTIMPL;
  449. if (_pADsContainer) {
  450. hr = _pADsContainer->MoveHere(
  451. SourceName,
  452. NewName,
  453. ppObject
  454. );
  455. }
  456. RRETURN_EXP_IF_ERR(hr);
  457. }
  458.