Piotr Caban : msxml3: Added internal function for loading xml from IMoniker .

Alexandre Julliard julliard at winehq.org
Mon Mar 12 11:59:58 CDT 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Mar 12 10:56:59 2012 +0100

msxml3: Added internal function for loading xml from IMoniker.

---

 dlls/msxml3/bsc.c           |   32 +++++++++++++++++---------------
 dlls/msxml3/domdoc.c        |   14 +++++++++++---
 dlls/msxml3/msxml_private.h |    4 +++-
 dlls/msxml3/saxreader.c     |   10 ++++++++--
 4 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/dlls/msxml3/bsc.c b/dlls/msxml3/bsc.c
index a0b9022..580d509 100644
--- a/dlls/msxml3/bsc.c
+++ b/dlls/msxml3/bsc.c
@@ -242,12 +242,9 @@ static const struct IBindStatusCallbackVtbl bsc_vtbl =
     bsc_OnObjectAvailable
 };
 
-HRESULT bind_url(LPCWSTR url, HRESULT (*onDataAvailable)(void*,char*,DWORD), void *obj, bsc_t **ret)
+HRESULT create_moniker_from_url(LPCWSTR url, IMoniker **mon)
 {
     WCHAR fileUrl[INTERNET_MAX_URL_LENGTH];
-    bsc_t *bsc;
-    IBindCtx *pbc;
-    HRESULT hr;
 
     TRACE("%s\n", debugstr_w(url));
 
@@ -270,6 +267,18 @@ HRESULT bind_url(LPCWSTR url, HRESULT (*onDataAvailable)(void*,char*,DWORD), voi
         url = fileUrl;
     }
 
+    return CreateURLMonikerEx(NULL, url, mon, 0);
+}
+
+HRESULT bind_url(IMoniker *mon, HRESULT (*onDataAvailable)(void*,char*,DWORD),
+        void *obj, bsc_t **ret)
+{
+    bsc_t *bsc;
+    IBindCtx *pbc;
+    HRESULT hr;
+
+    TRACE("%p\n", mon);
+
     hr = CreateBindCtx(0, &pbc);
     if(FAILED(hr))
         return hr;
@@ -287,17 +296,10 @@ HRESULT bind_url(LPCWSTR url, HRESULT (*onDataAvailable)(void*,char*,DWORD), voi
     hr = RegisterBindStatusCallback(pbc, &bsc->IBindStatusCallback_iface, NULL, 0);
     if(SUCCEEDED(hr))
     {
-        IMoniker *moniker;
-
-        hr = CreateURLMoniker(NULL, url, &moniker);
-        if(SUCCEEDED(hr))
-        {
-            IStream *stream;
-            hr = IMoniker_BindToStorage(moniker, pbc, NULL, &IID_IStream, (LPVOID*)&stream);
-            IMoniker_Release(moniker);
-            if(stream)
-                IStream_Release(stream);
-        }
+        IStream *stream;
+        hr = IMoniker_BindToStorage(mon, pbc, NULL, &IID_IStream, (LPVOID*)&stream);
+        if(stream)
+            IStream_Release(stream);
         IBindCtx_Release(pbc);
     }
 
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 64122ce..22a4191 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1996,12 +1996,13 @@ static HRESULT domdoc_onDataAvailable(void *obj, char *ptr, DWORD len)
     return S_OK;
 }
 
-static HRESULT doread( domdoc *This, LPWSTR filename )
+HRESULT domdoc_load_moniker(IXMLDOMDocument3 *iface, IMoniker *mon)
 {
+    domdoc *This = impl_from_IXMLDOMDocument3(iface);
     bsc_t *bsc;
     HRESULT hr;
 
-    hr = bind_url(filename, domdoc_onDataAvailable, This, &bsc);
+    hr = bind_url(mon, domdoc_onDataAvailable, This, &bsc);
     if(FAILED(hr))
         return hr;
 
@@ -2145,7 +2146,14 @@ static HRESULT WINAPI domdoc_load(
 
     if ( filename )
     {
-        hr = doread( This, filename );
+        IMoniker *mon;
+
+        hr = create_moniker_from_url( filename, &mon);
+        if ( SUCCEEDED(hr) )
+        {
+            hr = domdoc_load_moniker( iface, mon );
+            IMoniker_Release(mon);
+        }
 
         if ( FAILED(hr) )
             This->error = E_FAIL;
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 2e647d0..0bb243f 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -487,8 +487,10 @@ static inline const CLSID* SchemaCache_version(MSXML_VERSION v)
 
 typedef struct bsc_t bsc_t;
 
-HRESULT bind_url(LPCWSTR, HRESULT (*onDataAvailable)(void*,char*,DWORD), void*, bsc_t**) DECLSPEC_HIDDEN;
+HRESULT create_moniker_from_url(LPCWSTR, IMoniker**) DECLSPEC_HIDDEN;
+HRESULT bind_url(IMoniker*, HRESULT (*onDataAvailable)(void*,char*,DWORD), void*, bsc_t**) DECLSPEC_HIDDEN;
 HRESULT detach_bsc(bsc_t*) DECLSPEC_HIDDEN;
+HRESULT domdoc_load_moniker(IXMLDOMDocument3*, IMoniker*) DECLSPEC_HIDDEN;
 
 const char *debugstr_variant(const VARIANT*) DECLSPEC_HIDDEN;
 
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index b1508ca..0a2f346 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -2423,13 +2423,19 @@ static HRESULT internal_parseURL(
         const WCHAR *url,
         BOOL vbInterface)
 {
+    IMoniker *mon;
     bsc_t *bsc;
     HRESULT hr;
 
     TRACE("(%p)->(%s)\n", This, debugstr_w(url));
 
-    if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
-    else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
+    hr = create_moniker_from_url(url, &mon);
+    if(FAILED(hr))
+        return hr;
+
+    if(vbInterface) hr = bind_url(mon, internal_vbonDataAvailable, This, &bsc);
+    else hr = bind_url(mon, internal_onDataAvailable, This, &bsc);
+    IMoniker_Release(mon);
 
     if(FAILED(hr))
         return hr;




More information about the wine-cvs mailing list