Module: wine Branch: master Commit: 3c7bf0350a1df45f6bbe52cdb631ebb6b49ca11b URL: http://source.winehq.org/git/wine.git/?a=commit;h=3c7bf0350a1df45f6bbe52cdb6...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Apr 30 12:00:54 2015 +0300
explorer: Added stub IServiceProvider support for shell browser window.
---
dlls/shell32/tests/shelldispatch.c | 6 +++--- programs/explorer/desktop.c | 44 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c index 3d238f0..84d6246 100644 --- a/dlls/shell32/tests/shelldispatch.c +++ b/dlls/shell32/tests/shelldispatch.c @@ -572,12 +572,12 @@ if (hr == S_OK) { ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
hr = IDispatch_QueryInterface(disp, &IID_IServiceProvider, (void**)&sp); -todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); -if (hr == S_OK) { + hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&sb); +todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); - +if (hr == S_OK) { hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&sb2); ok(hr == S_OK, "got 0x%08x\n", hr); ok(sb == sb2, "got %p, %p\n", sb, sb2); diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c index 62a07f4..4c7bcd4 100644 --- a/programs/explorer/desktop.c +++ b/programs/explorer/desktop.c @@ -139,6 +139,7 @@ struct shellwindows struct shellbrowserwindow { IWebBrowser2 IWebBrowser2_iface; + IServiceProvider IServiceProvider_iface; };
static struct shellwindows shellwindows; @@ -154,6 +155,11 @@ static inline struct shellbrowserwindow *impl_from_IWebBrowser2(IWebBrowser2 *if return CONTAINING_RECORD(iface, struct shellbrowserwindow, IWebBrowser2_iface); }
+static inline struct shellbrowserwindow *impl_from_IServiceProvider(IServiceProvider *iface) +{ + return CONTAINING_RECORD(iface, struct shellbrowserwindow, IServiceProvider_iface); +} + static void shellwindows_init(void); static void desktopshellbrowserwindow_init(void);
@@ -1281,6 +1287,10 @@ static HRESULT WINAPI webbrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid { *ppv = &This->IWebBrowser2_iface; } + else if (IsEqualGUID(&IID_IServiceProvider, riid)) + { + *ppv = &This->IServiceProvider_iface; + }
if (*ppv) { @@ -1908,9 +1918,43 @@ static const IWebBrowser2Vtbl webbrowser2vtbl = webbrowser_put_Resizable };
+static HRESULT WINAPI serviceprovider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv) +{ + struct shellbrowserwindow *This = impl_from_IServiceProvider(iface); + return IWebBrowser2_QueryInterface(&This->IWebBrowser2_iface, riid, ppv); +} + +static ULONG WINAPI serviceprovider_AddRef(IServiceProvider *iface) +{ + struct shellbrowserwindow *This = impl_from_IServiceProvider(iface); + return IWebBrowser2_AddRef(&This->IWebBrowser2_iface); +} + +static ULONG WINAPI serviceprovider_Release(IServiceProvider *iface) +{ + struct shellbrowserwindow *This = impl_from_IServiceProvider(iface); + return IWebBrowser2_Release(&This->IWebBrowser2_iface); +} + +static HRESULT WINAPI serviceprovider_QueryService(IServiceProvider *iface, REFGUID service, + REFIID riid, void **ppv) +{ + FIXME("%s %s %p\n", debugstr_guid(service), debugstr_guid(riid), ppv); + return E_NOTIMPL; +} + +static const IServiceProviderVtbl serviceprovidervtbl = +{ + serviceprovider_QueryInterface, + serviceprovider_AddRef, + serviceprovider_Release, + serviceprovider_QueryService +}; + static void desktopshellbrowserwindow_init(void) { desktopshellbrowserwindow.IWebBrowser2_iface.lpVtbl = &webbrowser2vtbl; + desktopshellbrowserwindow.IServiceProvider_iface.lpVtbl = &serviceprovidervtbl; }
static void shellwindows_init(void)