From: David Kahurani <k.kahurani(a)gmail.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/xmllite/tests/writer.c | 14 ++++----- dlls/xmllite/writer.c | 62 +++++++++++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 13 deletions(-) diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c index c109fedb072..760029ee670 100644 --- a/dlls/xmllite/tests/writer.c +++ b/dlls/xmllite/tests/writer.c @@ -3037,11 +3037,9 @@ static void test_WriteName(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteName(writer, L""); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteName(writer, NULL); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteName(writer, L"name"); @@ -3063,7 +3061,12 @@ static void test_WriteName(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteName(writer, L"a:a:a"); - todo_wine + ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr); + + hr = IXmlWriter_WriteName(writer, L".a"); + ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr); + + hr = IXmlWriter_WriteName(writer, L":a"); ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_Flush(writer); @@ -3085,7 +3088,6 @@ static void test_WriteName(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteName(writer, L"name"); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteFullEndElement(writer); @@ -3095,7 +3097,6 @@ static void test_WriteName(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteName(writer, L"ab:name"); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteEndDocument(writer); @@ -3104,7 +3105,7 @@ static void test_WriteName(void) hr = IXmlWriter_Flush(writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - CHECK_OUTPUT_TODO(stream, + CHECK_OUTPUT(stream, "<root><a>name</a><b>ab:name</b></root>"); IStream_Release(stream); @@ -3117,7 +3118,6 @@ static void test_WriteName(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_WriteName(writer, L""); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); hr = IXmlWriter_Flush(writer); diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index be9666d6fd3..e39255b99d7 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -433,6 +433,45 @@ static HRESULT is_valid_name(const WCHAR *str, unsigned int *out) return S_OK; } +static HRESULT is_valid_qname(const WCHAR *str, unsigned int *out) +{ + int len = 1; + + *out = 0; + + if (!is_ncnamestartchar(*str++)) + return WC_E_NAMECHARACTER; + + while (*str && is_ncnamechar(*str)) + { + len++; + str++; + } + + if (!*str) + { + *out = len; + return S_OK; + } + + if (*str && *str != ':') + return WC_E_NAMECHARACTER; + str++; + len++; + + while (*str && is_ncnamechar(*str)) + { + len++; + str++; + } + + if (*str) + return WC_E_NAMECHARACTER; + + *out = len; + return S_OK; +} + static HRESULT is_valid_pubid(const WCHAR *str, unsigned int *out) { unsigned int len = 0; @@ -1655,27 +1694,38 @@ static HRESULT WINAPI xmlwriter_WriteFullEndElement(IXmlWriter *iface) return hr; } -static HRESULT WINAPI xmlwriter_WriteName(IXmlWriter *iface, LPCWSTR pwszName) +static HRESULT WINAPI xmlwriter_WriteName(IXmlWriter *iface, const WCHAR *name) { - xmlwriter *This = impl_from_IXmlWriter(iface); + xmlwriter *writer = impl_from_IXmlWriter(iface); + unsigned int name_len; + HRESULT hr; - FIXME("%p %s\n", This, wine_dbgstr_w(pwszName)); + TRACE("%p, %s.\n", iface, wine_dbgstr_w(name)); + + if (is_empty_string(name)) + return E_INVALIDARG; + + if (FAILED(hr = is_valid_qname(name, &name_len))) + return hr; - switch (This->state) + switch (writer->state) { case XmlWriterState_Initial: return E_UNEXPECTED; case XmlWriterState_Ready: case XmlWriterState_DocClosed: - This->state = XmlWriterState_DocClosed; + writer->state = XmlWriterState_DocClosed; return WR_E_INVALIDACTION; case XmlWriterState_InvalidEncoding: return MX_E_ENCODING; + case XmlWriterState_ElemStarted: + hr = writer_close_starttag(writer); + break; default: ; } - return E_NOTIMPL; + return write_output(writer, name, name_len, &hr); } static HRESULT WINAPI xmlwriter_WriteNmToken(IXmlWriter *iface, const WCHAR *nmtoken) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9076