// // compart.h // #ifndef COMPART_H #define COMPART_H #include "globals.h" #include "sink.h" #include "enumguid.h" #include "ptrary.h" #include "strary.h" #include "tfprop.h" #include "memcache.h" #include "gcompart.h" extern const IID IID_PRIV_CCOMPARTMENTMGR; extern const IID IID_PRIV_CGLOBALCOMPARTMENT; class CThreadInputMgr; class CCompartmentMgr; class CCompartmentMgrOwner; class CCompartmentBase; typedef enum { COMPTYPE_GLOBAL = 0, COMPTYPE_TIM = 1, COMPTYPE_DIM = 2, COMPTYPE_IC = 3, } COMPTYPE; typedef struct tag_COMPARTMENTACCESS { const GUID *pguid; DWORD dwAccess; } COMPARTMENTACCESS; #define CA_ONLYOWNERSET 0x0001 ////////////////////////////////////////////////////////////////////////////// // // Helpers // ////////////////////////////////////////////////////////////////////////////// inline CCompartmentMgr *GetCCompartmentMgr(IUnknown *punk) { CCompartmentMgr *compmgr; punk->QueryInterface(IID_PRIV_CCOMPARTMENTMGR, (void **)&compmgr); return compmgr; } BOOL EnsureGlobalCompartment(SYSTHREAD *psfn); HRESULT MyToggleCompartmentDWORD(TfClientId tid, CCompartmentMgr *pCompMgr, REFGUID rguid, DWORD *pdwOld); HRESULT MyGetCompartmentDWORD(CCompartmentMgr *pCompMgr, REFGUID rguid, DWORD *pdw); HRESULT MySetCompartmentDWORD(TfClientId tid, CCompartmentMgr *pCompMgr, REFGUID rguid, DWORD dw); ////////////////////////////////////////////////////////////////////////////// // // CEnumCompartment // ////////////////////////////////////////////////////////////////////////////// class CEnumCompartment : public CEnumGuid { public: CEnumCompartment(); BOOL _Init(CPtrArray *prgComp); DBG_ID_DECLARE; }; ////////////////////////////////////////////////////////////////////////////// // // CCompartmentBase // ////////////////////////////////////////////////////////////////////////////// class __declspec(novtable) CCompartmentBase : public ITfCompartment, public ITfSource { public: CCompartmentBase(CCompartmentMgr *pCompMgr, TfGuidAtom guidatom, TfPropertyType proptype); virtual ~CCompartmentBase() {} // // IUnknown methods // virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) = 0; virtual STDMETHODIMP_(ULONG) AddRef(void) = 0; virtual STDMETHODIMP_(ULONG) Release(void) = 0; // // ITfCompartment // virtual STDMETHODIMP SetValue(TfClientId tid, const VARIANT *pvarValue) = 0; virtual STDMETHODIMP GetValue(VARIANT *pvarValue) = 0; // // ITfSource // virtual STDMETHODIMP AdviseSink(REFIID refiid, IUnknown *punk, DWORD *pdwCookie) = 0; virtual STDMETHODIMP UnadviseSink(DWORD dwCookie) = 0; TfGuidAtom GetGuidAtom() {return _guidatom;} TfPropertyType GetpropType() {return _proptype;} virtual DWORD GetId() {Assert(0); return 0;} virtual BOOL MakeNotify() {Assert(0); return FALSE;} BOOL IsValidType(TfPropertyType proptype) { if (_proptype == TF_PT_NONE) return TRUE; return _proptype == proptype; } CCompartmentMgr *_GetMgr() {return _pCompMgr;} DWORD _GetAccess() {return _dwAccess;} void Invalid() {_fInvalid = TRUE;}; protected: static const COMPARTMENTACCESS _c_ca[]; DWORD _dwAccess; TfGuidAtom _guidatom; TfPropertyType _proptype; BOOL _fInvalid; CCompartmentMgr *_pCompMgr; }; ////////////////////////////////////////////////////////////////////////////// // // CCompartment // ////////////////////////////////////////////////////////////////////////////// class CCompartment : public CCompartmentBase, public CComObjectRootImmx { public: CCompartment(CCompartmentMgr *pCompMgr, TfGuidAtom guidatom, TfPropertyType proptype); ~CCompartment(); BEGIN_COM_MAP_IMMX(CCompartment) COM_INTERFACE_ENTRY(ITfCompartment) COM_INTERFACE_ENTRY(ITfSource) END_COM_MAP_IMMX() IMMX_OBJECT_IUNKNOWN_FOR_ATL() // ITfCompartment STDMETHODIMP SetValue(TfClientId tid, const VARIANT *pvarValue); STDMETHODIMP GetValue(VARIANT *pvarValue); // ITfSource STDMETHODIMP AdviseSink(REFIID refiid, IUnknown *punk, DWORD *pdwCookie); STDMETHODIMP UnadviseSink(DWORD dwCookie); CStructArray _rgCompartmentSink; private: TFPROPERTY _prop; BOOL _fInSet; DBG_ID_DECLARE; }; ////////////////////////////////////////////////////////////////////////////// // // CGlobalCompartment // ////////////////////////////////////////////////////////////////////////////// class CGlobalCompartment : public CCompartmentBase, public CComObjectRootImmx_InternalReference { public: CGlobalCompartment(CCompartmentMgr *pCompMgr, REFGUID rguid, TfGuidAtom guidatom, TfPropertyType proptype); ~CGlobalCompartment(); BEGIN_COM_MAP_IMMX(CGlobalCompartment) COM_INTERFACE_ENTRY(ITfCompartment) COM_INTERFACE_ENTRY(ITfSource) END_COM_MAP_IMMX() IMMX_OBJECT_IUNKNOWN_FOR_ATL() // ITfCompartment STDMETHODIMP SetValue(TfClientId tid, const VARIANT *pvarValue); STDMETHODIMP GetValue(VARIANT *pvarValue); // ITfSource STDMETHODIMP AdviseSink(REFIID refiid, IUnknown *punk, DWORD *pdwCookie); STDMETHODIMP UnadviseSink(DWORD dwCookie); CStructArray _rgCompartmentSink; BOOL MakeNotify(); DWORD GetId() {return _dwId;} private: static BOOL EnumThreadProc(DWORD dwThreadId, DWORD dwProcessId, void *pv); DWORD _dwId; BOOL _fInSet; GUID _guidCompart; DBG_ID_DECLARE; }; inline CGlobalCompartment *GetCGlobalCompartment(IUnknown *punk) { CGlobalCompartment *comp; punk->QueryInterface(IID_PRIV_CGLOBALCOMPARTMENT, (void **)&comp); return comp; } ////////////////////////////////////////////////////////////////////////////// // // CCompartmentMgr // ////////////////////////////////////////////////////////////////////////////// class __declspec(novtable) CCompartmentMgr : public ITfCompartmentMgr { public: CCompartmentMgr(TfClientId tidOwner, COMPTYPE cType); virtual ~CCompartmentMgr(); // // IUnknown methods // virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) = 0; virtual STDMETHODIMP_(ULONG) AddRef(void) = 0; virtual STDMETHODIMP_(ULONG) Release(void) = 0; STDMETHODIMP GetCompartment(REFGUID rguid, ITfCompartment **ppcomp); STDMETHODIMP ClearCompartment(TfClientId tid, REFGUID rguid); STDMETHODIMP EnumCompartments(IEnumGUID **ppEnum); void NotifyGlobalCompartmentChange(DWORD dwId); void CleanUp(); TfClientId _GetTIPOwner() { return _tidOwner; } private: CCompartmentBase *_Find(TfGuidAtom guidatom, int *piOut); CCompartmentBase *_Get(REFGUID rguid); COMPTYPE _cType; CPtrArray _rgCompartment; TfClientId _tidOwner; DBG_ID_DECLARE; }; ////////////////////////////////////////////////////////////////////////////// // // CGlobalCompartmentMgr // ////////////////////////////////////////////////////////////////////////////// class CGlobalCompartmentMgr : public CCompartmentMgr { public: CGlobalCompartmentMgr(TfClientId tidOwner) : CCompartmentMgr(tidOwner, COMPTYPE_GLOBAL) { _cRef = 1; } ~CGlobalCompartmentMgr() {} // // IUnknown methods // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); private: int _cRef; }; #endif COMPART_H