Jacek Caban : msxml3: Added node_query_inerface function for common xmlnode child objects implementation .

Alexandre Julliard julliard at winehq.org
Mon Sep 6 13:53:10 CDT 2010


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

Author: Jacek Caban <jacek at 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 ) )
     {




More information about the wine-cvs mailing list