[PATCH 4/4] xmllite/writer: Make it possible to use WriteRaw() multiple times

Nikolay Sivov nsivov at codeweavers.com
Thu Mar 24 02:41:26 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/xmllite/tests/writer.c | 15 ++++++++++++++-
 dlls/xmllite/writer.c       | 18 +++++++++++-------
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c
index 7a958b3..b4d7102 100644
--- a/dlls/xmllite/tests/writer.c
+++ b/dlls/xmllite/tests/writer.c
@@ -863,6 +863,7 @@ static void test_WriteCData(void)
 static void test_WriteRaw(void)
 {
     static const WCHAR rawW[] = {'a','<',':',0};
+    static const WCHAR aW[] = {'a',0};
     IXmlWriter *writer;
     IStream *stream;
     HRESULT hr;
@@ -884,6 +885,18 @@ static void test_WriteRaw(void)
     hr = IXmlWriter_WriteRaw(writer, rawW);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
+    hr = IXmlWriter_WriteRaw(writer, rawW);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXmlWriter_WriteComment(writer, rawW);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXmlWriter_WriteRaw(writer, rawW);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXmlWriter_WriteElementString(writer, NULL, aW, NULL, aW);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
     hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Yes);
     ok(hr == WR_E_INVALIDACTION, "got 0x%08x\n", hr);
 
@@ -899,7 +912,7 @@ static void test_WriteRaw(void)
     hr = IXmlWriter_Flush(writer);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
-    CHECK_OUTPUT(stream, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>a<:");
+    CHECK_OUTPUT(stream, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>a<:a<:<!--a<:-->a<:<a>a</a>");
 
     IXmlWriter_Release(writer);
     IStream_Release(stream);
diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c
index 61190c6..65d0bcc 100644
--- a/dlls/xmllite/writer.c
+++ b/dlls/xmllite/writer.c
@@ -767,10 +767,13 @@ static HRESULT WINAPI xmlwriter_WriteElementString(IXmlWriter *iface, LPCWSTR pr
     case XmlWriterState_ElemStarted:
         writer_close_starttag(This);
         break;
-    case XmlWriterState_DocClosed:
-        return WR_E_INVALIDACTION;
+    case XmlWriterState_Ready:
+    case XmlWriterState_DocStarted:
+    case XmlWriterState_PIDocStarted:
+        break;
     default:
-        ;
+        This->state = XmlWriterState_DocClosed;
+        return WR_E_INVALIDACTION;
     }
 
     write_encoding_bom(This);
@@ -1043,11 +1046,11 @@ static HRESULT WINAPI xmlwriter_WriteRaw(IXmlWriter *iface, LPCWSTR data)
     case XmlWriterState_PIDocStarted:
         break;
     default:
+        This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
     }
 
     write_output_buffer(This->output, data, -1);
-    This->state = XmlWriterState_DocClosed;
     return S_OK;
 }
 
@@ -1086,6 +1089,7 @@ static HRESULT WINAPI xmlwriter_WriteStartDocument(IXmlWriter *iface, XmlStandal
     case XmlWriterState_Ready:
         break;
     default:
+        This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
     }
 
@@ -1099,6 +1103,9 @@ static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR pre
 
     TRACE("(%p)->(%s %s %s)\n", This, wine_dbgstr_w(prefix), wine_dbgstr_w(local_name), wine_dbgstr_w(uri));
 
+    if (!local_name)
+        return E_INVALIDARG;
+
     switch (This->state)
     {
     case XmlWriterState_Initial:
@@ -1109,9 +1116,6 @@ static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR pre
         ;
     }
 
-    if (!local_name)
-        return E_INVALIDARG;
-
     /* close pending element */
     if (This->starttagopen)
         write_output_buffer(This->output, gtW, ARRAY_SIZE(gtW));
-- 
2.8.0.rc3




More information about the wine-patches mailing list