diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c index 724dec64d40..c63cf6ee277 100644 --- a/dlls/msxml3/attribute.c +++ b/dlls/msxml3/attribute.c @@ -446,7 +446,10 @@ static HRESULT WINAPI domattr_get_xml( BSTR* p) { domattr *This = impl_from_IXMLDOMAttribute( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI domattr_transformNode( diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 84d631f4d85..c346f1bd461 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -457,7 +457,10 @@ static HRESULT WINAPI domcdata_get_xml( BSTR* p) { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI domcdata_transformNode( diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 3c80011b886..9f8c0e32172 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -450,7 +450,10 @@ static HRESULT WINAPI domcomment_get_xml( BSTR* p) { domcomment *This = impl_from_IXMLDOMComment( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI domcomment_transformNode( diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c index f9c1ed585f8..ccc67447b2f 100644 --- a/dlls/msxml3/docfrag.c +++ b/dlls/msxml3/docfrag.c @@ -454,7 +454,10 @@ static HRESULT WINAPI domfrag_get_xml( BSTR* p) { domfrag *This = impl_from_IXMLDOMDocumentFragment( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI domfrag_transformNode( diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 8a214023bda..d62d02b0517 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -1268,10 +1268,13 @@ static HRESULT WINAPI domdoc_put_dataType( static HRESULT WINAPI domdoc_get_xml( IXMLDOMDocument3 *iface, - BSTR* xmlString ) + BSTR* p) { domdoc *This = impl_from_IXMLDOMDocument3( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), xmlString ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, TRUE, TRUE, p); } diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 396ca528627..615499dec48 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -475,7 +475,10 @@ static HRESULT WINAPI domelem_get_xml( BSTR* p) { domelem *This = impl_from_IXMLDOMElement( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, TRUE, FALSE, p); } static HRESULT WINAPI domelem_transformNode( diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c index 3460bd073b0..501ff62af23 100644 --- a/dlls/msxml3/entityref.c +++ b/dlls/msxml3/entityref.c @@ -448,7 +448,10 @@ static HRESULT WINAPI entityref_get_xml( BSTR* p) { entityref *This = impl_from_IXMLDOMEntityReference( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI entityref_transformNode( diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 7fcfea71942..310b9ad1c32 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -106,6 +106,7 @@ BOOL dispex_query_interface(DispatchEx*,REFIID,void**); #include #endif + #include /* constructors */ @@ -190,6 +191,7 @@ extern HRESULT node_get_next_sibling(xmlnode*,IXMLDOMNode**); extern HRESULT node_insert_before(xmlnode*,IXMLDOMNode*,const VARIANT*,IXMLDOMNode**); extern HRESULT node_replace_child(xmlnode*,IXMLDOMNode*,IXMLDOMNode*,IXMLDOMNode**); extern HRESULT node_put_text(xmlnode*,BSTR); +extern HRESULT node_get_xml(xmlnode*,BOOL,BOOL,BSTR*); extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 0d12209a9fe..72e6be95e26 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -978,63 +978,45 @@ static BSTR EnsureNoEncoding(BSTR sInput) * reproduce behaviour exactly. * */ -static HRESULT WINAPI xmlnode_get_xml( - IXMLDOMNode *iface, - BSTR* xmlString) +HRESULT node_get_xml(xmlnode *This, BOOL ensure_eol, BOOL ensure_no_encoding, BSTR *ret) { - xmlnode *This = impl_from_IXMLDOMNode( iface ); - xmlBufferPtr pXmlBuf; + xmlBufferPtr xml_buf; xmlNodePtr xmldecl; - int nSize; + int size; - TRACE("(%p %d)->(%p)\n", This, This->node->type, xmlString); - - if(!xmlString) + if(!ret) return E_INVALIDARG; - *xmlString = NULL; + *ret = NULL; + + xml_buf = xmlBufferCreate(); + if(!xml_buf) + return E_OUTOFMEMORY; xmldecl = xmldoc_unlink_xmldecl( This->node->doc ); - pXmlBuf = xmlBufferCreate(); - if(pXmlBuf) - { - nSize = xmlNodeDump(pXmlBuf, This->node->doc, This->node, 0, 1); - if(nSize > 0) - { - const xmlChar *pContent; - BSTR bstrContent; + size = xmlNodeDump(xml_buf, This->node->doc, This->node, 0, 1); + if(size > 0) { + const xmlChar *buf_content; + BSTR content; - /* Attribute Nodes return a space in front of their name */ - pContent = xmlBufferContent(pXmlBuf); - if( ((const char*)pContent)[0] == ' ') - bstrContent = bstr_from_xmlChar(pContent+1); - else - bstrContent = bstr_from_xmlChar(pContent); + /* Attribute Nodes return a space in front of their name */ + buf_content = xmlBufferContent(xml_buf); - switch(This->node->type) - { - case XML_ELEMENT_NODE: - *xmlString = EnsureCorrectEOL(bstrContent); - break; - case XML_DOCUMENT_NODE: - *xmlString = EnsureCorrectEOL(bstrContent); - *xmlString = EnsureNoEncoding(*xmlString); - break; - default: - *xmlString = bstrContent; - } - } + content = bstr_from_xmlChar(buf_content + (buf_content[0] == ' ' ? 1 : 0)); + if(ensure_eol) + content = EnsureCorrectEOL(content); + if(ensure_no_encoding) + content = EnsureNoEncoding(content); - xmlBufferFree(pXmlBuf); + *ret = content; + }else { + *ret = SysAllocStringLen(NULL, 0); } + xmlBufferFree(xml_buf); xmldoc_link_xmldecl( This->node->doc, xmldecl ); - - /* Always returns a string. */ - if(*xmlString == NULL) *xmlString = SysAllocStringLen( NULL, 0 ); - - return S_OK; + return *ret ? S_OK : E_OUTOFMEMORY; } static HRESULT WINAPI xmlnode_transformNode( @@ -1283,7 +1265,7 @@ static const struct IXMLDOMNodeVtbl xmlnode_vtbl = xmlnode_put_nodeTypedValue, NULL, xmlnode_put_dataType, - xmlnode_get_xml, + NULL, xmlnode_transformNode, xmlnode_selectNodes, xmlnode_selectSingleNode, @@ -1731,7 +1713,10 @@ static HRESULT WINAPI unknode_get_xml( BSTR* p) { unknode *This = impl_from_unkIXMLDOMNode( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + FIXME("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI unknode_transformNode( diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c index 4fee700042d..4ba76076ce5 100644 --- a/dlls/msxml3/pi.c +++ b/dlls/msxml3/pi.c @@ -464,7 +464,10 @@ static HRESULT WINAPI dom_pi_get_xml( BSTR* p) { dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI dom_pi_transformNode( diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index a98b52c1443..38a44c3becd 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -463,7 +463,10 @@ static HRESULT WINAPI domtext_get_xml( BSTR* p) { domtext *This = impl_from_IXMLDOMText( iface ); - return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); + + TRACE("(%p)->(%p)\n", This, p); + + return node_get_xml(&This->node, FALSE, FALSE, p); } static HRESULT WINAPI domtext_transformNode(