Jacek Caban : shdocvw: Use more flexible mechanism instead of WB_WM_NAVIGATE2.
Alexandre Julliard
julliard at winehq.org
Mon Jan 21 05:58:52 CST 2008
Module: wine
Branch: master
Commit: 1a7bf2e0fff0ecde25be2d9fb06f911f709d834b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1a7bf2e0fff0ecde25be2d9fb06f911f709d834b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Jan 18 21:53:25 2008 +0100
shdocvw: Use more flexible mechanism instead of WB_WM_NAVIGATE2.
---
dlls/shdocvw/dochost.c | 33 ++++++++++++++++++++++++++-------
dlls/shdocvw/iexplore.c | 2 ++
dlls/shdocvw/navigate.c | 9 ++++++++-
dlls/shdocvw/oleobject.c | 2 ++
dlls/shdocvw/shdocvw.h | 20 ++++++++++++++++----
5 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c
index f64ae09..c3a22f4 100644
--- a/dlls/shdocvw/dochost.c
+++ b/dlls/shdocvw/dochost.c
@@ -25,6 +25,27 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
static ATOM doc_view_atom = 0;
+void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, BOOL send)
+{
+ task->proc = proc;
+
+ /* FIXME: Don't use lParam */
+ if(send)
+ SendMessageW(This->frame_hwnd, WM_DOCHOSTTASK, 0, (LPARAM)task);
+ else
+ PostMessageW(This->frame_hwnd, WM_DOCHOSTTASK, 0, (LPARAM)task);
+}
+
+LRESULT process_dochost_task(DocHost *This, LPARAM lparam)
+{
+ task_header_t *task = (task_header_t*)lparam;
+
+ task->proc(This, task);
+
+ heap_free(task);
+ return 0;
+}
+
static void navigate_complete(DocHost *This)
{
IDispatch *disp = NULL;
@@ -59,7 +80,7 @@ static void navigate_complete(DocHost *This)
IDispatch_Release(disp);
}
-static LRESULT navigate2(DocHost *This)
+void object_available(DocHost *This)
{
IHlinkTarget *hlink;
HRESULT hres;
@@ -68,25 +89,25 @@ static LRESULT navigate2(DocHost *This)
if(!This->document) {
WARN("document == NULL\n");
- return 0;
+ return;
}
hres = IUnknown_QueryInterface(This->document, &IID_IHlinkTarget, (void**)&hlink);
if(FAILED(hres)) {
FIXME("Could not get IHlinkTarget interface\n");
- return 0;
+ return;
}
hres = IHlinkTarget_Navigate(hlink, 0, NULL);
IHlinkTarget_Release(hlink);
if(FAILED(hres)) {
FIXME("Navigate failed\n");
- return 0;
+ return;
}
navigate_complete(This);
- return 0;
+ return;
}
static LRESULT resize_document(DocHost *This, LONG width, LONG height)
@@ -117,8 +138,6 @@ static LRESULT WINAPI doc_view_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM l
switch(msg) {
case WM_SIZE:
return resize_document(This, LOWORD(lParam), HIWORD(lParam));
- case WB_WM_NAVIGATE2:
- return navigate2(This);
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c
index e6387d5..ca2c868 100644
--- a/dlls/shdocvw/iexplore.c
+++ b/dlls/shdocvw/iexplore.c
@@ -77,6 +77,8 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
return iewnd_OnDestroy(This);
case WM_SIZE:
return iewnd_OnSize(This, LOWORD(lparam), HIWORD(lparam));
+ case WM_DOCHOSTTASK:
+ return process_dochost_task(&This->doc_host, lparam);
}
return DefWindowProcW(hwnd, msg, wparam, lparam);
}
diff --git a/dlls/shdocvw/navigate.c b/dlls/shdocvw/navigate.c
index 37245f7..4bf21a5 100644
--- a/dlls/shdocvw/navigate.c
+++ b/dlls/shdocvw/navigate.c
@@ -269,10 +269,16 @@ static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallback *if
return E_NOTIMPL;
}
+static void object_available_proc(DocHost *This, task_header_t *task)
+{
+ object_available(This);
+}
+
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface,
REFIID riid, IUnknown *punk)
{
BindStatusCallback *This = BINDSC_THIS(iface);
+ task_header_t *task;
IOleObject *oleobj;
HRESULT hres;
@@ -302,7 +308,8 @@ static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *
/* FIXME: Call SetAdvise */
/* FIXME: Call Invoke(DISPID_READYSTATE) */
- PostMessageW(This->doc_host->hwnd, WB_WM_NAVIGATE2, 0, 0);
+ task = heap_alloc(sizeof(*task));
+ push_dochost_task(This->doc_host, task, object_available_proc, FALSE);
return S_OK;
}
diff --git a/dlls/shdocvw/oleobject.c b/dlls/shdocvw/oleobject.c
index f07460f..8d05b77 100644
--- a/dlls/shdocvw/oleobject.c
+++ b/dlls/shdocvw/oleobject.c
@@ -61,6 +61,8 @@ static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, L
switch(msg) {
case WM_SIZE:
return resize_window(This, LOWORD(lParam), HIWORD(lParam));
+ case WM_DOCHOSTTASK:
+ return process_dochost_task(&This->doc_host, lParam);
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
index 5b9ed46..bc4c2a1 100644
--- a/dlls/shdocvw/shdocvw.h
+++ b/dlls/shdocvw/shdocvw.h
@@ -51,6 +51,7 @@ extern HRESULT SHDOCVW_GetShellInstanceObjectClassObject(REFCLSID rclsid,
*/
typedef struct ConnectionPoint ConnectionPoint;
+typedef struct DocHost DocHost;
typedef struct {
const IConnectionPointContainerVtbl *lpConnectionPointContainerVtbl;
@@ -62,7 +63,15 @@ typedef struct {
IUnknown *impl;
} ConnectionPointContainer;
-typedef struct {
+struct _task_header_t;
+
+typedef void (*task_proc_t)(DocHost*, struct _task_header_t*);
+
+typedef struct _task_header_t {
+ task_proc_t proc;
+} task_header_t;
+
+struct DocHost {
const IOleClientSiteVtbl *lpOleClientSiteVtbl;
const IOleInPlaceSiteVtbl *lpOleInPlaceSiteVtbl;
const IDocHostUIHandler2Vtbl *lpDocHostUIHandlerVtbl;
@@ -92,7 +101,7 @@ typedef struct {
VARIANT_BOOL offline;
ConnectionPointContainer cps;
-} DocHost;
+};
struct WebBrowser {
/* Interfaces available via WebBrowser object */
@@ -198,17 +207,20 @@ HRESULT WebBrowserV2_Create(IUnknown*,REFIID,void**);
void create_doc_view_hwnd(DocHost*);
void deactivate_document(DocHost*);
+void object_available(DocHost*);
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*);
HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*);
HRESULT go_home(DocHost*);
+#define WM_DOCHOSTTASK (WM_USER+0x300)
+void push_dochost_task(DocHost*,task_header_t*,task_proc_t,BOOL);
+LRESULT process_dochost_task(DocHost*,LPARAM);
+
HRESULT InternetExplorer_Create(IUnknown*,REFIID,void**);
void InternetExplorer_WebBrowser_Init(InternetExplorer*);
HRESULT CUrlHistory_Create(IUnknown*,REFIID,void**);
-#define WB_WM_NAVIGATE2 (WM_USER+100)
-
#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
/**********************************************************************
More information about the wine-cvs
mailing list