Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msctf/range.c | 19 +++++++++++++------ dlls/msctf/tests/inputprocessor.c | 26 +++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/dlls/msctf/range.c b/dlls/msctf/range.c index c4eee2501fb..85922791bad 100644 --- a/dlls/msctf/range.c +++ b/dlls/msctf/range.c @@ -42,7 +42,7 @@ typedef struct tagRange { LONG refCount;
ITextStoreACP *pITextStoreACP; - ITfContext *pITfContext; + ITfContext *context;
DWORD lockType; TfGravity gravityStart, gravityEnd; @@ -58,6 +58,7 @@ static inline Range *impl_from_ITfRange(ITfRange *iface) static void Range_Destructor(Range *This) { TRACE("destroying %p\n", This); + ITfContext_Release(This->context); HeapFree(GetProcessHeap(),0,This); }
@@ -282,13 +283,18 @@ static HRESULT WINAPI Range_Clone(ITfRange *iface, ITfRange **ppClone) return E_NOTIMPL; }
-static HRESULT WINAPI Range_GetContext(ITfRange *iface, ITfContext **ppContext) +static HRESULT WINAPI Range_GetContext(ITfRange *iface, ITfContext **context) { Range *This = impl_from_ITfRange(iface); - TRACE("(%p)\n",This); - if (!ppContext) + + TRACE("(%p, %p)\n", This, context); + + if (!context) return E_INVALIDARG; - *ppContext = This->pITfContext; + + *context = This->context; + ITfContext_AddRef(*context); + return S_OK; }
@@ -334,7 +340,8 @@ HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD l
This->ITfRange_iface.lpVtbl = &Range_RangeVtbl; This->refCount = 1; - This->pITfContext = context; + This->context = context; + ITfContext_AddRef(This->context); This->pITextStoreACP = textstore; This->lockType = lockType; This->anchorStart = anchorStart; diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c index 55a6ab6c34c..fd03059e545 100644 --- a/dlls/msctf/tests/inputprocessor.c +++ b/dlls/msctf/tests/inputprocessor.c @@ -228,6 +228,8 @@ static HRESULT WINAPI TextStoreACP_AdviseSink(ITextStoreACP *iface, REFIID riid, IUnknown *punk, DWORD dwMask) { ITextStoreACPServices *services; + ITfRangeACP *range; + ITfContext *context; HRESULT hr;
if (winetest_debug > 1) trace("ITextStoreACP::AdviseSink(iid %s, mask %#x)\n", @@ -243,6 +245,18 @@ static HRESULT WINAPI TextStoreACP_AdviseSink(ITextStoreACP *iface,
hr = ITextStoreACPSink_QueryInterface(ACPSink, &IID_ITextStoreACPServices, (void**)&services); ok(hr == S_OK, "got 0x%08x\n", hr); + + range = NULL; + hr = ITextStoreACPServices_CreateRange(services, 0, 1, &range); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + if (range) + { + hr = ITfRangeACP_GetContext(range, &context); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ITfContext_Release(context); + ITfRangeACP_Release(range); + } + ITextStoreACPServices_Release(services);
return S_OK; @@ -2084,10 +2098,11 @@ static void test_InsertAtSelection(TfEditCookie ec, ITfContext *cxt) static HRESULT WINAPI EditSession_DoEditSession(ITfEditSession *iface, TfEditCookie ec) { - ITfContext *cxt; + ITfContext *cxt, *context2; ITfDocumentMgr *dm; ITfRange *range; TF_SELECTION selection; + IUnknown *unk; ULONG fetched; HRESULT hr;
@@ -2109,6 +2124,15 @@ TfEditCookie ec) ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr); ok(range != NULL,"Range set to NULL\n");
+ hr = ITfRange_GetContext(range, &context2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(context2 == cxt, "Unexpected context pointer.\n"); + ITfContext_Release(context2); + + hr = ITfRange_QueryInterface(range, &IID_ITfRangeACP, (void **)&unk); +todo_wine + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ITfRange_Release(range);
hr = ITfContext_GetEnd(cxt,ec,NULL);