From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/xmllite/tests/writer.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c index 0a080468616..4813caa2464 100644 --- a/dlls/xmllite/tests/writer.c +++ b/dlls/xmllite/tests/writer.c @@ -3149,6 +3149,10 @@ static void test_WriteNmToken(void) hr = IXmlWriter_WriteNmToken(writer, L"token"); ok(hr == WR_E_INVALIDACTION, "Unexpected hr %#lx.\n", hr);
+ hr = IXmlWriter_WriteNmToken(writer, L"@"); + todo_wine + ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr); + IStream_Release(stream); stream = writer_set_output(writer);
@@ -3164,11 +3168,19 @@ static void test_WriteNmToken(void) todo_wine ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr);
+ hr = IXmlWriter_WriteNmToken(writer, L"na me"); + todo_wine + ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr); + + hr = IXmlWriter_WriteNmToken(writer, L":-._"); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXmlWriter_Flush(writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- CHECK_OUTPUT(stream, - "<a"); + CHECK_OUTPUT_TODO(stream, + "<a>:-._");
IStream_Release(stream); stream = writer_set_output(writer); @@ -3189,6 +3201,10 @@ static void test_WriteNmToken(void) hr = IXmlWriter_WriteNmToken(writer, L"name"); ok(hr == WR_E_INVALIDACTION, "Unexpected hr %#lx.\n", hr);
+ hr = IXmlWriter_WriteNmToken(writer, L"na me"); + todo_wine + ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr); + hr = IXmlWriter_Flush(writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: David Kahurani k.kahurani@gmail.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/xmllite/tests/writer.c | 22 ++++++++++++------- dlls/xmllite/writer.c | 42 +++++++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 14 deletions(-)
diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c index 4813caa2464..30834b2b775 100644 --- a/dlls/xmllite/tests/writer.c +++ b/dlls/xmllite/tests/writer.c @@ -3137,15 +3137,19 @@ static void test_WriteNmToken(void) ok(hr == E_UNEXPECTED, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_WriteNmToken(writer, L""); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_WriteNmToken(writer, NULL); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
stream = writer_set_output(writer);
+ hr = IXmlWriter_WriteNmToken(writer, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = IXmlWriter_WriteNmToken(writer, L""); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = IXmlWriter_WriteNmToken(writer, L"token"); ok(hr == WR_E_INVALIDACTION, "Unexpected hr %#lx.\n", hr);
@@ -3165,21 +3169,18 @@ static void test_WriteNmToken(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_WriteNmToken(writer, L"na@me"); - todo_wine ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_WriteNmToken(writer, L"na me"); - todo_wine ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_WriteNmToken(writer, L":-._"); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_Flush(writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- CHECK_OUTPUT_TODO(stream, + CHECK_OUTPUT(stream, "<a>:-._");
IStream_Release(stream); @@ -3192,7 +3193,6 @@ static void test_WriteNmToken(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_WriteNmToken(writer, L"na:me:x"); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IXmlWriter_WriteEndDocument(writer); @@ -3205,10 +3205,16 @@ static void test_WriteNmToken(void) todo_wine ok(hr == WC_E_NAMECHARACTER, "Unexpected hr %#lx.\n", hr);
+ hr = IXmlWriter_WriteNmToken(writer, L""); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = IXmlWriter_WriteNmToken(writer, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = IXmlWriter_Flush(writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- CHECK_OUTPUT_TODO(stream, + CHECK_OUTPUT(stream, "<a>na:me:x</a>");
IStream_Release(stream); diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index 128d666e82c..b77f3faff94 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -366,6 +366,26 @@ static HRESULT is_valid_ncname(const WCHAR *str, int *out) return S_OK; }
+static BOOL is_valid_nmtoken(const WCHAR *str, unsigned int *out) +{ + unsigned int len = 0; + + *out = 0; + + while (is_namechar(*str)) + { + str++; + len++; + } + + if (*str) + return FALSE; + + *out = len; + + return TRUE; +} + static HRESULT is_valid_name(const WCHAR *str, unsigned int *out) { unsigned int len = 1; @@ -1564,27 +1584,37 @@ static HRESULT WINAPI xmlwriter_WriteName(IXmlWriter *iface, LPCWSTR pwszName) return E_NOTIMPL; }
-static HRESULT WINAPI xmlwriter_WriteNmToken(IXmlWriter *iface, LPCWSTR pwszNmToken) +static HRESULT WINAPI xmlwriter_WriteNmToken(IXmlWriter *iface, const WCHAR *nmtoken) { - xmlwriter *This = impl_from_IXmlWriter(iface); + xmlwriter *writer = impl_from_IXmlWriter(iface); + unsigned int len;
- FIXME("%p %s\n", This, wine_dbgstr_w(pwszNmToken)); + TRACE("%p, %s\n", iface, wine_dbgstr_w(nmtoken));
- switch (This->state) + if (is_empty_string(nmtoken)) + return E_INVALIDARG; + + 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: + writer_close_starttag(writer); + break; default: ; }
- return E_NOTIMPL; + if (!is_valid_nmtoken(nmtoken, &len)) + return WC_E_NAMECHARACTER; + + return write_output_buffer(writer->output, nmtoken, len); }
static HRESULT writer_write_node(IXmlWriter *writer, IXmlReader *reader, BOOL shallow, BOOL write_default_attributes)
This merge request was approved by Nikolay Sivov.