resubmit: mlang
Aric Stewart
aric at codeweavers.com
Mon Sep 26 12:13:14 CDT 2005
Resubmitted with advice from Dmitry and Huw about using
TranslateCharsetInfo.
Implement a basic beginning for
fnIMLangFontLink_CodePageToCodePages,
fnIMLangFontLink_CodePagesToCodePage and fnIMLangFontLink_GetFontCodePages.
Also some tests for the new functions.
-------------- next part --------------
Index: dlls/mlang/mlang.c
===================================================================
RCS file: /home/wine/wine/dlls/mlang/mlang.c,v
retrieving revision 1.23
diff -u -r1.23 mlang.c
--- dlls/mlang/mlang.c 7 Sep 2005 11:31:18 -0000 1.23
+++ dlls/mlang/mlang.c 26 Sep 2005 17:07:29 -0000
@@ -1254,8 +1254,24 @@
UINT uCodePage,
DWORD* pdwCodePages)
{
- FIXME("\n");
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
+ CHARSETINFO cs;
+ BOOL rc;
+
+ TRACE("(%p) Seeking %u\n",This, uCodePage);
+ memset(&cs, 0, sizeof(cs));
+
+ rc = TranslateCharsetInfo((DWORD*)uCodePage, &cs, TCI_SRCCODEPAGE);
+
+ if (rc)
+ {
+ *pdwCodePages = cs.fs.fsCsb[0];
+ TRACE("resulting CodePages 0x%lx\n",*pdwCodePages);
+ }
+ else
+ TRACE("CodePage Not Found\n");
+
+ return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_CodePagesToCodePage(
@@ -1264,8 +1280,49 @@
UINT uDefaultCodePage,
UINT* puCodePage)
{
- FIXME("\n");
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
+ DWORD mask = 0x00000000;
+ UINT i;
+ CHARSETINFO cs;
+ BOOL rc;
+
+ TRACE("(%p) scanning 0x%lx default page %u\n",This, dwCodePages,
+ uDefaultCodePage);
+
+ *puCodePage = 0x00000000;
+
+ rc = TranslateCharsetInfo((DWORD*)uDefaultCodePage, &cs, TCI_SRCCODEPAGE);
+
+ if (rc && (dwCodePages & cs.fs.fsCsb[0]))
+ {
+ TRACE("Found Default Codepage\n");
+ *puCodePage = uDefaultCodePage;
+ return S_OK;
+ }
+
+
+ for (i = 0; i < 32; i++)
+ {
+
+ mask = 1 << i;
+ if (dwCodePages & mask)
+ {
+ DWORD Csb[2];
+ Csb[0] = mask;
+ Csb[1] = 0x0;
+ rc = TranslateCharsetInfo((DWORD*)Csb, &cs, TCI_SRCFONTSIG);
+ if (!rc)
+ continue;
+
+ TRACE("Falling back to least significant found CodePage %u\n",
+ cs.ciACP);
+ *puCodePage = cs.ciACP;
+ return S_OK;
+ }
+ }
+
+ TRACE("no codepage found\n");
+ return E_FAIL;
}
static HRESULT WINAPI fnIMLangFontLink_GetFontCodePages(
@@ -1274,8 +1331,20 @@
HFONT hFont,
DWORD* pdwCodePages)
{
- FIXME("\n");
- return E_NOTIMPL;
+ HFONT old_font;
+ FONTSIGNATURE fontsig;
+ ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
+
+ TRACE("(%p)\n",This);
+
+ old_font = SelectObject(hDC,hFont);
+ GetTextCharsetInfo(hDC,&fontsig, 0);
+ SelectObject(hDC,old_font);
+
+ *pdwCodePages = fontsig.fsCsb[0];
+ TRACE("CodePages is 0x%lx\n",fontsig.fsCsb[0]);
+
+ return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_MapFont(
Index: dlls/mlang/tests/mlang.c
===================================================================
RCS file: /home/wine/wine/dlls/mlang/tests/mlang.c,v
retrieving revision 1.9
diff -u -r1.9 mlang.c
--- dlls/mlang/tests/mlang.c 7 Sep 2005 11:31:18 -0000 1.9
+++ dlls/mlang/tests/mlang.c 26 Sep 2005 17:07:30 -0000
@@ -606,9 +606,45 @@
IEnumScript_Release(iEnumScript);
}
+void IMLangFontLink_Test(IMLangFontLink* iMLFL)
+{
+ DWORD dwCodePages = 0;
+ DWORD dwManyCodePages = 0;
+ UINT CodePage = 0;
+
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 932, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ ok (dwCodePages != 0, "No CodePages returned\n");
+ ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwCodePages, 1035,
+ &CodePage)==S_OK,
+ "IMLangFontLink_CodePagesToCodePage failed\n");
+ ok(CodePage == 932, "Incorrect CodePage Returned (%i)\n",CodePage);
+
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 1252, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ dwManyCodePages = dwManyCodePages | dwCodePages;
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 1256, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ dwManyCodePages = dwManyCodePages | dwCodePages;
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 874, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ dwManyCodePages = dwManyCodePages | dwCodePages;
+
+ ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 1256,
+ &CodePage)==S_OK,
+ "IMLangFontLink_CodePagesToCodePage failed\n");
+ ok(CodePage == 1256, "Incorrect CodePage Returned (%i)\n",CodePage);
+
+ ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 936,
+ &CodePage)==S_OK,
+ "IMLangFontLink_CodePagesToCodePage failed\n");
+ ok(CodePage == 1252, "Incorrect CodePage Returned (%i)\n",CodePage);
+}
+
START_TEST(mlang)
{
IMultiLanguage2 *iML2 = NULL;
+ IMLangFontLink *iMLFL = NULL;
HRESULT ret;
pGetCPInfoExA = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetCPInfoExA");
@@ -644,5 +680,14 @@
IMultiLanguage2_Release(iML2);
+ ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IMLangFontLink, (void **)&iMLFL);
+
+ trace("ret = %08lx, IMLangFontLink iMLFL = %p\n", ret, iMLFL);
+ if (ret != S_OK || !iML2) return;
+
+ IMLangFontLink_Test(iMLFL);
+ IMLangFontLink_Release(iMLFL);
+
CoUninitialize();
}
More information about the wine-patches
mailing list