[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    rfc: refactoring msxml3 to get rid of aggregation
From:       Michael Karcher <wine () mkarcher ! dialup ! fu-berlin ! de>
Date:       2008-10-31 0:12:54
Message-ID: 1225411974.4438.93.camel () hermes2 ! karcher ! local
[Download RAW message or body]

Hello developers,

the msxml3 code currently uses aggregation to implement IXMLDOMNode on
all of the different DOM tree elements. As the interfaces for these
elements are all derived from IXMLDOMNode, a lot of forwarding thunks
have to be implemented to get the calls into the inner object. The
attached patch series modifies the source code to derive the objects
instead, which seems like the more natural approach to get derived
interfaces implemented.

The attached patches still have to be cleaned up: They contain lines
ending with whitespace, incosistent spacing around function call
parenthesis, incosistent style of using a cast helper function or direct
casting and other small nits.

A more important problem with these patches that make me write this mail
is that they generate lots of compiler warnings like
| domdoc.c:1556: warning: initialization from incompatible pointer type
which is of no surprise, as the vtable for domdoc expects a function
taking an IXMLDOMDocument as "this" pointer while I provide a function
taking an interface pointer to an IXMLDOMNode as "this" pointer. Both of
these pointers point to the same address (as usual for derived objects),
so the conversion is safe, but the simple-minded C compiler can't know
that.

The question that arises is how to handle these warnings.
 a) ignore them (most probably not an option)
 b) add lots of casts (only way to make the idea of these patches fly)
 c) write lots of little forwarding functions that convert the this
     pointer.
 d) ditch the idea of using derivation instead of aggregation

Any oppions on that? I (obviously) think that b is the right solution,
but as a quick grep over the Wine source code revealed, this solution
seems to be used nowhere. Is that because this is the first place where
deriving makes sense or is that because I'm completely off-track?

Kind regards,
  Michael Karcher

PS: The munged "From " lines in the attached patches are intentional.
They keep my email program from choosing "application/mbox" as MIME
type.

["0002-msxml3-declare-IXMLDOMNode-functions-non-static-for.diff" (0002-msxml3-declare-IXMLDOMNode-functions-non-static-for.diff)]

> From0ece38f9de5ec93bfae8eb743c62dd2e68526a1f Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Wed, 29 Oct 2008 00:26:12 +0100
Subject: [PATCH] msxml3: declare IXMLDOMNode functions non-static for derived \
classes.

---
 dlls/msxml3/msxml_private.h |   41 ++++++++++++++++++++++
 dlls/msxml3/node.c          |   78 +++++++++++++++++++++---------------------
 2 files changed, 80 insertions(+), 39 deletions(-)

diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 45d68cf..e07e63c 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -90,6 +90,47 @@ static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
 
 extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 \
**document);  
+/* IXMLDOMNode functions (used for inheritance) */
+extern HRESULT WINAPI xmlnode_QueryInterface(IXMLDOMNode *iface, REFIID riid, void** \
ppvObject); +extern ULONG WINAPI xmlnode_AddRef(IXMLDOMNode *iface);
+extern ULONG WINAPI xmlnode_Release(IXMLDOMNode *iface);
+extern HRESULT WINAPI xmlnode_get_nodeName(IXMLDOMNode *iface, BSTR* name);
+extern HRESULT WINAPI xmlnode_get_nodeValue(IXMLDOMNode *iface, VARIANT* value);
+extern HRESULT WINAPI xmlnode_put_nodeValue(IXMLDOMNode *iface, VARIANT value);
+extern HRESULT WINAPI xmlnode_get_nodeType(IXMLDOMNode *iface, DOMNodeType* type);
+extern HRESULT WINAPI xmlnode_get_parentNode(IXMLDOMNode *iface, IXMLDOMNode** \
parent); +extern HRESULT WINAPI xmlnode_get_childNodes(IXMLDOMNode *iface, \
IXMLDOMNodeList** childList); +extern HRESULT WINAPI \
xmlnode_get_firstChild(IXMLDOMNode *iface, IXMLDOMNode** firstChild); +extern HRESULT \
WINAPI xmlnode_get_lastChild(IXMLDOMNode *iface, IXMLDOMNode** lastChild); +extern \
HRESULT WINAPI xmlnode_get_previousSibling(IXMLDOMNode *iface, IXMLDOMNode** \
previousSibling); +extern HRESULT WINAPI xmlnode_get_nextSibling(IXMLDOMNode *iface, \
IXMLDOMNode** nextSibling); +extern HRESULT WINAPI xmlnode_get_attributes(IXMLDOMNode \
*iface, IXMLDOMNamedNodeMap** attributeMap); +extern HRESULT WINAPI \
xmlnode_insertBefore( IXMLDOMNode *iface, IXMLDOMNode* newChild,VARIANT refChild, \
IXMLDOMNode** outNewChild); +extern HRESULT WINAPI xmlnode_replaceChild( IXMLDOMNode \
*iface, IXMLDOMNode* newChild,IXMLDOMNode* oldChild, IXMLDOMNode** outOldChild); \
+extern HRESULT WINAPI xmlnode_removeChild( IXMLDOMNode *iface,IXMLDOMNode* \
childNode, IXMLDOMNode** oldChild); +extern HRESULT WINAPI xmlnode_appendChild( \
IXMLDOMNode *iface,IXMLDOMNode* newChild, IXMLDOMNode** outNewChild); +extern HRESULT \
WINAPI xmlnode_hasChildNodes(IXMLDOMNode *iface, VARIANT_BOOL* hasChild); +extern \
HRESULT WINAPI xmlnode_get_ownerDocument(IXMLDOMNode *iface, IXMLDOMDocument** \
DOMDocument); +extern HRESULT WINAPI xmlnode_cloneNode( IXMLDOMNode \
*iface,VARIANT_BOOL deep, IXMLDOMNode** cloneRoot); +extern HRESULT WINAPI \
xmlnode_get_nodeTypeString(IXMLDOMNode *iface, BSTR* xmlnodeType); +extern HRESULT \
WINAPI xmlnode_get_text(IXMLDOMNode *iface, BSTR* text); +extern HRESULT WINAPI \
xmlnode_put_text(IXMLDOMNode *iface, BSTR text); +extern HRESULT WINAPI \
xmlnode_get_specified(IXMLDOMNode *iface, VARIANT_BOOL* isSpecified); +extern HRESULT \
WINAPI xmlnode_get_definition(IXMLDOMNode *iface, IXMLDOMNode** definitionNode); \
+extern HRESULT WINAPI xmlnode_get_nodeTypedValue(IXMLDOMNode *iface, VARIANT* \
typedValue); +extern HRESULT WINAPI xmlnode_put_nodeTypedValue(IXMLDOMNode *iface, \
VARIANT typedValue); +extern HRESULT WINAPI xmlnode_get_dataType(IXMLDOMNode *iface, \
VARIANT* dataTypeName); +extern HRESULT WINAPI xmlnode_put_dataType(IXMLDOMNode \
*iface, BSTR dataTypeName); +extern HRESULT WINAPI xmlnode_get_xml(IXMLDOMNode \
*iface, BSTR* xmlString); +extern HRESULT WINAPI xmlnode_transformNode( IXMLDOMNode \
*iface,IXMLDOMNode* styleSheet, BSTR* xmlString); +extern HRESULT WINAPI \
xmlnode_selectNodes( IXMLDOMNode *iface,BSTR queryString, IXMLDOMNodeList** \
resultList); +extern HRESULT WINAPI xmlnode_selectSingleNode( IXMLDOMNode *iface,BSTR \
queryString, IXMLDOMNode** resultNode); +extern HRESULT WINAPI \
xmlnode_get_parsed(IXMLDOMNode *iface, VARIANT_BOOL* isParsed); +extern HRESULT \
WINAPI xmlnode_get_namespaceURI(IXMLDOMNode *iface, BSTR* namespaceURI); +extern \
HRESULT WINAPI xmlnode_get_prefix(IXMLDOMNode *iface, BSTR* prefixString); +extern \
HRESULT WINAPI xmlnode_get_baseName(IXMLDOMNode *iface, BSTR* nameString); +extern \
HRESULT WINAPI xmlnode_transformNodeToObject( IXMLDOMNode *iface,IXMLDOMNode* \
stylesheet, VARIANT outputObject); +
 #endif
 
 extern IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR \
                srcText,
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 3162f82..43bb284 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -110,7 +110,7 @@ void attach_xmlnode( IXMLDOMNode *node, xmlNodePtr xml )
     return;
 }
 
-static HRESULT WINAPI xmlnode_QueryInterface(
+HRESULT WINAPI xmlnode_QueryInterface(
     IXMLDOMNode *iface,
     REFIID riid,
     void** ppvObject )
@@ -121,14 +121,14 @@ static HRESULT WINAPI xmlnode_QueryInterface(
     return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
 }
 
-static ULONG WINAPI xmlnode_AddRef(
+ULONG WINAPI xmlnode_AddRef(
     IXMLDOMNode *iface )
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
     return IUnknown_AddRef(This->pUnkOuter);
 }
 
-static ULONG WINAPI xmlnode_Release(
+ULONG WINAPI xmlnode_Release(
     IXMLDOMNode *iface )
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
@@ -222,7 +222,7 @@ static HRESULT WINAPI xmlnode_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI xmlnode_get_nodeName(
+HRESULT WINAPI xmlnode_get_nodeName(
     IXMLDOMNode *iface,
     BSTR* name)
 {
@@ -291,7 +291,7 @@ BSTR bstr_from_xmlChar( const xmlChar *buf )
     return bstr;
 }
 
-static HRESULT WINAPI xmlnode_get_nodeValue(
+HRESULT WINAPI xmlnode_get_nodeValue(
     IXMLDOMNode *iface,
     VARIANT* value)
 {
@@ -339,7 +339,7 @@ static HRESULT WINAPI xmlnode_get_nodeValue(
     return r;
 }
 
-static HRESULT WINAPI xmlnode_put_nodeValue(
+HRESULT WINAPI xmlnode_put_nodeValue(
     IXMLDOMNode *iface,
     VARIANT value)
 {
@@ -386,7 +386,7 @@ static HRESULT WINAPI xmlnode_put_nodeValue(
     return hr;
 }
 
-static HRESULT WINAPI xmlnode_get_nodeType(
+HRESULT WINAPI xmlnode_get_nodeType(
     IXMLDOMNode *iface,
     DOMNodeType* type)
 {
@@ -418,7 +418,7 @@ static HRESULT get_node(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_get_parentNode(
+HRESULT WINAPI xmlnode_get_parentNode(
     IXMLDOMNode *iface,
     IXMLDOMNode** parent)
 {
@@ -426,7 +426,7 @@ static HRESULT WINAPI xmlnode_get_parentNode(
     return get_node( This, "parent", This->node->parent, parent );
 }
 
-static HRESULT WINAPI xmlnode_get_childNodes(
+HRESULT WINAPI xmlnode_get_childNodes(
     IXMLDOMNode *iface,
     IXMLDOMNodeList** childList)
 {
@@ -444,7 +444,7 @@ static HRESULT WINAPI xmlnode_get_childNodes(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_get_firstChild(
+HRESULT WINAPI xmlnode_get_firstChild(
     IXMLDOMNode *iface,
     IXMLDOMNode** firstChild)
 {
@@ -452,7 +452,7 @@ static HRESULT WINAPI xmlnode_get_firstChild(
     return get_node( This, "firstChild", This->node->children, firstChild );
 }
 
-static HRESULT WINAPI xmlnode_get_lastChild(
+HRESULT WINAPI xmlnode_get_lastChild(
     IXMLDOMNode *iface,
     IXMLDOMNode** lastChild)
 {
@@ -477,7 +477,7 @@ static HRESULT WINAPI xmlnode_get_lastChild(
     }
 }
 
-static HRESULT WINAPI xmlnode_get_previousSibling(
+HRESULT WINAPI xmlnode_get_previousSibling(
     IXMLDOMNode *iface,
     IXMLDOMNode** previousSibling)
 {
@@ -501,7 +501,7 @@ static HRESULT WINAPI xmlnode_get_previousSibling(
     }
 }
 
-static HRESULT WINAPI xmlnode_get_nextSibling(
+HRESULT WINAPI xmlnode_get_nextSibling(
     IXMLDOMNode *iface,
     IXMLDOMNode** nextSibling)
 {
@@ -525,7 +525,7 @@ static HRESULT WINAPI xmlnode_get_nextSibling(
     }
 }
 
-static HRESULT WINAPI xmlnode_get_attributes(
+HRESULT WINAPI xmlnode_get_attributes(
     IXMLDOMNode *iface,
     IXMLDOMNamedNodeMap** attributeMap)
 {
@@ -555,7 +555,7 @@ static HRESULT WINAPI xmlnode_get_attributes(
     }
 }
 
-static HRESULT WINAPI xmlnode_insertBefore(
+HRESULT WINAPI xmlnode_insertBefore(
     IXMLDOMNode *iface,
     IXMLDOMNode* newChild,
     VARIANT refChild,
@@ -620,7 +620,7 @@ static HRESULT WINAPI xmlnode_insertBefore(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_replaceChild(
+HRESULT WINAPI xmlnode_replaceChild(
     IXMLDOMNode *iface,
     IXMLDOMNode* newChild,
     IXMLDOMNode* oldChild,
@@ -687,7 +687,7 @@ static HRESULT WINAPI xmlnode_replaceChild(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_removeChild(
+HRESULT WINAPI xmlnode_removeChild(
     IXMLDOMNode *iface,
     IXMLDOMNode* childNode,
     IXMLDOMNode** oldChild)
@@ -729,7 +729,7 @@ static HRESULT WINAPI xmlnode_removeChild(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_appendChild(
+HRESULT WINAPI xmlnode_appendChild(
     IXMLDOMNode *iface,
     IXMLDOMNode* newChild,
     IXMLDOMNode** outNewChild)
@@ -751,7 +751,7 @@ static HRESULT WINAPI xmlnode_appendChild(
     return IXMLDOMNode_insertBefore(iface, newChild, var, outNewChild);
 }
 
-static HRESULT WINAPI xmlnode_hasChildNodes(
+HRESULT WINAPI xmlnode_hasChildNodes(
     IXMLDOMNode *iface,
     VARIANT_BOOL* hasChild)
 {
@@ -771,7 +771,7 @@ static HRESULT WINAPI xmlnode_hasChildNodes(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_get_ownerDocument(
+HRESULT WINAPI xmlnode_get_ownerDocument(
     IXMLDOMNode *iface,
     IXMLDOMDocument** DOMDocument)
 {
@@ -782,7 +782,7 @@ static HRESULT WINAPI xmlnode_get_ownerDocument(
     return DOMDocument_create_from_xmldoc(This->node->doc, \
(IXMLDOMDocument2**)DOMDocument);  }
 
-static HRESULT WINAPI xmlnode_cloneNode(
+HRESULT WINAPI xmlnode_cloneNode(
     IXMLDOMNode *iface,
     VARIANT_BOOL deep,
     IXMLDOMNode** cloneRoot)
@@ -820,7 +820,7 @@ static HRESULT WINAPI xmlnode_cloneNode(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_get_nodeTypeString(
+HRESULT WINAPI xmlnode_get_nodeTypeString(
     IXMLDOMNode *iface,
     BSTR* xmlnodeType)
 {
@@ -883,7 +883,7 @@ static HRESULT WINAPI xmlnode_get_nodeTypeString(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_get_text(
+HRESULT WINAPI xmlnode_get_text(
     IXMLDOMNode *iface,
     BSTR* text)
 {
@@ -926,7 +926,7 @@ static HRESULT WINAPI xmlnode_get_text(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_put_text(
+HRESULT WINAPI xmlnode_put_text(
     IXMLDOMNode *iface,
     BSTR text)
 {
@@ -957,7 +957,7 @@ static HRESULT WINAPI xmlnode_put_text(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_get_specified(
+HRESULT WINAPI xmlnode_get_specified(
     IXMLDOMNode *iface,
     VARIANT_BOOL* isSpecified)
 {
@@ -965,7 +965,7 @@ static HRESULT WINAPI xmlnode_get_specified(
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI xmlnode_get_definition(
+HRESULT WINAPI xmlnode_get_definition(
     IXMLDOMNode *iface,
     IXMLDOMNode** definitionNode)
 {
@@ -973,7 +973,7 @@ static HRESULT WINAPI xmlnode_get_definition(
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI xmlnode_get_nodeTypedValue(
+HRESULT WINAPI xmlnode_get_nodeTypedValue(
     IXMLDOMNode *iface,
     VARIANT* typedValue)
 {
@@ -1005,7 +1005,7 @@ static HRESULT WINAPI xmlnode_get_nodeTypedValue(
     return r;
 }
 
-static HRESULT WINAPI xmlnode_put_nodeTypedValue(
+HRESULT WINAPI xmlnode_put_nodeTypedValue(
     IXMLDOMNode *iface,
     VARIANT typedValue)
 {
@@ -1013,7 +1013,7 @@ static HRESULT WINAPI xmlnode_put_nodeTypedValue(
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI xmlnode_get_dataType(
+HRESULT WINAPI xmlnode_get_dataType(
     IXMLDOMNode *iface,
     VARIANT* dataTypeName)
 {
@@ -1058,7 +1058,7 @@ static HRESULT WINAPI xmlnode_get_dataType(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_put_dataType(
+HRESULT WINAPI xmlnode_put_dataType(
     IXMLDOMNode *iface,
     BSTR dataTypeName)
 {
@@ -1219,7 +1219,7 @@ static BSTR EnsureNoEncoding(BSTR sInput)
  * reproduce behaviour exactly.
  *
  */
-static HRESULT WINAPI xmlnode_get_xml(
+HRESULT WINAPI xmlnode_get_xml(
     IXMLDOMNode *iface,
     BSTR* xmlString)
 {
@@ -1273,7 +1273,7 @@ static HRESULT WINAPI xmlnode_get_xml(
     return S_OK;
 }
 
-static HRESULT WINAPI xmlnode_transformNode(
+HRESULT WINAPI xmlnode_transformNode(
     IXMLDOMNode *iface,
     IXMLDOMNode* styleSheet,
     BSTR* xmlString)
@@ -1358,7 +1358,7 @@ static HRESULT WINAPI xmlnode_transformNode(
 #endif
 }
 
-static HRESULT WINAPI xmlnode_selectNodes(
+HRESULT WINAPI xmlnode_selectNodes(
     IXMLDOMNode *iface,
     BSTR queryString,
     IXMLDOMNodeList** resultList)
@@ -1370,7 +1370,7 @@ static HRESULT WINAPI xmlnode_selectNodes(
     return queryresult_create( This->node, queryString, resultList );
 }
 
-static HRESULT WINAPI xmlnode_selectSingleNode(
+HRESULT WINAPI xmlnode_selectSingleNode(
     IXMLDOMNode *iface,
     BSTR queryString,
     IXMLDOMNode** resultNode)
@@ -1391,7 +1391,7 @@ static HRESULT WINAPI xmlnode_selectSingleNode(
     return r;
 }
 
-static HRESULT WINAPI xmlnode_get_parsed(
+HRESULT WINAPI xmlnode_get_parsed(
     IXMLDOMNode *iface,
     VARIANT_BOOL* isParsed)
 {
@@ -1399,7 +1399,7 @@ static HRESULT WINAPI xmlnode_get_parsed(
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI xmlnode_get_namespaceURI(
+HRESULT WINAPI xmlnode_get_namespaceURI(
     IXMLDOMNode *iface,
     BSTR* namespaceURI)
 {
@@ -1426,7 +1426,7 @@ static HRESULT WINAPI xmlnode_get_namespaceURI(
     return hr;
 }
 
-static HRESULT WINAPI xmlnode_get_prefix(
+HRESULT WINAPI xmlnode_get_prefix(
     IXMLDOMNode *iface,
     BSTR* prefixString)
 {
@@ -1453,7 +1453,7 @@ static HRESULT WINAPI xmlnode_get_prefix(
     return hr;
 }
 
-static HRESULT WINAPI xmlnode_get_baseName(
+HRESULT WINAPI xmlnode_get_baseName(
     IXMLDOMNode *iface,
     BSTR* nameString)
 {
@@ -1486,7 +1486,7 @@ static HRESULT WINAPI xmlnode_get_baseName(
     return r;
 }
 
-static HRESULT WINAPI xmlnode_transformNodeToObject(
+HRESULT WINAPI xmlnode_transformNodeToObject(
     IXMLDOMNode *iface,
     IXMLDOMNode* stylesheet,
     VARIANT outputObject)
-- 
1.5.6.5


["0003-msxml3-Add-a-non-allocating-constructor-to-node.diff" (0003-msxml3-Add-a-non-allocating-constructor-to-node.diff)]

>Fromfbee7b35ad1a2f5254d5383f61db9814d9cde999 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Wed, 29 Oct 2008 23:41:03 +0100
Subject: [PATCH] msxml3: Add a non-allocating "constructor" to node

---
 dlls/msxml3/msxml_private.h |    6 ++++++
 dlls/msxml3/node.c          |   19 +++++++++++--------
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index e07e63c..6782a8b 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -88,6 +88,12 @@ static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
     return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
 }
 
+static inline xmlnode *impl_from_NodeInternalUnknown( IUnknown *iface )
+{
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpInternalUnkVtbl));
+}
+
+extern void init_basic_node( xmlnode * dest, xmlNodePtr node );
 extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document);
 
 /* IXMLDOMNode functions (used for inheritance) */
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 43bb284..c46667b 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1608,21 +1608,24 @@ IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
     if ( !This )
         return NULL;
 
+    init_basic_node( This, node );
+
+    if(pUnkOuter)
+        This->pUnkOuter = pUnkOuter; /* Don't take a ref on outer Unknown */
+
+    return (IUnknown*)&This->lpInternalUnkVtbl;
+}
+
+void init_basic_node( xmlnode * This, xmlNodePtr node )
+{
     if(node)
         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 = (IUnknown *)&This->lpInternalUnkVtbl;
     This->ref = 1;
     This->node = node;
-
-    return (IUnknown*)&This->lpInternalUnkVtbl;
 }
 
 IXMLDOMNode *create_node( xmlNodePtr node )
-- 
1.5.6.5


["0004-msxml3-Derive-element-from-node-instead-of-aggregat.diff" (0004-msxml3-Derive-element-from-node-instead-of-aggregat.diff)]

>From2f2b6b7d88d7ab26be0e8f0ed785bb5c0f671f34 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Wed, 29 Oct 2008 00:26:55 +0100
Subject: [PATCH] msxml3: Derive element from node instead of aggregation.

---
 dlls/msxml3/element.c |  479 ++++++-------------------------------------------
 1 files changed, 59 insertions(+), 420 deletions(-)

diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 4b9bf6c..da7ea90 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -38,61 +38,21 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _domelem
+static inline xmlnode *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
 {
-    const struct IXMLDOMElementVtbl *lpVtbl;
-    const struct IUnknownVtbl *lpInternalUnkVtbl;
-    IUnknown *pUnkOuter;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} domelem;
-
-static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
-{
-    return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpVtbl));
-}
-
-static inline domelem *impl_from_InternalUnknown( IUnknown *iface )
-{
-    return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpInternalUnkVtbl));
-}
-
-static inline xmlNodePtr get_element( domelem *This )
-{
-    return xmlNodePtr_from_domnode( This->node, XML_ELEMENT_NODE );
-}
-
-static HRESULT WINAPI domelem_QueryInterface(
-    IXMLDOMElement *iface,
-    REFIID riid,
-    void** ppvObject )
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
-
-    return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
-}
-
-static ULONG WINAPI domelem_AddRef(
-    IXMLDOMElement *iface )
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IUnknown_AddRef(This->pUnkOuter);
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
 }
 
-static ULONG WINAPI domelem_Release(
-    IXMLDOMElement *iface )
+static inline xmlNodePtr get_element( xmlnode *This )
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IUnknown_Release(This->pUnkOuter);
+    return xmlNodePtr_from_domnode( (IXMLDOMNode*)This, XML_ELEMENT_NODE );
 }
 
 static HRESULT WINAPI domelem_GetTypeInfoCount(
     IXMLDOMElement *iface,
     UINT* pctinfo )
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
 
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
@@ -106,7 +66,7 @@ static HRESULT WINAPI domelem_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -121,7 +81,7 @@ static HRESULT WINAPI domelem_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -147,7 +107,7 @@ static HRESULT WINAPI domelem_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -165,302 +125,11 @@ static HRESULT WINAPI domelem_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domelem_get_nodeName(
-    IXMLDOMElement *iface,
-    BSTR* p )
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI domelem_get_nodeValue(
-    IXMLDOMElement *iface,
-    VARIANT* var1 )
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domelem_put_nodeValue(
-    IXMLDOMElement *iface,
-    VARIANT var1 )
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domelem_get_nodeType(
-    IXMLDOMElement *iface,
-    DOMNodeType* domNodeType )
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI domelem_get_parentNode(
-    IXMLDOMElement *iface,
-    IXMLDOMNode** parent )
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI domelem_get_childNodes(
-    IXMLDOMElement *iface,
-    IXMLDOMNodeList** outList)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI domelem_get_firstChild(
-    IXMLDOMElement *iface,
-    IXMLDOMNode** domNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domelem_get_lastChild(
-    IXMLDOMElement *iface,
-    IXMLDOMNode** domNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domelem_get_previousSibling(
-    IXMLDOMElement *iface,
-    IXMLDOMNode** domNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domelem_get_nextSibling(
-    IXMLDOMElement *iface,
-    IXMLDOMNode** domNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domelem_get_attributes(
-    IXMLDOMElement *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI domelem_insertBefore(
-    IXMLDOMElement *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI domelem_replaceChild(
-    IXMLDOMElement *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI domelem_removeChild(
-    IXMLDOMElement *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI domelem_appendChild(
-    IXMLDOMElement *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI domelem_hasChildNodes(
-    IXMLDOMElement *iface,
-    VARIANT_BOOL* pbool)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI domelem_get_ownerDocument(
-    IXMLDOMElement *iface,
-    IXMLDOMDocument** domDocument)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI domelem_cloneNode(
-    IXMLDOMElement *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI domelem_get_nodeTypeString(
-    IXMLDOMElement *iface,
-    BSTR* p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI domelem_get_text(
-    IXMLDOMElement *iface,
-    BSTR* p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI domelem_put_text(
-    IXMLDOMElement *iface,
-    BSTR p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI domelem_get_specified(
-    IXMLDOMElement *iface,
-    VARIANT_BOOL* pbool)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI domelem_get_definition(
-    IXMLDOMElement *iface,
-    IXMLDOMNode** domNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI domelem_get_nodeTypedValue(
-    IXMLDOMElement *iface,
-    VARIANT* var1)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domelem_put_nodeTypedValue(
-    IXMLDOMElement *iface,
-    VARIANT var1)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domelem_get_dataType(
-    IXMLDOMElement *iface,
-    VARIANT* var1)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI domelem_put_dataType(
-    IXMLDOMElement *iface,
-    BSTR p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI domelem_get_xml(
-    IXMLDOMElement *iface,
-    BSTR* p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI domelem_transformNode(
-    IXMLDOMElement *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI domelem_selectNodes(
-    IXMLDOMElement *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI domelem_selectSingleNode(
-    IXMLDOMElement *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI domelem_get_parsed(
-    IXMLDOMElement *iface,
-    VARIANT_BOOL* pbool)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI domelem_get_namespaceURI(
-    IXMLDOMElement *iface,
-    BSTR* p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI domelem_get_prefix(
-    IXMLDOMElement *iface,
-    BSTR* p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI domelem_get_baseName(
-    IXMLDOMElement *iface,
-    BSTR* p)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI domelem_transformNodeToObject(
-    IXMLDOMElement *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    domelem *This = impl_from_IXMLDOMElement( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
-}
-
 static HRESULT WINAPI domelem_get_tagName(
     IXMLDOMElement *iface,
     BSTR* p)
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     xmlNodePtr element;
     DWORD len;
     DWORD offset = 0;
@@ -497,7 +166,7 @@ static HRESULT WINAPI domelem_getAttribute(
     IXMLDOMElement *iface,
     BSTR name, VARIANT* value)
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     xmlNodePtr element;
     xmlChar *xml_name, *xml_value = NULL;
     HRESULT hr = S_FALSE;
@@ -537,7 +206,7 @@ static HRESULT WINAPI domelem_setAttribute(
     IXMLDOMElement *iface,
     BSTR name, VARIANT value)
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     xmlNodePtr element;
     xmlChar *xml_name, *xml_value;
     HRESULT hr;
@@ -582,7 +251,7 @@ static HRESULT WINAPI domelem_getAttributeNode(
     IXMLDOMElement *iface,
     BSTR p, IXMLDOMAttribute** attributeNode )
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     xmlChar *xml_name;
     xmlNodePtr element;
     xmlAttrPtr attr;
@@ -633,7 +302,7 @@ static HRESULT WINAPI domelem_getElementsByTagName(
     IXMLDOMElement *iface,
     BSTR bstrName, IXMLDOMNodeList** resultList)
 {
-    domelem *This = impl_from_IXMLDOMElement( iface );
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
     LPWSTR szPattern;
     HRESULT hr;
 
@@ -660,49 +329,49 @@ static HRESULT WINAPI domelem_normalize(
 
 static const struct IXMLDOMElementVtbl domelem_vtbl =
 {
-    domelem_QueryInterface,
-    domelem_AddRef,
-    domelem_Release,
+    xmlnode_QueryInterface,
+    xmlnode_AddRef,
+    xmlnode_Release,
     domelem_GetTypeInfoCount,
     domelem_GetTypeInfo,
     domelem_GetIDsOfNames,
     domelem_Invoke,
-    domelem_get_nodeName,
-    domelem_get_nodeValue,
-    domelem_put_nodeValue,
-    domelem_get_nodeType,
-    domelem_get_parentNode,
-    domelem_get_childNodes,
-    domelem_get_firstChild,
-    domelem_get_lastChild,
-    domelem_get_previousSibling,
-    domelem_get_nextSibling,
-    domelem_get_attributes,
-    domelem_insertBefore,
-    domelem_replaceChild,
-    domelem_removeChild,
-    domelem_appendChild,
-    domelem_hasChildNodes,
-    domelem_get_ownerDocument,
-    domelem_cloneNode,
-    domelem_get_nodeTypeString,
-    domelem_get_text,
-    domelem_put_text,
-    domelem_get_specified,
-    domelem_get_definition,
-    domelem_get_nodeTypedValue,
-    domelem_put_nodeTypedValue,
-    domelem_get_dataType,
-    domelem_put_dataType,
-    domelem_get_xml,
-    domelem_transformNode,
-    domelem_selectNodes,
-    domelem_selectSingleNode,
-    domelem_get_parsed,
-    domelem_get_namespaceURI,
-    domelem_get_prefix,
-    domelem_get_baseName,
-    domelem_transformNodeToObject,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
     domelem_get_tagName,
     domelem_getAttribute,
     domelem_setAttribute,
@@ -719,19 +388,16 @@ static HRESULT WINAPI Internal_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    domelem *This = impl_from_InternalUnknown( iface );
+    xmlnode *This = impl_from_NodeInternalUnknown( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = &This->lpVtbl;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("interface %s not implemented\n", debugstr_guid(riid));
@@ -746,22 +412,19 @@ static HRESULT WINAPI Internal_QueryInterface(
 static ULONG WINAPI Internal_AddRef(
     IUnknown *iface )
 {
-    domelem *This = impl_from_InternalUnknown( iface );
+    xmlnode *This = impl_from_NodeInternalUnknown( iface );
     return InterlockedIncrement( &This->ref );
 }
 
 static ULONG WINAPI Internal_Release(
     IUnknown *iface )
 {
-    domelem *This = impl_from_InternalUnknown( iface );
+    xmlnode *This = impl_from_NodeInternalUnknown( iface );
     ULONG ref;
 
     ref = InterlockedDecrement( &This->ref );
     if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
         HeapFree( GetProcessHeap(), 0, This );
-    }
 
     return ref;
 }
@@ -775,39 +438,15 @@ static const struct IUnknownVtbl internal_unk_vtbl =
 
 IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter )
 {
-    domelem *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown(create_basic_node( element, pUnkOuter ));
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &domelem_vtbl;
-    This->ref = 1;
+    This->lpVtbl = (IXMLDOMNodeVtbl*)&domelem_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->node_unk = create_basic_node( element, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
-
     return (IUnknown*) &This->lpInternalUnkVtbl;
 }
 
-- 
1.5.6.5


["0005-msxml3-Derive-text-from-node-instead-of-aggregation.diff" (0005-msxml3-Derive-text-from-node-instead-of-aggregation.diff)]

>From1fd488b4f148c8529bb640ec4a3a3e1e4a9d8540 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Wed, 29 Oct 2008 00:42:46 +0100
Subject: [PATCH] msxml3: Derive text from node instead of aggregation

---
 dlls/msxml3/text.c |  474 +++++++---------------------------------------------
 1 files changed, 64 insertions(+), 410 deletions(-)

diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index f8e1fc4..847564d 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -38,17 +38,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _domtext
+static inline xmlnode *impl_from_IXMLDOMText( IXMLDOMText *iface )
 {
-    const struct IXMLDOMTextVtbl *lpVtbl;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} domtext;
-
-static inline domtext *impl_from_IXMLDOMText( IXMLDOMText *iface )
-{
-    return (domtext *)((char*)iface - FIELD_OFFSET(domtext, lpVtbl));
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
 }
 
 static HRESULT WINAPI domtext_QueryInterface(
@@ -56,20 +48,17 @@ static HRESULT WINAPI domtext_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMText ) ||
          IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -81,34 +70,11 @@ static HRESULT WINAPI domtext_QueryInterface(
     return S_OK;
 }
 
-static ULONG WINAPI domtext_AddRef(
-    IXMLDOMText *iface )
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI domtext_Release(
-    IXMLDOMText *iface )
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
-        HeapFree( GetProcessHeap(), 0, This );
-    }
-
-    return ref;
-}
-
 static HRESULT WINAPI domtext_GetTypeInfoCount(
     IXMLDOMText *iface,
     UINT* pctinfo )
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
 
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
@@ -122,7 +88,7 @@ static HRESULT WINAPI domtext_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -137,7 +103,7 @@ static HRESULT WINAPI domtext_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -163,7 +129,7 @@ static HRESULT WINAPI domtext_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -181,309 +147,20 @@ static HRESULT WINAPI domtext_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domtext_get_nodeName(
-    IXMLDOMText *iface,
-    BSTR* p )
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI domtext_get_nodeValue(
-    IXMLDOMText *iface,
-    VARIANT* var1 )
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domtext_put_nodeValue(
-    IXMLDOMText *iface,
-    VARIANT var1 )
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domtext_get_nodeType(
-    IXMLDOMText *iface,
-    DOMNodeType* domNodeType )
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI domtext_get_parentNode(
-    IXMLDOMText *iface,
-    IXMLDOMNode** parent )
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI domtext_get_childNodes(
-    IXMLDOMText *iface,
-    IXMLDOMNodeList** outList)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI domtext_get_firstChild(
-    IXMLDOMText *iface,
-    IXMLDOMNode** domNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domtext_get_lastChild(
-    IXMLDOMText *iface,
-    IXMLDOMNode** domNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domtext_get_previousSibling(
-    IXMLDOMText *iface,
-    IXMLDOMNode** domNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domtext_get_nextSibling(
-    IXMLDOMText *iface,
-    IXMLDOMNode** domNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domtext_get_attributes(
-    IXMLDOMText *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI domtext_insertBefore(
-    IXMLDOMText *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI domtext_replaceChild(
-    IXMLDOMText *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI domtext_removeChild(
-    IXMLDOMText *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI domtext_appendChild(
-    IXMLDOMText *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI domtext_hasChildNodes(
-    IXMLDOMText *iface,
-    VARIANT_BOOL* pbool)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI domtext_get_ownerDocument(
-    IXMLDOMText *iface,
-    IXMLDOMDocument** domDocument)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI domtext_cloneNode(
-    IXMLDOMText *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI domtext_get_nodeTypeString(
-    IXMLDOMText *iface,
-    BSTR* p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI domtext_get_text(
-    IXMLDOMText *iface,
-    BSTR* p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI domtext_put_text(
-    IXMLDOMText *iface,
-    BSTR p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI domtext_get_specified(
-    IXMLDOMText *iface,
-    VARIANT_BOOL* pbool)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI domtext_get_definition(
-    IXMLDOMText *iface,
-    IXMLDOMNode** domNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI domtext_get_nodeTypedValue(
-    IXMLDOMText *iface,
-    VARIANT* var1)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domtext_put_nodeTypedValue(
-    IXMLDOMText *iface,
-    VARIANT var1)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domtext_get_dataType(
-    IXMLDOMText *iface,
-    VARIANT* var1)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI domtext_put_dataType(
-    IXMLDOMText *iface,
-    BSTR p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI domtext_get_xml(
-    IXMLDOMText *iface,
-    BSTR* p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI domtext_transformNode(
-    IXMLDOMText *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI domtext_selectNodes(
-    IXMLDOMText *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI domtext_selectSingleNode(
-    IXMLDOMText *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI domtext_get_parsed(
-    IXMLDOMText *iface,
-    VARIANT_BOOL* pbool)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI domtext_get_namespaceURI(
-    IXMLDOMText *iface,
-    BSTR* p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI domtext_get_prefix(
-    IXMLDOMText *iface,
-    BSTR* p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI domtext_get_baseName(
-    IXMLDOMText *iface,
-    BSTR* p)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI domtext_transformNodeToObject(
-    IXMLDOMText *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    domtext *This = impl_from_IXMLDOMText( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
-}
-
 static HRESULT WINAPI domtext_get_data(
     IXMLDOMText *iface,
     BSTR *p)
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     HRESULT hr = E_FAIL;
     VARIANT vRet;
 
+    TRACE("%p %p\n", This, p );
+
     if(!p)
         return E_INVALIDARG;
 
-    hr = IXMLDOMNode_get_nodeValue( This->node, &vRet );
+    hr = IXMLDOMNode_get_nodeValue( (IXMLDOMNode*)iface, &vRet );
     if(hr == S_OK)
     {
         *p = V_BSTR(&vRet);
@@ -496,7 +173,7 @@ static HRESULT WINAPI domtext_put_data(
     IXMLDOMText *iface,
     BSTR data)
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     HRESULT hr = E_FAIL;
     VARIANT val;
 
@@ -505,7 +182,7 @@ static HRESULT WINAPI domtext_put_data(
     V_VT(&val) = VT_BSTR;
     V_BSTR(&val) = data;
 
-    hr = IXMLDOMNode_put_nodeValue( This->node, val );
+    hr = IXMLDOMNode_put_nodeValue( (IXMLDOMNode*)iface, val );
 
     return hr;
 }
@@ -514,8 +191,7 @@ static HRESULT WINAPI domtext_get_length(
     IXMLDOMText *iface,
     long *len)
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     xmlChar *pContent;
     long nLength = 0;
 
@@ -524,7 +200,7 @@ static HRESULT WINAPI domtext_get_length(
     if(!len)
         return E_INVALIDARG;
 
-    pContent = xmlNodeGetContent(pDOMNode->node);
+    pContent = xmlNodeGetContent(This->node);
     if(pContent)
     {
         nLength = xmlStrlen(pContent);
@@ -540,8 +216,7 @@ static HRESULT WINAPI domtext_substringData(
     IXMLDOMText *iface,
     long offset, long count, BSTR *p)
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     xmlChar *pContent;
     long nLength = 0;
     HRESULT hr = S_FALSE;
@@ -558,7 +233,7 @@ static HRESULT WINAPI domtext_substringData(
     if(count == 0)
         return hr;
 
-    pContent = xmlNodeGetContent(pDOMNode->node);
+    pContent = xmlNodeGetContent(This->node);
     if(pContent)
     {
         nLength = xmlStrlen(pContent);
@@ -585,8 +260,7 @@ static HRESULT WINAPI domtext_appendData(
     IXMLDOMText *iface,
     BSTR p)
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     xmlChar *pContent;
     HRESULT hr = S_FALSE;
 
@@ -599,7 +273,7 @@ static HRESULT WINAPI domtext_appendData(
     pContent = xmlChar_from_wchar( (WCHAR*)p );
     if(pContent)
     {
-        if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0)
+        if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
             hr = S_OK;
         else
             hr = E_FAIL;
@@ -615,8 +289,7 @@ static HRESULT WINAPI domtext_insertData(
     IXMLDOMText *iface,
     long offset, BSTR p)
 {
-    domtext *This = impl_from_IXMLDOMText( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *This = impl_from_IXMLDOMText( iface );
     xmlChar *pXmlContent;
     BSTR sNewString;
     HRESULT hr = S_FALSE;
@@ -634,7 +307,7 @@ static HRESULT WINAPI domtext_insertData(
         return E_INVALIDARG;
     }
 
-    pXmlContent = xmlNodeGetContent(pDOMNode->node);
+    pXmlContent = xmlNodeGetContent(This->node);
     if(pXmlContent)
     {
         BSTR sContent = bstr_from_xmlChar( pXmlContent );
@@ -665,7 +338,7 @@ static HRESULT WINAPI domtext_insertData(
             str = xmlChar_from_wchar((WCHAR*)sNewString);
             if(str)
             {
-                xmlNodeSetContent(pDOMNode->node, str);
+                xmlNodeSetContent(This->node, str);
                 hr = S_OK;
             }
             HeapFree(GetProcessHeap(), 0, str);
@@ -709,48 +382,48 @@ static HRESULT WINAPI domtext_splitText(
 static const struct IXMLDOMTextVtbl domtext_vtbl =
 {
     domtext_QueryInterface,
-    domtext_AddRef,
-    domtext_Release,
+    xmlnode_AddRef,
+    xmlnode_Release,
     domtext_GetTypeInfoCount,
     domtext_GetTypeInfo,
     domtext_GetIDsOfNames,
     domtext_Invoke,
-    domtext_get_nodeName,
-    domtext_get_nodeValue,
-    domtext_put_nodeValue,
-    domtext_get_nodeType,
-    domtext_get_parentNode,
-    domtext_get_childNodes,
-    domtext_get_firstChild,
-    domtext_get_lastChild,
-    domtext_get_previousSibling,
-    domtext_get_nextSibling,
-    domtext_get_attributes,
-    domtext_insertBefore,
-    domtext_replaceChild,
-    domtext_removeChild,
-    domtext_appendChild,
-    domtext_hasChildNodes,
-    domtext_get_ownerDocument,
-    domtext_cloneNode,
-    domtext_get_nodeTypeString,
-    domtext_get_text,
-    domtext_put_text,
-    domtext_get_specified,
-    domtext_get_definition,
-    domtext_get_nodeTypedValue,
-    domtext_put_nodeTypedValue,
-    domtext_get_dataType,
-    domtext_put_dataType,
-    domtext_get_xml,
-    domtext_transformNode,
-    domtext_selectNodes,
-    domtext_selectSingleNode,
-    domtext_get_parsed,
-    domtext_get_namespaceURI,
-    domtext_get_prefix,
-    domtext_get_baseName,
-    domtext_transformNodeToObject,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
     domtext_get_data,
     domtext_put_data,
     domtext_get_length,
@@ -764,32 +437,13 @@ static const struct IXMLDOMTextVtbl domtext_vtbl =
 
 IUnknown* create_text( xmlNodePtr text )
 {
-    domtext *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown( create_basic_node( text, NULL ) );
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &domtext_vtbl;
-    This->ref = 1;
-
-    This->node_unk = create_basic_node( text, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
+    This->lpVtbl = (IXMLDOMNodeVtbl*) &domtext_vtbl;
 
     return (IUnknown*) &This->lpVtbl;
 }
-- 
1.5.6.5


["0006-msxml3-Derive-comment-from-node-instead-of-aggregat.diff" (0006-msxml3-Derive-comment-from-node-instead-of-aggregat.diff)]

>Fromd588b7bcba87ce69f2c61c5ffe71cb8b66281fc1 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Wed, 29 Oct 2008 10:06:10 +0100
Subject: [PATCH] msxml3: Derive comment from node instead of aggregation

---
 dlls/msxml3/comment.c |  474 +++++++------------------------------------------
 1 files changed, 62 insertions(+), 412 deletions(-)

diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 20781a1..ea3b804 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -37,17 +37,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _domcomment
+static inline xmlnode *impl_from_IXMLDOMComment( IXMLDOMComment *iface )
 {
-    const struct IXMLDOMCommentVtbl *lpVtbl;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} domcomment;
-
-static inline domcomment *impl_from_IXMLDOMComment( IXMLDOMComment *iface )
-{
-    return (domcomment *)((char*)iface - FIELD_OFFSET(domcomment, lpVtbl));
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
 }
 
 static HRESULT WINAPI domcomment_QueryInterface(
@@ -55,20 +47,17 @@ static HRESULT WINAPI domcomment_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMComment ) ||
          IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -80,34 +69,11 @@ static HRESULT WINAPI domcomment_QueryInterface(
     return S_OK;
 }
 
-static ULONG WINAPI domcomment_AddRef(
-    IXMLDOMComment *iface )
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI domcomment_Release(
-    IXMLDOMComment *iface )
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
-        HeapFree( GetProcessHeap(), 0, This );
-    }
-
-    return ref;
-}
-
 static HRESULT WINAPI domcomment_GetTypeInfoCount(
     IXMLDOMComment *iface,
     UINT* pctinfo )
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
 
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
@@ -121,7 +87,7 @@ static HRESULT WINAPI domcomment_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -136,7 +102,7 @@ static HRESULT WINAPI domcomment_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -162,7 +128,7 @@ static HRESULT WINAPI domcomment_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -180,309 +146,17 @@ static HRESULT WINAPI domcomment_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domcomment_get_nodeName(
-    IXMLDOMComment *iface,
-    BSTR* p )
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_get_nodeValue(
-    IXMLDOMComment *iface,
-    VARIANT* var1 )
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcomment_put_nodeValue(
-    IXMLDOMComment *iface,
-    VARIANT var1 )
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcomment_get_nodeType(
-    IXMLDOMComment *iface,
-    DOMNodeType* domNodeType )
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI domcomment_get_parentNode(
-    IXMLDOMComment *iface,
-    IXMLDOMNode** parent )
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI domcomment_get_childNodes(
-    IXMLDOMComment *iface,
-    IXMLDOMNodeList** outList)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI domcomment_get_firstChild(
-    IXMLDOMComment *iface,
-    IXMLDOMNode** domNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domcomment_get_lastChild(
-    IXMLDOMComment *iface,
-    IXMLDOMNode** domNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domcomment_get_previousSibling(
-    IXMLDOMComment *iface,
-    IXMLDOMNode** domNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domcomment_get_nextSibling(
-    IXMLDOMComment *iface,
-    IXMLDOMNode** domNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domcomment_get_attributes(
-    IXMLDOMComment *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI domcomment_insertBefore(
-    IXMLDOMComment *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI domcomment_replaceChild(
-    IXMLDOMComment *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI domcomment_removeChild(
-    IXMLDOMComment *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI domcomment_appendChild(
-    IXMLDOMComment *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI domcomment_hasChildNodes(
-    IXMLDOMComment *iface,
-    VARIANT_BOOL* pbool)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI domcomment_get_ownerDocument(
-    IXMLDOMComment *iface,
-    IXMLDOMDocument** domDocument)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI domcomment_cloneNode(
-    IXMLDOMComment *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI domcomment_get_nodeTypeString(
-    IXMLDOMComment *iface,
-    BSTR* p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_get_text(
-    IXMLDOMComment *iface,
-    BSTR* p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_put_text(
-    IXMLDOMComment *iface,
-    BSTR p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_get_specified(
-    IXMLDOMComment *iface,
-    VARIANT_BOOL* pbool)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI domcomment_get_definition(
-    IXMLDOMComment *iface,
-    IXMLDOMNode** domNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI domcomment_get_nodeTypedValue(
-    IXMLDOMComment *iface,
-    VARIANT* var1)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcomment_put_nodeTypedValue(
-    IXMLDOMComment *iface,
-    VARIANT var1)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcomment_get_dataType(
-    IXMLDOMComment *iface,
-    VARIANT* var1)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI domcomment_put_dataType(
-    IXMLDOMComment *iface,
-    BSTR p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_get_xml(
-    IXMLDOMComment *iface,
-    BSTR* p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_transformNode(
-    IXMLDOMComment *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI domcomment_selectNodes(
-    IXMLDOMComment *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI domcomment_selectSingleNode(
-    IXMLDOMComment *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI domcomment_get_parsed(
-    IXMLDOMComment *iface,
-    VARIANT_BOOL* pbool)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI domcomment_get_namespaceURI(
-    IXMLDOMComment *iface,
-    BSTR* p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_get_prefix(
-    IXMLDOMComment *iface,
-    BSTR* p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_get_baseName(
-    IXMLDOMComment *iface,
-    BSTR* p)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI domcomment_transformNodeToObject(
-    IXMLDOMComment *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
-}
-
 static HRESULT WINAPI domcomment_get_data(
     IXMLDOMComment *iface,
     BSTR *p)
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
     HRESULT hr = E_FAIL;
     VARIANT vRet;
 
     if(!p)
         return E_INVALIDARG;
 
-    hr = IXMLDOMNode_get_nodeValue( This->node, &vRet );
+    hr = IXMLDOMComment_get_nodeValue( iface, &vRet );
     if(hr == S_OK)
     {
         *p = V_BSTR(&vRet);
@@ -495,16 +169,15 @@ static HRESULT WINAPI domcomment_put_data(
     IXMLDOMComment *iface,
     BSTR data)
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
     HRESULT hr = E_FAIL;
     VARIANT val;
 
-    TRACE("%p %s\n", This, debugstr_w(data) );
+    TRACE("%p %s\n", iface, debugstr_w(data) );
 
     V_VT(&val) = VT_BSTR;
     V_BSTR(&val) = data;
 
-    hr = IXMLDOMNode_put_nodeValue( This->node, val );
+    hr = IXMLDOMComment_put_nodeValue( iface, val );
 
     return hr;
 }
@@ -513,8 +186,7 @@ static HRESULT WINAPI domcomment_get_length(
     IXMLDOMComment *iface,
     long *len)
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
     xmlChar *pContent;
     long nLength = 0;
 
@@ -523,7 +195,7 @@ static HRESULT WINAPI domcomment_get_length(
     if(!len)
         return E_INVALIDARG;
 
-    pContent = xmlNodeGetContent(pDOMNode->node);
+    pContent = xmlNodeGetContent(This->node);
     if(pContent)
     {
         nLength = xmlStrlen(pContent);
@@ -539,8 +211,7 @@ static HRESULT WINAPI domcomment_substringData(
     IXMLDOMComment *iface,
     long offset, long count, BSTR *p)
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
     xmlChar *pContent;
     long nLength = 0;
     HRESULT hr = S_FALSE;
@@ -557,7 +228,7 @@ static HRESULT WINAPI domcomment_substringData(
     if(count == 0)
         return hr;
 
-    pContent = xmlNodeGetContent(pDOMNode->node);
+    pContent = xmlNodeGetContent(This->node);
     if(pContent)
     {
         nLength = xmlStrlen(pContent);
@@ -584,8 +255,7 @@ static HRESULT WINAPI domcomment_appendData(
     IXMLDOMComment *iface,
     BSTR p)
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *This = impl_from_IXMLDOMComment( iface );
     xmlChar *pContent;
     HRESULT hr = S_FALSE;
 
@@ -602,15 +272,15 @@ static HRESULT WINAPI domcomment_appendData(
            xmlTextConcat on Comment nodes. Fallback to setting the
            contents directly if xmlTextConcat fails.
          */
-        if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0)
+        if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
             hr = S_OK;
         else
         {
             xmlChar *pNew;
-            pNew = xmlStrcat(xmlNodeGetContent(pDOMNode->node), pContent);
+            pNew = xmlStrcat(xmlNodeGetContent(This->node), pContent);
             if(pNew)
             {
-                xmlNodeSetContent(pDOMNode->node, pNew);
+                xmlNodeSetContent(This->node, pNew);
                 hr = S_OK;
             }
             else
@@ -628,15 +298,14 @@ static HRESULT WINAPI domcomment_insertData(
     IXMLDOMComment *iface,
     long offset, BSTR p)
 {
-    domcomment *This = impl_from_IXMLDOMComment( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
+    xmlnode *pDOMNode = impl_from_IXMLDOMComment( iface );
     xmlChar *pXmlContent;
     BSTR sNewString;
     HRESULT hr = S_FALSE;
     long nLength = 0, nLengthP = 0;
     xmlChar *str = NULL;
 
-    TRACE("%p\n", This);
+    TRACE("%p\n", iface);
 
     /* If have a NULL or empty string, don't do anything. */
     if(SysStringLen(p) == 0)
@@ -713,48 +382,48 @@ static HRESULT WINAPI domcomment_replaceData(
 static const struct IXMLDOMCommentVtbl domcomment_vtbl =
 {
     domcomment_QueryInterface,
-    domcomment_AddRef,
-    domcomment_Release,
+    xmlnode_AddRef,
+    xmlnode_Release,
     domcomment_GetTypeInfoCount,
     domcomment_GetTypeInfo,
     domcomment_GetIDsOfNames,
     domcomment_Invoke,
-    domcomment_get_nodeName,
-    domcomment_get_nodeValue,
-    domcomment_put_nodeValue,
-    domcomment_get_nodeType,
-    domcomment_get_parentNode,
-    domcomment_get_childNodes,
-    domcomment_get_firstChild,
-    domcomment_get_lastChild,
-    domcomment_get_previousSibling,
-    domcomment_get_nextSibling,
-    domcomment_get_attributes,
-    domcomment_insertBefore,
-    domcomment_replaceChild,
-    domcomment_removeChild,
-    domcomment_appendChild,
-    domcomment_hasChildNodes,
-    domcomment_get_ownerDocument,
-    domcomment_cloneNode,
-    domcomment_get_nodeTypeString,
-    domcomment_get_text,
-    domcomment_put_text,
-    domcomment_get_specified,
-    domcomment_get_definition,
-    domcomment_get_nodeTypedValue,
-    domcomment_put_nodeTypedValue,
-    domcomment_get_dataType,
-    domcomment_put_dataType,
-    domcomment_get_xml,
-    domcomment_transformNode,
-    domcomment_selectNodes,
-    domcomment_selectSingleNode,
-    domcomment_get_parsed,
-    domcomment_get_namespaceURI,
-    domcomment_get_prefix,
-    domcomment_get_baseName,
-    domcomment_transformNodeToObject,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
     domcomment_get_data,
     domcomment_put_data,
     domcomment_get_length,
@@ -767,32 +436,13 @@ static const struct IXMLDOMCommentVtbl domcomment_vtbl =
 
 IUnknown* create_comment( xmlNodePtr comment )
 {
-    domcomment *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown(create_basic_node( comment, NULL ));
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &domcomment_vtbl;
-    This->ref = 1;
-
-    This->node_unk = create_basic_node( comment, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
+    This->lpVtbl = (IXMLDOMNodeVtbl*)&domcomment_vtbl;
 
     return (IUnknown*) &This->lpVtbl;
 }
-- 
1.5.6.5


["0007-msxml3-Derive-docfrag-from-node-instead-of-aggregat.diff" (0007-msxml3-Derive-docfrag-from-node-instead-of-aggregat.diff)]

>From53f51c2dbabbbedcb420ed26b213f61fa1f18330 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Wed, 29 Oct 2008 17:43:14 +0100
Subject: [PATCH] msxml3: Derive docfrag from node instead of aggregation

---
 dlls/msxml3/docfrag.c |  442 ++++++-------------------------------------------
 1 files changed, 49 insertions(+), 393 deletions(-)

diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c
index f922faa..dd7b249 100644
--- a/dlls/msxml3/docfrag.c
+++ b/dlls/msxml3/docfrag.c
@@ -37,17 +37,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _domfrag
+static inline xmlnode *impl_from_IXMLDOMDocumentFragment( IXMLDOMDocumentFragment *iface )
 {
-    const struct IXMLDOMDocumentFragmentVtbl *lpVtbl;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} domfrag;
-
-static inline domfrag *impl_from_IXMLDOMDocumentFragment( IXMLDOMDocumentFragment *iface )
-{
-    return (domfrag *)((char*)iface - FIELD_OFFSET(domfrag, lpVtbl));
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
 }
 
 static HRESULT WINAPI domfrag_QueryInterface(
@@ -55,19 +47,16 @@ static HRESULT WINAPI domfrag_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
+    xmlnode *This = impl_from_IXMLDOMDocumentFragment( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMDocumentFragment ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -79,34 +68,11 @@ static HRESULT WINAPI domfrag_QueryInterface(
     return S_OK;
 }
 
-static ULONG WINAPI domfrag_AddRef(
-    IXMLDOMDocumentFragment *iface )
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI domfrag_Release(
-    IXMLDOMDocumentFragment *iface )
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
-        HeapFree( GetProcessHeap(), 0, This );
-    }
-
-    return ref;
-}
-
 static HRESULT WINAPI domfrag_GetTypeInfoCount(
     IXMLDOMDocumentFragment *iface,
     UINT* pctinfo )
 {
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
+    xmlnode *This = impl_from_IXMLDOMDocumentFragment( iface );
 
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
@@ -120,7 +86,7 @@ static HRESULT WINAPI domfrag_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
+    xmlnode *This = impl_from_IXMLDOMDocumentFragment( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -135,7 +101,7 @@ static HRESULT WINAPI domfrag_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
+    xmlnode *This = impl_from_IXMLDOMDocumentFragment( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -161,7 +127,7 @@ static HRESULT WINAPI domfrag_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
+    xmlnode *This = impl_from_IXMLDOMDocumentFragment( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -179,372 +145,62 @@ static HRESULT WINAPI domfrag_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domfrag_get_nodeName(
-    IXMLDOMDocumentFragment *iface,
-    BSTR* p )
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_get_nodeValue(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT* var1 )
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domfrag_put_nodeValue(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT var1 )
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domfrag_get_nodeType(
-    IXMLDOMDocumentFragment *iface,
-    DOMNodeType* domNodeType )
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI domfrag_get_parentNode(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode** parent )
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI domfrag_get_childNodes(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNodeList** outList)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI domfrag_get_firstChild(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode** domNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domfrag_get_lastChild(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode** domNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domfrag_get_previousSibling(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode** domNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domfrag_get_nextSibling(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode** domNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domfrag_get_attributes(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI domfrag_insertBefore(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI domfrag_replaceChild(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI domfrag_removeChild(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI domfrag_appendChild(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI domfrag_hasChildNodes(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT_BOOL* pbool)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI domfrag_get_ownerDocument(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMDocument** domDocument)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI domfrag_cloneNode(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI domfrag_get_nodeTypeString(
-    IXMLDOMDocumentFragment *iface,
-    BSTR* p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_get_text(
-    IXMLDOMDocumentFragment *iface,
-    BSTR* p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_put_text(
-    IXMLDOMDocumentFragment *iface,
-    BSTR p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_get_specified(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT_BOOL* pbool)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI domfrag_get_definition(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode** domNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI domfrag_get_nodeTypedValue(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT* var1)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domfrag_put_nodeTypedValue(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT var1)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domfrag_get_dataType(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT* var1)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI domfrag_put_dataType(
-    IXMLDOMDocumentFragment *iface,
-    BSTR p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_get_xml(
-    IXMLDOMDocumentFragment *iface,
-    BSTR* p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_transformNode(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI domfrag_selectNodes(
-    IXMLDOMDocumentFragment *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI domfrag_selectSingleNode(
-    IXMLDOMDocumentFragment *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI domfrag_get_parsed(
-    IXMLDOMDocumentFragment *iface,
-    VARIANT_BOOL* pbool)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI domfrag_get_namespaceURI(
-    IXMLDOMDocumentFragment *iface,
-    BSTR* p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_get_prefix(
-    IXMLDOMDocumentFragment *iface,
-    BSTR* p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_get_baseName(
-    IXMLDOMDocumentFragment *iface,
-    BSTR* p)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI domfrag_transformNodeToObject(
-    IXMLDOMDocumentFragment *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
-}
-
 static const struct IXMLDOMDocumentFragmentVtbl domfrag_vtbl =
 {
     domfrag_QueryInterface,
-    domfrag_AddRef,
-    domfrag_Release,
+    xmlnode_AddRef,
+    xmlnode_Release,
     domfrag_GetTypeInfoCount,
     domfrag_GetTypeInfo,
     domfrag_GetIDsOfNames,
     domfrag_Invoke,
-    domfrag_get_nodeName,
-    domfrag_get_nodeValue,
-    domfrag_put_nodeValue,
-    domfrag_get_nodeType,
-    domfrag_get_parentNode,
-    domfrag_get_childNodes,
-    domfrag_get_firstChild,
-    domfrag_get_lastChild,
-    domfrag_get_previousSibling,
-    domfrag_get_nextSibling,
-    domfrag_get_attributes,
-    domfrag_insertBefore,
-    domfrag_replaceChild,
-    domfrag_removeChild,
-    domfrag_appendChild,
-    domfrag_hasChildNodes,
-    domfrag_get_ownerDocument,
-    domfrag_cloneNode,
-    domfrag_get_nodeTypeString,
-    domfrag_get_text,
-    domfrag_put_text,
-    domfrag_get_specified,
-    domfrag_get_definition,
-    domfrag_get_nodeTypedValue,
-    domfrag_put_nodeTypedValue,
-    domfrag_get_dataType,
-    domfrag_put_dataType,
-    domfrag_get_xml,
-    domfrag_transformNode,
-    domfrag_selectNodes,
-    domfrag_selectSingleNode,
-    domfrag_get_parsed,
-    domfrag_get_namespaceURI,
-    domfrag_get_prefix,
-    domfrag_get_baseName,
-    domfrag_transformNodeToObject
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject
 };
 
 IUnknown* create_doc_fragment( xmlNodePtr fragment )
 {
-    domfrag *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown(create_basic_node( fragment, NULL ));
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &domfrag_vtbl;
-    This->ref = 1;
-
-    This->node_unk = create_basic_node( fragment, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
+    This->lpVtbl = (IXMLDOMNodeVtbl*)&domfrag_vtbl;
 
     return (IUnknown*) &This->lpVtbl;
 }
-- 
1.5.6.5


["0008-msxml3-Derive-dom_pi-from-node-instead-of-aggregati.diff" (0008-msxml3-Derive-dom_pi-from-node-instead-of-aggregati.diff)]

>From073d644fb1ecafcf4db2592afc0c82dd87c57934 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Wed, 29 Oct 2008 23:46:06 +0100
Subject: [PATCH] msxml3: Derive dom_pi from node instead of aggregation

---
 dlls/msxml3/pi.c |  469 +++++++-----------------------------------------------
 1 files changed, 57 insertions(+), 412 deletions(-)

diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index a38f355..8fcae2d 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -37,17 +37,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _dom_pi
+static inline xmlnode *impl_from_IXMLDOMProcessingInstruction( IXMLDOMProcessingInstruction *iface )
 {
-    const struct IXMLDOMProcessingInstructionVtbl *lpVtbl;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} dom_pi;
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
+}
 
-static inline dom_pi *impl_from_IXMLDOMProcessingInstruction( IXMLDOMProcessingInstruction *iface )
+static inline IXMLDOMNode *upcast( IXMLDOMProcessingInstruction *iface )
 {
-    return (dom_pi *)((char*)iface - FIELD_OFFSET(dom_pi, lpVtbl));
+    return (IXMLDOMNode*)iface;
 }
 
 static HRESULT WINAPI dom_pi_QueryInterface(
@@ -55,19 +52,16 @@ static HRESULT WINAPI dom_pi_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
+    xmlnode *This = impl_from_IXMLDOMProcessingInstruction( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMProcessingInstruction ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -79,34 +73,11 @@ static HRESULT WINAPI dom_pi_QueryInterface(
     return S_OK;
 }
 
-static ULONG WINAPI dom_pi_AddRef(
-    IXMLDOMProcessingInstruction *iface )
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI dom_pi_Release(
-    IXMLDOMProcessingInstruction *iface )
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
-        HeapFree( GetProcessHeap(), 0, This );
-    }
-
-    return ref;
-}
-
 static HRESULT WINAPI dom_pi_GetTypeInfoCount(
     IXMLDOMProcessingInstruction *iface,
     UINT* pctinfo )
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
+    xmlnode *This = impl_from_IXMLDOMProcessingInstruction( iface );
 
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
@@ -120,7 +91,7 @@ static HRESULT WINAPI dom_pi_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
+    xmlnode *This = impl_from_IXMLDOMProcessingInstruction( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -135,7 +106,7 @@ static HRESULT WINAPI dom_pi_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
+    xmlnode *This = impl_from_IXMLDOMProcessingInstruction( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -161,7 +132,7 @@ static HRESULT WINAPI dom_pi_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
+    xmlnode *This = impl_from_IXMLDOMProcessingInstruction( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -179,35 +150,18 @@ static HRESULT WINAPI dom_pi_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI dom_pi_get_nodeName(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR* p )
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_get_nodeValue(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT* var1 )
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
 static HRESULT WINAPI dom_pi_put_nodeValue(
     IXMLDOMProcessingInstruction *iface,
     VARIANT var1 )
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
     BSTR sTarget;
     static const WCHAR szXML[] = {'x','m','l',0};
     HRESULT hr;
 
-    TRACE("%p\n", This );
+    TRACE("%p\n", iface );
 
     /* Cannot set data to a PI node whose target is 'xml' */
-    hr = dom_pi_get_nodeName(iface, &sTarget);
+    hr = xmlnode_get_nodeName( upcast( iface ), &sTarget);
     if(hr == S_OK)
     {
         if(lstrcmpW( sTarget, szXML) == 0)
@@ -219,274 +173,7 @@ static HRESULT WINAPI dom_pi_put_nodeValue(
         SysFreeString(sTarget);
     }
 
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI dom_pi_get_nodeType(
-    IXMLDOMProcessingInstruction *iface,
-    DOMNodeType* domNodeType )
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI dom_pi_get_parentNode(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode** parent )
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI dom_pi_get_childNodes(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNodeList** outList)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI dom_pi_get_firstChild(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode** domNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI dom_pi_get_lastChild(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode** domNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI dom_pi_get_previousSibling(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode** domNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI dom_pi_get_nextSibling(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode** domNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI dom_pi_get_attributes(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI dom_pi_insertBefore(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI dom_pi_replaceChild(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI dom_pi_removeChild(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI dom_pi_appendChild(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI dom_pi_hasChildNodes(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT_BOOL* pbool)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI dom_pi_get_ownerDocument(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMDocument** domDocument)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI dom_pi_cloneNode(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI dom_pi_get_nodeTypeString(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR* p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_get_text(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR* p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_put_text(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_get_specified(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT_BOOL* pbool)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI dom_pi_get_definition(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode** domNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI dom_pi_get_nodeTypedValue(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT* var1)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI dom_pi_put_nodeTypedValue(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT var1)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI dom_pi_get_dataType(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT* var1)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI dom_pi_put_dataType(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_get_xml(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR* p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_transformNode(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI dom_pi_selectNodes(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI dom_pi_selectSingleNode(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI dom_pi_get_parsed(
-    IXMLDOMProcessingInstruction *iface,
-    VARIANT_BOOL* pbool)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI dom_pi_get_namespaceURI(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR* p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_get_prefix(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR* p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_get_baseName(
-    IXMLDOMProcessingInstruction *iface,
-    BSTR* p)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI dom_pi_transformNodeToObject(
-    IXMLDOMProcessingInstruction *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
+    return xmlnode_put_nodeValue( upcast( iface ), var1 );
 }
 
 static HRESULT WINAPI dom_pi_get_target(
@@ -494,22 +181,20 @@ static HRESULT WINAPI dom_pi_get_target(
     BSTR *p)
 {
     /* target returns the same value as nodeName property */
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
+    return IXMLDOMNode_get_nodeName( upcast( iface ), p );
 }
 
 static HRESULT WINAPI dom_pi_get_data(
     IXMLDOMProcessingInstruction *iface,
     BSTR *p)
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
     HRESULT hr = E_FAIL;
     VARIANT vRet;
 
     if(!p)
         return E_INVALIDARG;
 
-    hr = IXMLDOMNode_get_nodeValue( This->node, &vRet );
+    hr = IXMLDOMProcessingInstruction_get_nodeValue( iface, &vRet );
     if(hr == S_OK)
     {
         *p = V_BSTR(&vRet);
@@ -522,80 +207,59 @@ static HRESULT WINAPI dom_pi_put_data(
     IXMLDOMProcessingInstruction *iface,
     BSTR data)
 {
-    dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
-    HRESULT hr = E_FAIL;
     VARIANT val;
-    BSTR sTarget;
-    static const WCHAR szXML[] = {'x','m','l',0};
-
-    TRACE("%p %s\n", This, debugstr_w(data) );
-
-    /* Cannot set data to a PI node whose target is 'xml' */
-    hr = dom_pi_get_nodeName(iface, &sTarget);
-    if(hr == S_OK)
-    {
-        if(lstrcmpW( sTarget, szXML) == 0)
-        {
-            SysFreeString(sTarget);
-            return E_FAIL;
-        }
-
-        SysFreeString(sTarget);
-    }
 
     V_VT(&val) = VT_BSTR;
     V_BSTR(&val) = data;
 
-    hr = IXMLDOMNode_put_nodeValue( This->node, val );
-
-    return hr;
+    return IXMLDOMNode_put_nodeValue( upcast(iface), val );
 }
 
 static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
 {
     dom_pi_QueryInterface,
-    dom_pi_AddRef,
-    dom_pi_Release,
+    xmlnode_AddRef,
+    xmlnode_Release,
     dom_pi_GetTypeInfoCount,
     dom_pi_GetTypeInfo,
     dom_pi_GetIDsOfNames,
     dom_pi_Invoke,
-    dom_pi_get_nodeName,
-    dom_pi_get_nodeValue,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
     dom_pi_put_nodeValue,
-    dom_pi_get_nodeType,
-    dom_pi_get_parentNode,
-    dom_pi_get_childNodes,
-    dom_pi_get_firstChild,
-    dom_pi_get_lastChild,
-    dom_pi_get_previousSibling,
-    dom_pi_get_nextSibling,
-    dom_pi_get_attributes,
-    dom_pi_insertBefore,
-    dom_pi_replaceChild,
-    dom_pi_removeChild,
-    dom_pi_appendChild,
-    dom_pi_hasChildNodes,
-    dom_pi_get_ownerDocument,
-    dom_pi_cloneNode,
-    dom_pi_get_nodeTypeString,
-    dom_pi_get_text,
-    dom_pi_put_text,
-    dom_pi_get_specified,
-    dom_pi_get_definition,
-    dom_pi_get_nodeTypedValue,
-    dom_pi_put_nodeTypedValue,
-    dom_pi_get_dataType,
-    dom_pi_put_dataType,
-    dom_pi_get_xml,
-    dom_pi_transformNode,
-    dom_pi_selectNodes,
-    dom_pi_selectSingleNode,
-    dom_pi_get_parsed,
-    dom_pi_get_namespaceURI,
-    dom_pi_get_prefix,
-    dom_pi_get_baseName,
-    dom_pi_transformNodeToObject,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
 
     dom_pi_get_target,
     dom_pi_get_data,
@@ -604,32 +268,13 @@ static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
 
 IUnknown* create_pi( xmlNodePtr pi )
 {
-    dom_pi *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown(create_basic_node( pi, NULL ));
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &dom_pi_vtbl;
-    This->ref = 1;
-
-    This->node_unk = create_basic_node( pi, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
+    This->lpVtbl = (IXMLDOMNodeVtbl*)&dom_pi_vtbl;
 
     return (IUnknown*) &This->lpVtbl;
 }
-- 
1.5.6.5


["0009-msxml3-Derive-attribute-from-node-instead-of-aggreg.diff" (0009-msxml3-Derive-attribute-from-node-instead-of-aggreg.diff)]

>Fromc53e82a8a4ebffd2adaa71dffd6d5a2a0792309b Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Thu, 30 Oct 2008 00:09:52 +0100
Subject: [PATCH] msxml3: Derive attribute from node instead of aggregation

---
 dlls/msxml3/attribute.c |  446 ++++++-----------------------------------------
 1 files changed, 53 insertions(+), 393 deletions(-)

diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index 2681a76..309d183 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -37,17 +37,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _domattr
+static inline IXMLDOMNode *upcast( IXMLDOMAttribute *iface )
 {
-    const struct IXMLDOMAttributeVtbl *lpVtbl;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} domattr;
+    return (IXMLDOMNode*)iface;
+}
 
-static inline domattr *impl_from_IXMLDOMAttribute( IXMLDOMAttribute *iface )
+static inline xmlnode *impl_from_IXMLDOMAttribute( IXMLDOMAttribute *iface )
 {
-    return (domattr *)((char*)iface - FIELD_OFFSET(domattr, lpVtbl));
+    return impl_from_IXMLDOMNode( upcast( iface ) );
 }
 
 static HRESULT WINAPI domattr_QueryInterface(
@@ -55,19 +52,16 @@ static HRESULT WINAPI domattr_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
+    xmlnode *This = impl_from_IXMLDOMAttribute( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMAttribute ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -79,34 +73,11 @@ static HRESULT WINAPI domattr_QueryInterface(
     return S_OK;
 }
 
-static ULONG WINAPI domattr_AddRef(
-    IXMLDOMAttribute *iface )
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI domattr_Release(
-    IXMLDOMAttribute *iface )
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
-        HeapFree( GetProcessHeap(), 0, This );
-    }
-
-    return ref;
-}
-
 static HRESULT WINAPI domattr_GetTypeInfoCount(
     IXMLDOMAttribute *iface,
     UINT* pctinfo )
 {
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
+    xmlnode *This = impl_from_IXMLDOMAttribute( iface );
 
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
@@ -120,7 +91,7 @@ static HRESULT WINAPI domattr_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
+    xmlnode *This = impl_from_IXMLDOMAttribute( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -135,7 +106,7 @@ static HRESULT WINAPI domattr_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
+    xmlnode *This = impl_from_IXMLDOMAttribute( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -161,7 +132,7 @@ static HRESULT WINAPI domattr_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
+    xmlnode *This = impl_from_IXMLDOMAttribute( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -178,304 +149,12 @@ static HRESULT WINAPI domattr_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domattr_get_nodeName(
-    IXMLDOMAttribute *iface,
-    BSTR* p )
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI domattr_get_nodeValue(
-    IXMLDOMAttribute *iface,
-    VARIANT* var1 )
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domattr_put_nodeValue(
-    IXMLDOMAttribute *iface,
-    VARIANT var1 )
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domattr_get_nodeType(
-    IXMLDOMAttribute *iface,
-    DOMNodeType* domNodeType )
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI domattr_get_parentNode(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode** parent )
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI domattr_get_childNodes(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNodeList** outList)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI domattr_get_firstChild(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode** domNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domattr_get_lastChild(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode** domNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domattr_get_previousSibling(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode** domNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domattr_get_nextSibling(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode** domNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domattr_get_attributes(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI domattr_insertBefore(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI domattr_replaceChild(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI domattr_removeChild(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI domattr_appendChild(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI domattr_hasChildNodes(
-    IXMLDOMAttribute *iface,
-    VARIANT_BOOL* pbool)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI domattr_get_ownerDocument(
-    IXMLDOMAttribute *iface,
-    IXMLDOMDocument** domDocument)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI domattr_cloneNode(
-    IXMLDOMAttribute *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI domattr_get_nodeTypeString(
-    IXMLDOMAttribute *iface,
-    BSTR* p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI domattr_get_text(
-    IXMLDOMAttribute *iface,
-    BSTR* p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI domattr_put_text(
-    IXMLDOMAttribute *iface,
-    BSTR p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI domattr_get_specified(
-    IXMLDOMAttribute *iface,
-    VARIANT_BOOL* pbool)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI domattr_get_definition(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode** domNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI domattr_get_nodeTypedValue(
-    IXMLDOMAttribute *iface,
-    VARIANT* var1)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domattr_put_nodeTypedValue(
-    IXMLDOMAttribute *iface,
-    VARIANT var1)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domattr_get_dataType(
-    IXMLDOMAttribute *iface,
-    VARIANT* var1)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI domattr_put_dataType(
-    IXMLDOMAttribute *iface,
-    BSTR p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI domattr_get_xml(
-    IXMLDOMAttribute *iface,
-    BSTR* p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI domattr_transformNode(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI domattr_selectNodes(
-    IXMLDOMAttribute *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI domattr_selectSingleNode(
-    IXMLDOMAttribute *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI domattr_get_parsed(
-    IXMLDOMAttribute *iface,
-    VARIANT_BOOL* pbool)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI domattr_get_namespaceURI(
-    IXMLDOMAttribute *iface,
-    BSTR* p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI domattr_get_prefix(
-    IXMLDOMAttribute *iface,
-    BSTR* p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI domattr_get_baseName(
-    IXMLDOMAttribute *iface,
-    BSTR* p)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI domattr_transformNodeToObject(
-    IXMLDOMAttribute *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
-}
-
 static HRESULT WINAPI domattr_get_name(
     IXMLDOMAttribute *iface,
     BSTR *p)
 {
     /* name property returns the same value as nodeName */
-    domattr *This = impl_from_IXMLDOMAttribute( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
+    return xmlnode_get_nodeName( upcast( iface ), p );
 }
 
 static HRESULT WINAPI domattr_get_value(
@@ -497,48 +176,48 @@ static HRESULT WINAPI domattr_put_value(
 static const struct IXMLDOMAttributeVtbl domattr_vtbl =
 {
     domattr_QueryInterface,
-    domattr_AddRef,
-    domattr_Release,
+    xmlnode_AddRef,
+    xmlnode_Release,
     domattr_GetTypeInfoCount,
     domattr_GetTypeInfo,
     domattr_GetIDsOfNames,
     domattr_Invoke,
-    domattr_get_nodeName,
-    domattr_get_nodeValue,
-    domattr_put_nodeValue,
-    domattr_get_nodeType,
-    domattr_get_parentNode,
-    domattr_get_childNodes,
-    domattr_get_firstChild,
-    domattr_get_lastChild,
-    domattr_get_previousSibling,
-    domattr_get_nextSibling,
-    domattr_get_attributes,
-    domattr_insertBefore,
-    domattr_replaceChild,
-    domattr_removeChild,
-    domattr_appendChild,
-    domattr_hasChildNodes,
-    domattr_get_ownerDocument,
-    domattr_cloneNode,
-    domattr_get_nodeTypeString,
-    domattr_get_text,
-    domattr_put_text,
-    domattr_get_specified,
-    domattr_get_definition,
-    domattr_get_nodeTypedValue,
-    domattr_put_nodeTypedValue,
-    domattr_get_dataType,
-    domattr_put_dataType,
-    domattr_get_xml,
-    domattr_transformNode,
-    domattr_selectNodes,
-    domattr_selectSingleNode,
-    domattr_get_parsed,
-    domattr_get_namespaceURI,
-    domattr_get_prefix,
-    domattr_get_baseName,
-    domattr_transformNodeToObject,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
     domattr_get_name,
     domattr_get_value,
     domattr_put_value
@@ -546,32 +225,13 @@ static const struct IXMLDOMAttributeVtbl domattr_vtbl =
 
 IUnknown* create_attribute( xmlNodePtr attribute )
 {
-    domattr *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown( create_basic_node( attribute, NULL ) );
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &domattr_vtbl;
-    This->ref = 1;
-
-    This->node_unk = create_basic_node( attribute, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
+    This->lpVtbl = (IXMLDOMNodeVtbl*)&domattr_vtbl;
 
     return (IUnknown*) &This->lpVtbl;
 }
-- 
1.5.6.5


["0010-msxml3-Derive-domcdata-from-node-instead-of-aggrega.diff" (0010-msxml3-Derive-domcdata-from-node-instead-of-aggrega.diff)]

>From4ca3cee5a4261c3145acc4556e748bfc72ba8eb7 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Thu, 30 Oct 2008 00:10:30 +0100
Subject: [PATCH] msxml3: Derive domcdata from node instead of aggregation

---
 dlls/msxml3/cdata.c |  472 +++++++--------------------------------------------
 1 files changed, 64 insertions(+), 408 deletions(-)

diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index aa59ec3..6a4813f 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -37,17 +37,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _domcdata
+static inline IXMLDOMNode *upcast( IXMLDOMCDATASection *iface )
 {
-    const struct IXMLDOMCDATASectionVtbl *lpVtbl;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} domcdata;
+    return (IXMLDOMNode*)iface;
+}
 
-static inline domcdata *impl_from_IXMLDOMCDATASection( IXMLDOMCDATASection *iface )
+static inline xmlnode *impl_from_IXMLDOMCDATASection( IXMLDOMCDATASection *iface )
 {
-    return (domcdata *)((char*)iface - FIELD_OFFSET(domcdata, lpVtbl));
+    return impl_from_IXMLDOMNode( upcast( iface ) );
 }
 
 static HRESULT WINAPI domcdata_QueryInterface(
@@ -55,20 +52,17 @@ static HRESULT WINAPI domcdata_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMCDATASection ) ||
          IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -80,34 +74,11 @@ static HRESULT WINAPI domcdata_QueryInterface(
     return S_OK;
 }
 
-static ULONG WINAPI domcdata_AddRef(
-    IXMLDOMCDATASection *iface )
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI domcdata_Release(
-    IXMLDOMCDATASection *iface )
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
-        HeapFree( GetProcessHeap(), 0, This );
-    }
-
-    return ref;
-}
-
 static HRESULT WINAPI domcdata_GetTypeInfoCount(
     IXMLDOMCDATASection *iface,
     UINT* pctinfo )
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
 
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
@@ -121,7 +92,7 @@ static HRESULT WINAPI domcdata_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -136,7 +107,7 @@ static HRESULT WINAPI domcdata_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -162,7 +133,7 @@ static HRESULT WINAPI domcdata_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -180,309 +151,17 @@ static HRESULT WINAPI domcdata_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domcdata_get_nodeName(
-    IXMLDOMCDATASection *iface,
-    BSTR* p )
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_get_nodeValue(
-    IXMLDOMCDATASection *iface,
-    VARIANT* var1 )
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcdata_put_nodeValue(
-    IXMLDOMCDATASection *iface,
-    VARIANT var1 )
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcdata_get_nodeType(
-    IXMLDOMCDATASection *iface,
-    DOMNodeType* domNodeType )
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI domcdata_get_parentNode(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode** parent )
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI domcdata_get_childNodes(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNodeList** outList)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI domcdata_get_firstChild(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode** domNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domcdata_get_lastChild(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode** domNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI domcdata_get_previousSibling(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode** domNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domcdata_get_nextSibling(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode** domNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI domcdata_get_attributes(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-	domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI domcdata_insertBefore(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI domcdata_replaceChild(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI domcdata_removeChild(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI domcdata_appendChild(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI domcdata_hasChildNodes(
-    IXMLDOMCDATASection *iface,
-    VARIANT_BOOL* pbool)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI domcdata_get_ownerDocument(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMDocument** domDocument)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI domcdata_cloneNode(
-    IXMLDOMCDATASection *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI domcdata_get_nodeTypeString(
-    IXMLDOMCDATASection *iface,
-    BSTR* p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_get_text(
-    IXMLDOMCDATASection *iface,
-    BSTR* p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_put_text(
-    IXMLDOMCDATASection *iface,
-    BSTR p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_get_specified(
-    IXMLDOMCDATASection *iface,
-    VARIANT_BOOL* pbool)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI domcdata_get_definition(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode** domNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI domcdata_get_nodeTypedValue(
-    IXMLDOMCDATASection *iface,
-    VARIANT* var1)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcdata_put_nodeTypedValue(
-    IXMLDOMCDATASection *iface,
-    VARIANT var1)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI domcdata_get_dataType(
-    IXMLDOMCDATASection *iface,
-    VARIANT* var1)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI domcdata_put_dataType(
-    IXMLDOMCDATASection *iface,
-    BSTR p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_get_xml(
-    IXMLDOMCDATASection *iface,
-    BSTR* p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_transformNode(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI domcdata_selectNodes(
-    IXMLDOMCDATASection *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI domcdata_selectSingleNode(
-    IXMLDOMCDATASection *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI domcdata_get_parsed(
-    IXMLDOMCDATASection *iface,
-    VARIANT_BOOL* pbool)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI domcdata_get_namespaceURI(
-    IXMLDOMCDATASection *iface,
-    BSTR* p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_get_prefix(
-    IXMLDOMCDATASection *iface,
-    BSTR* p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_get_baseName(
-    IXMLDOMCDATASection *iface,
-    BSTR* p)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI domcdata_transformNodeToObject(
-    IXMLDOMCDATASection *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
-}
-
 static HRESULT WINAPI domcdata_get_data(
     IXMLDOMCDATASection *iface,
     BSTR *p)
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
     HRESULT hr = E_FAIL;
     VARIANT vRet;
 
     if(!p)
         return E_INVALIDARG;
 
-    hr = IXMLDOMNode_get_nodeValue( This->node, &vRet );
+    hr = IXMLDOMNode_get_nodeValue( upcast( iface ), &vRet );
     if(hr == S_OK)
     {
         *p = V_BSTR(&vRet);
@@ -495,7 +174,7 @@ static HRESULT WINAPI domcdata_put_data(
     IXMLDOMCDATASection *iface,
     BSTR data)
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     HRESULT hr = E_FAIL;
     VARIANT val;
 
@@ -504,7 +183,7 @@ static HRESULT WINAPI domcdata_put_data(
     V_VT(&val) = VT_BSTR;
     V_BSTR(&val) = data;
 
-    hr = IXMLDOMNode_put_nodeValue( This->node, val );
+    hr = IXMLDOMNode_put_nodeValue( upcast( iface ), val );
 
     return hr;
 }
@@ -513,8 +192,7 @@ static HRESULT WINAPI domcdata_get_length(
     IXMLDOMCDATASection *iface,
     long *len)
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     xmlChar *pContent;
     long nLength = 0;
 
@@ -523,7 +201,7 @@ static HRESULT WINAPI domcdata_get_length(
     if(!len)
         return E_INVALIDARG;
 
-    pContent = xmlNodeGetContent(pDOMNode->node);
+    pContent = xmlNodeGetContent(This->node);
     if(pContent)
     {
         nLength = xmlStrlen(pContent);
@@ -539,8 +217,7 @@ static HRESULT WINAPI domcdata_substringData(
     IXMLDOMCDATASection *iface,
     long offset, long count, BSTR *p)
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     xmlChar *pContent;
     long nLength = 0;
     HRESULT hr = S_FALSE;
@@ -557,7 +234,7 @@ static HRESULT WINAPI domcdata_substringData(
     if(count == 0)
         return hr;
 
-    pContent = xmlNodeGetContent(pDOMNode->node);
+    pContent = xmlNodeGetContent(This->node);
     if(pContent)
     {
         nLength = xmlStrlen(pContent);
@@ -584,8 +261,7 @@ static HRESULT WINAPI domcdata_appendData(
     IXMLDOMCDATASection *iface,
     BSTR p)
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     xmlChar *pContent;
     HRESULT hr = S_FALSE;
 
@@ -598,7 +274,7 @@ static HRESULT WINAPI domcdata_appendData(
     pContent = xmlChar_from_wchar( (WCHAR*)p );
     if(pContent)
     {
-        if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0)
+        if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
             hr = S_OK;
         else
             hr = E_FAIL;
@@ -614,8 +290,7 @@ static HRESULT WINAPI domcdata_insertData(
     IXMLDOMCDATASection *iface,
     long offset, BSTR p)
 {
-    domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
     xmlChar *pXmlContent;
     BSTR sNewString;
     HRESULT hr = S_FALSE;
@@ -633,7 +308,7 @@ static HRESULT WINAPI domcdata_insertData(
         return E_INVALIDARG;
     }
 
-    pXmlContent = xmlNodeGetContent(pDOMNode->node);
+    pXmlContent = xmlNodeGetContent(This->node);
     if(pXmlContent)
     {
         BSTR sContent = bstr_from_xmlChar( pXmlContent );
@@ -664,7 +339,7 @@ static HRESULT WINAPI domcdata_insertData(
             str = xmlChar_from_wchar((WCHAR*)sNewString);
             if(str)
             {
-                xmlNodeSetContent(pDOMNode->node, str);
+                xmlNodeSetContent(This->node, str);
                 hr = S_OK;
             }
             HeapFree(GetProcessHeap(), 0, str);
@@ -708,48 +383,48 @@ static HRESULT WINAPI domcdata_splitText(
 static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
 {
     domcdata_QueryInterface,
-    domcdata_AddRef,
-    domcdata_Release,
+    xmlnode_AddRef,
+    xmlnode_Release,
     domcdata_GetTypeInfoCount,
     domcdata_GetTypeInfo,
     domcdata_GetIDsOfNames,
     domcdata_Invoke,
-    domcdata_get_nodeName,
-    domcdata_get_nodeValue,
-    domcdata_put_nodeValue,
-    domcdata_get_nodeType,
-    domcdata_get_parentNode,
-    domcdata_get_childNodes,
-    domcdata_get_firstChild,
-    domcdata_get_lastChild,
-    domcdata_get_previousSibling,
-    domcdata_get_nextSibling,
-    domcdata_get_attributes,
-    domcdata_insertBefore,
-    domcdata_replaceChild,
-    domcdata_removeChild,
-    domcdata_appendChild,
-    domcdata_hasChildNodes,
-    domcdata_get_ownerDocument,
-    domcdata_cloneNode,
-    domcdata_get_nodeTypeString,
-    domcdata_get_text,
-    domcdata_put_text,
-    domcdata_get_specified,
-    domcdata_get_definition,
-    domcdata_get_nodeTypedValue,
-    domcdata_put_nodeTypedValue,
-    domcdata_get_dataType,
-    domcdata_put_dataType,
-    domcdata_get_xml,
-    domcdata_transformNode,
-    domcdata_selectNodes,
-    domcdata_selectSingleNode,
-    domcdata_get_parsed,
-    domcdata_get_namespaceURI,
-    domcdata_get_prefix,
-    domcdata_get_baseName,
-    domcdata_transformNodeToObject,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
     domcdata_get_data,
     domcdata_put_data,
     domcdata_get_length,
@@ -763,32 +438,13 @@ static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
 
 IUnknown* create_cdata( xmlNodePtr text )
 {
-    domcdata *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown( create_basic_node( text, NULL ) );
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &domcdata_vtbl;
-    This->ref = 1;
-
-    This->node_unk = create_basic_node( text, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
+    This->lpVtbl = (IXMLDOMNodeVtbl*)&domcdata_vtbl;
 
     return (IUnknown*) &This->lpVtbl;
 }
-- 
1.5.6.5


["0011-msxml3-Derive-entityref-from-node-instead-of-aggreg.diff" (0011-msxml3-Derive-entityref-from-node-instead-of-aggreg.diff)]

>From5af1ebec02e19570ea7d2e1637578454fe8fd53a Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Thu, 30 Oct 2008 20:14:11 +0100
Subject: [PATCH] msxml3: Derive entityref from node instead of aggregation.

---
 dlls/msxml3/entityref.c |  443 ++++++-----------------------------------------
 1 files changed, 52 insertions(+), 391 deletions(-)

diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c
index a72b110..c24af52 100644
--- a/dlls/msxml3/entityref.c
+++ b/dlls/msxml3/entityref.c
@@ -37,17 +37,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
-typedef struct _entityref
+static inline IXMLDOMNode *upcast( IXMLDOMEntityReference *iface )
 {
-    const struct IXMLDOMEntityReferenceVtbl *lpVtbl;
-    LONG ref;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-} entityref;
+    return (IXMLDOMNode*)iface;
+}
 
-static inline entityref *impl_from_IXMLDOMEntityReference( IXMLDOMEntityReference *iface )
+static inline xmlnode *impl_from_IXMLDOMEntityReference( IXMLDOMEntityReference *iface )
 {
-    return (entityref *)((char*)iface - FIELD_OFFSET(entityref, lpVtbl));
+    return impl_from_IXMLDOMNode( upcast( iface ) );
 }
 
 static HRESULT WINAPI entityref_QueryInterface(
@@ -55,19 +52,16 @@ static HRESULT WINAPI entityref_QueryInterface(
     REFIID riid,
     void** ppvObject )
 {
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
+    xmlnode *This = impl_from_IXMLDOMEntityReference( iface );
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMEntityReference ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else
     {
         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -79,34 +73,11 @@ static HRESULT WINAPI entityref_QueryInterface(
     return S_OK;
 }
 
-static ULONG WINAPI entityref_AddRef(
-    IXMLDOMEntityReference *iface )
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI entityref_Release(
-    IXMLDOMEntityReference *iface )
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-    {
-        IUnknown_Release( This->node_unk );
-        HeapFree( GetProcessHeap(), 0, This );
-    }
-
-    return ref;
-}
-
 static HRESULT WINAPI entityref_GetTypeInfoCount(
     IXMLDOMEntityReference *iface,
     UINT* pctinfo )
 {
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
+    xmlnode *This = impl_from_IXMLDOMEntityReference( iface );
     TRACE("(%p)->(%p)\n", This, pctinfo);
 
     *pctinfo = 1;
@@ -119,7 +90,7 @@ static HRESULT WINAPI entityref_GetTypeInfo(
     UINT iTInfo, LCID lcid,
     ITypeInfo** ppTInfo )
 {
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
+    xmlnode *This = impl_from_IXMLDOMEntityReference( iface );
     HRESULT hr;
 
     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -134,7 +105,7 @@ static HRESULT WINAPI entityref_GetIDsOfNames(
     REFIID riid, LPOLESTR* rgszNames,
     UINT cNames, LCID lcid, DISPID* rgDispId )
 {
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
+    xmlnode *This = impl_from_IXMLDOMEntityReference( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -160,7 +131,7 @@ static HRESULT WINAPI entityref_Invoke(
     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo, UINT* puArgErr )
 {
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
+    xmlnode *This = impl_from_IXMLDOMEntityReference( iface );
     ITypeInfo *typeinfo;
     HRESULT hr;
 
@@ -178,372 +149,62 @@ static HRESULT WINAPI entityref_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI entityref_get_nodeName(
-    IXMLDOMEntityReference *iface,
-    BSTR* p )
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_nodeName( This->node, p );
-}
-
-static HRESULT WINAPI entityref_get_nodeValue(
-    IXMLDOMEntityReference *iface,
-    VARIANT* var1 )
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI entityref_put_nodeValue(
-    IXMLDOMEntityReference *iface,
-    VARIANT var1 )
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, var1 );
-}
-
-static HRESULT WINAPI entityref_get_nodeType(
-    IXMLDOMEntityReference *iface,
-    DOMNodeType* domNodeType )
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_nodeType( This->node, domNodeType );
-}
-
-static HRESULT WINAPI entityref_get_parentNode(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode** parent )
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-static HRESULT WINAPI entityref_get_childNodes(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNodeList** outList)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_childNodes( This->node, outList );
-}
-
-static HRESULT WINAPI entityref_get_firstChild(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode** domNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_firstChild( This->node, domNode );
-}
-
-static HRESULT WINAPI entityref_get_lastChild(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode** domNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_lastChild( This->node, domNode );
-}
-
-static HRESULT WINAPI entityref_get_previousSibling(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode** domNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI entityref_get_nextSibling(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode** domNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, domNode );
-}
-
-static HRESULT WINAPI entityref_get_attributes(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNamedNodeMap** attributeMap)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-static HRESULT WINAPI entityref_insertBefore(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode* newNode, VARIANT var1,
-    IXMLDOMNode** outOldNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
-}
-
-static HRESULT WINAPI entityref_replaceChild(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode* newNode,
-    IXMLDOMNode* oldNode,
-    IXMLDOMNode** outOldNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
-}
-
-static HRESULT WINAPI entityref_removeChild(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
-}
-
-static HRESULT WINAPI entityref_appendChild(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
-}
-
-static HRESULT WINAPI entityref_hasChildNodes(
-    IXMLDOMEntityReference *iface,
-    VARIANT_BOOL* pbool)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, pbool );
-}
-
-static HRESULT WINAPI entityref_get_ownerDocument(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMDocument** domDocument)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
-}
-
-static HRESULT WINAPI entityref_cloneNode(
-    IXMLDOMEntityReference *iface,
-    VARIANT_BOOL pbool, IXMLDOMNode** outNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
-}
-
-static HRESULT WINAPI entityref_get_nodeTypeString(
-    IXMLDOMEntityReference *iface,
-    BSTR* p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, p );
-}
-
-static HRESULT WINAPI entityref_get_text(
-    IXMLDOMEntityReference *iface,
-    BSTR* p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_text( This->node, p );
-}
-
-static HRESULT WINAPI entityref_put_text(
-    IXMLDOMEntityReference *iface,
-    BSTR p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_put_text( This->node, p );
-}
-
-static HRESULT WINAPI entityref_get_specified(
-    IXMLDOMEntityReference *iface,
-    VARIANT_BOOL* pbool)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_specified( This->node, pbool );
-}
-
-static HRESULT WINAPI entityref_get_definition(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode** domNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_definition( This->node, domNode );
-}
-
-static HRESULT WINAPI entityref_get_nodeTypedValue(
-    IXMLDOMEntityReference *iface,
-    VARIANT* var1)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI entityref_put_nodeTypedValue(
-    IXMLDOMEntityReference *iface,
-    VARIANT var1)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
-}
-
-static HRESULT WINAPI entityref_get_dataType(
-    IXMLDOMEntityReference *iface,
-    VARIANT* var1)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_dataType( This->node, var1 );
-}
-
-static HRESULT WINAPI entityref_put_dataType(
-    IXMLDOMEntityReference *iface,
-    BSTR p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_put_dataType( This->node, p );
-}
-
-static HRESULT WINAPI entityref_get_xml(
-    IXMLDOMEntityReference *iface,
-    BSTR* p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_xml( This->node, p );
-}
-
-static HRESULT WINAPI entityref_transformNode(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode* domNode, BSTR* p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_transformNode( This->node, domNode, p );
-}
-
-static HRESULT WINAPI entityref_selectNodes(
-    IXMLDOMEntityReference *iface,
-    BSTR p, IXMLDOMNodeList** outList)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_selectNodes( This->node, p, outList );
-}
-
-static HRESULT WINAPI entityref_selectSingleNode(
-    IXMLDOMEntityReference *iface,
-    BSTR p, IXMLDOMNode** outNode)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
-}
-
-static HRESULT WINAPI entityref_get_parsed(
-    IXMLDOMEntityReference *iface,
-    VARIANT_BOOL* pbool)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_parsed( This->node, pbool );
-}
-
-static HRESULT WINAPI entityref_get_namespaceURI(
-    IXMLDOMEntityReference *iface,
-    BSTR* p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, p );
-}
-
-static HRESULT WINAPI entityref_get_prefix(
-    IXMLDOMEntityReference *iface,
-    BSTR* p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_prefix( This->node, p );
-}
-
-static HRESULT WINAPI entityref_get_baseName(
-    IXMLDOMEntityReference *iface,
-    BSTR* p)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_get_baseName( This->node, p );
-}
-
-static HRESULT WINAPI entityref_transformNodeToObject(
-    IXMLDOMEntityReference *iface,
-    IXMLDOMNode* domNode, VARIANT var1)
-{
-    entityref *This = impl_from_IXMLDOMEntityReference( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
-}
-
 static const struct IXMLDOMEntityReferenceVtbl entityref_vtbl =
 {
     entityref_QueryInterface,
-    entityref_AddRef,
-    entityref_Release,
+    xmlnode_AddRef,
+    xmlnode_Release,
     entityref_GetTypeInfoCount,
     entityref_GetTypeInfo,
     entityref_GetIDsOfNames,
     entityref_Invoke,
-    entityref_get_nodeName,
-    entityref_get_nodeValue,
-    entityref_put_nodeValue,
-    entityref_get_nodeType,
-    entityref_get_parentNode,
-    entityref_get_childNodes,
-    entityref_get_firstChild,
-    entityref_get_lastChild,
-    entityref_get_previousSibling,
-    entityref_get_nextSibling,
-    entityref_get_attributes,
-    entityref_insertBefore,
-    entityref_replaceChild,
-    entityref_removeChild,
-    entityref_appendChild,
-    entityref_hasChildNodes,
-    entityref_get_ownerDocument,
-    entityref_cloneNode,
-    entityref_get_nodeTypeString,
-    entityref_get_text,
-    entityref_put_text,
-    entityref_get_specified,
-    entityref_get_definition,
-    entityref_get_nodeTypedValue,
-    entityref_put_nodeTypedValue,
-    entityref_get_dataType,
-    entityref_put_dataType,
-    entityref_get_xml,
-    entityref_transformNode,
-    entityref_selectNodes,
-    entityref_selectSingleNode,
-    entityref_get_parsed,
-    entityref_get_namespaceURI,
-    entityref_get_prefix,
-    entityref_get_baseName,
-    entityref_transformNodeToObject,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
 };
 
 IUnknown* create_doc_entity_ref( xmlNodePtr entity )
 {
-    entityref *This;
-    HRESULT hr;
+    xmlnode *This;
 
-    This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+    This = impl_from_NodeInternalUnknown( create_basic_node( entity, NULL ) );
     if ( !This )
         return NULL;
 
-    This->lpVtbl = &entityref_vtbl;
-    This->ref = 1;
-
-    This->node_unk = create_basic_node( entity, (IUnknown*)&This->lpVtbl );
-    if(!This->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, This);
-        return NULL;
-    }
-
-    hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(This->node_unk);
-        HeapFree( GetProcessHeap(), 0, This );
-        return NULL;
-    }
-    /* The ref on This->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(This->node);
+    This->lpVtbl = (IXMLDOMNodeVtbl*)&entityref_vtbl;
 
     return (IUnknown*) &This->lpVtbl;
 }
-- 
1.5.6.5


["0012-msxml3-Derive-domdoc-from-node-instead-of-aggregati.diff" (0012-msxml3-Derive-domdoc-from-node-instead-of-aggregati.diff)]

>From8ae17496337c79ecd9969a856e3751c92af55d96 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Thu, 30 Oct 2008 20:31:22 +0100
Subject: [PATCH] msxml3: Derive domdoc from node instead of aggregation.

---
 dlls/msxml3/domdoc.c |  488 ++++++-------------------------------------------
 1 files changed, 60 insertions(+), 428 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index c685889..9217755 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -53,18 +53,15 @@ static const WCHAR SZ_VALUE_XSLPATTERN[] = {'X','S','L','P','a','t','t','e','r',
 
 typedef struct _domdoc
 {
-    const struct IXMLDOMDocument2Vtbl *lpVtbl;
+    xmlnode node;
     const struct IPersistStreamVtbl   *lpvtblIPersistStream;
     const struct IObjectWithSiteVtbl  *lpvtblIObjectWithSite;
     const struct IObjectSafetyVtbl    *lpvtblIObjectSafety;
-    LONG ref;
     VARIANT_BOOL async;
     VARIANT_BOOL validating;
     VARIANT_BOOL resolving;
     VARIANT_BOOL preserving;
     BOOL bUseXPath;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
     IXMLDOMSchemaCollection *schema;
     bsc_t *bsc;
     HRESULT error;
@@ -209,14 +206,19 @@ HRESULT xmldoc_remove_orphan(xmlDocPtr doc, xmlNodePtr node)
     return S_FALSE;
 }
 
+static inline IXMLDOMNode * IXMLDOMNode_from_this( domdoc * This )
+{
+    return (IXMLDOMNode*)This;
+}
+
 static inline domdoc *impl_from_IXMLDOMDocument2( IXMLDOMDocument2 *iface )
 {
-    return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpVtbl));
+    return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, node.lpVtbl));
 }
 
 static inline xmlDocPtr get_doc( domdoc *This )
 {
-    return (xmlDocPtr) xmlNodePtr_from_domnode( This->node, XML_DOCUMENT_NODE );
+    return (xmlDocPtr) xmlNodePtr_from_domnode( IXMLDOMNode_from_this(This), XML_DOCUMENT_NODE );
 }
 
 static inline domdoc *impl_from_IPersistStream(IPersistStream *iface)
@@ -331,7 +333,7 @@ static HRESULT WINAPI xmldoc_IPersistStream_Load(
     }
 
     xmldoc->_private = create_priv();
-    attach_xmlnode( This->node, (xmlNodePtr)xmldoc );
+    attach_xmlnode( IXMLDOMNode_from_this(This), (xmlNodePtr)xmldoc );
 
     return S_OK;
 }
@@ -372,15 +374,12 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
 
     if ( IsEqualGUID( riid, &IID_IUnknown ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IXMLDOMDocument ) ||
          IsEqualGUID( riid, &IID_IXMLDOMDocument2 ) )
     {
         *ppvObject = iface;
     }
-    else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
-    {
-        return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
-    }
     else if (IsEqualGUID(&IID_IPersistStream, riid))
     {
         *ppvObject = (IPersistStream*)&(This->lpvtblIPersistStream);
@@ -410,15 +409,6 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
 }
 
 
-static ULONG WINAPI domdoc_AddRef(
-     IXMLDOMDocument2 *iface )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    TRACE("%p\n", This );
-    return InterlockedIncrement( &This->ref );
-}
-
-
 static ULONG WINAPI domdoc_Release(
      IXMLDOMDocument2 *iface )
 {
@@ -427,7 +417,7 @@ static ULONG WINAPI domdoc_Release(
 
     TRACE("%p\n", This );
 
-    ref = InterlockedDecrement( &This->ref );
+    ref = InterlockedDecrement( &This->node.ref );
     if ( ref == 0 )
     {
         if(This->bsc)
@@ -435,7 +425,6 @@ static ULONG WINAPI domdoc_Release(
 
         if (This->site)
             IUnknown_Release( This->site );
-        IUnknown_Release( This->node_unk );
         if(This->schema) IXMLDOMSchemaCollection_Release( This->schema );
         if (This->stream) IStream_Release(This->stream);
         HeapFree( GetProcessHeap(), 0, This );
@@ -519,7 +508,7 @@ static HRESULT WINAPI domdoc_Invoke(
     hr = get_typeinfo(IXMLDOMDocument2_tid, &typeinfo);
     if(SUCCEEDED(hr))
     {
-        hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
+        hr = ITypeInfo_Invoke(typeinfo, &(This->node.lpVtbl), dispIdMember, wFlags, pDispParams,
                 pVarResult, pExcepInfo, puArgErr);
         ITypeInfo_Release(typeinfo);
     }
@@ -528,340 +517,6 @@ static HRESULT WINAPI domdoc_Invoke(
 }
 
 
-static HRESULT WINAPI domdoc_get_nodeName(
-    IXMLDOMDocument2 *iface,
-    BSTR* name )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_nodeName( This->node, name );
-}
-
-
-static HRESULT WINAPI domdoc_get_nodeValue(
-    IXMLDOMDocument2 *iface,
-    VARIANT* value )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_nodeValue( This->node, value );
-}
-
-
-static HRESULT WINAPI domdoc_put_nodeValue(
-    IXMLDOMDocument2 *iface,
-    VARIANT value)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_put_nodeValue( This->node, value );
-}
-
-
-static HRESULT WINAPI domdoc_get_nodeType(
-    IXMLDOMDocument2 *iface,
-    DOMNodeType* type )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_nodeType( This->node, type );
-}
-
-
-static HRESULT WINAPI domdoc_get_parentNode(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode** parent )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_parentNode( This->node, parent );
-}
-
-
-static HRESULT WINAPI domdoc_get_childNodes(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNodeList** childList )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_childNodes( This->node, childList );
-}
-
-
-static HRESULT WINAPI domdoc_get_firstChild(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode** firstChild )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_firstChild( This->node, firstChild );
-}
-
-
-static HRESULT WINAPI domdoc_get_lastChild(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode** lastChild )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_lastChild( This->node, lastChild );
-}
-
-
-static HRESULT WINAPI domdoc_get_previousSibling(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode** previousSibling )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_previousSibling( This->node, previousSibling );
-}
-
-
-static HRESULT WINAPI domdoc_get_nextSibling(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode** nextSibling )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_nextSibling( This->node, nextSibling );
-}
-
-
-static HRESULT WINAPI domdoc_get_attributes(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNamedNodeMap** attributeMap )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_attributes( This->node, attributeMap );
-}
-
-
-static HRESULT WINAPI domdoc_insertBefore(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode* newChild,
-    VARIANT refChild,
-    IXMLDOMNode** outNewChild )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_insertBefore( This->node, newChild, refChild, outNewChild );
-}
-
-
-static HRESULT WINAPI domdoc_replaceChild(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode* newChild,
-    IXMLDOMNode* oldChild,
-    IXMLDOMNode** outOldChild)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_replaceChild( This->node, newChild, oldChild, outOldChild );
-}
-
-
-static HRESULT WINAPI domdoc_removeChild(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode* childNode,
-    IXMLDOMNode** oldChild)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_removeChild( This->node, childNode, oldChild );
-}
-
-
-static HRESULT WINAPI domdoc_appendChild(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode* newChild,
-    IXMLDOMNode** outNewChild)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_appendChild( This->node, newChild, outNewChild );
-}
-
-
-static HRESULT WINAPI domdoc_hasChildNodes(
-    IXMLDOMDocument2 *iface,
-    VARIANT_BOOL* hasChild)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_hasChildNodes( This->node, hasChild );
-}
-
-
-static HRESULT WINAPI domdoc_get_ownerDocument(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMDocument** DOMDocument)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_ownerDocument( This->node, DOMDocument );
-}
-
-
-static HRESULT WINAPI domdoc_cloneNode(
-    IXMLDOMDocument2 *iface,
-    VARIANT_BOOL deep,
-    IXMLDOMNode** cloneRoot)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_cloneNode( This->node, deep, cloneRoot );
-}
-
-
-static HRESULT WINAPI domdoc_get_nodeTypeString(
-    IXMLDOMDocument2 *iface,
-    BSTR* nodeType )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_nodeTypeString( This->node, nodeType );
-}
-
-
-static HRESULT WINAPI domdoc_get_text(
-    IXMLDOMDocument2 *iface,
-    BSTR* text )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_text( This->node, text );
-}
-
-
-static HRESULT WINAPI domdoc_put_text(
-    IXMLDOMDocument2 *iface,
-    BSTR text )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_put_text( This->node, text );
-}
-
-
-static HRESULT WINAPI domdoc_get_specified(
-    IXMLDOMDocument2 *iface,
-    VARIANT_BOOL* isSpecified )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_specified( This->node, isSpecified );
-}
-
-
-static HRESULT WINAPI domdoc_get_definition(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode** definitionNode )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_definition( This->node, definitionNode );
-}
-
-
-static HRESULT WINAPI domdoc_get_nodeTypedValue(
-    IXMLDOMDocument2 *iface,
-    VARIANT* typedValue )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_nodeTypedValue( This->node, typedValue );
-}
-
-static HRESULT WINAPI domdoc_put_nodeTypedValue(
-    IXMLDOMDocument2 *iface,
-    VARIANT typedValue )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_put_nodeTypedValue( This->node, typedValue );
-}
-
-
-static HRESULT WINAPI domdoc_get_dataType(
-    IXMLDOMDocument2 *iface,
-    VARIANT* dataTypeName )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_dataType( This->node, dataTypeName );
-}
-
-
-static HRESULT WINAPI domdoc_put_dataType(
-    IXMLDOMDocument2 *iface,
-    BSTR dataTypeName )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_put_dataType( This->node, dataTypeName );
-}
-
-
-static HRESULT WINAPI domdoc_get_xml(
-    IXMLDOMDocument2 *iface,
-    BSTR* xmlString )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_xml( This->node, xmlString );
-}
-
-
-static HRESULT WINAPI domdoc_transformNode(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode* styleSheet,
-    BSTR* xmlString )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_transformNode( This->node, styleSheet, xmlString );
-}
-
-
-static HRESULT WINAPI domdoc_selectNodes(
-    IXMLDOMDocument2 *iface,
-    BSTR queryString,
-    IXMLDOMNodeList** resultList )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_selectNodes( This->node, queryString, resultList );
-}
-
-
-static HRESULT WINAPI domdoc_selectSingleNode(
-    IXMLDOMDocument2 *iface,
-    BSTR queryString,
-    IXMLDOMNode** resultNode )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_selectSingleNode( This->node, queryString, resultNode );
-}
-
-
-static HRESULT WINAPI domdoc_get_parsed(
-    IXMLDOMDocument2 *iface,
-    VARIANT_BOOL* isParsed )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_parsed( This->node, isParsed );
-}
-
-
-static HRESULT WINAPI domdoc_get_namespaceURI(
-    IXMLDOMDocument2 *iface,
-    BSTR* namespaceURI )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_namespaceURI( This->node, namespaceURI );
-}
-
-
-static HRESULT WINAPI domdoc_get_prefix(
-    IXMLDOMDocument2 *iface,
-    BSTR* prefixString )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_prefix( This->node, prefixString );
-}
-
-
-static HRESULT WINAPI domdoc_get_baseName(
-    IXMLDOMDocument2 *iface,
-    BSTR* nameString )
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_get_baseName( This->node, nameString );
-}
-
-
-static HRESULT WINAPI domdoc_transformNodeToObject(
-    IXMLDOMDocument2 *iface,
-    IXMLDOMNode* stylesheet,
-    VARIANT outputObject)
-{
-    domdoc *This = impl_from_IXMLDOMDocument2( iface );
-    return IXMLDOMNode_transformNodeToObject( This->node, stylesheet, outputObject );
-}
-
-
 static HRESULT WINAPI domdoc_get_doctype(
     IXMLDOMDocument2 *iface,
     IXMLDOMDocumentType** documentType )
@@ -893,7 +548,7 @@ static HRESULT WINAPI domdoc_get_documentElement(
     IXMLDOMNode *element_node;
     HRESULT hr;
 
-    TRACE("%p %p\n", This, This->node);
+    TRACE("%p\n", This);
 
     if(!DOMElement)
         return E_INVALIDARG;
@@ -1310,7 +965,7 @@ static HRESULT domdoc_onDataAvailable(void *obj, char *ptr, DWORD len)
     xmldoc = doparse( ptr, len );
     if(xmldoc) {
         xmldoc->_private = create_priv();
-        attach_xmlnode(This->node, (xmlNodePtr) xmldoc);
+        attach_xmlnode(IXMLDOMNode_from_this(This), (xmlNodePtr) xmldoc);
     }
 
     return S_OK;
@@ -1348,9 +1003,7 @@ static HRESULT WINAPI domdoc_load(
 
     *isSuccessful = VARIANT_FALSE;
 
-    assert( This->node );
-
-    attach_xmlnode(This->node, NULL);
+    attach_xmlnode( IXMLDOMNode_from_this(This), NULL);
 
     switch( V_VT(&xmlSource) )
     {
@@ -1365,7 +1018,7 @@ static HRESULT WINAPI domdoc_load(
             {
                 domdoc *newDoc = impl_from_IXMLDOMDocument2( pNewDoc );
                 xmldoc = xmlCopyDoc(get_doc(newDoc), 1);
-                attach_xmlnode(This->node, (xmlNodePtr) xmldoc);
+                attach_xmlnode(IXMLDOMNode_from_this(This), (xmlNodePtr) xmldoc);
 
                 *isSuccessful = VARIANT_TRUE;
 
@@ -1426,7 +1079,7 @@ static HRESULT WINAPI domdoc_load(
     if(!filename || FAILED(hr)) {
         xmldoc = xmlNewDoc(NULL);
         xmldoc->_private = create_priv();
-        attach_xmlnode(This->node, (xmlNodePtr) xmldoc);
+        attach_xmlnode(IXMLDOMNode_from_this(This), (xmlNodePtr) xmldoc);
         hr = S_FALSE;
     }
 
@@ -1533,9 +1186,7 @@ static HRESULT WINAPI domdoc_loadXML(
 
     TRACE("%p %s %p\n", This, debugstr_w( bstrXML ), isSuccessful );
 
-    assert ( This->node );
-
-    attach_xmlnode( This->node, NULL );
+    attach_xmlnode( IXMLDOMNode_from_this(This), NULL );
 
     if ( isSuccessful )
     {
@@ -1558,7 +1209,7 @@ static HRESULT WINAPI domdoc_loadXML(
         xmldoc = xmlNewDoc(NULL);
 
     xmldoc->_private = create_priv();
-    attach_xmlnode( This->node, (xmlNodePtr) xmldoc );
+    attach_xmlnode( IXMLDOMNode_from_this(This), (xmlNodePtr) xmldoc );
 
     return hr;
 }
@@ -1884,48 +1535,48 @@ static HRESULT WINAPI domdoc_getProperty(
 static const struct IXMLDOMDocument2Vtbl domdoc_vtbl =
 {
     domdoc_QueryInterface,
-    domdoc_AddRef,
+    xmlnode_AddRef,
     domdoc_Release,
     domdoc_GetTypeInfoCount,
     domdoc_GetTypeInfo,
     domdoc_GetIDsOfNames,
     domdoc_Invoke,
-    domdoc_get_nodeName,
-    domdoc_get_nodeValue,
-    domdoc_put_nodeValue,
-    domdoc_get_nodeType,
-    domdoc_get_parentNode,
-    domdoc_get_childNodes,
-    domdoc_get_firstChild,
-    domdoc_get_lastChild,
-    domdoc_get_previousSibling,
-    domdoc_get_nextSibling,
-    domdoc_get_attributes,
-    domdoc_insertBefore,
-    domdoc_replaceChild,
-    domdoc_removeChild,
-    domdoc_appendChild,
-    domdoc_hasChildNodes,
-    domdoc_get_ownerDocument,
-    domdoc_cloneNode,
-    domdoc_get_nodeTypeString,
-    domdoc_get_text,
-    domdoc_put_text,
-    domdoc_get_specified,
-    domdoc_get_definition,
-    domdoc_get_nodeTypedValue,
-    domdoc_put_nodeTypedValue,
-    domdoc_get_dataType,
-    domdoc_put_dataType,
-    domdoc_get_xml,
-    domdoc_transformNode,
-    domdoc_selectNodes,
-    domdoc_selectSingleNode,
-    domdoc_get_parsed,
-    domdoc_get_namespaceURI,
-    domdoc_get_prefix,
-    domdoc_get_baseName,
-    domdoc_transformNodeToObject,
+    xmlnode_get_nodeName,
+    xmlnode_get_nodeValue,
+    xmlnode_put_nodeValue,
+    xmlnode_get_nodeType,
+    xmlnode_get_parentNode,
+    xmlnode_get_childNodes,
+    xmlnode_get_firstChild,
+    xmlnode_get_lastChild,
+    xmlnode_get_previousSibling,
+    xmlnode_get_nextSibling,
+    xmlnode_get_attributes,
+    xmlnode_insertBefore,
+    xmlnode_replaceChild,
+    xmlnode_removeChild,
+    xmlnode_appendChild,
+    xmlnode_hasChildNodes,
+    xmlnode_get_ownerDocument,
+    xmlnode_cloneNode,
+    xmlnode_get_nodeTypeString,
+    xmlnode_get_text,
+    xmlnode_put_text,
+    xmlnode_get_specified,
+    xmlnode_get_definition,
+    xmlnode_get_nodeTypedValue,
+    xmlnode_put_nodeTypedValue,
+    xmlnode_get_dataType,
+    xmlnode_put_dataType,
+    xmlnode_get_xml,
+    xmlnode_transformNode,
+    xmlnode_selectNodes,
+    xmlnode_selectSingleNode,
+    xmlnode_get_parsed,
+    xmlnode_get_namespaceURI,
+    xmlnode_get_prefix,
+    xmlnode_get_baseName,
+    xmlnode_transformNodeToObject,
     domdoc_get_doctype,
     domdoc_get_implementation,
     domdoc_get_documentElement,
@@ -2115,17 +1766,16 @@ static dispex_static_data_t domdoc_dispex = {
 HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document)
 {
     domdoc *doc;
-    HRESULT hr;
 
     doc = HeapAlloc( GetProcessHeap(), 0, sizeof (*doc) );
     if( !doc )
         return E_OUTOFMEMORY;
 
-    doc->lpVtbl = &domdoc_vtbl;
+    init_basic_node( &doc->node, (xmlNodePtr)xmldoc );
+    doc->node.lpVtbl = (IXMLDOMNodeVtbl*)&domdoc_vtbl;
     doc->lpvtblIPersistStream = &xmldoc_IPersistStream_VTable;
     doc->lpvtblIObjectWithSite = &domdocObjectSite;
     doc->lpvtblIObjectSafety = &domdocObjectSafetyVtbl;
-    doc->ref = 1;
     doc->async = 0;
     doc->validating = 0;
     doc->resolving = 0;
@@ -2138,27 +1788,9 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **docu
     doc->safeopt = 0;
     doc->bsc = NULL;
 
-    doc->node_unk = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl );
-    if(!doc->node_unk)
-    {
-        HeapFree(GetProcessHeap(), 0, doc);
-        return E_FAIL;
-    }
-
-    hr = IUnknown_QueryInterface(doc->node_unk, &IID_IXMLDOMNode, (LPVOID*)&doc->node);
-    if(FAILED(hr))
-    {
-        IUnknown_Release(doc->node_unk);
-        HeapFree( GetProcessHeap(), 0, doc );
-        return E_FAIL;
-    }
-
-    init_dispex(&doc->dispex, (IUnknown*)&doc->lpVtbl, &domdoc_dispex);
-
-    /* The ref on doc->node is actually looped back into this object, so release it */
-    IXMLDOMNode_Release(doc->node);
+    init_dispex(&doc->dispex, (IUnknown*)&doc->node.lpVtbl, &domdoc_dispex);
 
-    *document = (IXMLDOMDocument2*)&doc->lpVtbl;
+    *document = (IXMLDOMDocument2*)&doc->node.lpVtbl;
 
     TRACE("returning iface %p\n", *document);
     return S_OK;
-- 
1.5.6.5


["0013-msxml3-Remove-element-aggregation-support.diff" (0013-msxml3-Remove-element-aggregation-support.diff)]

>From130d3fa731e4c0528c7de823fa9d9a85bce960d0 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Fri, 31 Oct 2008 00:01:33 +0100
Subject: [PATCH] msxml3: Remove element aggregation support

---
 dlls/msxml3/domdoc.c        |    2 +-
 dlls/msxml3/element.c       |   88 +++++++++++++++----------------------------
 dlls/msxml3/msxml_private.h |    2 +-
 dlls/msxml3/node.c          |    2 +-
 4 files changed, 33 insertions(+), 61 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 9217755..527e524 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -621,7 +621,7 @@ static HRESULT WINAPI domdoc_createElement(
     xmldoc_add_orphan(xmlnode->doc, xmlnode);
 
     TRACE("created xmlptr %p\n", xmlnode);
-    elem_unk = create_element(xmlnode, NULL);
+    elem_unk = create_element(xmlnode);
     HeapFree(GetProcessHeap(), 0, xml_name);
 
     hr = IUnknown_QueryInterface(elem_unk, &IID_IXMLDOMElement, (void **)element);
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index da7ea90..0cf6bef 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -48,6 +48,32 @@ static inline xmlNodePtr get_element( xmlnode *This )
     return xmlNodePtr_from_domnode( (IXMLDOMNode*)This, XML_ELEMENT_NODE );
 }
 
+static HRESULT WINAPI domelem_QueryInterface(
+    IXMLDOMElement *iface,
+    REFIID riid,
+    void** ppvObject )
+{
+    xmlnode *This = impl_from_IXMLDOMElement( iface );
+    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+
+    if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
+         IsEqualGUID( riid, &IID_IDispatch ) ||
+         IsEqualGUID( riid, &IID_IUnknown ) )
+    {
+        *ppvObject = &This->lpVtbl;
+    }
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef( (IUnknown*)*ppvObject );
+
+    return S_OK;
+}
+
 static HRESULT WINAPI domelem_GetTypeInfoCount(
     IXMLDOMElement *iface,
     UINT* pctinfo )
@@ -329,7 +355,7 @@ static HRESULT WINAPI domelem_normalize(
 
 static const struct IXMLDOMElementVtbl domelem_vtbl =
 {
-    xmlnode_QueryInterface,
+    domelem_QueryInterface,
     xmlnode_AddRef,
     xmlnode_Release,
     domelem_GetTypeInfoCount,
@@ -383,71 +409,17 @@ static const struct IXMLDOMElementVtbl domelem_vtbl =
     domelem_normalize,
 };
 
-static HRESULT WINAPI Internal_QueryInterface(
-    IUnknown *iface,
-    REFIID riid,
-    void** ppvObject )
-{
-    xmlnode *This = impl_from_NodeInternalUnknown( iface );
-    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
-
-    if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
-         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
-         IsEqualGUID( riid, &IID_IDispatch ) ||
-         IsEqualGUID( riid, &IID_IUnknown ) )
-    {
-        *ppvObject = &This->lpVtbl;
-    }
-    else
-    {
-        FIXME("interface %s not implemented\n", debugstr_guid(riid));
-        return E_NOINTERFACE;
-    }
-
-    IUnknown_AddRef( (IUnknown*)*ppvObject );
-
-    return S_OK;
-}
-
-static ULONG WINAPI Internal_AddRef(
-    IUnknown *iface )
-{
-    xmlnode *This = impl_from_NodeInternalUnknown( iface );
-    return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI Internal_Release(
-    IUnknown *iface )
-{
-    xmlnode *This = impl_from_NodeInternalUnknown( iface );
-    ULONG ref;
-
-    ref = InterlockedDecrement( &This->ref );
-    if ( ref == 0 )
-        HeapFree( GetProcessHeap(), 0, This );
-
-    return ref;
-}
-
-static const struct IUnknownVtbl internal_unk_vtbl =
-{
-    Internal_QueryInterface,
-    Internal_AddRef,
-    Internal_Release
-};
-
-IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter )
+IUnknown* create_element( xmlNodePtr element )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown(create_basic_node( element, pUnkOuter ));
+    This = impl_from_NodeInternalUnknown(create_basic_node( element, NULL ));
     if ( !This )
         return NULL;
 
     This->lpVtbl = (IXMLDOMNodeVtbl*)&domelem_vtbl;
-    This->lpInternalUnkVtbl = &internal_unk_vtbl;
 
-    return (IUnknown*) &This->lpInternalUnkVtbl;
+    return (IUnknown*) &This->lpVtbl;
 }
 
 #endif
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 6782a8b..0f4b729 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -40,7 +40,7 @@ extern IUnknown         *create_domdoc( xmlNodePtr document );
 extern IUnknown         *create_xmldoc( void );
 extern IXMLDOMNode      *create_node( xmlNodePtr node );
 extern IUnknown         *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter );
-extern IUnknown         *create_element( xmlNodePtr element, IUnknown *pUnkOuter );
+extern IUnknown         *create_element( xmlNodePtr element );
 extern IUnknown         *create_attribute( xmlNodePtr attribute );
 extern IUnknown         *create_text( xmlNodePtr text );
 extern IUnknown         *create_pi( xmlNodePtr pi );
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index c46667b..8b3c1e8 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1641,7 +1641,7 @@ IXMLDOMNode *create_node( xmlNodePtr node )
     switch(node->type)
     {
     case XML_ELEMENT_NODE:
-        pUnk = create_element( node, NULL );
+        pUnk = create_element( node );
         break;
     case XML_ATTRIBUTE_NODE:
         pUnk = create_attribute( node );
-- 
1.5.6.5


["0014-msxml3-Remove-node-aggregation-support.diff" (0014-msxml3-Remove-node-aggregation-support.diff)]

>From4a7bb8b6cf7cbfb07376a1069f9cf1dd407d8caf Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Fri, 31 Oct 2008 00:12:51 +0100
Subject: [PATCH] msxml3: Remove node aggregation support

---
 dlls/msxml3/attribute.c     |    2 +-
 dlls/msxml3/cdata.c         |    2 +-
 dlls/msxml3/comment.c       |    2 +-
 dlls/msxml3/docfrag.c       |    2 +-
 dlls/msxml3/element.c       |    2 +-
 dlls/msxml3/entityref.c     |    2 +-
 dlls/msxml3/msxml_private.h |    9 +---
 dlls/msxml3/node.c          |  106 +++++++++++++------------------------------
 dlls/msxml3/pi.c            |    2 +-
 dlls/msxml3/text.c          |    2 +-
 10 files changed, 40 insertions(+), 91 deletions(-)

diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index 309d183..3ba870c 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -227,7 +227,7 @@ IUnknown* create_attribute( xmlNodePtr attribute )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown( create_basic_node( attribute, NULL ) );
+    This = impl_from_IXMLDOMNode( create_basic_node( attribute ) );
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 6a4813f..e63db10 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -440,7 +440,7 @@ IUnknown* create_cdata( xmlNodePtr text )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown( create_basic_node( text, NULL ) );
+    This = impl_from_IXMLDOMNode( create_basic_node( text ) );
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index ea3b804..55526c8 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -438,7 +438,7 @@ IUnknown* create_comment( xmlNodePtr comment )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown(create_basic_node( comment, NULL ));
+    This = impl_from_IXMLDOMNode(create_basic_node( comment ) );
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c
index dd7b249..507fede 100644
--- a/dlls/msxml3/docfrag.c
+++ b/dlls/msxml3/docfrag.c
@@ -196,7 +196,7 @@ IUnknown* create_doc_fragment( xmlNodePtr fragment )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown(create_basic_node( fragment, NULL ));
+    This = impl_from_IXMLDOMNode(create_basic_node( fragment ));
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 0cf6bef..edcc3d6 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -413,7 +413,7 @@ IUnknown* create_element( xmlNodePtr element )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown(create_basic_node( element, NULL ));
+    This = impl_from_IXMLDOMNode(create_basic_node( element ));
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c
index c24af52..7e58ed7 100644
--- a/dlls/msxml3/entityref.c
+++ b/dlls/msxml3/entityref.c
@@ -200,7 +200,7 @@ IUnknown* create_doc_entity_ref( xmlNodePtr entity )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown( create_basic_node( entity, NULL ) );
+    This = impl_from_IXMLDOMNode( create_basic_node( entity ) );
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 0f4b729..6564bfc 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -39,7 +39,7 @@
 extern IUnknown         *create_domdoc( xmlNodePtr document );
 extern IUnknown         *create_xmldoc( void );
 extern IXMLDOMNode      *create_node( xmlNodePtr node );
-extern IUnknown         *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter );
+extern IXMLDOMNode      *create_basic_node( xmlNodePtr node );
 extern IUnknown         *create_element( xmlNodePtr element );
 extern IUnknown         *create_attribute( xmlNodePtr attribute );
 extern IUnknown         *create_text( xmlNodePtr text );
@@ -77,8 +77,6 @@ extern xmlDocPtr parse_xml(char *ptr, int len);
 typedef struct _xmlnode
 {
     const struct IXMLDOMNodeVtbl *lpVtbl;
-    const struct IUnknownVtbl *lpInternalUnkVtbl;
-    IUnknown *pUnkOuter;
     LONG ref;
     xmlNodePtr node;
 } xmlnode;
@@ -88,11 +86,6 @@ static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
     return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
 }
 
-static inline xmlnode *impl_from_NodeInternalUnknown( IUnknown *iface )
-{
-    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpInternalUnkVtbl));
-}
-
 extern void init_basic_node( xmlnode * dest, xmlNodePtr node );
 extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document);
 
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 8b3c1e8..7d198fd 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -77,11 +77,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;
@@ -116,23 +111,47 @@ 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);
+    TRACE("%p %s %p\n", iface, debugstr_guid(riid), ppvObject);
+
+    if ( IsEqualGUID( riid, &IID_IDispatch ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
+         IsEqualGUID( riid, &IID_IUnknown ) )
+        *ppvObject = &This->lpVtbl;
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        *ppvObject = NULL;
+        return E_NOINTERFACE;
+    }
+
+    xmlnode_AddRef( iface );
+
+    return S_OK;
 }
 
 ULONG WINAPI xmlnode_AddRef(
     IXMLDOMNode *iface )
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
-    return IUnknown_AddRef(This->pUnkOuter);
+    return InterlockedIncrement( &This->ref );
 }
 
 ULONG WINAPI xmlnode_Release(
     IXMLDOMNode *iface )
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
-    return IUnknown_Release(This->pUnkOuter);
+    ULONG ref;
+
+    ref = InterlockedDecrement( &This->ref );
+    if ( ref == 0 )
+    {
+        if( This->node )
+	    xmldoc_release( This->node->doc );
+        HeapFree( GetProcessHeap(), 0, This );
+    }
+
+    return ref;
 }
 
 static HRESULT WINAPI xmlnode_GetTypeInfoCount(
@@ -1542,65 +1561,7 @@ static const struct IXMLDOMNodeVtbl xmlnode_vtbl =
     xmlnode_transformNodeToObject,
 };
 
-static HRESULT WINAPI Internal_QueryInterface(
-    IUnknown *iface,
-    REFIID riid,
-    void** ppvObject )
-{
-    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 );
-}
-
-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
-};
-
-IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
+IXMLDOMNode *create_basic_node( xmlNodePtr node )
 {
     xmlnode *This;
 
@@ -1610,10 +1571,7 @@ IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
 
     init_basic_node( This, node );
 
-    if(pUnkOuter)
-        This->pUnkOuter = pUnkOuter; /* Don't take a ref on outer Unknown */
-
-    return (IUnknown*)&This->lpInternalUnkVtbl;
+    return (IXMLDOMNode*)&This->lpVtbl;
 }
 
 void init_basic_node( xmlnode * This, xmlNodePtr node )
@@ -1622,8 +1580,6 @@ void init_basic_node( xmlnode * This, xmlNodePtr node )
         xmldoc_add_ref( node->doc );
 
     This->lpVtbl = &xmlnode_vtbl;
-    This->lpInternalUnkVtbl = &internal_unk_vtbl;
-    This->pUnkOuter = (IUnknown *)&This->lpInternalUnkVtbl;
     This->ref = 1;
     This->node = node;
 }
@@ -1660,7 +1616,7 @@ IXMLDOMNode *create_node( xmlNodePtr node )
         break;
     default:
         FIXME("only creating basic node for type %d\n", node->type);
-        pUnk = create_basic_node( node, NULL );
+        pUnk = (IUnknown*)create_basic_node( node );
     }
 
     hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index 8fcae2d..8dacca3 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -270,7 +270,7 @@ IUnknown* create_pi( xmlNodePtr pi )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown(create_basic_node( pi, NULL ));
+    This = impl_from_IXMLDOMNode(create_basic_node( pi ));
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 847564d..506f2aa 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -439,7 +439,7 @@ IUnknown* create_text( xmlNodePtr text )
 {
     xmlnode *This;
 
-    This = impl_from_NodeInternalUnknown( create_basic_node( text, NULL ) );
+    This = impl_from_IXMLDOMNode( create_basic_node( text ) );
     if ( !This )
         return NULL;
 
-- 
1.5.6.5


["0015-msxml3-Derive-domcdata-from-domtext-to-avoid-code-d.diff" (0015-msxml3-Derive-domcdata-from-domtext-to-avoid-code-d.diff)]

> Fromf0bdd161ccaa0ff6c71c853368d1721a6f0e4c3c Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Fri, 31 Oct 2008 00:25:41 +0100
Subject: [PATCH] msxml3: Derive domcdata from domtext to avoid code duplication

---
 dlls/msxml3/cdata.c         |  248 ++-----------------------------------------
 dlls/msxml3/msxml_private.h |   12 ++
 dlls/msxml3/text.c          |   18 ++--
 3 files changed, 31 insertions(+), 247 deletions(-)

diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index e63db10..420ca03 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -151,234 +151,6 @@ static HRESULT WINAPI domcdata_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domcdata_get_data(
-    IXMLDOMCDATASection *iface,
-    BSTR *p)
-{
-    HRESULT hr = E_FAIL;
-    VARIANT vRet;
-
-    if(!p)
-        return E_INVALIDARG;
-
-    hr = IXMLDOMNode_get_nodeValue( upcast( iface ), &vRet );
-    if(hr == S_OK)
-    {
-        *p = V_BSTR(&vRet);
-    }
-
-    return hr;
-}
-
-static HRESULT WINAPI domcdata_put_data(
-    IXMLDOMCDATASection *iface,
-    BSTR data)
-{
-    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
-    HRESULT hr = E_FAIL;
-    VARIANT val;
-
-    TRACE("%p %s\n", This, debugstr_w(data) );
-
-    V_VT(&val) = VT_BSTR;
-    V_BSTR(&val) = data;
-
-    hr = IXMLDOMNode_put_nodeValue( upcast( iface ), val );
-
-    return hr;
-}
-
-static HRESULT WINAPI domcdata_get_length(
-    IXMLDOMCDATASection *iface,
-    long *len)
-{
-    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlChar *pContent;
-    long nLength = 0;
-
-    TRACE("%p\n", iface);
-
-    if(!len)
-        return E_INVALIDARG;
-
-    pContent = xmlNodeGetContent(This->node);
-    if(pContent)
-    {
-        nLength = xmlStrlen(pContent);
-        xmlFree(pContent);
-    }
-
-    *len = nLength;
-
-    return S_OK;
-}
-
-static HRESULT WINAPI domcdata_substringData(
-    IXMLDOMCDATASection *iface,
-    long offset, long count, BSTR *p)
-{
-    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlChar *pContent;
-    long nLength = 0;
-    HRESULT hr = S_FALSE;
-
-    TRACE("%p\n", iface);
-
-    if(!p)
-        return E_INVALIDARG;
-
-    *p = NULL;
-    if(offset < 0 || count < 0)
-        return E_INVALIDARG;
-
-    if(count == 0)
-        return hr;
-
-    pContent = xmlNodeGetContent(This->node);
-    if(pContent)
-    {
-        nLength = xmlStrlen(pContent);
-
-        if( offset < nLength)
-        {
-            BSTR sContent = bstr_from_xmlChar(pContent);
-            if(offset + count > nLength)
-                *p = SysAllocString(&sContent[offset]);
-            else
-                *p = SysAllocStringLen(&sContent[offset], count);
-
-            SysFreeString(sContent);
-            hr = S_OK;
-        }
-
-        xmlFree(pContent);
-    }
-
-    return hr;
-}
-
-static HRESULT WINAPI domcdata_appendData(
-    IXMLDOMCDATASection *iface,
-    BSTR p)
-{
-    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlChar *pContent;
-    HRESULT hr = S_FALSE;
-
-    TRACE("%p\n", iface);
-
-    /* Nothing to do if NULL or an Empty string passed in. */
-    if(p == NULL || SysStringLen(p) == 0)
-        return S_OK;
-
-    pContent = xmlChar_from_wchar( (WCHAR*)p );
-    if(pContent)
-    {
-        if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
-            hr = S_OK;
-        else
-            hr = E_FAIL;
-    }
-    else
-        hr = E_FAIL;
-    HeapFree(GetProcessHeap(), 0, pContent);
-
-    return hr;
-}
-
-static HRESULT WINAPI domcdata_insertData(
-    IXMLDOMCDATASection *iface,
-    long offset, BSTR p)
-{
-    xmlnode *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlChar *pXmlContent;
-    BSTR sNewString;
-    HRESULT hr = S_FALSE;
-    long nLength = 0, nLengthP = 0;
-    xmlChar *str = NULL;
-
-    TRACE("%p\n", This);
-
-    /* If have a NULL or empty string, don't do anything. */
-    if(SysStringLen(p) == 0)
-        return S_OK;
-
-    if(offset < 0)
-    {
-        return E_INVALIDARG;
-    }
-
-    pXmlContent = xmlNodeGetContent(This->node);
-    if(pXmlContent)
-    {
-        BSTR sContent = bstr_from_xmlChar( pXmlContent );
-        nLength = SysStringLen(sContent);
-        nLengthP = SysStringLen(p);
-
-        if(nLength < offset)
-        {
-            SysFreeString(sContent);
-            xmlFree(pXmlContent);
-
-            return E_INVALIDARG;
-        }
-
-        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
-        if(sNewString)
-        {
-            if(offset > 0)
-                memcpy(sNewString, sContent, offset * sizeof(WCHAR));
-
-            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
-
-            if(offset+nLengthP < nLength)
-                memcpy(&sNewString[offset+nLengthP], &sContent[offset], \
                (nLength-offset) * sizeof(WCHAR));
-
-            sNewString[nLengthP + nLength] = 0;
-
-            str = xmlChar_from_wchar((WCHAR*)sNewString);
-            if(str)
-            {
-                xmlNodeSetContent(This->node, str);
-                hr = S_OK;
-            }
-            HeapFree(GetProcessHeap(), 0, str);
-
-            SysFreeString(sNewString);
-        }
-
-        SysFreeString(sContent);
-
-        xmlFree(pXmlContent);
-    }
-
-    return hr;
-}
-
-static HRESULT WINAPI domcdata_deleteData(
-    IXMLDOMCDATASection *iface,
-    long offset, long count)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI domcdata_replaceData(
-    IXMLDOMCDATASection *iface,
-    long offset, long count, BSTR p)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI domcdata_splitText(
-    IXMLDOMCDATASection *iface,
-    long offset, IXMLDOMText **txtNode)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
 
 static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
 {
@@ -425,22 +197,22 @@ static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
     xmlnode_get_prefix,
     xmlnode_get_baseName,
     xmlnode_transformNodeToObject,
-    domcdata_get_data,
-    domcdata_put_data,
-    domcdata_get_length,
-    domcdata_substringData,
-    domcdata_appendData,
-    domcdata_insertData,
-    domcdata_deleteData,
-    domcdata_replaceData,
-    domcdata_splitText
+    domtext_get_data,
+    domtext_put_data,
+    domtext_get_length,
+    domtext_substringData,
+    domtext_appendData,
+    domtext_insertData,
+    domtext_deleteData,
+    domtext_replaceData,
+    domtext_splitText
 };
 
 IUnknown* create_cdata( xmlNodePtr text )
 {
     xmlnode *This;
 
-    This = impl_from_IXMLDOMNode( create_basic_node( text ) );
+    This = impl_from_IXMLDOMNode( (IXMLDOMNode*)create_text( text ) );
     if ( !This )
         return NULL;
 
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 6564bfc..0046af2 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -130,6 +130,18 @@ extern HRESULT WINAPI xmlnode_get_prefix(IXMLDOMNode *iface, \
BSTR* prefixString)  extern HRESULT WINAPI xmlnode_get_baseName(IXMLDOMNode *iface, \
BSTR* nameString);  extern HRESULT WINAPI xmlnode_transformNodeToObject( IXMLDOMNode \
*iface,IXMLDOMNode* stylesheet, VARIANT outputObject);  
+/* IXMLDOMText functions (used for inheritance) */
+extern HRESULT WINAPI domtext_get_data(IXMLDOMText *iface, BSTR *p);
+extern HRESULT WINAPI domtext_put_data(IXMLDOMText *iface, BSTR data);
+extern HRESULT WINAPI domtext_get_length(IXMLDOMText *iface, long *len);
+extern HRESULT WINAPI domtext_substringData(IXMLDOMText *iface, long offset, long \
count, BSTR *p); +extern HRESULT WINAPI domtext_appendData(IXMLDOMText *iface, BSTR \
p); +extern HRESULT WINAPI domtext_insertData(IXMLDOMText *iface, long offset, BSTR \
p); +extern HRESULT WINAPI domtext_deleteData(IXMLDOMText *iface, long offset, long \
count); +extern HRESULT WINAPI domtext_replaceData(IXMLDOMText *iface, long offset, \
long count, BSTR p); +extern HRESULT WINAPI domtext_splitText(IXMLDOMText *iface, \
long offset, IXMLDOMText **txtNode); +
+
 #endif
 
 extern IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR \
                srcText,
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 506f2aa..e047304 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -147,7 +147,7 @@ static HRESULT WINAPI domtext_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domtext_get_data(
+HRESULT WINAPI domtext_get_data(
     IXMLDOMText *iface,
     BSTR *p)
 {
@@ -169,7 +169,7 @@ static HRESULT WINAPI domtext_get_data(
     return hr;
 }
 
-static HRESULT WINAPI domtext_put_data(
+HRESULT WINAPI domtext_put_data(
     IXMLDOMText *iface,
     BSTR data)
 {
@@ -187,7 +187,7 @@ static HRESULT WINAPI domtext_put_data(
     return hr;
 }
 
-static HRESULT WINAPI domtext_get_length(
+HRESULT WINAPI domtext_get_length(
     IXMLDOMText *iface,
     long *len)
 {
@@ -212,7 +212,7 @@ static HRESULT WINAPI domtext_get_length(
     return S_OK;
 }
 
-static HRESULT WINAPI domtext_substringData(
+HRESULT WINAPI domtext_substringData(
     IXMLDOMText *iface,
     long offset, long count, BSTR *p)
 {
@@ -256,7 +256,7 @@ static HRESULT WINAPI domtext_substringData(
     return hr;
 }
 
-static HRESULT WINAPI domtext_appendData(
+HRESULT WINAPI domtext_appendData(
     IXMLDOMText *iface,
     BSTR p)
 {
@@ -285,7 +285,7 @@ static HRESULT WINAPI domtext_appendData(
     return hr;
 }
 
-static HRESULT WINAPI domtext_insertData(
+HRESULT WINAPI domtext_insertData(
     IXMLDOMText *iface,
     long offset, BSTR p)
 {
@@ -354,7 +354,7 @@ static HRESULT WINAPI domtext_insertData(
     return hr;
 }
 
-static HRESULT WINAPI domtext_deleteData(
+HRESULT WINAPI domtext_deleteData(
     IXMLDOMText *iface,
     long offset, long count)
 {
@@ -362,7 +362,7 @@ static HRESULT WINAPI domtext_deleteData(
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI domtext_replaceData(
+HRESULT WINAPI domtext_replaceData(
     IXMLDOMText *iface,
     long offset, long count, BSTR p)
 {
@@ -370,7 +370,7 @@ static HRESULT WINAPI domtext_replaceData(
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI domtext_splitText(
+HRESULT WINAPI domtext_splitText(
     IXMLDOMText *iface,
     long offset, IXMLDOMText **txtNode)
 {
-- 
1.5.6.5


["0016-msxml3-domcdata-should-implement-IXMLDOMText.diff" (0016-msxml3-domcdata-should-implement-IXMLDOMText.diff)]

> Fromc018e06765af3feabf08ed8caa82584ca2a298dd Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Fri, 31 Oct 2008 00:28:28 +0100
Subject: [PATCH] msxml3: domcdata should implement IXMLDOMText

---
 dlls/msxml3/cdata.c        |    3 ++-
 dlls/msxml3/tests/domdoc.c |    5 +++++
 2 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 420ca03..4042162 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -56,7 +56,8 @@ static HRESULT WINAPI domcdata_QueryInterface(
     TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMCDATASection ) ||
-         IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
+         IsEqualGUID( riid, &IID_IXMLDOMText ) ||
+         IsEqualGUID( riid, &IID_IXMLDOMCharacterData ) ||
          IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
          IsEqualGUID( riid, &IID_IDispatch ) ||
          IsEqualGUID( riid, &IID_IUnknown ) )
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index e27c506..900d82d 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -2481,6 +2481,7 @@ static void test_xmlTypes(void)
     IXMLDOMImplementation *pIXMLDOMImplementation = NULL;
     IXMLDOMDocumentFragment *pDocFrag = NULL;
     IXMLDOMEntityReference *pEntityRef = NULL;
+    IXMLDOMText *pText;
     BSTR str;
     IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1;   /* Used for testing Siblings */
     VARIANT v;
@@ -2910,6 +2911,10 @@ static void test_xmlTypes(void)
                 hr = IXMLDOMCDATASection_QueryInterface(pCDataSec, \
&IID_IXMLDOMElement, (LPVOID*)&pElement);  ok(hr == E_NOINTERFACE, "ret %08x\n", hr);
 
+                hr = IXMLDOMCDATASection_QueryInterface(pCDataSec, &IID_IXMLDOMText, \
(LPVOID*)&pText); +                ok(hr == S_OK, "ret %08x\n", hr);
+                if(pText) IXMLDOMText_Release(pText);
+
                 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pCDataSec, \
NULL);  ok(hr == S_OK, "ret %08x\n", hr );
 
-- 
1.5.6.5


["0017-msxml3-factor-out-implementation-of-IXMLDOMCharacte.diff" (0017-msxml3-factor-out-implementation-of-IXMLDOMCharacte.diff)]

> Fromf9a14fa9dcb83f725a1c559bac15be3ca11eb4dc Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Fri, 31 Oct 2008 00:37:34 +0100
Subject: [PATCH] msxml3: factor out implementation of IXMLDOMCharacterData

---
 dlls/msxml3/Makefile.in     |    1 +
 dlls/msxml3/cdata.c         |   16 ++--
 dlls/msxml3/gencdata.c      |  270 +++++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/msxml_private.h |   18 ++--
 dlls/msxml3/text.c          |  239 ++------------------------------------
 5 files changed, 297 insertions(+), 247 deletions(-)
 create mode 100644 dlls/msxml3/gencdata.c

diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in
index c4293dd..abf9efa 100644
--- a/dlls/msxml3/Makefile.in
+++ b/dlls/msxml3/Makefile.in
@@ -20,6 +20,7 @@ C_SRCS = \
 	element.c \
 	entityref.c \
 	factory.c \
+	gencdata.c \
 	httprequest.c \
 	main.c \
 	node.c \
diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 4042162..21c696b 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -198,14 +198,14 @@ static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
     xmlnode_get_prefix,
     xmlnode_get_baseName,
     xmlnode_transformNodeToObject,
-    domtext_get_data,
-    domtext_put_data,
-    domtext_get_length,
-    domtext_substringData,
-    domtext_appendData,
-    domtext_insertData,
-    domtext_deleteData,
-    domtext_replaceData,
+    gencdata_get_data,
+    gencdata_put_data,
+    gencdata_get_length,
+    gencdata_substringData,
+    gencdata_appendData,
+    gencdata_insertData,
+    gencdata_deleteData,
+    gencdata_replaceData,
     domtext_splitText
 };
 
diff --git a/dlls/msxml3/gencdata.c b/dlls/msxml3/gencdata.c
new file mode 100644
index 0000000..0f554b8
--- /dev/null
+++ b/dlls/msxml3/gencdata.c
@@ -0,0 +1,270 @@
+/*
+ *    DOM character data (base class) implementation
+ *
+ * Copyright 2006 Huw Davies
+ * Copyright 2007-2008 Alistair Leslie-Hughes
+ * Copyright 2008 Michael Karcher
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+
+#include "config.h"
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "msxml2.h"
+
+#include "msxml_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msxml);
+
+#ifdef HAVE_LIBXML2
+
+static inline xmlnode *impl_from_IXMLDOMCharacterData( IXMLDOMCharacterData *iface )
+{
+    return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
+}
+
+HRESULT WINAPI gencdata_get_data(
+    IXMLDOMCharacterData *iface,
+    BSTR *p)
+{
+    xmlnode *This = impl_from_IXMLDOMCharacterData( iface );
+    HRESULT hr = E_FAIL;
+    VARIANT vRet;
+
+    TRACE("%p %p\n", This, p );
+
+    if(!p)
+        return E_INVALIDARG;
+
+    hr = IXMLDOMNode_get_nodeValue( (IXMLDOMNode*)iface, &vRet );
+    if(hr == S_OK)
+    {
+        *p = V_BSTR(&vRet);
+    }
+
+    return hr;
+}
+
+HRESULT WINAPI gencdata_put_data(
+    IXMLDOMCharacterData *iface,
+    BSTR data)
+{
+    xmlnode *This = impl_from_IXMLDOMCharacterData( iface );
+    HRESULT hr = E_FAIL;
+    VARIANT val;
+
+    TRACE("%p %s\n", This, debugstr_w(data) );
+
+    V_VT(&val) = VT_BSTR;
+    V_BSTR(&val) = data;
+
+    hr = IXMLDOMNode_put_nodeValue( (IXMLDOMNode*)iface, val );
+
+    return hr;
+}
+
+HRESULT WINAPI gencdata_get_length(
+    IXMLDOMCharacterData *iface,
+    long *len)
+{
+    xmlnode *This = impl_from_IXMLDOMCharacterData( iface );
+    xmlChar *pContent;
+    long nLength = 0;
+
+    TRACE("%p\n", iface);
+
+    if(!len)
+        return E_INVALIDARG;
+
+    pContent = xmlNodeGetContent(This->node);
+    if(pContent)
+    {
+        nLength = xmlStrlen(pContent);
+        xmlFree(pContent);
+    }
+
+    *len = nLength;
+
+    return S_OK;
+}
+
+HRESULT WINAPI gencdata_substringData(
+    IXMLDOMCharacterData *iface,
+    long offset, long count, BSTR *p)
+{
+    xmlnode *This = impl_from_IXMLDOMCharacterData( iface );
+    xmlChar *pContent;
+    long nLength = 0;
+    HRESULT hr = S_FALSE;
+
+    TRACE("%p\n", iface);
+
+    if(!p)
+        return E_INVALIDARG;
+
+    *p = NULL;
+    if(offset < 0 || count < 0)
+        return E_INVALIDARG;
+
+    if(count == 0)
+        return hr;
+
+    pContent = xmlNodeGetContent(This->node);
+    if(pContent)
+    {
+        nLength = xmlStrlen(pContent);
+
+        if( offset < nLength)
+        {
+            BSTR sContent = bstr_from_xmlChar(pContent);
+            if(offset + count > nLength)
+                *p = SysAllocString(&sContent[offset]);
+            else
+                *p = SysAllocStringLen(&sContent[offset], count);
+
+            SysFreeString(sContent);
+            hr = S_OK;
+        }
+
+        xmlFree(pContent);
+    }
+
+    return hr;
+}
+
+HRESULT WINAPI gencdata_appendData(
+    IXMLDOMCharacterData *iface,
+    BSTR p)
+{
+    xmlnode *This = impl_from_IXMLDOMCharacterData( iface );
+    xmlChar *pContent;
+    HRESULT hr = S_FALSE;
+
+    TRACE("%p\n", iface);
+
+    /* Nothing to do if NULL or an Empty string passed in. */
+    if(p == NULL || SysStringLen(p) == 0)
+        return S_OK;
+
+    pContent = xmlChar_from_wchar( (WCHAR*)p );
+    if(pContent)
+    {
+        if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
+            hr = S_OK;
+        else
+            hr = E_FAIL;
+        HeapFree( GetProcessHeap(), 0, pContent );
+    }
+    else
+        hr = E_FAIL;
+
+    return hr;
+}
+
+HRESULT WINAPI gencdata_insertData(
+    IXMLDOMCharacterData *iface,
+    long offset, BSTR p)
+{
+    xmlnode *This = impl_from_IXMLDOMCharacterData( iface );
+    xmlChar *pXmlContent;
+    BSTR sNewString;
+    HRESULT hr = S_FALSE;
+    long nLength = 0, nLengthP = 0;
+    xmlChar *str = NULL;
+
+    TRACE("%p\n", This);
+
+    /* If have a NULL or empty string, don't do anything. */
+    if(SysStringLen(p) == 0)
+        return S_OK;
+
+    if(offset < 0)
+    {
+        return E_INVALIDARG;
+    }
+
+    pXmlContent = xmlNodeGetContent(This->node);
+    if(pXmlContent)
+    {
+        BSTR sContent = bstr_from_xmlChar( pXmlContent );
+        nLength = SysStringLen(sContent);
+        nLengthP = SysStringLen(p);
+
+        if(nLength < offset)
+        {
+            SysFreeString(sContent);
+            xmlFree(pXmlContent);
+
+            return E_INVALIDARG;
+        }
+
+        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
+        if(sNewString)
+        {
+            if(offset > 0)
+                memcpy(sNewString, sContent, offset * sizeof(WCHAR));
+
+            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
+
+            if(offset+nLengthP < nLength)
+                memcpy(&sNewString[offset+nLengthP], &sContent[offset], \
(nLength-offset) * sizeof(WCHAR)); +
+            sNewString[nLengthP + nLength] = 0;
+
+            str = xmlChar_from_wchar((WCHAR*)sNewString);
+            if(str)
+            {
+                xmlNodeSetContent(This->node, str);
+                hr = S_OK;
+            }
+            HeapFree(GetProcessHeap(), 0, str);
+
+            SysFreeString(sNewString);
+        }
+
+        SysFreeString(sContent);
+
+        xmlFree(pXmlContent);
+    }
+
+    return hr;
+}
+
+HRESULT WINAPI gencdata_deleteData(
+    IXMLDOMCharacterData *iface,
+    long offset, long count)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+HRESULT WINAPI gencdata_replaceData(
+    IXMLDOMCharacterData *iface,
+    long offset, long count, BSTR p)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+#endif
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 0046af2..307f5d4 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -130,15 +130,17 @@ extern HRESULT WINAPI xmlnode_get_prefix(IXMLDOMNode *iface, \
BSTR* prefixString)  extern HRESULT WINAPI xmlnode_get_baseName(IXMLDOMNode *iface, \
BSTR* nameString);  extern HRESULT WINAPI xmlnode_transformNodeToObject( IXMLDOMNode \
*iface,IXMLDOMNode* stylesheet, VARIANT outputObject);  
+/* IXMLDOMCharacterData functions (used for inheritance) */
+extern HRESULT WINAPI gencdata_get_data(IXMLDOMCharacterData *iface, BSTR *p);
+extern HRESULT WINAPI gencdata_put_data(IXMLDOMCharacterData *iface, BSTR data);
+extern HRESULT WINAPI gencdata_get_length(IXMLDOMCharacterData *iface, long *len);
+extern HRESULT WINAPI gencdata_substringData(IXMLDOMCharacterData *iface, long \
offset, long count, BSTR *p); +extern HRESULT WINAPI \
gencdata_appendData(IXMLDOMCharacterData *iface, BSTR p); +extern HRESULT WINAPI \
gencdata_insertData(IXMLDOMCharacterData *iface, long offset, BSTR p); +extern \
HRESULT WINAPI gencdata_deleteData(IXMLDOMCharacterData *iface, long offset, long \
count); +extern HRESULT WINAPI gencdata_replaceData(IXMLDOMCharacterData *iface, long \
offset, long count, BSTR p); +
 /* IXMLDOMText functions (used for inheritance) */
-extern HRESULT WINAPI domtext_get_data(IXMLDOMText *iface, BSTR *p);
-extern HRESULT WINAPI domtext_put_data(IXMLDOMText *iface, BSTR data);
-extern HRESULT WINAPI domtext_get_length(IXMLDOMText *iface, long *len);
-extern HRESULT WINAPI domtext_substringData(IXMLDOMText *iface, long offset, long \
                count, BSTR *p);
-extern HRESULT WINAPI domtext_appendData(IXMLDOMText *iface, BSTR p);
-extern HRESULT WINAPI domtext_insertData(IXMLDOMText *iface, long offset, BSTR p);
-extern HRESULT WINAPI domtext_deleteData(IXMLDOMText *iface, long offset, long \
                count);
-extern HRESULT WINAPI domtext_replaceData(IXMLDOMText *iface, long offset, long \
count, BSTR p);  extern HRESULT WINAPI domtext_splitText(IXMLDOMText *iface, long \
offset, IXMLDOMText **txtNode);  
 
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index e047304..e6efe6c 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -147,229 +147,6 @@ static HRESULT WINAPI domtext_Invoke(
     return hr;
 }
 
-HRESULT WINAPI domtext_get_data(
-    IXMLDOMText *iface,
-    BSTR *p)
-{
-    xmlnode *This = impl_from_IXMLDOMText( iface );
-    HRESULT hr = E_FAIL;
-    VARIANT vRet;
-
-    TRACE("%p %p\n", This, p );
-
-    if(!p)
-        return E_INVALIDARG;
-
-    hr = IXMLDOMNode_get_nodeValue( (IXMLDOMNode*)iface, &vRet );
-    if(hr == S_OK)
-    {
-        *p = V_BSTR(&vRet);
-    }
-
-    return hr;
-}
-
-HRESULT WINAPI domtext_put_data(
-    IXMLDOMText *iface,
-    BSTR data)
-{
-    xmlnode *This = impl_from_IXMLDOMText( iface );
-    HRESULT hr = E_FAIL;
-    VARIANT val;
-
-    TRACE("%p %s\n", This, debugstr_w(data) );
-
-    V_VT(&val) = VT_BSTR;
-    V_BSTR(&val) = data;
-
-    hr = IXMLDOMNode_put_nodeValue( (IXMLDOMNode*)iface, val );
-
-    return hr;
-}
-
-HRESULT WINAPI domtext_get_length(
-    IXMLDOMText *iface,
-    long *len)
-{
-    xmlnode *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pContent;
-    long nLength = 0;
-
-    TRACE("%p\n", iface);
-
-    if(!len)
-        return E_INVALIDARG;
-
-    pContent = xmlNodeGetContent(This->node);
-    if(pContent)
-    {
-        nLength = xmlStrlen(pContent);
-        xmlFree(pContent);
-    }
-
-    *len = nLength;
-
-    return S_OK;
-}
-
-HRESULT WINAPI domtext_substringData(
-    IXMLDOMText *iface,
-    long offset, long count, BSTR *p)
-{
-    xmlnode *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pContent;
-    long nLength = 0;
-    HRESULT hr = S_FALSE;
-
-    TRACE("%p\n", iface);
-
-    if(!p)
-        return E_INVALIDARG;
-
-    *p = NULL;
-    if(offset < 0 || count < 0)
-        return E_INVALIDARG;
-
-    if(count == 0)
-        return hr;
-
-    pContent = xmlNodeGetContent(This->node);
-    if(pContent)
-    {
-        nLength = xmlStrlen(pContent);
-
-        if( offset < nLength)
-        {
-            BSTR sContent = bstr_from_xmlChar(pContent);
-            if(offset + count > nLength)
-                *p = SysAllocString(&sContent[offset]);
-            else
-                *p = SysAllocStringLen(&sContent[offset], count);
-
-            SysFreeString(sContent);
-            hr = S_OK;
-        }
-
-        xmlFree(pContent);
-    }
-
-    return hr;
-}
-
-HRESULT WINAPI domtext_appendData(
-    IXMLDOMText *iface,
-    BSTR p)
-{
-    xmlnode *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pContent;
-    HRESULT hr = S_FALSE;
-
-    TRACE("%p\n", iface);
-
-    /* Nothing to do if NULL or an Empty string passed in. */
-    if(p == NULL || SysStringLen(p) == 0)
-        return S_OK;
-
-    pContent = xmlChar_from_wchar( (WCHAR*)p );
-    if(pContent)
-    {
-        if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
-            hr = S_OK;
-        else
-            hr = E_FAIL;
-        HeapFree( GetProcessHeap(), 0, pContent );
-    }
-    else
-        hr = E_FAIL;
-
-    return hr;
-}
-
-HRESULT WINAPI domtext_insertData(
-    IXMLDOMText *iface,
-    long offset, BSTR p)
-{
-    xmlnode *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pXmlContent;
-    BSTR sNewString;
-    HRESULT hr = S_FALSE;
-    long nLength = 0, nLengthP = 0;
-    xmlChar *str = NULL;
-
-    TRACE("%p\n", This);
-
-    /* If have a NULL or empty string, don't do anything. */
-    if(SysStringLen(p) == 0)
-        return S_OK;
-
-    if(offset < 0)
-    {
-        return E_INVALIDARG;
-    }
-
-    pXmlContent = xmlNodeGetContent(This->node);
-    if(pXmlContent)
-    {
-        BSTR sContent = bstr_from_xmlChar( pXmlContent );
-        nLength = SysStringLen(sContent);
-        nLengthP = SysStringLen(p);
-
-        if(nLength < offset)
-        {
-            SysFreeString(sContent);
-            xmlFree(pXmlContent);
-
-            return E_INVALIDARG;
-        }
-
-        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
-        if(sNewString)
-        {
-            if(offset > 0)
-                memcpy(sNewString, sContent, offset * sizeof(WCHAR));
-
-            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
-
-            if(offset+nLengthP < nLength)
-                memcpy(&sNewString[offset+nLengthP], &sContent[offset], \
                (nLength-offset) * sizeof(WCHAR));
-
-            sNewString[nLengthP + nLength] = 0;
-
-            str = xmlChar_from_wchar((WCHAR*)sNewString);
-            if(str)
-            {
-                xmlNodeSetContent(This->node, str);
-                hr = S_OK;
-            }
-            HeapFree(GetProcessHeap(), 0, str);
-
-            SysFreeString(sNewString);
-        }
-
-        SysFreeString(sContent);
-
-        xmlFree(pXmlContent);
-    }
-
-    return hr;
-}
-
-HRESULT WINAPI domtext_deleteData(
-    IXMLDOMText *iface,
-    long offset, long count)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-HRESULT WINAPI domtext_replaceData(
-    IXMLDOMText *iface,
-    long offset, long count, BSTR p)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
 HRESULT WINAPI domtext_splitText(
     IXMLDOMText *iface,
     long offset, IXMLDOMText **txtNode)
@@ -424,14 +201,14 @@ static const struct IXMLDOMTextVtbl domtext_vtbl =
     xmlnode_get_prefix,
     xmlnode_get_baseName,
     xmlnode_transformNodeToObject,
-    domtext_get_data,
-    domtext_put_data,
-    domtext_get_length,
-    domtext_substringData,
-    domtext_appendData,
-    domtext_insertData,
-    domtext_deleteData,
-    domtext_replaceData,
+    gencdata_get_data,
+    gencdata_put_data,
+    gencdata_get_length,
+    gencdata_substringData,
+    gencdata_appendData,
+    gencdata_insertData,
+    gencdata_deleteData,
+    gencdata_replaceData,
     domtext_splitText
 };
 
-- 
1.5.6.5


["0018-msxml3-Make-comment-use-the-generic-cdata-functions.diff" (0018-msxml3-Make-comment-use-the-generic-cdata-functions.diff)]

> Frome7725214382ee75bf8b849c2e7954c7be0ccd0c5 Mon Sep 17 00:00:00 2001
From: Michael Karcher <wine@mkarcher.dialup.fu-berlin.de>
Date: Fri, 31 Oct 2008 00:41:41 +0100
Subject: [PATCH] msxml3: Make comment use the generic cdata functions.

A work-around for an libxml2 bug for comment nodes thus has to be
put into the generic functions. It does not incur any performance
penalties in the usual (success) case.
---
 dlls/msxml3/comment.c  |  249 ++----------------------------------------------
 dlls/msxml3/gencdata.c |   16 +++-
 2 files changed, 23 insertions(+), 242 deletions(-)

diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 55526c8..a1a0def 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -146,239 +146,6 @@ static HRESULT WINAPI domcomment_Invoke(
     return hr;
 }
 
-static HRESULT WINAPI domcomment_get_data(
-    IXMLDOMComment *iface,
-    BSTR *p)
-{
-    HRESULT hr = E_FAIL;
-    VARIANT vRet;
-
-    if(!p)
-        return E_INVALIDARG;
-
-    hr = IXMLDOMComment_get_nodeValue( iface, &vRet );
-    if(hr == S_OK)
-    {
-        *p = V_BSTR(&vRet);
-    }
-
-    return hr;
-}
-
-static HRESULT WINAPI domcomment_put_data(
-    IXMLDOMComment *iface,
-    BSTR data)
-{
-    HRESULT hr = E_FAIL;
-    VARIANT val;
-
-    TRACE("%p %s\n", iface, debugstr_w(data) );
-
-    V_VT(&val) = VT_BSTR;
-    V_BSTR(&val) = data;
-
-    hr = IXMLDOMComment_put_nodeValue( iface, val );
-
-    return hr;
-}
-
-static HRESULT WINAPI domcomment_get_length(
-    IXMLDOMComment *iface,
-    long *len)
-{
-    xmlnode *This = impl_from_IXMLDOMComment( iface );
-    xmlChar *pContent;
-    long nLength = 0;
-
-    TRACE("%p\n", iface);
-
-    if(!len)
-        return E_INVALIDARG;
-
-    pContent = xmlNodeGetContent(This->node);
-    if(pContent)
-    {
-        nLength = xmlStrlen(pContent);
-        xmlFree(pContent);
-    }
-
-    *len = nLength;
-
-    return S_OK;
-}
-
-static HRESULT WINAPI domcomment_substringData(
-    IXMLDOMComment *iface,
-    long offset, long count, BSTR *p)
-{
-    xmlnode *This = impl_from_IXMLDOMComment( iface );
-    xmlChar *pContent;
-    long nLength = 0;
-    HRESULT hr = S_FALSE;
-
-    TRACE("%p\n", iface);
-
-    if(!p)
-        return E_INVALIDARG;
-
-    *p = NULL;
-    if(offset < 0 || count < 0)
-        return E_INVALIDARG;
-
-    if(count == 0)
-        return hr;
-
-    pContent = xmlNodeGetContent(This->node);
-    if(pContent)
-    {
-        nLength = xmlStrlen(pContent);
-
-        if( offset < nLength)
-        {
-            BSTR sContent = bstr_from_xmlChar(pContent);
-            if(offset + count > nLength)
-                *p = SysAllocString(&sContent[offset]);
-            else
-                *p = SysAllocStringLen(&sContent[offset], count);
-
-            SysFreeString(sContent);
-            hr = S_OK;
-        }
-
-        xmlFree(pContent);
-    }
-
-    return hr;
-}
-
-static HRESULT WINAPI domcomment_appendData(
-    IXMLDOMComment *iface,
-    BSTR p)
-{
-    xmlnode *This = impl_from_IXMLDOMComment( iface );
-    xmlChar *pContent;
-    HRESULT hr = S_FALSE;
-
-    TRACE("%p\n", iface);
-
-    /* Nothing to do if NULL or an Empty string passed in. */
-    if(p == NULL || SysStringLen(p) == 0)
-        return S_OK;
-
-    pContent = xmlChar_from_wchar( (WCHAR*)p );
-    if(pContent)
-    {
-        /* Older versions of libxml < 2.6.27 didn't correctly support
-           xmlTextConcat on Comment nodes. Fallback to setting the
-           contents directly if xmlTextConcat fails.
-         */
-        if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
-            hr = S_OK;
-        else
-        {
-            xmlChar *pNew;
-            pNew = xmlStrcat(xmlNodeGetContent(This->node), pContent);
-            if(pNew)
-            {
-                xmlNodeSetContent(This->node, pNew);
-                hr = S_OK;
-            }
-            else
-                hr = E_FAIL;
-        }
-        HeapFree( GetProcessHeap(), 0, pContent );
-    }
-    else
-        hr = E_FAIL;
-
-    return hr;
-}
-
-static HRESULT WINAPI domcomment_insertData(
-    IXMLDOMComment *iface,
-    long offset, BSTR p)
-{
-    xmlnode *pDOMNode = impl_from_IXMLDOMComment( iface );
-    xmlChar *pXmlContent;
-    BSTR sNewString;
-    HRESULT hr = S_FALSE;
-    long nLength = 0, nLengthP = 0;
-    xmlChar *str = NULL;
-
-    TRACE("%p\n", iface);
-
-    /* If have a NULL or empty string, don't do anything. */
-    if(SysStringLen(p) == 0)
-        return S_OK;
-
-    if(offset < 0)
-    {
-        return E_INVALIDARG;
-    }
-
-    pXmlContent = xmlNodeGetContent(pDOMNode->node);
-    if(pXmlContent)
-    {
-        BSTR sContent = bstr_from_xmlChar( pXmlContent );
-        nLength = SysStringLen(sContent);
-        nLengthP = SysStringLen(p);
-
-        if(nLength < offset)
-        {
-            SysFreeString(sContent);
-            xmlFree(pXmlContent);
-
-            return E_INVALIDARG;
-        }
-
-        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
-        if(sNewString)
-        {
-            if(offset > 0)
-                memcpy(sNewString, sContent, offset * sizeof(WCHAR));
-
-            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
-
-            if(offset+nLengthP < nLength)
-                memcpy(&sNewString[offset+nLengthP], &sContent[offset], \
                (nLength-offset) * sizeof(WCHAR));
-
-            sNewString[nLengthP + nLength] = 0;
-
-            str = xmlChar_from_wchar((WCHAR*)sNewString);
-            if(str)
-            {
-                xmlNodeSetContent(pDOMNode->node, str);
-                hr = S_OK;
-            }
-            HeapFree( GetProcessHeap(), 0, str );
-
-            SysFreeString(sNewString);
-        }
-
-        SysFreeString(sContent);
-
-        xmlFree(pXmlContent);
-    }
-
-    return hr;
-}
-
-static HRESULT WINAPI domcomment_deleteData(
-    IXMLDOMComment *iface,
-    long offset, long count)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI domcomment_replaceData(
-    IXMLDOMComment *iface,
-    long offset, long count, BSTR p)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
 static const struct IXMLDOMCommentVtbl domcomment_vtbl =
 {
     domcomment_QueryInterface,
@@ -424,14 +191,14 @@ static const struct IXMLDOMCommentVtbl domcomment_vtbl =
     xmlnode_get_prefix,
     xmlnode_get_baseName,
     xmlnode_transformNodeToObject,
-    domcomment_get_data,
-    domcomment_put_data,
-    domcomment_get_length,
-    domcomment_substringData,
-    domcomment_appendData,
-    domcomment_insertData,
-    domcomment_deleteData,
-    domcomment_replaceData
+    gencdata_get_data,
+    gencdata_put_data,
+    gencdata_get_length,
+    gencdata_substringData,
+    gencdata_appendData,
+    gencdata_insertData,
+    gencdata_deleteData,
+    gencdata_replaceData
 };
 
 IUnknown* create_comment( xmlNodePtr comment )
diff --git a/dlls/msxml3/gencdata.c b/dlls/msxml3/gencdata.c
index 0f554b8..b86749f 100644
--- a/dlls/msxml3/gencdata.c
+++ b/dlls/msxml3/gencdata.c
@@ -170,10 +170,24 @@ HRESULT WINAPI gencdata_appendData(
     pContent = xmlChar_from_wchar( (WCHAR*)p );
     if(pContent)
     {
+        /* Older versions of libxml < 2.6.27 didn't correctly support
+           xmlTextConcat on all kinds of character data nodes. Fallback
+           to setting the contents directly if xmlTextConcat fails.
+         */
         if(xmlTextConcat(This->node, pContent, SysStringLen(p) ) == 0)
             hr = S_OK;
         else
-            hr = E_FAIL;
+        {
+            xmlChar *pNew;
+            pNew = xmlStrcat(xmlNodeGetContent(This->node), pContent);
+            if(pNew)
+            {
+                xmlNodeSetContent(This->node, pNew);
+                hr = S_OK;
+            }
+            else
+                hr = E_FAIL;
+        }
         HeapFree( GetProcessHeap(), 0, pContent );
     }
     else
-- 
1.5.6.5





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic