Module: wine Branch: master Commit: 6117ea47b32b77a488e3fbbd89ba310218e6cc51 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6117ea47b32b77a488e3fbbd89...
Author: Aric Stewart aric@codeweavers.com Date: Fri May 22 14:49:30 2009 -0500
msctf: Implement ITextStoreACPSink::OnStatusChange.
Requires changes in the way document locking is implemented and tested.
---
dlls/msctf/context.c | 43 +++++++++++++++++++++++++++++------- dlls/msctf/tests/inputprocessor.c | 37 +++++++++++++++---------------- 2 files changed, 52 insertions(+), 28 deletions(-)
diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c index 8e14a72..35838c9 100644 --- a/dlls/msctf/context.c +++ b/dlls/msctf/context.c @@ -70,6 +70,7 @@ typedef struct tagContext {
TfClientId tidOwner; TfEditCookie defaultCookie; + TS_STATUS documentStatus;
ITextStoreACP *pITextStoreACP; ITfContextOwnerCompositionSink *pITfContextOwnerCompositionSink; @@ -223,7 +224,6 @@ static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface, HRESULT hr; Context *This = (Context *)iface; DWORD dwLockFlags = 0x0; - TS_STATUS status;
TRACE("(%p) %i %p %x %p\n",This, tid, pes, dwFlags, phrSession);
@@ -248,10 +248,10 @@ static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface, else if (dwFlags & TF_ES_READ) dwLockFlags |= TS_LF_READ;
- /* TODO: cache this */ - ITextStoreACP_GetStatus(This->pITextStoreACP, &status); + if (!This->documentStatus.dwDynamicFlags) + ITextStoreACP_GetStatus(This->pITextStoreACP, &This->documentStatus);
- if (((dwFlags & TF_ES_READWRITE) == TF_ES_READWRITE) && (status.dwDynamicFlags & TS_SD_READONLY)) + if (((dwFlags & TF_ES_READWRITE) == TF_ES_READWRITE) && (This->documentStatus.dwDynamicFlags & TS_SD_READONLY)) { *phrSession = TS_E_READONLY; return S_OK; @@ -263,7 +263,6 @@ static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface, return E_INVALIDARG; }
- hr = ITextStoreACP_RequestLock(This->pITextStoreACP, dwLockFlags, phrSession);
return hr; @@ -739,8 +738,28 @@ static HRESULT WINAPI TextStoreACPSink_OnStatusChange(ITextStoreACPSink *iface, DWORD dwFlags) { TextStoreACPSink *This = (TextStoreACPSink *)iface; - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + HRESULT hr, hrSession; + + TRACE("(%p) %x\n",This, dwFlags); + + if (!This->pContext) + { + ERR("No context?\n"); + return E_FAIL; + } + + if (!This->pContext->pITextStoreACP) + { + FIXME("Context does not have a ITextStoreACP\n"); + return E_NOTIMPL; + } + + hr = ITextStoreACP_RequestLock(This->pContext->pITextStoreACP, TS_LF_READ, &hrSession); + + if(SUCCEEDED(hr) && SUCCEEDED(hrSession)) + This->pContext->documentStatus.dwDynamicFlags = dwFlags; + + return S_OK; }
static HRESULT WINAPI TextStoreACPSink_OnAttrsChange(ITextStoreACPSink *iface, @@ -761,12 +780,18 @@ static HRESULT WINAPI TextStoreACPSink_OnLockGranted(ITextStoreACPSink *iface,
TRACE("(%p) %x\n",This, dwLockFlags);
- if (!This->pContext || !This->pContext->currentEditSession) + if (!This->pContext) { - ERR("OnLockGranted called on a context without a current edit session\n"); + ERR("OnLockGranted called without a context\n"); return E_FAIL; }
+ if (!This->pContext->currentEditSession) + { + FIXME("OnLockGranted called for something other than an EditSession\n"); + return S_OK; + } + cookie = HeapAlloc(GetProcessHeap(),0,sizeof(EditCookie)); if (!cookie) return E_OUTOFMEMORY; diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c index 5884a30..bdb9a62 100644 --- a/dlls/msctf/tests/inputprocessor.c +++ b/dlls/msctf/tests/inputprocessor.c @@ -38,6 +38,8 @@ static ITfDocumentMgr *g_dm = NULL; static TfClientId cid = 0; static TfClientId tid = 0;
+static ITextStoreACPSink *ACPSink; + #define SINK_UNEXPECTED 0 #define SINK_EXPECTED 1 #define SINK_FIRED 2 @@ -47,6 +49,7 @@ static BOOL test_ShouldDeactivate = FALSE;
static DWORD tmSinkCookie; static DWORD tmSinkRefCount; +static DWORD documentStatus; static ITfDocumentMgr *test_CurrentFocus = NULL; static ITfDocumentMgr *test_PrevFocus = NULL; static INT test_OnSetFocus = SINK_UNEXPECTED; @@ -70,7 +73,6 @@ typedef struct tagTextStoreACP const ITextStoreACPVtbl *TextStoreACPVtbl; LONG refCount;
- ITextStoreACPSink *sink; } TextStoreACP;
static void TextStoreACP_Destructor(TextStoreACP *This) @@ -117,13 +119,12 @@ static ULONG WINAPI TextStoreACP_Release(ITextStoreACP *iface) static HRESULT WINAPI TextStoreACP_AdviseSink(ITextStoreACP *iface, REFIID riid, IUnknown *punk, DWORD dwMask) { - TextStoreACP *This = (TextStoreACP *)iface; HRESULT hr;
ok(test_ACP_AdviseSink == SINK_EXPECTED, "Unexpected TextStoreACP_AdviseSink sink\n"); test_ACP_AdviseSink = SINK_FIRED;
- hr = IUnknown_QueryInterface(punk, &IID_ITextStoreACPSink,(LPVOID*)(&This->sink)); + hr = IUnknown_QueryInterface(punk, &IID_ITextStoreACPSink,(LPVOID*)(&ACPSink)); ok(SUCCEEDED(hr),"Unable to QueryInterface on sink\n"); return S_OK; } @@ -138,28 +139,17 @@ static HRESULT WINAPI TextStoreACP_UnadviseSink(ITextStoreACP *iface, static HRESULT WINAPI TextStoreACP_RequestLock(ITextStoreACP *iface, DWORD dwLockFlags, HRESULT *phrSession) { - TextStoreACP *This = (TextStoreACP *)iface; - ok(test_ACP_RequestLock == SINK_EXPECTED,"Unexpected TextStoreACP_RequestLock\n"); test_ACP_RequestLock = SINK_FIRED; - test_DoEditSession = SINK_EXPECTED; - *phrSession = ITextStoreACPSink_OnLockGranted(This->sink, TS_LF_READWRITE); - ok(test_DoEditSession = SINK_FIRED,"expected DoEditSession not fired\n"); - ok(*phrSession == 0xdeadcafe,"Unexpected return from ITextStoreACPSink_OnLockGranted\n"); + *phrSession = ITextStoreACPSink_OnLockGranted(ACPSink, dwLockFlags); return S_OK; } static HRESULT WINAPI TextStoreACP_GetStatus(ITextStoreACP *iface, TS_STATUS *pdcs) { - static UINT count = 0; - count ++; - - if (count == 1) - ok(test_ACP_GetStatus == SINK_EXPECTED, "Unexpected TextStoreACP_GetStatus\n"); - else - todo_wine ok(count == 1,"GetStatus called too many times\n"); + ok(test_ACP_GetStatus == SINK_EXPECTED, "Unexpected TextStoreACP_GetStatus\n"); test_ACP_GetStatus = SINK_FIRED; - pdcs->dwDynamicFlags = TS_SD_READONLY; + pdcs->dwDynamicFlags = documentStatus; return S_OK; } static HRESULT WINAPI TextStoreACP_QueryInsert(ITextStoreACP *iface, @@ -1483,6 +1473,7 @@ static void test_TStoApplicationText(void) ok(hr == E_INVALIDARG,"RequestEditSession should have failed with %x not %x\n",E_INVALIDARG,hr); ok(hrSession == E_FAIL,"hrSession should be %x not %x\n",E_FAIL,hrSession);
+ documentStatus = TS_SD_READONLY; hrSession = 0xfeedface; test_ACP_GetStatus = SINK_EXPECTED; hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC|TF_ES_READWRITE, &hrSession); @@ -1490,13 +1481,21 @@ static void test_TStoApplicationText(void) ok(hrSession == TS_E_READONLY,"Unexpected hrSession (%x)\n",hrSession); ok(test_ACP_GetStatus == SINK_FIRED," expected GetStatus not fired\n");
- test_ACP_GetStatus = SINK_UNEXPECTED; + /* signal a change to allow readwrite sessions */ + documentStatus = 0; test_ACP_RequestLock = SINK_EXPECTED; + ITextStoreACPSink_OnStatusChange(ACPSink,documentStatus); + ok(test_ACP_RequestLock == SINK_FIRED," expected RequestLock not fired\n"); + + test_ACP_GetStatus = SINK_EXPECTED; + test_ACP_RequestLock = SINK_EXPECTED; + test_DoEditSession = SINK_EXPECTED; hrSession = 0xfeedface; - hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC|TF_ES_READ, &hrSession); + hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC|TF_ES_READWRITE, &hrSession); ok(SUCCEEDED(hr),"ITfContext_RequestEditSession failed\n"); ok(test_ACP_RequestLock == SINK_FIRED," expected RequestLock not fired\n"); ok(test_DoEditSession == SINK_FIRED," expected DoEditSession not fired\n"); + ok(test_ACP_GetStatus == SINK_FIRED," expected GetStatus not fired\n"); ok(hrSession == 0xdeadcafe,"Unexpected hrSession (%x)\n",hrSession);
ITfContext_Release(cxt);