Jacek Caban : msctf: Use generic sinks in Compartment object.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 5 10:29:33 CDT 2016
Module: wine
Branch: master
Commit: 40cdfd2a6a8ac050bb2ad3cbc8bf25eecb6f8423
URL: http://source.winehq.org/git/wine.git/?a=commit;h=40cdfd2a6a8ac050bb2ad3cbc8bf25eecb6f8423
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed May 4 19:41:41 2016 +0200
msctf: Use generic sinks in Compartment object.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msctf/compartmentmgr.c | 64 +++++++--------------------------------------
dlls/msctf/msctf_internal.h | 1 +
2 files changed, 10 insertions(+), 55 deletions(-)
diff --git a/dlls/msctf/compartmentmgr.c b/dlls/msctf/compartmentmgr.c
index c39f194..4fe7b82 100644
--- a/dlls/msctf/compartmentmgr.c
+++ b/dlls/msctf/compartmentmgr.c
@@ -66,15 +66,6 @@ typedef struct tagCompartmentEnumGuid {
struct list *cursor;
} CompartmentEnumGuid;
-
-typedef struct tagCompartmentSink {
- struct list entry;
- union {
- IUnknown *pIUnknown;
- ITfCompartmentEventSink *pITfCompartmentEventSink;
- } interfaces;
-} CompartmentSink;
-
typedef struct tagCompartment {
ITfCompartment ITfCompartment_iface;
ITfSource ITfSource_iface;
@@ -443,23 +434,11 @@ static HRESULT CompartmentEnumGuid_Constructor(struct list *values, IEnumGUID **
/**************************************************
* ITfCompartment
**************************************************/
-static void free_sink(CompartmentSink *sink)
-{
- IUnknown_Release(sink->interfaces.pIUnknown);
- HeapFree(GetProcessHeap(),0,sink);
-}
-
static void Compartment_Destructor(Compartment *This)
{
- struct list *cursor, *cursor2;
TRACE("destroying %p\n", This);
VariantClear(&This->variant);
- LIST_FOR_EACH_SAFE(cursor, cursor2, &This->CompartmentEventSink)
- {
- CompartmentSink* sink = LIST_ENTRY(cursor,CompartmentSink,entry);
- list_remove(cursor);
- free_sink(sink);
- }
+ free_sinks(&This->CompartmentEventSink);
HeapFree(GetProcessHeap(),0,This);
}
@@ -509,6 +488,7 @@ static HRESULT WINAPI Compartment_SetValue(ITfCompartment *iface,
TfClientId tid, const VARIANT *pvarValue)
{
Compartment *This = impl_from_ITfCompartment(iface);
+ ITfCompartmentEventSink *sink;
struct list *cursor;
TRACE("(%p) %i %p\n",This,tid,pvarValue);
@@ -534,10 +514,9 @@ static HRESULT WINAPI Compartment_SetValue(ITfCompartment *iface,
else if (V_VT(pvarValue) == VT_UNKNOWN)
IUnknown_AddRef(V_UNKNOWN(&This->variant));
- LIST_FOR_EACH(cursor, &This->CompartmentEventSink)
+ SINK_FOR_EACH(cursor, &This->CompartmentEventSink, ITfCompartmentEventSink, sink)
{
- CompartmentSink* sink = LIST_ENTRY(cursor,CompartmentSink,entry);
- ITfCompartmentEventSink_OnChange(sink->interfaces.pITfCompartmentEventSink,&This->valueData->guid);
+ ITfCompartmentEventSink_OnChange(sink, &This->valueData->guid);
}
return S_OK;
@@ -592,7 +571,6 @@ static HRESULT WINAPI CompartmentSource_AdviseSink(ITfSource *iface,
REFIID riid, IUnknown *punk, DWORD *pdwCookie)
{
Compartment *This = impl_from_ITfSource(iface);
- CompartmentSink *cs;
TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie);
@@ -600,47 +578,23 @@ static HRESULT WINAPI CompartmentSource_AdviseSink(ITfSource *iface,
return E_INVALIDARG;
if (IsEqualIID(riid, &IID_ITfCompartmentEventSink))
- {
- cs = HeapAlloc(GetProcessHeap(),0,sizeof(CompartmentSink));
- if (!cs)
- return E_OUTOFMEMORY;
- if (FAILED(IUnknown_QueryInterface(punk, riid, (LPVOID *)&cs->interfaces.pITfCompartmentEventSink)))
- {
- HeapFree(GetProcessHeap(),0,cs);
- return CONNECT_E_CANNOTCONNECT;
- }
- list_add_head(&This->CompartmentEventSink,&cs->entry);
- *pdwCookie = generate_Cookie(COOKIE_MAGIC_COMPARTMENTSINK , cs);
- }
- else
- {
- FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
- return E_NOTIMPL;
- }
+ return advise_sink(&This->CompartmentEventSink, &IID_ITfCompartmentEventSink,
+ COOKIE_MAGIC_COMPARTMENTSINK, punk, pdwCookie);
- TRACE("cookie %x\n",*pdwCookie);
-
- return S_OK;
+ FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
+ return E_NOTIMPL;
}
static HRESULT WINAPI CompartmentSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)
{
Compartment *This = impl_from_ITfSource(iface);
- CompartmentSink *sink;
TRACE("(%p) %x\n",This,pdwCookie);
if (get_Cookie_magic(pdwCookie)!=COOKIE_MAGIC_COMPARTMENTSINK)
return E_INVALIDARG;
- sink = remove_Cookie(pdwCookie);
- if (!sink)
- return CONNECT_E_NOCONNECTION;
-
- list_remove(&sink->entry);
- free_sink(sink);
-
- return S_OK;
+ return unadvise_sink(pdwCookie);
}
static const ITfSourceVtbl CompartmentSourceVtbl =
diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h
index 3467f1c..740d68a 100644
--- a/dlls/msctf/msctf_internal.h
+++ b/dlls/msctf/msctf_internal.h
@@ -72,6 +72,7 @@ typedef struct {
union {
IUnknown *pIUnknown;
ITfThreadMgrEventSink *pITfThreadMgrEventSink;
+ ITfCompartmentEventSink *pITfCompartmentEventSink;
} interfaces;
} Sink;
More information about the wine-cvs
mailing list