Nikolay Sivov : msxml3: Move document loading from stream to a separate function.

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


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

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

msxml3: Move document loading from stream to a separate function.

---

 dlls/msxml3/domdoc.c |   49 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index d1e0ebb..16fc64c 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -718,46 +718,45 @@ static HRESULT WINAPI PersistStreamInit_IsDirty(
     return S_FALSE;
 }
 
-static HRESULT WINAPI PersistStreamInit_Load(
-    IPersistStreamInit *iface, LPSTREAM pStm)
+static HRESULT domdoc_load_from_stream(domdoc *doc, ISequentialStream *stream)
 {
-    domdoc *This = impl_from_IPersistStreamInit(iface);
-    HRESULT hr;
-    HGLOBAL hglobal;
     DWORD read, written, len;
+    xmlDocPtr xmldoc = NULL;
+    HGLOBAL hglobal;
     BYTE buf[4096];
+    HRESULT hr;
     char *ptr;
-    xmlDocPtr xmldoc = NULL;
-
-    TRACE("(%p)->(%p)\n", This, pStm);
 
-    if (!pStm)
-        return E_INVALIDARG;
+    if (doc->stream)
+    {
+        IStream_Release(doc->stream);
+        doc->stream = NULL;
+    }
 
-    hr = CreateStreamOnHGlobal(NULL, TRUE, &This->stream);
+    hr = CreateStreamOnHGlobal(NULL, TRUE, &doc->stream);
     if (FAILED(hr))
         return hr;
 
     do
     {
-        IStream_Read(pStm, buf, sizeof(buf), &read);
-        hr = IStream_Write(This->stream, buf, read, &written);
+        ISequentialStream_Read(stream, buf, sizeof(buf), &read);
+        hr = IStream_Write(doc->stream, buf, read, &written);
     } while(SUCCEEDED(hr) && written != 0 && read != 0);
 
     if (FAILED(hr))
     {
-        ERR("Failed to copy stream\n");
+        ERR("failed to copy stream 0x%08x\n", hr);
         return hr;
     }
 
-    hr = GetHGlobalFromStream(This->stream, &hglobal);
+    hr = GetHGlobalFromStream(doc->stream, &hglobal);
     if (FAILED(hr))
         return hr;
 
     len = GlobalSize(hglobal);
     ptr = GlobalLock(hglobal);
-    if (len != 0)
-        xmldoc = doparse(This, ptr, len, XML_CHAR_ENCODING_NONE);
+    if (len)
+        xmldoc = doparse(doc, ptr, len, XML_CHAR_ENCODING_NONE);
     GlobalUnlock(hglobal);
 
     if (!xmldoc)
@@ -768,7 +767,19 @@ static HRESULT WINAPI PersistStreamInit_Load(
 
     xmldoc->_private = create_priv();
 
-    return attach_xmldoc(This, xmldoc);
+    return attach_xmldoc(doc, xmldoc);
+}
+
+static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream)
+{
+    domdoc *This = impl_from_IPersistStreamInit(iface);
+
+    TRACE("(%p)->(%p)\n", This, stream);
+
+    if (!stream)
+        return E_INVALIDARG;
+
+    return domdoc_load_from_stream(This, (ISequentialStream*)stream);
 }
 
 static HRESULT WINAPI PersistStreamInit_Save(
@@ -2140,7 +2151,7 @@ static HRESULT WINAPI domdoc_load(
         else
         {
             /* ISequentialStream */
-            FIXME("Unknown type not supported (%d) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl);
+            FIXME("Unknown type not supported (0x%08x) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl);
         }
         break;
      default:




More information about the wine-cvs mailing list