Dmitry Timoshkov : msxml3: Implement IXMLDOMNamedNodeMap::getNamedItem() for a processing instruction node.
Alexandre Julliard
julliard at winehq.org
Mon May 31 15:58:36 CDT 2021
Module: wine
Branch: master
Commit: a39df8bb61568e66d2aca521fd1703fbb73108ea
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a39df8bb61568e66d2aca521fd1703fbb73108ea
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Fri May 28 13:38:37 2021 +0300
msxml3: Implement IXMLDOMNamedNodeMap::getNamedItem() for a processing instruction node.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msxml3/pi.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
dlls/msxml3/tests/domdoc.c | 5 -----
2 files changed, 42 insertions(+), 8 deletions(-)
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index f37f3c01630..606d8dc3571 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -817,6 +817,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)
{
@@ -826,10 +847,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 3dcfdb8fd39..12482962c4b 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(hr == S_OK, "got 0x%08x\n", hr);
ok(!lstrcmpW(bstr, L"encoding"), "got %s\n", wine_dbgstr_w(bstr));
@@ -8597,7 +8593,6 @@ if (hr == S_OK)
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)));
VariantClear(&var);
-}
IXMLDOMNamedNodeMap_Release(node_map);
IXMLDOMNode_Release(node);
More information about the wine-cvs
mailing list