diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index 9d148c4cabc..299e2fe79aa 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -15,6 +15,7 @@ C_SRCS = \ olewnd.c \ persist.c \ protocol.c \ + service.c \ view.c RC_SRCS = rsrc.rc diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 758e312ddae..873b4f35945 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -94,6 +94,9 @@ static HRESULT WINAPI HTMLDocument_QueryInterface(IHTMLDocument2 *iface, REFIID }else if(IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) { TRACE("(%p)->(IID_IOleInPlaceObjectWindowless, %p)\n", This, ppvObject); *ppvObject = INPLACEWIN(This); + }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { + TRACE("(%p)->(IID_IServiceProvider, %p)\n", This, ppvObject); + *ppvObject = SERVPROV(This); } if(*ppvObject) { @@ -969,6 +972,7 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject) HTMLDocument_OleObj_Init(ret); HTMLDocument_View_Init(ret); HTMLDocument_Window_Init(ret); + HTMLDocument_Service_Init(ret); return hres; } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 80a61a16405..ee9890cc4bd 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -27,6 +27,7 @@ typedef struct { const IOleInPlaceActiveObjectVtbl *lpOleInPlaceActiveObjectVtbl; const IViewObject2Vtbl *lpViewObject2Vtbl; const IOleInPlaceObjectWindowlessVtbl *lpOleInPlaceObjectWindowlessVtbl; + const IServiceProviderVtbl *lpServiceProviderVtbl; ULONG ref; @@ -51,6 +52,7 @@ typedef struct { #define VIEWOBJ2(x) ((IViewObject2*) &(x)->lpViewObject2Vtbl) #define INPLACEOBJ(x) ((IOleInPlaceObject*) &(x)->lpOleInPlaceObjectWindowlessVtbl) #define INPLACEWIN(x) ((IOleInPlaceObjectWindowless*) &(x)->lpOleInPlaceObjectWindowlessVtbl) +#define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl) #define DEFINE_THIS(cls,ifc) cls* const This=(cls*)((char*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)); @@ -60,6 +62,7 @@ void HTMLDocument_Persist_Init(HTMLDocument*); void HTMLDocument_OleObj_Init(HTMLDocument*); void HTMLDocument_View_Init(HTMLDocument*); void HTMLDocument_Window_Init(HTMLDocument*); +void HTMLDocument_Service_Init(HTMLDocument*); HRESULT ProtocolFactory_Create(REFCLSID,REFIID,void**); diff --git a/dlls/mshtml/service.c b/dlls/mshtml/service.c new file mode 100644 index 00000000000..8b331664500 --- /dev/null +++ b/dlls/mshtml/service.c @@ -0,0 +1,90 @@ +/* + * Copyright 2005 Jacek Caban + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "docobj.h" + +#include "mshtml.h" + +#include "wine/debug.h" + +#include "mshtml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +/********************************************************** + * IServiceProvider impementation + */ + +#define SERVPROV_THIS(iface) (HTMLDocument*)((BYTE*)(iface)-offsetof(HTMLDocument,lpServiceProviderVtbl)) + +static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv) +{ + HTMLDocument *This = SERVPROV_THIS(iface); + return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv); +} + +static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface) +{ + HTMLDocument *This = SERVPROV_THIS(iface); + return IHTMLDocument2_AddRef(HTMLDOC(This)); +} + +static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface) +{ + HTMLDocument *This = SERVPROV_THIS(iface); + return IHTMLDocument_Release(HTMLDOC(This)); +} + +static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, + REFIID riid, void **ppv) +{ + HTMLDocument *This = SERVPROV_THIS(iface); + + /* NOTE: + * IE queries for service {3050f84b-98b5-11cf-bb82-00aa00bdce0b}. + * Its interface has the same IID and HTMLDocument also implements this + * interface. I conldn't find that interface is it. + */ + + FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); + + return E_UNEXPECTED; +} + +static const IServiceProviderVtbl ServiceProviderVtbl = { + ServiceProvider_QueryInterface, + ServiceProvider_AddRef, + ServiceProvider_Release, + ServiceProvider_QueryService +}; + +void HTMLDocument_Service_Init(HTMLDocument *This) +{ + This->lpServiceProviderVtbl = &ServiceProviderVtbl; +}