Jacek Caban : shdocvw: Moved IHlinkFrame implementation to separated object .

Alexandre Julliard julliard at winehq.org
Wed Jul 28 10:45:08 CDT 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jul 27 18:14:54 2010 +0200

shdocvw: Moved IHlinkFrame implementation to separated object.

---

 dlls/shdocvw/navigate.c   |   48 +++++++++++++++++++++++++++++++-------------
 dlls/shdocvw/shdocvw.h    |   15 ++++++++++++-
 dlls/shdocvw/webbrowser.c |    7 +++--
 3 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/dlls/shdocvw/navigate.c b/dlls/shdocvw/navigate.c
index 6d73fd9..f527c3e 100644
--- a/dlls/shdocvw/navigate.c
+++ b/dlls/shdocvw/navigate.c
@@ -881,30 +881,30 @@ HRESULT go_home(DocHost *This)
     return navigate_url(This, wszPageName, NULL, NULL, NULL, NULL);
 }
 
-#define HLINKFRAME_THIS(iface) DEFINE_THIS(WebBrowser, HlinkFrame, iface)
+#define HLINKFRAME_THIS(iface) DEFINE_THIS(HlinkFrame, IHlinkFrame, iface)
 
 static HRESULT WINAPI HlinkFrame_QueryInterface(IHlinkFrame *iface, REFIID riid, void **ppv)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
-    return IWebBrowser2_QueryInterface(WEBBROWSER2(This), riid, ppv);
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
+    return IUnknown_QueryInterface(This->outer, riid, ppv);
 }
 
 static ULONG WINAPI HlinkFrame_AddRef(IHlinkFrame *iface)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
-    return IWebBrowser2_AddRef(WEBBROWSER2(This));
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
+    return IUnknown_AddRef(This->outer);
 }
 
 static ULONG WINAPI HlinkFrame_Release(IHlinkFrame *iface)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
-    return IWebBrowser2_Release(WEBBROWSER2(This));
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
+    return IUnknown_Release(This->outer);
 }
 
 static HRESULT WINAPI HlinkFrame_SetBrowseContext(IHlinkFrame *iface,
                                                   IHlinkBrowseContext *pihlbc)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
     FIXME("(%p)->(%p)\n", This, pihlbc);
     return E_NOTIMPL;
 }
@@ -912,7 +912,7 @@ static HRESULT WINAPI HlinkFrame_SetBrowseContext(IHlinkFrame *iface,
 static HRESULT WINAPI HlinkFrame_GetBrowseContext(IHlinkFrame *iface,
                                                   IHlinkBrowseContext **ppihlbc)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
     FIXME("(%p)->(%p)\n", This, ppihlbc);
     return E_NOTIMPL;
 }
@@ -920,7 +920,7 @@ static HRESULT WINAPI HlinkFrame_GetBrowseContext(IHlinkFrame *iface,
 static HRESULT WINAPI HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPBC pbc,
                                           IBindStatusCallback *pibsc, IHlink *pihlNavigate)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
     IMoniker *mon;
     LPWSTR location = NULL;
 
@@ -945,13 +945,13 @@ static HRESULT WINAPI HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPB
         return E_NOTIMPL;
     }
 
-    return navigate_hlink(&This->doc_host, mon, pbc, pibsc);
+    return navigate_hlink(This->doc_host, mon, pbc, pibsc);
 }
 
 static HRESULT WINAPI HlinkFrame_OnNavigate(IHlinkFrame *iface, DWORD grfHLNF,
         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, DWORD dwreserved)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
     FIXME("(%p)->(%08x %p %s %s %d)\n", This, grfHLNF, pimkTarget, debugstr_w(pwzLocation),
           debugstr_w(pwzFriendlyName), dwreserved);
     return E_NOTIMPL;
@@ -960,7 +960,7 @@ static HRESULT WINAPI HlinkFrame_OnNavigate(IHlinkFrame *iface, DWORD grfHLNF,
 static HRESULT WINAPI HlinkFrame_UpdateHlink(IHlinkFrame *iface, ULONG uHLID,
         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName)
 {
-    WebBrowser *This = HLINKFRAME_THIS(iface);
+    HlinkFrame *This = HLINKFRAME_THIS(iface);
     FIXME("(%p)->(%u %p %s %s)\n", This, uHLID, pimkTarget, debugstr_w(pwzLocation),
           debugstr_w(pwzFriendlyName));
     return E_NOTIMPL;
@@ -1103,8 +1103,28 @@ static const ITargetFrame2Vtbl TargetFrame2Vtbl = {
     TargetFrame2_GetTargetAlias
 };
 
+BOOL HlinkFrame_QI(HlinkFrame *This, REFIID riid, void **ppv)
+{
+    if(IsEqualGUID(&IID_IHlinkFrame, riid)) {
+        TRACE("(%p)->(IID_IHlinkFrame %p)\n", This, ppv);
+        *ppv = HLINKFRAME(This);
+    }else {
+        return FALSE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return TRUE;
+}
+
+void HlinkFrame_Init(HlinkFrame *This, IUnknown *outer, DocHost *doc_host)
+{
+    This->lpIHlinkFrameVtbl = &HlinkFrameVtbl;
+
+    This->outer = outer;
+    This->doc_host = doc_host;
+}
+
 void WebBrowser_HlinkFrame_Init(WebBrowser *This)
 {
-    This->lpHlinkFrameVtbl = &HlinkFrameVtbl;
     This->lpITargetFrame2Vtbl = &TargetFrame2Vtbl;
 }
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
index d1787cb..790eb73 100644
--- a/dlls/shdocvw/shdocvw.h
+++ b/dlls/shdocvw/shdocvw.h
@@ -66,6 +66,13 @@ typedef struct {
     IUnknown *impl;
 } ConnectionPointContainer;
 
+typedef struct {
+    const IHlinkFrameVtbl  *lpIHlinkFrameVtbl;
+
+    IUnknown *outer;
+    DocHost *doc_host;
+} HlinkFrame;
+
 struct _task_header_t;
 
 typedef void (*task_proc_t)(DocHost*, struct _task_header_t*);
@@ -128,10 +135,10 @@ struct WebBrowser {
     const IViewObject2Vtbl              *lpViewObjectVtbl;
     const IOleInPlaceActiveObjectVtbl   *lpOleInPlaceActiveObjectVtbl;
     const IOleCommandTargetVtbl         *lpOleCommandTargetVtbl;
-    const IHlinkFrameVtbl               *lpHlinkFrameVtbl;
     const ITargetFrame2Vtbl             *lpITargetFrame2Vtbl;
     const IServiceProviderVtbl          *lpServiceProviderVtbl;
     const IDataObjectVtbl               *lpDataObjectVtbl;
+    HlinkFrame hlink_frame;
 
     LONG ref;
 
@@ -188,7 +195,6 @@ struct InternetExplorer {
 #define VIEWOBJ2(x)     ((IViewObject2*)                &(x)->lpViewObjectVtbl);
 #define ACTIVEOBJ(x)    ((IOleInPlaceActiveObject*)     &(x)->lpOleInPlaceActiveObjectVtbl)
 #define OLECMD(x)       ((IOleCommandTarget*)           &(x)->lpOleCommandTargetVtbl)
-#define HLINKFRAME(x)   ((IHlinkFrame*)                 &(x)->lpHlinkFrameVtbl)
 #define DATAOBJECT(x)   ((IDataObject*)                 &(x)->lpDataObjectVtbl)
 #define TARGETFRAME2(x) ((ITargetFrame2*)               &(x)->lpITargetFrame2Vtbl)
 
@@ -203,6 +209,8 @@ struct InternetExplorer {
 
 #define INPLACEFRAME(x) ((IOleInPlaceFrame*)            &(x)->lpOleInPlaceFrameVtbl)
 
+#define HLINKFRAME(x)   ((IHlinkFrame*)                 &(x)->lpIHlinkFrameVtbl)
+
 void WebBrowser_OleObject_Init(WebBrowser*);
 void WebBrowser_ViewObject_Init(WebBrowser*);
 void WebBrowser_DataObject_Init(WebBrowser*);
@@ -223,6 +231,9 @@ void DocHost_ClientSite_Release(DocHost*);
 void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*);
 void ConnectionPointContainer_Destroy(ConnectionPointContainer*);
 
+void HlinkFrame_Init(HlinkFrame*,IUnknown*,DocHost*);
+BOOL HlinkFrame_QI(HlinkFrame*,REFIID,void**);
+
 HRESULT WebBrowserV1_Create(IUnknown*,REFIID,void**);
 HRESULT WebBrowserV2_Create(IUnknown*,REFIID,void**);
 
diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c
index 4799686..de12aa5 100644
--- a/dlls/shdocvw/webbrowser.c
+++ b/dlls/shdocvw/webbrowser.c
@@ -100,9 +100,6 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid
     }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
         TRACE("(%p)->(IID_IOleCommandTarget %p)\n", This, ppv);
         *ppv = OLECMD(This);
-    }else if(IsEqualGUID(&IID_IHlinkFrame, riid)) {
-        TRACE("(%p)->(IID_IHlinkFrame %p)\n", This, ppv);
-        *ppv = HLINKFRAME(This);
     }else if(IsEqualGUID(&IID_ITargetFrame2, riid)) {
         TRACE("(%p)->(IID_ITargetFrame2 %p)\n", This, ppv);
         *ppv = TARGETFRAME2(This);
@@ -133,6 +130,8 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid
     }else if(IsEqualGUID(&IID_IViewObjectEx, riid)) {
         TRACE("(%p)->(IID_IViewObjectEx %p) returning NULL\n", This, ppv);
         return E_NOINTERFACE;
+    }else if(HlinkFrame_QI(&This->hlink_frame, riid, ppv)) {
+        return S_OK;
     }
 
     if(*ppv) {
@@ -1159,6 +1158,8 @@ static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, voi
     WebBrowser_ClassInfo_Init(ret);
     WebBrowser_HlinkFrame_Init(ret);
 
+    HlinkFrame_Init(&ret->hlink_frame, (IUnknown*)WEBBROWSER2(ret), &ret->doc_host);
+
     SHDOCVW_LockModule();
 
     hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);




More information about the wine-cvs mailing list