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