[PATCH 3/4] msxml3: Implement IXMLDOMNamedNodeMap::getNamedItem() for a processing instruction node.

Dmitry Timoshkov dmitry at baikal.ru
Mon Apr 26 03:10:34 CDT 2021


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/msxml3/pi.c           | 45 +++++++++++++++++++++++++++++++++++---
 dlls/msxml3/tests/domdoc.c |  6 +----
 2 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index fe291e72af8..59ceee767a1 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -813,6 +813,27 @@ static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
     dom_pi_put_data
 };
 
+static xmlAttrPtr node_has_prop(const xmlNode *node, const xmlChar *name)
+{
+    xmlAttrPtr prop;
+
+    /* xmlHasNsProp accepts only nodes of type XML_ELEMENT_NODE,
+     * so we have to look for an attribute in the node by hand.
+     */
+
+    prop = node->properties;
+
+    while (prop)
+    {
+        if (xmlStrEqual(prop->name, name))
+            return prop;
+
+        prop = prop->next;
+    }
+
+    return NULL;
+}
+
 static HRESULT dom_pi_get_qualified_item(const xmlNodePtr node, BSTR name, BSTR uri,
     IXMLDOMNode **item)
 {
@@ -822,10 +843,28 @@ static HRESULT dom_pi_get_qualified_item(const xmlNodePtr node, BSTR name, BSTR
 
 static HRESULT dom_pi_get_named_item(const xmlNodePtr node, BSTR name, IXMLDOMNode **item)
 {
-    FIXME("(%p)->(%s %p): stub\n", node, debugstr_w(name), item );
-    if (item)
+    xmlChar *nameA;
+    xmlAttrPtr attr;
+
+    TRACE("(%p)->(%s %p)\n", node, debugstr_w(name), item);
+
+    if (!item) return E_POINTER;
+
+    nameA = xmlchar_from_wchar(name);
+    if (!nameA) return E_OUTOFMEMORY;
+
+    attr = node_has_prop(node, nameA);
+    heap_free(nameA);
+
+    if (!attr)
+    {
         *item = NULL;
-    return S_FALSE;
+        return S_FALSE;
+    }
+
+    *item = create_node((xmlNodePtr)attr);
+
+    return S_OK;
 }
 
 static HRESULT dom_pi_set_named_item(xmlNodePtr node, IXMLDOMNode *newItem, IXMLDOMNode **namedItem)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 51980afb2d7..abe36c1fae4 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -8579,13 +8579,9 @@ todo_wine
 
     item = NULL;
     hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, _bstr_("encoding"), &item);
-todo_wine
     ok(hr == S_OK, "got 0x%08x\n", hr);
-todo_wine
     ok(item != NULL, "got NULL\n");
 
-if (hr == S_OK)
-{
     hr = IXMLDOMNode_get_nodeName(item, &bstr);
     ok(!lstrcmpW(bstr, L"encoding"), "got %s\n", wine_dbgstr_w(bstr));
     SysFreeString(bstr);
@@ -8595,7 +8591,7 @@ if (hr == S_OK)
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(V_VT(&var) == VT_BSTR, "got %u\n", V_VT(&var));
     ok(!lstrcmpW(V_BSTR(&var), L"windows-1252"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
-}
+
     IXMLDOMNamedNodeMap_Release(node_map);
     IXMLDOMNode_Release(node);
     IXMLDOMProcessingInstruction_Release(pi);
-- 
2.31.1




More information about the wine-devel mailing list