Commit 3cd0bfd4 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

xmllite/writer: Handle empty local name in WriteAttributeString().

parent 538bc11b
...@@ -1580,8 +1580,8 @@ static void test_WriteAttributeString(void) ...@@ -1580,8 +1580,8 @@ static void test_WriteAttributeString(void)
{ NULL, NULL, L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG }, { NULL, NULL, L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG },
{ L"", L"a", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", WR_E_XMLNSPREFIXDECLARATION, 1, 1, 1 }, { L"", L"a", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", WR_E_XMLNSPREFIXDECLARATION, 1, 1, 1 },
{ L"", NULL, L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG }, { L"", NULL, L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG },
{ L"", L"", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG, 1, 1, 1 }, { L"", L"", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG },
{ NULL, L"", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG, 1, 1, 1 }, { NULL, L"", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG },
{ L"prefix", L"a", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", WR_E_XMLNSURIDECLARATION, 1, 1, 1 }, { L"prefix", L"a", L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", WR_E_XMLNSURIDECLARATION, 1, 1, 1 },
{ L"prefix", NULL, L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG }, { L"prefix", NULL, L"http://www.w3.org/2000/xmlns/", L"defuri", "<e />", "<e", E_INVALIDARG },
{ L"prefix", NULL, NULL, L"b", "<e />", "<e", E_INVALIDARG }, { L"prefix", NULL, NULL, L"b", "<e />", "<e", E_INVALIDARG },
...@@ -1619,6 +1619,8 @@ static void test_WriteAttributeString(void) ...@@ -1619,6 +1619,8 @@ static void test_WriteAttributeString(void)
for (i = 0; i < ARRAY_SIZE(attribute_tests); ++i) for (i = 0; i < ARRAY_SIZE(attribute_tests); ++i)
{ {
winetest_push_context("Test %u", i);
stream = writer_set_output(writer); stream = writer_set_output(writer);
hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit); hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
...@@ -1630,7 +1632,7 @@ static void test_WriteAttributeString(void) ...@@ -1630,7 +1632,7 @@ static void test_WriteAttributeString(void)
hr = IXmlWriter_WriteAttributeString(writer, attribute_tests[i].prefix, attribute_tests[i].local, hr = IXmlWriter_WriteAttributeString(writer, attribute_tests[i].prefix, attribute_tests[i].local,
attribute_tests[i].uri, attribute_tests[i].value); attribute_tests[i].uri, attribute_tests[i].value);
todo_wine_if(attribute_tests[i].todo_hr) todo_wine_if(attribute_tests[i].todo_hr)
ok(hr == attribute_tests[i].hr, "%u: unexpected hr %#lx, expected %#lx.\n", i, hr, attribute_tests[i].hr); ok(hr == attribute_tests[i].hr, "Unexpected hr %#lx, expected %#lx.\n", hr, attribute_tests[i].hr);
hr = IXmlWriter_Flush(writer); hr = IXmlWriter_Flush(writer);
ok(hr == S_OK, "Failed to flush, hr %#lx.\n", hr); ok(hr == S_OK, "Failed to flush, hr %#lx.\n", hr);
...@@ -1645,6 +1647,8 @@ static void test_WriteAttributeString(void) ...@@ -1645,6 +1647,8 @@ static void test_WriteAttributeString(void)
check_output(stream, attribute_tests[i].output, attribute_tests[i].todo, __LINE__); check_output(stream, attribute_tests[i].output, attribute_tests[i].todo, __LINE__);
IStream_Release(stream); IStream_Release(stream);
winetest_pop_context();
} }
/* With namespaces */ /* With namespaces */
......
...@@ -912,21 +912,21 @@ static BOOL is_valid_xml_space_value(const WCHAR *value) ...@@ -912,21 +912,21 @@ static BOOL is_valid_xml_space_value(const WCHAR *value)
static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR prefix, static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR prefix,
LPCWSTR local, LPCWSTR uri, LPCWSTR value) LPCWSTR local, LPCWSTR uri, LPCWSTR value)
{ {
xmlwriter *This = impl_from_IXmlWriter(iface); xmlwriter *writer = impl_from_IXmlWriter(iface);
BOOL is_xmlns_prefix, is_xmlns_local; BOOL is_xmlns_prefix, is_xmlns_local;
int prefix_len, local_len; int prefix_len, local_len;
struct ns *ns; struct ns *ns;
HRESULT hr; HRESULT hr;
TRACE("%p %s %s %s %s\n", This, debugstr_w(prefix), debugstr_w(local), debugstr_w(uri), debugstr_w(value)); TRACE("%p, %s, %s, %s, %s.\n", iface, debugstr_w(prefix), debugstr_w(local), debugstr_w(uri), debugstr_w(value));
switch (This->state) switch (writer->state)
{ {
case XmlWriterState_Initial: case XmlWriterState_Initial:
return E_UNEXPECTED; return E_UNEXPECTED;
case XmlWriterState_Ready: case XmlWriterState_Ready:
case XmlWriterState_DocClosed: case XmlWriterState_DocClosed:
This->state = XmlWriterState_DocClosed; writer->state = XmlWriterState_DocClosed;
return WR_E_INVALIDACTION; return WR_E_INVALIDACTION;
case XmlWriterState_InvalidEncoding: case XmlWriterState_InvalidEncoding:
return MX_E_ENCODING; return MX_E_ENCODING;
...@@ -939,7 +939,7 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR ...@@ -939,7 +939,7 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
if (is_xmlns_prefix && is_empty_string(uri) && is_empty_string(local)) if (is_xmlns_prefix && is_empty_string(uri) && is_empty_string(local))
return WR_E_NSPREFIXDECLARED; return WR_E_NSPREFIXDECLARED;
if (!local) if (is_empty_string(local))
return E_INVALIDARG; return E_INVALIDARG;
/* Validate prefix and local name */ /* Validate prefix and local name */
...@@ -954,7 +954,7 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR ...@@ -954,7 +954,7 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
/* Trivial case, no prefix. */ /* Trivial case, no prefix. */
if (prefix_len == 0 && is_empty_string(uri)) if (prefix_len == 0 && is_empty_string(uri))
{ {
write_output_attribute(This, prefix, prefix_len, local, local_len, value); write_output_attribute(writer, prefix, prefix_len, local, local_len, value);
return S_OK; return S_OK;
} }
...@@ -969,7 +969,7 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR ...@@ -969,7 +969,7 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
if (!is_empty_string(uri)) if (!is_empty_string(uri))
return WR_E_XMLPREFIXDECLARATION; return WR_E_XMLPREFIXDECLARATION;
write_output_attribute(This, prefix, prefix_len, local, local_len, value); write_output_attribute(writer, prefix, prefix_len, local, local_len, value);
return S_OK; return S_OK;
} }
...@@ -980,11 +980,11 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR ...@@ -980,11 +980,11 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
return WR_E_XMLNSPREFIXDECLARATION; return WR_E_XMLNSPREFIXDECLARATION;
/* Look for exact match defined in current element, and write it out. */ /* Look for exact match defined in current element, and write it out. */
if (!(ns = writer_find_ns_current(This, prefix, value))) if (!(ns = writer_find_ns_current(writer, prefix, value)))
ns = writer_push_ns(This, local, local_len, value); ns = writer_push_ns(writer, local, local_len, value);
ns->emitted = TRUE; ns->emitted = TRUE;
write_output_attribute(This, L"xmlns", 5, local, local_len, value); write_output_attribute(writer, L"xmlns", 5, local, local_len, value);
return S_OK; return S_OK;
} }
...@@ -992,11 +992,11 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR ...@@ -992,11 +992,11 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
/* Ignore prefix if URI wasn't specified. */ /* Ignore prefix if URI wasn't specified. */
if (is_xmlns_local && is_empty_string(uri)) if (is_xmlns_local && is_empty_string(uri))
{ {
write_output_attribute(This, NULL, 0, L"xmlns", 5, value); write_output_attribute(writer, NULL, 0, L"xmlns", 5, value);
return S_OK; return S_OK;
} }
if (!(ns = writer_find_ns(This, prefix, uri))) if (!(ns = writer_find_ns(writer, prefix, uri)))
{ {
if (is_empty_string(prefix) && !is_empty_string(uri)) if (is_empty_string(prefix) && !is_empty_string(uri))
{ {
...@@ -1004,13 +1004,13 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR ...@@ -1004,13 +1004,13 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
return E_NOTIMPL; return E_NOTIMPL;
} }
if (!is_empty_string(uri)) if (!is_empty_string(uri))
ns = writer_push_ns(This, prefix, prefix_len, uri); ns = writer_push_ns(writer, prefix, prefix_len, uri);
} }
if (ns) if (ns)
write_output_attribute(This, ns->prefix, ns->prefix_len, local, local_len, value); write_output_attribute(writer, ns->prefix, ns->prefix_len, local, local_len, value);
else else
write_output_attribute(This, prefix, prefix_len, local, local_len, value); write_output_attribute(writer, prefix, prefix_len, local, local_len, value);
return S_OK; return S_OK;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment