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.

287 lines
7.7 KiB

  1. //
  2. // compart.h
  3. //
  4. #ifndef COMPART_H
  5. #define COMPART_H
  6. #include "globals.h"
  7. #include "sink.h"
  8. #include "enumguid.h"
  9. #include "ptrary.h"
  10. #include "strary.h"
  11. #include "tfprop.h"
  12. #include "memcache.h"
  13. #include "gcompart.h"
  14. extern const IID IID_PRIV_CCOMPARTMENTMGR;
  15. extern const IID IID_PRIV_CGLOBALCOMPARTMENT;
  16. class CThreadInputMgr;
  17. class CCompartmentMgr;
  18. class CCompartmentMgrOwner;
  19. class CCompartmentBase;
  20. typedef enum {
  21. COMPTYPE_GLOBAL = 0,
  22. COMPTYPE_TIM = 1,
  23. COMPTYPE_DIM = 2,
  24. COMPTYPE_IC = 3,
  25. } COMPTYPE;
  26. typedef struct tag_COMPARTMENTACCESS {
  27. const GUID *pguid;
  28. DWORD dwAccess;
  29. } COMPARTMENTACCESS;
  30. #define CA_ONLYOWNERSET 0x0001
  31. //////////////////////////////////////////////////////////////////////////////
  32. //
  33. // Helpers
  34. //
  35. //////////////////////////////////////////////////////////////////////////////
  36. inline CCompartmentMgr *GetCCompartmentMgr(IUnknown *punk)
  37. {
  38. CCompartmentMgr *compmgr;
  39. punk->QueryInterface(IID_PRIV_CCOMPARTMENTMGR, (void **)&compmgr);
  40. return compmgr;
  41. }
  42. BOOL EnsureGlobalCompartment(SYSTHREAD *psfn);
  43. HRESULT MyToggleCompartmentDWORD(TfClientId tid, CCompartmentMgr *pCompMgr, REFGUID rguid, DWORD *pdwOld);
  44. HRESULT MyGetCompartmentDWORD(CCompartmentMgr *pCompMgr, REFGUID rguid, DWORD *pdw);
  45. HRESULT MySetCompartmentDWORD(TfClientId tid, CCompartmentMgr *pCompMgr, REFGUID rguid, DWORD dw);
  46. //////////////////////////////////////////////////////////////////////////////
  47. //
  48. // CEnumCompartment
  49. //
  50. //////////////////////////////////////////////////////////////////////////////
  51. class CEnumCompartment : public CEnumGuid
  52. {
  53. public:
  54. CEnumCompartment();
  55. BOOL _Init(CPtrArray<CCompartmentBase> *prgComp);
  56. DBG_ID_DECLARE;
  57. };
  58. //////////////////////////////////////////////////////////////////////////////
  59. //
  60. // CCompartmentBase
  61. //
  62. //////////////////////////////////////////////////////////////////////////////
  63. class __declspec(novtable) CCompartmentBase : public ITfCompartment,
  64. public ITfSource
  65. {
  66. public:
  67. CCompartmentBase(CCompartmentMgr *pCompMgr, TfGuidAtom guidatom, TfPropertyType proptype);
  68. virtual ~CCompartmentBase() {}
  69. //
  70. // IUnknown methods
  71. //
  72. virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) = 0;
  73. virtual STDMETHODIMP_(ULONG) AddRef(void) = 0;
  74. virtual STDMETHODIMP_(ULONG) Release(void) = 0;
  75. //
  76. // ITfCompartment
  77. //
  78. virtual STDMETHODIMP SetValue(TfClientId tid, const VARIANT *pvarValue) = 0;
  79. virtual STDMETHODIMP GetValue(VARIANT *pvarValue) = 0;
  80. //
  81. // ITfSource
  82. //
  83. virtual STDMETHODIMP AdviseSink(REFIID refiid, IUnknown *punk, DWORD *pdwCookie) = 0;
  84. virtual STDMETHODIMP UnadviseSink(DWORD dwCookie) = 0;
  85. TfGuidAtom GetGuidAtom() {return _guidatom;}
  86. TfPropertyType GetpropType() {return _proptype;}
  87. virtual DWORD GetId() {Assert(0); return 0;}
  88. virtual BOOL MakeNotify() {Assert(0); return FALSE;}
  89. BOOL IsValidType(TfPropertyType proptype)
  90. {
  91. if (_proptype == TF_PT_NONE)
  92. return TRUE;
  93. return _proptype == proptype;
  94. }
  95. CCompartmentMgr *_GetMgr() {return _pCompMgr;}
  96. DWORD _GetAccess() {return _dwAccess;}
  97. void Invalid() {_fInvalid = TRUE;};
  98. protected:
  99. static const COMPARTMENTACCESS _c_ca[];
  100. DWORD _dwAccess;
  101. TfGuidAtom _guidatom;
  102. TfPropertyType _proptype;
  103. BOOL _fInvalid;
  104. CCompartmentMgr *_pCompMgr;
  105. };
  106. //////////////////////////////////////////////////////////////////////////////
  107. //
  108. // CCompartment
  109. //
  110. //////////////////////////////////////////////////////////////////////////////
  111. class CCompartment : public CCompartmentBase,
  112. public CComObjectRootImmx
  113. {
  114. public:
  115. CCompartment(CCompartmentMgr *pCompMgr, TfGuidAtom guidatom, TfPropertyType proptype);
  116. ~CCompartment();
  117. BEGIN_COM_MAP_IMMX(CCompartment)
  118. COM_INTERFACE_ENTRY(ITfCompartment)
  119. COM_INTERFACE_ENTRY(ITfSource)
  120. END_COM_MAP_IMMX()
  121. IMMX_OBJECT_IUNKNOWN_FOR_ATL()
  122. // ITfCompartment
  123. STDMETHODIMP SetValue(TfClientId tid, const VARIANT *pvarValue);
  124. STDMETHODIMP GetValue(VARIANT *pvarValue);
  125. // ITfSource
  126. STDMETHODIMP AdviseSink(REFIID refiid, IUnknown *punk, DWORD *pdwCookie);
  127. STDMETHODIMP UnadviseSink(DWORD dwCookie);
  128. CStructArray<GENERICSINK> _rgCompartmentSink;
  129. private:
  130. TFPROPERTY _prop;
  131. BOOL _fInSet;
  132. DBG_ID_DECLARE;
  133. };
  134. //////////////////////////////////////////////////////////////////////////////
  135. //
  136. // CGlobalCompartment
  137. //
  138. //////////////////////////////////////////////////////////////////////////////
  139. class CGlobalCompartment : public CCompartmentBase,
  140. public CComObjectRootImmx_InternalReference
  141. {
  142. public:
  143. CGlobalCompartment(CCompartmentMgr *pCompMgr, REFGUID rguid, TfGuidAtom guidatom, TfPropertyType proptype);
  144. ~CGlobalCompartment();
  145. BEGIN_COM_MAP_IMMX(CGlobalCompartment)
  146. COM_INTERFACE_ENTRY(ITfCompartment)
  147. COM_INTERFACE_ENTRY(ITfSource)
  148. END_COM_MAP_IMMX()
  149. IMMX_OBJECT_IUNKNOWN_FOR_ATL()
  150. // ITfCompartment
  151. STDMETHODIMP SetValue(TfClientId tid, const VARIANT *pvarValue);
  152. STDMETHODIMP GetValue(VARIANT *pvarValue);
  153. // ITfSource
  154. STDMETHODIMP AdviseSink(REFIID refiid, IUnknown *punk, DWORD *pdwCookie);
  155. STDMETHODIMP UnadviseSink(DWORD dwCookie);
  156. CStructArray<GENERICSINK> _rgCompartmentSink;
  157. BOOL MakeNotify();
  158. DWORD GetId() {return _dwId;}
  159. private:
  160. static BOOL EnumThreadProc(DWORD dwThreadId, DWORD dwProcessId, void *pv);
  161. DWORD _dwId;
  162. BOOL _fInSet;
  163. GUID _guidCompart;
  164. DBG_ID_DECLARE;
  165. };
  166. inline CGlobalCompartment *GetCGlobalCompartment(IUnknown *punk)
  167. {
  168. CGlobalCompartment *comp;
  169. punk->QueryInterface(IID_PRIV_CGLOBALCOMPARTMENT, (void **)&comp);
  170. return comp;
  171. }
  172. //////////////////////////////////////////////////////////////////////////////
  173. //
  174. // CCompartmentMgr
  175. //
  176. //////////////////////////////////////////////////////////////////////////////
  177. class __declspec(novtable) CCompartmentMgr : public ITfCompartmentMgr
  178. {
  179. public:
  180. CCompartmentMgr(TfClientId tidOwner, COMPTYPE cType);
  181. virtual ~CCompartmentMgr();
  182. //
  183. // IUnknown methods
  184. //
  185. virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) = 0;
  186. virtual STDMETHODIMP_(ULONG) AddRef(void) = 0;
  187. virtual STDMETHODIMP_(ULONG) Release(void) = 0;
  188. STDMETHODIMP GetCompartment(REFGUID rguid, ITfCompartment **ppcomp);
  189. STDMETHODIMP ClearCompartment(TfClientId tid, REFGUID rguid);
  190. STDMETHODIMP EnumCompartments(IEnumGUID **ppEnum);
  191. void NotifyGlobalCompartmentChange(DWORD dwId);
  192. void CleanUp();
  193. TfClientId _GetTIPOwner() { return _tidOwner; }
  194. private:
  195. CCompartmentBase *_Find(TfGuidAtom guidatom, int *piOut);
  196. CCompartmentBase *_Get(REFGUID rguid);
  197. COMPTYPE _cType;
  198. CPtrArray<CCompartmentBase> _rgCompartment;
  199. TfClientId _tidOwner;
  200. DBG_ID_DECLARE;
  201. };
  202. //////////////////////////////////////////////////////////////////////////////
  203. //
  204. // CGlobalCompartmentMgr
  205. //
  206. //////////////////////////////////////////////////////////////////////////////
  207. class CGlobalCompartmentMgr : public CCompartmentMgr
  208. {
  209. public:
  210. CGlobalCompartmentMgr(TfClientId tidOwner) : CCompartmentMgr(tidOwner, COMPTYPE_GLOBAL)
  211. {
  212. _cRef = 1;
  213. }
  214. ~CGlobalCompartmentMgr() {}
  215. //
  216. // IUnknown methods
  217. //
  218. STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
  219. STDMETHODIMP_(ULONG) AddRef(void);
  220. STDMETHODIMP_(ULONG) Release(void);
  221. private:
  222. int _cRef;
  223. };
  224. #endif COMPART_H