From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/domdoc.c | 22 ++++------------------ dlls/msxml3/tests/domdoc.c | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 0011e6d1f79..c36c43256c0 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -304,27 +304,13 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream return doc->error = domdoc_load_from_stream(doc, (ISequentialStream *)stream); } -static HRESULT WINAPI PersistStreamInit_Save( - IPersistStreamInit *iface, IStream *stream, BOOL clr_dirty) +static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, IStream *stream, BOOL clr_dirty) { - domdoc *This = impl_from_IPersistStreamInit(iface); - BSTR xmlString; - HRESULT hr; - - TRACE("(%p)->(%p %d)\n", This, stream, clr_dirty); - - hr = IXMLDOMDocument3_get_xml(&This->IXMLDOMDocument3_iface, &xmlString); - if(hr == S_OK) - { - DWORD len = SysStringLen(xmlString) * sizeof(WCHAR); - - hr = IStream_Write( stream, xmlString, len, NULL ); - SysFreeString(xmlString); - } + domdoc *doc = impl_from_IPersistStreamInit(iface); - TRACE("hr %#lx.\n", hr); + TRACE("%p, %p, %d.\n", iface, stream, clr_dirty); - return hr; + return node_save(doc->node, stream); } static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, ULARGE_INTEGER *size) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index eb6e25210c8..3f825ba83eb 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -2138,12 +2138,14 @@ if (0) static void test_persiststream(void) { IPersistStreamInit *streaminit; + IStream *istream, *stream2; IPersistStream *stream; IXMLDOMDocument *doc; ULARGE_INTEGER size; - IStream *istream; + HGLOBAL global; HRESULT hr; CLSID clsid; + void *ptr; doc = create_document(&IID_IXMLDOMDocument); @@ -2180,6 +2182,20 @@ static void test_persiststream(void) IStream_Release(istream); EXPECT_PARSE_ERROR(doc, S_OK, FALSE); + /* Save */ + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IPersistStreamInit_Save(streaminit, stream2, FALSE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = GetHGlobalFromStream(stream2, &global); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ptr = GlobalLock(global); + ok(!memcmp(ptr, "<?xml", 5), "Unexpected output.\n"); + GlobalUnlock(global); + + IStream_Release(stream2); + istream = SHCreateMemStream((const BYTE*)"", 0); hr = IPersistStreamInit_Load(streaminit, istream); todo_wine ok(hr == XML_E_MISSINGROOT, "Unexpected hr %#lx.\n", hr); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706