[2/2] msxml3: Support disabled escaping mode when writing attribute values

Nikolay Sivov nsivov at codeweavers.com
Thu Apr 26 11:44:22 CDT 2012


Support disabled escaping mode when writing attribute values
-------------- next part --------------
>From 17d13ae19758ce6a3cf50cf889262da421981dbd Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu, 26 Apr 2012 20:40:53 +0400
Subject: [PATCH 2/2] 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);
-- 
1.5.6.5




More information about the wine-patches mailing list