Nikolay Sivov : msxml3: Don' t use stream written value when saving to stream.

Alexandre Julliard julliard at winehq.org
Mon Jul 9 14:56:38 CDT 2012


Module: wine
Branch: master
Commit: 1a0552443ce8c2392a3d2cbe296a392b6741b0fe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1a0552443ce8c2392a3d2cbe296a392b6741b0fe

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Jul  7 12:13:08 2012 +0400

msxml3: Don't use stream written value when saving to stream.

---

 dlls/msxml3/domdoc.c       |    3 +-
 dlls/msxml3/tests/domdoc.c |  156 +++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 141 insertions(+), 18 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 080eb3d..0c0df36 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -2328,13 +2328,14 @@ static int XMLCALL domdoc_stream_save_writecallback(void *ctx, const char *buffe
     HRESULT hr;
 
     hr = IStream_Write((IStream*)ctx, buffer, len, &written);
+    TRACE("0x%08x %p %d %u\n", hr, buffer, len, written);
     if (hr != S_OK)
     {
         WARN("stream write error: 0x%08x\n", hr);
         return -1;
     }
     else
-        return written;
+        return len;
 }
 
 static int XMLCALL domdoc_stream_save_closecallback(void *ctx)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 9919f4e..d51b863 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1288,6 +1288,118 @@ static const IServiceProviderVtbl testprovVtbl =
 
 testprov_t testprov = { { &testprovVtbl } };
 
+/* IStream */
+static HRESULT WINAPI istream_QueryInterface(IStream *iface, REFIID riid, void **ppvObject)
+{
+    *ppvObject = NULL;
+
+    if (IsEqualGUID(riid, &IID_IStream) ||
+        IsEqualGUID(riid, &IID_IUnknown))
+        *ppvObject = iface;
+    else
+        return E_NOINTERFACE;
+
+    return S_OK;
+}
+
+static ULONG WINAPI istream_AddRef(IStream *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI istream_Release(IStream *iface)
+{
+    return 1;
+}
+
+static HRESULT WINAPI istream_Read(IStream *iface, void *ptr, ULONG len, ULONG *pread)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Write(IStream *iface, const void *ptr, ULONG len, ULONG *written)
+{
+    *written = len/2;
+    return S_OK;
+}
+
+static HRESULT WINAPI istream_Seek(IStream *iface, LARGE_INTEGER move, DWORD origin, ULARGE_INTEGER *new_pos)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_SetSize(IStream *iface, ULARGE_INTEGER size)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_CopyTo(IStream *iface, IStream *stream, ULARGE_INTEGER len,
+        ULARGE_INTEGER *pread, ULARGE_INTEGER *written)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Commit(IStream *iface, DWORD flags)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Revert(IStream *iface)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_LockRegion(IStream *iface, ULARGE_INTEGER offset,
+        ULARGE_INTEGER len, DWORD locktype)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_UnlockRegion(IStream *iface, ULARGE_INTEGER offset,
+        ULARGE_INTEGER len, DWORD locktype)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Stat(IStream *iface, STATSTG *pstatstg, DWORD flag)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Clone(IStream *iface, IStream **stream)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static const IStreamVtbl StreamVtbl = {
+    istream_QueryInterface,
+    istream_AddRef,
+    istream_Release,
+    istream_Read,
+    istream_Write,
+    istream_Seek,
+    istream_SetSize,
+    istream_CopyTo,
+    istream_Commit,
+    istream_Revert,
+    istream_LockRegion,
+    istream_UnlockRegion,
+    istream_Stat,
+    istream_Clone
+};
+
+static IStream savestream = { &StreamVtbl };
+
 #define EXPECT_CHILDREN(node) _expect_children((IXMLDOMNode*)node, __LINE__)
 static void _expect_children(IXMLDOMNode *node, int line)
 {
@@ -7124,10 +7236,10 @@ static void test_save(void)
 {
     IXMLDOMDocument *doc, *doc2;
     IXMLDOMElement *root;
-    VARIANT file, vDoc;
     BSTR sOrig, sNew, filename;
     char buffer[100];
     DWORD read = 0;
+    VARIANT dest;
     HANDLE hfile;
     HRESULT hr;
 
@@ -7148,10 +7260,10 @@ static void test_save(void)
     hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
     EXPECT_HR(hr, S_OK);
 
-    V_VT(&vDoc) = VT_UNKNOWN;
-    V_UNKNOWN(&vDoc) = (IUnknown*)doc2;
+    V_VT(&dest) = VT_UNKNOWN;
+    V_UNKNOWN(&dest) = (IUnknown*)doc2;
 
-    hr = IXMLDOMDocument_save(doc, vDoc);
+    hr = IXMLDOMDocument_save(doc, dest);
     EXPECT_HR(hr, S_OK);
 
     hr = IXMLDOMDocument_get_xml(doc, &sOrig);
@@ -7169,10 +7281,10 @@ static void test_save(void)
     IXMLDOMDocument_Release(doc2);
 
     /* save to path */
-    V_VT(&file) = VT_BSTR;
-    V_BSTR(&file) = _bstr_("test.xml");
+    V_VT(&dest) = VT_BSTR;
+    V_BSTR(&dest) = _bstr_("test.xml");
 
-    hr = IXMLDOMDocument_save(doc, file);
+    hr = IXMLDOMDocument_save(doc, dest);
     EXPECT_HR(hr, S_OK);
 
     hfile = CreateFileA("test.xml", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
@@ -7188,24 +7300,34 @@ static void test_save(void)
 
     /* save to path VT_BSTR | VT_BYREF */
     filename = _bstr_("test.xml");
-    V_VT(&file) = VT_BSTR | VT_BYREF;
-    V_BSTRREF(&file) = &filename;
+    V_VT(&dest) = VT_BSTR | VT_BYREF;
+    V_BSTRREF(&dest) = &filename;
 
-    hr = IXMLDOMDocument_save(doc, file);
+    hr = IXMLDOMDocument_save(doc, dest);
     EXPECT_HR(hr, S_OK);
 
-    IXMLDOMDocument_Release(doc);
-
     hfile = CreateFileA("test.xml", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
     ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %u\n", GetLastError());
     if(hfile == INVALID_HANDLE_VALUE) return;
 
-    ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
-    ok(read != 0, "could not read file\n");
-    ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
+    if (hfile != INVALID_HANDLE_VALUE)
+    {
+       ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
+       ok(read != 0, "could not read file\n");
+       ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
 
-    CloseHandle(hfile);
-    DeleteFile("test.xml");
+       CloseHandle(hfile);
+       DeleteFile("test.xml");
+    }
+
+    /* save to stream */
+    V_VT(&dest) = VT_UNKNOWN;
+    V_UNKNOWN(&dest) = (IUnknown*)&savestream;
+
+    hr = IXMLDOMDocument_save(doc, dest);
+    EXPECT_HR(hr, S_OK);
+
+    IXMLDOMDocument_Release(doc);
     free_bstrs();
 }
 




More information about the wine-cvs mailing list