msctf: Define ITfSource for Compartments.
This commit is contained in:
parent
9d12acf342
commit
3bdfa1cc67
|
@ -67,18 +67,34 @@ typedef struct tagCompartmentEnumGuid {
|
||||||
struct list *cursor;
|
struct list *cursor;
|
||||||
} CompartmentEnumGuid;
|
} CompartmentEnumGuid;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct tagCompartmentSink {
|
||||||
|
struct list entry;
|
||||||
|
union {
|
||||||
|
IUnknown *pIUnknown;
|
||||||
|
/* ITfCompartmentEventSink *pITfCompartmentEventSink; */
|
||||||
|
} interfaces;
|
||||||
|
} CompartmentSink;
|
||||||
|
|
||||||
typedef struct tagCompartment {
|
typedef struct tagCompartment {
|
||||||
const ITfCompartmentVtbl *Vtbl;
|
const ITfCompartmentVtbl *Vtbl;
|
||||||
|
const ITfSourceVtbl *SourceVtbl;
|
||||||
LONG refCount;
|
LONG refCount;
|
||||||
|
|
||||||
/* Only VT_I4, VT_UNKNOWN and VT_BSTR data types are allowed */
|
/* Only VT_I4, VT_UNKNOWN and VT_BSTR data types are allowed */
|
||||||
VARIANT variant;
|
VARIANT variant;
|
||||||
CompartmentValue *valueData;
|
CompartmentValue *valueData;
|
||||||
|
struct list CompartmentEventSink;
|
||||||
} Compartment;
|
} Compartment;
|
||||||
|
|
||||||
static HRESULT CompartmentEnumGuid_Constructor(struct list* values, IEnumGUID **ppOut);
|
static HRESULT CompartmentEnumGuid_Constructor(struct list* values, IEnumGUID **ppOut);
|
||||||
static HRESULT Compartment_Constructor(CompartmentValue *value, ITfCompartment **ppOut);
|
static HRESULT Compartment_Constructor(CompartmentValue *value, ITfCompartment **ppOut);
|
||||||
|
|
||||||
|
static inline Compartment *impl_from_ITfSourceVtbl(ITfSource *iface)
|
||||||
|
{
|
||||||
|
return (Compartment *)((char *)iface - FIELD_OFFSET(Compartment,SourceVtbl));
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *iface)
|
HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *iface)
|
||||||
{
|
{
|
||||||
CompartmentMgr *This = (CompartmentMgr *)iface;
|
CompartmentMgr *This = (CompartmentMgr *)iface;
|
||||||
|
@ -412,10 +428,23 @@ static HRESULT CompartmentEnumGuid_Constructor(struct list *values, IEnumGUID **
|
||||||
/**************************************************
|
/**************************************************
|
||||||
* ITfCompartment
|
* ITfCompartment
|
||||||
**************************************************/
|
**************************************************/
|
||||||
|
static void free_sink(CompartmentSink *sink)
|
||||||
|
{
|
||||||
|
IUnknown_Release(sink->interfaces.pIUnknown);
|
||||||
|
HeapFree(GetProcessHeap(),0,sink);
|
||||||
|
}
|
||||||
|
|
||||||
static void Compartment_Destructor(Compartment *This)
|
static void Compartment_Destructor(Compartment *This)
|
||||||
{
|
{
|
||||||
|
struct list *cursor, *cursor2;
|
||||||
TRACE("destroying %p\n", This);
|
TRACE("destroying %p\n", This);
|
||||||
VariantClear(&This->variant);
|
VariantClear(&This->variant);
|
||||||
|
LIST_FOR_EACH_SAFE(cursor, cursor2, &This->CompartmentEventSink)
|
||||||
|
{
|
||||||
|
CompartmentSink* sink = LIST_ENTRY(cursor,CompartmentSink,entry);
|
||||||
|
list_remove(cursor);
|
||||||
|
free_sink(sink);
|
||||||
|
}
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -428,6 +457,10 @@ static HRESULT WINAPI Compartment_QueryInterface(ITfCompartment *iface, REFIID i
|
||||||
{
|
{
|
||||||
*ppvOut = This;
|
*ppvOut = This;
|
||||||
}
|
}
|
||||||
|
else if (IsEqualIID(iid, &IID_ITfSource))
|
||||||
|
{
|
||||||
|
*ppvOut = &This->SourceVtbl;
|
||||||
|
}
|
||||||
|
|
||||||
if (*ppvOut)
|
if (*ppvOut)
|
||||||
{
|
{
|
||||||
|
@ -512,6 +545,72 @@ static const ITfCompartmentVtbl ITfCompartment_Vtbl ={
|
||||||
Compartment_GetValue
|
Compartment_GetValue
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* ITfSource functions
|
||||||
|
*****************************************************/
|
||||||
|
|
||||||
|
static HRESULT WINAPI Source_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut)
|
||||||
|
{
|
||||||
|
Compartment *This = impl_from_ITfSourceVtbl(iface);
|
||||||
|
return Compartment_QueryInterface((ITfCompartment *)This, iid, *ppvOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI Source_AddRef(ITfSource *iface)
|
||||||
|
{
|
||||||
|
Compartment *This = impl_from_ITfSourceVtbl(iface);
|
||||||
|
return Compartment_AddRef((ITfCompartment*)This);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI Source_Release(ITfSource *iface)
|
||||||
|
{
|
||||||
|
Compartment *This = impl_from_ITfSourceVtbl(iface);
|
||||||
|
return Compartment_Release((ITfCompartment *)This);
|
||||||
|
}
|
||||||
|
|
||||||
|
static WINAPI HRESULT CompartmentSource_AdviseSink(ITfSource *iface,
|
||||||
|
REFIID riid, IUnknown *punk, DWORD *pdwCookie)
|
||||||
|
{
|
||||||
|
Compartment *This = impl_from_ITfSourceVtbl(iface);
|
||||||
|
|
||||||
|
TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie);
|
||||||
|
|
||||||
|
if (!riid || !punk || !pdwCookie)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static WINAPI HRESULT CompartmentSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)
|
||||||
|
{
|
||||||
|
CompartmentSink *sink;
|
||||||
|
Compartment *This = impl_from_ITfSourceVtbl(iface);
|
||||||
|
|
||||||
|
TRACE("(%p) %x\n",This,pdwCookie);
|
||||||
|
|
||||||
|
if (get_Cookie_magic(pdwCookie)!=COOKIE_MAGIC_COMPARTMENTSINK)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
sink = (CompartmentSink*)remove_Cookie(pdwCookie);
|
||||||
|
if (!sink)
|
||||||
|
return CONNECT_E_NOCONNECTION;
|
||||||
|
|
||||||
|
list_remove(&sink->entry);
|
||||||
|
free_sink(sink);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const ITfSourceVtbl Compartment_SourceVtbl =
|
||||||
|
{
|
||||||
|
Source_QueryInterface,
|
||||||
|
Source_AddRef,
|
||||||
|
Source_Release,
|
||||||
|
|
||||||
|
CompartmentSource_AdviseSink,
|
||||||
|
CompartmentSource_UnadviseSink,
|
||||||
|
};
|
||||||
|
|
||||||
static HRESULT Compartment_Constructor(CompartmentValue *valueData, ITfCompartment **ppOut)
|
static HRESULT Compartment_Constructor(CompartmentValue *valueData, ITfCompartment **ppOut)
|
||||||
{
|
{
|
||||||
Compartment *This;
|
Compartment *This;
|
||||||
|
@ -521,11 +620,14 @@ static HRESULT Compartment_Constructor(CompartmentValue *valueData, ITfCompartme
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
This->Vtbl= &ITfCompartment_Vtbl;
|
This->Vtbl= &ITfCompartment_Vtbl;
|
||||||
|
This->SourceVtbl = &Compartment_SourceVtbl;
|
||||||
This->refCount = 1;
|
This->refCount = 1;
|
||||||
|
|
||||||
This->valueData = valueData;
|
This->valueData = valueData;
|
||||||
VariantInit(&This->variant);
|
VariantInit(&This->variant);
|
||||||
|
|
||||||
|
list_init(&This->CompartmentEventSink);
|
||||||
|
|
||||||
TRACE("returning %p\n", This);
|
TRACE("returning %p\n", This);
|
||||||
*ppOut = (ITfCompartment*)This;
|
*ppOut = (ITfCompartment*)This;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define COOKIE_MAGIC_GUIDATOM 0x0030
|
#define COOKIE_MAGIC_GUIDATOM 0x0030
|
||||||
#define COOKIE_MAGIC_IPPSINK 0x0040
|
#define COOKIE_MAGIC_IPPSINK 0x0040
|
||||||
#define COOKIE_MAGIC_EDITCOOKIE 0x0050
|
#define COOKIE_MAGIC_EDITCOOKIE 0x0050
|
||||||
|
#define COOKIE_MAGIC_COMPARTMENTSINK 0x0060
|
||||||
|
|
||||||
extern DWORD tlsIndex;
|
extern DWORD tlsIndex;
|
||||||
extern TfClientId processId;
|
extern TfClientId processId;
|
||||||
|
|
Loading…
Reference in New Issue