From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/domdoc.c | 45 +---------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 47 +++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 44 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index e260b3fff16..4925563787e 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -785,50 +785,7 @@ static HRESULT WINAPI domdoc_transformNodeToObject(IXMLDOMDocument3 *iface, TRACE("%p, %p, %s.\n", iface, stylesheet, debugstr_variant(&output)); - switch (V_VT(&output)) - { - case VT_UNKNOWN: - case VT_DISPATCH: - { - IXMLDOMDocument *output_doc; - ISequentialStream *stream; - HRESULT hr; - BSTR str; - - if (!V_UNKNOWN(&output)) - return E_INVALIDARG; - - /* FIXME: we're not supposed to query for document interface, should use IStream - which we don't support currently. */ - if (IUnknown_QueryInterface(V_UNKNOWN(&output), &IID_IXMLDOMDocument, (void **)&output_doc) == S_OK) - { - VARIANT_BOOL b; - - if (FAILED(hr = node_transform_node(doc->node, stylesheet, &str))) - return hr; - - hr = IXMLDOMDocument_loadXML(output_doc, str, &b); - SysFreeString(str); - return hr; - } - else if (IUnknown_QueryInterface(V_UNKNOWN(&output), &IID_ISequentialStream, (void**)&stream) == S_OK) - { - hr = node_transform_node_params(doc->node, stylesheet, NULL, stream, NULL); - ISequentialStream_Release(stream); - return hr; - } - else - { - FIXME("Unsupported destination type.\n"); - return E_INVALIDARG; - } - } - default: - FIXME("Output type %d not handled.\n", V_VT(&output)); - return E_NOTIMPL; - } - - return E_NOTIMPL; + return node_transform_node_to_object(doc->node, stylesheet, &output); } static HRESULT WINAPI domdoc_get_doctype(IXMLDOMDocument3 *iface, IXMLDOMDocumentType **doctype) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 05491160315..d07e304dbb0 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -396,6 +396,7 @@ extern HRESULT node_get_value(struct domnode *node, VARIANT *value); extern HRESULT node_select_nodes(struct domnode*,BSTR,IXMLDOMNodeList**); extern HRESULT node_select_singlenode(struct domnode *,BSTR,IXMLDOMNode**); extern HRESULT node_transform_node(struct domnode*,IXMLDOMNode*,BSTR*); +extern HRESULT node_transform_node_to_object(struct domnode*,IXMLDOMNode*,const VARIANT*); extern HRESULT node_transform_node_params(struct domnode*,IXMLDOMNode*,BSTR*,ISequentialStream*, const struct xslprocessor_params*); extern HRESULT node_create_supporterrorinfo(const tid_t*,void**); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index a43f882a6f0..65179896d17 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -3276,6 +3276,53 @@ HRESULT node_transform_node(struct domnode *node, IXMLDOMNode *stylesheet, BSTR return node_transform_node_params(node, stylesheet, p, NULL, NULL); } +HRESULT node_transform_node_to_object(struct domnode *node, IXMLDOMNode *stylesheet, const VARIANT *output) +{ + switch (V_VT(output)) + { + case VT_UNKNOWN: + case VT_DISPATCH: + { + IXMLDOMDocument *output_doc; + ISequentialStream *stream; + HRESULT hr; + BSTR str; + + if (!V_UNKNOWN(output)) + return E_INVALIDARG; + + /* FIXME: we're not supposed to query for document interface, should use IStream + which we don't support currently. */ + if (IUnknown_QueryInterface(V_UNKNOWN(output), &IID_IXMLDOMDocument, (void **)&output_doc) == S_OK) + { + VARIANT_BOOL b; + + if (FAILED(hr = node_transform_node(node, stylesheet, &str))) + return hr; + + hr = IXMLDOMDocument_loadXML(output_doc, str, &b); + SysFreeString(str); + return hr; + } + else if (IUnknown_QueryInterface(V_UNKNOWN(output), &IID_ISequentialStream, (void**)&stream) == S_OK) + { + hr = node_transform_node_params(node, stylesheet, NULL, stream, NULL); + ISequentialStream_Release(stream); + return hr; + } + else + { + FIXME("Unsupported destination type.\n"); + return E_INVALIDARG; + } + } + default: + FIXME("Output %s not handled.\n", debugstr_variant(output)); + } + + return E_NOTIMPL; +} + HRESULT node_select_nodes(struct domnode *node, BSTR query, IXMLDOMNodeList **list) { struct domnode *doc = node_get_doc(node); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11743