Module: wine Branch: master Commit: 0670d092f137da408fe2f3ed0119a1a08ea1a932 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0670d092f137da408fe2f3ed01...
Author: Jacek Caban jacek@codeweavers.com Date: Sat Sep 4 17:54:46 2010 +0200
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 327f91c..3554859 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 b23d19d..e378295 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 6e7b77e..f496625 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 9ca63d3..b013deb 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 3f01329..8fdf5c1 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 5b4a604..6247269 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 c55fd18..396db9b 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 fe843b8..e8251bb 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 5b9eee4..a2e175e 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 2c70cc7..0b2a7e7 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 d3da258..0ae5aa6 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 ) ) {