From 0670d092f137da408fe2f3ed0119a1a08ea1a932 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Sat, 4 Sep 2010 17:54:46 +0200 Subject: [PATCH] msxml3: Added node_query_inerface function for common xmlnode child objects implementation. --- dlls/msxml3/attribute.c | 4 ++++ dlls/msxml3/cdata.c | 4 ++++ dlls/msxml3/comment.c | 4 ++++ dlls/msxml3/docfrag.c | 4 ++++ dlls/msxml3/domdoc.c | 2 +- dlls/msxml3/element.c | 2 +- dlls/msxml3/entityref.c | 4 ++++ dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 11 +++++++++++ dlls/msxml3/pi.c | 4 ++++ dlls/msxml3/text.c | 4 ++++ 11 files changed, 42 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c index 327f91c5805..3554859208d 100644 --- a/dlls/msxml3/attribute.c +++ b/dlls/msxml3/attribute.c @@ -67,6 +67,10 @@ static HRESULT WINAPI domattr_QueryInterface( { *ppvObject = IXMLDOMNode_from_impl(&This->node); } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("Unsupported interface %s\n", debugstr_guid(riid)); diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index b23d19d170d..e37829517e0 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -74,6 +74,10 @@ static HRESULT WINAPI domcdata_QueryInterface( TRACE("Unsupported interface\n"); return E_NOINTERFACE; } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("Unsupported interface %s\n", debugstr_guid(riid)); diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 6e7b77ef155..f496625735b 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -68,6 +68,10 @@ static HRESULT WINAPI domcomment_QueryInterface( { *ppvObject = IXMLDOMNode_from_impl(&This->node); } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("Unsupported interface %s\n", debugstr_guid(riid)); diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c index 9ca63d3f6df..b013deb4c21 100644 --- a/dlls/msxml3/docfrag.c +++ b/dlls/msxml3/docfrag.c @@ -67,6 +67,10 @@ static HRESULT WINAPI domfrag_QueryInterface( { *ppvObject = IXMLDOMNode_from_impl(&This->node); } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("Unsupported interface %s\n", debugstr_guid(riid)); diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 3f01329b260..8fdf5c19f95 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -545,7 +545,7 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument3 *iface, REFIID rii { *ppvObject = &This->lpvtblISupportErrorInfo; } - else if(dispex_query_interface(&This->node.dispex, riid, ppvObject)) + else if(node_query_interface(&This->node, riid, ppvObject)) { return *ppvObject ? S_OK : E_NOINTERFACE; } diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 5b4a6040346..624726959a6 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -74,7 +74,7 @@ static HRESULT WINAPI domelem_QueryInterface( { *ppvObject = IXMLDOMNode_from_impl(&This->node); } - else if(dispex_query_interface(&This->node.dispex, riid, ppvObject)) + else if(node_query_interface(&This->node, riid, ppvObject)) { return *ppvObject ? S_OK : E_NOINTERFACE; } diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c index c55fd181e43..396db9b0038 100644 --- a/dlls/msxml3/entityref.c +++ b/dlls/msxml3/entityref.c @@ -67,6 +67,10 @@ static HRESULT WINAPI entityref_QueryInterface( { *ppvObject = IXMLDOMNode_from_impl(&This->node); } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("Unsupported interface %s\n", debugstr_guid(riid)); diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index fe843b8a870..e8251bbcc7b 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -162,6 +162,7 @@ static inline IXMLDOMNode *IXMLDOMNode_from_impl(xmlnode *This) extern void init_xmlnode(xmlnode*,xmlNodePtr,IXMLDOMNode*,dispex_static_data_t*); extern void destroy_xmlnode(xmlnode*); +extern BOOL node_query_interface(xmlnode*,REFIID,void**); extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 5b9eee4435a..a2e175e747c 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -80,6 +80,13 @@ xmlNodePtr xmlNodePtr_from_domnode( IXMLDOMNode *iface, xmlElementType type ) return This->node; } +BOOL node_query_interface(xmlnode *This, REFIID riid, void **ppv) +{ + if(This->dispex.outer) + return dispex_query_interface(&This->dispex, riid, ppv); + return FALSE; +} + static HRESULT WINAPI xmlnode_QueryInterface( IXMLDOMNode *iface, REFIID riid, @@ -97,6 +104,8 @@ static HRESULT WINAPI xmlnode_QueryInterface( }else if (IsEqualGUID( riid, &IID_IDispatch) || IsEqualGUID( riid, &IID_IXMLDOMNode)) { *ppvObject = &This->lpVtbl; + }else if(node_query_interface(This, riid, ppvObject)) { + return *ppvObject ? S_OK : E_NOINTERFACE; }else { FIXME("interface %s not implemented\n", debugstr_guid(riid)); *ppvObject = NULL; @@ -1725,6 +1734,8 @@ void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispe if(dispex_data) init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data); + else + This->dispex.outer = NULL; } IXMLDOMNode *create_node( xmlNodePtr node ) diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c index 2c70cc7a398..0b2a7e72a20 100644 --- a/dlls/msxml3/pi.c +++ b/dlls/msxml3/pi.c @@ -67,6 +67,10 @@ static HRESULT WINAPI dom_pi_QueryInterface( { *ppvObject = IXMLDOMNode_from_impl(&This->node); } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("Unsupported interface %s\n", debugstr_guid(riid)); diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index d3da258f76c..0ae5aa6f078 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -69,6 +69,10 @@ static HRESULT WINAPI domtext_QueryInterface( { *ppvObject = IXMLDOMNode_from_impl(&This->node); } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) || IsEqualGUID( riid, &IID_IXMLDOMCDATASection ) ) {