Jacek Caban : msxml3: Get rid of node internal IUnknown.
Alexandre Julliard
julliard at winehq.org
Wed Sep 30 10:56:11 CDT 2009
Module: wine
Branch: master
Commit: 83e912743cb856c5c8e8ac51092e1b66ee5b24fb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=83e912743cb856c5c8e8ac51092e1b66ee5b24fb
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 30 15:36:38 2009 +0200
msxml3: Get rid of node internal IUnknown.
---
dlls/msxml3/attribute.c | 2 +-
dlls/msxml3/cdata.c | 2 +-
dlls/msxml3/comment.c | 2 +-
dlls/msxml3/docfrag.c | 2 +-
dlls/msxml3/domdoc.c | 2 +-
dlls/msxml3/element.c | 2 +-
dlls/msxml3/entityref.c | 2 +-
dlls/msxml3/msxml_private.h | 2 +-
dlls/msxml3/node.c | 104 ++++++++++++++++---------------------------
dlls/msxml3/pi.c | 2 +-
dlls/msxml3/text.c | 2 +-
11 files changed, 48 insertions(+), 76 deletions(-)
diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index ee2cdfa..426fdcb 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -93,7 +93,7 @@ static ULONG WINAPI domattr_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
HeapFree( GetProcessHeap(), 0, This );
}
diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 44d869d..b488203 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -100,7 +100,7 @@ static ULONG WINAPI domcdata_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
HeapFree( GetProcessHeap(), 0, This );
}
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 536d460..86712f3 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -94,7 +94,7 @@ static ULONG WINAPI domcomment_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
HeapFree( GetProcessHeap(), 0, This );
}
diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c
index 658773e..10a35b3 100644
--- a/dlls/msxml3/docfrag.c
+++ b/dlls/msxml3/docfrag.c
@@ -93,7 +93,7 @@ static ULONG WINAPI domfrag_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
HeapFree( GetProcessHeap(), 0, This );
}
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index ad0fe0a..b6bc189 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -509,7 +509,7 @@ static ULONG WINAPI domdoc_Release(
if (This->site)
IUnknown_Release( This->site );
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
if(This->schema) IXMLDOMSchemaCollection_Release( This->schema );
if (This->stream) IStream_Release(This->stream);
HeapFree( GetProcessHeap(), 0, This );
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 531d43e..accd0ed 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -108,7 +108,7 @@ static ULONG WINAPI domelem_Release(
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
heap_free(This);
}
diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c
index fb56862..820edc7 100644
--- a/dlls/msxml3/entityref.c
+++ b/dlls/msxml3/entityref.c
@@ -93,7 +93,7 @@ static ULONG WINAPI entityref_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
HeapFree( GetProcessHeap(), 0, This );
}
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 57dec0f..c4568f4 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -144,7 +144,6 @@ typedef struct _xmlnode
{
DispatchEx dispex;
const struct IXMLDOMNodeVtbl *lpVtbl;
- const struct IUnknownVtbl *lpInternalUnkVtbl;
IUnknown *pUnkOuter;
LONG ref;
xmlNodePtr node;
@@ -161,6 +160,7 @@ static inline IXMLDOMNode *IXMLDOMNode_from_impl(xmlnode *This)
}
extern xmlnode *create_basic_node(xmlNodePtr,IUnknown*,dispex_static_data_t*);
+extern void destroy_xmlnode(xmlnode*);
extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document);
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 987b07d..643f99e 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -66,11 +66,6 @@ static const WCHAR szFloat[] = {'f','l','o','a','t',0};
static const WCHAR szUUID[] = {'u','u','i','d',0};
static const WCHAR szBinHex[] = {'b','i','n','.','h','e','x',0};
-static inline xmlnode *impl_from_InternalUnknown( IUnknown *iface )
-{
- return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpInternalUnkVtbl));
-}
-
xmlNodePtr xmlNodePtr_from_domnode( IXMLDOMNode *iface, xmlElementType type )
{
xmlnode *This;
@@ -91,23 +86,52 @@ static HRESULT WINAPI xmlnode_QueryInterface(
void** ppvObject )
{
xmlnode *This = impl_from_IXMLDOMNode( iface );
+
TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
- return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
+ if(This->pUnkOuter)
+ return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
+
+ if (IsEqualGUID(riid, &IID_IUnknown)) {
+ *ppvObject = iface;
+ }else if (IsEqualGUID( riid, &IID_IDispatch) ||
+ IsEqualGUID( riid, &IID_IXMLDOMNode)) {
+ *ppvObject = &This->lpVtbl;
+ }else {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef( (IUnknown*)*ppvObject );
+ return S_OK;
}
static ULONG WINAPI xmlnode_AddRef(
IXMLDOMNode *iface )
{
xmlnode *This = impl_from_IXMLDOMNode( iface );
- return IUnknown_AddRef(This->pUnkOuter);
+
+ if(This->pUnkOuter)
+ return IUnknown_AddRef(This->pUnkOuter);
+
+ return InterlockedIncrement(&This->ref);
}
static ULONG WINAPI xmlnode_Release(
IXMLDOMNode *iface )
{
xmlnode *This = impl_from_IXMLDOMNode( iface );
- return IUnknown_Release(This->pUnkOuter);
+ LONG ref;
+
+ if(This->pUnkOuter)
+ return IUnknown_Release(This->pUnkOuter);
+
+ ref = InterlockedDecrement( &This->ref );
+ if(!ref)
+ destroy_xmlnode(This);
+
+ return ref;
}
static HRESULT WINAPI xmlnode_GetTypeInfoCount(
@@ -1484,64 +1508,13 @@ static const struct IXMLDOMNodeVtbl xmlnode_vtbl =
xmlnode_transformNodeToObject,
};
-static HRESULT WINAPI Internal_QueryInterface(
- IUnknown *iface,
- REFIID riid,
- void** ppvObject )
+void destroy_xmlnode(xmlnode *This)
{
- xmlnode *This = impl_from_InternalUnknown( iface );
-
- TRACE("%p %s %p\n", iface, debugstr_guid(riid), ppvObject);
-
-
- if ( IsEqualGUID( riid, &IID_IUnknown ))
- *ppvObject = iface;
- else if ( IsEqualGUID( riid, &IID_IDispatch ) ||
- IsEqualGUID( riid, &IID_IXMLDOMNode ) )
- *ppvObject = &This->lpVtbl;
- else
- {
- FIXME("interface %s not implemented\n", debugstr_guid(riid));
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
-
- IUnknown_AddRef( (IUnknown*)*ppvObject );
-
- return S_OK;
-}
-
-static ULONG WINAPI Internal_AddRef(
- IUnknown *iface )
-{
- xmlnode *This = impl_from_InternalUnknown( iface );
- return InterlockedIncrement( &This->ref );
+ if(This->node)
+ xmldoc_release(This->node->doc);
+ HeapFree( GetProcessHeap(), 0, This );
}
-static ULONG WINAPI Internal_Release(
- IUnknown *iface )
-{
- xmlnode *This = impl_from_InternalUnknown( iface );
- ULONG ref;
-
- ref = InterlockedDecrement( &This->ref );
- if ( ref == 0 )
- {
- if( This->node )
- xmldoc_release( This->node->doc );
- HeapFree( GetProcessHeap(), 0, This );
- }
-
- return ref;
-}
-
-static const struct IUnknownVtbl internal_unk_vtbl =
-{
- Internal_QueryInterface,
- Internal_AddRef,
- Internal_Release
-};
-
xmlnode *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter, dispex_static_data_t *dispex_data )
{
xmlnode *This;
@@ -1554,12 +1527,11 @@ xmlnode *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter, dispex_static_
xmldoc_add_ref( node->doc );
This->lpVtbl = &xmlnode_vtbl;
- This->lpInternalUnkVtbl = &internal_unk_vtbl;
if(pUnkOuter)
This->pUnkOuter = pUnkOuter; /* Don't take a ref on outer Unknown */
else
- This->pUnkOuter = (IUnknown *)&This->lpInternalUnkVtbl;
+ This->pUnkOuter = NULL;
if(dispex_data)
init_dispex(&This->dispex, This->pUnkOuter, dispex_data);
@@ -1602,7 +1574,7 @@ IXMLDOMNode *create_node( xmlNodePtr node )
break;
default:
FIXME("only creating basic node for type %d\n", node->type);
- pUnk = (IUnknown*)&create_basic_node( node, NULL, NULL )->lpInternalUnkVtbl;
+ pUnk = (IUnknown*)&create_basic_node( node, NULL, NULL )->lpVtbl;
}
hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index 2156ab5..859e128 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -93,7 +93,7 @@ static ULONG WINAPI dom_pi_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
HeapFree( GetProcessHeap(), 0, This );
}
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 5856c93..a384bea 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -102,7 +102,7 @@ static ULONG WINAPI domtext_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ destroy_xmlnode(This->node);
HeapFree( GetProcessHeap(), 0, This );
}
More information about the wine-cvs
mailing list