Nikolay Sivov : msxml3: Support ISequentialStream as a document load source .

Alexandre Julliard julliard at winehq.org
Tue Nov 27 14:30:48 CST 2012


Module: wine
Branch: master
Commit: db9d8ebb086c5ef3ef12fb33e7cb47478205e89e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=db9d8ebb086c5ef3ef12fb33e7cb47478205e89e

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Nov 26 23:29:06 2012 -0500

msxml3: Support ISequentialStream as a document load source.

---

 dlls/msxml3/domdoc.c |   58 +++++++++++++++++++------------------------------
 1 files changed, 23 insertions(+), 35 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 16fc64c..c3144ce 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -2037,8 +2037,6 @@ static HRESULT WINAPI domdoc_load(
     domdoc *This = impl_from_IXMLDOMDocument3( iface );
     LPWSTR filename = NULL;
     HRESULT hr = S_FALSE;
-    IXMLDOMDocument3 *pNewDoc = NULL;
-    IStream *pStream = NULL;
     xmlDocPtr xmldoc;
 
     TRACE("(%p)->(%s)\n", This, debugstr_variant(&source));
@@ -2104,13 +2102,18 @@ static HRESULT WINAPI domdoc_load(
         }
         break;
     case VT_UNKNOWN:
+    {
+        ISequentialStream *stream = NULL;
+        IXMLDOMDocument3 *newdoc = NULL;
+
         if (!V_UNKNOWN(&source)) return E_INVALIDARG;
-        hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&pNewDoc);
+
+        hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&newdoc);
         if(hr == S_OK)
         {
-            if(pNewDoc)
+            if(newdoc)
             {
-                domdoc *newDoc = impl_from_IXMLDOMDocument3( pNewDoc );
+                domdoc *newDoc = impl_from_IXMLDOMDocument3( newdoc );
 
                 xmldoc = xmlCopyDoc(get_doc(newDoc), 1);
                 xmldoc->_private = create_priv();
@@ -2122,40 +2125,25 @@ static HRESULT WINAPI domdoc_load(
                 return hr;
             }
         }
-        hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IStream, (void**)&pStream);
-        if(hr == S_OK)
-        {
-            IPersistStream *pDocStream;
-            hr = IXMLDOMDocument3_QueryInterface(iface, &IID_IPersistStream, (void**)&pDocStream);
-            if(hr == S_OK)
-            {
-                hr = IPersistStream_Load(pDocStream, pStream);
-                IStream_Release(pStream);
-                if(hr == S_OK)
-                {
-                    *isSuccessful = VARIANT_TRUE;
 
-                    TRACE("Using IStream to load Document\n");
-                    return S_OK;
-                }
-                else
-                {
-                    ERR("xmldoc_IPersistStream_Load failed (%d)\n", hr);
-                }
-            }
-            else
-            {
-                ERR("QueryInterface IID_IPersistStream failed (%d)\n", hr);
-            }
-        }
-        else
+        hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IStream, (void**)&stream);
+        if (FAILED(hr))
+            hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_ISequentialStream, (void**)&stream);
+
+        if (hr == S_OK)
         {
-            /* ISequentialStream */
-            FIXME("Unknown type not supported (0x%08x) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl);
+            hr = domdoc_load_from_stream(This, stream);
+            if (hr == S_OK)
+                *isSuccessful = VARIANT_TRUE;
+            ISequentialStream_Release(stream);
+            return hr;
         }
+
+        FIXME("unsupported IUnknown type (0x%08x) (%p)\n", hr, V_UNKNOWN(&source)->lpVtbl);
         break;
-     default:
-            FIXME("VT type not supported (%d)\n", V_VT(&source));
+    }
+    default:
+        FIXME("VT type not supported (%d)\n", V_VT(&source));
     }
 
     if ( filename )




More information about the wine-cvs mailing list