Nikolay Sivov : explorer: Added stub IServiceProvider support for shell browser window.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 4 07:58:53 CDT 2015


Module: wine
Branch: master
Commit: 3c7bf0350a1df45f6bbe52cdb631ebb6b49ca11b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3c7bf0350a1df45f6bbe52cdb631ebb6b49ca11b

Author: Nikolay Sivov <nsivov at 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)




More information about the wine-cvs mailing list