[PATCH 0/6] MR11743: msxml3: Some IXSLTemplate changes.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11743
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
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/node.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 65179896d17..0a5c71ad839 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -46,6 +46,8 @@ #include "msxml6.h" #include <activscp.h> #include "objsafe.h" +#include "mshtml.h" +#include "asptlb.h" #include "msxml_private.h" #include "saxreader_extensions.h" @@ -3278,6 +3280,8 @@ HRESULT node_transform_node(struct domnode *node, IXMLDOMNode *stylesheet, BSTR HRESULT node_transform_node_to_object(struct domnode *node, IXMLDOMNode *stylesheet, const VARIANT *output) { + IUnknown *unk; + switch (V_VT(output)) { case VT_UNKNOWN: @@ -3291,6 +3295,13 @@ HRESULT node_transform_node_to_object(struct domnode *node, IXMLDOMNode *stylesh if (!V_UNKNOWN(output)) return E_INVALIDARG; + if (IUnknown_QueryInterface(V_UNKNOWN(output), &IID_IHTMLObjectElement, (void **)&unk) == S_OK) + { + FIXME("Output to IHTMLObjectElement is not supported.\n"); + IUnknown_Release(unk); + return E_NOTIMPL; + } + /* 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) @@ -3304,17 +3315,23 @@ HRESULT node_transform_node_to_object(struct domnode *node, IXMLDOMNode *stylesh SysFreeString(str); return hr; } - else if (IUnknown_QueryInterface(V_UNKNOWN(output), &IID_ISequentialStream, (void**)&stream) == S_OK) + + if (IUnknown_QueryInterface(V_UNKNOWN(output), &IID_IStream, (void **)&stream) == S_OK + || 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 + + if (IUnknown_QueryInterface(V_UNKNOWN(output), &IID_IResponse, (void **)&unk) == S_OK) { - FIXME("Unsupported destination type.\n"); - return E_INVALIDARG; + FIXME("Output to IResponse is not supported.\n"); + return E_NOTIMPL; } + + WARN("Unsupported destination type.\n"); + return E_INVALIDARG; } default: FIXME("Output %s not handled.\n", debugstr_variant(output)); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11743
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/node.c | 16 ---------------- dlls/msxml3/tests/domdoc.c | 1 - 2 files changed, 17 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 0a5c71ad839..8b19f8dff1d 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -3287,10 +3287,8 @@ HRESULT node_transform_node_to_object(struct domnode *node, IXMLDOMNode *stylesh case VT_UNKNOWN: case VT_DISPATCH: { - IXMLDOMDocument *output_doc; ISequentialStream *stream; HRESULT hr; - BSTR str; if (!V_UNKNOWN(output)) return E_INVALIDARG; @@ -3302,20 +3300,6 @@ HRESULT node_transform_node_to_object(struct domnode *node, IXMLDOMNode *stylesh return E_NOTIMPL; } - /* 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; - } - if (IUnknown_QueryInterface(V_UNKNOWN(output), &IID_IStream, (void **)&stream) == S_OK || IUnknown_QueryInterface(V_UNKNOWN(output), &IID_ISequentialStream, (void **)&stream) == S_OK) { diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index a35f26a1486..173db8d3c52 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -14235,7 +14235,6 @@ static HRESULT WINAPI transformdest_QueryInterface(IUnknown *iface, REFIID riid, IsEqualIID(riid, &IID_ISequentialStream) || IsEqualIID(riid, &IID_IResponse); - todo_wine_if(IsEqualIID(riid, &IID_IXMLDOMDocument)) ok(known_iid, "Unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11743
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 173db8d3c52..555b51a5be0 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -9610,8 +9610,9 @@ static void test_get_xml(void) static void test_xsltemplate(void) { IXMLDOMDocument *doc, *doc2, *doc3; - IXSLTemplate *template; + IXSLTemplate *template, *template2; IXSLProcessor *processor; + IXMLDOMNode *node; IStream *stream; VARIANT_BOOL b; HRESULT hr; @@ -9630,6 +9631,17 @@ static void test_xsltemplate(void) hr = IXSLTemplate_putref_stylesheet(template, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXSLTemplate_get_stylesheet(template, NULL); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + node = (void *)1; + hr = IXSLTemplate_get_stylesheet(template, &node); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!node, "Unexpected node %p.\n", node); + doc = create_document(&IID_IXMLDOMDocument); b = VARIANT_TRUE; @@ -9674,6 +9686,14 @@ static void test_xsltemplate(void) ref2 = IXMLDOMDocument_AddRef(doc); IXMLDOMDocument_Release(doc); ok(ref2 > ref1, "got %ld\n", ref2); + hr = IXSLTemplate_get_stylesheet(template, &node); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +if (hr == S_OK) +{ + ok(node == (IXMLDOMNode *)doc, "Unexpected node %p.\n", node); + IXMLDOMNode_Release(node); +} /* processor */ hr = IXSLTemplate_createProcessor(template, NULL); @@ -9684,6 +9704,18 @@ static void test_xsltemplate(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); EXPECT_REF(template, 2); + hr = IXSLProcessor_get_ownerTemplate(processor, NULL); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = IXSLProcessor_get_ownerTemplate(processor, &template2); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +if (hr == S_OK) +{ + ok(template == template2, "Unexpected template %p.\n", template2); + IXSLTemplate_Release(template2); +} + /* input no set yet */ V_VT(&v) = VT_BSTR; V_BSTR(&v) = NULL; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11743
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/stylesheet.c | 17 ++++++++++++----- dlls/msxml3/tests/domdoc.c | 7 ------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c index 3b02d75c343..3380e2c8626 100644 --- a/dlls/msxml3/stylesheet.c +++ b/dlls/msxml3/stylesheet.c @@ -220,13 +220,20 @@ static HRESULT WINAPI xsltemplate_putref_stylesheet( IXSLTemplate *iface, return S_OK; } -static HRESULT WINAPI xsltemplate_get_stylesheet( IXSLTemplate *iface, - IXMLDOMNode **node) +static HRESULT WINAPI xsltemplate_get_stylesheet(IXSLTemplate *iface, IXMLDOMNode **node) { - xsltemplate *This = impl_from_IXSLTemplate( iface ); + xsltemplate *template = impl_from_IXSLTemplate(iface); - FIXME("(%p)->(%p): stub\n", This, node); - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, node); + + if (!node) + return E_INVALIDARG; + + *node = template->node; + if (*node) + IXMLDOMNode_AddRef(*node); + + return S_OK; } static HRESULT WINAPI xsltemplate_createProcessor( IXSLTemplate *iface, diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 555b51a5be0..a13eb77834c 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -9632,14 +9632,11 @@ static void test_xsltemplate(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXSLTemplate_get_stylesheet(template, NULL); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); node = (void *)1; hr = IXSLTemplate_get_stylesheet(template, &node); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!node, "Unexpected node %p.\n", node); doc = create_document(&IID_IXMLDOMDocument); @@ -9687,13 +9684,9 @@ static void test_xsltemplate(void) IXMLDOMDocument_Release(doc); ok(ref2 > ref1, "got %ld\n", ref2); hr = IXSLTemplate_get_stylesheet(template, &node); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -if (hr == S_OK) -{ ok(node == (IXMLDOMNode *)doc, "Unexpected node %p.\n", node); IXMLDOMNode_Release(node); -} /* processor */ hr = IXSLTemplate_createProcessor(template, NULL); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11743
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/stylesheet.c | 25 +++++++++++++++---------- dlls/msxml3/tests/domdoc.c | 5 ----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c index 3380e2c8626..112232aae98 100644 --- a/dlls/msxml3/stylesheet.c +++ b/dlls/msxml3/stylesheet.c @@ -60,7 +60,7 @@ typedef struct IXSLProcessor IXSLProcessor_iface; LONG ref; - xsltemplate *stylesheet; + xsltemplate *template; IXMLDOMNode *input; struct @@ -354,7 +354,7 @@ static ULONG WINAPI xslprocessor_Release( IXSLProcessor *iface ) LIST_FOR_EACH_ENTRY_SAFE(par, par2, &This->params.list, struct xslprocessor_par, entry) xslprocessor_par_free(&This->params, par); - IXSLTemplate_Release(&This->stylesheet->IXSLTemplate_iface); + IXSLTemplate_Release(&This->template->IXSLTemplate_iface); free(This); } @@ -444,14 +444,19 @@ static HRESULT WINAPI xslprocessor_get_input( IXSLProcessor *iface, VARIANT *inp return E_NOTIMPL; } -static HRESULT WINAPI xslprocessor_get_ownerTemplate( - IXSLProcessor *iface, - IXSLTemplate **template) +static HRESULT WINAPI xslprocessor_get_ownerTemplate(IXSLProcessor *iface, IXSLTemplate **template) { - xslprocessor *This = impl_from_IXSLProcessor( iface ); + xslprocessor *processor = impl_from_IXSLProcessor(iface); - FIXME("(%p)->(%p): stub\n", This, template); - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, template); + + if (!template) + return E_INVALIDARG; + + *template = &processor->template->IXSLTemplate_iface; + IXSLTemplate_AddRef(*template); + + return S_OK; } static HRESULT WINAPI xslprocessor_setStartMode( @@ -635,7 +640,7 @@ static HRESULT WINAPI xslprocessor_transform( SysFreeString(This->outstr); - hr = node_transform_node_params(get_node_obj(This->input), This->stylesheet->node, + hr = node_transform_node_params(get_node_obj(This->input), This->template->node, &This->outstr, stream, &This->params); if (SUCCEEDED(hr)) { @@ -878,7 +883,7 @@ HRESULT XSLProcessor_create(xsltemplate *template, IXSLProcessor **ret) object->ref = 1; object->output.type = PROCESSOR_OUTPUT_NOT_SET; list_init(&object->params.list); - object->stylesheet = template; + object->template = template; IXSLTemplate_AddRef(&template->IXSLTemplate_iface); init_dispex(&object->dispex, (IUnknown *)&object->IXSLProcessor_iface, &xslprocessor_dispex); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index a13eb77834c..6ee9c2a385c 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -9698,16 +9698,11 @@ static void test_xsltemplate(void) EXPECT_REF(template, 2); hr = IXSLProcessor_get_ownerTemplate(processor, NULL); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); hr = IXSLProcessor_get_ownerTemplate(processor, &template2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -if (hr == S_OK) -{ ok(template == template2, "Unexpected template %p.\n", template2); IXSLTemplate_Release(template2); -} /* input no set yet */ V_VT(&v) = VT_BSTR; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11743
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)