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