Module: wine Branch: master Commit: 2cbd6a63dfb39052cd454ed3d67483885390ddaf URL: http://source.winehq.org/git/wine.git/?a=commit;h=2cbd6a63dfb39052cd454ed3d6...
Author: Piotr Caban piotr@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;