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.

476 lines
12 KiB

  1. //
  2. // computil.cpp
  3. //
  4. #include "private.h"
  5. #include "computil.h"
  6. #include "catutil.h"
  7. #include "helpers.h"
  8. ITfCategoryMgr *GetUIMCat();
  9. //+---------------------------------------------------------------------------
  10. //
  11. // GetCompartment
  12. //
  13. //----------------------------------------------------------------------------
  14. HRESULT GetCompartment(IUnknown *punk, REFGUID rguidComp, ITfCompartment **ppComp, BOOL fGlobal)
  15. {
  16. HRESULT hr = E_FAIL;
  17. ITfCompartmentMgr *pCompMgr = NULL;
  18. ITfThreadMgr *ptim = NULL;
  19. Assert(ppComp);
  20. *ppComp = NULL;
  21. if (fGlobal)
  22. {
  23. if (FAILED(hr = punk->QueryInterface(IID_ITfThreadMgr,
  24. (void **)&ptim)))
  25. goto Exit;
  26. if (FAILED(hr = ptim->GetGlobalCompartment(&pCompMgr)))
  27. goto Exit;
  28. }
  29. else
  30. {
  31. if (FAILED(hr = punk->QueryInterface(IID_ITfCompartmentMgr,
  32. (void **)&pCompMgr)))
  33. goto Exit;
  34. }
  35. if (SUCCEEDED(hr) && pCompMgr)
  36. {
  37. hr = pCompMgr->GetCompartment(rguidComp, ppComp);
  38. pCompMgr->Release();
  39. }
  40. else
  41. hr = E_FAIL;
  42. Exit:
  43. if (ptim)
  44. ptim->Release();
  45. return hr;
  46. }
  47. //+---------------------------------------------------------------------------
  48. //
  49. // SetCompartmentDWORD
  50. //
  51. //----------------------------------------------------------------------------
  52. HRESULT SetCompartmentDWORD(TfClientId tid, IUnknown *punk, REFGUID rguidComp, DWORD dw, BOOL fGlobal)
  53. {
  54. HRESULT hr;
  55. ITfCompartment *pComp;
  56. VARIANT var;
  57. if (SUCCEEDED(hr = GetCompartment(punk, rguidComp, &pComp, fGlobal)))
  58. {
  59. var.vt = VT_I4;
  60. var.lVal = dw;
  61. hr = pComp->SetValue(tid, &var);
  62. pComp->Release();
  63. }
  64. return hr;
  65. }
  66. //+---------------------------------------------------------------------------
  67. //
  68. // GetCompartmentDWORD
  69. //
  70. //----------------------------------------------------------------------------
  71. HRESULT GetCompartmentDWORD(IUnknown *punk, REFGUID rguidComp, DWORD *pdw, BOOL fGlobal)
  72. {
  73. HRESULT hr;
  74. ITfCompartment *pComp;
  75. VARIANT var;
  76. *pdw = 0;
  77. if (SUCCEEDED(hr = GetCompartment(punk, rguidComp, &pComp, fGlobal)))
  78. {
  79. if ((hr = pComp->GetValue(&var)) == S_OK)
  80. {
  81. Assert(var.vt == VT_I4);
  82. *pdw = var.lVal;
  83. }
  84. pComp->Release();
  85. }
  86. return hr;
  87. }
  88. //+---------------------------------------------------------------------------
  89. //
  90. // ToggleCompartmentDWORD
  91. //
  92. // Toggle DWORD value between 0 and 1.
  93. //
  94. //----------------------------------------------------------------------------
  95. HRESULT ToggleCompartmentDWORD(TfClientId tid, IUnknown *punk, REFGUID rguidComp, BOOL fGlobal)
  96. {
  97. HRESULT hr;
  98. ITfCompartment *pComp;
  99. VARIANT var;
  100. if (SUCCEEDED(hr = GetCompartment(punk, rguidComp, &pComp, fGlobal)))
  101. {
  102. if ((hr = pComp->GetValue(&var)) == S_OK)
  103. {
  104. Assert(var.vt == VT_I4);
  105. var.lVal = !var.lVal;
  106. hr = pComp->SetValue(tid, &var);
  107. }
  108. else
  109. {
  110. var.vt = VT_I4;
  111. var.lVal = 0x01;
  112. hr = pComp->SetValue(tid, &var);
  113. }
  114. pComp->Release();
  115. }
  116. return hr;
  117. }
  118. //+---------------------------------------------------------------------------
  119. //
  120. // SetCompartmentGUIDATOM
  121. //
  122. //----------------------------------------------------------------------------
  123. HRESULT SetCompartmentGUIDATOM(TfClientId tid, IUnknown *punk, REFGUID rguidComp, TfGuidAtom guidatom, BOOL fGlobal)
  124. {
  125. HRESULT hr;
  126. ITfCompartment *pComp;
  127. VARIANT var;
  128. if (SUCCEEDED(hr = GetCompartment(punk, rguidComp, &pComp, fGlobal)))
  129. {
  130. var.vt = VT_I4;
  131. var.lVal = guidatom;
  132. hr = pComp->SetValue(tid, &var);
  133. pComp->Release();
  134. }
  135. return hr;
  136. }
  137. //+---------------------------------------------------------------------------
  138. //
  139. // GetCompartmentGUIDATOM
  140. //
  141. //----------------------------------------------------------------------------
  142. HRESULT GetCompartmentGUIDATOM(IUnknown *punk, REFGUID rguidComp, TfGuidAtom *pga, BOOL fGlobal)
  143. {
  144. HRESULT hr;
  145. ITfCompartment *pComp;
  146. VARIANT var;
  147. *pga = 0;
  148. if (SUCCEEDED(hr = GetCompartment(punk, rguidComp, &pComp, fGlobal)))
  149. {
  150. if ((hr = pComp->GetValue(&var)) == S_OK)
  151. {
  152. Assert(var.vt == VT_I4);
  153. *pga = (TfGuidAtom)var.lVal;;
  154. }
  155. pComp->Release();
  156. }
  157. return hr;
  158. }
  159. //+---------------------------------------------------------------------------
  160. //
  161. // SetCompartmentGUID
  162. //
  163. //----------------------------------------------------------------------------
  164. HRESULT SetCompartmentGUID(LIBTHREAD *plt, TfClientId tid, IUnknown *punk, REFGUID rguidComp, REFGUID rguid, BOOL fGlobal)
  165. {
  166. TfGuidAtom ga;
  167. if (!GetGUIDATOMFromGUID(plt, rguid, &ga))
  168. return E_FAIL;
  169. if (FAILED(SetCompartmentGUIDATOM(tid, punk, rguidComp, ga, fGlobal)))
  170. return E_FAIL;
  171. return S_OK;
  172. }
  173. //+---------------------------------------------------------------------------
  174. //
  175. // GetCompartmentGUID
  176. //
  177. //----------------------------------------------------------------------------
  178. HRESULT GetCompartmentGUID(LIBTHREAD *plt, IUnknown *punk, REFGUID rguidComp, GUID *pguid, BOOL fGlobal)
  179. {
  180. TfGuidAtom ga;
  181. if (FAILED(GetCompartmentGUIDATOM(punk, rguidComp, &ga, fGlobal)))
  182. return E_FAIL;
  183. if (GetGUIDFromGUIDATOM(plt, ga, pguid))
  184. return S_OK;
  185. return E_FAIL;
  186. }
  187. //+---------------------------------------------------------------------------
  188. //
  189. // GetCompartmentUnknown
  190. //
  191. //----------------------------------------------------------------------------
  192. HRESULT GetCompartmentUnknown(IUnknown *punk, REFGUID rguidComp, IUnknown **ppunk)
  193. {
  194. HRESULT hr;
  195. ITfCompartment *pComp;
  196. VARIANT var;
  197. *ppunk = NULL;
  198. if (SUCCEEDED(hr = GetCompartment(punk, rguidComp, &pComp, FALSE)))
  199. {
  200. if ((hr = pComp->GetValue(&var)) == S_OK)
  201. {
  202. Assert(var.vt == VT_UNKNOWN);
  203. *ppunk = var.punkVal;
  204. }
  205. pComp->Release();
  206. }
  207. return hr;
  208. }
  209. //+---------------------------------------------------------------------------
  210. //
  211. // SetCompartmentUnknown
  212. //
  213. //----------------------------------------------------------------------------
  214. HRESULT SetCompartmentUnknown(TfClientId tid, IUnknown *punk, REFGUID rguidComp, IUnknown *punkPriv)
  215. {
  216. HRESULT hr;
  217. ITfCompartment *pComp;
  218. VARIANT var;
  219. if (SUCCEEDED(hr = GetCompartment(punk, rguidComp, &pComp, FALSE)))
  220. {
  221. var.vt = VT_UNKNOWN;
  222. var.punkVal = punkPriv;
  223. hr = pComp->SetValue(tid, &var);
  224. pComp->Release();
  225. }
  226. return hr;
  227. }
  228. //+---------------------------------------------------------------------------
  229. //
  230. // ClearCompartment
  231. //
  232. //----------------------------------------------------------------------------
  233. HRESULT ClearCompartment(TfClientId tid, IUnknown *punk, REFGUID rguidComp, BOOL fGlobal)
  234. {
  235. HRESULT hr = E_FAIL;
  236. ITfCompartmentMgr *pCompMgr = NULL;
  237. ITfThreadMgr *ptim = NULL;
  238. if (fGlobal)
  239. {
  240. if (FAILED(hr = punk->QueryInterface(IID_ITfThreadMgr,
  241. (void **)&ptim)))
  242. goto Exit;
  243. if (FAILED(hr = ptim->GetGlobalCompartment(&pCompMgr)))
  244. goto Exit;
  245. }
  246. else
  247. {
  248. if (FAILED(hr = punk->QueryInterface(IID_ITfCompartmentMgr,
  249. (void **)&pCompMgr)))
  250. goto Exit;
  251. }
  252. if (SUCCEEDED(hr) && pCompMgr)
  253. {
  254. hr = pCompMgr->ClearCompartment(tid, rguidComp);
  255. pCompMgr->Release();
  256. }
  257. else
  258. hr = E_FAIL;
  259. Exit:
  260. if (ptim)
  261. ptim->Release();
  262. return hr;
  263. }
  264. //////////////////////////////////////////////////////////////////////////////
  265. //
  266. // CCompartmentEventSink
  267. //
  268. //////////////////////////////////////////////////////////////////////////////
  269. //+---------------------------------------------------------------------------
  270. //
  271. // IUnknown
  272. //
  273. //----------------------------------------------------------------------------
  274. STDAPI CCompartmentEventSink::QueryInterface(REFIID riid, void **ppvObj)
  275. {
  276. *ppvObj = NULL;
  277. if (IsEqualIID(riid, IID_IUnknown) ||
  278. IsEqualIID(riid, IID_ITfCompartmentEventSink))
  279. {
  280. *ppvObj = SAFECAST(this, ITfCompartmentEventSink *);
  281. }
  282. if (*ppvObj)
  283. {
  284. AddRef();
  285. return S_OK;
  286. }
  287. return E_NOINTERFACE;
  288. }
  289. STDAPI_(ULONG) CCompartmentEventSink::AddRef()
  290. {
  291. return ++_cRef;
  292. }
  293. STDAPI_(ULONG) CCompartmentEventSink::Release()
  294. {
  295. long cr;
  296. cr = --_cRef;
  297. Assert(cr >= 0);
  298. if (cr == 0)
  299. {
  300. delete this;
  301. }
  302. return cr;
  303. }
  304. //+---------------------------------------------------------------------------
  305. //
  306. // ctor
  307. //
  308. //----------------------------------------------------------------------------
  309. CCompartmentEventSink::CCompartmentEventSink(CESCALLBACK pfnCallback, void *pv)
  310. {
  311. Dbg_MemSetThisName(TEXT("CCompartmentEventSink"));
  312. _cRef = 1;
  313. _pfnCallback = pfnCallback;
  314. _pv = pv;
  315. }
  316. //+---------------------------------------------------------------------------
  317. //
  318. // OnChange
  319. //
  320. //----------------------------------------------------------------------------
  321. STDAPI CCompartmentEventSink::OnChange(REFGUID rguid)
  322. {
  323. return _pfnCallback(_pv, rguid);
  324. }
  325. //+---------------------------------------------------------------------------
  326. //
  327. // CCompartmentEventSink::Advise
  328. //
  329. //----------------------------------------------------------------------------
  330. HRESULT CCompartmentEventSink::_Advise(IUnknown *punk, REFGUID rguidComp, BOOL fGlobal)
  331. {
  332. HRESULT hr;
  333. ITfSource *pSource = NULL;
  334. CESMAP *pcesmap;
  335. pcesmap = _rgcesmap.Append(1);
  336. if (!pcesmap)
  337. return E_OUTOFMEMORY;
  338. hr = E_FAIL;
  339. if (FAILED(hr = GetCompartment(punk, rguidComp, &pcesmap->pComp, fGlobal)))
  340. goto Exit;
  341. if (FAILED(hr = pcesmap->pComp->QueryInterface(IID_ITfSource, (void **)&pSource)))
  342. goto Exit;
  343. if (FAILED(hr = pSource->AdviseSink(IID_ITfCompartmentEventSink, (ITfCompartmentEventSink *)this, &pcesmap->dwCookie)))
  344. goto Exit;
  345. hr = S_OK;
  346. Exit:
  347. if (FAILED(hr))
  348. {
  349. int nCnt;
  350. SafeReleaseClear(pcesmap->pComp);
  351. nCnt = _rgcesmap.Count();
  352. _rgcesmap.Remove(nCnt - 1, 1);
  353. }
  354. SafeRelease(pSource);
  355. return hr;
  356. }
  357. //+---------------------------------------------------------------------------
  358. //
  359. // CCompartmentEventSink::Unadvise
  360. //
  361. //----------------------------------------------------------------------------
  362. HRESULT CCompartmentEventSink::_Unadvise()
  363. {
  364. HRESULT hr;
  365. int nCnt;
  366. CESMAP *pcesmap;
  367. hr = E_FAIL;
  368. nCnt = _rgcesmap.Count();
  369. pcesmap = _rgcesmap.GetPtr(0);
  370. while (nCnt)
  371. {
  372. ITfSource *pSource = NULL;
  373. if (FAILED(pcesmap->pComp->QueryInterface(IID_ITfSource, (void **)&pSource)))
  374. goto Next;
  375. if (FAILED(pSource->UnadviseSink(pcesmap->dwCookie)))
  376. goto Next;
  377. Next:
  378. SafeReleaseClear(pcesmap->pComp);
  379. SafeRelease(pSource);
  380. nCnt--;
  381. pcesmap++;
  382. }
  383. hr = S_OK;
  384. return hr;
  385. }