[PATCH 1/6] mshtml: COM cleanup for all the IServiceProvider ifaces.

Michael Stefaniuc mstefani at redhat.de
Sun Dec 26 18:43:10 CST 2010


---
 dlls/mshtml/htmldoc.c        |    2 +-
 dlls/mshtml/htmlwindow.c     |   22 ++++++++++++----------
 dlls/mshtml/mshtml_private.h |    5 ++---
 dlls/mshtml/navigate.c       |   21 +++++++++++----------
 dlls/mshtml/pluginhost.c     |    3 ++-
 dlls/mshtml/script.c         |   21 +++++++++++----------
 dlls/mshtml/service.c        |   17 ++++++++++-------
 7 files changed, 49 insertions(+), 42 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 4898fc6..e83282a 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1773,7 +1773,7 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv)
         *ppv = &This->IOleInPlaceObjectWindowless_iface;
     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
         TRACE("(%p)->(IID_IServiceProvider, %p)\n", This, ppv);
-        *ppv = SERVPROV(This);
+        *ppv = &This->IServiceProvider_iface;
     }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
         TRACE("(%p)->(IID_IOleCommandTarget, %p)\n", This, ppv);
         *ppv = CMDTARGET(This);
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 33a60ca..fa3318c 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -193,7 +193,7 @@ static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID rii
         *ppv = HTMLPRIVWINDOW(This);
     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
-        *ppv = SERVPROV(This);
+        *ppv = &This->IServiceProvider_iface;
     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
         return *ppv ? S_OK : E_NOINTERFACE;
     }
@@ -2119,29 +2119,32 @@ static const IDispatchExVtbl WindowDispExVtbl = {
     WindowDispEx_GetNameSpaceParent
 };
 
-#define SERVPROV_THIS(iface) DEFINE_THIS(HTMLWindow, ServiceProvider, iface)
+static inline HTMLWindow *impl_from_IServiceProvider(IServiceProvider *iface)
+{
+    return CONTAINING_RECORD(iface, HTMLWindow, IServiceProvider_iface);
+}
 
 static HRESULT WINAPI HTMLWindowSP_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
 {
-    HTMLWindow *This = SERVPROV_THIS(iface);
+    HTMLWindow *This = impl_from_IServiceProvider(iface);
     return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
 }
 
 static ULONG WINAPI HTMLWindowSP_AddRef(IServiceProvider *iface)
 {
-    HTMLWindow *This = SERVPROV_THIS(iface);
+    HTMLWindow *This = impl_from_IServiceProvider(iface);
     return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
 }
 
 static ULONG WINAPI HTMLWindowSP_Release(IServiceProvider *iface)
 {
-    HTMLWindow *This = SERVPROV_THIS(iface);
+    HTMLWindow *This = impl_from_IServiceProvider(iface);
     return IHTMLWindow2_Release(HTMLWINDOW2(This));
 }
 
 static HRESULT WINAPI HTMLWindowSP_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
 {
-    HTMLWindow *This = SERVPROV_THIS(iface);
+    HTMLWindow *This = impl_from_IServiceProvider(iface);
 
     if(IsEqualGUID(guidService, &IID_IHTMLWindow2)) {
         TRACE("IID_IHTMLWindow2\n");
@@ -2153,11 +2156,10 @@ static HRESULT WINAPI HTMLWindowSP_QueryService(IServiceProvider *iface, REFGUID
     if(!This->doc_obj)
         return E_NOINTERFACE;
 
-    return IServiceProvider_QueryService(SERVPROV(&This->doc_obj->basedoc), guidService, riid, ppv);
+    return IServiceProvider_QueryService(&This->doc_obj->basedoc.IServiceProvider_iface,
+            guidService, riid, ppv);
 }
 
-#undef SERVPROV_THIS
-
 static const IServiceProviderVtbl ServiceProviderVtbl = {
     HTMLWindowSP_QueryInterface,
     HTMLWindowSP_AddRef,
@@ -2204,7 +2206,7 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML
     window->lpHTMLWindow4Vtbl = &HTMLWindow4Vtbl;
     window->lpIHTMLPrivateWindowVtbl = &HTMLPrivateWindowVtbl;
     window->lpIDispatchExVtbl = &WindowDispExVtbl;
-    window->lpServiceProviderVtbl = &ServiceProviderVtbl;
+    window->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
     window->ref = 1;
     window->doc_obj = doc_obj;
 
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 2ef0d62..404d1ab 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -265,7 +265,7 @@ struct HTMLWindow {
     const IHTMLWindow4Vtbl *lpHTMLWindow4Vtbl;
     const IHTMLPrivateWindowVtbl *lpIHTMLPrivateWindowVtbl;
     const IDispatchExVtbl         *lpIDispatchExVtbl;
-    const IServiceProviderVtbl    *lpServiceProviderVtbl;
+    IServiceProvider   IServiceProvider_iface;
 
     LONG ref;
 
@@ -357,7 +357,7 @@ struct HTMLDocument {
     IOleInPlaceActiveObject     IOleInPlaceActiveObject_iface;
     IViewObjectEx               IViewObjectEx_iface;
     IOleInPlaceObjectWindowless IOleInPlaceObjectWindowless_iface;
-    const IServiceProviderVtbl            *lpServiceProviderVtbl;
+    IServiceProvider            IServiceProvider_iface;
     const IOleCommandTargetVtbl           *lpOleCommandTargetVtbl;
     const IOleControlVtbl                 *lpOleControlVtbl;
     const IHlinkTargetVtbl                *lpHlinkTargetVtbl;
@@ -625,7 +625,6 @@ struct HTMLDocumentNode {
 #define HTMLWINDOW2(x)   ((IHTMLWindow2*)                 &(x)->lpHTMLWindow2Vtbl)
 #define HTMLWINDOW3(x)   ((IHTMLWindow3*)                 &(x)->lpHTMLWindow3Vtbl)
 #define HTMLWINDOW4(x)   ((IHTMLWindow4*)                 &(x)->lpHTMLWindow4Vtbl)
-#define SERVPROV(x)      ((IServiceProvider*)             &(x)->lpServiceProviderVtbl)
 #define CMDTARGET(x)     ((IOleCommandTarget*)            &(x)->lpOleCommandTargetVtbl)
 #define CONTROL(x)       ((IOleControl*)                  &(x)->lpOleControlVtbl)
 #define HLNKTARGET(x)    ((IHlinkTarget*)                 &(x)->lpHlinkTargetVtbl)
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index f21ca6d..b691d9b 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -68,7 +68,7 @@ typedef struct {
 
 struct BSCallback {
     const IBindStatusCallbackVtbl *lpBindStatusCallbackVtbl;
-    const IServiceProviderVtbl    *lpServiceProviderVtbl;
+    IServiceProvider    IServiceProvider_iface;
     const IHttpNegotiate2Vtbl     *lpHttpNegotiate2Vtbl;
     const IInternetBindInfoVtbl   *lpInternetBindInfoVtbl;
 
@@ -252,7 +252,7 @@ static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallback *ifa
         *ppv = STATUSCLB(This);
     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
-        *ppv = SERVPROV(This);
+        *ppv = &This->IServiceProvider_iface;
     }else if(IsEqualGUID(&IID_IHttpNegotiate, riid)) {
         TRACE("(%p)->(IID_IHttpNegotiate %p)\n", This, ppv);
         *ppv = HTTPNEG(This);
@@ -570,37 +570,38 @@ static const IInternetBindInfoVtbl InternetBindInfoVtbl = {
     InternetBindInfo_GetBindString
 };
 
-#define SERVPROV_THIS(iface) DEFINE_THIS(BSCallback, ServiceProvider, iface)
+static inline BSCallback *impl_from_IServiceProvider(IServiceProvider *iface)
+{
+    return CONTAINING_RECORD(iface, BSCallback, IServiceProvider_iface);
+}
 
 static HRESULT WINAPI BSCServiceProvider_QueryInterface(IServiceProvider *iface,
                                                         REFIID riid, void **ppv)
 {
-    BSCallback *This = SERVPROV_THIS(iface);
+    BSCallback *This = impl_from_IServiceProvider(iface);
     return IBindStatusCallback_QueryInterface(STATUSCLB(This), riid, ppv);
 }
 
 static ULONG WINAPI BSCServiceProvider_AddRef(IServiceProvider *iface)
 {
-    BSCallback *This = SERVPROV_THIS(iface);
+    BSCallback *This = impl_from_IServiceProvider(iface);
     return IBindStatusCallback_AddRef(STATUSCLB(This));
 }
 
 static ULONG WINAPI BSCServiceProvider_Release(IServiceProvider *iface)
 {
-    BSCallback *This = SERVPROV_THIS(iface);
+    BSCallback *This = impl_from_IServiceProvider(iface);
     return IBindStatusCallback_Release(STATUSCLB(This));
 }
 
 static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface,
         REFGUID guidService, REFIID riid, void **ppv)
 {
-    BSCallback *This = SERVPROV_THIS(iface);
+    BSCallback *This = impl_from_IServiceProvider(iface);
     TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
     return E_NOINTERFACE;
 }
 
-#undef SERVPROV_THIS
-
 static const IServiceProviderVtbl ServiceProviderVtbl = {
     BSCServiceProvider_QueryInterface,
     BSCServiceProvider_AddRef,
@@ -611,7 +612,7 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
 static void init_bscallback(BSCallback *This, const BSCallbackVtbl *vtbl, IMoniker *mon, DWORD bindf)
 {
     This->lpBindStatusCallbackVtbl = &BindStatusCallbackVtbl;
-    This->lpServiceProviderVtbl    = &ServiceProviderVtbl;
+    This->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
     This->lpHttpNegotiate2Vtbl     = &HttpNegotiate2Vtbl;
     This->lpInternetBindInfoVtbl   = &InternetBindInfoVtbl;
     This->vtbl = vtbl;
diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c
index c6df421..aa9d753 100644
--- a/dlls/mshtml/pluginhost.c
+++ b/dlls/mshtml/pluginhost.c
@@ -1180,7 +1180,8 @@ static HRESULT WINAPI PHServiceProvider_QueryService(IServiceProvider *iface, RE
         return E_NOINTERFACE;
     }
 
-    return IServiceProvider_QueryService(SERVPROV(This->doc->basedoc.window), guidService, riid, ppv);
+    return IServiceProvider_QueryService(&This->doc->basedoc.window->IServiceProvider_iface,
+            guidService, riid, ppv);
 }
 
 static const IServiceProviderVtbl ServiceProviderVtbl = {
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c
index 4d50e36..e6a9da7 100644
--- a/dlls/mshtml/script.c
+++ b/dlls/mshtml/script.c
@@ -55,7 +55,7 @@ struct ScriptHost {
     const IActiveScriptSiteInterruptPollVtbl  *lpIActiveScriptSiteInterruptPollVtbl;
     const IActiveScriptSiteWindowVtbl         *lpIActiveScriptSiteWindowVtbl;
     const IActiveScriptSiteDebugVtbl          *lpIActiveScriptSiteDebugVtbl;
-    const IServiceProviderVtbl                *lpServiceProviderVtbl;
+    IServiceProvider               IServiceProvider_iface;
 
     LONG ref;
 
@@ -250,7 +250,7 @@ static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface,
         *ppv = ACTSCPDBG(This);
     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
-        *ppv = SERVPROV(This);
+        *ppv = &This->IServiceProvider_iface;
     }else if(IsEqualGUID(&IID_ICanHandleException, riid)) {
         TRACE("(%p)->(IID_ICanHandleException not supported %p)\n", This, ppv);
         return E_NOINTERFACE;
@@ -542,30 +542,33 @@ static const IActiveScriptSiteDebugVtbl ActiveScriptSiteDebugVtbl = {
     ActiveScriptSiteDebug_OnScriptErrorDebug
 };
 
-#define SERVPROV_THIS(iface) DEFINE_THIS(ScriptHost, ServiceProvider, iface)
+static inline ScriptHost *impl_from_IServiceProvider(IServiceProvider *iface)
+{
+    return CONTAINING_RECORD(iface, ScriptHost, IServiceProvider_iface);
+}
 
 static HRESULT WINAPI ASServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
 {
-    ScriptHost *This = SERVPROV_THIS(iface);
+    ScriptHost *This = impl_from_IServiceProvider(iface);
     return IActiveScriptSite_QueryInterface(ACTSCPSITE(This), riid, ppv);
 }
 
 static ULONG WINAPI ASServiceProvider_AddRef(IServiceProvider *iface)
 {
-    ScriptHost *This = SERVPROV_THIS(iface);
+    ScriptHost *This = impl_from_IServiceProvider(iface);
     return IActiveScriptSite_AddRef(ACTSCPSITE(This));
 }
 
 static ULONG WINAPI ASServiceProvider_Release(IServiceProvider *iface)
 {
-    ScriptHost *This = SERVPROV_THIS(iface);
+    ScriptHost *This = impl_from_IServiceProvider(iface);
     return IActiveScriptSite_Release(ACTSCPSITE(This));
 }
 
 static HRESULT WINAPI ASServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
         REFIID riid, void **ppv)
 {
-    ScriptHost *This = SERVPROV_THIS(iface);
+    ScriptHost *This = impl_from_IServiceProvider(iface);
 
     if(IsEqualGUID(&SID_SInternetHostSecurityManager, guidService)) {
         TRACE("(%p)->(SID_SInternetHostSecurityManager)\n", This);
@@ -580,8 +583,6 @@ static HRESULT WINAPI ASServiceProvider_QueryService(IServiceProvider *iface, RE
     return E_NOINTERFACE;
 }
 
-#undef SERVPROV_THIS
-
 static const IServiceProviderVtbl ASServiceProviderVtbl = {
     ASServiceProvider_QueryInterface,
     ASServiceProvider_AddRef,
@@ -599,7 +600,7 @@ static ScriptHost *create_script_host(HTMLWindow *window, const GUID *guid)
     ret->lpIActiveScriptSiteInterruptPollVtbl  = &ActiveScriptSiteInterruptPollVtbl;
     ret->lpIActiveScriptSiteWindowVtbl         = &ActiveScriptSiteWindowVtbl;
     ret->lpIActiveScriptSiteDebugVtbl          = &ActiveScriptSiteDebugVtbl;
-    ret->lpServiceProviderVtbl                 = &ASServiceProviderVtbl;
+    ret->IServiceProvider_iface.lpVtbl         = &ASServiceProviderVtbl;
     ret->ref = 1;
     ret->window = window;
     ret->script_state = SCRIPTSTATE_UNINITIALIZED;
diff --git a/dlls/mshtml/service.c b/dlls/mshtml/service.c
index 7346195..df05245 100644
--- a/dlls/mshtml/service.c
+++ b/dlls/mshtml/service.c
@@ -207,31 +207,34 @@ static IOleUndoManager *create_undomgr(void)
  * IServiceProvider implementation
  */
 
-#define SERVPROV_THIS(iface) DEFINE_THIS(HTMLDocument, ServiceProvider, iface)
+static inline HTMLDocument *impl_from_IServiceProvider(IServiceProvider *iface)
+{
+    return CONTAINING_RECORD(iface, HTMLDocument, IServiceProvider_iface);
+}
 
 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
 {
-    HTMLDocument *This = SERVPROV_THIS(iface);
+    HTMLDocument *This = impl_from_IServiceProvider(iface);
     return htmldoc_query_interface(This, riid, ppv);
 }
 
 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
 {
-    HTMLDocument *This = SERVPROV_THIS(iface);
+    HTMLDocument *This = impl_from_IServiceProvider(iface);
     return htmldoc_addref(This);
 }
 
 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
 {
-    HTMLDocument *This = SERVPROV_THIS(iface);
+    HTMLDocument *This = impl_from_IServiceProvider(iface);
     return htmldoc_release(This);
 }
 
 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
         REFIID riid, void **ppv)
 {
-    HTMLDocument *This = SERVPROV_THIS(iface);
-    
+    HTMLDocument *This = impl_from_IServiceProvider(iface);
+
     if(IsEqualGUID(&CLSID_CMarkup, guidService)) {
         FIXME("(%p)->(CLSID_CMarkup %s %p)\n", This, debugstr_guid(riid), ppv);
         return E_NOINTERFACE;
@@ -276,5 +279,5 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
 
 void HTMLDocument_Service_Init(HTMLDocument *This)
 {
-    This->lpServiceProviderVtbl = &ServiceProviderVtbl;
+    This->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
 }
-- 
1.7.3.4



More information about the wine-patches mailing list