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