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 )
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;
test_cloneNode();
test_xmlTypes();
test_nodeTypeTests();
+ test_DocumentSaveToDocument();
CoUninitialize();
}