Module: wine Branch: master Commit: 768d498ed5eef9947a25969d9d03ebc8171ea831 URL: http://source.winehq.org/git/wine.git/?a=commit;h=768d498ed5eef9947a25969d9d...
Author: David Hedberg david.hedberg@gmail.com Date: Thu Mar 31 05:55:26 2011 +0200
comdlg32: Add IServiceProvider implementation to the Item Dialog.
---
dlls/comdlg32/itemdlg.c | 69 +++++++++++++++++++++++++++++++++++++++++ dlls/comdlg32/tests/itemdlg.c | 2 +- 2 files changed, 70 insertions(+), 1 deletions(-)
diff --git a/dlls/comdlg32/itemdlg.c b/dlls/comdlg32/itemdlg.c index 23429f0..145bca7 100644 --- a/dlls/comdlg32/itemdlg.c +++ b/dlls/comdlg32/itemdlg.c @@ -59,6 +59,7 @@ typedef struct FileDialogImpl { } u; enum ITEMDLG_TYPE dlg_type; IExplorerBrowserEvents IExplorerBrowserEvents_iface; + IServiceProvider IServiceProvider_iface; LONG ref;
FILEOPENDIALOGOPTIONS options; @@ -478,6 +479,10 @@ static HRESULT WINAPI IFileDialog2_fnQueryInterface(IFileDialog2 *iface, { *ppvObject = &This->IExplorerBrowserEvents_iface; } + else if(IsEqualGUID(riid, &IID_IServiceProvider)) + { + *ppvObject = &This->IServiceProvider_iface; + } else FIXME("Unknown interface requested: %s.\n", debugstr_guid(riid));
@@ -1465,6 +1470,69 @@ static const IExplorerBrowserEventsVtbl vt_IExplorerBrowserEvents = { IExplorerBrowserEvents_fnOnNavigationFailed };
+/************************************************************************** + * IServiceProvider implementation + */ +static inline FileDialogImpl *impl_from_IServiceProvider(IServiceProvider *iface) +{ + return CONTAINING_RECORD(iface, FileDialogImpl, IServiceProvider_iface); +} + +static HRESULT WINAPI IServiceProvider_fnQueryInterface(IServiceProvider *iface, + REFIID riid, void **ppvObject) +{ + FileDialogImpl *This = impl_from_IServiceProvider(iface); + TRACE("%p\n", This); + return IFileDialog2_QueryInterface(&This->IFileDialog2_iface, riid, ppvObject); +} + +static ULONG WINAPI IServiceProvider_fnAddRef(IServiceProvider *iface) +{ + FileDialogImpl *This = impl_from_IServiceProvider(iface); + TRACE("%p\n", This); + return IFileDialog2_AddRef(&This->IFileDialog2_iface); +} + +static ULONG WINAPI IServiceProvider_fnRelease(IServiceProvider *iface) +{ + FileDialogImpl *This = impl_from_IServiceProvider(iface); + TRACE("%p\n", This); + return IFileDialog2_Release(&This->IFileDialog2_iface); +} + +static HRESULT WINAPI IServiceProvider_fnQueryService(IServiceProvider *iface, + REFGUID guidService, + REFIID riid, void **ppv) +{ + FileDialogImpl *This = impl_from_IServiceProvider(iface); + HRESULT hr = E_FAIL; + TRACE("%p (%s, %s, %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); + + *ppv = NULL; + if(IsEqualGUID(guidService, &SID_STopLevelBrowser) && This->peb) + hr = IExplorerBrowser_QueryInterface(This->peb, riid, ppv); + else if(IsEqualGUID(guidService, &SID_SExplorerBrowserFrame)) + hr = IFileDialog2_QueryInterface(&This->IFileDialog2_iface, riid, ppv); + else + FIXME("Interface %s requested from unknown service %s\n", + debugstr_guid(riid), debugstr_guid(guidService)); + + if(SUCCEEDED(hr) && *ppv) + { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + return E_FAIL; +} + +static const IServiceProviderVtbl vt_IServiceProvider = { + IServiceProvider_fnQueryInterface, + IServiceProvider_fnAddRef, + IServiceProvider_fnRelease, + IServiceProvider_fnQueryService +}; + static HRESULT FileDialog_constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv, enum ITEMDLG_TYPE type) { FileDialogImpl *fdimpl; @@ -1484,6 +1552,7 @@ static HRESULT FileDialog_constructor(IUnknown *pUnkOuter, REFIID riid, void **p fdimpl->ref = 1; fdimpl->IFileDialog2_iface.lpVtbl = &vt_IFileDialog2; fdimpl->IExplorerBrowserEvents_iface.lpVtbl = &vt_IExplorerBrowserEvents; + fdimpl->IServiceProvider_iface.lpVtbl = &vt_IServiceProvider;
if(type == ITEMDLG_TYPE_OPEN) { diff --git a/dlls/comdlg32/tests/itemdlg.c b/dlls/comdlg32/tests/itemdlg.c index 8b998a6..069de20 100644 --- a/dlls/comdlg32/tests/itemdlg.c +++ b/dlls/comdlg32/tests/itemdlg.c @@ -181,7 +181,7 @@ static BOOL test_instantiation(void) if(SUCCEEDED(hr)) IFileOpenDialog_Release(pfsd);
hr = IFileOpenDialog_QueryInterface(pfod, &IID_IServiceProvider, (void**)&psp); - todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr); + ok(hr == S_OK, "got 0x%08x.\n", hr); if(SUCCEEDED(hr)) { IExplorerBrowser *peb;