Nikolay Sivov : xmllite/reader: For elements without a prefix return same string for both local and qualified names.

Alexandre Julliard julliard at winehq.org
Fri Mar 17 15:19:47 CDT 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Mar 17 16:46:12 2017 +0300

xmllite/reader: For elements without a prefix return same string for both local and qualified names.

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

---

 dlls/xmllite/reader.c       | 17 ++++++++++++-----
 dlls/xmllite/tests/reader.c | 40 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 5ba787e..ca8602c 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -490,6 +490,7 @@ static void reader_clear_elements(xmlreader *reader)
     }
     list_init(&reader->elements);
     reader_free_strvalued(reader, &reader->empty_element.localname);
+    reader_free_strvalued(reader, &reader->empty_element.qname);
     reader->is_empty_element = FALSE;
 }
 
@@ -2227,10 +2228,11 @@ static HRESULT reader_parse_stag(xmlreader *reader, strval *prefix, strval *loca
             /* skip '/>' */
             reader_skipn(reader, 2);
 
+            reader_free_strvalued(reader, &element->qname);
             reader_free_strvalued(reader, &element->localname);
 
             element->prefix = *prefix;
-            element->qname = *qname;
+            reader_strvaldup(reader, qname, &element->qname);
             reader_strvaldup(reader, local, &element->localname);
             element->position = position;
             reader_mark_ns_nodes(reader, element);
@@ -2980,6 +2982,7 @@ static HRESULT WINAPI xmlreader_MoveToElement(IXmlReader* iface)
 static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *name, UINT *len)
 {
     xmlreader *This = impl_from_IXmlReader(iface);
+    struct element *element;
     UINT length;
 
     TRACE("(%p)->(%p %p)\n", This, name, len);
@@ -2998,14 +3001,18 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
         break;
     case XmlNodeType_Element:
     case XmlNodeType_EndElement:
-        if (!This->is_empty_element)
+        element = reader_get_element(This);
+        if (element->prefix.len)
         {
-            struct element *element = reader_get_element(This);
             *name = element->qname.str;
             *len = element->qname.len;
-            break;
         }
-        /* fallthrough */
+        else
+        {
+            *name = element->localname.str;
+            *len = element->localname.len;
+        }
+        break;
     default:
         *name = This->strvalues[StringValue_QualifiedName].str;
         *len = This->strvalues[StringValue_QualifiedName].len;
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 8660bb8..82880ae 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1494,6 +1494,8 @@ static void test_read_element(void)
     i = 0;
     while (IXmlReader_Read(reader, &type) == S_OK)
     {
+        UINT count;
+
         ok(type == XmlNodeType_Element || type == XmlNodeType_EndElement ||
                 type == XmlNodeType_Text, "Unexpected node type %d\n", type);
 
@@ -1502,10 +1504,44 @@ static void test_read_element(void)
         ok(hr == S_OK, "got %08x\n", hr);
         ok(depth == depths[i], "%u: got depth %u, expected %u\n", i, depth, depths[i]);
 
-        if (type == XmlNodeType_Element)
+        if (type == XmlNodeType_Element || type == XmlNodeType_EndElement)
+        {
+            const WCHAR *prefix;
+
+            prefix = NULL;
+            hr = IXmlReader_GetPrefix(reader, &prefix, NULL);
+            ok(hr == S_OK, "got %08x\n", hr);
+            ok(prefix != NULL, "got %p\n", prefix);
+
+            if (!*prefix)
+            {
+                const WCHAR *local, *qname;
+
+                local = NULL;
+                hr = IXmlReader_GetLocalName(reader, &local, NULL);
+                ok(hr == S_OK, "got %08x\n", hr);
+                ok(local != NULL, "got %p\n", local);
+
+                qname = NULL;
+                hr = IXmlReader_GetQualifiedName(reader, &qname, NULL);
+                ok(hr == S_OK, "got %08x\n", hr);
+                ok(qname != NULL, "got %p\n", qname);
+
+                ok(local == qname, "expected same pointer\n");
+            }
+        }
+
+        if (type == XmlNodeType_EndElement)
         {
-            UINT count = 0;
+            count = 1;
+            hr = IXmlReader_GetAttributeCount(reader, &count);
+            ok(hr == S_OK, "got %08x\n", hr);
+            ok(count == 0, "got %u\n", count);
+        }
 
+        if (type == XmlNodeType_Element)
+        {
+            count = 0;
             hr = IXmlReader_GetAttributeCount(reader, &count);
             ok(hr == S_OK, "got %08x\n", hr);
 




More information about the wine-cvs mailing list