From 4f58e11601a98415099389c723aaa9014d53738d Mon Sep 17 00:00:00 2001 From: Adam Martinson Date: Mon, 20 Jun 2011 00:26:12 -0500 Subject: [PATCH] msxml3: Add support for VT_BSTR|VT_BYREF in domdoc_save(). --- dlls/msxml3/domdoc.c | 106 +++++++++++++++++++------------------ dlls/msxml3/tests/domdoc.c | 21 +++++++- 2 files changed, 75 insertions(+), 52 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 122d62f2327..6fb923fa312 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -2423,70 +2423,74 @@ static HRESULT WINAPI domdoc_save( xmlNodePtr xmldecl; HRESULT ret = S_OK; - TRACE("(%p)->(var(vt %d, %s))\n", This, V_VT(&destination), - V_VT(&destination) == VT_BSTR ? debugstr_w(V_BSTR(&destination)) : NULL); + TRACE("(%p)->(%s)\n", This, debugstr_variant(&destination)); - if(V_VT(&destination) != VT_BSTR && V_VT(&destination) != VT_UNKNOWN) + switch (V_VT(&destination)) { - FIXME("Unhandled vt %d\n", V_VT(&destination)); - return S_FALSE; - } - - if(V_VT(&destination) == VT_UNKNOWN) - { - IUnknown *pUnk = V_UNKNOWN(&destination); - IXMLDOMDocument2 *document; - IStream *stream; - - ret = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMDocument3, (void**)&document); - if(ret == S_OK) + case VT_UNKNOWN: { - VARIANT_BOOL success; - BSTR xml; + IUnknown *pUnk = V_UNKNOWN(&destination); + IXMLDOMDocument2 *document; + IStream *stream; - ret = IXMLDOMDocument3_get_xml(iface, &xml); + ret = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMDocument3, (void**)&document); if(ret == S_OK) { - ret = IXMLDOMDocument3_loadXML(document, xml, &success); - SysFreeString(xml); + VARIANT_BOOL success; + BSTR xml; + + ret = IXMLDOMDocument3_get_xml(iface, &xml); + if(ret == S_OK) + { + ret = IXMLDOMDocument3_loadXML(document, xml, &success); + SysFreeString(xml); + } + + IXMLDOMDocument3_Release(document); + return ret; } - IXMLDOMDocument3_Release(document); - return ret; - } - - ret = IUnknown_QueryInterface(pUnk, &IID_IStream, (void**)&stream); - if(ret == S_OK) - { - ctx = xmlSaveToIO(domdoc_stream_save_writecallback, - domdoc_stream_save_closecallback, stream, NULL, XML_SAVE_NO_DECL); - - if(!ctx) + ret = IUnknown_QueryInterface(pUnk, &IID_IStream, (void**)&stream); + if(ret == S_OK) { - IStream_Release(stream); + ctx = xmlSaveToIO(domdoc_stream_save_writecallback, + domdoc_stream_save_closecallback, stream, NULL, XML_SAVE_NO_DECL); + + if(!ctx) + { + IStream_Release(stream); + return E_FAIL; + } + } + } + break; + + case VT_BSTR: + case VT_BSTR | VT_BYREF: + { + /* save with file path */ + HANDLE handle = CreateFileW( (V_VT(&destination) & VT_BYREF)? *V_BSTRREF(&destination) : V_BSTR(&destination), + GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); + if( handle == INVALID_HANDLE_VALUE ) + { + WARN("failed to create file\n"); + return E_FAIL; + } + + /* disable top XML declaration */ + ctx = xmlSaveToIO(domdoc_save_writecallback, domdoc_save_closecallback, + handle, NULL, XML_SAVE_NO_DECL); + if (!ctx) + { + CloseHandle(handle); return E_FAIL; } } - } - else - { - /* save with file path */ - HANDLE handle = CreateFileW( V_BSTR(&destination), GENERIC_WRITE, 0, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); - if( handle == INVALID_HANDLE_VALUE ) - { - WARN("failed to create file\n"); - return E_FAIL; - } + break; - /* disable top XML declaration */ - ctx = xmlSaveToIO(domdoc_save_writecallback, domdoc_save_closecallback, - handle, NULL, XML_SAVE_NO_DECL); - if (!ctx) - { - CloseHandle(handle); - return E_FAIL; - } + default: + FIXME("Unhandled VARIANT: %s\n", debugstr_variant(&destination)); + return S_FALSE; } xmldecl = xmldoc_unlink_xmldecl(get_doc(This)); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index abb282a3bc7..22bf38500b5 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -6859,7 +6859,7 @@ static void test_save(void) IXMLDOMDocument *doc, *doc2; IXMLDOMElement *root; VARIANT file, vDoc; - BSTR sOrig, sNew; + BSTR sOrig, sNew, filename; char buffer[100]; DWORD read = 0; HANDLE hfile; @@ -6909,6 +6909,25 @@ static void test_save(void) hr = IXMLDOMDocument_save(doc, file); EXPECT_HR(hr, S_OK); + 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"); + + CloseHandle(hfile); + DeleteFile("test.xml"); + + /* save to path VT_BSTR | VT_BYREF */ + filename = _bstr_("test.xml"); + V_VT(&file) = VT_BSTR | VT_BYREF; + V_BSTRREF(&file) = &filename; + + hr = IXMLDOMDocument_save(doc, file); + EXPECT_HR(hr, S_OK); + IXMLDOMDocument_Release(doc); hfile = CreateFileA("test.xml", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );