diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in index 3099de26dae..27418bc1825 100644 --- a/dlls/shell32/Makefile.in +++ b/dlls/shell32/Makefile.in @@ -23,6 +23,7 @@ C_SRCS = \ debughlp.c \ dialogs.c \ dragdrophelper.c \ + ebrowser.c \ enumidlist.c \ folders.c \ iconcache.c \ diff --git a/dlls/shell32/ebrowser.c b/dlls/shell32/ebrowser.c new file mode 100644 index 00000000000..1a71e02db4d --- /dev/null +++ b/dlls/shell32/ebrowser.c @@ -0,0 +1,279 @@ +/* + * ExplorerBrowser Control implementation. + * + * Copyright 2010 David Hedberg + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" + +#include "wine/debug.h" +#include "debughlp.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +typedef struct _ExplorerBrowserImpl { + const IExplorerBrowserVtbl *lpVtbl; + LONG ref; + BOOL destroyed; +} ExplorerBrowserImpl; + +/************************************************************************** + * IExplorerBrowser Implementation + */ +static HRESULT WINAPI IExplorerBrowser_fnQueryInterface(IExplorerBrowser *iface, + REFIID riid, void **ppvObject) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + TRACE("%p (%s, %p)\n", This, shdebugstr_guid(riid), ppvObject); + + *ppvObject = NULL; + if(IsEqualIID(riid, &IID_IExplorerBrowser) || + IsEqualIID(riid, &IID_IUnknown)) + { + *ppvObject = This; + } + + if(*ppvObject) + { + IUnknown_AddRef((IUnknown*)*ppvObject); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IExplorerBrowser_fnAddRef(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + LONG ref = InterlockedIncrement(&This->ref); + TRACE("%p - ref %d\n", This, ref); + + return ref; +} + +static ULONG WINAPI IExplorerBrowser_fnRelease(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + LONG ref = InterlockedDecrement(&This->ref); + TRACE("%p - ref %d\n", This, ref); + + if(!ref) + { + TRACE("Freeing.\n"); + + if(!This->destroyed) + IExplorerBrowser_Destroy(iface); + + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + + return ref; +} + +static HRESULT WINAPI IExplorerBrowser_fnInitialize(IExplorerBrowser *iface, + HWND hwndParent, const RECT *prc, + const FOLDERSETTINGS *pfs) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + TRACE("%p (%p, %p, %p)\n", This, hwndParent, prc, pfs); + + return S_OK; +} + +static HRESULT WINAPI IExplorerBrowser_fnDestroy(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + TRACE("%p\n", This); + + This->destroyed = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetRect(IExplorerBrowser *iface, + HDWP *phdwp, RECT rcBrowser) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, %s)\n", This, phdwp, wine_dbgstr_rect(&rcBrowser)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetPropertyBag(IExplorerBrowser *iface, + LPCWSTR pszPropertyBag) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%s)\n", This, debugstr_w(pszPropertyBag)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetEmptyText(IExplorerBrowser *iface, + LPCWSTR pszEmptyText) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%s)\n", This, debugstr_w(pszEmptyText)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetFolderSettings(IExplorerBrowser *iface, + const FOLDERSETTINGS *pfs) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p)\n", This, pfs); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnAdvise(IExplorerBrowser *iface, + IExplorerBrowserEvents *psbe, + DWORD *pdwCookie) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, %p)\n", This, psbe, pdwCookie); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnUnadvise(IExplorerBrowser *iface, + DWORD dwCookie) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (0x%x)\n", This, dwCookie); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetOptions(IExplorerBrowser *iface, + EXPLORER_BROWSER_OPTIONS dwFlag) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (0x%x)\n", This, dwFlag); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnGetOptions(IExplorerBrowser *iface, + EXPLORER_BROWSER_OPTIONS *pdwFlag) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p)\n", This, pdwFlag); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnBrowseToIDList(IExplorerBrowser *iface, + PCUIDLIST_RELATIVE pidl, + UINT uFlags) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, 0x%x)\n", This, pidl, uFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnBrowseToObject(IExplorerBrowser *iface, + IUnknown *punk, UINT uFlags) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, 0x%x)\n", This, punk, uFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnFillFromObject(IExplorerBrowser *iface, + IUnknown *punk, + EXPLORER_BROWSER_FILL_FLAGS dwFlags) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, 0x%x)\n", This, punk, dwFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnRemoveAll(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p\n", This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnGetCurrentView(IExplorerBrowser *iface, + REFIID riid, void **ppv) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%s, %p)\n", This, shdebugstr_guid(riid), ppv); + + *ppv = NULL; + return E_FAIL; +} + +static const IExplorerBrowserVtbl vt_IExplorerBrowser = +{ + IExplorerBrowser_fnQueryInterface, + IExplorerBrowser_fnAddRef, + IExplorerBrowser_fnRelease, + IExplorerBrowser_fnInitialize, + IExplorerBrowser_fnDestroy, + IExplorerBrowser_fnSetRect, + IExplorerBrowser_fnSetPropertyBag, + IExplorerBrowser_fnSetEmptyText, + IExplorerBrowser_fnSetFolderSettings, + IExplorerBrowser_fnAdvise, + IExplorerBrowser_fnUnadvise, + IExplorerBrowser_fnSetOptions, + IExplorerBrowser_fnGetOptions, + IExplorerBrowser_fnBrowseToIDList, + IExplorerBrowser_fnBrowseToObject, + IExplorerBrowser_fnFillFromObject, + IExplorerBrowser_fnRemoveAll, + IExplorerBrowser_fnGetCurrentView +}; + +HRESULT WINAPI ExplorerBrowser_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv) +{ + ExplorerBrowserImpl *eb; + HRESULT ret; + + TRACE("%p %s %p\n", pUnkOuter, shdebugstr_guid (riid), ppv); + + if(!ppv) + return E_POINTER; + if(pUnkOuter) + return CLASS_E_NOAGGREGATION; + + eb = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ExplorerBrowserImpl)); + eb->ref = 1; + eb->lpVtbl = &vt_IExplorerBrowser; + + ret = IExplorerBrowser_QueryInterface((IExplorerBrowser*)eb, riid, ppv); + IExplorerBrowser_Release((IExplorerBrowser*)eb); + + TRACE("--(%p)\n", ppv); + return ret; +} diff --git a/dlls/shell32/regsvr.c b/dlls/shell32/regsvr.c index b02c2ce5078..7a3c188d1c7 100644 --- a/dlls/shell32/regsvr.c +++ b/dlls/shell32/regsvr.c @@ -681,6 +681,13 @@ static struct regsvr_coclass const coclass_list[] = { "shell32.dll", "Apartment" }, + { &CLSID_ExplorerBrowser, + "Explorer Browser", + 0, + NULL, + "shell32.dll", + "Apartment" + }, { NULL } /* list terminator */ }; diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index 87fb911fdf0..602589902a0 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -97,6 +97,7 @@ HRESULT WINAPI FolderShortcut_Constructor(IUnknown * pUnkOuter, REFIID riid, LPV HRESULT WINAPI MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv); HRESULT WINAPI QueryAssociations_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppOutput); +HRESULT WINAPI ExplorerBrowser_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv); extern HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST, LPWSTR, UINT, int*); HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c index 10244fd6359..9afb31354fe 100644 --- a/dlls/shell32/shellole.c +++ b/dlls/shell32/shellole.c @@ -77,6 +77,7 @@ static const struct { {&CLSID_ShellLink, IShellLink_Constructor}, {&CLSID_UnixDosFolder, UnixDosFolder_Constructor}, {&CLSID_UnixFolder, UnixFolder_Constructor}, + {&CLSID_ExplorerBrowser,ExplorerBrowser_Constructor}, {NULL, NULL} };