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