From: David Kahurani k.kahurani@gmail.com
Signed-off-by: Nikolay Sivov nsivov@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)