[PATCH 1/2] msctf: Make ITextStoreACPSink a part of context object
Nikolay Sivov
nsivov at codeweavers.com
Tue Mar 22 02:09:36 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/msctf/context.c | 264 ++++++++++++++++++++-------------------------------
1 file changed, 102 insertions(+), 162 deletions(-)
diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c
index 941245c..a649c38 100644
--- a/dlls/msctf/context.c
+++ b/dlls/msctf/context.c
@@ -65,6 +65,7 @@ typedef struct tagContext {
/* const ITfMouseTrackerVtbl *MouseTrackerVtbl; */
/* const ITfQueryEmbeddedVtbl *QueryEmbeddedVtbl; */
ITfSourceSingle ITfSourceSingle_iface;
+ ITextStoreACPSink ITextStoreACPSink_iface;
LONG refCount;
BOOL connected;
@@ -79,7 +80,6 @@ typedef struct tagContext {
ITextStoreACP *pITextStoreACP;
ITfContextOwnerCompositionSink *pITfContextOwnerCompositionSink;
- ITextStoreACPSink *pITextStoreACPSink;
ITfEditSession* currentEditSession;
/* kept as separate lists to reduce unnecessary iterations */
@@ -96,17 +96,6 @@ typedef struct tagEditCookie {
Context *pOwningContext;
} EditCookie;
-typedef struct tagTextStoreACPSink {
- ITextStoreACPSink ITextStoreACPSink_iface;
- /* const ITextStoreACPServicesVtbl *TextStoreACPServicesVtbl; */
- LONG refCount;
-
- Context *pContext;
-} TextStoreACPSink;
-
-
-static HRESULT TextStoreACPSink_Constructor(ITextStoreACPSink **ppOut, Context *pContext);
-
static inline Context *impl_from_ITfContext(ITfContext *iface)
{
return CONTAINING_RECORD(iface, Context, ITfContext_iface);
@@ -127,9 +116,9 @@ static inline Context *impl_from_ITfSourceSingle(ITfSourceSingle* iface)
return CONTAINING_RECORD(iface, Context, ITfSourceSingle_iface);
}
-static inline TextStoreACPSink *impl_from_ITextStoreACPSink(ITextStoreACPSink *iface)
+static inline Context *impl_from_ITextStoreACPSink(ITextStoreACPSink *iface)
{
- return CONTAINING_RECORD(iface, TextStoreACPSink, ITextStoreACPSink_iface);
+ return CONTAINING_RECORD(iface, Context, ITextStoreACPSink_iface);
}
static void free_sink(ContextSink *sink)
@@ -144,14 +133,11 @@ static void Context_Destructor(Context *This)
EditCookie *cookie;
TRACE("destroying %p\n", This);
- if (This->pITextStoreACPSink)
- {
- ITextStoreACP_UnadviseSink(This->pITextStoreACP, (IUnknown*)This->pITextStoreACPSink);
- ITextStoreACPSink_Release(This->pITextStoreACPSink);
- }
-
if (This->pITextStoreACP)
+ {
+ ITextStoreACP_UnadviseSink(This->pITextStoreACP, (IUnknown*)&This->ITextStoreACPSink_iface);
ITextStoreACP_Release(This->pITextStoreACP);
+ }
if (This->pITfContextOwnerCompositionSink)
ITfContextOwnerCompositionSink_Release(This->pITfContextOwnerCompositionSink);
@@ -791,108 +777,14 @@ static const ITfSourceSingleVtbl ContextSourceSingleVtbl =
SourceSingle_UnadviseSingleSink,
};
-HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfDocumentMgr *mgr, ITfContext **ppOut, TfEditCookie *pecTextStore)
-{
- Context *This;
- EditCookie *cookie;
-
- This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(Context));
- if (This == NULL)
- return E_OUTOFMEMORY;
-
- cookie = HeapAlloc(GetProcessHeap(),0,sizeof(EditCookie));
- if (cookie == NULL)
- {
- HeapFree(GetProcessHeap(),0,This);
- return E_OUTOFMEMORY;
- }
-
- TRACE("(%p) %x %p %p %p\n",This, tidOwner, punk, ppOut, pecTextStore);
-
- This->ITfContext_iface.lpVtbl= &ContextVtbl;
- This->ITfSource_iface.lpVtbl = &ContextSourceVtbl;
- This->ITfInsertAtSelection_iface.lpVtbl = &InsertAtSelectionVtbl;
- This->ITfSourceSingle_iface.lpVtbl = &ContextSourceSingleVtbl;
- This->refCount = 1;
- This->tidOwner = tidOwner;
- This->connected = FALSE;
- This->manager = mgr;
-
- CompartmentMgr_Constructor((IUnknown*)&This->ITfContext_iface, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
-
- cookie->lockType = TF_ES_READ;
- cookie->pOwningContext = This;
-
- if (punk)
- {
- IUnknown_QueryInterface(punk, &IID_ITextStoreACP,
- (LPVOID*)&This->pITextStoreACP);
-
- IUnknown_QueryInterface(punk, &IID_ITfContextOwnerCompositionSink,
- (LPVOID*)&This->pITfContextOwnerCompositionSink);
-
- if (!This->pITextStoreACP && !This->pITfContextOwnerCompositionSink)
- FIXME("Unhandled pUnk\n");
- }
-
- This->defaultCookie = generate_Cookie(COOKIE_MAGIC_EDITCOOKIE,cookie);
- *pecTextStore = This->defaultCookie;
-
- list_init(&This->pContextKeyEventSink);
- list_init(&This->pEditTransactionSink);
- list_init(&This->pStatusSink);
- list_init(&This->pTextEditSink);
- list_init(&This->pTextLayoutSink);
-
- *ppOut = &This->ITfContext_iface;
- TRACE("returning %p\n", *ppOut);
-
- return S_OK;
-}
-
-HRESULT Context_Initialize(ITfContext *iface, ITfDocumentMgr *manager)
-{
- Context *This = impl_from_ITfContext(iface);
-
- if (This->pITextStoreACP)
- {
- if (SUCCEEDED(TextStoreACPSink_Constructor(&This->pITextStoreACPSink, This)))
- ITextStoreACP_AdviseSink(This->pITextStoreACP, &IID_ITextStoreACPSink,
- (IUnknown*)This->pITextStoreACPSink, TS_AS_ALL_SINKS);
- }
- This->connected = TRUE;
- This->manager = manager;
- return S_OK;
-}
-
-HRESULT Context_Uninitialize(ITfContext *iface)
-{
- Context *This = impl_from_ITfContext(iface);
-
- if (This->pITextStoreACPSink)
- {
- ITextStoreACP_UnadviseSink(This->pITextStoreACP, (IUnknown*)This->pITextStoreACPSink);
- if (ITextStoreACPSink_Release(This->pITextStoreACPSink) == 0)
- This->pITextStoreACPSink = NULL;
- }
- This->connected = FALSE;
- This->manager = NULL;
- return S_OK;
-}
-
/**************************************************************************
* ITextStoreACPSink
**************************************************************************/
-static void TextStoreACPSink_Destructor(TextStoreACPSink *This)
-{
- TRACE("destroying %p\n", This);
- HeapFree(GetProcessHeap(),0,This);
-}
-
static HRESULT WINAPI TextStoreACPSink_QueryInterface(ITextStoreACPSink *iface, REFIID iid, LPVOID *ppvOut)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
+
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITextStoreACPSink))
@@ -912,19 +804,14 @@ static HRESULT WINAPI TextStoreACPSink_QueryInterface(ITextStoreACPSink *iface,
static ULONG WINAPI TextStoreACPSink_AddRef(ITextStoreACPSink *iface)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
- return InterlockedIncrement(&This->refCount);
+ Context *This = impl_from_ITextStoreACPSink(iface);
+ return ITfContext_AddRef(&This->ITfContext_iface);
}
static ULONG WINAPI TextStoreACPSink_Release(ITextStoreACPSink *iface)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
- ULONG ret;
-
- ret = InterlockedDecrement(&This->refCount);
- if (ret == 0)
- TextStoreACPSink_Destructor(This);
- return ret;
+ Context *This = impl_from_ITextStoreACPSink(iface);
+ return ITfContext_Release(&This->ITfContext_iface);
}
/*****************************************************
@@ -934,14 +821,14 @@ static ULONG WINAPI TextStoreACPSink_Release(ITextStoreACPSink *iface)
static HRESULT WINAPI TextStoreACPSink_OnTextChange(ITextStoreACPSink *iface,
DWORD dwFlags, const TS_TEXTCHANGE *pChange)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI TextStoreACPSink_OnSelectionChange(ITextStoreACPSink *iface)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
@@ -949,7 +836,7 @@ static HRESULT WINAPI TextStoreACPSink_OnSelectionChange(ITextStoreACPSink *ifac
static HRESULT WINAPI TextStoreACPSink_OnLayoutChange(ITextStoreACPSink *iface,
TsLayoutCode lcode, TsViewCookie vcView)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
@@ -957,27 +844,21 @@ static HRESULT WINAPI TextStoreACPSink_OnLayoutChange(ITextStoreACPSink *iface,
static HRESULT WINAPI TextStoreACPSink_OnStatusChange(ITextStoreACPSink *iface,
DWORD dwFlags)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
HRESULT hr, hrSession;
TRACE("(%p) %x\n",This, dwFlags);
- if (!This->pContext)
- {
- ERR("No context?\n");
- return E_FAIL;
- }
-
- if (!This->pContext->pITextStoreACP)
+ if (!This->pITextStoreACP)
{
FIXME("Context does not have a ITextStoreACP\n");
return E_NOTIMPL;
}
- hr = ITextStoreACP_RequestLock(This->pContext->pITextStoreACP, TS_LF_READ, &hrSession);
+ hr = ITextStoreACP_RequestLock(This->pITextStoreACP, TS_LF_READ, &hrSession);
if(SUCCEEDED(hr) && SUCCEEDED(hrSession))
- This->pContext->documentStatus.dwDynamicFlags = dwFlags;
+ This->documentStatus.dwDynamicFlags = dwFlags;
return S_OK;
}
@@ -985,7 +866,7 @@ static HRESULT WINAPI TextStoreACPSink_OnStatusChange(ITextStoreACPSink *iface,
static HRESULT WINAPI TextStoreACPSink_OnAttrsChange(ITextStoreACPSink *iface,
LONG acpStart, LONG acpEnd, ULONG cAttrs, const TS_ATTRID *paAttrs)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
@@ -993,7 +874,7 @@ static HRESULT WINAPI TextStoreACPSink_OnAttrsChange(ITextStoreACPSink *iface,
static HRESULT WINAPI TextStoreACPSink_OnLockGranted(ITextStoreACPSink *iface,
DWORD dwLockFlags)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
HRESULT hr;
EditCookie *cookie,*sinkcookie;
TfEditCookie ec;
@@ -1001,13 +882,7 @@ static HRESULT WINAPI TextStoreACPSink_OnLockGranted(ITextStoreACPSink *iface,
TRACE("(%p) %x\n",This, dwLockFlags);
- if (!This->pContext)
- {
- ERR("OnLockGranted called without a context\n");
- return E_FAIL;
- }
-
- if (!This->pContext->currentEditSession)
+ if (!This->currentEditSession)
{
FIXME("OnLockGranted called for something other than an EditSession\n");
return S_OK;
@@ -1025,32 +900,32 @@ static HRESULT WINAPI TextStoreACPSink_OnLockGranted(ITextStoreACPSink *iface,
}
cookie->lockType = dwLockFlags;
- cookie->pOwningContext = This->pContext;
+ cookie->pOwningContext = This;
ec = generate_Cookie(COOKIE_MAGIC_EDITCOOKIE, cookie);
- hr = ITfEditSession_DoEditSession(This->pContext->currentEditSession, ec);
+ hr = ITfEditSession_DoEditSession(This->currentEditSession, ec);
if ((dwLockFlags&TS_LF_READWRITE) == TS_LF_READWRITE)
{
TfEditCookie sc;
sinkcookie->lockType = TS_LF_READ;
- sinkcookie->pOwningContext = This->pContext;
+ sinkcookie->pOwningContext = This;
sc = generate_Cookie(COOKIE_MAGIC_EDITCOOKIE, sinkcookie);
/*TODO: implement ITfEditRecord */
- LIST_FOR_EACH(cursor, &This->pContext->pTextEditSink)
+ LIST_FOR_EACH(cursor, &This->pTextEditSink)
{
ContextSink* sink = LIST_ENTRY(cursor,ContextSink,entry);
ITfTextEditSink_OnEndEdit(sink->interfaces.pITfTextEditSink,
- (ITfContext*) &This->pContext, sc, NULL);
+ (ITfContext*) &This->ITfContext_iface, sc, NULL);
}
sinkcookie = remove_Cookie(sc);
}
HeapFree(GetProcessHeap(),0,sinkcookie);
- ITfEditSession_Release(This->pContext->currentEditSession);
- This->pContext->currentEditSession = NULL;
+ ITfEditSession_Release(This->currentEditSession);
+ This->currentEditSession = NULL;
/* Edit Cookie is only valid during the edit session */
cookie = remove_Cookie(ec);
@@ -1061,14 +936,14 @@ static HRESULT WINAPI TextStoreACPSink_OnLockGranted(ITextStoreACPSink *iface,
static HRESULT WINAPI TextStoreACPSink_OnStartEditTransaction(ITextStoreACPSink *iface)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI TextStoreACPSink_OnEndEditTransaction(ITextStoreACPSink *iface)
{
- TextStoreACPSink *This = impl_from_ITextStoreACPSink(iface);
+ Context *This = impl_from_ITextStoreACPSink(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
@@ -1088,20 +963,85 @@ static const ITextStoreACPSinkVtbl TextStoreACPSinkVtbl =
TextStoreACPSink_OnEndEditTransaction
};
-static HRESULT TextStoreACPSink_Constructor(ITextStoreACPSink **ppOut, Context *pContext)
+HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfDocumentMgr *mgr, ITfContext **ppOut, TfEditCookie *pecTextStore)
{
- TextStoreACPSink *This;
+ Context *This;
+ EditCookie *cookie;
- This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(TextStoreACPSink));
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(Context));
if (This == NULL)
return E_OUTOFMEMORY;
- This->ITextStoreACPSink_iface.lpVtbl= &TextStoreACPSinkVtbl;
+ cookie = HeapAlloc(GetProcessHeap(),0,sizeof(EditCookie));
+ if (cookie == NULL)
+ {
+ HeapFree(GetProcessHeap(),0,This);
+ return E_OUTOFMEMORY;
+ }
+
+ TRACE("(%p) %x %p %p %p\n",This, tidOwner, punk, ppOut, pecTextStore);
+
+ This->ITfContext_iface.lpVtbl= &ContextVtbl;
+ This->ITfSource_iface.lpVtbl = &ContextSourceVtbl;
+ This->ITfInsertAtSelection_iface.lpVtbl = &InsertAtSelectionVtbl;
+ This->ITfSourceSingle_iface.lpVtbl = &ContextSourceSingleVtbl;
+ This->ITextStoreACPSink_iface.lpVtbl = &TextStoreACPSinkVtbl;
This->refCount = 1;
+ This->tidOwner = tidOwner;
+ This->connected = FALSE;
+ This->manager = mgr;
+
+ CompartmentMgr_Constructor((IUnknown*)&This->ITfContext_iface, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
+
+ cookie->lockType = TF_ES_READ;
+ cookie->pOwningContext = This;
+
+ if (punk)
+ {
+ IUnknown_QueryInterface(punk, &IID_ITextStoreACP,
+ (LPVOID*)&This->pITextStoreACP);
+
+ IUnknown_QueryInterface(punk, &IID_ITfContextOwnerCompositionSink,
+ (LPVOID*)&This->pITfContextOwnerCompositionSink);
- This->pContext = pContext;
+ if (!This->pITextStoreACP && !This->pITfContextOwnerCompositionSink)
+ FIXME("Unhandled pUnk\n");
+ }
+
+ This->defaultCookie = generate_Cookie(COOKIE_MAGIC_EDITCOOKIE,cookie);
+ *pecTextStore = This->defaultCookie;
+
+ list_init(&This->pContextKeyEventSink);
+ list_init(&This->pEditTransactionSink);
+ list_init(&This->pStatusSink);
+ list_init(&This->pTextEditSink);
+ list_init(&This->pTextLayoutSink);
- *ppOut = &This->ITextStoreACPSink_iface;
+ *ppOut = &This->ITfContext_iface;
TRACE("returning %p\n", *ppOut);
+
+ return S_OK;
+}
+
+HRESULT Context_Initialize(ITfContext *iface, ITfDocumentMgr *manager)
+{
+ Context *This = impl_from_ITfContext(iface);
+
+ if (This->pITextStoreACP)
+ ITextStoreACP_AdviseSink(This->pITextStoreACP, &IID_ITextStoreACPSink,
+ (IUnknown*)&This->ITextStoreACPSink_iface, TS_AS_ALL_SINKS);
+ This->connected = TRUE;
+ This->manager = manager;
+ return S_OK;
+}
+
+HRESULT Context_Uninitialize(ITfContext *iface)
+{
+ Context *This = impl_from_ITfContext(iface);
+
+ if (This->pITextStoreACP)
+ ITextStoreACP_UnadviseSink(This->pITextStoreACP, (IUnknown*)&This->ITextStoreACPSink_iface);
+ This->connected = FALSE;
+ This->manager = NULL;
return S_OK;
}
--
2.7.0
More information about the wine-patches
mailing list