Module: wine Branch: master Commit: 5e08765fbb7bd578aa1adce11b59e8bf9433ac87 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e08765fbb7bd578aa1adce11b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Jun 23 00:38:12 2012 +0400
msxml3: Properly handle -1 as length of element qualified name in startElement().
---
dlls/msxml3/mxwriter.c | 5 +++- dlls/msxml3/tests/saxreader.c | 46 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 6 deletions(-)
diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index 0382690..0455dc4 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -536,7 +536,10 @@ static void close_element_starttag(const mxwriter *This) static void set_element_name(mxwriter *This, const WCHAR *name, int len) { SysFreeString(This->element); - This->element = name ? SysAllocStringLen(name, len) : NULL; + if (name) + This->element = len != -1 ? SysAllocStringLen(name, len) : SysAllocString(name); + else + This->element = NULL; }
static inline HRESULT flush_output_buffer(mxwriter *This) diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index e7e3172..267aea3 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -2822,6 +2822,7 @@ static void test_mxwriter_flush(void) HRESULT hr; char *buff; LONG ref; + int len;
hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IMXWriter, (void**)&writer); @@ -2919,9 +2920,10 @@ static void test_mxwriter_flush(void) EXPECT_HR(hr, S_OK); ok(pos2.QuadPart == 0, "expected stream beginning\n");
- buff = HeapAlloc(GetProcessHeap(), 0, 2048); - memset(buff, 'A', 2048); - hr = ISAXContentHandler_characters(content, _bstr_(buff), 2048); + len = 2048; + buff = HeapAlloc(GetProcessHeap(), 0, len); + memset(buff, 'A', len); + hr = ISAXContentHandler_characters(content, _bstr_(buff), len); EXPECT_HR(hr, S_OK);
pos.QuadPart = 0; @@ -2965,8 +2967,8 @@ todo_wine EXPECT_HR(hr, S_OK); ok(pos2.QuadPart == 0, "expected stream beginning\n");
- memset(buff, 'A', 2048); - hr = ISAXContentHandler_characters(content, _bstr_(buff), 2040); + memset(buff, 'A', len); + hr = ISAXContentHandler_characters(content, _bstr_(buff), len - 8); EXPECT_HR(hr, S_OK);
pos.QuadPart = 0; @@ -2978,6 +2980,28 @@ todo_wine hr = ISAXContentHandler_endDocument(content); EXPECT_HR(hr, S_OK);
+ /* test auto-flush function when stream is not set */ + 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, emptyW, 0, emptyW, 0, _bstr_("a"), -1, NULL); + EXPECT_HR(hr, S_OK); + + memset(buff, 'A', len); + hr = ISAXContentHandler_characters(content, _bstr_(buff), len); + EXPECT_HR(hr, S_OK); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_get_output(writer, &dest); + EXPECT_HR(hr, S_OK); + len += strlen("<a>"); + ok(SysStringLen(V_BSTR(&dest)) == len, "got len=%d, expected %d\n", SysStringLen(V_BSTR(&dest)), len); + VariantClear(&dest); + HeapFree(GetProcessHeap(), 0, buff); ISAXContentHandler_Release(content); IStream_Release(stream); @@ -3382,6 +3406,18 @@ static void test_mxwriter_startendelement(void) ok(!lstrcmpW(_bstr_("<abc></abd>"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest);
+ V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_put_output(writer, dest); + EXPECT_HR(hr, S_OK); + + hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), -1, 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_("<a>"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + ISAXContentHandler_Release(content); IMXWriter_Release(writer); free_bstrs();