Module: wine Branch: master Commit: 3bc1bdaee79aaaf76d1ac9da217f03cfbb3b3f17 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3bc1bdaee79aaaf76d1ac9da21...
Author: Nikolay Sivov nsivov@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);