Adam Martinson : msxml3: Add support for VT_BSTR|VT_BYREF in domdoc_save().
Alexandre Julliard
julliard at winehq.org
Tue Jun 21 12:25:40 CDT 2011
Module: wine
Branch: master
Commit: 4f58e11601a98415099389c723aaa9014d53738d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4f58e11601a98415099389c723aaa9014d53738d
Author: Adam Martinson <amartinson at codeweavers.com>
Date: Mon Jun 20 00:26:12 2011 -0500
msxml3: Add support for VT_BSTR|VT_BYREF in domdoc_save().
---
dlls/msxml3/domdoc.c | 98 +++++++++++++++++++++++---------------------
dlls/msxml3/tests/domdoc.c | 21 +++++++++-
2 files changed, 71 insertions(+), 48 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 122d62f..6fb923f 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)
+ {
+ IStream_Release(stream);
+ return E_FAIL;
+ }
+ }
}
+ break;
- ret = IUnknown_QueryInterface(pUnk, &IID_IStream, (void**)&stream);
- if(ret == S_OK)
+ case VT_BSTR:
+ case VT_BSTR | VT_BYREF:
{
- ctx = xmlSaveToIO(domdoc_stream_save_writecallback,
- domdoc_stream_save_closecallback, stream, NULL, XML_SAVE_NO_DECL);
+ /* 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;
+ }
- if(!ctx)
+ /* disable top XML declaration */
+ ctx = xmlSaveToIO(domdoc_save_writecallback, domdoc_save_closecallback,
+ handle, NULL, XML_SAVE_NO_DECL);
+ if (!ctx)
{
- IStream_Release(stream);
+ 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 abb282a..22bf385 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 );
More information about the wine-cvs
mailing list