Aric Stewart : msctf: Implement ITfCategoryMgr::RegisterGUID, ITfCategoryMgr::GetGUID and ITfCategoryMgr::IsEqualTfGuidAtom.
Alexandre Julliard
julliard at winehq.org
Tue May 5 09:12:54 CDT 2009
Module: wine
Branch: master
Commit: 19c2b7cbcbe8cfc810cb9ebea0231f11b4f749c6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=19c2b7cbcbe8cfc810cb9ebea0231f11b4f749c6
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon May 4 14:31:15 2009 -0500
msctf: Implement ITfCategoryMgr::RegisterGUID, ITfCategoryMgr::GetGUID and ITfCategoryMgr::IsEqualTfGuidAtom.
---
dlls/msctf/categorymgr.c | 64 +++++++++++++++++++++++++++++++++---
dlls/msctf/msctf.c | 12 +++++++
dlls/msctf/msctf_internal.h | 2 +
dlls/msctf/tests/inputprocessor.c | 40 +++++++++++++++++++++++
4 files changed, 112 insertions(+), 6 deletions(-)
diff --git a/dlls/msctf/categorymgr.c b/dlls/msctf/categorymgr.c
index 3f47140..b76bebb 100644
--- a/dlls/msctf/categorymgr.c
+++ b/dlls/msctf/categorymgr.c
@@ -312,25 +312,77 @@ static HRESULT WINAPI CategoryMgr_RegisterGUID ( ITfCategoryMgr *iface,
REFGUID rguid, TfGuidAtom *pguidatom
)
{
+ DWORD index;
+ GUID *checkguid;
+ DWORD id;
CategoryMgr *This = (CategoryMgr*)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+
+ TRACE("(%p) %s %p\n",This,debugstr_guid(rguid),pguidatom);
+
+ if (!pguidatom)
+ return E_INVALIDARG;
+
+ index = 0;
+ do {
+ id = enumerate_Cookie(COOKIE_MAGIC_GUIDATOM,&index);
+ if (id && IsEqualGUID(rguid,get_Cookie_data(id)))
+ {
+ *pguidatom = id;
+ return S_OK;
+ }
+ } while(id);
+
+ checkguid = HeapAlloc(GetProcessHeap(),0,sizeof(GUID));
+ *checkguid = *rguid;
+ id = generate_Cookie(COOKIE_MAGIC_GUIDATOM,checkguid);
+
+ if (!id)
+ {
+ HeapFree(GetProcessHeap(),0,checkguid);
+ return E_FAIL;
+ }
+
+ *pguidatom = id;
+
+ return S_OK;
}
static HRESULT WINAPI CategoryMgr_GetGUID ( ITfCategoryMgr *iface,
TfGuidAtom guidatom, GUID *pguid)
{
CategoryMgr *This = (CategoryMgr*)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+
+ TRACE("(%p) %i\n",This,guidatom);
+
+ if (!pguid)
+ return E_INVALIDARG;
+
+ *pguid = GUID_NULL;
+
+ if (get_Cookie_magic(guidatom) == COOKIE_MAGIC_GUIDATOM)
+ *pguid = *((REFGUID)get_Cookie_data(guidatom));
+
+ return S_OK;
}
static HRESULT WINAPI CategoryMgr_IsEqualTfGuidAtom ( ITfCategoryMgr *iface,
TfGuidAtom guidatom, REFGUID rguid, BOOL *pfEqual)
{
CategoryMgr *This = (CategoryMgr*)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+
+ TRACE("(%p) %i %s %p\n",This,guidatom,debugstr_guid(rguid),pfEqual);
+
+ if (!pfEqual)
+ return E_INVALIDARG;
+
+ *pfEqual = FALSE;
+ if (get_Cookie_magic(guidatom) == COOKIE_MAGIC_GUIDATOM)
+ {
+ if (IsEqualGUID(rguid,get_Cookie_data(guidatom)))
+ *pfEqual = TRUE;
+ }
+
+ return S_OK;
}
diff --git a/dlls/msctf/msctf.c b/dlls/msctf/msctf.c
index fac0f9d..711ae51 100644
--- a/dlls/msctf/msctf.c
+++ b/dlls/msctf/msctf.c
@@ -252,6 +252,18 @@ LPVOID remove_Cookie(DWORD id)
return cookies[index].data;
}
+DWORD enumerate_Cookie(DWORD magic, DWORD *index)
+{
+ int i;
+ for (i = *index; i < id_last; i++)
+ if (cookies[i].id != 0 && cookies[i].magic == magic)
+ {
+ *index = (i+1);
+ return cookies[i].id;
+ }
+ return 0x0;
+}
+
/*************************************************************************
* MSCTF DllMain
*/
diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h
index a9f7982..826c09d 100644
--- a/dlls/msctf/msctf_internal.h
+++ b/dlls/msctf/msctf_internal.h
@@ -23,6 +23,7 @@
#define COOKIE_MAGIC_TMSINK 0x0010
#define COOKIE_MAGIC_CONTEXTSINK 0x0020
+#define COOKIE_MAGIC_GUIDATOM 0x0030
extern DWORD tlsIndex;
@@ -37,6 +38,7 @@ extern DWORD generate_Cookie(DWORD magic, LPVOID data);
extern DWORD get_Cookie_magic(DWORD id);
extern LPVOID get_Cookie_data(DWORD id);
extern LPVOID remove_Cookie(DWORD id);
+extern DWORD enumerate_Cookie(DWORD magic, DWORD *index);
extern const WCHAR szwSystemTIPKey[];
#endif /* __WINE_MSCTF_I_H */
diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c
index 9f2900a..b5ae508 100644
--- a/dlls/msctf/tests/inputprocessor.c
+++ b/dlls/msctf/tests/inputprocessor.c
@@ -609,6 +609,45 @@ static void test_endSession(void)
test_OnSetFocus = SINK_UNEXPECTED;
}
+static void test_TfGuidAtom(void)
+{
+ GUID gtest,g1;
+ HRESULT hr;
+ TfGuidAtom atom1,atom2;
+ BOOL equal;
+
+ CoCreateGuid(>est);
+
+ /* msdn reports this should return E_INVALIDARG. However my test show it crashing (winxp)*/
+ /*
+ hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,NULL);
+ ok(hr==E_INVALIDARG,"ITfCategoryMgr_RegisterGUID should have failed\n");
+ */
+ hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom1);
+ ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n");
+ hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom2);
+ ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n");
+ ok(atom1 == atom2,"atoms do not match\n");
+ hr = ITfCategoryMgr_GetGUID(g_cm,atom2,NULL);
+ ok(hr==E_INVALIDARG,"ITfCategoryMgr_GetGUID should have failed\n");
+ hr = ITfCategoryMgr_GetGUID(g_cm,atom2,&g1);
+ ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n");
+ ok(IsEqualGUID(&g1,>est),"guids do not match\n");
+ hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,NULL);
+ ok(hr==E_INVALIDARG,"ITfCategoryMgr_IsEqualTfGuidAtom should have failed\n");
+ hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,&equal);
+ ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n");
+ ok(equal == TRUE,"Equal value invalid\n");
+
+ /* show that cid and tid TfClientIds are also TfGuidAtoms */
+ hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,tid,&CLSID_FakeService,&equal);
+ ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n");
+ todo_wine ok(equal == TRUE,"Equal value invalid\n");
+ hr = ITfCategoryMgr_GetGUID(g_cm,cid,&g1);
+ ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n");
+ todo_wine ok(!IsEqualGUID(&g1,&GUID_NULL),"guid should not be NULL\n");
+}
+
START_TEST(inputprocessor)
{
if (SUCCEEDED(initialize()))
@@ -620,6 +659,7 @@ START_TEST(inputprocessor)
test_ThreadMgrAdviseSinks();
test_Activate();
test_startSession();
+ test_TfGuidAtom();
test_KeystrokeMgr();
test_endSession();
test_EnumLanguageProfiles();
More information about the wine-cvs
mailing list