Module: wine Branch: master Commit: 58292e8a65ac6d3edb8a03fd76439cd120bee3ab URL: http://source.winehq.org/git/wine.git/?a=commit;h=58292e8a65ac6d3edb8a03fd76...
Author: Alistair Leslie-Hughes leslie_alistair@hotmail.com Date: Mon Jan 26 20:34:11 2009 +1100
shdocvw: Add IServiceProvider support.
---
dlls/shdocvw/shdocvw.h | 1 + dlls/shdocvw/tests/webbrowser.c | 13 ++++++- dlls/shdocvw/webbrowser.c | 76 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletions(-)
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index 0005143..fc8c3b5 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -119,6 +119,7 @@ struct WebBrowser { const IOleInPlaceActiveObjectVtbl *lpOleInPlaceActiveObjectVtbl; const IOleCommandTargetVtbl *lpOleCommandTargetVtbl; const IHlinkFrameVtbl *lpHlinkFrameVtbl; + const IServiceProviderVtbl *lpServiceProviderVtbl;
LONG ref;
diff --git a/dlls/shdocvw/tests/webbrowser.c b/dlls/shdocvw/tests/webbrowser.c index 6002292..5b04119 100644 --- a/dlls/shdocvw/tests/webbrowser.c +++ b/dlls/shdocvw/tests/webbrowser.c @@ -1994,12 +1994,23 @@ static void test_IServiceProvider(IUnknown *unk) { IServiceProvider *servprov = (void*)0xdeadbeef; HRESULT hres; + IUnknown *ret = NULL; + static const IID IID_IBrowserService2 = + {0x68BD21CC,0x438B,0x11d2,{0xA5,0x60,0x00,0xA0,0xC,0x2D,0xBF,0xE8}};
hres = IUnknown_QueryInterface(unk, &IID_IServiceProvider, (void**)&servprov); - todo_wine ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres); + ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres); if(FAILED(hres)) return;
+ hres = IServiceProvider_QueryService(servprov, &SID_STopLevelBrowser, &IID_IBrowserService2, (LPVOID*)&ret); + ok(hres == E_FAIL, "QueryService returned %08x, expected E_FAIL\n", hres); + ok(ret == NULL, "ret returned %p, expected NULL\n", ret); + if(hres == S_OK) + { + IUnknown_Release(ret); + } + IServiceProvider_Release(servprov); }
diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c index 859707f..9fdbde8 100644 --- a/dlls/shdocvw/webbrowser.c +++ b/dlls/shdocvw/webbrowser.c @@ -102,6 +102,9 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid }else if(IsEqualGUID(&IID_IHlinkFrame, riid)) { TRACE("(%p)->(IID_IHlinkFrame %p)\n", This, ppv); *ppv = HLINKFRAME(This); + }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { + *ppv = SERVPROV(This); + TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); }else if(IsEqualGUID(&IID_IQuickActivate, riid)) { TRACE("(%p)->(IID_IQuickActivate %p) returning NULL\n", This, ppv); return E_NOINTERFACE; @@ -1014,6 +1017,78 @@ static const IWebBrowser2Vtbl WebBrowser2Vtbl = WebBrowser_put_Resizable };
+#define SERVPROV_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface) +/* + * IServiceProvider interface. + */ +static HRESULT WINAPI WebBrowser_IServiceProvider_QueryInterface(IServiceProvider *iface, + REFIID riid, LPVOID *ppv) +{ + WebBrowser *This = SERVPROV_THIS(iface); + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + *ppv = WEBBROWSER(This); + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { + *ppv = WEBBROWSER(This); + TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI WebBrowser_IServiceProvider_AddRef(IServiceProvider *iface) +{ + WebBrowser *This = SERVPROV_THIS(iface); + return IWebBrowser_AddRef(WEBBROWSER(This)); +} + +static ULONG WINAPI WebBrowser_IServiceProvider_Release(IServiceProvider *iface) +{ + WebBrowser *This = SERVPROV_THIS(iface); + return IWebBrowser_Release(WEBBROWSER(This)); +} + +static HRESULT STDMETHODCALLTYPE WebBrowser_IServiceProvider_QueryService(IServiceProvider *iface, + REFGUID guidService, REFIID riid, void **ppv) +{ + WebBrowser *This = SERVPROV_THIS(iface); + static const IID IID_IBrowserService2 = + {0x68BD21CC,0x438B,0x11d2,{0xA5,0x60,0x00,0xA0,0xC,0x2D,0xBF,0xE8}}; + + if(*ppv) + ppv = NULL; + + if(IsEqualGUID(&IID_IBrowserService2, riid)) { + TRACE("(%p)->(IID_IBrowserService2 return E_FAIL)\n", This); + return E_FAIL; + } + + FIXME("(%p)->(%s, %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); + + return E_NOINTERFACE; +} + +#undef SERVPROV_THIS + +static const IServiceProviderVtbl ServiceProviderVtbl = +{ + WebBrowser_IServiceProvider_QueryInterface, + WebBrowser_IServiceProvider_AddRef, + WebBrowser_IServiceProvider_Release, + WebBrowser_IServiceProvider_QueryService +}; + static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, void **ppv) { WebBrowser *ret; @@ -1024,6 +1099,7 @@ static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, voi ret = heap_alloc(sizeof(WebBrowser));
ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl; + ret->lpServiceProviderVtbl = &ServiceProviderVtbl; ret->ref = 0; ret->version = version;