Module: wine Branch: master Commit: 2a6abc248de97a7eebeb3014c42e6547817bac0e URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a6abc248de97a7eebeb3014c4...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Aug 27 17:35:13 2011 +0400
msxml3: Use element name length passed to content handler.
---
dlls/msxml3/mxwriter.c | 15 ++++++++------- dlls/msxml3/tests/saxreader.c | 29 +++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index bf2411e..b08fd0b 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -155,16 +155,16 @@ static void close_element_starttag(const mxwriter *This) xmlOutputBufferWriteString(This->buffer, ">"); }
-static void set_element_name(mxwriter *This, const WCHAR *name) +static void set_element_name(mxwriter *This, const WCHAR *name, int len) { SysFreeString(This->element); - This->element = SysAllocString(name); + This->element = name ? SysAllocStringLen(name, len) : NULL; }
static inline HRESULT flush_output_buffer(mxwriter *This) { close_element_starttag(This); - set_element_name(This, NULL); + set_element_name(This, NULL, 0); xmlOutputBufferFlush(This->buffer); return write_data_to_stream(This); } @@ -763,10 +763,11 @@ static HRESULT WINAPI mxwriter_saxcontent_startElement( return E_INVALIDARG;
close_element_starttag(This); - set_element_name(This, QName ? QName : emptyW); + set_element_name(This, QName ? QName : emptyW, + QName ? nQName : 0);
xmlOutputBufferWriteString(This->buffer, "<"); - s = xmlchar_from_wchar(QName); + s = xmlchar_from_wcharn(QName, nQName); xmlOutputBufferWriteString(This->buffer, (char*)s); heap_free(s);
@@ -843,7 +844,7 @@ static HRESULT WINAPI mxwriter_saxcontent_endElement( }
heap_free(s); - set_element_name(This, NULL); + set_element_name(This, NULL, 0);
return S_OK; } @@ -860,7 +861,7 @@ static HRESULT WINAPI mxwriter_saxcontent_characters( if (!chars) return E_INVALIDARG;
close_element_starttag(This); - set_element_name(This, NULL); + set_element_name(This, NULL, 0);
if (nchars) { diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 99a08c2..b5800d0 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -1720,27 +1720,44 @@ static void test_mxwriter_startendelement(void) VariantClear(&dest);
hr = ISAXContentHandler_endElement(content, NULL, 0, NULL, 0, _bstr_("a:b"), 3); - ok(hr == E_INVALIDARG, "got %08x\n", hr); + EXPECT_HR(hr, E_INVALIDARG);
hr = ISAXContentHandler_endElement(content, NULL, 0, _bstr_("b"), 1, _bstr_("a:b"), 3); - ok(hr == E_INVALIDARG, "got %08x\n", hr); + EXPECT_HR(hr, E_INVALIDARG);
/* only local name is an error too */ hr = ISAXContentHandler_endElement(content, NULL, 0, _bstr_("b"), 1, NULL, 0); - ok(hr == E_INVALIDARG, "got %08x\n", hr); + EXPECT_HR(hr, E_INVALIDARG);
hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("b"), 1); - ok(hr == S_OK, "got %08x\n", hr); + EXPECT_HR(hr, S_OK);
V_VT(&dest) = VT_EMPTY; hr = IMXWriter_get_output(writer, &dest); - ok(hr == S_OK, "got %08x\n", hr); + EXPECT_HR(hr, S_OK); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); ok(!lstrcmpW(_bstr_("<><b></b>"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest);
hr = ISAXContentHandler_endDocument(content); - ok(hr == S_OK, "got %08x\n", hr); + EXPECT_HR(hr, S_OK); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_put_output(writer, dest); + EXPECT_HR(hr, S_OK); + + hr = ISAXContentHandler_startDocument(content); + EXPECT_HR(hr, S_OK); + + hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("abcdef"), 3, NULL); + EXPECT_HR(hr, S_OK); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_get_output(writer, &dest); + EXPECT_HR(hr, S_OK); + ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); + ok(!lstrcmpW(_bstr_("<abc>"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + VariantClear(&dest);
ISAXContentHandler_Release(content); IMXWriter_Release(writer);