Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
6.7 KiB

  1. #include "oleds.hxx"
  2. #pragma hdrstop
  3. #define DISPID_REGULAR 1
  4. // Class CADsNamespaces
  5. DEFINE_IDispatch_Implementation(CADsNamespaces)
  6. DEFINE_IADs_Implementation(CADsNamespaces)
  7. CADsNamespaces::CADsNamespaces():
  8. _pDispMgr(NULL),
  9. _bstrDefaultContainer(NULL)
  10. {
  11. VariantInit(&_vFilter);
  12. ENLIST_TRACKING(CADsNamespaces);
  13. }
  14. HRESULT
  15. CADsNamespaces::CreateNamespaces(
  16. BSTR Parent,
  17. BSTR NamespacesName,
  18. DWORD dwObjectState,
  19. REFIID riid,
  20. void **ppvObj
  21. )
  22. {
  23. CADsNamespaces FAR * pNamespaces = NULL;
  24. HRESULT hr = S_OK;
  25. hr = AllocateNamespacesObject(&pNamespaces);
  26. BAIL_ON_FAILURE(hr);
  27. hr = pNamespaces->InitializeCoreObject(Parent,
  28. NamespacesName,
  29. L"Namespaces",
  30. CLSID_ADsNamespaces,
  31. dwObjectState);
  32. BAIL_ON_FAILURE(hr);
  33. hr = pNamespaces->QueryInterface(riid, ppvObj);
  34. BAIL_ON_FAILURE(hr);
  35. pNamespaces->Release();
  36. RRETURN(hr);
  37. error:
  38. delete pNamespaces;
  39. RRETURN_EXP_IF_ERR(hr);
  40. }
  41. CADsNamespaces::~CADsNamespaces( )
  42. {
  43. ADsFreeString(_bstrDefaultContainer);
  44. delete _pDispMgr;
  45. }
  46. STDMETHODIMP
  47. CADsNamespaces::QueryInterface(
  48. REFIID iid,
  49. LPVOID FAR* ppv
  50. )
  51. {
  52. if (IsEqualIID(iid, IID_IUnknown))
  53. {
  54. *ppv = (IADs FAR *)this;
  55. }
  56. else if (IsEqualIID(iid, IID_IDispatch))
  57. {
  58. *ppv = (IADs FAR *)this;
  59. }
  60. else if (IsEqualIID(iid, IID_ISupportErrorInfo))
  61. {
  62. *ppv = (ISupportErrorInfo FAR *) this;
  63. }
  64. else if (IsEqualIID(iid, IID_IADsContainer))
  65. {
  66. *ppv = (IADsContainer FAR *) this;
  67. }
  68. else if (IsEqualIID(iid, IID_IADsNamespaces))
  69. {
  70. *ppv = (IADsNamespaces FAR *) this;
  71. }
  72. else if (IsEqualIID(iid, IID_IADs))
  73. {
  74. *ppv = (IADs FAR *) this;
  75. }
  76. else
  77. {
  78. *ppv = NULL;
  79. return E_NOINTERFACE;
  80. }
  81. AddRef();
  82. return NOERROR;
  83. }
  84. //
  85. // ISupportErrorInfo method
  86. //
  87. STDMETHODIMP
  88. CADsNamespaces::InterfaceSupportsErrorInfo(THIS_ REFIID riid)
  89. {
  90. if (IsEqualIID(riid, IID_IADs) ||
  91. IsEqualIID(riid, IID_IADsContainer) ||
  92. IsEqualIID(riid, IID_IADsNamespaces)) {
  93. return S_OK;
  94. } else {
  95. return S_FALSE;
  96. }
  97. }
  98. STDMETHODIMP
  99. CADsNamespaces::SetInfo()
  100. {
  101. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  102. }
  103. STDMETHODIMP
  104. CADsNamespaces::GetInfo()
  105. {
  106. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  107. }
  108. /* IADsContainer methods */
  109. STDMETHODIMP
  110. CADsNamespaces::get_Count(long FAR* retval)
  111. {
  112. RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
  113. }
  114. STDMETHODIMP
  115. CADsNamespaces::get_Filter(THIS_ VARIANT FAR* pVar)
  116. {
  117. HRESULT hr;
  118. VariantInit(pVar);
  119. hr = VariantCopy(pVar, &_vFilter);
  120. RRETURN_EXP_IF_ERR(hr);
  121. }
  122. STDMETHODIMP
  123. CADsNamespaces::put_Filter(THIS_ VARIANT Var)
  124. {
  125. HRESULT hr;
  126. VariantClear(&_vFilter);
  127. hr = VariantCopy(&_vFilter, &Var);
  128. RRETURN_EXP_IF_ERR(hr);
  129. }
  130. STDMETHODIMP
  131. CADsNamespaces::get_Hints(THIS_ VARIANT FAR* pHints)
  132. {
  133. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  134. }
  135. STDMETHODIMP
  136. CADsNamespaces::put_Hints(THIS_ VARIANT Hints)
  137. {
  138. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  139. }
  140. STDMETHODIMP
  141. CADsNamespaces::GetObject(
  142. THIS_ BSTR ClassName,
  143. BSTR RelativeName,
  144. IDispatch * FAR* ppObject
  145. )
  146. {
  147. WCHAR szBuffer[MAX_PATH];
  148. HRESULT hr = S_OK;
  149. if (!RelativeName || !*RelativeName) {
  150. RRETURN(E_ADS_UNKNOWN_OBJECT);
  151. }
  152. wcscpy(szBuffer, RelativeName);
  153. hr = ::GetObject(
  154. szBuffer,
  155. IID_IDispatch,
  156. (LPVOID *)ppObject,
  157. TRUE
  158. );
  159. BAIL_ON_FAILURE(hr);
  160. error:
  161. RRETURN_EXP_IF_ERR(hr);
  162. }
  163. STDMETHODIMP
  164. CADsNamespaces::get__NewEnum(THIS_ IUnknown * FAR* retval)
  165. {
  166. HRESULT hr;
  167. IUnknown FAR* punkEnum=NULL;
  168. IEnumVARIANT * penum = NULL;
  169. *retval = NULL;
  170. //
  171. // Create new enumerator for items currently
  172. // in collection and QI for IUnknown
  173. //
  174. hr = CEnumVariant::Create(&penum);
  175. if (FAILED(hr)){
  176. goto error;
  177. }
  178. hr = penum->QueryInterface(IID_IUnknown,
  179. (VOID FAR* FAR*)retval);
  180. if (FAILED(hr)){
  181. goto error;
  182. }
  183. if (penum) {
  184. penum->Release();
  185. }
  186. return NOERROR;
  187. error:
  188. if (penum) {
  189. delete penum;
  190. }
  191. RRETURN_EXP_IF_ERR(hr);
  192. }
  193. //
  194. // IADsNamespaces methods
  195. //
  196. STDMETHODIMP
  197. CADsNamespaces::get_DefaultContainer(THIS_ BSTR FAR* retval)
  198. {
  199. LPTSTR pszDefContainer = NULL;
  200. HRESULT hr;
  201. hr = QueryKeyValue(DEF_CONT_REG_LOCATION,
  202. TEXT("DefaultContainer"),
  203. &pszDefContainer);
  204. BAIL_IF_ERROR(hr);
  205. hr = ADsAllocString(pszDefContainer, retval);
  206. cleanup:
  207. if(pszDefContainer){
  208. FreeADsMem(pszDefContainer);
  209. }
  210. RRETURN_EXP_IF_ERR(hr);
  211. }
  212. STDMETHODIMP
  213. CADsNamespaces::put_DefaultContainer(THIS_ BSTR bstrDefaultContainer)
  214. {
  215. HRESULT hr = S_OK;
  216. hr = SetKeyAndValue(DEF_CONT_REG_LOCATION,
  217. TEXT("DefaultContainer"),
  218. NULL,
  219. bstrDefaultContainer);
  220. RRETURN_EXP_IF_ERR(hr);
  221. }
  222. STDMETHODIMP
  223. CADsNamespaces::Create(THIS_ BSTR ClassName, BSTR RelativeName, IDispatch * FAR* ppObject)
  224. {
  225. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  226. }
  227. STDMETHODIMP
  228. CADsNamespaces::Delete(THIS_ BSTR SourceName, BSTR Type)
  229. {
  230. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  231. }
  232. STDMETHODIMP
  233. CADsNamespaces::CopyHere(THIS_ BSTR SourceName, BSTR NewName, IDispatch * FAR* ppObject)
  234. {
  235. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  236. }
  237. STDMETHODIMP
  238. CADsNamespaces::MoveHere(
  239. THIS_ BSTR SourceName,
  240. BSTR NewName,
  241. IDispatch * FAR* ppObject
  242. )
  243. {
  244. RRETURN_EXP_IF_ERR(E_NOTIMPL);
  245. }
  246. HRESULT
  247. CADsNamespaces::AllocateNamespacesObject(
  248. CADsNamespaces ** ppNamespaces
  249. )
  250. {
  251. CADsNamespaces FAR * pNamespaces = NULL;
  252. CDispatchMgr FAR * pDispMgr = NULL;
  253. HRESULT hr = S_OK;
  254. pNamespaces = new CADsNamespaces();
  255. if (pNamespaces == NULL) {
  256. hr = E_OUTOFMEMORY;
  257. }
  258. BAIL_ON_FAILURE(hr);
  259. pDispMgr = new CDispatchMgr;
  260. if (pDispMgr == NULL) {
  261. hr = E_OUTOFMEMORY;
  262. }
  263. BAIL_ON_FAILURE(hr);
  264. hr = LoadTypeInfoEntry(pDispMgr,
  265. LIBID_ADs,
  266. IID_IADs,
  267. (IADs *)pNamespaces,
  268. DISPID_REGULAR);
  269. BAIL_ON_FAILURE(hr);
  270. hr = LoadTypeInfoEntry(pDispMgr,
  271. LIBID_ADs,
  272. IID_IADsContainer,
  273. (IADsContainer *)pNamespaces,
  274. DISPID_NEWENUM);
  275. BAIL_ON_FAILURE(hr);
  276. pNamespaces->_pDispMgr = pDispMgr;
  277. *ppNamespaces = pNamespaces;
  278. RRETURN(hr);
  279. error:
  280. delete pDispMgr;
  281. RRETURN_EXP_IF_ERR(hr);
  282. }