Nikolay Sivov : msxml3: Support disabled escaping mode when writing attribute values.

Alexandre Julliard julliard at winehq.org
Thu Apr 26 13:58:36 CDT 2012


Module: wine
Branch: master
Commit: 3bc1bdaee79aaaf76d1ac9da217f03cfbb3b3f17
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3bc1bdaee79aaaf76d1ac9da217f03cfbb3b3f17

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Apr 26 20:40:53 2012 +0400

msxml3: Support disabled escaping mode when writing attribute values.

---

 dlls/msxml3/mxwriter.c        |   20 +++++++++++++-------
 dlls/msxml3/tests/saxreader.c |   35 +++++++++++++++++++++--------------
 2 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c
index c512d5c..07ff1ff 100644
--- a/dlls/msxml3/mxwriter.c
+++ b/dlls/msxml3/mxwriter.c
@@ -1019,19 +1019,20 @@ static HRESULT WINAPI SAXContentHandler_startElement(
 
     if (attr)
     {
+        int length, i, escape;
         HRESULT hr;
-        INT length;
-        INT i;
 
         hr = ISAXAttributes_getLength(attr, &length);
         if (FAILED(hr)) return hr;
 
+        escape = This->props[MXWriter_DisableEscaping] == VARIANT_FALSE ||
+            (This->class_version == MSXML4 || This->class_version == MSXML6);
+
         for (i = 0; i < length; i++)
         {
             static const WCHAR eqW[] = {'='};
             const WCHAR *str;
-            WCHAR *escaped;
-            INT len = 0;
+            int len = 0;
 
             hr = ISAXAttributes_getQName(attr, i, &str, &len);
             if (FAILED(hr)) return hr;
@@ -1046,9 +1047,14 @@ static HRESULT WINAPI SAXContentHandler_startElement(
             hr = ISAXAttributes_getValue(attr, i, &str, &len);
             if (FAILED(hr)) return hr;
 
-            escaped = get_escaped_string(str, EscapeValue, &len);
-            write_output_buffer_quoted(This->buffer, escaped, len);
-            heap_free(escaped);
+            if (escape)
+            {
+                WCHAR *escaped = get_escaped_string(str, EscapeValue, &len);
+                write_output_buffer_quoted(This->buffer, escaped, len);
+                heap_free(escaped);
+            }
+            else
+                write_output_buffer_quoted(This->buffer, str, len);
         }
     }
 
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 04a0648..ebb9d89 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -2832,9 +2832,10 @@ static void test_mxwriter_startenddocument(void)
 
 enum startendtype
 {
-    StartElement,
-    EndElement,
-    StartEndElement
+    StartElement    = 0x001,
+    EndElement      = 0x010,
+    StartEndElement = 0x011,
+    DisableEscaping = 0x100
 };
 
 struct writer_startendelement_t {
@@ -2850,6 +2851,7 @@ struct writer_startendelement_t {
 
 static const char startelement_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\">";
 static const char startendelement_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\"/>";
+static const char startendelement_noescape_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&\">\"/>";
 
 static const struct writer_startendelement_t writer_startendelement[] = {
     /* 0 */
@@ -2948,6 +2950,13 @@ static const struct writer_startendelement_t writer_startendelement[] = {
     { &CLSID_MXXMLWriter40, StartEndElement, "", "", "", "</>", S_OK },
     /* 75 */
     { &CLSID_MXXMLWriter60, StartEndElement, "", "", "", "</>", S_OK },
+
+    /* with disabled output escaping */
+    { &CLSID_MXXMLWriter,   StartEndElement | DisableEscaping, "uri", "local", "uri:local", startendelement_noescape_xml, S_OK, &saxattributes },
+    { &CLSID_MXXMLWriter30, StartEndElement | DisableEscaping, "uri", "local", "uri:local", startendelement_noescape_xml, S_OK, &saxattributes },
+    { &CLSID_MXXMLWriter40, StartEndElement | DisableEscaping, "uri", "local", "uri:local", startendelement_xml, S_OK, &saxattributes },
+    { &CLSID_MXXMLWriter60, StartEndElement | DisableEscaping, "uri", "local", "uri:local", startendelement_xml, S_OK, &saxattributes },
+
     { NULL }
 };
 
@@ -2998,23 +3007,21 @@ static void test_mxwriter_startendelement_batch(const struct writer_startendelem
         hr = ISAXContentHandler_startDocument(content);
         EXPECT_HR(hr, S_OK);
 
-        if (table->type == StartElement)
-        {
-            hr = ISAXContentHandler_startElement(content, _bstr_(table->uri), lstrlen(table->uri),
-                _bstr_(table->local_name), lstrlen(table->local_name), _bstr_(table->qname), lstrlen(table->qname), table->attr);
-            ok(hr == table->hr, "test %d: got 0x%08x, expected 0x%08x\n", i, hr, table->hr);
-        }
-        else if (table->type == EndElement)
+        if (table->type & DisableEscaping)
         {
-            hr = ISAXContentHandler_endElement(content, _bstr_(table->uri), lstrlen(table->uri),
-                _bstr_(table->local_name), lstrlen(table->local_name), _bstr_(table->qname), lstrlen(table->qname));
-            ok(hr == table->hr, "test %d: got 0x%08x, expected 0x%08x\n", i, hr, table->hr);
+            hr = IMXWriter_put_disableOutputEscaping(writer, VARIANT_TRUE);
+            EXPECT_HR(hr, S_OK);
         }
-        else
+
+        if (table->type & StartElement)
         {
             hr = ISAXContentHandler_startElement(content, _bstr_(table->uri), lstrlen(table->uri),
                 _bstr_(table->local_name), lstrlen(table->local_name), _bstr_(table->qname), lstrlen(table->qname), table->attr);
             ok(hr == table->hr, "test %d: got 0x%08x, expected 0x%08x\n", i, hr, table->hr);
+        }
+
+        if (table->type & EndElement)
+        {
             hr = ISAXContentHandler_endElement(content, _bstr_(table->uri), lstrlen(table->uri),
                 _bstr_(table->local_name), lstrlen(table->local_name), _bstr_(table->qname), lstrlen(table->qname));
             ok(hr == table->hr, "test %d: got 0x%08x, expected 0x%08x\n", i, hr, table->hr);




More information about the wine-cvs mailing list