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.

300 lines
7.2 KiB

  1. //
  2. // des.cpp
  3. //
  4. // CThreadMgrEventSink
  5. //
  6. #include "private.h"
  7. #include "timsink.h"
  8. #include "helpers.h"
  9. //+---------------------------------------------------------------------------
  10. //
  11. // IUnknown
  12. //
  13. //----------------------------------------------------------------------------
  14. STDAPI CThreadMgrEventSink::QueryInterface(REFIID riid, void **ppvObj)
  15. {
  16. *ppvObj = NULL;
  17. if (IsEqualIID(riid, IID_IUnknown) ||
  18. IsEqualIID(riid, IID_ITfThreadMgrEventSink))
  19. {
  20. *ppvObj = this;
  21. }
  22. if (*ppvObj)
  23. {
  24. AddRef();
  25. return S_OK;
  26. }
  27. return E_NOINTERFACE;
  28. }
  29. STDAPI_(ULONG) CThreadMgrEventSink::AddRef()
  30. {
  31. return ++_cRef;
  32. }
  33. STDAPI_(ULONG) CThreadMgrEventSink::Release()
  34. {
  35. _cRef--;
  36. Assert(_cRef >= 0);
  37. if (_cRef == 0)
  38. {
  39. delete this;
  40. return 0;
  41. }
  42. return _cRef;
  43. }
  44. //+---------------------------------------------------------------------------
  45. //
  46. // ctor
  47. //
  48. //----------------------------------------------------------------------------
  49. CThreadMgrEventSink::CThreadMgrEventSink(DIMCALLBACK pfnDIMCallback, ICCALLBACK pfnICCallback, void *pv)
  50. {
  51. Dbg_MemSetThisName(TEXT("CThreadMgrEventSink"));
  52. _pfnDIMCallback = pfnDIMCallback;
  53. _pfnICCallback = pfnICCallback;
  54. _pv = pv;
  55. _cRef = 1;
  56. }
  57. //+---------------------------------------------------------------------------
  58. //
  59. // dtor
  60. //
  61. //----------------------------------------------------------------------------
  62. CThreadMgrEventSink::~CThreadMgrEventSink()
  63. {
  64. }
  65. //+---------------------------------------------------------------------------
  66. //
  67. // OnInitDocumentMgr
  68. //
  69. //----------------------------------------------------------------------------
  70. STDAPI CThreadMgrEventSink::OnInitDocumentMgr(ITfDocumentMgr *dim)
  71. {
  72. if (!_pfnDIMCallback)
  73. return S_OK;
  74. return _pfnDIMCallback(TIM_CODE_INITDIM, dim, NULL, _pv);
  75. }
  76. //+---------------------------------------------------------------------------
  77. //
  78. // UninitializeDocumentMgr
  79. //
  80. //----------------------------------------------------------------------------
  81. STDAPI CThreadMgrEventSink::OnUninitDocumentMgr(ITfDocumentMgr *dim)
  82. {
  83. if (!_pfnDIMCallback)
  84. return S_OK;
  85. return _pfnDIMCallback(TIM_CODE_UNINITDIM, dim, NULL, _pv);
  86. }
  87. //+---------------------------------------------------------------------------
  88. //
  89. // OnSetFocus
  90. //
  91. //----------------------------------------------------------------------------
  92. STDAPI CThreadMgrEventSink::OnSetFocus(ITfDocumentMgr *dimFocus, ITfDocumentMgr *dimPrevFocus)
  93. {
  94. if (!_pfnDIMCallback)
  95. return S_OK;
  96. return _pfnDIMCallback(TIM_CODE_SETFOCUS, dimFocus, dimPrevFocus, _pv);
  97. }
  98. //+---------------------------------------------------------------------------
  99. //
  100. // OnPushContext
  101. //
  102. //----------------------------------------------------------------------------
  103. STDAPI CThreadMgrEventSink::OnPushContext(ITfContext *pic)
  104. {
  105. if (!_pfnICCallback)
  106. return S_OK;
  107. return _pfnICCallback(TIM_CODE_INITIC, pic, _pv);
  108. }
  109. //+---------------------------------------------------------------------------
  110. //
  111. // OnPopDocumentMgr
  112. //
  113. //----------------------------------------------------------------------------
  114. STDAPI CThreadMgrEventSink::OnPopContext(ITfContext *pic)
  115. {
  116. if (!_pfnICCallback)
  117. return S_OK;
  118. return _pfnICCallback(TIM_CODE_UNINITIC, pic, _pv);
  119. }
  120. //+---------------------------------------------------------------------------
  121. //
  122. // Advise
  123. //
  124. //----------------------------------------------------------------------------
  125. HRESULT CThreadMgrEventSink::_Advise(ITfThreadMgr *tim)
  126. {
  127. HRESULT hr;
  128. ITfSource *source = NULL;
  129. _tim = NULL;
  130. hr = E_FAIL;
  131. if (tim->QueryInterface(IID_ITfSource, (void **)&source) != S_OK)
  132. goto Exit;
  133. if (source->AdviseSink(IID_ITfThreadMgrEventSink, this, &_dwCookie) != S_OK)
  134. goto Exit;
  135. _tim = tim;
  136. _tim->AddRef();
  137. hr = S_OK;
  138. Exit:
  139. SafeRelease(source);
  140. return hr;
  141. }
  142. //+---------------------------------------------------------------------------
  143. //
  144. // Unadvise
  145. //
  146. //----------------------------------------------------------------------------
  147. HRESULT CThreadMgrEventSink::_Unadvise()
  148. {
  149. HRESULT hr;
  150. ITfSource *source = NULL;
  151. hr = E_FAIL;
  152. if (_tim == NULL)
  153. goto Exit;
  154. if (_tim->QueryInterface(IID_ITfSource, (void **)&source) != S_OK)
  155. goto Exit;
  156. if (source->UnadviseSink(_dwCookie) != S_OK)
  157. goto Exit;
  158. hr = S_OK;
  159. Exit:
  160. SafeRelease(source);
  161. SafeReleaseClear(_tim);
  162. return hr;
  163. }
  164. //+---------------------------------------------------------------------------
  165. //
  166. // InitDIMs
  167. //
  168. // This is a simple helper function to enumerate DIMs and ICs.
  169. // When the tips is activated, it can call this method to call callbacks
  170. // for exsiting DIMs and ICs.
  171. //
  172. //----------------------------------------------------------------------------
  173. HRESULT CThreadMgrEventSink::_InitDIMs(BOOL fInit)
  174. {
  175. IEnumTfDocumentMgrs *pEnumDim = NULL;
  176. ITfDocumentMgr *pdim = NULL;
  177. ITfDocumentMgr *pdimFocus = NULL;
  178. if (FAILED(_tim->GetFocus(&pdimFocus)))
  179. goto Exit;
  180. if (_tim->EnumDocumentMgrs(&pEnumDim) != S_OK)
  181. goto Exit;
  182. if (fInit)
  183. {
  184. while (pEnumDim->Next(1, &pdim, NULL) == S_OK)
  185. {
  186. if (_pfnDIMCallback)
  187. _pfnDIMCallback(TIM_CODE_INITDIM, pdim, NULL, _pv);
  188. if (_pfnICCallback)
  189. {
  190. IEnumTfContexts *pEnumIc = NULL;
  191. if (SUCCEEDED(pdim->EnumContexts(&pEnumIc)))
  192. {
  193. ITfContext *pic = NULL;
  194. while (pEnumIc->Next(1, &pic, NULL) == S_OK)
  195. {
  196. _pfnICCallback(TIM_CODE_INITIC, pic, _pv);
  197. pic->Release();
  198. }
  199. pEnumIc->Release();
  200. }
  201. }
  202. if (_pfnDIMCallback && (pdim == pdimFocus))
  203. {
  204. _pfnDIMCallback(TIM_CODE_SETFOCUS, pdim, NULL, _pv);
  205. }
  206. pdim->Release();
  207. }
  208. }
  209. else
  210. {
  211. while (pEnumDim->Next(1, &pdim, NULL) == S_OK)
  212. {
  213. if (_pfnDIMCallback && (pdim == pdimFocus))
  214. {
  215. _pfnDIMCallback(TIM_CODE_SETFOCUS, NULL, pdim, _pv);
  216. }
  217. if (_pfnICCallback)
  218. {
  219. IEnumTfContexts *pEnumIc = NULL;
  220. if (SUCCEEDED(pdim->EnumContexts(&pEnumIc)))
  221. {
  222. ITfContext *pic = NULL;
  223. while (pEnumIc->Next(1, &pic, NULL) == S_OK)
  224. {
  225. _pfnICCallback(TIM_CODE_UNINITIC, pic, _pv);
  226. pic->Release();
  227. }
  228. pEnumIc->Release();
  229. }
  230. }
  231. if (_pfnDIMCallback)
  232. _pfnDIMCallback(TIM_CODE_UNINITDIM, pdim, NULL, _pv);
  233. pdim->Release();
  234. }
  235. }
  236. Exit:
  237. SafeRelease(pEnumDim);
  238. SafeRelease(pdimFocus);
  239. return S_OK;
  240. }