Jacek Caban : ieframe: Store ShellBrowser in DocHost instead of creating it on every QueryService call .

Alexandre Julliard julliard at winehq.org
Tue Nov 15 13:17:32 CST 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Nov 15 13:28:15 2011 +0100

ieframe: Store ShellBrowser in DocHost instead of creating it on every QueryService call.

---

 dlls/ieframe/client.c       |   19 ++++++++++---------
 dlls/ieframe/ieframe.h      |   17 ++++++++++++++++-
 dlls/ieframe/shellbrowser.c |   32 ++++++++++++++++----------------
 dlls/ieframe/webbrowser.c   |    1 -
 4 files changed, 42 insertions(+), 27 deletions(-)

diff --git a/dlls/ieframe/client.c b/dlls/ieframe/client.c
index 970e28d..d74a303 100644
--- a/dlls/ieframe/client.c
+++ b/dlls/ieframe/client.c
@@ -672,18 +672,17 @@ static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, RE
     }
 
     if(IsEqualGUID(&IID_IShellBrowser, guidService)) {
-        IShellBrowser *sb;
-        HRESULT hres;
-
         TRACE("(%p)->(IID_IShellBrowser %s %p)\n", This, debugstr_guid(riid), ppv);
 
-        hres = ShellBrowser_Create(&sb);
-        if(FAILED(hres))
-            return hres;
+        if(!This->browser_service) {
+            HRESULT hres;
 
-        hres = IShellBrowser_QueryInterface(sb, riid, ppv);
-        IShellBrowser_Release(sb);
-        return hres;
+            hres = create_browser_service(This, &This->browser_service);
+            if(FAILED(hres))
+                return hres;
+        }
+
+        return IShellBrowser_QueryInterface(&This->browser_service->IShellBrowser_iface, riid, ppv);
     }
 
     FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
@@ -710,6 +709,8 @@ void DocHost_ClientSite_Init(DocHost *This)
 
 void DocHost_ClientSite_Release(DocHost *This)
 {
+    if(This->browser_service)
+        detach_browser_service(This->browser_service);
     if(This->view)
         IOleDocumentView_Release(This->view);
 }
diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h
index 89f69fa..d81e166 100644
--- a/dlls/ieframe/ieframe.h
+++ b/dlls/ieframe/ieframe.h
@@ -35,6 +35,8 @@
 #include "exdisp.h"
 #include "hlink.h"
 #include "htiframe.h"
+#include "shdeprecated.h"
+#include "docobjectservice.h"
 
 #include "wine/unicode.h"
 #include "wine/list.h"
@@ -71,6 +73,16 @@ typedef struct _task_header_t {
     task_destr_t destr;
 } task_header_t;
 
+typedef struct {
+    IShellBrowser IShellBrowser_iface;
+    IBrowserService IBrowserService_iface;
+    IDocObjectService IDocObjectService_iface;
+
+    LONG ref;
+
+    DocHost *doc_host;
+}  ShellBrowser;
+
 typedef struct _IDocHostContainerVtbl
 {
     ULONG (*addref)(DocHost*);
@@ -123,6 +135,8 @@ struct DocHost {
     DWORD prop_notif_cookie;
     BOOL is_prop_notif;
 
+    ShellBrowser *browser_service;
+
     ConnectionPointContainer cps;
 };
 
@@ -213,7 +227,8 @@ void release_dochost_client(DocHost*) DECLSPEC_HIDDEN;
 void HlinkFrame_Init(HlinkFrame*,IUnknown*,DocHost*) DECLSPEC_HIDDEN;
 BOOL HlinkFrame_QI(HlinkFrame*,REFIID,void**) DECLSPEC_HIDDEN;
 
-HRESULT ShellBrowser_Create(IShellBrowser**) DECLSPEC_HIDDEN;
+HRESULT create_browser_service(DocHost*,ShellBrowser**) DECLSPEC_HIDDEN;
+void detach_browser_service(ShellBrowser*) DECLSPEC_HIDDEN;
 
 void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*) DECLSPEC_HIDDEN;
 void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN;
diff --git a/dlls/ieframe/shellbrowser.c b/dlls/ieframe/shellbrowser.c
index c3ff6c8..be15613 100644
--- a/dlls/ieframe/shellbrowser.c
+++ b/dlls/ieframe/shellbrowser.c
@@ -18,23 +18,14 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include "ieframe.h"
+#include <assert.h>
 
-#include "shdeprecated.h"
-#include "docobjectservice.h"
+#include "ieframe.h"
 
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
 
-typedef struct {
-    IShellBrowser IShellBrowser_iface;
-    IBrowserService IBrowserService_iface;
-    IDocObjectService IDocObjectService_iface;
-
-    LONG ref;
-} ShellBrowser;
-
 static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface)
 {
     return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface);
@@ -77,16 +68,18 @@ static ULONG WINAPI ShellBrowser_AddRef(
     return ref;
 }
 
-static ULONG WINAPI ShellBrowser_Release(
-        IShellBrowser* iface)
+static ULONG WINAPI ShellBrowser_Release(IShellBrowser* iface)
 {
     ShellBrowser *This = impl_from_IShellBrowser(iface);
     LONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p) ref=%d\n", This, ref);
 
-    if(!ref)
+    if(!ref) {
+        assert(!This->doc_host);
         heap_free(This);
+    }
+
     return ref;
 }
 
@@ -759,7 +752,7 @@ static const IDocObjectServiceVtbl DocObjectServiceVtbl = {
     DocObjectService_IsErrorUrl
 };
 
-HRESULT ShellBrowser_Create(IShellBrowser **ppv)
+HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret)
 {
     ShellBrowser *sb;
 
@@ -772,7 +765,14 @@ HRESULT ShellBrowser_Create(IShellBrowser **ppv)
     sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl;
 
     sb->ref = 1;
+    sb->doc_host = doc_host;
 
-    *ppv = &sb->IShellBrowser_iface;
+    *ret = sb;
     return S_OK;
 }
+
+void detach_browser_service(ShellBrowser *sb)
+{
+    sb->doc_host = NULL;
+    IShellBrowser_Release(&sb->IShellBrowser_iface);
+}
diff --git a/dlls/ieframe/webbrowser.c b/dlls/ieframe/webbrowser.c
index d1004df..706600d 100644
--- a/dlls/ieframe/webbrowser.c
+++ b/dlls/ieframe/webbrowser.c
@@ -23,7 +23,6 @@
 
 #include "exdispid.h"
 #include "mshtml.h"
-#include "shdeprecated.h"
 
 #include "wine/debug.h"
 




More information about the wine-cvs mailing list