Module: wine Branch: master Commit: f89ac6fa0d053bef5b7aa6f31fb8b87405ecc04b URL: http://source.winehq.org/git/wine.git/?a=commit;h=f89ac6fa0d053bef5b7aa6f31f...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Nov 12 14:30:03 2010 +0100
shdocvw: Added DocHost::Exec(OLECMDID_UPDATECOMMANDS) implementation.
---
dlls/shdocvw/dochost.c | 10 ++++++++-- dlls/shdocvw/iexplore.c | 8 +++++++- dlls/shdocvw/shdocvw.h | 1 + dlls/shdocvw/webbrowser.c | 37 ++++++++++++++++++++++++++++++++++++- 4 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c index edf569e..f74d064 100644 --- a/dlls/shdocvw/dochost.c +++ b/dlls/shdocvw/dochost.c @@ -447,8 +447,14 @@ static HRESULT WINAPI ClOleCommandTarget_Exec(IOleCommandTarget *iface, nCmdexecopt, debugstr_variant(pvaIn), debugstr_variant(pvaOut));
if(!pguidCmdGroup) { - FIXME("Unimplemented cmdid %d\n", nCmdID); - return E_NOTIMPL; + switch(nCmdID) { + case OLECMDID_UPDATECOMMANDS: + return This->container_vtbl->exec(This, pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); + default: + FIXME("Unimplemented cmdid %d\n", nCmdID); + return E_NOTIMPL; + } + return S_OK; }
if(IsEqualGUID(pguidCmdGroup, &CGID_DocHostCmdPriv)) { diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c index 3991f57..a0d2684 100644 --- a/dlls/shdocvw/iexplore.c +++ b/dlls/shdocvw/iexplore.c @@ -739,10 +739,16 @@ static void WINAPI DocHostContainer_SetURL(DocHost* This, LPCWSTR url) SendMessageW(This->frame_hwnd, WM_UPDATEADDRBAR, 0, (LPARAM)url); }
+static HRESULT DocHostContainer_exec(DocHost* This, const GUID *cmd_group, DWORD cmdid, DWORD execopt, VARIANT *in, + VARIANT *out) +{ + return S_OK; +} static const IDocHostContainerVtbl DocHostContainerVtbl = { DocHostContainer_GetDocObjRect, DocHostContainer_SetStatusText, - DocHostContainer_SetURL + DocHostContainer_SetURL, + DocHostContainer_exec };
HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv) diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index 4f3425d..61dc63f 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -89,6 +89,7 @@ typedef struct _IDocHostContainerVtbl void (WINAPI* GetDocObjRect)(DocHost*,RECT*); HRESULT (WINAPI* SetStatusText)(DocHost*,LPCWSTR); void (WINAPI* SetURL)(DocHost*,LPCWSTR); + HRESULT (*exec)(DocHost*,const GUID*,DWORD,DWORD,VARIANT*,VARIANT*); } IDocHostContainerVtbl;
struct DocHost { diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c index ef46236..ac45d85 100644 --- a/dlls/shdocvw/webbrowser.c +++ b/dlls/shdocvw/webbrowser.c @@ -1135,6 +1135,8 @@ static const IServiceProviderVtbl ServiceProviderVtbl = WebBrowser_IServiceProvider_QueryService };
+#define DOCHOST_THIS(iface) DEFINE_THIS2(WebBrowser,doc_host,iface) + static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc) { GetClientRect(This->frame_hwnd, rc); @@ -1150,10 +1152,43 @@ static void WINAPI DocHostContainer_SetURL(DocHost* This, LPCWSTR url)
}
+static HRESULT DocHostContainer_exec(DocHost *doc_host, const GUID *cmd_group, DWORD cmdid, DWORD execopt, VARIANT *in, + VARIANT *out) +{ + WebBrowser *This = DOCHOST_THIS(doc_host); + IOleCommandTarget *cmdtrg = NULL; + HRESULT hres; + + if(This->client) { + hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&cmdtrg); + if(FAILED(hres)) + cmdtrg = NULL; + } + + if(!cmdtrg && This->container) { + hres = IOleContainer_QueryInterface(This->container, &IID_IOleCommandTarget, (void**)&cmdtrg); + if(FAILED(hres)) + cmdtrg = NULL; + } + + if(!cmdtrg) + return S_OK; + + hres = IOleCommandTarget_Exec(cmdtrg, cmd_group, cmdid, execopt, in, out); + IOleCommandTarget_Release(cmdtrg); + if(FAILED(hres)) + FIXME("Exec failed\n"); + + return hres; +} + +#undef DOCHOST_THIS + static const IDocHostContainerVtbl DocHostContainerVtbl = { DocHostContainer_GetDocObjRect, DocHostContainer_SetStatusText, - DocHostContainer_SetURL + DocHostContainer_SetURL, + DocHostContainer_exec };
static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, void **ppv)