Nikolay Sivov : xmllite/reader: Return local element names from the stack, instead of input buffer.

Alexandre Julliard julliard at winehq.org
Wed Mar 8 16:01:37 CST 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Mar  8 07:07:10 2017 +0300

xmllite/reader: Return local element names from the stack, instead of input buffer.

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

---

 dlls/xmllite/reader.c       | 37 +++++++++++++++++++++++++++++++------
 dlls/xmllite/tests/reader.c | 12 +++++++++++-
 2 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 36eba37..9c7d0f1 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -2260,7 +2260,7 @@ static HRESULT reader_parse_element(xmlreader *reader)
 static HRESULT reader_parse_endtag(xmlreader *reader)
 {
     strval prefix, local, qname;
-    struct element *elem;
+    struct element *element;
     HRESULT hr;
 
     /* skip '</' */
@@ -2278,12 +2278,12 @@ static HRESULT reader_parse_endtag(xmlreader *reader)
 
     /* Element stack should never be empty at this point, cause we shouldn't get to
        content parsing if it's empty. */
-    elem = LIST_ENTRY(list_head(&reader->elements), struct element, entry);
-    if (!strval_eq(reader, &elem->qname, &qname)) return WC_E_ELEMENTMATCH;
+    element = LIST_ENTRY(list_head(&reader->elements), struct element, entry);
+    if (!strval_eq(reader, &element->qname, &qname)) return WC_E_ELEMENTMATCH;
 
     reader->nodetype = XmlNodeType_EndElement;
+    reader->is_empty_element = FALSE;
     reader_set_strvalue(reader, StringValue_Prefix, &prefix);
-    reader_set_strvalue(reader, StringValue_LocalName, &local);
     reader_set_strvalue(reader, StringValue_QualifiedName, &qname);
 
     return S_OK;
@@ -3031,10 +3031,35 @@ static HRESULT WINAPI xmlreader_GetNamespaceUri(IXmlReader* iface, const WCHAR *
 static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, UINT *len)
 {
     xmlreader *This = impl_from_IXmlReader(iface);
+    XmlNodeType nodetype;
+    UINT length;
 
     TRACE("(%p)->(%p %p)\n", This, name, len);
-    *name = This->strvalues[StringValue_LocalName].str;
-    if (len) *len = This->strvalues[StringValue_LocalName].len;
+
+    if (!len)
+        len = &length;
+
+    switch ((nodetype = reader_get_nodetype(This)))
+    {
+    case XmlNodeType_Element:
+    case XmlNodeType_EndElement:
+        /* empty elements are not added to the stack */
+        if (!This->is_empty_element)
+        {
+            struct element *element;
+
+            element = LIST_ENTRY(list_head(&This->elements), struct element, entry);
+            *name = element->localname.str;
+            *len = element->localname.len;
+            break;
+        }
+        /* fallthrough */
+    default:
+        *name = This->strvalues[StringValue_LocalName].str;
+        *len = This->strvalues[StringValue_LocalName].len;
+        break;
+    }
+
     return S_OK;
 }
 
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 7632d63..08905d0 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -2148,6 +2148,7 @@ static void test_namespaceuri(void)
         while (IXmlReader_Read(reader, &type) == S_OK) {
             const WCHAR *uri, *local;
             WCHAR *uriW;
+            UINT length;
 
             ok(type == XmlNodeType_Element ||
                     type == XmlNodeType_Text ||
@@ -2158,8 +2159,17 @@ static void test_namespaceuri(void)
                     type == XmlNodeType_EndElement ||
                     type == XmlNodeType_XmlDeclaration, "Unexpected node type %d.\n", type);
 
-            hr = IXmlReader_GetLocalName(reader, &local, NULL);
+            local = NULL;
+            length = 0;
+            hr = IXmlReader_GetLocalName(reader, &local, &length);
             ok(hr == S_OK, "S_OK, got %08x\n", hr);
+            ok(local != NULL, "Unexpected NULL local name pointer\n");
+
+            if (type == XmlNodeType_Element || type == XmlNodeType_EndElement)
+            {
+                ok(*local != 0, "Unexpected empty local name\n");
+                ok(length > 0, "Unexpected local name length\n");
+            }
 
             uri = NULL;
             hr = IXmlReader_GetNamespaceUri(reader, &uri, NULL);




More information about the wine-cvs mailing list