[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