Nikolay Sivov : explorer: Return IShellBrowser in response to SID_STopLevelBrowser.

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


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Apr 30 13:07:45 2015 +0300

explorer: Return IShellBrowser in response to SID_STopLevelBrowser.

---

 dlls/shell32/tests/shelldispatch.c |  21 ++++-
 programs/explorer/desktop.c        | 166 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 183 insertions(+), 4 deletions(-)

diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index 84d6246..ba246f1 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -575,12 +575,28 @@ if (hr == S_OK) {
         ok(hr == S_OK, "got 0x%08x\n", hr);
 
         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);
+
+        hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IOleWindow, (void**)&unk);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        IUnknown_Release(unk);
+
+        hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IExplorerBrowser, (void**)&unk);
+        ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
+        hr = IShellBrowser_QueryInterface(sb, &IID_IExplorerBrowser, (void**)&unk);
+        ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
+        hr = IShellBrowser_QueryInterface(sb, &IID_IWebBrowser2, (void**)&unk);
+        ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
+        hr = IShellBrowser_QueryInterface(sb, &IID_IDispatch, (void**)&unk);
+        ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
         IShellBrowser_Release(sb2);
         IShellBrowser_Release(sb);
 
@@ -596,7 +612,6 @@ if (hr == S_OK) {
         ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
 
         IServiceProvider_Release(sp);
-}
         IDispatch_Release(disp);
     }
 
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index 4c7bcd4..03008f4 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -140,6 +140,7 @@ struct shellbrowserwindow
 {
     IWebBrowser2 IWebBrowser2_iface;
     IServiceProvider IServiceProvider_iface;
+    IShellBrowser IShellBrowser_iface;
 };
 
 static struct shellwindows shellwindows;
@@ -160,6 +161,11 @@ static inline struct shellbrowserwindow *impl_from_IServiceProvider(IServiceProv
     return CONTAINING_RECORD(iface, struct shellbrowserwindow, IServiceProvider_iface);
 }
 
+static inline struct shellbrowserwindow *impl_from_IShellBrowser(IShellBrowser *iface)
+{
+    return CONTAINING_RECORD(iface, struct shellbrowserwindow, IShellBrowser_iface);
+}
+
 static void shellwindows_init(void);
 static void desktopshellbrowserwindow_init(void);
 
@@ -1939,7 +1945,14 @@ static ULONG WINAPI serviceprovider_Release(IServiceProvider *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);
+    struct shellbrowserwindow *This = impl_from_IServiceProvider(iface);
+
+    TRACE("%s %s %p\n", debugstr_guid(service), debugstr_guid(riid), ppv);
+
+    if (IsEqualGUID(service, &SID_STopLevelBrowser))
+        return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppv);
+
+    WARN("unknown service id %s\n", debugstr_guid(service));
     return E_NOTIMPL;
 }
 
@@ -1951,10 +1964,161 @@ static const IServiceProviderVtbl serviceprovidervtbl =
     serviceprovider_QueryService
 };
 
+/* IShellBrowser */
+static HRESULT WINAPI shellbrowser_QueryInterface(IShellBrowser *iface, REFIID riid, void **ppv)
+{
+    TRACE("%s %p\n", debugstr_guid(riid), ppv);
+
+    *ppv = NULL;
+
+    if (IsEqualGUID(&IID_IShellBrowser, riid) ||
+        IsEqualGUID(&IID_IOleWindow, riid) ||
+        IsEqualGUID(&IID_IUnknown, riid))
+    {
+        *ppv = iface;
+    }
+
+    if (*ppv)
+    {
+        IUnknown_AddRef((IUnknown*)*ppv);
+        return S_OK;
+    }
+
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI shellbrowser_AddRef(IShellBrowser *iface)
+{
+    struct shellbrowserwindow *This = impl_from_IShellBrowser(iface);
+    return IWebBrowser2_AddRef(&This->IWebBrowser2_iface);
+}
+
+static ULONG WINAPI shellbrowser_Release(IShellBrowser *iface)
+{
+    struct shellbrowserwindow *This = impl_from_IShellBrowser(iface);
+    return IWebBrowser2_Release(&This->IWebBrowser2_iface);
+}
+
+static HRESULT WINAPI shellbrowser_GetWindow(IShellBrowser *iface, HWND *phwnd)
+{
+    FIXME("%p\n", phwnd);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_ContextSensitiveHelp(IShellBrowser *iface, BOOL mode)
+{
+    FIXME("%d\n", mode);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_InsertMenusSB(IShellBrowser *iface, HMENU hmenuShared,
+    OLEMENUGROUPWIDTHS *menuwidths)
+{
+    FIXME("%p %p\n", hmenuShared, menuwidths);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_SetMenuSB(IShellBrowser *iface, HMENU hmenuShared,
+    HOLEMENU holemenuReserved, HWND hwndActiveObject)
+{
+    FIXME("%p %p %p\n", hmenuShared, holemenuReserved, hwndActiveObject);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_RemoveMenusSB(IShellBrowser *iface, HMENU hmenuShared)
+{
+    FIXME("%p\n", hmenuShared);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_SetStatusTextSB(IShellBrowser *iface, LPCOLESTR text)
+{
+    FIXME("%s\n", debugstr_w(text));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_EnableModelessSB(IShellBrowser *iface, BOOL enable)
+{
+    FIXME("%d\n", enable);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_TranslateAcceleratorSB(IShellBrowser *iface, MSG *pmsg, WORD wID)
+{
+    FIXME("%p 0x%x\n", pmsg, wID);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_BrowseObject(IShellBrowser *iface, LPCITEMIDLIST pidl, UINT flags)
+{
+    FIXME("%p %x\n", pidl, flags);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_GetViewStateStream(IShellBrowser *iface, DWORD mode, IStream **stream)
+{
+    FIXME("0x%x %p\n", mode, stream);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_GetControlWindow(IShellBrowser *iface, UINT id, HWND *phwnd)
+{
+    FIXME("%d %p\n", id, phwnd);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_SendControlMsg(IShellBrowser *iface, UINT id, UINT uMsg,
+    WPARAM wParam, LPARAM lParam, LRESULT *pret)
+{
+    FIXME("%d %d %lx %lx %p\n", id, uMsg, wParam, lParam, pret);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_QueryActiveShellView(IShellBrowser *iface, IShellView **view)
+{
+    FIXME("%p\n", view);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_OnViewWindowActive(IShellBrowser *iface, IShellView *view)
+{
+    FIXME("%p\n", view);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI shellbrowser_SetToolbarItems(IShellBrowser *iface, LPTBBUTTONSB buttons,
+    UINT count, UINT flags)
+{
+    FIXME("%p %d 0x%x\n", buttons, count, flags);
+    return E_NOTIMPL;
+}
+
+static const IShellBrowserVtbl shellbrowservtbl = {
+    shellbrowser_QueryInterface,
+    shellbrowser_AddRef,
+    shellbrowser_Release,
+    shellbrowser_GetWindow,
+    shellbrowser_ContextSensitiveHelp,
+    shellbrowser_InsertMenusSB,
+    shellbrowser_SetMenuSB,
+    shellbrowser_RemoveMenusSB,
+    shellbrowser_SetStatusTextSB,
+    shellbrowser_EnableModelessSB,
+    shellbrowser_TranslateAcceleratorSB,
+    shellbrowser_BrowseObject,
+    shellbrowser_GetViewStateStream,
+    shellbrowser_GetControlWindow,
+    shellbrowser_SendControlMsg,
+    shellbrowser_QueryActiveShellView,
+    shellbrowser_OnViewWindowActive,
+    shellbrowser_SetToolbarItems
+};
+
 static void desktopshellbrowserwindow_init(void)
 {
     desktopshellbrowserwindow.IWebBrowser2_iface.lpVtbl = &webbrowser2vtbl;
     desktopshellbrowserwindow.IServiceProvider_iface.lpVtbl = &serviceprovidervtbl;
+    desktopshellbrowserwindow.IShellBrowser_iface.lpVtbl = &shellbrowservtbl;
 }
 
 static void shellwindows_init(void)




More information about the wine-cvs mailing list