msctf: Moved thread manager's AdviseSink implementation into a more generic helper.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2016-05-04 19:40:47 +02:00 committed by Alexandre Julliard
parent 0b912fecf6
commit c0efd074b2
3 changed files with 26 additions and 21 deletions

View File

@ -32,6 +32,7 @@
#include "shlwapi.h" #include "shlwapi.h"
#include "shlguid.h" #include "shlguid.h"
#include "comcat.h" #include "comcat.h"
#include "olectl.h"
#include "rpcproxy.h" #include "rpcproxy.h"
#include "msctf.h" #include "msctf.h"
#include "inputscope.h" #include "inputscope.h"
@ -283,6 +284,26 @@ DWORD enumerate_Cookie(DWORD magic, DWORD *index)
return 0x0; return 0x0;
} }
HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie)
{
Sink *sink;
sink = HeapAlloc(GetProcessHeap(), 0, sizeof(*sink));
if (!sink)
return E_OUTOFMEMORY;
if (FAILED(IUnknown_QueryInterface(unk, riid, (void**)&sink->interfaces.pIUnknown)))
{
HeapFree(GetProcessHeap(), 0, sink);
return CONNECT_E_CANNOTCONNECT;
}
list_add_head(sink_list, &sink->entry);
*cookie = generate_Cookie(cookie_magic, sink);
TRACE("cookie %x\n", *cookie);
return S_OK;
}
/***************************************************************************** /*****************************************************************************
* Active Text Service Management * Active Text Service Management
*****************************************************************************/ *****************************************************************************/

View File

@ -75,6 +75,8 @@ typedef struct {
} interfaces; } interfaces;
} Sink; } Sink;
HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie) DECLSPEC_HIDDEN;
extern const WCHAR szwSystemTIPKey[] DECLSPEC_HIDDEN; extern const WCHAR szwSystemTIPKey[] DECLSPEC_HIDDEN;
extern const WCHAR szwSystemCTFKey[] DECLSPEC_HIDDEN; extern const WCHAR szwSystemCTFKey[] DECLSPEC_HIDDEN;

View File

@ -643,7 +643,6 @@ static HRESULT WINAPI ThreadMgrSource_AdviseSink(ITfSource *iface,
REFIID riid, IUnknown *punk, DWORD *pdwCookie) REFIID riid, IUnknown *punk, DWORD *pdwCookie)
{ {
ThreadMgr *This = impl_from_ITfSource(iface); ThreadMgr *This = impl_from_ITfSource(iface);
Sink *tms;
TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie); TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie);
@ -651,27 +650,10 @@ static HRESULT WINAPI ThreadMgrSource_AdviseSink(ITfSource *iface,
return E_INVALIDARG; return E_INVALIDARG;
if (IsEqualIID(riid, &IID_ITfThreadMgrEventSink)) if (IsEqualIID(riid, &IID_ITfThreadMgrEventSink))
{ return advise_sink(&This->ThreadMgrEventSink, &IID_ITfThreadMgrEventSink, COOKIE_MAGIC_TMSINK, punk, pdwCookie);
tms = HeapAlloc(GetProcessHeap(),0,sizeof(*tms));
if (!tms)
return E_OUTOFMEMORY;
if (FAILED(IUnknown_QueryInterface(punk, riid, (LPVOID *)&tms->interfaces.pITfThreadMgrEventSink)))
{
HeapFree(GetProcessHeap(),0,tms);
return CONNECT_E_CANNOTCONNECT;
}
list_add_head(&This->ThreadMgrEventSink,&tms->entry);
*pdwCookie = generate_Cookie(COOKIE_MAGIC_TMSINK, tms);
}
else
{
FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
return E_NOTIMPL;
}
TRACE("cookie %x\n",*pdwCookie); FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
return E_NOTIMPL;
return S_OK;
} }
static HRESULT WINAPI ThreadMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie) static HRESULT WINAPI ThreadMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)