Implement IMultiLanguage2_GetCharsetInfo, add a test case for it

Dmitry Timoshkov dmitry at baikal.ru
Sun Aug 15 06:11:00 CDT 2004


Hello,

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Implement IMultiLanguage2_GetCharsetInfo, add a test case for it.

diff -u cvs/hq/wine/dlls/mlang/mlang.c wine/dlls/mlang/mlang.c
--- cvs/hq/wine/dlls/mlang/mlang.c	2004-08-15 17:11:10.000000000 +0900
+++ wine/dlls/mlang/mlang.c	2004-08-15 20:03:55.000000000 +0900
@@ -148,9 +148,11 @@ static const MIME_CP_INFO cyrillic_cp[] 
            MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 |
            MIMECONTF_MIME_LATEST,
       "cp866", "cp866", "cp866" },
+#if 0 /* Windows has 20866 as an official code page for KOI8-R */
     { 878, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
            MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
       "koi8-r", "koi8-r", "koi8-r" },
+#endif
     { 1251, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
             MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
             MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
@@ -827,6 +829,8 @@ static  HRESULT WINAPI fnIEnumCodePage_N
         PMIMECPINFO rgelt,
         ULONG* pceltFetched)
 {
+    ULONG i;
+
     ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface);
     TRACE("%p %lu %p %p\n", This, celt, rgelt, pceltFetched);
 
@@ -844,6 +848,19 @@ static  HRESULT WINAPI fnIEnumCodePage_N
     *pceltFetched = celt;
     This->pos += celt;
 
+    for (i = 0; i < celt; i++)
+    {
+        TRACE("#%lu: %08lx %u %u %s %s %s %s %s %s %d\n",
+              i, rgelt[i].dwFlags, rgelt[i].uiCodePage,
+              rgelt[i].uiFamilyCodePage,
+              wine_dbgstr_w(rgelt[i].wszDescription),
+              wine_dbgstr_w(rgelt[i].wszWebCharset),
+              wine_dbgstr_w(rgelt[i].wszHeaderCharset),
+              wine_dbgstr_w(rgelt[i].wszBodyCharset),
+              wine_dbgstr_w(rgelt[i].wszFixedWidthFont),
+              wine_dbgstr_w(rgelt[i].wszProportionalFont),
+              rgelt[i].bGDICharset);
+    }
     return S_OK;
 }
 
@@ -1465,6 +1482,17 @@ static void fill_cp_info(const struct ml
     /* FIXME */
     GetObjectW(GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
     strcpyW(mime_cp_info->wszProportionalFont, lf.lfFaceName);
+
+    TRACE("%08lx %u %u %s %s %s %s %s %s %d\n",
+          mime_cp_info->dwFlags, mime_cp_info->uiCodePage,
+          mime_cp_info->uiFamilyCodePage,
+          wine_dbgstr_w(mime_cp_info->wszDescription),
+          wine_dbgstr_w(mime_cp_info->wszWebCharset),
+          wine_dbgstr_w(mime_cp_info->wszHeaderCharset),
+          wine_dbgstr_w(mime_cp_info->wszBodyCharset),
+          wine_dbgstr_w(mime_cp_info->wszFixedWidthFont),
+          wine_dbgstr_w(mime_cp_info->wszProportionalFont),
+          mime_cp_info->bGDICharset);
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetCodePageInfo(
@@ -1518,9 +1546,53 @@ static HRESULT WINAPI fnIMultiLanguage2_
     BSTR Charset,
     PMIMECSETINFO pCharsetInfo)
 {
+    UINT i, n;
+
     ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
-    FIXME("%p %s %p\n", This, debugstr_w(Charset), pCharsetInfo);
-    return E_NOTIMPL;
+    TRACE("%p %s %p\n", This, debugstr_w(Charset), pCharsetInfo);
+
+    if (!pCharsetInfo) return E_FAIL;
+
+    for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+    {
+        for (n = 0; n < mlang_data[i].number_of_cp; n++)
+        {
+            WCHAR csetW[MAX_MIMECSET_NAME];
+
+            MultiByteToWideChar(CP_ACP, 0, mlang_data[i].mime_cp_info[n].web_charset, -1, csetW, MAX_MIMECSET_NAME);
+            if (!lstrcmpiW(Charset, csetW))
+            {
+                pCharsetInfo->uiCodePage = mlang_data[i].family_codepage;
+                pCharsetInfo->uiInternetEncoding = mlang_data[i].mime_cp_info[n].cp;
+                strcpyW(pCharsetInfo->wszCharset, csetW);
+                return S_OK;
+            }
+        }
+    }
+
+    /* FIXME:
+     * Since we do not support charsets like iso-2022-jp and do not have
+     * them in our database as a primary (web_charset) encoding this loop
+     * does an attempt to 'approximate' charset name by header_charset.
+     */
+    for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+    {
+        for (n = 0; n < mlang_data[i].number_of_cp; n++)
+        {
+            WCHAR csetW[MAX_MIMECSET_NAME];
+
+            MultiByteToWideChar(CP_ACP, 0, mlang_data[i].mime_cp_info[n].header_charset, -1, csetW, MAX_MIMECSET_NAME);
+            if (!lstrcmpiW(Charset, csetW))
+            {
+                pCharsetInfo->uiCodePage = mlang_data[i].family_codepage;
+                pCharsetInfo->uiInternetEncoding = mlang_data[i].mime_cp_info[n].cp;
+                strcpyW(pCharsetInfo->wszCharset, csetW);
+                return S_OK;
+            }
+        }
+    }
+
+    return E_FAIL;
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_IsConvertible(
diff -u cvs/hq/wine/dlls/mlang/tests/mlang.c wine/dlls/mlang/tests/mlang.c
--- cvs/hq/wine/dlls/mlang/tests/mlang.c	2004-08-15 17:11:10.000000000 +0900
+++ wine/dlls/mlang/tests/mlang.c	2004-08-15 20:01:46.000000000 +0900
@@ -310,6 +310,9 @@ static void test_EnumCodePages(IMultiLan
     {
 	CPINFOEXA cpinfoex;
 	CHARSETINFO csi;
+	MIMECSETINFO mcsi;
+	static const WCHAR autoW[] = {'_','a','u','t','o',0};
+
 #ifdef DUMP_CP_INFO
 	trace("MIMECPINFO #%lu:\n"
 	      "dwFlags %08lx %s\n"
@@ -378,6 +381,78 @@ static void test_EnumCodePages(IMultiLan
 	else
 	    trace("IsValidCodePage failed for cp %u\n", cpinfo[i].uiCodePage);
 
+	ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszWebCharset, &mcsi);
+	/* _autoxxx charsets are a fake and GetCharsetInfo fails for them */
+	if (memcmp(cpinfo[i].wszWebCharset, autoW, 5 * sizeof(WCHAR)))
+	{
+	    ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08lx\n", ret);
+#ifdef DUMP_CP_INFO
+	    trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszWebCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset));
+#endif
+	    ok(!lstrcmpiW(cpinfo[i].wszWebCharset, mcsi.wszCharset),
+#ifdef DUMP_CP_INFO
+                "%s != %s\n",
+		wine_dbgstr_w(cpinfo[i].wszWebCharset), wine_dbgstr_w(mcsi.wszCharset));
+#else
+                "wszWebCharset mismatch");
+#endif
+
+#if 0 /* native mlang returns completely messed up encodings in some cases */
+	    ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage,
+		"%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage);
+	    ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage,
+		"%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage);
+#endif
+	}
+
+	ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszHeaderCharset, &mcsi);
+	/* _autoxxx charsets are a fake and GetCharsetInfo fails for them */
+	if (memcmp(cpinfo[i].wszHeaderCharset, autoW, 5 * sizeof(WCHAR)))
+	{
+	    ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08lx\n", ret);
+#ifdef DUMP_CP_INFO
+	    trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszHeaderCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset));
+#endif
+	    ok(!lstrcmpiW(cpinfo[i].wszHeaderCharset, mcsi.wszCharset),
+#ifdef DUMP_CP_INFO
+                "%s != %s\n",
+		wine_dbgstr_w(cpinfo[i].wszHeaderCharset), wine_dbgstr_w(mcsi.wszCharset));
+#else
+                "wszHeaderCharset mismatch");
+#endif
+
+#if 0 /* native mlang returns completely messed up encodings in some cases */
+	    ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage,
+		"%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage);
+	    ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage,
+		"%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage);
+#endif
+	}
+
+	ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszBodyCharset, &mcsi);
+	/* _autoxxx charsets are a fake and GetCharsetInfo fails for them */
+	if (memcmp(cpinfo[i].wszBodyCharset, autoW, 5 * sizeof(WCHAR)))
+	{
+	    ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08lx\n", ret);
+#ifdef DUMP_CP_INFO
+	    trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszBodyCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset));
+#endif
+	    ok(!lstrcmpiW(cpinfo[i].wszBodyCharset, mcsi.wszCharset),
+#ifdef DUMP_CP_INFO
+                "%s != %s\n",
+		wine_dbgstr_w(cpinfo[i].wszBodyCharset), wine_dbgstr_w(mcsi.wszCharset));
+#else
+                "wszBodyCharset mismatch");
+#endif
+
+#if 0 /* native mlang returns completely messed up encodings in some cases */
+	    ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage,
+		"%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage);
+	    ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage,
+		"%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage);
+#endif
+	}
+
 	trace("---\n");
     }
 






More information about the wine-patches mailing list