Jactry Zeng : msxml3: Add GBK support for builtin character converter.

Alexandre Julliard julliard at winehq.org
Wed Dec 8 15:46:30 CST 2021


Module: wine
Branch: master
Commit: 2ec519dc64746b6b32589914254e372d88f5d7fa
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2ec519dc64746b6b32589914254e372d88f5d7fa

Author: Jactry Zeng <jzeng at codeweavers.com>
Date:   Tue Dec  7 08:39:28 2021 -0600

msxml3: Add GBK support for builtin character converter.

Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msxml3/main.c         | 11 +++++++
 dlls/msxml3/tests/domdoc.c | 80 +++++++++++++++++++++++++++++++++++-----------
 2 files changed, 73 insertions(+), 18 deletions(-)

diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c
index ba8d3b2e21b..2a97f2637f1 100644
--- a/dlls/msxml3/main.c
+++ b/dlls/msxml3/main.c
@@ -202,6 +202,16 @@ done:
     return len;
 }
 
+static int gbk_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
+{
+    return to_utf8(936, out, outlen, in, inlen);
+}
+
+static int utf8_to_gbk(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
+{
+    return from_utf8(936, out, outlen, in, inlen);
+}
+
 static int win1250_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
 {
     return to_utf8(1250, out, outlen, in, inlen);
@@ -300,6 +310,7 @@ static void init_char_encoders(void)
         xmlCharEncodingOutputFunc output;
     } encoder[] =
     {
+        { "gbk",          gbk_to_utf8,     utf8_to_gbk     },
         { "windows-1250", win1250_to_utf8, utf8_to_win1250 },
         { "windows-1251", win1251_to_utf8, utf8_to_win1251 },
         { "windows-1252", win1252_to_utf8, utf8_to_win1252 },
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 70e2da89a2f..e931c683fb8 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -781,6 +781,20 @@ static const char complete7[] = {
     "</root>"
 };
 
+#define DECL_GBK \
+"<?xml version=\"1.0\" encoding=\"gbk\"?>"
+
+static const char gbkxml[] =
+DECL_GBK
+"<open></open>";
+
+#define DECL_WIN_936 \
+"<?xml version=\"1.0\" encoding=\"Windows-936\"?>"
+
+static const char win936xml[] =
+DECL_WIN_936
+"<open></open>";
+
 #define DECL_WIN_1252 \
 "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
 
@@ -10506,7 +10520,10 @@ static void write_to_file(const char *name, const char *data)
     CloseHandle(hfile);
 }
 
-static void test_doc_load_from_path(IXMLDOMDocument *doc, const char *path)
+#define TEST_DOC_LOAD_FROM_PATH(doc,path,expected_hr, expected_ret) \
+    _test_doc_load_from_path(doc, path, expected_hr, expected_ret, __LINE__)
+static void _test_doc_load_from_path(IXMLDOMDocument *doc, const char *path,
+        HRESULT expected_hr, VARIANT_BOOL expected_ret, int line)
 {
     IXMLDOMDocument *doc2;
     IXMLDOMElement *elem;
@@ -10520,29 +10537,32 @@ static void test_doc_load_from_path(IXMLDOMDocument *doc, const char *path)
     V_VT(&src) = VT_BSTR;
     V_BSTR(&src) = url;
     hr = IXMLDOMDocument_load(doc, src, &b);
-    ok(hr == S_OK, "Failed to load document, %#x.\n", hr);
-    ok(b == VARIANT_TRUE, "got %d\n", b);
+    ok_(__FILE__, line)(hr == expected_hr, "Failed to load document, %#x.\n", hr);
+    ok_(__FILE__, line)(b == expected_ret, "got %d\n", b);
 
     V_VT(&src) = VT_BSTR | VT_BYREF;
     V_BSTRREF(&src) = &url;
     hr = IXMLDOMDocument_load(doc, src, &b);
-    ok(hr == S_OK, "Failed to load document, %#x.\n", hr);
-    ok(b == VARIANT_TRUE, "got %d\n", b);
+    ok_(__FILE__, line)(hr == expected_hr, "Failed to load document, %#x.\n", hr);
+    ok_(__FILE__, line)(b == expected_ret, "got %d\n", b);
+
+    if (expected_hr != S_OK)
+        return;
 
     url = NULL;
     hr = IXMLDOMDocument_get_url(doc, &url);
-    ok(hr == S_OK, "Failed to get document url, hr %#x.\n", hr);
+    ok_(__FILE__, line)(hr == S_OK, "Failed to get document url, hr %#x.\n", hr);
 
     hr = IXMLDOMDocument_get_documentElement(doc, &elem);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok_(__FILE__, line)(hr == S_OK, "got 0x%08x\n", hr);
 
     /* Create another instance for the same document, check url */
     hr = IXMLDOMElement_get_ownerDocument(elem, &doc2);
-    ok(hr == S_OK, "Failed to get owner document, hr %#x.\n", hr);
+    ok_(__FILE__, line)(hr == S_OK, "Failed to get owner document, hr %#x.\n", hr);
 
     hr = IXMLDOMDocument_get_url(doc2, &url2);
-    ok(hr == S_OK, "Failed to get document url, hr %#x.\n", hr);
-    ok(!lstrcmpW(url, url2), "Unexpected url %s.\n", wine_dbgstr_w(url2));
+    ok_(__FILE__, line)(hr == S_OK, "Failed to get document url, hr %#x.\n", hr);
+    ok_(__FILE__, line)(!lstrcmpW(url, url2), "Unexpected url %s.\n", wine_dbgstr_w(url2));
 
     IXMLDOMDocument_Release(doc2);
     IXMLDOMElement_Release(elem);
@@ -10574,6 +10594,18 @@ static void test_load(void)
     HRESULT hr;
     void* ptr;
     int n;
+    struct encoding_test
+    {
+        const char *xml;
+        HRESULT expected_hr;
+        VARIANT_BOOL expected_ret;
+    } encoding_tests[] =
+    {
+        { gbkxml,     S_OK,    VARIANT_TRUE  },
+        { win1252xml, S_OK,    VARIANT_TRUE  },
+        { win936xml,  S_FALSE, VARIANT_FALSE },
+    };
+
 
     GetTempPathA(MAX_PATH, path);
     strcat(path, "winetest.xml");
@@ -10593,23 +10625,23 @@ static void test_load(void)
     /* "file://" url */
     strcpy(path2, "file://");
     strcat(path2, path);
-    test_doc_load_from_path(doc, path2);
+    TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
 
     /* file:// url, forward slashes */
     url_forward_slash(path2);
-    test_doc_load_from_path(doc, path2);
+    TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
 
     /* "file:/" url */
     strcpy(path2, "file:/");
     strcat(path2, path);
-    test_doc_load_from_path(doc, path);
+    TEST_DOC_LOAD_FROM_PATH(doc, path, S_OK, VARIANT_TRUE);
 
     /* file:/ with forward slashes. */
     url_forward_slash(path2);
-    test_doc_load_from_path(doc, path2);
+    TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
 
     /* Regular local path. */
-    test_doc_load_from_path(doc, path);
+    TEST_DOC_LOAD_FROM_PATH(doc, path, S_OK, VARIANT_TRUE);
 
     /* load from a path: VT_BSTR|VT_BYREF, null ptr */
     V_VT(&src) = VT_BSTR | VT_BYREF;
@@ -10627,16 +10659,16 @@ static void test_load(void)
     strcpy(path2, path);
     n = strlen(path2);
     strcpy(&path2[n-1], "%6C");  /* C:\path\to\winetest.xm%6C */
-    test_doc_load_from_path(doc, path2);
+    TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
 
     /* Both spaces and %20s work. */
     GetTempPathA(MAX_PATH, path2);
     strcat(path2, "wine test.xml");
     write_to_file(path2, win1252xml);
-    test_doc_load_from_path(doc, path2);
+    TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
     GetTempPathA(MAX_PATH, path2);
     strcat(path2, "wine%20test.xml");
-    test_doc_load_from_path(doc, path2);
+    TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
     DeleteFileA(path2);
 
     DeleteFileA(path);
@@ -10771,6 +10803,18 @@ static void test_load(void)
 
     IXMLDOMDocument_Release(doc);
 
+    /* Encoding tests. */
+    for (n = 0; n < ARRAY_SIZE(encoding_tests); n++)
+    {
+        GetTempPathA(MAX_PATH, path);
+        strcat(path, "codepage_test.xml");
+        write_to_file(path, encoding_tests[n].xml);
+        doc = create_document(&IID_IXMLDOMDocument);
+        TEST_DOC_LOAD_FROM_PATH(doc, path, encoding_tests[n].expected_hr, encoding_tests[n].expected_ret);
+        DeleteFileA(path);
+        IXMLDOMDocument_Release(doc);
+    }
+
     free_bstrs();
 }
 




More information about the wine-cvs mailing list