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

//
// 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