msctf: Define ITfSource for Compartments.

This commit is contained in:
Aric Stewart 2009-06-22 12:04:24 +09:00 committed by Alexandre Julliard
parent 9d12acf342
commit 3bdfa1cc67
2 changed files with 103 additions and 0 deletions

View File

@ -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;

View File

@ -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;