static DWORD tmSinkCookie;
static DWORD tmSinkRefCount;
+static DWORD dmSinkCookie;
static DWORD documentStatus;
static ITfDocumentMgr *test_CurrentFocus = NULL;
static ITfDocumentMgr *test_PrevFocus = NULL;
static INT test_OnPopContext = SINK_UNEXPECTED;
static INT test_KEV_OnSetFocus = SINK_UNEXPECTED;
static INT test_ACP_AdviseSink = SINK_UNEXPECTED;
+static INT test_ACP_UnadviseSink = SINK_UNEXPECTED;
static INT test_ACP_GetStatus = SINK_UNEXPECTED;
static INT test_ACP_RequestLock = SINK_UNEXPECTED;
static INT test_ACP_GetEndACP = SINK_UNEXPECTED;
*sink = (*sink & ~SINK_EXPECTED_COUNT_MASK) + (count << 16);
return;
default:
- if (todo)
- todo_wine winetest_ok(0, "Unexpected %s sink\n",name);
- else
+ todo_wine_if (todo)
winetest_ok(0, "Unexpected %s sink\n",name);
}
*sink = SINK_FIRED;
winetest_trace("optional sink %s not fired\n",name);
break;
default:
- if (todo)
- todo_wine winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink);
- else
+ todo_wine_if (todo)
winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink);
}
*sink = SINK_UNEXPECTED;
static HRESULT WINAPI TextStoreACP_QueryInterface(ITextStoreACP *iface, REFIID iid, LPVOID *ppvOut)
{
- TextStoreACP *This = impl_from_ITextStoreACP(iface);
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITextStoreACP))
{
- *ppvOut = This;
+ *ppvOut = iface;
}
if (*ppvOut)
static HRESULT WINAPI TextStoreACP_AdviseSink(ITextStoreACP *iface,
REFIID riid, IUnknown *punk, DWORD dwMask)
{
+ ITextStoreACPServices *services;
HRESULT hr;
sink_fire_ok(&test_ACP_AdviseSink,"TextStoreACP_AdviseSink");
- hr = IUnknown_QueryInterface(punk, &IID_ITextStoreACPSink,(LPVOID*)(&ACPSink));
+ if(ACPSink)
+ return S_OK;
+
+ hr = IUnknown_QueryInterface(punk, &IID_ITextStoreACPSink, (void**)&ACPSink);
ok(SUCCEEDED(hr),"Unable to QueryInterface on sink\n");
+
+ hr = ITextStoreACPSink_QueryInterface(ACPSink, &IID_ITextStoreACPServices, (void**)&services);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ITextStoreACPServices_Release(services);
+
return S_OK;
}
static HRESULT WINAPI TextStoreACP_UnadviseSink(ITextStoreACP *iface,
IUnknown *punk)
{
- trace("\n");
+ sink_fire_ok(&test_ACP_UnadviseSink,"TextStoreACP_UnadviseSink");
return S_OK;
}
This->ITextStoreACP_iface.lpVtbl = &TextStoreACP_TextStoreACPVtbl;
This->refCount = 1;
- *ppOut = (IUnknown *)This;
+ *ppOut = (IUnknown*)&This->ITextStoreACP_iface;
return S_OK;
}
static HRESULT WINAPI ThreadMgrEventSink_QueryInterface(ITfThreadMgrEventSink *iface, REFIID iid, LPVOID *ppvOut)
{
- ThreadMgrEventSink *This = impl_from_ITfThreadMgrEventSink(iface);
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfThreadMgrEventSink))
{
- *ppvOut = This;
+ *ppvOut = iface;
}
if (*ppvOut)
hr = ITfContext_GetDocumentMgr(pic,&docmgr);
ok(SUCCEEDED(hr),"GetDocumentMgr failed\n");
test = (ITfContext*)0xdeadbeef;
- ITfDocumentMgr_Release(docmgr);
hr = ITfDocumentMgr_GetTop(docmgr,&test);
ok(SUCCEEDED(hr),"GetTop failed\n");
+ ITfDocumentMgr_Release(docmgr);
ok(test == pic, "Wrong context is on top\n");
if (test)
ITfContext_Release(test);
This->ITfThreadMgrEventSink_iface.lpVtbl = &ThreadMgrEventSink_ThreadMgrEventSinkVtbl;
This->refCount = 1;
- *ppOut = (IUnknown *)This;
+ *ppOut = (IUnknown*)&This->ITfThreadMgrEventSink_iface;
return S_OK;
}
+static HRESULT WINAPI TfTransitoryExtensionSink_QueryInterface(ITfTransitoryExtensionSink *iface, REFIID riid, void **ppv)
+{
+ if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITfTransitoryExtensionSink, riid)) {
+ *ppv = iface;
+ return S_OK;
+ }
+
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI TfTransitoryExtensionSink_AddRef(ITfTransitoryExtensionSink *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI TfTransitoryExtensionSink_Release(ITfTransitoryExtensionSink *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI TfTransitoryExtensionSink_OnTransitoryExtensionUpdated(ITfTransitoryExtensionSink *iface, ITfContext *pic,
+ TfEditCookie ecReadOnly, ITfRange *pResultRange, ITfRange *pCompositionRange, BOOL *pfDeleteResultRange)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const ITfTransitoryExtensionSinkVtbl TfTransitoryExtensionSinkVtbl = {
+ TfTransitoryExtensionSink_QueryInterface,
+ TfTransitoryExtensionSink_AddRef,
+ TfTransitoryExtensionSink_Release,
+ TfTransitoryExtensionSink_OnTransitoryExtensionUpdated
+};
+
+static ITfTransitoryExtensionSink TfTransitoryExtensionSink = { &TfTransitoryExtensionSinkVtbl };
/********************************************************************************************
* Stub text service for testing
This->IClassFactory_iface.lpVtbl = &ClassFactoryVtbl;
This->ref = 1;
This->ctor = ctor;
- *ppvOut = (LPVOID)This;
+ *ppvOut = &This->IClassFactory_iface;
TS_refCount++;
return S_OK;
}
static HRESULT WINAPI TextService_QueryInterface(ITfTextInputProcessor *iface, REFIID iid, LPVOID *ppvOut)
{
- TextService *This = impl_from_ITfTextInputProcessor(iface);
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextInputProcessor))
{
- *ppvOut = This;
+ *ppvOut = iface;
}
if (*ppvOut)
This->ITfTextInputProcessor_iface.lpVtbl = &TextService_TextInputProcessorVtbl;
This->refCount = 1;
- *ppOut = (IUnknown *)This;
+ *ppOut = (IUnknown*)&This->ITfTextInputProcessor_iface;
return S_OK;
}
if(IsEqualGUID(&g,&CLSID_FakeService))
found = TRUE;
}
+ IEnumGUID_Release(ppEnum);
}
ok(found,"Did not find registered text service\n");
}
{
BOOL found = FALSE;
IEnumTfLanguageProfiles *ppEnum;
+ HRESULT hr;
+
+ hr = ITfInputProcessorProfiles_EnumLanguageProfiles(g_ipp, gLangid, NULL);
+ ok(hr == E_INVALIDARG, "EnumLanguageProfiles failed: %x\n", hr);
+
if (SUCCEEDED(ITfInputProcessorProfiles_EnumLanguageProfiles(g_ipp,gLangid,&ppEnum)))
{
TF_LANGUAGEPROFILE profile;
ok(IsEqualGUID(&profile.guidProfile,&CLSID_FakeService), "guidProfile Incorrect\n");
}
}
+ IEnumTfLanguageProfiles_Release(ppEnum);
}
ok(found,"Registered text service not found\n");
}
ITfSource_Release(source);
}
+static void test_DocumentMgrAdviseSinks(void)
+{
+ ITfSource *source;
+ HRESULT hr;
+
+ hr = ITfDocumentMgr_QueryInterface(g_dm, &IID_ITfSource, (void**)&source);
+ ok(hr == S_OK,"Failed to get IID_ITfSource for DocumentMgr\n");
+
+ dmSinkCookie = 0;
+ hr = ITfSource_AdviseSink(source, &IID_ITfTransitoryExtensionSink, (IUnknown*)&TfTransitoryExtensionSink, &dmSinkCookie);
+ ok(hr == S_OK,"Failed to Advise Sink\n");
+
+ ITfSource_Release(source);
+}
+
+static void test_DocumentMgrUnadviseSinks(void)
+{
+ ITfSource *source = NULL;
+ HRESULT hr;
+
+ hr = ITfDocumentMgr_QueryInterface(g_dm, &IID_ITfSource, (void**)&source);
+ ok(hr == S_OK,"Failed to get IID_ITfSource for DocumentMgr\n");
+
+ hr = ITfSource_UnadviseSink(source, dmSinkCookie);
+ ok(hr == S_OK,"Failed to unadvise Sink\n");
+ ITfSource_Release(source);
+}
+
/**********************************************************************
* ITfKeyEventSink
**********************************************************************/
static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut)
{
- KeyEventSink *This = impl_from_ITfKeyEventSink(iface);
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink))
{
- *ppvOut = This;
+ *ppvOut = iface;
}
if (*ppvOut)
ok(hr == E_INVALIDARG,"Wrong return, expected E_INVALIDARG\n");
hr =ITfKeystrokeMgr_PreserveKey(keymgr, 0, &CLSID_PreservedKey, &tfpk, NULL, 0);
- ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n");
+ ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey improperly succeeded\n");
hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0);
ok(SUCCEEDED(hr),"ITfKeystrokeMgr_PreserveKey failed\n");
hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0);
- ok(hr == TF_E_ALREADY_EXISTS,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n");
+ ok(hr == TF_E_ALREADY_EXISTS,"ITfKeystrokeMgr_PreserveKey improperly succeeded\n");
preserved = FALSE;
hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved);
if (hr == S_FALSE) ok(preserved == FALSE,"misreporting preserved key\n");
hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk);
- ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey inproperly succeeded\n");
+ ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey improperly succeeded\n");
hr = ITfKeystrokeMgr_UnadviseKeyEventSink(keymgr,tid);
ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnadviseKeyEventSink failed\n");
static HRESULT WINAPI TextEditSink_QueryInterface(ITfTextEditSink *iface, REFIID iid, LPVOID *ppvOut)
{
- TextEditSink *This = impl_from_ITfTextEditSink(iface);
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextEditSink))
{
- *ppvOut = This;
+ *ppvOut = iface;
}
if (*ppvOut)
DWORD editCookie;
ITfDocumentMgr *dmtest;
ITfContext *cxt,*cxt2,*cxt3,*cxtTest;
- ITextStoreACP *ts;
+ ITextStoreACP *ts = NULL;
TfClientId cid2 = 0;
+ ITfThreadMgrEx *tmex;
hr = ITfThreadMgr_Deactivate(g_tm);
ok(hr == E_UNEXPECTED,"Deactivate should have failed with E_UNEXPECTED\n");
test_ShouldActivate = FALSE;
hr = ITfThreadMgr_Activate(g_tm,&cid2);
ok(SUCCEEDED(hr),"Failed to Activate\n");
- ok (cid == cid2, "Second activate client ID does not match\n");
+ ok(cid == cid2, "Second activate client ID does not match\n");
+
+ hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfThreadMgrEx, (void **)&tmex);
+ if (hr == S_OK)
+ {
+ hr = ITfThreadMgrEx_ActivateEx(tmex, &cid2, 0);
+ ok(SUCCEEDED(hr), "Failed to Activate\n");
+ ok(cid == cid2, "ActivateEx client ID does not match\n");
+
+ ITfThreadMgrEx_Release(tmex);
+ }
+ else
+ win_skip("ITfThreadMgrEx is not supported\n");
hr = ITfThreadMgr_Deactivate(g_tm);
- ok(SUCCEEDED(hr),"Failed to Deactivate\n");
+ ok(SUCCEEDED(hr), "Failed to Deactivate\n");
+ hr = ITfThreadMgr_Deactivate(g_tm);
+ ok(SUCCEEDED(hr), "Failed to Deactivate\n");
test_EnumDocumentMgr(g_tm,NULL,NULL);
ok(hr == S_FALSE, "ITfContext_GetDocumentMgr wrong rc %x\n",hr);
ok(dmtest == NULL,"returned documentmgr should be null\n");
+ ITfContext_Release(cxt2);
+
hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest);
ok(SUCCEEDED(hr),"GetTop Failed\n");
ok(cxtTest == cxt, "Wrong context on top\n");
ok(cxtTest == cxt, "Wrong context on base\n");
ITfContext_Release(cxtTest);
+ hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt2, &editCookie);
+ ok(hr == S_OK,"CreateContext Failed\n");
+
+ test_OnPushContext = SINK_EXPECTED;
+ test_ACP_AdviseSink = SINK_EXPECTED;
+ hr = ITfDocumentMgr_Push(g_dm, cxt2);
+ ok(hr == S_OK,"Push Failed\n");
+ sink_check_ok(&test_OnPushContext,"OnPushContext");
+ sink_check_ok(&test_ACP_AdviseSink,"TextStoreACP_AdviseSink");
+
+ test_ACP_UnadviseSink = SINK_EXPECTED;
+ cnt = check_context_refcount(cxt2);
+ test_OnPopContext = SINK_EXPECTED;
+ hr = ITfDocumentMgr_Pop(g_dm, 0);
+ ok(hr == S_OK,"Pop Failed\n");
+ ok(check_context_refcount(cxt2) < cnt, "Ref count did not decrease\n");
+ sink_check_ok(&test_OnPopContext,"OnPopContext");
+ sink_check_ok(&test_ACP_UnadviseSink,"TextStoreACP_AdviseSink");
+
hr = ITfDocumentMgr_Pop(g_dm, 0);
ok(FAILED(hr),"Pop Succeeded\n");
static HRESULT WINAPI EditSession_QueryInterface(ITfEditSession *iface, REFIID iid, LPVOID *ppvOut)
{
- EditSession *This = impl_from_ITfEditSession(iface);
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfEditSession))
{
- *ppvOut = This;
+ *ppvOut = iface;
}
if (*ppvOut)
test_PrevFocus = FOCUS_IGNORE;
DestroyWindow(wnd1);
DestroyWindow(wnd2);
- test_OnSetFocus = SINK_UNEXPECTED;
test_OnPopContext = SINK_OPTIONAL; /* Vista and greater */
test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */
ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus);
sink_check_ok(&test_OnPopContext,"OnPopContext");
}
+static void test_profile_mgr(void)
+{
+ IEnumTfInputProcessorProfiles *enum_profiles;
+ ITfInputProcessorProfileMgr *ipp_mgr;
+ HRESULT hres;
+
+ hres = ITfInputProcessorProfiles_QueryInterface(g_ipp, &IID_ITfInputProcessorProfileMgr, (void**)&ipp_mgr);
+ if (hres != S_OK)
+ {
+ win_skip("ITfInputProcessorProfileMgr is not supported.\n");
+ return;
+ }
+ ok(hres == S_OK, "Could not get ITfInputProcessorProfileMgr iface: %08x\n", hres);
+
+ hres = ITfInputProcessorProfileMgr_EnumProfiles(ipp_mgr, 0, &enum_profiles);
+ ok(hres == S_OK, "EnumProfiles failed: %08x\n", hres);
+
+ IEnumTfInputProcessorProfiles_Release(enum_profiles);
+
+ ITfInputProcessorProfileMgr_Release(ipp_mgr);
+}
+
START_TEST(inputprocessor)
{
if (SUCCEEDED(initialize()))
test_ThreadMgrAdviseSinks();
test_Activate();
test_startSession();
+ test_DocumentMgrAdviseSinks();
test_TfGuidAtom();
test_ClientId();
test_KeystrokeMgr();
test_FindClosestCategory();
test_Disable();
test_ThreadMgrUnadviseSinks();
+ test_DocumentMgrUnadviseSinks();
test_UnregisterCategory();
test_Unregister();
+ test_profile_mgr();
+
+ ITextStoreACPSink_Release(ACPSink);
+ ITfDocumentMgr_Release(g_dm);
}
else
skip("Unable to create InputProcessor\n");