Alistair Leslie-Hughes : msxml3: Implement setNamedItem.

Alexandre Julliard julliard at winehq.org
Fri Jan 4 07:12:41 CST 2008


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

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Fri Jan  4 09:06:03 2008 +1100

msxml3: Implement setNamedItem.

---

 dlls/msxml3/msxml_private.h |   15 +++++++++++++++
 dlls/msxml3/node.c          |   14 --------------
 dlls/msxml3/nodemap.c       |   42 ++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 55 insertions(+), 16 deletions(-)

diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 4914a58..59b1831 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -71,4 +71,19 @@ extern HRESULT DOMDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj );
 extern HRESULT SchemaCache_create( IUnknown *pUnkOuter, LPVOID *ppObj );
 extern HRESULT XMLDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj );
 
+/* IXMLDOMNode Internal Structure */
+typedef struct _xmlnode
+{
+    const struct IXMLDOMNodeVtbl *lpVtbl;
+    const struct IUnknownVtbl *lpInternalUnkVtbl;
+    IUnknown *pUnkOuter;
+    LONG ref;
+    xmlNodePtr node;
+} xmlnode;
+
+static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
+{
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
+}
+
 #endif /* __MSXML_PRIVATE__ */
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 7122f7d..fd86e4e 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -39,20 +39,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _xmlnode
-{
-    const struct IXMLDOMNodeVtbl *lpVtbl;
-    const struct IUnknownVtbl *lpInternalUnkVtbl;
-    IUnknown *pUnkOuter;
-    LONG ref;
-    xmlNodePtr node;
-} xmlnode;
-
-static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
-{
-    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
-}
-
 static inline xmlnode *impl_from_InternalUnknown( IUnknown *iface )
 {
     return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpInternalUnkVtbl));
diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c
index 94b3f62..53f2171 100644
--- a/dlls/msxml3/nodemap.c
+++ b/dlls/msxml3/nodemap.c
@@ -195,8 +195,46 @@ static HRESULT WINAPI xmlnodemap_setNamedItem(
     IXMLDOMNode* newItem,
     IXMLDOMNode** namedItem)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
+    xmlnode *ThisNew = NULL;
+    xmlNodePtr nodeNew;
+    IXMLDOMNode *pAttr = NULL;
+    xmlNodePtr node;
+
+    TRACE("%p %p %p\n", This, newItem, namedItem );
+
+    if(!newItem)
+        return E_INVALIDARG;
+
+    if(namedItem) *namedItem = NULL;
+
+    node = xmlNodePtr_from_domnode( This->node, 0 );
+    if ( !node )
+        return E_FAIL;
+
+    /* Must be an Attribute */
+    IUnknown_QueryInterface(newItem, &IID_IXMLDOMNode, (LPVOID*)&pAttr);
+    if(pAttr)
+    {
+        ThisNew = impl_from_IXMLDOMNode( pAttr );
+
+        if(ThisNew->node->type != XML_ATTRIBUTE_NODE)
+        {
+            IUnknown_Release(pAttr);
+            return E_FAIL;
+        }
+
+        nodeNew = xmlAddChild(node, ThisNew->node);
+
+        if(namedItem)
+            *namedItem = create_node( (xmlNodePtr) nodeNew );
+
+        IUnknown_Release(pAttr);
+
+        return S_OK;
+    }
+
+    return E_INVALIDARG;
 }
 
 static HRESULT WINAPI xmlnodemap_removeNamedItem(




More information about the wine-cvs mailing list