Commit 6117ea47 authored by Aric Stewart's avatar Aric Stewart Committed by Alexandre Julliard

msctf: Implement ITextStoreACPSink::OnStatusChange.

Requires changes in the way document locking is implemented and tested.
parent 7ac3fe28
......@@ -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;
......
......@@ -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);
......
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