Daniel Lehman : msxml3: Support ISequentialStream in domdoc_transformNodeToObject.

Alexandre Julliard julliard at winehq.org
Wed Nov 25 15:58:53 CST 2020


Module: wine
Branch: master
Commit: 4610dc7920fda455fba7c88db283c342a31ae037
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4610dc7920fda455fba7c88db283c342a31ae037

Author: Daniel Lehman <dlehman25 at gmail.com>
Date:   Wed Nov 18 00:10:12 2020 -0800

msxml3: Support ISequentialStream in domdoc_transformNodeToObject.

Signed-off-by: Daniel Lehman <dlehman25 at gmail.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msxml3/domdoc.c       |  9 ++++++++-
 dlls/msxml3/node.c         |  6 +++---
 dlls/msxml3/tests/domdoc.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+), 4 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index d447bd2b1d8..80c32e9ba99 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1524,8 +1524,10 @@ static HRESULT WINAPI domdoc_transformNodeToObject(
     case VT_UNKNOWN:
     case VT_DISPATCH:
     {
+        ISequentialStream *stream;
         IXMLDOMDocument *doc;
         HRESULT hr;
+        BSTR str;
 
         if (!V_UNKNOWN(&output))
             return E_INVALIDARG;
@@ -1535,7 +1537,6 @@ static HRESULT WINAPI domdoc_transformNodeToObject(
         if (IUnknown_QueryInterface(V_UNKNOWN(&output), &IID_IXMLDOMDocument, (void **)&doc) == S_OK)
         {
             VARIANT_BOOL b;
-            BSTR str;
 
             if (FAILED(hr = node_transform_node(&This->node, stylesheet, &str)))
                 return hr;
@@ -1544,6 +1545,12 @@ static HRESULT WINAPI domdoc_transformNodeToObject(
             SysFreeString(str);
             return hr;
         }
+        else if (IUnknown_QueryInterface(V_UNKNOWN(&output), &IID_ISequentialStream, (void**)&stream) == S_OK)
+        {
+            hr = node_transform_node_params(&This->node, stylesheet, NULL, stream, NULL);
+            ISequentialStream_Release(stream);
+            return hr;
+        }
         else
         {
             FIXME("Unsupported destination type.\n");
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 35777d65918..67f322eb0e5 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1512,9 +1512,9 @@ HRESULT node_transform_node_params(const xmlnode *This, IXMLDOMNode *stylesheet,
     xmlnode *sheet;
 
     if (!libxslt_handle) return E_NOTIMPL;
-    if (!stylesheet || !p) return E_INVALIDARG;
+    if (!stylesheet || (!p && !stream)) return E_INVALIDARG;
 
-    *p = NULL;
+    if (p) *p = NULL;
 
     sheet = get_node_obj(stylesheet);
     if(!sheet) return E_FAIL;
@@ -1572,7 +1572,7 @@ HRESULT node_transform_node_params(const xmlnode *This, IXMLDOMNode *stylesheet,
     else
         xmlFreeDoc(sheet_doc);
 
-    if(!*p) *p = SysAllocStringLen(NULL, 0);
+    if (p && !*p) *p = SysAllocStringLen(NULL, 0);
 
     return hr;
 #else
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 02e31b4aafb..e27754d457a 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -13030,7 +13030,12 @@ static void test_transformNodeToObject(void)
 {
     IUnknown transformdest = { &transformdestvtbl };
     IXMLDOMDocument *doc, *doc2, *doc3;
+    ISequentialStream *sstream;
+    LARGE_INTEGER off;
+    WCHAR buffer[256];
+    IStream *istream;
     VARIANT_BOOL b;
+    ULONG nread;
     HRESULT hr;
     VARIANT v;
 
@@ -13063,6 +13068,51 @@ static void test_transformNodeToObject(void)
     hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
     ok(hr == S_OK, "Failed to transform node, hr %#x.\n", hr);
 
+    /* IStream */
+    istream = SHCreateMemStream(NULL, 0);
+    V_VT(&v) = VT_UNKNOWN;
+    V_UNKNOWN(&v) = (IUnknown *)istream;
+    hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
+    ok(hr == S_OK, "Failed to transform node, hr %#x.\n", hr);
+
+    off.QuadPart = 0;
+    hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL);
+    ok(hr == S_OK, "Failed to seek, hr %#x.\n", hr);
+
+    nread = 0;
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = IStream_Read(istream, buffer, sizeof(buffer), &nread);
+    ok(hr == S_OK, "Failed to read, hr %#x.\n", hr);
+    buffer[nread/2] = 0;
+    ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]);
+    ok(compareIgnoreReturns(&buffer[1], _bstr_(szTransformOutput)), "got output %s\n", wine_dbgstr_w(buffer));
+    IStream_Release(istream);
+
+    /* ISequentialStream */
+    istream = SHCreateMemStream(NULL, 0);
+    sstream = NULL;
+    hr = IStream_QueryInterface(istream, &IID_ISequentialStream, (void**)&sstream);
+    ok(hr == S_OK, "Failed to QI, hr %#x.\n", hr);
+
+    V_VT(&v) = VT_UNKNOWN;
+    V_UNKNOWN(&v) = (IUnknown *)sstream;
+    hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
+    ok(hr == S_OK, "Failed to transform node, hr %#x.\n", hr);
+
+    off.QuadPart = 0;
+    hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL);
+    ok(hr == S_OK, "Failed to seek, hr %#x.\n", hr);
+
+    nread = 0;
+    memset(buffer, 0xcc, sizeof(buffer));
+    hr = ISequentialStream_Read(sstream, buffer, sizeof(buffer), &nread);
+    ok(hr == S_OK, "Failed to read, hr %#x.\n", hr);
+    buffer[nread/2] = 0;
+    ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]);
+    ok(compareIgnoreReturns(&buffer[1], _bstr_(szTransformOutput)), "got output %s\n", wine_dbgstr_w(buffer));
+    ISequentialStream_Release(sstream);
+    IStream_Release(istream);
+
     IXMLDOMDocument_Release(doc3);
     IXMLDOMDocument_Release(doc2);
     IXMLDOMDocument_Release(doc);




More information about the wine-cvs mailing list