Nikolay Sivov : xmllite/writer: Fix empty element and state handling in WriteElementString().

Alexandre Julliard julliard at winehq.org
Mon Jul 24 15:51:19 CDT 2017


Module: wine
Branch: master
Commit: 5f4ed88ee8eb162c0e3af5044e0450e927226ab1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5f4ed88ee8eb162c0e3af5044e0450e927226ab1

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Jul 23 14:55:44 2017 +0300

xmllite/writer: Fix empty element and state handling in WriteElementString().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/xmllite/tests/writer.c | 82 +++++++++++++++++++++++++++------------------
 dlls/xmllite/writer.c       | 26 +++++++-------
 2 files changed, 64 insertions(+), 44 deletions(-)

diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c
index 89fdb4e..6408b54 100644
--- a/dlls/xmllite/tests/writer.c
+++ b/dlls/xmllite/tests/writer.c
@@ -67,6 +67,14 @@ static void check_output(IStream *stream, const char *expected, BOOL todo, int l
 #define CHECK_OUTPUT(stream, expected) check_output(stream, expected, FALSE, __LINE__)
 #define CHECK_OUTPUT_TODO(stream, expected) check_output(stream, expected, TRUE, __LINE__)
 
+static void writer_set_property(IXmlWriter *writer, XmlWriterProperty property)
+{
+    HRESULT hr;
+
+    hr = IXmlWriter_SetProperty(writer, property, TRUE);
+    ok(hr == S_OK, "Failed to set writer property, hr %#x.\n", hr);
+}
+
 /* used to test all Write* methods for consistent error state */
 static void check_writer_state(IXmlWriter *writer, HRESULT exp_hr)
 {
@@ -475,8 +483,7 @@ static void test_omitxmldeclaration(void)
 
     stream = writer_set_output(writer);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
 
     hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Yes);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -557,8 +564,7 @@ static void test_bom(void)
     hr = CreateXmlWriter(&IID_IXmlWriter, (void**)&writer, NULL);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
 
     hr = IXmlWriter_SetOutput(writer, output);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -664,7 +670,6 @@ static void test_bom(void)
 static void test_writestartelement(void)
 {
     static const WCHAR valueW[] = {'v','a','l','u','e',0};
-    static const char *str = "<a><b>value</b>";
     static const WCHAR aW[] = {'a',0};
     static const WCHAR bW[] = {'b',0};
     IXmlWriter *writer;
@@ -726,10 +731,14 @@ static void test_writestartelement(void)
     hr = IXmlWriter_WriteElementString(writer, NULL, bW, NULL, valueW);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
+    hr = IXmlWriter_WriteElementString(writer, NULL, bW, NULL, NULL);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
     hr = IXmlWriter_Flush(writer);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
-    CHECK_OUTPUT(stream, str);
+    CHECK_OUTPUT(stream,
+        "<a><b>value</b><b />");
 
     IStream_Release(stream);
     IXmlWriter_Release(writer);
@@ -840,8 +849,7 @@ static void test_WriteComment(void)
     hr = CreateXmlWriter(&IID_IXmlWriter, (void**)&writer, NULL);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
 
     hr = IXmlWriter_WriteComment(writer, aW);
     ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr);
@@ -888,8 +896,7 @@ static void test_WriteCData(void)
     hr = CreateXmlWriter(&IID_IXmlWriter, (void**)&writer, NULL);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
 
     hr = IXmlWriter_WriteCData(writer, aW);
     ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr);
@@ -1087,11 +1094,8 @@ static void test_indentation(void)
 
     stream = writer_set_output(writer);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
-
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_Indent, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
+    writer_set_property(writer, XmlWriterProperty_Indent);
 
     hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -1117,8 +1121,31 @@ static void test_indentation(void)
         "  <b />\r\n"
         "</a>");
 
-    IXmlWriter_Release(writer);
     IStream_Release(stream);
+
+    /* WriteElementString */
+    stream = writer_set_output(writer);
+
+    hr = IXmlWriter_WriteStartElement(writer, NULL, aW, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IXmlWriter_WriteElementString(writer, NULL, bW, NULL, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IXmlWriter_WriteEndElement(writer);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IXmlWriter_Flush(writer);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    CHECK_OUTPUT_TODO(stream,
+        "<a>\r\n"
+        "  <b />\r\n"
+        "</a>");
+
+    IStream_Release(stream);
+
+    IXmlWriter_Release(writer);
 }
 
 static void test_WriteAttributeString(void)
@@ -1139,8 +1166,7 @@ static void test_WriteAttributeString(void)
 
     stream = writer_set_output(writer);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
 
     hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -1219,11 +1245,8 @@ static void test_WriteFullEndElement(void)
     /* standalone element */
     stream = writer_set_output(writer);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
-
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_Indent, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
+    writer_set_property(writer, XmlWriterProperty_Indent);
 
     hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -1247,11 +1270,8 @@ static void test_WriteFullEndElement(void)
     /* nested elements */
     stream = writer_set_output(writer);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
-
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_Indent, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
+    writer_set_property(writer, XmlWriterProperty_Indent);
 
     hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -1293,8 +1313,7 @@ static void test_WriteCharEntity(void)
     /* without indentation */
     stream = writer_set_output(writer);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
 
     hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -1334,8 +1353,7 @@ static void test_WriteString(void)
     hr = CreateXmlWriter(&IID_IXmlWriter, (void**)&writer, NULL);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
-    hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE);
-    ok(hr == S_OK, "got 0x%08x\n", hr);
+    writer_set_property(writer, XmlWriterProperty_OmitXmlDeclaration);
 
     hr = IXmlWriter_WriteString(writer, aW);
     ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr);
diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c
index b0e16c0..ba0c60a 100644
--- a/dlls/xmllite/writer.c
+++ b/dlls/xmllite/writer.c
@@ -40,6 +40,7 @@ DEFINE_GUID(IID_IXmlWriterOutput, 0xc1131708, 0x0f59, 0x477f, 0x93, 0x59, 0x7d,
 #define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0]))
 
 static const WCHAR closeelementW[] = {'<','/'};
+static const WCHAR closetagW[] = {' ','/','>'};
 static const WCHAR closepiW[] = {'?','>'};
 static const WCHAR ltW[] = {'<'};
 static const WCHAR gtW[] = {'>'};
@@ -835,26 +836,27 @@ static HRESULT WINAPI xmlwriter_WriteElementString(IXmlWriter *iface, LPCWSTR pr
     case XmlWriterState_ElemStarted:
         writer_close_starttag(This);
         break;
-    case XmlWriterState_Ready:
-    case XmlWriterState_DocStarted:
-    case XmlWriterState_PIDocStarted:
-        break;
-    default:
-        This->state = XmlWriterState_DocClosed;
+    case XmlWriterState_DocClosed:
         return WR_E_INVALIDACTION;
+    default:
+        ;
     }
 
     write_encoding_bom(This);
     write_output_buffer(This->output, ltW, ARRAY_SIZE(ltW));
     write_output_qname(This->output, prefix, local_name);
-    write_output_buffer(This->output, gtW, ARRAY_SIZE(gtW));
 
     if (value)
+    {
+        write_output_buffer(This->output, gtW, ARRAY_SIZE(gtW));
         write_output_buffer(This->output, value, -1);
+        write_output_buffer(This->output, closeelementW, ARRAY_SIZE(closeelementW));
+        write_output_qname(This->output, prefix, local_name);
+        write_output_buffer(This->output, gtW, ARRAY_SIZE(gtW));
+    }
+    else
+        write_output_buffer(This->output, closetagW, ARRAY_SIZE(closetagW));
 
-    write_output_buffer(This->output, closeelementW, ARRAY_SIZE(closeelementW));
-    write_output_qname(This->output, prefix, local_name);
-    write_output_buffer(This->output, gtW, ARRAY_SIZE(gtW));
     This->state = XmlWriterState_Content;
 
     return S_OK;
@@ -911,8 +913,8 @@ static HRESULT WINAPI xmlwriter_WriteEndElement(IXmlWriter *iface)
 
     writer_dec_indent(This);
 
-    if (This->starttagopen) {
-        static WCHAR closetagW[] = {' ','/','>'};
+    if (This->starttagopen)
+    {
         write_output_buffer(This->output, closetagW, ARRAY_SIZE(closetagW));
         This->starttagopen = FALSE;
     }




More information about the wine-cvs mailing list