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