Piotr Caban : msxml3: Store current bsc in domdoc.

Alexandre Julliard julliard at winehq.org
Wed Jul 9 06:10:24 CDT 2008


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Tue Jul  8 20:55:03 2008 +0200

msxml3: Store current bsc in domdoc.

---

 dlls/msxml3/domdoc.c |   95 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 57 insertions(+), 38 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index c9734b7..9327330 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -49,13 +49,44 @@ static const WCHAR SZ_PROPERTY_SELECTION_LANGUAGE[] = {'S','e','l','e','c','t','
 static const WCHAR SZ_VALUE_XPATH[] = {'X','P','a','t','h',0};
 static const WCHAR SZ_VALUE_XSLPATTERN[] = {'X','S','L','P','a','t','t','e','r','n',0};
 
-typedef struct {
+typedef struct bsc_t bsc_t;
+
+typedef struct _domdoc
+{
+    const struct IXMLDOMDocument2Vtbl *lpVtbl;
+    const struct IPersistStreamVtbl   *lpvtblIPersistStream;
+    const struct IObjectWithSiteVtbl  *lpvtblIObjectWithSite;
+    const struct IObjectSafetyVtbl    *lpvtblIObjectSafety;
+    LONG ref;
+    VARIANT_BOOL async;
+    VARIANT_BOOL validating;
+    VARIANT_BOOL resolving;
+    VARIANT_BOOL preserving;
+    BOOL bUseXPath;
+    IUnknown *node_unk;
+    IXMLDOMNode *node;
+    IXMLDOMSchemaCollection *schema;
+    bsc_t *bsc;
+    HRESULT error;
+
+    /* IPersistStream */
+    IStream *stream;
+
+    /* IObjectWithSite*/
+    IUnknown *site;
+
+    /* IObjectSafety */
+    DWORD safeopt;
+} domdoc;
+
+struct bsc_t {
     const struct IBindStatusCallbackVtbl *lpVtbl;
 
     LONG ref;
 
+    domdoc *doc;
     IBinding *binding;
-} bsc_t;
+};
 
 static inline bsc_t *impl_from_IBindStatusCallback( IBindStatusCallback *iface )
 {
@@ -101,6 +132,8 @@ static ULONG WINAPI bsc_Release(
     if(!ref) {
         if(This->binding)
             IBinding_Release(This->binding);
+        if(This->doc && This->doc->bsc == This)
+            This->doc->bsc = NULL;
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -206,45 +239,18 @@ static const struct IBindStatusCallbackVtbl bsc_vtbl =
     bsc_OnObjectAvailable
 };
 
-static bsc_t *create_bsc(void)
+static bsc_t *create_bsc(domdoc *doc)
 {
     bsc_t *bsc = HeapAlloc(GetProcessHeap(), 0, sizeof(bsc));
 
     bsc->lpVtbl = &bsc_vtbl;
     bsc->ref = 1;
+    bsc->doc = doc;
     bsc->binding = NULL;
 
     return bsc;
 }
 
-typedef struct _domdoc
-{
-    const struct IXMLDOMDocument2Vtbl *lpVtbl;
-    const struct IPersistStreamVtbl   *lpvtblIPersistStream;
-    const struct IObjectWithSiteVtbl  *lpvtblIObjectWithSite;
-    const struct IObjectSafetyVtbl    *lpvtblIObjectSafety;
-    LONG ref;
-    VARIANT_BOOL async;
-    VARIANT_BOOL validating;
-    VARIANT_BOOL resolving;
-    VARIANT_BOOL preserving;
-    BOOL bUseXPath;
-    IUnknown *node_unk;
-    IXMLDOMNode *node;
-    IXMLDOMSchemaCollection *schema;
-    HRESULT error;
-
-     /* IPersistStream */
-     IStream *stream;
-
-     /* IObjectWithSite*/
-     IUnknown *site;
-
-     /* IObjectSafety */
-     DWORD safeopt;
-
-} domdoc;
-
 LONG xmldoc_add_ref(xmlDocPtr doc)
 {
     LONG ref = InterlockedIncrement((LONG*)&doc->_private);
@@ -481,6 +487,13 @@ static ULONG WINAPI domdoc_Release(
     ref = InterlockedDecrement( &This->ref );
     if ( ref == 0 )
     {
+        if(This->bsc) {
+            if(This->bsc->binding)
+                IBinding_Abort(This->bsc->binding);
+            This->bsc->doc = NULL;
+            IBindStatusCallback_Release((IBindStatusCallback*)&This->bsc->lpVtbl);
+        }
+
         if (This->site)
             IUnknown_Release( This->site );
         IUnknown_Release( This->node_unk );
@@ -1336,7 +1349,7 @@ static xmlDocPtr doparse( char *ptr, int len )
 #endif
 }
 
-static xmlDocPtr doread( LPWSTR filename )
+static xmlDocPtr doread( domdoc *This, LPWSTR filename )
 {
     xmlDocPtr xmldoc = NULL;
     HRESULT hr;
@@ -1345,7 +1358,6 @@ static xmlDocPtr doread( LPWSTR filename )
     WCHAR url[INTERNET_MAX_URL_LENGTH];
     BYTE buf[4096];
     DWORD read, written;
-    bsc_t *bsc;
 
     TRACE("%s\n", debugstr_w( filename ));
 
@@ -1368,12 +1380,19 @@ static xmlDocPtr doread( LPWSTR filename )
         filename = url;
     }
 
-    bsc = create_bsc();
-
     hr = CreateBindCtx(0, &pbc);
     if(SUCCEEDED(hr))
     {
-        hr = RegisterBindStatusCallback(pbc, (IBindStatusCallback*)&bsc->lpVtbl, NULL, 0);
+        if(This->bsc) {
+            if(This->bsc->binding)
+                IBinding_Abort(This->bsc->binding);
+            This->bsc->doc = NULL;
+            IBindStatusCallback_Release((IBindStatusCallback*)&This->bsc->lpVtbl);
+        }
+
+        This->bsc = create_bsc(This);
+
+        hr = RegisterBindStatusCallback(pbc, (IBindStatusCallback*)&This->bsc->lpVtbl, NULL, 0);
         if(SUCCEEDED(hr))
         {
             IMoniker *moniker;
@@ -1415,7 +1434,6 @@ static xmlDocPtr doread( LPWSTR filename )
             GlobalUnlock(hglobal);
         }
     }
-    IBindStatusCallback_Release((IBindStatusCallback*)&bsc->lpVtbl);
     IStream_Release(memstream);
     IStream_Release(stream);
     return xmldoc;
@@ -1501,7 +1519,7 @@ static HRESULT WINAPI domdoc_load(
 
     if ( filename )
     {
-        xmldoc = doread( filename );
+        xmldoc = doread( This, filename );
     
         if ( !xmldoc )
             This->error = E_FAIL;
@@ -2195,6 +2213,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
     doc->stream = NULL;
     doc->site = NULL;
     doc->safeopt = 0;
+    doc->bsc = NULL;
 
     xmldoc = xmlNewDoc(NULL);
     if(!xmldoc)




More information about the wine-cvs mailing list