Commit 80c91976 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

msctf: Make ITextStoreACPSink a part of context object.

parent ebb9c5e2
......@@ -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;
This->pContext = pContext;
CompartmentMgr_Constructor((IUnknown*)&This->ITfContext_iface, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
*ppOut = &This->ITextStoreACPSink_iface;
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)
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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment