>From 4ee2a39689afffee08e5c5519fb59027b51eb61c Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Thu, 20 Aug 2009 10:35:35 +1000 Subject: [PATCH] Implement IDispatchEx for IXMLDOMNode To: wine-patches --- dlls/msxml3/msxml_private.h | 37 ++++++++++++++++++++++--------------- dlls/msxml3/node.c | 22 ++++++++++++++++++++-- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 357810d..21daa45 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -69,21 +69,6 @@ extern HRESULT XMLElement_create( IUnknown *pUnkOuter, xmlNodePtr node, LPVOID * extern xmlDocPtr parse_xml(char *ptr, int len); -/* 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)); -} - extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document); static inline BSTR bstr_from_xmlChar(const xmlChar *str) @@ -241,4 +226,26 @@ static inline LPWSTR heap_strdupW(LPCWSTR str) return ret; } +#ifdef HAVE_LIBXML2 + +/* IXMLDOMNode Internal Structure */ +typedef struct _xmlnode +{ + const struct IXMLDOMNodeVtbl *lpVtbl; + const struct IUnknownVtbl *lpInternalUnkVtbl; + IUnknown *pUnkOuter; + LONG ref; + xmlNodePtr node; + + /* IDispatchEx */ + DispatchEx dispex; +} xmlnode; + +static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface ) +{ + return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl)); +} + +#endif + #endif /* __MSXML_PRIVATE__ */ diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 1841e6e..e5105c4 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -30,6 +30,7 @@ #include "winnls.h" #include "ole2.h" #include "msxml2.h" +#include "dispex.h" #include "msxml_private.h" @@ -1496,9 +1497,12 @@ static HRESULT WINAPI Internal_QueryInterface( if ( IsEqualGUID( riid, &IID_IUnknown )) *ppvObject = iface; - else if ( IsEqualGUID( riid, &IID_IDispatch ) || - IsEqualGUID( riid, &IID_IXMLDOMNode ) ) + else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) ) *ppvObject = &This->lpVtbl; + else if(dispex_query_interface(&This->dispex, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("interface %s not implemented\n", debugstr_guid(riid)); @@ -1542,6 +1546,18 @@ static const struct IUnknownVtbl internal_unk_vtbl = Internal_Release }; +static const tid_t domnode_iface_tids[] = { + IXMLDOMNode_tid, + 0 +}; + +static dispex_static_data_t domnode_dispex = { + NULL, + IXMLDOMNode_tid, + NULL, + domnode_iface_tids +}; + IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter ) { xmlnode *This; @@ -1564,6 +1580,8 @@ IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter ) This->ref = 1; This->node = node; + init_dispex(&This->dispex, (IUnknown*)&This->lpVtbl, &domnode_dispex); + return (IUnknown*)&This->lpInternalUnkVtbl; } -- 1.6.2.5