[PATCH 1/4] Some encoding switching tests

Nikolay Sivov nsivov at codeweavers.com
Thu Oct 28 16:00:44 CDT 2010


---
 dlls/msxml3/saxreader.c       |   21 ++++++----
 dlls/msxml3/tests/saxreader.c |   83 ++++++++++++++++++++++++++++++++++++++---
 dlls/msxml6/regsvr.c          |    8 ++++
 3 files changed, 97 insertions(+), 15 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 5f04227..3a2e534 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -1241,16 +1241,19 @@ static void libxmlSetDocumentLocator(
         xmlSAXLocatorPtr loc)
 {
     saxlocator *This = ctx;
-    HRESULT hr;
+    HRESULT hr = S_OK;
 
-    if(This->vbInterface)
-        hr = IVBSAXContentHandler_putref_documentLocator(
-                This->saxreader->vbcontentHandler,
-                (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
-    else
-        hr = ISAXContentHandler_putDocumentLocator(
-                This->saxreader->contentHandler,
-                (ISAXLocator*)&This->lpSAXLocatorVtbl);
+    if(has_content_handler(This))
+    {
+        if(This->vbInterface)
+            hr = IVBSAXContentHandler_putref_documentLocator(
+                    This->saxreader->vbcontentHandler,
+                    (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
+        else
+            hr = ISAXContentHandler_putDocumentLocator(
+                    This->saxreader->contentHandler,
+                    (ISAXLocator*)&This->lpSAXLocatorVtbl);
+    }
 
     if(FAILED(hr))
         format_error_message_from_id(This, hr);
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index a932bf9..370f4b3 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -29,6 +29,8 @@
 
 #include "wine/test.h"
 
+#include "initguid.h"
+
 typedef enum _CH {
     CH_ENDTEST,
     CH_PUTDOCUMENTLOCATOR,
@@ -44,6 +46,8 @@ typedef enum _CH {
     CH_SKIPPEDENTITY
 } CH;
 
+DEFINE_GUID(CLSID_SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+
 static const WCHAR szSimpleXML[] = {
 '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','\"','1','.','0','\"',' ','?','>','\n',
 '<','B','a','n','k','A','c','c','o','u','n','t','>','\n',
@@ -478,12 +482,7 @@ static void test_saxreader(void)
 
     hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER,
             &IID_ISAXXMLReader, (LPVOID*)&reader);
-
-    if(FAILED(hr))
-    {
-        skip("Failed to create SAXXMLReader instance\n");
-        return;
-    }
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
     hr = ISAXXMLReader_getContentHandler(reader, NULL);
     ok(hr == E_POINTER, "Expected E_POINTER, got %08x\n", hr);
@@ -598,14 +597,86 @@ static void test_saxreader(void)
     SysFreeString(bstrData);
 }
 
+/* UTF-8 data with UTF-8 BOM and UTF-16 in prolog */
+static const CHAR UTF8BOMTest[] =
+"\xEF\xBB\xBF<?xml version = \"1.0\" encoding = \"UTF-16\"?>\n"
+"<a></a>\n";
+
+struct enc_test_entry_t {
+    const GUID *guid;
+    const char *clsid;
+    const char *data;
+    HRESULT hr;
+    int todo;
+};
+
+static const struct enc_test_entry_t encoding_test_data[] = {
+    { &CLSID_SAXXMLReader,   "CLSID_SAXXMLReader",   UTF8BOMTest, 0xc00ce56f, 1 },
+    { &CLSID_SAXXMLReader30, "CLSID_SAXXMLReader30", UTF8BOMTest, 0xc00ce56f, 1 },
+    { &CLSID_SAXXMLReader40, "CLSID_SAXXMLReader40", UTF8BOMTest, S_OK, 0 },
+    { &CLSID_SAXXMLReader60, "CLSID_SAXXMLReader60", UTF8BOMTest, S_OK, 0 },
+    { 0 }
+};
+
+static void test_encoding(void)
+{
+    const struct enc_test_entry_t *entry = encoding_test_data;
+    static const WCHAR testXmlW[] = {'t','e','s','t','.','x','m','l',0};
+    static const CHAR testXmlA[] = "test.xml";
+    ISAXXMLReader *reader;
+    DWORD written;
+    HANDLE file;
+    HRESULT hr;
+
+    while (entry->guid)
+    {
+        hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void**)&reader);
+        if (hr != S_OK)
+        {
+            win_skip("can't create %s instance\n", entry->clsid);
+            entry++;
+            continue;
+        }
+
+        file = CreateFileA(testXmlA, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+        ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError());
+        WriteFile(file, UTF8BOMTest, sizeof(UTF8BOMTest)-1, &written, NULL);
+        CloseHandle(file);
+
+        hr = ISAXXMLReader_parseURL(reader, testXmlW);
+        if (entry->todo)
+            todo_wine ok(hr == entry->hr, "Expected 0x%08x, got 0x%08x. CLSID %s\n", entry->hr, hr, entry->clsid);
+        else
+            ok(hr == entry->hr, "Expected 0x%08x, got 0x%08x. CLSID %s\n", entry->hr, hr, entry->clsid);
+
+        DeleteFileA(testXmlA);
+        ISAXXMLReader_Release(reader);
+
+        entry++;
+    }
+}
+
 START_TEST(saxreader)
 {
+    ISAXXMLReader *reader;
     HRESULT hr;
 
     hr = CoInitialize(NULL);
     ok(hr == S_OK, "failed to init com\n");
 
+    hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER,
+            &IID_ISAXXMLReader, (void**)&reader);
+
+    if(FAILED(hr))
+    {
+        skip("Failed to create SAXXMLReader instance\n");
+        CoUninitialize();
+        return;
+    }
+    ISAXXMLReader_Release(reader);
+
     test_saxreader();
+    test_encoding();
 
     CoUninitialize();
 }
diff --git a/dlls/msxml6/regsvr.c b/dlls/msxml6/regsvr.c
index 70a6fc4..dab7272 100644
--- a/dlls/msxml6/regsvr.c
+++ b/dlls/msxml6/regsvr.c
@@ -370,6 +370,14 @@ static struct regsvr_coclass const coclass_list[] = {
     "Msxml2.MXXMLWriter",
     "6.0"
     },
+    {   &CLSID_SAXXMLReader60,
+        "SAX XML Reader 6.0",
+        NULL,
+        "msxml6.dll",
+        "Both",
+        "Msxml2.SAXXMLReader.6.0",
+        "6.0"
+    },
     {   &CLSID_SAXAttributes60,
     "SAX Attribute 6.0",
     NULL,
-- 
1.5.6.5



--------------060208000903040306010603--



More information about the wine-patches mailing list