[PATCH v2 0/7] MR10157: msxml3/writer: Return success from putDocumentLocator().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- v2: msxml3/writer: Fix newline handling in the writer. https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/mxwriter.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index 29b286356ec..ad6419d0a75 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -1174,13 +1174,11 @@ static ULONG WINAPI SAXContentHandler_Release(ISAXContentHandler *iface) return IMXWriter_Release(&This->IMXWriter_iface); } -static HRESULT WINAPI SAXContentHandler_putDocumentLocator( - ISAXContentHandler *iface, - ISAXLocator *locator) +static HRESULT WINAPI SAXContentHandler_putDocumentLocator(ISAXContentHandler *iface, ISAXLocator *locator) { - mxwriter *This = impl_from_ISAXContentHandler( iface ); - FIXME("(%p)->(%p)\n", This, locator); - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, locator); + + return S_OK; } static HRESULT WINAPI SAXContentHandler_startDocument(ISAXContentHandler *iface) @@ -2085,8 +2083,8 @@ static HRESULT WINAPI VBSAXContentHandler_Invoke(IVBSAXContentHandler *iface, DI static HRESULT WINAPI VBSAXContentHandler_putref_documentLocator(IVBSAXContentHandler *iface, IVBSAXLocator *locator) { - mxwriter *This = impl_from_IVBSAXContentHandler( iface ); - TRACE("(%p)->(%p)\n", This, locator); + TRACE("%p, %p.\n", iface, locator); + return S_OK; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/saxreader.c | 81 ++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 24286c915f9..036e4d707d6 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -4384,14 +4384,15 @@ static void test_mxwriter_startendelement(void) struct writer_characters_t { const GUID *clsid; - const char *data; - const char *output; + const WCHAR *data; + const WCHAR *output; }; -static const struct writer_characters_t writer_characters[] = { - { &CLSID_MXXMLWriter, "< > & \" \'", "< > & \" \'" }, - { &CLSID_MXXMLWriter30, "< > & \" \'", "< > & \" \'" }, - { &CLSID_MXXMLWriter40, "< > & \" \'", "< > & \" \'" }, +static const struct writer_characters_t writer_characters[] = +{ + { &CLSID_MXXMLWriter, L"< > & \" \'", L"< > & \" \'" }, + { &CLSID_MXXMLWriter30, L"< > & \" \'", L"< > & \" \'" }, + { &CLSID_MXXMLWriter40, L"< > & \" \'", L"< > & \" \'" }, { NULL } }; @@ -4542,14 +4543,50 @@ static void test_mxwriter_characters(void) IVBSAXContentHandler_Release(vb_content); IMXWriter_Release(writer); - /* batch tests */ + /* Newlines in consecutive calls */ + hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IMXWriter, (void **)&writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void **)&content); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMXWriter_put_omitXMLDeclaration(writer, VARIANT_TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXContentHandler_characters(content, L"ab\r", 3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXContentHandler_characters(content, L"\ncd", 3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_get_output(writer, &dest); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&dest) == VT_BSTR, "Unexpected type %d.\n", V_VT(&dest)); + todo_wine + ok(!lstrcmpW(L"ab\r\n\r\ncd", V_BSTR(&dest)), "Unexpected content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + VariantClear(&dest); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_put_output(writer, dest); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXContentHandler_characters(content, L"\nab\rc\r\n", 7); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_get_output(writer, &dest); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&dest) == VT_BSTR, "Unexpected type %d.\n", V_VT(&dest)); + todo_wine + ok(!lstrcmpW(L"\r\nab\r\nc\r\n", V_BSTR(&dest)), "Unexpected content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + VariantClear(&dest); + + ISAXContentHandler_Release(content); + IMXWriter_Release(writer); + while (table->clsid) { - ISAXContentHandler *content; - IMXWriter *writer; - VARIANT dest; - HRESULT hr; - if (!is_clsid_supported(table->clsid, mxwriter_support_data)) { table++; @@ -4570,7 +4607,7 @@ static void test_mxwriter_characters(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_characters(content, _bstr_(table->data), strlen(table->data)); + hr = ISAXContentHandler_characters(content, table->data, lstrlenW(table->data)); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* test output */ @@ -4580,8 +4617,8 @@ static void test_mxwriter_characters(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->output), V_BSTR(&dest)), - "test %d: got wrong content %s, expected \"%s\"\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->output); + ok(!lstrcmpW(table->output, V_BSTR(&dest)), + "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); } @@ -4593,7 +4630,7 @@ static void test_mxwriter_characters(void) hr = IMXWriter_put_disableOutputEscaping(writer, VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_characters(content, _bstr_(table->data), strlen(table->data)); + hr = ISAXContentHandler_characters(content, table->data, lstrlenW(table->data)); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* test output */ @@ -4603,8 +4640,8 @@ static void test_mxwriter_characters(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->data), V_BSTR(&dest)), - "test %d: got wrong content %s, expected \"%s\"\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->data); + ok(!lstrcmpW(table->data, V_BSTR(&dest)), + "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->data)); VariantClear(&dest); } @@ -5202,7 +5239,10 @@ static void test_mxwriter_cdata(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* all these are escaped for text nodes */ - hr = ISAXContentHandler_characters(content, _bstr_("< > & \""), 7); + hr = ISAXContentHandler_characters(content, L"< > & \"", 7); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXContentHandler_characters(content, L"\na\rb\r\n", 6); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXLexicalHandler_endCDATA(lexical); @@ -5212,7 +5252,8 @@ static void test_mxwriter_cdata(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(L"<![CDATA[<![CDATA[< > & \"]]>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + todo_wine + ok(!lstrcmpW(L"<![CDATA[<![CDATA[< > & \"\r\na\r\nb\r\n]]>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); ISAXContentHandler_Release(content); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/saxreader.c | 348 +++++++++++++++++----------------- 1 file changed, 170 insertions(+), 178 deletions(-) diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 036e4d707d6..df323652fa3 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -1409,7 +1409,7 @@ static HRESULT WINAPI contentHandler_startElement( attr = calloc(len, sizeof(*attr)); v = VARIANT_TRUE; - hr = ISAXXMLReader_getFeature(g_reader, _bstr_("http://xml.org/sax/features/namespaces"), &v); + hr = ISAXXMLReader_getFeature(g_reader, L"http://xml.org/sax/features/namespaces", &v); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); for (i = 0; i < len; i++) @@ -2585,7 +2585,7 @@ static void test_saxreader(void) ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "xml:space handling", FALSE); /* switch off 'namespaces' feature */ - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespaces"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespaces", VARIANT_FALSE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); stream = create_test_stream(test_attributes, -1); @@ -2604,11 +2604,11 @@ static void test_saxreader(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "content test attributes", TRUE); IStream_Release(stream); - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespaces"), VARIANT_TRUE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespaces", VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* switch off 'namespace-prefixes' feature */ - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespace-prefixes"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespace-prefixes", VARIANT_FALSE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); stream = create_test_stream(test_attributes, -1); @@ -2628,7 +2628,7 @@ static void test_saxreader(void) ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "content test attributes", FALSE); IStream_Release(stream); - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespace-prefixes"), VARIANT_TRUE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespace-prefixes", VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* attribute normalization */ @@ -2662,7 +2662,7 @@ static void test_saxreader(void) V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)&lexicalhandler.ISAXLexicalHandler_iface; - hr = ISAXXMLReader_putProperty(reader, _bstr_("http://xml.org/sax/properties/lexical-handler"), var); + hr = ISAXXMLReader_putProperty(reader, L"http://xml.org/sax/properties/lexical-handler", var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); stream = create_test_stream(test_cdata_xml, -1); @@ -3043,21 +3043,22 @@ static const struct feature_ns_entry_t feature_ns_entry_data[] = { { 0 } }; -static const char *feature_names[] = { - "http://xml.org/sax/features/namespaces", - "http://xml.org/sax/features/namespace-prefixes", - 0 -}; - static void test_saxreader_features(void) { + static const WCHAR *feature_names[] = + { + L"http://xml.org/sax/features/namespaces", + L"http://xml.org/sax/features/namespace-prefixes", + NULL + }; + const struct feature_ns_entry_t *entry = feature_ns_entry_data; ISAXXMLReader *reader; while (entry->guid) { VARIANT_BOOL value; - const char **name; + const WCHAR **name; HRESULT hr; hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void**)&reader); @@ -3071,28 +3072,28 @@ static void test_saxreader_features(void) if (IsEqualGUID(entry->guid, &CLSID_SAXXMLReader40)) { value = VARIANT_TRUE; - hr = ISAXXMLReader_getFeature(reader, _bstr_("exhaustive-errors"), &value); + hr = ISAXXMLReader_getFeature(reader, L"exhaustive-errors", &value); ok(hr == S_OK, "Failed to get feature value, hr %#lx.\n", hr); ok(value == VARIANT_FALSE, "Unexpected default feature value.\n"); - hr = ISAXXMLReader_putFeature(reader, _bstr_("exhaustive-errors"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"exhaustive-errors", VARIANT_FALSE); ok(hr == S_OK, "Failed to put feature value, hr %#lx.\n", hr); value = VARIANT_TRUE; - hr = ISAXXMLReader_getFeature(reader, _bstr_("schema-validation"), &value); + hr = ISAXXMLReader_getFeature(reader, L"schema-validation", &value); ok(hr == S_OK, "Failed to get feature value, hr %#lx.\n", hr); ok(value == VARIANT_FALSE, "Unexpected default feature value.\n"); - hr = ISAXXMLReader_putFeature(reader, _bstr_("exhaustive-errors"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"exhaustive-errors", VARIANT_FALSE); ok(hr == S_OK, "Failed to put feature value, hr %#lx.\n", hr); } else { value = 123; - hr = ISAXXMLReader_getFeature(reader, _bstr_("exhaustive-errors"), &value); + hr = ISAXXMLReader_getFeature(reader, L"exhaustive-errors", &value); ok(hr == E_INVALIDARG, "Failed to get feature value, hr %#lx.\n", hr); ok(value == 123, "Unexpected value %d.\n", value); value = 123; - hr = ISAXXMLReader_getFeature(reader, _bstr_("schema-validation"), &value); + hr = ISAXXMLReader_getFeature(reader, L"schema-validation", &value); ok(hr == E_INVALIDARG, "Failed to get feature value, hr %#lx.\n", hr); ok(value == 123, "Unexpected value %d.\n", value); } @@ -3101,30 +3102,30 @@ static void test_saxreader_features(void) while (*name) { value = 0xc; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(entry->value == value, "%s: got wrong default value %x, expected %x\n", entry->clsid, value, entry->value); value = 0xc; - hr = ISAXXMLReader_putFeature(reader, _bstr_(*name), value); + hr = ISAXXMLReader_putFeature(reader, *name, value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); value = 0xd; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(entry->value2 == value, "%s: got wrong value %x, expected %x\n", entry->clsid, value, entry->value2); - hr = ISAXXMLReader_putFeature(reader, _bstr_(*name), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, *name, VARIANT_FALSE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); value = 0xd; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(value == VARIANT_FALSE, "%s: got wrong value %x, expected VARIANT_FALSE\n", entry->clsid, value); - hr = ISAXXMLReader_putFeature(reader, _bstr_(*name), VARIANT_TRUE); + hr = ISAXXMLReader_putFeature(reader, *name, VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); value = 0xd; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(value == VARIANT_TRUE, "%s: got wrong value %x, expected VARIANT_TRUE\n", entry->clsid, value); @@ -3404,14 +3405,14 @@ struct mxwriter_props_t VARIANT_BOOL indent; VARIANT_BOOL omitdecl; VARIANT_BOOL standalone; - const char *encoding; + const WCHAR *encoding; }; static const struct mxwriter_props_t mxwriter_default_props[] = { - { &CLSID_MXXMLWriter, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, "UTF-16" }, - { &CLSID_MXXMLWriter30, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, "UTF-16" }, - { &CLSID_MXXMLWriter40, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, "UTF-16" }, + { &CLSID_MXXMLWriter, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, L"UTF-16" }, + { &CLSID_MXXMLWriter30, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, L"UTF-16" }, + { &CLSID_MXXMLWriter40, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, L"UTF-16" }, { NULL } }; @@ -3465,8 +3466,8 @@ static void test_mxwriter_default_properties(const struct mxwriter_props_t *tabl hr = IMXWriter_get_encoding(writer, &encoding); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!lstrcmpW(encoding, _bstr_(table->encoding)), "test %d: got encoding %s, expected %s\n", - i, wine_dbgstr_w(encoding), table->encoding); + ok(!lstrcmpW(encoding, table->encoding), "test %d: got encoding %s, expected %s\n", + i, wine_dbgstr_w(encoding), wine_dbgstr_w(table->encoding)); SysFreeString(encoding); IMXWriter_Release(writer); @@ -3724,7 +3725,7 @@ static void test_mxwriter_flush(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", -1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* internal buffer is flushed automatically on certain threshold */ @@ -3772,7 +3773,7 @@ static void test_mxwriter_flush(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", -1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); pos.QuadPart = 0; @@ -3803,7 +3804,7 @@ static void test_mxwriter_flush(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", -1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); memset(buff, 'A', len); @@ -3861,8 +3862,8 @@ static void test_mxwriter_startenddocument(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_("<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n" - "<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n"), V_BSTR(&dest)), + ok(!lstrcmpW(L"<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n" + "<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); @@ -3910,17 +3911,17 @@ enum startendtype struct writer_startendelement_t { const GUID *clsid; enum startendtype type; - const char *uri; - const char *local_name; - const char *qname; - const char *output; + const WCHAR *uri; + const WCHAR *local_name; + const WCHAR *qname; + const WCHAR *output; HRESULT hr; ISAXAttributes *attr; }; -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 WCHAR startelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\">"; +static const WCHAR startendelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\"/>"; +static const WCHAR startendelement_noescape_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&\">\'\"/>"; static const struct writer_startendelement_t writer_startendelement[] = { @@ -3928,76 +3929,76 @@ static const struct writer_startendelement_t writer_startendelement[] = { &CLSID_MXXMLWriter30, StartElement, NULL, NULL, NULL, NULL, E_INVALIDARG }, { &CLSID_MXXMLWriter40, StartElement, NULL, NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, StartElement, "uri", NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, StartElement, "uri", NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, StartElement, "uri", NULL, NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, StartElement, L"uri", NULL, NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, StartElement, L"uri", NULL, NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, StartElement, L"uri", NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, StartElement, NULL, "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, StartElement, NULL, "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, StartElement, NULL, "local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, StartElement, NULL, L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, StartElement, NULL, L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, StartElement, NULL, L"local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, StartElement, NULL, NULL, "qname", NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, StartElement, NULL, NULL, "qname", NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, StartElement, NULL, NULL, "qname", NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, StartElement, NULL, NULL, L"qname", NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, StartElement, NULL, NULL, L"qname", NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, StartElement, NULL, NULL, L"qname", NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, StartElement, "uri", "local", "qname", "<qname>", S_OK }, - { &CLSID_MXXMLWriter30, StartElement, "uri", "local", "qname", "<qname>", S_OK }, - { &CLSID_MXXMLWriter40, StartElement, "uri", "local", "qname", "<qname>", S_OK }, + { &CLSID_MXXMLWriter, StartElement, L"uri", L"local", L"qname", L"<qname>", S_OK }, + { &CLSID_MXXMLWriter30, StartElement, L"uri", L"local", L"qname", L"<qname>", S_OK }, + { &CLSID_MXXMLWriter40, StartElement, L"uri", L"local", L"qname", L"<qname>", S_OK }, - { &CLSID_MXXMLWriter, StartElement, "uri", "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, StartElement, "uri", "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, StartElement, "uri", "local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, StartElement, L"uri", L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, StartElement, L"uri", L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, StartElement, L"uri", L"local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK }, - { &CLSID_MXXMLWriter30, StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK }, - { &CLSID_MXXMLWriter40, StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK }, + { &CLSID_MXXMLWriter, StartElement, L"uri", L"local", L"uri:local", L"<uri:local>", S_OK }, + { &CLSID_MXXMLWriter30, StartElement, L"uri", L"local", L"uri:local", L"<uri:local>", S_OK }, + { &CLSID_MXXMLWriter40, StartElement, L"uri", L"local", L"uri:local", L"<uri:local>", S_OK }, - { &CLSID_MXXMLWriter, StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK }, - { &CLSID_MXXMLWriter30, StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK }, - { &CLSID_MXXMLWriter40, StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK }, + { &CLSID_MXXMLWriter, StartElement, L"uri", L"local", L"uri:local2", L"<uri:local2>", S_OK }, + { &CLSID_MXXMLWriter30, StartElement, L"uri", L"local", L"uri:local2", L"<uri:local2>", S_OK }, + { &CLSID_MXXMLWriter40, StartElement, L"uri", L"local", L"uri:local2", L"<uri:local2>", S_OK }, /* endElement tests */ { &CLSID_MXXMLWriter, EndElement, NULL, NULL, NULL, NULL, E_INVALIDARG }, { &CLSID_MXXMLWriter30, EndElement, NULL, NULL, NULL, NULL, E_INVALIDARG }, { &CLSID_MXXMLWriter40, EndElement, NULL, NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, EndElement, "uri", NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, EndElement, "uri", NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, EndElement, "uri", NULL, NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, EndElement, NULL, "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, EndElement, NULL, "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, EndElement, NULL, "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, EndElement, NULL, NULL, "qname", NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, EndElement, NULL, NULL, "qname", NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, EndElement, NULL, NULL, "qname", NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, EndElement, "uri", "local", "qname", "</qname>", S_OK }, - { &CLSID_MXXMLWriter30, EndElement, "uri", "local", "qname", "</qname>", S_OK }, - { &CLSID_MXXMLWriter40, EndElement, "uri", "local", "qname", "</qname>", S_OK }, - { &CLSID_MXXMLWriter, EndElement, "uri", "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter30, EndElement, "uri", "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter40, EndElement, "uri", "local", NULL, NULL, E_INVALIDARG }, - { &CLSID_MXXMLWriter, EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK }, - { &CLSID_MXXMLWriter30, EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK }, - { &CLSID_MXXMLWriter40, EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK }, - { &CLSID_MXXMLWriter, EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK }, - { &CLSID_MXXMLWriter30, EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK }, - { &CLSID_MXXMLWriter40, EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK }, + { &CLSID_MXXMLWriter, EndElement, L"uri", NULL, NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, EndElement, L"uri", NULL, NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, EndElement, L"uri", NULL, NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, EndElement, NULL, L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, EndElement, NULL, L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, EndElement, NULL, L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, EndElement, NULL, NULL, L"qname", NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, EndElement, NULL, NULL, L"qname", NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, EndElement, NULL, NULL, L"qname", NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, EndElement, L"uri", L"local", L"qname", L"</qname>", S_OK }, + { &CLSID_MXXMLWriter30, EndElement, L"uri", L"local", L"qname", L"</qname>", S_OK }, + { &CLSID_MXXMLWriter40, EndElement, L"uri", L"local", L"qname", L"</qname>", S_OK }, + { &CLSID_MXXMLWriter, EndElement, L"uri", L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter30, EndElement, L"uri", L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter40, EndElement, L"uri", L"local", NULL, NULL, E_INVALIDARG }, + { &CLSID_MXXMLWriter, EndElement, L"uri", L"local", L"uri:local", L"</uri:local>", S_OK }, + { &CLSID_MXXMLWriter30, EndElement, L"uri", L"local", L"uri:local", L"</uri:local>", S_OK }, + { &CLSID_MXXMLWriter40, EndElement, L"uri", L"local", L"uri:local", L"</uri:local>", S_OK }, + { &CLSID_MXXMLWriter, EndElement, L"uri", L"local", L"uri:local2", L"</uri:local2>", S_OK }, + { &CLSID_MXXMLWriter30, EndElement, L"uri", L"local", L"uri:local2", L"</uri:local2>", S_OK }, + { &CLSID_MXXMLWriter40, EndElement, L"uri", L"local", L"uri:local2", L"</uri:local2>", S_OK }, /* with attributes */ - { &CLSID_MXXMLWriter, StartElement, "uri", "local", "uri:local", startelement_xml, S_OK, &saxattributes }, - { &CLSID_MXXMLWriter30, StartElement, "uri", "local", "uri:local", startelement_xml, S_OK, &saxattributes }, - { &CLSID_MXXMLWriter40, StartElement, "uri", "local", "uri:local", startelement_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter, StartElement, L"uri", L"local", L"uri:local", startelement_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter30, StartElement, L"uri", L"local", L"uri:local", startelement_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter40, StartElement, L"uri", L"local", L"uri:local", startelement_xml, S_OK, &saxattributes }, /* empty elements */ - { &CLSID_MXXMLWriter, StartEndElement, "uri", "local", "uri:local", startendelement_xml, S_OK, &saxattributes }, - { &CLSID_MXXMLWriter30, StartEndElement, "uri", "local", "uri:local", startendelement_xml, S_OK, &saxattributes }, - { &CLSID_MXXMLWriter40, StartEndElement, "uri", "local", "uri:local", startendelement_xml, S_OK, &saxattributes }, - { &CLSID_MXXMLWriter, StartEndElement, "", "", "", "</>", S_OK }, - { &CLSID_MXXMLWriter30, StartEndElement, "", "", "", "</>", S_OK }, - { &CLSID_MXXMLWriter40, StartEndElement, "", "", "", "</>", S_OK }, + { &CLSID_MXXMLWriter, StartEndElement, L"uri", L"local", L"uri:local", startendelement_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter30, StartEndElement, L"uri", L"local", L"uri:local", startendelement_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter40, StartEndElement, L"uri", L"local", L"uri:local", startendelement_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter, StartEndElement, L"", L"", L"", L"</>", S_OK }, + { &CLSID_MXXMLWriter30, StartEndElement, L"", L"", L"", L"</>", S_OK }, + { &CLSID_MXXMLWriter40, StartEndElement, L"", L"", L"", L"</>", 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_MXXMLWriter, StartEndElement | DisableEscaping, L"uri", L"local", L"uri:local", startendelement_noescape_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter30, StartEndElement | DisableEscaping, L"uri", L"local", L"uri:local", startendelement_noescape_xml, S_OK, &saxattributes }, + { &CLSID_MXXMLWriter40, StartEndElement | DisableEscaping, L"uri", L"local", L"uri:local", startendelement_xml, S_OK, &saxattributes }, { NULL } }; @@ -4057,17 +4058,17 @@ static void test_mxwriter_startendelement_batch(const struct writer_startendelem if (table->type & StartElement) { - hr = ISAXContentHandler_startElement(content, _bstr_(table->uri), table->uri ? strlen(table->uri) : 0, - _bstr_(table->local_name), table->local_name ? strlen(table->local_name) : 0, _bstr_(table->qname), - table->qname ? strlen(table->qname) : 0, table->attr); + hr = ISAXContentHandler_startElement(content, table->uri, table->uri ? lstrlenW(table->uri) : 0, + table->local_name, table->local_name ? lstrlenW(table->local_name) : 0, table->qname, + table->qname ? lstrlenW(table->qname) : 0, table->attr); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); } if (table->type & EndElement) { - hr = ISAXContentHandler_endElement(content, _bstr_(table->uri), table->uri ? strlen(table->uri) : 0, - _bstr_(table->local_name), table->local_name ? strlen(table->local_name) : 0, _bstr_(table->qname), - table->qname ? strlen(table->qname) : 0); + hr = ISAXContentHandler_endElement(content, table->uri, table->uri ? lstrlenW(table->uri) : 0, + table->local_name, table->local_name ? lstrlenW(table->local_name) : 0, table->qname, + table->qname ? lstrlenW(table->qname) : 0); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); } @@ -4080,8 +4081,8 @@ static void test_mxwriter_startendelement_batch(const struct writer_startendelem hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->output), V_BSTR(&dest)), - "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->output); + ok(!lstrcmpW(table->output, V_BSTR(&dest)), + "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); } @@ -4098,22 +4099,22 @@ static void test_mxwriter_startendelement_batch(const struct writer_startendelem /* point of these test is to start/end element with different names and name lengths */ struct writer_startendelement2_t { const GUID *clsid; - const char *qnamestart; + const WCHAR *qnamestart; int qnamestart_len; - const char *qnameend; + const WCHAR *qnameend; int qnameend_len; - const char *output; + const WCHAR *output; HRESULT hr; }; static const struct writer_startendelement2_t writer_startendelement2[] = { - { &CLSID_MXXMLWriter, "a", -1, "b", -1, "<a/>", S_OK }, - { &CLSID_MXXMLWriter30, "a", -1, "b", -1, "<a/>", S_OK }, - { &CLSID_MXXMLWriter40, "a", -1, "b", -1, "<a/>", S_OK }, + { &CLSID_MXXMLWriter, L"a", -1, L"b", -1, L"<a/>", S_OK }, + { &CLSID_MXXMLWriter30, L"a", -1, L"b", -1, L"<a/>", S_OK }, + { &CLSID_MXXMLWriter40, L"a", -1, L"b", -1, L"<a/>", S_OK }, - { &CLSID_MXXMLWriter, "a", 1, "b", 1, "<a/>", S_OK }, - { &CLSID_MXXMLWriter30, "a", 1, "b", 1, "<a/>", S_OK }, - { &CLSID_MXXMLWriter40, "a", 1, "b", 1, "<a/>", S_OK }, + { &CLSID_MXXMLWriter, L"a", 1, L"b", 1, L"<a/>", S_OK }, + { &CLSID_MXXMLWriter30, L"a", 1, L"b", 1, L"<a/>", S_OK }, + { &CLSID_MXXMLWriter40, L"a", 1, L"b", 1, L"<a/>", S_OK }, { NULL } }; @@ -4147,12 +4148,10 @@ static void test_mxwriter_startendelement_batch2(const struct writer_startendele hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, - _bstr_(table->qnamestart), table->qnamestart_len, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, table->qnamestart, table->qnamestart_len, NULL); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, - _bstr_(table->qnameend), table->qnameend_len); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, table->qnameend, table->qnameend_len); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); /* test output */ @@ -4164,8 +4163,8 @@ static void test_mxwriter_startendelement_batch2(const struct writer_startendele hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->output), V_BSTR(&dest)), - "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->output); + ok(!lstrcmpW(table->output, V_BSTR(&dest)), + "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); } @@ -4283,7 +4282,7 @@ static void test_mxwriter_startendelement(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* all string pointers should be not null */ - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_("b"), 1, _bstr_(""), 0, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"b", 1, L"", 0, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -4293,7 +4292,7 @@ static void test_mxwriter_startendelement(void) ok(!lstrcmpW(L"<>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("b"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"b", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -4303,17 +4302,17 @@ static void test_mxwriter_startendelement(void) ok(!lstrcmpW(L"<><b>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); - hr = ISAXContentHandler_endElement(content, NULL, 0, NULL, 0, _bstr_("a:b"), 3); + hr = ISAXContentHandler_endElement(content, NULL, 0, NULL, 0, L"a:b", 3); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, NULL, 0, _bstr_("b"), 1, _bstr_("a:b"), 3); + hr = ISAXContentHandler_endElement(content, NULL, 0, L"b", 1, L"a:b", 3); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); /* only local name is an error too */ - hr = ISAXContentHandler_endElement(content, NULL, 0, _bstr_("b"), 1, NULL, 0); + hr = ISAXContentHandler_endElement(content, NULL, 0, L"b", 1, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("b"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"b", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -4340,7 +4339,7 @@ static void test_mxwriter_startendelement(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("abcdef"), 3, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"abcdef", 3, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -4354,7 +4353,7 @@ static void test_mxwriter_startendelement(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMXWriter_flush(writer); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("abdcdef"), 3); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"abdcdef", 3); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; hr = IMXWriter_get_output(writer, &dest); @@ -4368,7 +4367,7 @@ static void test_mxwriter_startendelement(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* length -1 */ - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", -1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; hr = IMXWriter_get_output(writer, &dest); @@ -4465,13 +4464,13 @@ static void test_mxwriter_characters(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXContentHandler_characters(content, L"TESTCHARDATA .", 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"a", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -4907,10 +4906,10 @@ static void test_mxwriter_encoding(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* write empty element */ - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"a", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* switch */ @@ -5432,8 +5431,8 @@ static void test_mxwriter_dtd(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_("<!DOCTYPE name [\r\n<!DOCTYPE name PUBLIC \"pub\"" - "<!DOCTYPE name PUBLIC \"pub\" \"sys\" [\r\n"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + ok(!lstrcmpW(L"<!DOCTYPE name [\r\n<!DOCTYPE name PUBLIC \"pub\"" + "<!DOCTYPE name PUBLIC \"pub\" \"sys\" [\r\n", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); hr = ISAXLexicalHandler_endDTD(lexical); @@ -5446,8 +5445,8 @@ static void test_mxwriter_dtd(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_("<!DOCTYPE name [\r\n<!DOCTYPE name PUBLIC \"pub\"" - "<!DOCTYPE name PUBLIC \"pub\" \"sys\" [\r\n]>\r\n]>\r\n"), + ok(!lstrcmpW(L"<!DOCTYPE name [\r\n<!DOCTYPE name PUBLIC \"pub\"" + "<!DOCTYPE name PUBLIC \"pub\" \"sys\" [\r\n]>\r\n]>\r\n", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); @@ -5496,9 +5495,8 @@ static void test_mxwriter_dtd(void) hr = IMXWriter_put_output(writer, dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_attributeDecl(decl, _bstr_("element"), strlen("element"), - _bstr_("attribute"), strlen("attribute"), _bstr_("CDATA"), strlen("CDATA"), - _bstr_("#REQUIRED"), strlen("#REQUIRED"), _bstr_("value"), strlen("value")); + hr = ISAXDeclHandler_attributeDecl(decl, L"element", 7, L"attribute", 9, L"CDATA", 5, + L"#REQUIRED", 9, L"value", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -5509,23 +5507,21 @@ static void test_mxwriter_dtd(void) V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); - hr = ISAXDeclHandler_attributeDecl(decl, _bstr_("element"), strlen("element"), - _bstr_("attribute2"), strlen("attribute2"), _bstr_("CDATA"), strlen("CDATA"), - _bstr_("#REQUIRED"), strlen("#REQUIRED"), _bstr_("value2"), strlen("value2")); + hr = ISAXDeclHandler_attributeDecl(decl, L"element", 7, L"attribute2", 10, L"CDATA", 5, + L"#REQUIRED", 9, L"value2", 6); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_attributeDecl(decl, _bstr_("element2"), strlen("element2"), - _bstr_("attribute3"), strlen("attribute3"), _bstr_("CDATA"), strlen("CDATA"), - _bstr_("#REQUIRED"), strlen("#REQUIRED"), _bstr_("value3"), strlen("value3")); + hr = ISAXDeclHandler_attributeDecl(decl, L"element2", 8, L"attribute3", 10, L"CDATA", 5, + L"#REQUIRED", 9, L"value3", 6); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_("<!ATTLIST element attribute CDATA #REQUIRED \"value\">\r\n" + ok(!lstrcmpW(L"<!ATTLIST element attribute CDATA #REQUIRED \"value\">\r\n" "<!ATTLIST element attribute2 CDATA #REQUIRED \"value2\">\r\n" - "<!ATTLIST element2 attribute3 CDATA #REQUIRED \"value3\">\r\n"), + "<!ATTLIST element2 attribute3 CDATA #REQUIRED \"value3\">\r\n", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); @@ -5540,10 +5536,10 @@ static void test_mxwriter_dtd(void) hr = IVBSAXDeclHandler_internalEntityDecl(vbdecl, NULL, NULL); ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_internalEntityDecl(decl, _bstr_("name"), -1, NULL, 0); + hr = ISAXDeclHandler_internalEntityDecl(decl, L"name", -1, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_internalEntityDecl(decl, _bstr_("name"), strlen("name"), _bstr_("value"), strlen("value")); + hr = ISAXDeclHandler_internalEntityDecl(decl, L"name", 4, L"value", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -5564,30 +5560,26 @@ static void test_mxwriter_dtd(void) hr = IVBSAXDeclHandler_externalEntityDecl(vbdecl, NULL, NULL, NULL); ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), 0, NULL, 0, NULL, 0); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 0, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), -1, NULL, 0, NULL, 0); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", -1, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), - _bstr_("sysid"), strlen("sysid")); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 4, L"pubid", 5, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), strlen("name"), NULL, 0, _bstr_("sysid"), strlen("sysid")); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 4, NULL, 0, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), - NULL, 0); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 4, L"pubid", 5, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_( - "<!ENTITY name PUBLIC \"pubid\" \"sysid\">\r\n" - "<!ENTITY name SYSTEM \"sysid\">\r\n"), + ok(!lstrcmpW(L"<!ENTITY name PUBLIC \"pubid\" \"sysid\">\r\n<!ENTITY name SYSTEM \"sysid\">\r\n", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); @@ -5603,26 +5595,26 @@ static void test_mxwriter_dtd(void) hr = ISAXDTDHandler_notationDecl(dtd, NULL, 0, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), NULL, 0, NULL, 0); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), NULL, 0); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, L"pubid", 5, NULL, 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), _bstr_("sysid"), strlen("sysid")); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, L"pubid", 5, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), NULL, 0, _bstr_("sysid"), strlen("sysid")); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, NULL, 0, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_( - "<!NOTATION name" + ok(!lstrcmpW( + L"<!NOTATION name" "<!NOTATION name PUBLIC \"pubid\">\r\n" "<!NOTATION name PUBLIC \"pubid\" \"sysid\">\r\n" - "<!NOTATION name SYSTEM \"sysid\">\r\n"), + "<!NOTATION name SYSTEM \"sysid\">\r\n", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); @@ -5798,7 +5790,7 @@ static void test_mxattr_addAttribute(void) ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); index = -1; - hr = ISAXAttributes_getIndexFromQName(saxattr, _bstr_("nonexistent"), 11, &index); + hr = ISAXAttributes_getIndexFromQName(saxattr, L"nonexistent", 11, &index); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ok(index == -1, "%d: got wrong index %d\n", i, index); @@ -6129,25 +6121,25 @@ static void test_mxwriter_indent(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", -1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_characters(content, _bstr_(""), 0); + hr = ISAXContentHandler_characters(content, L"", 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("b"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"b", -1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("c"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"c", -1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, _bstr_("c"), -1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"c", -1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, _bstr_("b"), -1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"b", -1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, _bstr_("a"), -1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"a", -1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXContentHandler_endDocument(content); @@ -6297,13 +6289,13 @@ static void test_saxreader_dtd(void) init_saxdeclhandler(&declhandler, S_OK); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown *)&declhandler.ISAXDeclHandler_iface; - hr = ISAXXMLReader_putProperty(reader, _bstr_("http://xml.org/sax/properties/declaration-handler"), var); + hr = ISAXXMLReader_putProperty(reader, L"http://xml.org/sax/properties/declaration-handler", var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); init_saxlexicalhandler(&lexicalhandler, S_OK); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown *)&lexicalhandler.ISAXLexicalHandler_iface; - hr = ISAXXMLReader_putProperty(reader, _bstr_("http://xml.org/sax/properties/lexical-handler"), var); + hr = ISAXXMLReader_putProperty(reader, L"http://xml.org/sax/properties/lexical-handler", var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_putContentHandler(reader, &contentHandler); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/saxreader.c | 37 ++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index df323652fa3..1337b3faab8 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -1671,7 +1671,7 @@ static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface) static HRESULT WINAPI isaxattributes_getLength(ISAXAttributes* iface, int *length) { - *length = 3; + *length = 4; return S_OK; } @@ -1703,15 +1703,19 @@ static HRESULT WINAPI isaxattributes_getQName( { static const WCHAR attrqnamesW[][15] = {L"a:attr1junk", L"attr2junk", - L"attr3"}; - static const int attrqnamelen[] = {7, 5, 5}; + L"attr3", + L"attr4"}; + static const int attrqnamelen[] = {7, 5, 5, 5}; - ok(index >= 0 && index <= 2, "invalid index received %d\n", index); + ok(index >= 0 && index <= 3, "invalid index received %d\n", index); - if (index >= 0 && index <= 2) { + if (index >= 0 && index <= 3) + { *QName = attrqnamesW[index]; *QNameLength = attrqnamelen[index]; - } else { + } + else + { *QName = NULL; *QNameLength = 0; } @@ -1794,15 +1798,19 @@ static HRESULT WINAPI isaxattributes_getValue(ISAXAttributes* iface, int index, { static const WCHAR attrvaluesW[][10] = {L"a1junk", L"a2junk", - L"<&\">'"}; - static const int attrvalueslen[] = {2, 2, 5}; + L"<&\">'", + L"a\rb\nc\r\n"}; + static const int attrvalueslen[] = {2, 2, 5, 7}; - ok(index >= 0 && index <= 2, "invalid index received %d\n", index); + ok(index >= 0 && index <= 3, "invalid index received %d\n", index); - if (index >= 0 && index <= 2) { + if (index >= 0 && index <= 3) + { *value = attrvaluesW[index]; *nValue = attrvalueslen[index]; - } else { + } + else + { *value = NULL; *nValue = 0; } @@ -3919,9 +3927,9 @@ struct writer_startendelement_t { ISAXAttributes *attr; }; -static const WCHAR startelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\">"; -static const WCHAR startendelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\"/>"; -static const WCHAR startendelement_noescape_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&\">\'\"/>"; +static const WCHAR startelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\" attr4=\"a\r\nb\r\nc\r\n\">"; +static const WCHAR startendelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\" attr4=\"a\r\nb\r\nc\r\n\"/>"; +static const WCHAR startendelement_noescape_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&\">\'\" attr4=\"a\r\nb\r\nc\r\n\"/>"; static const struct writer_startendelement_t writer_startendelement[] = { @@ -4081,6 +4089,7 @@ static void test_mxwriter_startendelement_batch(const struct writer_startendelem hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); + todo_wine_if((i >= 48 && i <= 53) || (i >= 57 && i <= 59)) ok(!lstrcmpW(table->output, V_BSTR(&dest)), "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml6/tests/saxreader.c | 249 +++++++++++++++++----------------- 1 file changed, 121 insertions(+), 128 deletions(-) diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 4ce074a266b..70965a98728 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -1491,7 +1491,7 @@ static void test_mxwriter_flush(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* internal buffer is flushed automatically on certain threshold */ @@ -1539,7 +1539,7 @@ static void test_mxwriter_flush(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); pos.QuadPart = 0; @@ -1570,7 +1570,7 @@ static void test_mxwriter_flush(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); memset(buff, 'A', len); @@ -1627,8 +1627,8 @@ static void test_mxwriter_startenddocument(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_("<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n" - "<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n"), V_BSTR(&dest)), + ok(!lstrcmpW(L"<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n" + "<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); @@ -1675,39 +1675,39 @@ enum startendtype struct writer_startendelement_t { enum startendtype type; - const char *uri; - const char *local_name; - const char *qname; - const char *output; + const WCHAR *uri; + const WCHAR *local_name; + const WCHAR *qname; + const WCHAR *output; HRESULT hr; ISAXAttributes *attr; }; -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 WCHAR startelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\">"; +static const WCHAR startendelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\"/>"; static const struct writer_startendelement_t writer_startendelement[] = { - { StartElement, NULL, NULL, NULL, "<>", S_OK }, - { StartElement, "uri", NULL, NULL, "<>", S_OK }, - { StartElement, NULL, "local", NULL, "<>", S_OK }, - { StartElement, NULL, NULL, "qname", "<qname>", S_OK }, - { StartElement, "uri", "local", "qname", "<qname>", S_OK }, - { StartElement, "uri", "local", NULL, "<>", S_OK }, - { StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK }, - { StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK }, - { EndElement, NULL, NULL, NULL, "</>", S_OK }, - { EndElement, "uri", NULL, NULL, "</>", S_OK }, - { EndElement, NULL, "local", NULL, "</>", S_OK }, - { EndElement, NULL, NULL, "qname", "</qname>", S_OK }, - { EndElement, "uri", "local", "qname", "</qname>", S_OK }, - { EndElement, "uri", "local", NULL, "</>", S_OK }, - { EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK }, - { EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK }, - { StartElement, "uri", "local", "uri:local", startelement_xml, S_OK, &saxattributes }, - { StartEndElement, "uri", "local", "uri:local", startendelement_xml, S_OK, &saxattributes }, - { StartEndElement, "", "", "", "</>", S_OK }, - { StartEndElement | DisableEscaping, "uri", "local", "uri:local", startendelement_xml, S_OK, &saxattributes }, + { StartElement, NULL, NULL, NULL, L"<>", S_OK }, + { StartElement, L"uri", NULL, NULL, L"<>", S_OK }, + { StartElement, NULL, L"local", NULL, L"<>", S_OK }, + { StartElement, NULL, NULL, L"qname", L"<qname>", S_OK }, + { StartElement, L"uri", L"local", L"qname", L"<qname>", S_OK }, + { StartElement, L"uri", L"local", NULL, L"<>", S_OK }, + { StartElement, L"uri", L"local", L"uri:local", L"<uri:local>", S_OK }, + { StartElement, L"uri", L"local", L"uri:local2", L"<uri:local2>", S_OK }, + { EndElement, NULL, NULL, NULL, L"</>", S_OK }, + { EndElement, L"uri", NULL, NULL, L"</>", S_OK }, + { EndElement, NULL, L"local", NULL, L"</>", S_OK }, + { EndElement, NULL, NULL, L"qname", L"</qname>", S_OK }, + { EndElement, L"uri", L"local", L"qname", L"</qname>", S_OK }, + { EndElement, L"uri", L"local", NULL, L"</>", S_OK }, + { EndElement, L"uri", L"local", L"uri:local", L"</uri:local>", S_OK }, + { EndElement, L"uri", L"local", L"uri:local2", L"</uri:local2>", S_OK }, + { StartElement, L"uri", L"local", L"uri:local", startelement_xml, S_OK, &saxattributes }, + { StartEndElement, L"uri", L"local", L"uri:local", startendelement_xml, S_OK, &saxattributes }, + { StartEndElement, L"", L"", L"", L"</>", S_OK }, + { StartEndElement | DisableEscaping, L"uri", L"local", L"uri:local", startendelement_xml, S_OK, &saxattributes }, }; static void test_mxwriter_startendelement_batch(void) @@ -1741,17 +1741,17 @@ static void test_mxwriter_startendelement_batch(void) if (table->type & StartElement) { - hr = ISAXContentHandler_startElement(content, _bstr_(table->uri), table->uri ? strlen(table->uri) : 0, - _bstr_(table->local_name), table->local_name ? strlen(table->local_name) : 0, _bstr_(table->qname), - table->qname ? strlen(table->qname) : 0, table->attr); + hr = ISAXContentHandler_startElement(content, table->uri, table->uri ? lstrlenW(table->uri) : 0, + table->local_name, table->local_name ? lstrlenW(table->local_name) : 0, table->qname, + table->qname ? lstrlenW(table->qname) : 0, table->attr); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); } if (table->type & EndElement) { - hr = ISAXContentHandler_endElement(content, _bstr_(table->uri), table->uri ? strlen(table->uri) : 0, - _bstr_(table->local_name), table->local_name ? strlen(table->local_name) : 0, _bstr_(table->qname), - table->qname ? strlen(table->qname) : 0); + hr = ISAXContentHandler_endElement(content, table->uri, table->uri ? lstrlenW(table->uri) : 0, + table->local_name, table->local_name ? lstrlenW(table->local_name) : 0, table->qname, + table->qname ? lstrlenW(table->qname) : 0); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); } @@ -1764,8 +1764,8 @@ static void test_mxwriter_startendelement_batch(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->output), V_BSTR(&dest)), - "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->output); + ok(!lstrcmpW(table->output, V_BSTR(&dest)), + "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); } @@ -1779,18 +1779,18 @@ static void test_mxwriter_startendelement_batch(void) /* point of these test is to start/end element with different names and name lengths */ struct writer_startendelement2_t { - const char *qnamestart; + const WCHAR *qnamestart; int qnamestart_len; - const char *qnameend; + const WCHAR *qnameend; int qnameend_len; - const char *output; + const WCHAR *output; HRESULT hr; }; static const struct writer_startendelement2_t writer_startendelement2[] = { - { "a", -1, "b", -1, "<a/>", E_INVALIDARG }, - { "a", 1, "b", 1, "<a/>", S_OK }, + { L"a", -1, L"b", -1, L"<a/>", E_INVALIDARG }, + { L"a", 1, L"b", 1, L"<a/>", S_OK }, }; static void test_mxwriter_startendelement_batch2(void) @@ -1816,12 +1816,10 @@ static void test_mxwriter_startendelement_batch2(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, - _bstr_(table->qnamestart), table->qnamestart_len, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, table->qnamestart, table->qnamestart_len, NULL); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, - _bstr_(table->qnameend), table->qnameend_len); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, table->qnameend, table->qnameend_len); ok(hr == table->hr, "test %d: got %#lx, expected %#lx\n", i, hr, table->hr); /* test output */ @@ -1833,8 +1831,8 @@ static void test_mxwriter_startendelement_batch2(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->output), V_BSTR(&dest)), - "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->output); + ok(!lstrcmpW(table->output, V_BSTR(&dest)), + "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); } @@ -1950,7 +1948,7 @@ static void test_mxwriter_startendelement(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* all string pointers should be not null */ - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_("b"), 1, _bstr_(""), 0, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"b", 1, L"", 0, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -1960,7 +1958,7 @@ static void test_mxwriter_startendelement(void) ok(!lstrcmpW(L"<>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("b"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"b", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -1970,17 +1968,17 @@ static void test_mxwriter_startendelement(void) ok(!lstrcmpW(L"<><b>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); - hr = ISAXContentHandler_endElement(content, NULL, 0, NULL, 0, _bstr_("a:b"), 3); + hr = ISAXContentHandler_endElement(content, NULL, 0, NULL, 0, L"a:b", 3); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, NULL, 0, _bstr_("b"), 1, _bstr_("a:b"), 3); + hr = ISAXContentHandler_endElement(content, NULL, 0, L"b", 1, L"a:b", 3); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* only local name is an error too */ - hr = ISAXContentHandler_endElement(content, NULL, 0, _bstr_("b"), 1, NULL, 0); + hr = ISAXContentHandler_endElement(content, NULL, 0, L"b", 1, NULL, 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("b"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"b", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -2007,7 +2005,7 @@ static void test_mxwriter_startendelement(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("abcdef"), 3, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"abcdef", 3, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -2021,7 +2019,7 @@ static void test_mxwriter_startendelement(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMXWriter_flush(writer); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("abdcdef"), 3); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"abdcdef", 3); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; hr = IMXWriter_get_output(writer, &dest); @@ -2035,7 +2033,7 @@ static void test_mxwriter_startendelement(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* length -1 */ - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), -1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", -1, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ISAXContentHandler_Release(content); @@ -2045,13 +2043,13 @@ static void test_mxwriter_startendelement(void) struct writer_characters_t { - const char *data; - const char *output; + const WCHAR *data; + const WCHAR *output; }; static const struct writer_characters_t writer_characters[] = { - { "< > & \" \'", "< > & \" \'" }, + { L"< > & \" \'", L"< > & \" \'" }, }; static void test_mxwriter_characters(void) @@ -2121,13 +2119,13 @@ static void test_mxwriter_characters(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXContentHandler_characters(content, L"TESTCHARDATA .", 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"a", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -2219,7 +2217,7 @@ static void test_mxwriter_characters(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_characters(content, _bstr_(table->data), strlen(table->data)); + hr = ISAXContentHandler_characters(content, table->data, lstrlenW(table->data)); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* test output */ @@ -2229,8 +2227,8 @@ static void test_mxwriter_characters(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->output), V_BSTR(&dest)), - "test %d: got wrong content %s, expected \"%s\"\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->output); + ok(!lstrcmpW(table->output, V_BSTR(&dest)), + "test %d: got wrong content %s, expected \"%s\"\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); } @@ -2242,7 +2240,7 @@ static void test_mxwriter_characters(void) hr = IMXWriter_put_disableOutputEscaping(writer, VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_characters(content, _bstr_(table->data), strlen(table->data)); + hr = ISAXContentHandler_characters(content, table->data, lstrlenW(table->data)); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* test output */ @@ -2252,8 +2250,8 @@ static void test_mxwriter_characters(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(_bstr_(table->data), V_BSTR(&dest)), - "test %d: got wrong content %s, expected \"%s\"\n", i, wine_dbgstr_w(V_BSTR(&dest)), table->data); + ok(!lstrcmpW(table->data, V_BSTR(&dest)), + "test %d: got wrong content %s, expected \"%s\"\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->data)); VariantClear(&dest); } @@ -2523,10 +2521,10 @@ static void test_mxwriter_encoding(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* write empty element */ - hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("a"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"a", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* switch */ @@ -2800,7 +2798,7 @@ static void test_mxwriter_cdata(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* all these are escaped for text nodes */ - hr = ISAXContentHandler_characters(content, _bstr_("< > & \""), 7); + hr = ISAXContentHandler_characters(content, L"< > & \"", 7); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXLexicalHandler_endCDATA(lexical); @@ -3071,9 +3069,8 @@ static void test_mxwriter_dtd(void) hr = IMXWriter_put_output(writer, dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_attributeDecl(decl, _bstr_("element"), strlen("element"), - _bstr_("attribute"), strlen("attribute"), _bstr_("CDATA"), strlen("CDATA"), - _bstr_("#REQUIRED"), strlen("#REQUIRED"), _bstr_("value"), strlen("value")); + hr = ISAXDeclHandler_attributeDecl(decl, L"element", 7, + L"attribute", 9, L"CDATA", 5, L"#REQUIRED", 9, L"value", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -3085,14 +3082,12 @@ static void test_mxwriter_dtd(void) V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); - hr = ISAXDeclHandler_attributeDecl(decl, _bstr_("element"), strlen("element"), - _bstr_("attribute2"), strlen("attribute2"), _bstr_("CDATA"), strlen("CDATA"), - _bstr_("#REQUIRED"), strlen("#REQUIRED"), _bstr_("value2"), strlen("value2")); + hr = ISAXDeclHandler_attributeDecl(decl, L"element", 7, + L"attribute2", 10, L"CDATA", 5, L"#REQUIRED", 9, L"value2", 6); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_attributeDecl(decl, _bstr_("element2"), strlen("element2"), - _bstr_("attribute3"), strlen("attribute3"), _bstr_("CDATA"), strlen("CDATA"), - _bstr_("#REQUIRED"), strlen("#REQUIRED"), _bstr_("value3"), strlen("value3")); + hr = ISAXDeclHandler_attributeDecl(decl, L"element2", 8, + L"attribute3", 10, L"CDATA", 5, L"#REQUIRED", 9, L"value3", 6); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -3120,10 +3115,10 @@ static void test_mxwriter_dtd(void) ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); } - hr = ISAXDeclHandler_internalEntityDecl(decl, _bstr_("name"), -1, NULL, 0); + hr = ISAXDeclHandler_internalEntityDecl(decl, L"name", -1, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_internalEntityDecl(decl, _bstr_("name"), strlen("name"), _bstr_("value"), strlen("value")); + hr = ISAXDeclHandler_internalEntityDecl(decl, L"name", 4, L"value", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -3148,21 +3143,19 @@ static void test_mxwriter_dtd(void) ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); } - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), 0, NULL, 0, NULL, 0); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 0, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), -1, NULL, 0, NULL, 0); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", -1, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), - _bstr_("sysid"), strlen("sysid")); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 4, L"pubid", 5, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), strlen("name"), NULL, 0, _bstr_("sysid"), strlen("sysid")); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 4, NULL, 0, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), - NULL, 0); + hr = ISAXDeclHandler_externalEntityDecl(decl, L"name", 4, L"pubid", 5, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); V_VT(&dest) = VT_EMPTY; @@ -3187,16 +3180,16 @@ static void test_mxwriter_dtd(void) hr = ISAXDTDHandler_notationDecl(dtd, NULL, 0, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), NULL, 0, NULL, 0); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, NULL, 0, NULL, 0); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), NULL, 0); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, L"pubid", 5, NULL, 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"), _bstr_("sysid"), strlen("sysid")); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, L"pubid", 5, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXDTDHandler_notationDecl(dtd, _bstr_("name"), strlen("name"), NULL, 0, _bstr_("sysid"), strlen("sysid")); + hr = ISAXDTDHandler_notationDecl(dtd, L"name", 4, NULL, 0, L"sysid", 5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMXWriter_get_output(writer, &dest); @@ -3600,25 +3593,25 @@ static void test_mxwriter_indent(void) hr = ISAXContentHandler_startDocument(content); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("a"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"a", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_characters(content, _bstr_(""), 0); + hr = ISAXContentHandler_characters(content, L"", 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("b"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"b", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, _bstr_("c"), 1, NULL); + hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"c", 1, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, _bstr_("c"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"c", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, _bstr_("b"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"b", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, _bstr_("a"), 1); + hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"a", 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXContentHandler_endDocument(content); @@ -4296,7 +4289,7 @@ static HRESULT WINAPI contentHandler_startElement( attr = calloc(len, sizeof(*attr)); v = VARIANT_TRUE; - hr = ISAXXMLReader_getFeature(g_reader, _bstr_("http://xml.org/sax/features/namespaces"), &v); + hr = ISAXXMLReader_getFeature(g_reader, L"http://xml.org/sax/features/namespaces", &v); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); for (i = 0; i < len; i++) @@ -4709,7 +4702,7 @@ static void test_saxreader(void) ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "xml:space handling", TRUE); /* switch off 'namespaces' feature */ - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespaces"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespaces", VARIANT_FALSE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); stream = create_test_stream(test_attributes, -1); @@ -4722,11 +4715,11 @@ static void test_saxreader(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "content test attributes", TRUE); IStream_Release(stream); - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespaces"), VARIANT_TRUE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespaces", VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* switch off 'namespace-prefixes' feature */ - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespace-prefixes"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespace-prefixes", VARIANT_FALSE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); stream = create_test_stream(test_attributes, -1); @@ -4740,7 +4733,7 @@ static void test_saxreader(void) ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "content test attributes", FALSE); IStream_Release(stream); - hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespace-prefixes"), VARIANT_TRUE); + hr = ISAXXMLReader_putFeature(reader, L"http://xml.org/sax/features/namespace-prefixes", VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* attribute normalization */ @@ -4768,7 +4761,7 @@ static void test_saxreader(void) V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)&lexicalhandler.ISAXLexicalHandler_iface; - hr = ISAXXMLReader_putProperty(reader, _bstr_("http://xml.org/sax/properties/lexical-handler"), var); + hr = ISAXXMLReader_putProperty(reader, L"http://xml.org/sax/properties/lexical-handler", var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); stream = create_test_stream(test_cdata_xml, -1); @@ -4824,10 +4817,10 @@ static void test_saxreader(void) free_bstrs(); } -static const char *feature_names[] = +static const WCHAR *feature_names[] = { - "http://xml.org/sax/features/namespaces", - "http://xml.org/sax/features/namespace-prefixes", + L"http://xml.org/sax/features/namespaces", + L"http://xml.org/sax/features/namespace-prefixes", 0 }; @@ -4835,54 +4828,54 @@ static void test_saxreader_features(void) { ISAXXMLReader *reader; VARIANT_BOOL value; - const char **name; + const WCHAR **name; HRESULT hr; hr = CoCreateInstance(&CLSID_SAXXMLReader60, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void **)&reader); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); value = VARIANT_TRUE; - hr = ISAXXMLReader_getFeature(reader, _bstr_("exhaustive-errors"), &value); + hr = ISAXXMLReader_getFeature(reader, L"exhaustive-errors", &value); ok(hr == S_OK, "Failed to get feature value, hr %#lx.\n", hr); ok(value == VARIANT_FALSE, "Unexpected default feature value.\n"); - hr = ISAXXMLReader_putFeature(reader, _bstr_("exhaustive-errors"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"exhaustive-errors", VARIANT_FALSE); ok(hr == S_OK, "Failed to put feature value, hr %#lx.\n", hr); value = VARIANT_TRUE; - hr = ISAXXMLReader_getFeature(reader, _bstr_("schema-validation"), &value); + hr = ISAXXMLReader_getFeature(reader, L"schema-validation", &value); ok(hr == S_OK, "Failed to get feature value, hr %#lx.\n", hr); ok(value == VARIANT_FALSE, "Unexpected default feature value.\n"); - hr = ISAXXMLReader_putFeature(reader, _bstr_("exhaustive-errors"), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, L"exhaustive-errors", VARIANT_FALSE); ok(hr == S_OK, "Failed to put feature value, hr %#lx.\n", hr); name = feature_names; while (*name) { value = 0xc; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(value == VARIANT_TRUE, "Unexpected value %#x.\n", value); value = 0xc; - hr = ISAXXMLReader_putFeature(reader, _bstr_(*name), value); + hr = ISAXXMLReader_putFeature(reader, *name, value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); value = 0xd; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(value == VARIANT_TRUE, "Unexpected value %#x.\n", value); - hr = ISAXXMLReader_putFeature(reader, _bstr_(*name), VARIANT_FALSE); + hr = ISAXXMLReader_putFeature(reader, *name, VARIANT_FALSE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); value = 0xd; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(value == VARIANT_FALSE, "Unexpected value %#x.\n", value); - hr = ISAXXMLReader_putFeature(reader, _bstr_(*name), VARIANT_TRUE); + hr = ISAXXMLReader_putFeature(reader, *name, VARIANT_TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); value = 0xd; - hr = ISAXXMLReader_getFeature(reader, _bstr_(*name), &value); + hr = ISAXXMLReader_getFeature(reader, *name, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(value == VARIANT_TRUE, "Unexpected value %#x.\n", value); @@ -4905,7 +4898,7 @@ static void test_saxreader_properties(void) /* xmldecl-version property */ V_VT(&v) = VT_EMPTY; V_BSTR(&v) = (void*)0xdeadbeef; - hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + hr = ISAXXMLReader_getProperty(reader, L"xmldecl-version", &v); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); ok(V_BSTR(&v) == NULL, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); @@ -4918,14 +4911,14 @@ static void test_saxreader_properties(void) V_VT(&v) = VT_EMPTY; V_BSTR(&v) = (void*)0xdeadbeef; - hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + hr = ISAXXMLReader_getProperty(reader, L"xmldecl-version", &v); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); ok(V_BSTR(&v) == NULL, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); V_VT(&v) = VT_EMPTY; V_BSTR(&v) = (void*)0xdeadbeef; - hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-encoding"), &v); + hr = ISAXXMLReader_getProperty(reader, L"xmldecl-encoding", &v); todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); todo_wine @@ -4948,7 +4941,7 @@ static void test_saxreader_properties(void) V_VT(&v) = VT_EMPTY; V_BSTR(&v) = (void*)0xdeadbeef; - hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + hr = ISAXXMLReader_getProperty(reader, L"xmldecl-version", &v); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); ok(!lstrcmpW(V_BSTR(&v), L"1.0"), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); @@ -4962,7 +4955,7 @@ static void test_saxreader_properties(void) V_VT(&v) = VT_EMPTY; V_BSTR(&v) = (void*)0xdeadbeef; - hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-encoding"), &v); + hr = ISAXXMLReader_getProperty(reader, L"xmldecl-encoding", &v); todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (hr == S_OK) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml6/tests/saxreader.c | 74 +++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 70965a98728..2b6178a7560 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -839,7 +839,7 @@ static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface) static HRESULT WINAPI isaxattributes_getLength(ISAXAttributes* iface, int *length) { - *length = 3; + *length = 4; return S_OK; } @@ -871,12 +871,13 @@ static HRESULT WINAPI isaxattributes_getQName( { static const WCHAR attrqnamesW[][15] = {L"a:attr1junk", L"attr2junk", - L"attr3"}; - static const int attrqnamelen[] = {7, 5, 5}; + L"attr3", + L"attr4"}; + static const int attrqnamelen[] = {7, 5, 5, 5}; - ok(index >= 0 && index <= 2, "invalid index received %d\n", index); + ok(index >= 0 && index <= 3, "invalid index received %d\n", index); - if (index >= 0 && index <= 2) { + if (index >= 0 && index <= 3) { *QName = attrqnamesW[index]; *QNameLength = attrqnamelen[index]; } else { @@ -962,12 +963,13 @@ static HRESULT WINAPI isaxattributes_getValue(ISAXAttributes* iface, int index, { static const WCHAR attrvaluesW[][10] = {L"a1junk", L"a2junk", - L"<&\">'"}; - static const int attrvalueslen[] = {2, 2, 5}; + L"<&\">'", + L"a\rb\nc\r\n"}; + static const int attrvalueslen[] = {2, 2, 5, 7}; - ok(index >= 0 && index <= 2, "invalid index received %d\n", index); + ok(index >= 0 && index <= 3, "invalid index received %d\n", index); - if (index >= 0 && index <= 2) { + if (index >= 0 && index <= 3) { *value = attrvaluesW[index]; *nValue = attrvalueslen[index]; } else { @@ -1683,8 +1685,8 @@ struct writer_startendelement_t ISAXAttributes *attr; }; -static const WCHAR startelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\">"; -static const WCHAR startendelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\"/>"; +static const WCHAR startelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\" attr4=\"a b c \">"; +static const WCHAR startendelement_xml[] = L"<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&">\'\" attr4=\"a b c \"/>"; static const struct writer_startendelement_t writer_startendelement[] = { @@ -1764,6 +1766,7 @@ static void test_mxwriter_startendelement_batch(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); + todo_wine_if(i == 16 || i == 17 || i == 19) ok(!lstrcmpW(table->output, V_BSTR(&dest)), "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); @@ -2196,7 +2199,48 @@ static void test_mxwriter_characters(void) IVBSAXContentHandler_Release(vb_content); IMXWriter_Release(writer); - /* batch tests */ + /* Newlines in consecutive calls */ + hr = CoCreateInstance(&CLSID_MXXMLWriter60, NULL, CLSCTX_INPROC_SERVER, &IID_IMXWriter, (void **)&writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void **)&content); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMXWriter_put_omitXMLDeclaration(writer, VARIANT_TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXContentHandler_characters(content, L"ab\r", 3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXContentHandler_characters(content, L"\ncd", 3); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_get_output(writer, &dest); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&dest) == VT_BSTR, "Unexpected type %d.\n", V_VT(&dest)); + todo_wine + ok(!lstrcmpW(L"ab\r\n\r\ncd", V_BSTR(&dest)), "Unexpected content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + VariantClear(&dest); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_put_output(writer, dest); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = ISAXContentHandler_characters(content, L"\nab\rc\r\n", 7); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&dest) = VT_EMPTY; + hr = IMXWriter_get_output(writer, &dest); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&dest) == VT_BSTR, "Unexpected type %d.\n", V_VT(&dest)); + todo_wine + ok(!lstrcmpW(L"\r\nab\r\nc\r\n", V_BSTR(&dest)), "Unexpected content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + VariantClear(&dest); + + ISAXContentHandler_Release(content); + IMXWriter_Release(writer); + for (i = 0; i < ARRAY_SIZE(writer_characters); ++i) { const struct writer_characters_t *table = &writer_characters[i]; @@ -2801,6 +2845,9 @@ static void test_mxwriter_cdata(void) hr = ISAXContentHandler_characters(content, L"< > & \"", 7); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = ISAXContentHandler_characters(content, L"\na\rb\r\n", 6); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = ISAXLexicalHandler_endCDATA(lexical); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -2808,7 +2855,8 @@ static void test_mxwriter_cdata(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - ok(!lstrcmpW(L"<![CDATA[<![CDATA[< > & \"]]>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); + todo_wine + ok(!lstrcmpW(L"<![CDATA[<![CDATA[< > & \"\r\na\r\nb\r\n]]>", V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); ISAXContentHandler_Release(content); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/msxml_dispex.h | 2 + dlls/msxml3/mxwriter.c | 158 +++++++++++++++++----------------- dlls/msxml3/tests/saxreader.c | 3 - dlls/msxml6/tests/saxreader.c | 1 - 4 files changed, 83 insertions(+), 81 deletions(-) diff --git a/dlls/msxml3/msxml_dispex.h b/dlls/msxml3/msxml_dispex.h index e0020ec0bbf..62fa96bcfb2 100644 --- a/dlls/msxml3/msxml_dispex.h +++ b/dlls/msxml3/msxml_dispex.h @@ -19,6 +19,8 @@ #ifndef __MSXML_DISPEX__ #define __MSXML_DISPEX__ +#include <stdbool.h> + #include "dispex.h" #include "wine/list.h" diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index ad6419d0a75..f766aa85955 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -318,7 +318,7 @@ static HRESULT write_output_buffer(mxwriter *writer, const WCHAR *data, int len) ULONG written; int src_len; - if (!len || !*data) + if (!len) return S_OK; src_len = len == -1 ? lstrlenW(data) : len; @@ -477,76 +477,92 @@ static void close_output_buffer(mxwriter *writer) list_init(&writer->buffer.blocks); } -/* Escapes special characters like: +/* + Special characters are escaped: + '<' -> "<" '&' -> "&" '"' -> """ '>' -> ">" - On call 'len' contains a length of 'str' in chars or -1 if it's null terminated. - After a call it's updated with actual new length if it wasn't -1 initially. + Newlines always produce CRLF. + */ -static WCHAR *get_escaped_string(const WCHAR *str, escape_mode mode, int *len) + +static void write_crlf(mxwriter *writer) { - static const WCHAR ltW[] = {'&','l','t',';'}; - static const WCHAR ampW[] = {'&','a','m','p',';'}; - static const WCHAR equotW[] = {'&','q','u','o','t',';'}; - static const WCHAR gtW[] = {'&','g','t',';'}; + bool use_charref_lf = writer->class_version == MSXML6; - const int default_alloc = 100; - const int grow_thresh = 10; - int p = *len, conv_len; - WCHAR *ptr, *ret; + if (use_charref_lf) + write_output_buffer(writer, L" ", 5); + else + write_output_buffer(writer, L"\r\n", 2); +} - /* default buffer size to something if length is unknown */ - conv_len = max(2**len, default_alloc); - ptr = ret = malloc(conv_len * sizeof(WCHAR)); +static void write_escaped_string(mxwriter *writer, const WCHAR *str, int len, escape_mode mode) +{ + const WCHAR *p = str; - while (p) + while (len-- > 0) { - if (ptr - ret > conv_len - grow_thresh) + if (*p == '<') + write_output_buffer(writer, L"<", 4); + else if (*p == '&') + write_output_buffer(writer, L"&", 5); + else if (*p == '>') + write_output_buffer(writer, L">", 4); + else if (*p == '"' && mode == EscapeValue) + write_output_buffer(writer, L""", 6); + else if (*p == '\n') + write_crlf(writer); + else if (*p == '\r') { - int written = ptr - ret; - conv_len *= 2; - ptr = ret = realloc(ret, conv_len * sizeof(WCHAR)); - ptr += written; - } + if (len > 0 && p[1] == '\n') + { + write_crlf(writer); - switch (*str) - { - case '<': - memcpy(ptr, ltW, sizeof(ltW)); - ptr += ARRAY_SIZE(ltW); - break; - case '&': - memcpy(ptr, ampW, sizeof(ampW)); - ptr += ARRAY_SIZE(ampW); - break; - case '>': - memcpy(ptr, gtW, sizeof(gtW)); - ptr += ARRAY_SIZE(gtW); - break; - case '"': - if (mode == EscapeValue) + ++p; + --len; + } + else { - memcpy(ptr, equotW, sizeof(equotW)); - ptr += ARRAY_SIZE(equotW); - break; + write_crlf(writer); } - /* fallthrough for text mode */ - default: - *ptr++ = *str; - break; } + else + write_output_buffer(writer, p, 1); - str++; - p--; + ++p; } +} + +static void write_string_with_crlf(mxwriter *writer, const WCHAR *str, int len) +{ + const WCHAR *p = str; + + while (len-- > 0) + { + if (*p == '\n') + write_crlf(writer); + else if (*p == '\r') + { + if (len > 0 && p[1] == '\n') + { + write_crlf(writer); - *len = ptr-ret; - *++ptr = 0; + ++p; + --len; + } + else + { + write_crlf(writer); + } + } + else + write_output_buffer(writer, p, 1); - return ret; + ++p; + } } static void write_prolog_buffer(mxwriter *writer) @@ -1254,14 +1270,12 @@ static void mxwriter_write_attribute(mxwriter *writer, const WCHAR *qname, int q write_output_buffer(writer, qname, qname_len); write_output_buffer(writer, eqW, 1); + write_output_buffer(writer, L"\"", 1); if (escape) - { - WCHAR *escaped = get_escaped_string(value, EscapeValue, &value_len); - write_output_buffer_quoted(writer, escaped, value_len); - free(escaped); - } + write_escaped_string(writer, value, value_len, EscapeValue); else - write_output_buffer_quoted(writer, value, value_len); + write_string_with_crlf(writer, value, value_len); + write_output_buffer(writer, L"\"", 1); } static void mxwriter_write_starttag(mxwriter *writer, const WCHAR *qname, int len) @@ -1369,36 +1383,26 @@ static HRESULT WINAPI SAXContentHandler_endElement( return S_OK; } -static HRESULT WINAPI SAXContentHandler_characters( - ISAXContentHandler *iface, - const WCHAR *chars, - int nchars) +static HRESULT WINAPI SAXContentHandler_characters(ISAXContentHandler *iface, const WCHAR *chars, int nchars) { - mxwriter *This = impl_from_ISAXContentHandler( iface ); + mxwriter *writer = impl_from_ISAXContentHandler(iface); - TRACE("(%p)->(%s:%d)\n", This, debugstr_wn(chars, nchars), nchars); + TRACE("%p, %s, %d.\n", iface, debugstr_wn(chars, nchars), nchars); if (!chars) return E_INVALIDARG; - close_element_starttag(This); - set_element_name(This, NULL, 0); + close_element_starttag(writer); + set_element_name(writer, NULL, 0); - if (!This->cdata) - This->text = TRUE; + if (!writer->cdata) + writer->text = TRUE; if (nchars) { - if (This->cdata || This->props[MXWriter_DisableEscaping] == VARIANT_TRUE) - write_output_buffer(This, chars, nchars); + if (writer->cdata || writer->props[MXWriter_DisableEscaping] == VARIANT_TRUE) + write_output_buffer(writer, chars, nchars); else - { - int len = nchars; - WCHAR *escaped; - - escaped = get_escaped_string(chars, EscapeText, &len); - write_output_buffer(This, escaped, len); - free(escaped); - } + write_escaped_string(writer, chars, nchars, EscapeText); } return S_OK; diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 1337b3faab8..f5f998fbfec 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -4089,7 +4089,6 @@ static void test_mxwriter_startendelement_batch(const struct writer_startendelem hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - todo_wine_if((i >= 48 && i <= 53) || (i >= 57 && i <= 59)) ok(!lstrcmpW(table->output, V_BSTR(&dest)), "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); @@ -4571,7 +4570,6 @@ static void test_mxwriter_characters(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "Unexpected type %d.\n", V_VT(&dest)); - todo_wine ok(!lstrcmpW(L"ab\r\n\r\ncd", V_BSTR(&dest)), "Unexpected content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); @@ -4586,7 +4584,6 @@ static void test_mxwriter_characters(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "Unexpected type %d.\n", V_VT(&dest)); - todo_wine ok(!lstrcmpW(L"\r\nab\r\nc\r\n", V_BSTR(&dest)), "Unexpected content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest); diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 2b6178a7560..39498f553c3 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -1766,7 +1766,6 @@ static void test_mxwriter_startendelement_batch(void) hr = IMXWriter_get_output(writer, &dest); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest)); - todo_wine_if(i == 16 || i == 17 || i == 19) ok(!lstrcmpW(table->output, V_BSTR(&dest)), "test %d: got wrong content %s, expected %s\n", i, wine_dbgstr_w(V_BSTR(&dest)), wine_dbgstr_w(table->output)); VariantClear(&dest); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10157
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)