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
287 lines
7.7 KiB
//
|
|
// 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<CCompartmentBase> *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<GENERICSINK> _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<GENERICSINK> _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<CCompartmentBase> _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
|