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