[PATCH] xmllite/writer: Fix "xml:space" output.

Nikolay Sivov nsivov at codeweavers.com
Sun Sep 16 23:00:29 CDT 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/xmllite/tests/writer.c | 14 ++++++++++++++
 dlls/xmllite/writer.c       | 29 +++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c
index 7f731be211..2cd9cea6cc 100644
--- a/dlls/xmllite/tests/writer.c
+++ b/dlls/xmllite/tests/writer.c
@@ -1637,6 +1637,12 @@ static void test_WriteAttributeString(void)
         { "prefix", "xmlns", "uri", "", "<e prefix:xmlns=\"\" xmlns:prefix=\"uri\" />", "<e prefix:xmlns=\"\"" },
         { "prefix", "xmlns", NULL, "uri", "<e xmlns=\"uri\" />", "<e xmlns=\"uri\"" },
         { "prefix", "xmlns", "", "uri", "<e xmlns=\"uri\" />", "<e xmlns=\"uri\"" },
+        { "xml", "space", NULL, "preserve", "<e xml:space=\"preserve\" />", "<e xml:space=\"preserve\"" },
+        { "xml", "space", "", "preserve", "<e xml:space=\"preserve\" />", "<e xml:space=\"preserve\"" },
+        { "xml", "space", NULL, "default", "<e xml:space=\"default\" />", "<e xml:space=\"default\"" },
+        { "xml", "space", "", "default", "<e xml:space=\"default\" />", "<e xml:space=\"default\"" },
+        { "xml", "a", NULL, "value", "<e xml:a=\"value\" />", "<e xml:a=\"value\"" },
+        { "xml", "a", "", "value", "<e xml:a=\"value\" />", "<e xml:a=\"value\"" },
 
         /* Autogenerated prefix names. */
         { NULL, "a", "defuri", NULL, "<e p1:a=\"\" xmlns:p1=\"defuri\" />", "<e p1:a=\"\"", S_OK, 1, 1, 1 },
@@ -1655,6 +1661,7 @@ static void test_WriteAttributeString(void)
         { "prefix", NULL, "http://www.w3.org/2000/xmlns/", "defuri", "<e />", "<e", E_INVALIDARG },
         { "prefix", NULL, NULL, "b", "<e />", "<e", E_INVALIDARG },
         { "prefix", NULL, "uri", NULL, "<e />", "<e", E_INVALIDARG },
+        { "xml", NULL, NULL, "value", "<e />", "<e", E_INVALIDARG },
         { "xmlns", "a", "defuri", NULL, "<e />", "<e", WR_E_XMLNSPREFIXDECLARATION },
         { "xmlns", "a", "b", "uri", "<e />", "<e", WR_E_XMLNSPREFIXDECLARATION },
         { NULL, "xmlns", "uri", NULL, "<e />", "<e", WR_E_XMLNSPREFIXDECLARATION, 0, 0, 1 },
@@ -1666,6 +1673,13 @@ static void test_WriteAttributeString(void)
         { "xmlns", NULL, "", "uri", "<e />", "<e", WR_E_NSPREFIXDECLARED },
         { "xmlns", "", NULL, "uri", "<e />", "<e", WR_E_NSPREFIXDECLARED },
         { "xmlns", "", "", "uri", "<e />", "<e", WR_E_NSPREFIXDECLARED },
+        { "xml", "space", "", "value", "<e />", "<e", WR_E_INVALIDXMLSPACE },
+        { "xml", "space", NULL, "value", "<e />", "<e", WR_E_INVALIDXMLSPACE },
+        { "xml", "a", "uri", "value", "<e />", "<e", WR_E_XMLPREFIXDECLARATION },
+        { "xml", "space", NULL, "preServe", "<e />", "<e", WR_E_INVALIDXMLSPACE },
+        { "xml", "space", NULL, "defAult", "<e />", "<e", WR_E_INVALIDXMLSPACE },
+        { "xml", "space", NULL, NULL, "<e />", "<e", WR_E_INVALIDXMLSPACE },
+        { "xml", "space", NULL, "", "<e />", "<e", WR_E_INVALIDXMLSPACE },
     };
 
     IXmlWriter *writer;
diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c
index e9ad941365..bf2a7514ac 100644
--- a/dlls/xmllite/writer.c
+++ b/dlls/xmllite/writer.c
@@ -825,10 +825,23 @@ static void write_output_attribute(xmlwriter *writer, const WCHAR *prefix, int p
     write_output_buffer_quoted(writer->output, value, -1);
 }
 
+static BOOL is_valid_xml_space_value(const WCHAR *value)
+{
+    static const WCHAR preserveW[] = {'p','r','e','s','e','r','v','e',0};
+    static const WCHAR defaultW[] = {'d','e','f','a','u','l','t',0};
+
+    if (!value)
+        return FALSE;
+
+    return !strcmpW(value, preserveW) || !strcmpW(value, defaultW);
+}
+
 static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR prefix,
     LPCWSTR local, LPCWSTR uri, LPCWSTR value)
 {
+    static const WCHAR spaceattrW[] = {'s','p','a','c','e',0};
     static const WCHAR xmlnsW[] = {'x','m','l','n','s',0};
+    static const WCHAR xmlW[] = {'x','m','l',0};
     xmlwriter *This = impl_from_IXmlWriter(iface);
     int prefix_len, local_len;
     BOOL is_xmlns_prefix;
@@ -873,6 +886,22 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
         return S_OK;
     }
 
+    /* Predefined "xml" prefix. */
+    if (prefix_len && !strcmpW(prefix, xmlW))
+    {
+        /* Valid "space" value is enforced. */
+        if (!strcmpW(local, spaceattrW) && !is_valid_xml_space_value(value))
+            return WR_E_INVALIDXMLSPACE;
+
+        /* Redefinition is not allowed. */
+        if (!is_empty_string(uri))
+            return WR_E_XMLPREFIXDECLARATION;
+
+        write_output_attribute(This, prefix, prefix_len, local, local_len, value);
+
+        return S_OK;
+    }
+
     if (is_xmlns_prefix || (prefix_len == 0 && uri && !strcmpW(uri, xmlnsuriW)))
     {
         if (prefix_len && !is_empty_string(uri))
-- 
2.18.0




More information about the wine-devel mailing list