From dcbfd3d0a5a0be164e0faab932a0fd6afc3d25ec Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 6 Jan 2012 13:00:22 +0100 Subject: [PATCH] ieframe: Added INewWindowManager stub implementation. --- dlls/ieframe/client.c | 5 ++++ dlls/ieframe/dochost.c | 1 + dlls/ieframe/ieframe.h | 7 +++++ dlls/ieframe/shellbrowser.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/dlls/ieframe/client.c b/dlls/ieframe/client.c index d74a303b10e..6a567ae5cb5 100644 --- a/dlls/ieframe/client.c +++ b/dlls/ieframe/client.c @@ -685,6 +685,11 @@ static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, RE return IShellBrowser_QueryInterface(&This->browser_service->IShellBrowser_iface, riid, ppv); } + if(IsEqualGUID(&SID_SNewWindowManager, guidService)) { + TRACE("SID_SNewWindowManager service\n"); + return INewWindowManager_QueryInterface(&This->nwm.INewWindowManager_iface, riid, ppv); + } + FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); return E_NOINTERFACE; diff --git a/dlls/ieframe/dochost.c b/dlls/ieframe/dochost.c index 3585eb99d3c..ebc5978024e 100644 --- a/dlls/ieframe/dochost.c +++ b/dlls/ieframe/dochost.c @@ -888,6 +888,7 @@ void DocHost_Init(DocHost *This, IDispatch *disp, const IDocHostContainerVtbl* c ConnectionPointContainer_Init(&This->cps, (IUnknown*)disp); IEHTMLWindow_Init(This); + NewWindowManager_Init(This); } void DocHost_Release(DocHost *This) diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h index 5f4de0ddb0f..b7a7b02eefb 100644 --- a/dlls/ieframe/ieframe.h +++ b/dlls/ieframe/ieframe.h @@ -89,6 +89,11 @@ typedef struct { DocHost *doc_host; } IEHTMLWindow; +typedef struct { + INewWindowManager INewWindowManager_iface; + DocHost *doc_host; +} NewWindowManager; + typedef struct _IDocHostContainerVtbl { ULONG (*addref)(DocHost*); @@ -145,6 +150,7 @@ struct DocHost { ConnectionPointContainer cps; IEHTMLWindow html_window; + NewWindowManager nwm; }; struct WebBrowser { @@ -233,6 +239,7 @@ void DocHost_Frame_Init(DocHost*) DECLSPEC_HIDDEN; void release_dochost_client(DocHost*) DECLSPEC_HIDDEN; void IEHTMLWindow_Init(DocHost*) DECLSPEC_HIDDEN; +void NewWindowManager_Init(DocHost*) DECLSPEC_HIDDEN; void HlinkFrame_Init(HlinkFrame*,IUnknown*,DocHost*) DECLSPEC_HIDDEN; BOOL HlinkFrame_QI(HlinkFrame*,REFIID,void**) DECLSPEC_HIDDEN; diff --git a/dlls/ieframe/shellbrowser.c b/dlls/ieframe/shellbrowser.c index 00ba786e8b4..b97f3f9d63f 100644 --- a/dlls/ieframe/shellbrowser.c +++ b/dlls/ieframe/shellbrowser.c @@ -2,6 +2,7 @@ * Implementation of IShellBrowser interface * * Copyright 2011 Piotr Caban for CodeWeavers + * Copyright 2012 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -913,3 +914,69 @@ void detach_browser_service(ShellBrowser *sb) sb->doc_host = NULL; IShellBrowser_Release(&sb->IShellBrowser_iface); } + +static inline NewWindowManager *impl_from_INewWindowManager(INewWindowManager *iface) +{ + return CONTAINING_RECORD(iface, NewWindowManager, INewWindowManager_iface); +} + +static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv) +{ + NewWindowManager *This = impl_from_INewWindowManager(iface); + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = &This->INewWindowManager_iface; + }else if(IsEqualGUID(&IID_INewWindowManager, riid)) { + TRACE("(%p)->(IID_INewWindowManager %p)\n", This, ppv); + *ppv = &This->INewWindowManager_iface; + }else { + WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface) +{ + NewWindowManager *This = impl_from_INewWindowManager(iface); + + TRACE("(%p)\n", This); + + return IOleClientSite_AddRef(&This->doc_host->IOleClientSite_iface); +} + +static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface) +{ + NewWindowManager *This = impl_from_INewWindowManager(iface); + + TRACE("(%p)\n", This); + + return IOleClientSite_Release(&This->doc_host->IOleClientSite_iface); +} + +static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl, + LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags, + DWORD dwUserActionTime) +{ + NewWindowManager *This = impl_from_INewWindowManager(iface); + FIXME("(%p)->(%s %s %s %s %x %x %d)\n", This, debugstr_w(pszUrl), debugstr_w(pszName), debugstr_w(pszUrlContext), + debugstr_w(pszFeatures), fReplace, dwFlags, dwUserActionTime); + return S_OK; +} + +static const INewWindowManagerVtbl NewWindowManagerVtbl = { + NewWindowManager_QueryInterface, + NewWindowManager_AddRef, + NewWindowManager_Release, + NewWindowManager_EvaluateNewWindow +}; + +void NewWindowManager_Init(DocHost *doc_host) +{ + doc_host->nwm.INewWindowManager_iface.lpVtbl = &NewWindowManagerVtbl; + doc_host->nwm.doc_host = doc_host; +} -- 2.11.4.GIT