Module: wine Branch: master Commit: 6167c6122a7d3a437bacc6619295f2c1faae8bae URL: http://source.winehq.org/git/wine.git/?a=commit;h=6167c6122a7d3a437bacc66192...
Author: Alistair Leslie-Hughes leslie_alistair@hotmail.com Date: Wed Mar 12 21:47:17 2008 +1100
msxml3: Allow IXMLDOMDocument to save as another IXMLDOMDocument.
---
dlls/msxml3/domdoc.c | 29 +++++++++++++++++++++- dlls/msxml3/tests/domdoc.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index fed1b8b..a05247a 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -1559,12 +1559,37 @@ static HRESULT WINAPI domdoc_save( TRACE("(%p)->(var(vt %x, %s))\n", This, V_VT(&destination), V_VT(&destination) == VT_BSTR ? debugstr_w(V_BSTR(&destination)) : NULL);
- if(V_VT(&destination) != VT_BSTR) + if(V_VT(&destination) != VT_BSTR && V_VT(&destination) != VT_UNKNOWN) { - FIXME("Unhandled vt %x\n", 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); + IXMLDOMDocument *pDocument; + + ret = IXMLDOMDocument_QueryInterface(pUnk, &IID_IXMLDOMDocument2, (void**)&pDocument); + if(ret == S_OK) + { + BSTR bXML; + VARIANT_BOOL bSuccessful; + + ret = IXMLDOMDocument_get_xml(iface, &bXML); + if(ret == S_OK) + { + ret = IXMLDOMDocument_loadXML(pDocument, bXML, &bSuccessful); + + SysFreeString(bXML); + } + + IXMLDOMDocument_Release(pDocument); + } + + return ret; + } + handle = CreateFileW( V_BSTR(&destination), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if( handle == INVALID_HANDLE_VALUE ) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index c4c5b9c..b597670 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -3013,6 +3013,60 @@ static void test_nodeTypeTests( void ) free_bstrs(); }
+static void test_DocumentSaveToDocument(void) +{ + IXMLDOMDocument *doc = NULL; + IXMLDOMDocument *doc2 = NULL; + IXMLDOMElement *pRoot; + + HRESULT hr; + + hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + if( hr != S_OK ) + return; + + hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc2 ); + if( hr != S_OK ) + { + IXMLDOMDocument_Release(doc); + return; + } + + hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)pRoot, NULL); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + VARIANT vDoc; + BSTR sOrig; + BSTR sNew; + + V_VT(&vDoc) = VT_UNKNOWN; + V_UNKNOWN(&vDoc) = (IUnknown*)doc2; + + hr = IXMLDOMDocument_save(doc, vDoc); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMDocument_get_xml(doc, &sOrig); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMDocument_get_xml(doc2, &sNew); + ok(hr == S_OK, "ret %08x\n", hr ); + + ok( !lstrcmpW( sOrig, sNew ), "New document is not the same as origial\n"); + + SysFreeString(sOrig); + SysFreeString(sNew); + } + } + + IXMLDOMDocument_Release(doc2); + IXMLDOMDocument_Release(doc); +} + START_TEST(domdoc) { HRESULT r; @@ -3034,6 +3088,7 @@ START_TEST(domdoc) test_cloneNode(); test_xmlTypes(); test_nodeTypeTests(); + test_DocumentSaveToDocument();
CoUninitialize(); }