Nikolay Sivov : xmllite/reader: Return prefixes from namespace stack.

Alexandre Julliard julliard at winehq.org
Thu Mar 9 15:51:33 CST 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Mar  9 07:14:06 2017 +0300

xmllite/reader: Return prefixes from namespace stack.

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

---

 dlls/xmllite/reader.c       | 46 +++++++++++++++++++++++++++++++++++++++++----
 dlls/xmllite/tests/reader.c |  1 +
 2 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index ba7a56e..2e828f3 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -3087,13 +3087,51 @@ static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, U
     return S_OK;
 }
 
-static HRESULT WINAPI xmlreader_GetPrefix(IXmlReader* iface, LPCWSTR *prefix, UINT *len)
+static HRESULT WINAPI xmlreader_GetPrefix(IXmlReader* iface, const WCHAR **ret, UINT *len)
 {
     xmlreader *This = impl_from_IXmlReader(iface);
+    XmlNodeType nodetype;
+    UINT length;
+
+    TRACE("(%p)->(%p %p)\n", This, ret, len);
+
+    if (!len)
+        len = &length;
+
+    *ret = emptyW;
+    *len = 0;
+
+    switch ((nodetype = reader_get_nodetype(This)))
+    {
+    case XmlNodeType_Element:
+    case XmlNodeType_EndElement:
+    case XmlNodeType_Attribute:
+    {
+        const strval *prefix = &This->strvalues[StringValue_Prefix];
+        struct ns *ns;
+
+        if (strval_eq(This, prefix, &strval_xml))
+        {
+            *ret = xmlW;
+            *len = 3;
+        }
+        else if (strval_eq(This, prefix, &strval_xmlns))
+        {
+            *ret = xmlnsW;
+            *len = 5;
+        }
+        else if ((ns = reader_lookup_ns(This, prefix)))
+        {
+            *ret = ns->prefix.str;
+            *len = ns->prefix.len;
+        }
+
+        break;
+    }
+    default:
+        ;
+    }
 
-    TRACE("(%p)->(%p %p)\n", This, prefix, len);
-    *prefix = This->strvalues[StringValue_Prefix].str;
-    if (len) *len = This->strvalues[StringValue_Prefix].len;
     return S_OK;
 }
 
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 1d32678..1defecf 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -2024,6 +2024,7 @@ static void test_prefix(void)
     } prefix_tests[] =
     {
         { "<b xmlns=\"defns\" xml:a=\"a ns\"/>", "", "", "xml" },
+        { "<c:b xmlns:c=\"c ns\" xml:a=\"a ns\"/>", "c", "xmlns", "xml" },
     };
     IXmlReader *reader;
     unsigned int i;




More information about the wine-cvs mailing list