Jacek Caban : shdocvw: Added client site's IServiceProvider interface.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 15 07:01:23 CST 2006


Module: wine
Branch: refs/heads/master
Commit: ad5d88c67a7999ef380e48e5ea1011217e192a0a
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=ad5d88c67a7999ef380e48e5ea1011217e192a0a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb 15 11:53:31 2006 +0100

shdocvw: Added client site's IServiceProvider interface.

---

 dlls/shdocvw/client.c  |   65 ++++++++++++++++++++++++++++++++++++++++++------
 dlls/shdocvw/shdocvw.h |    2 +
 2 files changed, 59 insertions(+), 8 deletions(-)

diff --git a/dlls/shdocvw/client.c b/dlls/shdocvw/client.c
index 45b2b98..981132a 100644
--- a/dlls/shdocvw/client.c
+++ b/dlls/shdocvw/client.c
@@ -56,6 +56,9 @@ static HRESULT WINAPI ClientSite_QueryIn
     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
         *ppv = CLDISP(This);
+    }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
+        TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
+        *ppv = CLSERVPROV(This);
     }
 
     if(*ppv) {
@@ -372,7 +375,7 @@ static HRESULT WINAPI ClDispatch_GetType
 }
 
 static HRESULT WINAPI ClDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
-                                      ITypeInfo **ppTInfo)
+                                             ITypeInfo **ppTInfo)
 {
     WebBrowser *This = DISP_THIS(iface);
     FIXME("(%p)->(%u %ld %p)\n", This, iTInfo, lcid, ppTInfo);
@@ -380,7 +383,7 @@ static HRESULT WINAPI ClDispatch_GetType
 }
 
 static HRESULT WINAPI ClDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
-                                        UINT cNames, LCID lcid, DISPID *rgDispId)
+                                               UINT cNames, LCID lcid, DISPID *rgDispId)
 {
     WebBrowser *This = DISP_THIS(iface);
     FIXME("(%p)->(%s %p %u %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
@@ -389,8 +392,8 @@ static HRESULT WINAPI ClDispatch_GetIDsO
 }
 
 static HRESULT WINAPI ClDispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
-                                 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
-                                 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+                                        LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+                                        VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 {
     WebBrowser *This = DISP_THIS(iface);
     FIXME("(%p)->(%ld %s %ld %04x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
@@ -410,12 +413,58 @@ static const IDispatchVtbl DispatchVtbl 
     ClDispatch_Invoke
 };
 
+#define SERVPROV_THIS(iface) DEFINE_THIS(WebBrowser, ClServiceProvider, iface)
+
+static HRESULT WINAPI ClServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid,
+                                                       void **ppv)
+{
+    WebBrowser *This = SERVPROV_THIS(iface);
+    return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
+}
+
+static ULONG WINAPI ClServiceProvider_AddRef(IServiceProvider *iface)
+{
+    WebBrowser *This = SERVPROV_THIS(iface);
+    return IWebBrowser2_AddRef(WEBBROWSER2(This));
+}
+
+static ULONG WINAPI ClServiceProvider_Release(IServiceProvider *iface)
+{
+    WebBrowser *This = SERVPROV_THIS(iface);
+    return IWebBrowser2_Release(WEBBROWSER2(This));
+}
+
+static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
+                                                     REFIID riid, void **ppv)
+{
+    WebBrowser *This = SERVPROV_THIS(iface);
+
+    if(IsEqualGUID(&IID_IHlinkFrame, guidService)) {
+        TRACE("(%p)->(IID_IHlinkFrame %s %p)\n", This, debugstr_guid(riid), ppv);
+        return IWebBrowser2_QueryInterface(WEBBROWSER(This), riid, ppv);
+    }
+
+    FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
+
+    return E_NOINTERFACE;
+}
+
+#undef SERVPROV_THIS
+
+static const IServiceProviderVtbl ServiceProviderVtbl = {
+    ClServiceProvider_QueryInterface,
+    ClServiceProvider_AddRef,
+    ClServiceProvider_Release,
+    ClServiceProvider_QueryService
+};
+
 void WebBrowser_ClientSite_Init(WebBrowser *This)
 {
-    This->lpOleClientSiteVtbl   = &OleClientSiteVtbl;
-    This->lpOleInPlaceSiteVtbl  = &OleInPlaceSiteVtbl;
-    This->lpOleDocumentSiteVtbl = &OleDocumentSiteVtbl;
-    This->lpDispatchVtbl        = &DispatchVtbl;
+    This->lpOleClientSiteVtbl     = &OleClientSiteVtbl;
+    This->lpOleInPlaceSiteVtbl    = &OleInPlaceSiteVtbl;
+    This->lpOleDocumentSiteVtbl   = &OleDocumentSiteVtbl;
+    This->lpDispatchVtbl          = &DispatchVtbl;
+    This->lpClServiceProviderVtbl = &ServiceProviderVtbl;
 
     This->view = NULL;
 }
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
index 03ba7c2..470d170 100644
--- a/dlls/shdocvw/shdocvw.h
+++ b/dlls/shdocvw/shdocvw.h
@@ -87,6 +87,7 @@ typedef struct {
     const IOleDocumentSiteVtbl          *lpOleDocumentSiteVtbl;
     const IOleCommandTargetVtbl         *lpClOleCommandTargetVtbl;
     const IDispatchVtbl                 *lpDispatchVtbl;
+    const IServiceProviderVtbl          *lpClServiceProviderVtbl;
 
     /* Interfaces of InPlaceFrame object */
 
@@ -145,6 +146,7 @@ typedef struct {
 #define DOCSITE(x)      ((IOleDocumentSite*)            &(x)->lpOleDocumentSiteVtbl)
 #define CLOLECMD(x)     ((IOleCommandTarget*)           &(x)->lpClOleCommandTargetVtbl)
 #define CLDISP(x)       ((IDispatch*)                   &(x)->lpDispatchVtbl)
+#define CLSERVPROV(x)   ((IServiceProvider*)            &(x)->lpClServiceProviderVtbl)
 
 #define INPLACEFRAME(x) ((IOleInPlaceFrame*)            &(x)->lpOleInPlaceFrameVtbl)
 




More information about the wine-cvs mailing list