[XMLLITE] Sync with Wine Staging 2.16. CORE-13762
authorAmine Khaldi <amine.khaldi@reactos.org>
Sun, 24 Sep 2017 11:18:39 +0000 (11:18 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sun, 24 Sep 2017 11:18:39 +0000 (11:18 +0000)
49a57bc xmllite/writer: Improve handling of the output with invalid encoding.
a6d6beb xmllite/writer: Do not indent after just BOM has been written.
5773a5d xmllite/writer: Fix indentation on WriteElementString().
5f4ed88 xmllite/writer: Fix empty element and state handling in WriteElementString().
b06dd7d xmllite/reader: Added a helper for setting current attribute cursor.
be56791 xmllite/reader: Implement MoveToAttributeByName().

svn path=/trunk/; revision=75950

reactos/dll/win32/xmllite/reader.c
reactos/dll/win32/xmllite/writer.c
reactos/media/doc/README.WINE

index c0bad72..c29b835 100644 (file)
@@ -146,7 +146,7 @@ struct xml_encoding_data
 
 static const struct xml_encoding_data xml_encoding_map[] = {
     { usasciiW, XmlEncoding_USASCII, 20127 },
-    { utf16W, XmlEncoding_UTF16, ~0 },
+    { utf16W, XmlEncoding_UTF16, 1200 },
     { utf8W,  XmlEncoding_UTF8,  CP_UTF8 },
 };
 
@@ -511,6 +511,19 @@ static void reader_clear_elements(xmlreader *reader)
     reader->is_empty_element = FALSE;
 }
 
+static struct ns *reader_lookup_ns(xmlreader *reader, const strval *prefix)
+{
+    struct list *nslist = prefix ? &reader->ns : &reader->nsdef;
+    struct ns *ns;
+
+    LIST_FOR_EACH_ENTRY_REV(ns, nslist, struct ns, entry) {
+        if (strval_eq(reader, prefix, &ns->prefix))
+            return ns;
+    }
+
+    return NULL;
+}
+
 static HRESULT reader_inc_depth(xmlreader *reader)
 {
     return (++reader->depth >= reader->max_depth && reader->max_depth) ? SC_E_MAXELEMENTDEPTH : S_OK;
@@ -1061,7 +1074,7 @@ static HRESULT reader_more(xmlreader *reader)
     prev_len = dest->written / sizeof(WCHAR);
 
     /* just copy for UTF-16 case */
-    if (cp == ~0)
+    if (cp == 1200)
     {
         readerinput_grow(readerinput, len);
         memcpy(dest->data + dest->written, src->data + src->cur, len);
@@ -2928,6 +2941,15 @@ static HRESULT WINAPI xmlreader_GetNodeType(IXmlReader* iface, XmlNodeType *node
     return This->state == XmlReadState_Closed ? S_FALSE : S_OK;
 }
 
+static void reader_set_current_attribute(xmlreader *reader, struct attribute *attr)
+{
+    reader->attr = attr;
+    reader->chunk_read_off = 0;
+    reader_set_strvalue(reader, StringValue_Prefix, &attr->prefix);
+    reader_set_strvalue(reader, StringValue_QualifiedName, &attr->qname);
+    reader_set_strvalue(reader, StringValue_Value, &attr->value);
+}
+
 static HRESULT reader_move_to_first_attribute(xmlreader *reader)
 {
     if (!reader->attr_count)
@@ -2936,11 +2958,7 @@ static HRESULT reader_move_to_first_attribute(xmlreader *reader)
     if (!reader->attr)
         reader_inc_depth(reader);
 
-    reader->attr = LIST_ENTRY(list_head(&reader->attrs), struct attribute, entry);
-    reader->chunk_read_off = 0;
-    reader_set_strvalue(reader, StringValue_Prefix, &reader->attr->prefix);
-    reader_set_strvalue(reader, StringValue_QualifiedName, &reader->attr->qname);
-    reader_set_strvalue(reader, StringValue_Value, &reader->attr->value);
+    reader_set_current_attribute(reader, LIST_ENTRY(list_head(&reader->attrs), struct attribute, entry));
 
     return S_OK;
 }
@@ -2968,23 +2986,111 @@ static HRESULT WINAPI xmlreader_MoveToNextAttribute(IXmlReader* iface)
 
     next = list_next(&This->attrs, &This->attr->entry);
     if (next)
+        reader_set_current_attribute(This, LIST_ENTRY(next, struct attribute, entry));
+
+    return next ? S_OK : S_FALSE;
+}
+
+static void reader_get_attribute_ns_uri(xmlreader *reader, struct attribute *attr, const WCHAR **uri, UINT *len)
+{
+    static const WCHAR xmlns_uriW[] = {'h','t','t','p',':','/','/','w','w','w','.','w','3','.','o','r','g','/',
+            '2','0','0','0','/','x','m','l','n','s','/',0};
+    static const WCHAR xml_uriW[] = {'h','t','t','p',':','/','/','w','w','w','.','w','3','.','o','r','g','/',
+            'X','M','L','/','1','9','9','8','/','n','a','m','e','s','p','a','c','e',0};
+
+    /* Check for reserved prefixes first */
+    if ((strval_eq(reader, &attr->prefix, &strval_empty) && strval_eq(reader, &attr->localname, &strval_xmlns)) ||
+            strval_eq(reader, &attr->prefix, &strval_xmlns))
     {
-        This->attr = LIST_ENTRY(next, struct attribute, entry);
-        This->chunk_read_off = 0;
-        reader_set_strvalue(This, StringValue_Prefix, &This->attr->prefix);
-        reader_set_strvalue(This, StringValue_QualifiedName, &This->attr->qname);
-        reader_set_strvalue(This, StringValue_Value, &This->attr->value);
+        *uri = xmlns_uriW;
+        *len = sizeof(xmlns_uriW)/sizeof(xmlns_uriW[0]) - 1;
+    }
+    else if (strval_eq(reader, &attr->prefix, &strval_xml))
+    {
+        *uri = xml_uriW;
+        *len = sizeof(xml_uriW)/sizeof(xml_uriW[0]) - 1;
+    }
+    else
+    {
+        *uri = NULL;
+        *len = 0;
     }
 
-    return next ? S_OK : S_FALSE;
+    if (!*uri)
+    {
+        struct ns *ns;
+
+        if ((ns = reader_lookup_ns(reader, &attr->prefix)))
+        {
+            *uri = ns->uri.str;
+            *len = ns->uri.len;
+        }
+        else
+        {
+            *uri = emptyW;
+            *len = 0;
+        }
+    }
+}
+
+static void reader_get_attribute_local_name(xmlreader *reader, struct attribute *attr, const WCHAR **name, UINT *len)
+{
+    if (attr->flags & ATTRIBUTE_DEFAULT_NS_DEFINITION)
+    {
+        *name = xmlnsW;
+        *len = 5;
+    }
+    else if (attr->flags & ATTRIBUTE_NS_DEFINITION)
+    {
+        const struct ns *ns = reader_lookup_ns(reader, &attr->localname);
+        *name = ns->prefix.str;
+        *len = ns->prefix.len;
+    }
+    else
+    {
+        *name = attr->localname.str;
+        *len = attr->localname.len;
+    }
 }
 
 static HRESULT WINAPI xmlreader_MoveToAttributeByName(IXmlReader* iface,
-                                                      LPCWSTR local_name,
-                                                      LPCWSTR namespaceUri)
+    const WCHAR *local_name, const WCHAR *namespace_uri)
 {
-    FIXME("(%p %p %p): stub\n", iface, local_name, namespaceUri);
-    return E_NOTIMPL;
+    xmlreader *This = impl_from_IXmlReader(iface);
+    UINT target_name_len, target_uri_len;
+    struct attribute *attr;
+
+    TRACE("(%p)->(%s %s)\n", This, debugstr_w(local_name), debugstr_w(namespace_uri));
+
+    if (!local_name)
+        return E_INVALIDARG;
+
+    if (!This->attr_count)
+        return S_FALSE;
+
+    if (!namespace_uri)
+        namespace_uri = emptyW;
+
+    target_name_len = strlenW(local_name);
+    target_uri_len = strlenW(namespace_uri);
+
+    LIST_FOR_EACH_ENTRY(attr, &This->attrs, struct attribute, entry)
+    {
+        UINT name_len, uri_len;
+        const WCHAR *name, *uri;
+
+        reader_get_attribute_local_name(This, attr, &name, &name_len);
+        reader_get_attribute_ns_uri(This, attr, &uri, &uri_len);
+
+        if (name_len == target_name_len && uri_len == target_uri_len &&
+                !strcmpW(name, local_name) && !strcmpW(uri, namespace_uri))
+        {
+            reader_set_current_attribute(This, attr);
+            return S_OK;
+        }
+    }
+
+    return S_FALSE;
 }
 
 static HRESULT WINAPI xmlreader_MoveToElement(IXmlReader* iface)
@@ -3078,19 +3184,6 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
     return S_OK;
 }
 
-static struct ns *reader_lookup_ns(xmlreader *reader, const strval *prefix)
-{
-    struct list *nslist = prefix ? &reader->ns : &reader->nsdef;
-    struct ns *ns;
-
-    LIST_FOR_EACH_ENTRY_REV(ns, nslist, struct ns, entry) {
-        if (strval_eq(reader, prefix, &ns->prefix))
-            return ns;
-    }
-
-    return NULL;
-}
-
 static struct ns *reader_lookup_nsdef(xmlreader *reader)
 {
     if (list_empty(&reader->nsdef))
@@ -3112,42 +3205,10 @@ static HRESULT WINAPI xmlreader_GetNamespaceUri(IXmlReader* iface, const WCHAR *
     if (!len)
         len = &length;
 
-    *uri = NULL;
-    *len = 0;
-
     switch ((nodetype = reader_get_nodetype(This)))
     {
     case XmlNodeType_Attribute:
-        {
-            static const WCHAR xmlns_uriW[] = {'h','t','t','p',':','/','/','w','w','w','.','w','3','.','o','r','g','/',
-                '2','0','0','0','/','x','m','l','n','s','/',0};
-            static const WCHAR xml_uriW[] = {'h','t','t','p',':','/','/','w','w','w','.','w','3','.','o','r','g','/',
-                'X','M','L','/','1','9','9','8','/','n','a','m','e','s','p','a','c','e',0};
-
-            /* check for reserved prefixes first */
-            if ((strval_eq(This, prefix, &strval_empty) && strval_eq(This, &This->attr->localname, &strval_xmlns)) ||
-                    strval_eq(This, prefix, &strval_xmlns))
-            {
-                *uri = xmlns_uriW;
-                *len = sizeof(xmlns_uriW)/sizeof(xmlns_uriW[0]) - 1;
-            }
-            else if (strval_eq(This, prefix, &strval_xml)) {
-                *uri = xml_uriW;
-                *len = sizeof(xml_uriW)/sizeof(xml_uriW[0]) - 1;
-            }
-
-            if (!*uri) {
-                ns = reader_lookup_ns(This, prefix);
-                if (ns) {
-                   *uri = ns->uri.str;
-                   *len = ns->uri.len;
-                }
-                else {
-                    *uri = emptyW;
-                    *len = 0;
-                }
-            }
-        }
+        reader_get_attribute_ns_uri(This, This->attr, uri, len);
         break;
     case XmlNodeType_Element:
     case XmlNodeType_EndElement:
@@ -3179,6 +3240,8 @@ static HRESULT WINAPI xmlreader_GetNamespaceUri(IXmlReader* iface, const WCHAR *
         break;
     default:
         FIXME("Unhandled node type %d\n", nodetype);
+        *uri = NULL;
+        *len = 0;
         return E_NOTIMPL;
     }
 
@@ -3212,22 +3275,7 @@ static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, U
         *len = element->localname.len;
         break;
     case XmlNodeType_Attribute:
-        if (This->attr->flags & ATTRIBUTE_DEFAULT_NS_DEFINITION)
-        {
-            *name = xmlnsW;
-            *len = 5;
-        }
-        else if (This->attr->flags & ATTRIBUTE_NS_DEFINITION)
-        {
-            const struct ns *ns = reader_lookup_ns(This, &This->attr->localname);
-            *name = ns->prefix.str;
-            *len = ns->prefix.len;
-        }
-        else
-        {
-            *name = This->attr->localname.str;
-            *len = This->attr->localname.len;
-        }
+        reader_get_attribute_local_name(This, This->attr, name, len);
         break;
     default:
         *name = This->strvalues[StringValue_LocalName].str;
index 3edc4ac..c4570a5 100644 (file)
@@ -30,6 +30,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[] = {'>'};
@@ -46,13 +47,14 @@ struct output_buffer
 
 typedef enum
 {
-    XmlWriterState_Initial,      /* output is not set yet */
-    XmlWriterState_Ready,        /* SetOutput() was called, ready to start */
-    XmlWriterState_PIDocStarted, /* document was started with manually added 'xml' PI */
-    XmlWriterState_DocStarted,   /* document was started with WriteStartDocument() */
-    XmlWriterState_ElemStarted,  /* writing element */
-    XmlWriterState_Content,      /* content is accepted at this point */
-    XmlWriterState_DocClosed     /* WriteEndDocument was called */
+    XmlWriterState_Initial,         /* output is not set yet */
+    XmlWriterState_Ready,           /* SetOutput() was called, ready to start */
+    XmlWriterState_InvalidEncoding, /* SetOutput() was called, but output had invalid encoding */
+    XmlWriterState_PIDocStarted,    /* document was started with manually added 'xml' PI */
+    XmlWriterState_DocStarted,      /* document was started with WriteStartDocument() */
+    XmlWriterState_ElemStarted,     /* writing element */
+    XmlWriterState_Content,         /* content is accepted at this point */
+    XmlWriterState_DocClosed        /* WriteEndDocument was called */
 } XmlWriterState;
 
 typedef struct
@@ -197,11 +199,11 @@ static HRESULT init_output_buffer(xmlwriteroutput *output)
 {
     struct output_buffer *buffer = &output->buffer;
     const int initial_len = 0x2000;
+    UINT cp = ~0u;
     HRESULT hr;
-    UINT cp;
 
-    hr = get_code_page(output->encoding, &cp);
-    if (FAILED(hr)) return hr;
+    if (FAILED(hr = get_code_page(output->encoding, &cp)))
+        WARN("Failed to get code page for specified encoding.\n");
 
     buffer->data = writeroutput_alloc(output, initial_len);
     if (!buffer->data) return E_OUTOFMEMORY;
@@ -245,16 +247,8 @@ static HRESULT write_output_buffer(xmlwriteroutput *output, const WCHAR *data, i
     HRESULT hr;
     char *ptr;
 
-    if (buffer->codepage != ~0) {
-        length = WideCharToMultiByte(buffer->codepage, 0, data, len, NULL, 0, NULL, NULL);
-        hr = grow_output_buffer(output, length);
-        if (FAILED(hr)) return hr;
-        ptr = buffer->data + buffer->written;
-        length = WideCharToMultiByte(buffer->codepage, 0, data, len, ptr, length, NULL, NULL);
-        buffer->written += len == -1 ? length-1 : length;
-    }
-    else {
-        /* WCHAR data just copied */
+    if (buffer->codepage == 1200) {
+        /* For UTF-16 encoding just copy. */
         length = len == -1 ? strlenW(data) : len;
         if (length) {
             length *= sizeof(WCHAR);
@@ -270,6 +264,14 @@ static HRESULT write_output_buffer(xmlwriteroutput *output, const WCHAR *data, i
             *(WCHAR*)ptr = 0;
         }
     }
+    else {
+        length = WideCharToMultiByte(buffer->codepage, 0, data, len, NULL, 0, NULL, NULL);
+        hr = grow_output_buffer(output, length);
+        if (FAILED(hr)) return hr;
+        ptr = buffer->data + buffer->written;
+        length = WideCharToMultiByte(buffer->codepage, 0, data, len, ptr, length, NULL, NULL);
+        buffer->written += len == -1 ? length-1 : length;
+    }
 
     return S_OK;
 }
@@ -436,7 +438,9 @@ static void write_node_indent(xmlwriter *writer)
     if (!writer->indent)
         return;
 
-    if (writer->output->buffer.written)
+    /* Do state check to prevent newline inserted after BOM. It is assumed that
+       state does not change between writing BOM and inserting indentation. */
+    if (writer->output->buffer.written && writer->state != XmlWriterState_Ready)
         write_output_buffer(writer->output, crlfW, ARRAY_SIZE(crlfW));
     while (indent_level--)
         write_output_buffer(writer->output, dblspaceW, ARRAY_SIZE(dblspaceW));
@@ -533,7 +537,6 @@ static HRESULT WINAPI xmlwriter_SetOutput(IXmlWriter *iface, IUnknown *output)
                 writeroutput, writeroutput->lpVtbl);
             IUnknown_Release(writeroutput);
             return E_FAIL;
-
         }
     }
 
@@ -544,7 +547,10 @@ static HRESULT WINAPI xmlwriter_SetOutput(IXmlWriter *iface, IUnknown *output)
         This->output = impl_from_IXmlWriterOutput(writeroutput);
     }
 
-    This->state = XmlWriterState_Ready;
+    if (This->output->encoding == XmlEncoding_Unknown)
+        This->state = XmlWriterState_InvalidEncoding;
+    else
+        This->state = XmlWriterState_Ready;
     return writeroutput_query_for_stream(This->output);
 }
 
@@ -630,6 +636,8 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
@@ -677,6 +685,8 @@ static HRESULT WINAPI xmlwriter_WriteCData(IXmlWriter *iface, LPCWSTR data)
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
@@ -718,6 +728,8 @@ static HRESULT WINAPI xmlwriter_WriteCharEntity(IXmlWriter *iface, WCHAR ch)
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_ElemStarted:
         writer_close_starttag(This);
         break;
@@ -743,6 +755,8 @@ static HRESULT WINAPI xmlwriter_WriteChars(IXmlWriter *iface, const WCHAR *pwch,
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_DocClosed:
         return WR_E_INVALIDACTION;
     default:
@@ -765,6 +779,8 @@ static HRESULT WINAPI xmlwriter_WriteComment(IXmlWriter *iface, LPCWSTR comment)
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_ElemStarted:
         writer_close_starttag(This);
         break;
@@ -822,29 +838,33 @@ static HRESULT WINAPI xmlwriter_WriteElementString(IXmlWriter *iface, LPCWSTR pr
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     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_node_indent(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;
@@ -864,6 +884,8 @@ static HRESULT WINAPI xmlwriter_WriteEndDocument(IXmlWriter *iface)
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
@@ -891,6 +913,8 @@ static HRESULT WINAPI xmlwriter_WriteEndElement(IXmlWriter *iface)
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
@@ -901,8 +925,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;
     }
@@ -927,6 +951,8 @@ static HRESULT WINAPI xmlwriter_WriteEntityRef(IXmlWriter *iface, LPCWSTR pwszNa
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_DocClosed:
         return WR_E_INVALIDACTION;
     default:
@@ -951,6 +977,8 @@ static HRESULT WINAPI xmlwriter_WriteFullEndElement(IXmlWriter *iface)
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
@@ -990,6 +1018,8 @@ static HRESULT WINAPI xmlwriter_WriteName(IXmlWriter *iface, LPCWSTR pwszName)
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
@@ -1011,6 +1041,8 @@ static HRESULT WINAPI xmlwriter_WriteNmToken(IXmlWriter *iface, LPCWSTR pwszNmTo
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
@@ -1051,6 +1083,8 @@ static HRESULT WINAPI xmlwriter_WriteProcessingInstruction(IXmlWriter *iface, LP
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_DocStarted:
         if (!strcmpW(name, xmlW))
             return WR_E_INVALIDACTION;
@@ -1087,6 +1121,8 @@ static HRESULT WINAPI xmlwriter_WriteQualifiedName(IXmlWriter *iface, LPCWSTR pw
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_DocClosed:
         return WR_E_INVALIDACTION;
     default:
@@ -1115,6 +1151,8 @@ static HRESULT WINAPI xmlwriter_WriteRaw(IXmlWriter *iface, LPCWSTR data)
     case XmlWriterState_DocStarted:
     case XmlWriterState_PIDocStarted:
         break;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
@@ -1134,6 +1172,8 @@ static HRESULT WINAPI xmlwriter_WriteRawChars(IXmlWriter *iface,  const WCHAR *p
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_DocClosed:
         return WR_E_INVALIDACTION;
     default:
@@ -1158,6 +1198,8 @@ static HRESULT WINAPI xmlwriter_WriteStartDocument(IXmlWriter *iface, XmlStandal
         return S_OK;
     case XmlWriterState_Ready:
         break;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
@@ -1180,6 +1222,8 @@ static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR pre
     {
     case XmlWriterState_Initial:
         return E_UNEXPECTED;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     case XmlWriterState_DocClosed:
         return WR_E_INVALIDACTION;
     default:
@@ -1195,12 +1239,13 @@ static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR pre
         return E_OUTOFMEMORY;
 
     write_encoding_bom(This);
+    write_node_indent(This);
+
     This->state = XmlWriterState_ElemStarted;
     This->starttagopen = TRUE;
 
     push_element(This, element);
 
-    write_node_indent(This);
     write_output_buffer(This->output, ltW, ARRAY_SIZE(ltW));
     write_output_qname(This->output, prefix, local_name);
     writer_inc_indent(This);
@@ -1255,6 +1300,8 @@ static HRESULT WINAPI xmlwriter_WriteString(IXmlWriter *iface, const WCHAR *stri
     case XmlWriterState_DocClosed:
         This->state = XmlWriterState_DocClosed;
         return WR_E_INVALIDACTION;
+    case XmlWriterState_InvalidEncoding:
+        return MX_E_ENCODING;
     default:
         ;
     }
index c3f11e3..6b4eb57 100644 (file)
@@ -218,7 +218,7 @@ reactos/dll/win32/xinput1_1           # Synced to WineStaging-2.9
 reactos/dll/win32/xinput1_2           # Synced to WineStaging-2.9
 reactos/dll/win32/xinput1_3           # Synced to WineStaging-2.9
 reactos/dll/win32/xinput9_1_0         # Synced to WineStaging-2.9
-reactos/dll/win32/xmllite             # Synced to WineStaging-2.9
+reactos/dll/win32/xmllite             # Synced to WineStaging-2.16
 
 reactos/dll/cpl/inetcpl               # Synced to WineStaging-2.9