5 * Copyright 2001 John R. Sheets (for CodeWeavers)
6 * Copyright 2002 Hidenori Takeshima
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include "wine/obj_base.h"
32 #include "wine/obj_storage.h"
33 #include "wine/obj_misc.h"
34 #include "wine/obj_moniker.h"
35 #include "wine/obj_inplace.h"
36 #include "wine/obj_dataobject.h"
37 #include "wine/obj_oleobj.h"
38 #include "wine/obj_oleaut.h"
39 #include "wine/obj_olefont.h"
40 #include "wine/obj_dragdrop.h"
41 #include "wine/obj_oleview.h"
42 #include "wine/obj_control.h"
43 #include "wine/obj_connection.h"
44 #include "wine/obj_property.h"
45 #include "wine/obj_oleundo.h"
46 #include "wine/obj_webbrowser.h"
48 #include "wine/debug.h"
49 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
54 typedef struct CWebBrowserImpl
56 COMIMPL_IUnkImpl vfunk; /* must be the first member of this struct */
57 struct { ICOM_VFIELD(IOleObject); } vfoleobj;
58 struct { ICOM_VFIELD(IOleInPlaceObject); } vfoleinpobj;
59 struct { ICOM_VFIELD(IOleControl); } vfolectl;
60 struct { ICOM_VFIELD(IWebBrowser); } vfwbrowser;
61 struct { ICOM_VFIELD(IProvideClassInfo2); } vfpcinfo;
62 struct { ICOM_VFIELD(IPersistStorage); } vfpstrg;
63 struct { ICOM_VFIELD(IPersistStreamInit); } vfpstrminit;
64 struct { ICOM_VFIELD(IQuickActivate); } vfqactive;
65 struct { ICOM_VFIELD(IConnectionPointContainer); } vfcpointcont;
67 /* CWebBrowserImpl variables */
71 #define CWebBrowserImpl_THIS(iface,member) CWebBrowserImpl* This = ((CWebBrowserImpl*)(((char*)iface)-offsetof(CWebBrowserImpl,member)))
74 static COMIMPL_IFEntry IFEntries[] =
76 { &IID_IOleObject, offsetof(CWebBrowserImpl,vfoleobj)-offsetof(CWebBrowserImpl,vfunk) },
77 { &IID_IOleInPlaceObject, offsetof(CWebBrowserImpl,vfoleinpobj)-offsetof(CWebBrowserImpl,vfunk) },
78 { &IID_IOleControl, offsetof(CWebBrowserImpl,vfolectl)-offsetof(CWebBrowserImpl,vfunk) },
79 { &IID_IWebBrowser, offsetof(CWebBrowserImpl,vfwbrowser)-offsetof(CWebBrowserImpl,vfunk) },
80 /* { &IID_IWebBrowserApp, offsetof(CWebBrowserImpl,vfwbrowser)-offsetof(CWebBrowserImpl,vfunk) }, */
81 /* { &IID_IWebBrowser2, offsetof(CWebBrowserImpl,vfwbrowser)-offsetof(CWebBrowserImpl,vfunk) }, */
82 { &IID_IProvideClassInfo, offsetof(CWebBrowserImpl,vfpcinfo)-offsetof(CWebBrowserImpl,vfunk) },
83 { &IID_IProvideClassInfo2, offsetof(CWebBrowserImpl,vfpcinfo)-offsetof(CWebBrowserImpl,vfunk) },
84 { &IID_IPersist, offsetof(CWebBrowserImpl,vfpstrg)-offsetof(CWebBrowserImpl,vfunk) },
85 { &IID_IPersistStorage, offsetof(CWebBrowserImpl,vfpstrg)-offsetof(CWebBrowserImpl,vfunk) },
86 { &IID_IPersistStreamInit, offsetof(CWebBrowserImpl,vfpstrminit)-offsetof(CWebBrowserImpl,vfunk) },
87 { &IID_IQuickActivate, offsetof(CWebBrowserImpl,vfqactive)-offsetof(CWebBrowserImpl,vfunk) },
88 { &IID_IConnectionPointContainer, offsetof(CWebBrowserImpl,vfcpointcont)-offsetof(CWebBrowserImpl,vfunk) },
91 /***************************************************************************
93 * CWebBrowserImpl::IOleObject
96 /**********************************************************************
97 * Implement the IOleObject interface for the web browser component
99 * Based on DefaultHandler code in dlls/ole32/defaulthandler.c.
101 /************************************************************************
102 * WBOOBJ_QueryInterface (IUnknown)
104 * Interfaces we need to (at least pretend to) retrieve:
106 * a6bc3ac0-dbaa-11ce-9de3-00aa004bb851 IID_IProvideClassInfo2
107 * b196b283-bab4-101a-b69c-00aa00341d07 IID_IProvideClassInfo
108 * cf51ed10-62fe-11cf-bf86-00a0c9034836 IID_IQuickActivate
109 * 7fd52380-4e07-101b-ae2d-08002b2ec713 IID_IPersistStreamInit
110 * 0000010a-0000-0000-c000-000000000046 IID_IPersistStorage
111 * b196b284-bab4-101a-b69c-00aa00341d07 IID_IConnectionPointContainer
113 static HRESULT WINAPI WBOOBJ_QueryInterface(LPOLEOBJECT iface,
114 REFIID riid, void** ppobj)
116 CWebBrowserImpl_THIS(iface,vfoleobj);
118 TRACE("(%p)->()\n",This);
120 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
123 /************************************************************************
124 * WBOOBJ_AddRef (IUnknown)
126 static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)
128 CWebBrowserImpl_THIS(iface,vfoleobj);
130 TRACE("(%p)->()\n",This);
132 return IUnknown_AddRef(This->vfunk.punkControl);
135 /************************************************************************
136 * WBOOBJ_Release (IUnknown)
138 static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)
140 CWebBrowserImpl_THIS(iface,vfoleobj);
142 TRACE("(%p)->()\n",This);
144 return IUnknown_Release(This->vfunk.punkControl);
147 /************************************************************************
148 * WBOOBJ_SetClientSite (IOleObject)
150 static HRESULT WINAPI WBOOBJ_SetClientSite(LPOLEOBJECT iface,
151 LPOLECLIENTSITE pClientSite)
153 FIXME("stub: (%p, %p)\n", iface, pClientSite);
157 /************************************************************************
158 * WBOOBJ_GetClientSite (IOleObject)
160 static HRESULT WINAPI WBOOBJ_GetClientSite(LPOLEOBJECT iface,
161 LPOLECLIENTSITE* ppClientSite)
163 FIXME("stub: (%p)\n", *ppClientSite);
167 /************************************************************************
168 * WBOOBJ_SetHostNames (IOleObject)
170 static HRESULT WINAPI WBOOBJ_SetHostNames(LPOLEOBJECT iface, LPCOLESTR szContainerApp,
171 LPCOLESTR szContainerObj)
173 FIXME("stub: (%p, %s, %s)\n", iface, debugstr_w(szContainerApp),
174 debugstr_w(szContainerObj));
178 /************************************************************************
179 * WBOOBJ_Close (IOleObject)
181 static HRESULT WINAPI WBOOBJ_Close(LPOLEOBJECT iface, DWORD dwSaveOption)
187 /************************************************************************
188 * WBOOBJ_SetMoniker (IOleObject)
190 static HRESULT WINAPI WBOOBJ_SetMoniker(LPOLEOBJECT iface,
191 DWORD dwWhichMoniker, IMoniker* pmk)
193 FIXME("stub: (%p, %ld, %p)\n", iface, dwWhichMoniker, pmk);
197 /************************************************************************
198 * WBOOBJ_GetMoniker (IOleObject)
200 * Delegate this request to the client site if we have one.
202 static HRESULT WINAPI WBOOBJ_GetMoniker(LPOLEOBJECT iface, DWORD dwAssign,
203 DWORD dwWhichMoniker, LPMONIKER *ppmk)
205 FIXME("stub (%p, %ld, %ld, %p)\n", iface, dwAssign, dwWhichMoniker, ppmk);
209 /************************************************************************
210 * WBOOBJ_InitFromData (IOleObject)
212 * This method is meaningless if the server is not running
214 static HRESULT WINAPI WBOOBJ_InitFromData(LPOLEOBJECT iface, LPDATAOBJECT pDataObject,
215 BOOL fCreation, DWORD dwReserved)
217 FIXME("stub: (%p, %p, %d, %ld)\n", iface, pDataObject, fCreation, dwReserved);
218 return OLE_E_NOTRUNNING;
221 /************************************************************************
222 * WBOOBJ_GetClipboardData (IOleObject)
224 * This method is meaningless if the server is not running
226 static HRESULT WINAPI WBOOBJ_GetClipboardData(LPOLEOBJECT iface, DWORD dwReserved,
227 LPDATAOBJECT *ppDataObject)
229 FIXME("stub: (%p, %ld, %p)\n", iface, dwReserved, ppDataObject);
230 return OLE_E_NOTRUNNING;
233 /************************************************************************
234 * WBOOBJ_DoVerb (IOleObject)
236 static HRESULT WINAPI WBOOBJ_DoVerb(LPOLEOBJECT iface, LONG iVerb, struct tagMSG* lpmsg,
237 LPOLECLIENTSITE pActiveSite, LONG lindex,
238 HWND hwndParent, LPCRECT lprcPosRect)
240 FIXME(": stub iVerb = %ld\n", iVerb);
243 case OLEIVERB_INPLACEACTIVATE:
244 FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
247 FIXME ("stub for OLEIVERB_HIDE\n");
254 /************************************************************************
255 * WBOOBJ_EnumVerbs (IOleObject)
257 * Delegate to OleRegEnumVerbs.
259 static HRESULT WINAPI WBOOBJ_EnumVerbs(LPOLEOBJECT iface,
260 IEnumOLEVERB** ppEnumOleVerb)
262 TRACE("(%p, %p)\n", iface, ppEnumOleVerb);
264 return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
267 /************************************************************************
268 * WBOOBJ_EnumVerbs (IOleObject)
270 static HRESULT WINAPI WBOOBJ_Update(LPOLEOBJECT iface)
276 /************************************************************************
277 * WBOOBJ_IsUpToDate (IOleObject)
279 * This method is meaningless if the server is not running
281 static HRESULT WINAPI WBOOBJ_IsUpToDate(LPOLEOBJECT iface)
283 FIXME("(%p)\n", iface);
284 return OLE_E_NOTRUNNING;
287 /************************************************************************
288 * WBOOBJ_GetUserClassID (IOleObject)
290 static HRESULT WINAPI WBOOBJ_GetUserClassID(LPOLEOBJECT iface, CLSID* pClsid)
292 FIXME("stub: (%p, %p)\n", iface, pClsid);
296 /************************************************************************
297 * WBOOBJ_GetUserType (IOleObject)
299 * Delegate to OleRegGetUserType.
301 static HRESULT WINAPI WBOOBJ_GetUserType(LPOLEOBJECT iface, DWORD dwFormOfType,
302 LPOLESTR* pszUserType)
304 TRACE("(%p, %ld, %p)\n", iface, dwFormOfType, pszUserType);
306 return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
309 /************************************************************************
310 * WBOOBJ_SetExtent (IOleObject)
312 * This method is meaningless if the server is not running
314 static HRESULT WINAPI WBOOBJ_SetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
317 FIXME("stub: (%p, %lx, (%ld x %ld))\n", iface, dwDrawAspect,
318 psizel->cx, psizel->cy);
319 return OLE_E_NOTRUNNING;
322 /************************************************************************
323 * WBOOBJ_GetExtent (IOleObject)
325 static HRESULT WINAPI WBOOBJ_GetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
328 FIXME("stub: (%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
332 /************************************************************************
333 * WBOOBJ_Advise (IOleObject)
335 static HRESULT WINAPI WBOOBJ_Advise(LPOLEOBJECT iface, IAdviseSink* pAdvSink,
336 DWORD* pdwConnection)
338 FIXME("stub: (%p, %p, %p)\n", iface, pAdvSink, pdwConnection);
342 /************************************************************************
343 * WBOOBJ_Unadvise (IOleObject)
345 static HRESULT WINAPI WBOOBJ_Unadvise(LPOLEOBJECT iface, DWORD dwConnection)
347 FIXME("stub: (%p, %ld)\n", iface, dwConnection);
351 /************************************************************************
352 * WBOOBJ_EnumAdvise (IOleObject)
354 static HRESULT WINAPI WBOOBJ_EnumAdvise(LPOLEOBJECT iface, IEnumSTATDATA** ppenumAdvise)
356 FIXME("stub: (%p, %p)\n", iface, ppenumAdvise);
360 /************************************************************************
361 * WBOOBJ_GetMiscStatus (IOleObject)
363 * Delegate to OleRegGetMiscStatus.
365 static HRESULT WINAPI WBOOBJ_GetMiscStatus(LPOLEOBJECT iface, DWORD dwAspect,
370 TRACE("(%p, %lx, %p)\n", iface, dwAspect, pdwStatus);
372 hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
380 /************************************************************************
381 * WBOOBJ_SetColorScheme (IOleObject)
383 * This method is meaningless if the server is not running
385 static HRESULT WINAPI WBOOBJ_SetColorScheme(LPOLEOBJECT iface,
386 struct tagLOGPALETTE* pLogpal)
388 FIXME("stub: (%p, %p))\n", iface, pLogpal);
389 return OLE_E_NOTRUNNING;
392 /**********************************************************************
393 * IOleObject virtual function table for IE Web Browser component
396 static ICOM_VTABLE(IOleObject) WBOOBJ_Vtbl =
398 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
399 WBOOBJ_QueryInterface,
402 WBOOBJ_SetClientSite,
403 WBOOBJ_GetClientSite,
409 WBOOBJ_GetClipboardData,
414 WBOOBJ_GetUserClassID,
421 WBOOBJ_GetMiscStatus,
422 WBOOBJ_SetColorScheme
426 /***************************************************************************
428 * CWebBrowserImpl::IOleInPlaceObject
432 /**********************************************************************
433 * Implement the IOleInPlaceObject interface
436 static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,
437 REFIID riid, LPVOID *ppobj)
439 CWebBrowserImpl_THIS(iface,vfoleinpobj);
441 TRACE("(%p)->()\n",This);
443 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
446 static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
448 CWebBrowserImpl_THIS(iface,vfoleinpobj);
450 TRACE("(%p)->()\n",This);
452 return IUnknown_AddRef(This->vfunk.punkControl);
455 static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)
457 CWebBrowserImpl_THIS(iface,vfoleinpobj);
459 TRACE("(%p)->()\n",This);
461 return IUnknown_Release(This->vfunk.punkControl);
464 static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)
467 /* Create a fake window to fool MFC into believing that we actually
468 * have an implemented browser control. Avoids the assertion.
471 hwnd = CreateWindowA("BUTTON", "Web Control",
472 WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW,
473 CW_USEDEFAULT, CW_USEDEFAULT, 600,
474 400, NULL, NULL, NULL, NULL);
477 TRACE ("Returning hwnd = %d\n", hwnd);
480 FIXME("stub HWND* = %p\n", phwnd);
484 static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
487 FIXME("stub fEnterMode = %d\n", fEnterMode);
491 static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
497 static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
503 static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
504 LPCRECT lprcPosRect, LPCRECT lprcClipRect)
506 FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
510 static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
516 /**********************************************************************
517 * IOleInPlaceObject virtual function table for IE Web Browser component
520 static ICOM_VTABLE(IOleInPlaceObject) WBOIPO_Vtbl =
522 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
523 WBOIPO_QueryInterface,
527 WBOIPO_ContextSensitiveHelp,
528 WBOIPO_InPlaceDeactivate,
530 WBOIPO_SetObjectRects,
531 WBOIPO_ReactivateAndUndo
537 /***************************************************************************
539 * CWebBrowserImpl::IOleControl
542 /**********************************************************************
543 * Implement the IOleControl interface
546 static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,
547 REFIID riid, LPVOID *ppobj)
549 CWebBrowserImpl_THIS(iface,vfolectl);
551 TRACE("(%p)->()\n",This);
553 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
556 static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
558 CWebBrowserImpl_THIS(iface,vfolectl);
560 TRACE("(%p)->()\n",This);
562 return IUnknown_AddRef(This->vfunk.punkControl);
565 static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)
567 CWebBrowserImpl_THIS(iface,vfolectl);
569 TRACE("(%p)->()\n",This);
571 return IUnknown_Release(This->vfunk.punkControl);
574 static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
576 FIXME("stub: LPCONTROLINFO = %p\n", pCI);
580 static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
582 FIXME("stub: MSG* = %p\n", pMsg);
586 static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
588 FIXME("stub: DISPID = %ld\n", dispID);
592 static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
594 FIXME("stub: bFreeze = %d\n", bFreeze);
598 /**********************************************************************
599 * IOleControl virtual function table for IE Web Browser component
602 static ICOM_VTABLE(IOleControl) WBOC_Vtbl =
604 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
610 WBOC_OnAmbientPropertyChange,
614 /***************************************************************************
616 * CWebBrowserImpl::IWebBrowser
619 /**********************************************************************
620 * Implement the IWebBrowser interface
623 static HRESULT WINAPI WB_QueryInterface(LPWEBBROWSER iface, REFIID riid, LPVOID *ppobj)
625 CWebBrowserImpl_THIS(iface,vfwbrowser);
627 TRACE("(%p)->()\n",This);
629 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
632 static ULONG WINAPI WB_AddRef(LPWEBBROWSER iface)
634 CWebBrowserImpl_THIS(iface,vfwbrowser);
636 TRACE("(%p)->()\n",This);
638 return IUnknown_AddRef(This->vfunk.punkControl);
641 static ULONG WINAPI WB_Release(LPWEBBROWSER iface)
643 CWebBrowserImpl_THIS(iface,vfwbrowser);
645 TRACE("(%p)->()\n",This);
647 return IUnknown_Release(This->vfunk.punkControl);
650 /* IDispatch methods */
651 static HRESULT WINAPI WB_GetTypeInfoCount(LPWEBBROWSER iface, UINT *pctinfo)
657 static HRESULT WINAPI WB_GetTypeInfo(LPWEBBROWSER iface, UINT iTInfo, LCID lcid,
664 static HRESULT WINAPI WB_GetIDsOfNames(LPWEBBROWSER iface, REFIID riid,
665 LPOLESTR *rgszNames, UINT cNames,
666 LCID lcid, DISPID *rgDispId)
672 static HRESULT WINAPI WB_Invoke(LPWEBBROWSER iface, DISPID dispIdMember,
673 REFIID riid, LCID lcid, WORD wFlags,
674 DISPPARAMS *pDispParams, VARIANT *pVarResult,
675 EXCEPINFO *pExepInfo, UINT *puArgErr)
677 FIXME("stub dispIdMember = %d, IID = %s\n", (int)dispIdMember, debugstr_guid(riid));
681 /* IWebBrowser methods */
682 static HRESULT WINAPI WB_GoBack(LPWEBBROWSER iface)
688 static HRESULT WINAPI WB_GoForward(LPWEBBROWSER iface)
694 static HRESULT WINAPI WB_GoHome(LPWEBBROWSER iface)
700 static HRESULT WINAPI WB_GoSearch(LPWEBBROWSER iface)
706 static HRESULT WINAPI WB_Navigate(LPWEBBROWSER iface, BSTR *URL,
707 VARIANT *Flags, VARIANT *TargetFrameName,
708 VARIANT *PostData, VARIANT *Headers)
710 FIXME("stub: URL = %p (%p, %p, %p, %p)\n", URL, Flags, TargetFrameName,
715 static HRESULT WINAPI WB_Refresh(LPWEBBROWSER iface)
721 static HRESULT WINAPI WB_Refresh2(LPWEBBROWSER iface, VARIANT *Level)
723 FIXME("stub: %p\n", Level);
727 static HRESULT WINAPI WB_Stop(LPWEBBROWSER iface)
733 static HRESULT WINAPI WB_get_Application(LPWEBBROWSER iface, LPVOID *ppDisp)
739 static HRESULT WINAPI WB_get_Parent(LPWEBBROWSER iface, LPVOID *ppDisp)
745 static HRESULT WINAPI WB_get_Container(LPWEBBROWSER iface, LPVOID *ppDisp)
751 static HRESULT WINAPI WB_get_Document(LPWEBBROWSER iface, LPVOID *ppDisp)
757 static HRESULT WINAPI WB_get_TopLevelContainer(LPWEBBROWSER iface, VARIANT *pBool)
763 static HRESULT WINAPI WB_get_Type(LPWEBBROWSER iface, BSTR *Type)
769 static HRESULT WINAPI WB_get_Left(LPWEBBROWSER iface, long *pl)
775 static HRESULT WINAPI WB_put_Left(LPWEBBROWSER iface, long Left)
781 static HRESULT WINAPI WB_get_Top(LPWEBBROWSER iface, long *pl)
787 static HRESULT WINAPI WB_put_Top(LPWEBBROWSER iface, long Top)
793 static HRESULT WINAPI WB_get_Width(LPWEBBROWSER iface, long *pl)
799 static HRESULT WINAPI WB_put_Width(LPWEBBROWSER iface, long Width)
805 static HRESULT WINAPI WB_get_Height(LPWEBBROWSER iface, long *pl)
811 static HRESULT WINAPI WB_put_Height(LPWEBBROWSER iface, long Height)
817 static HRESULT WINAPI WB_get_LocationName(LPWEBBROWSER iface, BSTR *LocationName)
823 static HRESULT WINAPI WB_get_LocationURL(LPWEBBROWSER iface, BSTR *LocationURL)
829 static HRESULT WINAPI WB_get_Busy(LPWEBBROWSER iface, VARIANT *pBool)
835 /**********************************************************************
836 * IWebBrowser virtual function table for IE Web Browser component
839 static ICOM_VTABLE(IWebBrowser) WB_Vtbl =
841 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
861 WB_get_TopLevelContainer,
877 /***************************************************************************
879 * CWebBrowserImpl::IProvideClassInfo2
882 /**********************************************************************
883 * Implement the IProvideClassInfo2 interface (inherits from
884 * IProvideClassInfo).
887 static HRESULT WINAPI WBPCI2_QueryInterface(LPPROVIDECLASSINFO2 iface,
888 REFIID riid, LPVOID *ppobj)
890 CWebBrowserImpl_THIS(iface,vfpcinfo);
892 TRACE("(%p)->()\n",This);
894 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
897 static ULONG WINAPI WBPCI2_AddRef(LPPROVIDECLASSINFO2 iface)
899 CWebBrowserImpl_THIS(iface,vfpcinfo);
901 TRACE("(%p)->()\n",This);
903 return IUnknown_AddRef(This->vfunk.punkControl);
906 static ULONG WINAPI WBPCI2_Release(LPPROVIDECLASSINFO2 iface)
908 CWebBrowserImpl_THIS(iface,vfpcinfo);
910 TRACE("(%p)->()\n",This);
912 return IUnknown_Release(This->vfunk.punkControl);
915 /* Return an ITypeInfo interface to retrieve type library info about
918 static HRESULT WINAPI WBPCI2_GetClassInfo(LPPROVIDECLASSINFO2 iface, LPTYPEINFO *ppTI)
920 FIXME("stub: LPTYPEINFO = %p\n", *ppTI);
924 /* Get the IID for generic default event callbacks. This IID will
925 * in theory be used to later query for an IConnectionPoint to connect
926 * an event sink (callback implmentation in the OLE control site)
929 static HRESULT WINAPI WBPCI2_GetGUID(LPPROVIDECLASSINFO2 iface,
930 DWORD dwGuidKind, GUID *pGUID)
932 FIXME("stub: dwGuidKind = %ld, pGUID = %s\n", dwGuidKind, debugstr_guid(pGUID));
934 if (dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID)
936 FIXME ("Requested unsupported GUID type: %ld\n", dwGuidKind);
937 return E_FAIL; /* Is there a better return type here? */
940 /* FIXME: Returning IPropertyNotifySink interface, but should really
941 * return a more generic event set (???) dispinterface.
942 * However, this hack, allows a control site to return with success
943 * (MFC's COleControlSite falls back to older IProvideClassInfo interface
944 * if GetGUID() fails to return a non-NULL GUID).
946 memcpy(pGUID, &IID_IPropertyNotifySink, sizeof(GUID));
947 FIXME("Wrongly returning IPropertyNotifySink interface %s\n",
948 debugstr_guid(pGUID));
954 /**********************************************************************
955 * IProvideClassInfo virtual function table for IE Web Browser component
958 static ICOM_VTABLE(IProvideClassInfo2) WBPCI2_Vtbl =
960 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
961 WBPCI2_QueryInterface,
968 /***************************************************************************
970 * CWebBrowserImpl::IPersistStorage
973 /**********************************************************************
974 * Implement the IPersistStorage interface
977 static HRESULT WINAPI WBPS_QueryInterface(LPPERSISTSTORAGE iface,
978 REFIID riid, LPVOID *ppobj)
980 CWebBrowserImpl_THIS(iface,vfpstrg);
982 TRACE("(%p)->()\n",This);
984 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
987 static ULONG WINAPI WBPS_AddRef(LPPERSISTSTORAGE iface)
989 CWebBrowserImpl_THIS(iface,vfpstrg);
991 TRACE("(%p)->()\n",This);
993 return IUnknown_AddRef(This->vfunk.punkControl);
996 static ULONG WINAPI WBPS_Release(LPPERSISTSTORAGE iface)
998 CWebBrowserImpl_THIS(iface,vfpstrg);
1000 TRACE("(%p)->()\n",This);
1002 return IUnknown_Release(This->vfunk.punkControl);
1005 static HRESULT WINAPI WBPS_GetClassID(LPPERSISTSTORAGE iface, CLSID *pClassID)
1007 FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
1011 static HRESULT WINAPI WBPS_IsDirty(LPPERSISTSTORAGE iface)
1017 static HRESULT WINAPI WBPS_InitNew(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
1019 FIXME("stub: LPSTORAGE = %p\n", pStg);
1023 static HRESULT WINAPI WBPS_Load(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
1025 FIXME("stub: LPSTORAGE = %p\n", pStg);
1029 static HRESULT WINAPI WBPS_Save(LPPERSISTSTORAGE iface, LPSTORAGE pStg,
1032 FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
1036 static HRESULT WINAPI WBPS_SaveCompleted(LPPERSISTSTORAGE iface, LPSTORAGE pStgNew)
1038 FIXME("stub: LPSTORAGE = %p\n", pStgNew);
1042 /**********************************************************************
1043 * IPersistStorage virtual function table for IE Web Browser component
1046 static ICOM_VTABLE(IPersistStorage) WBPS_Vtbl =
1048 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1049 WBPS_QueryInterface,
1061 /***************************************************************************
1063 * CWebBrowserImpl::IPersistStreamInit
1068 /**********************************************************************
1069 * Implement the IPersistStreamInit interface
1072 static HRESULT WINAPI WBPSI_QueryInterface(LPPERSISTSTREAMINIT iface,
1073 REFIID riid, LPVOID *ppobj)
1075 CWebBrowserImpl_THIS(iface,vfpstrminit);
1077 TRACE("(%p)->()\n",This);
1079 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
1082 static ULONG WINAPI WBPSI_AddRef(LPPERSISTSTREAMINIT iface)
1084 CWebBrowserImpl_THIS(iface,vfpstrminit);
1086 TRACE("(%p)->()\n",This);
1088 return IUnknown_AddRef(This->vfunk.punkControl);
1091 static ULONG WINAPI WBPSI_Release(LPPERSISTSTREAMINIT iface)
1093 CWebBrowserImpl_THIS(iface,vfpstrminit);
1095 TRACE("(%p)->()\n",This);
1097 return IUnknown_Release(This->vfunk.punkControl);
1100 static HRESULT WINAPI WBPSI_GetClassID(LPPERSISTSTREAMINIT iface, CLSID *pClassID)
1102 FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
1106 static HRESULT WINAPI WBPSI_IsDirty(LPPERSISTSTREAMINIT iface)
1112 static HRESULT WINAPI WBPSI_Load(LPPERSISTSTREAMINIT iface, LPSTREAM pStg)
1114 FIXME("stub: LPSTORAGE = %p\n", pStg);
1118 static HRESULT WINAPI WBPSI_Save(LPPERSISTSTREAMINIT iface, LPSTREAM pStg,
1121 FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
1125 static HRESULT WINAPI WBPSI_GetSizeMax(LPPERSISTSTREAMINIT iface,
1126 ULARGE_INTEGER *pcbSize)
1128 FIXME("stub: ULARGE_INTEGER = %p\n", pcbSize);
1132 static HRESULT WINAPI WBPSI_InitNew(LPPERSISTSTREAMINIT iface)
1138 /**********************************************************************
1139 * IPersistStreamInit virtual function table for IE Web Browser component
1142 static ICOM_VTABLE(IPersistStreamInit) WBPSI_Vtbl =
1144 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1145 WBPSI_QueryInterface,
1156 /***************************************************************************
1158 * CWebBrowserImpl::IQuickActivate
1161 /**********************************************************************
1162 * Implement the IQuickActivate interface
1165 static HRESULT WINAPI WBQA_QueryInterface(LPQUICKACTIVATE iface,
1166 REFIID riid, LPVOID *ppobj)
1168 CWebBrowserImpl_THIS(iface,vfqactive);
1170 TRACE("(%p)->()\n",This);
1172 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
1175 static ULONG WINAPI WBQA_AddRef(LPQUICKACTIVATE iface)
1177 CWebBrowserImpl_THIS(iface,vfqactive);
1179 TRACE("(%p)->()\n",This);
1181 return IUnknown_AddRef(This->vfunk.punkControl);
1184 static ULONG WINAPI WBQA_Release(LPQUICKACTIVATE iface)
1186 CWebBrowserImpl_THIS(iface,vfqactive);
1188 TRACE("(%p)->()\n",This);
1190 return IUnknown_Release(This->vfunk.punkControl);
1193 /* Alternative interface for quicker, easier activation of a control. */
1194 static HRESULT WINAPI WBQA_QuickActivate(LPQUICKACTIVATE iface,
1195 QACONTAINER *pQaContainer,
1196 QACONTROL *pQaControl)
1198 FIXME("stub: QACONTAINER = %p, QACONTROL = %p\n", pQaContainer, pQaControl);
1202 static HRESULT WINAPI WBQA_SetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
1204 FIXME("stub: LPSIZEL = %p\n", pSizel);
1208 static HRESULT WINAPI WBQA_GetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
1210 FIXME("stub: LPSIZEL = %p\n", pSizel);
1214 /**********************************************************************
1215 * IQuickActivate virtual function table for IE Web Browser component
1218 static ICOM_VTABLE(IQuickActivate) WBQA_Vtbl =
1220 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1221 WBQA_QueryInterface,
1225 WBQA_SetContentExtent,
1226 WBQA_GetContentExtent
1230 /***************************************************************************
1232 * CWebBrowserImpl::IConnectionPointContainer
1235 /**********************************************************************
1236 * Implement the IConnectionPointContainer interface
1239 static HRESULT WINAPI WBCPC_QueryInterface(LPCONNECTIONPOINTCONTAINER iface,
1240 REFIID riid, LPVOID *ppobj)
1242 CWebBrowserImpl_THIS(iface,vfcpointcont);
1244 TRACE("(%p)->()\n",This);
1246 return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
1249 static ULONG WINAPI WBCPC_AddRef(LPCONNECTIONPOINTCONTAINER iface)
1251 CWebBrowserImpl_THIS(iface,vfcpointcont);
1253 TRACE("(%p)->()\n",This);
1255 return IUnknown_AddRef(This->vfunk.punkControl);
1258 static ULONG WINAPI WBCPC_Release(LPCONNECTIONPOINTCONTAINER iface)
1260 CWebBrowserImpl_THIS(iface,vfcpointcont);
1262 TRACE("(%p)->()\n",This);
1264 return IUnknown_Release(This->vfunk.punkControl);
1267 /* Get a list of connection points inside this container. */
1268 static HRESULT WINAPI WBCPC_EnumConnectionPoints(LPCONNECTIONPOINTCONTAINER iface,
1269 LPENUMCONNECTIONPOINTS *ppEnum)
1271 FIXME("stub: IEnumConnectionPoints = %p\n", *ppEnum);
1275 /* Retrieve the connection point in this container associated with the
1276 * riid interface. When events occur in the control, the control can
1277 * call backwards into its embedding site, through these interfaces.
1279 static HRESULT WINAPI WBCPC_FindConnectionPoint(LPCONNECTIONPOINTCONTAINER iface,
1280 REFIID riid, LPCONNECTIONPOINT *ppCP)
1282 FIXME(": IID = %s, IConnectionPoint = %p\n", debugstr_guid(riid), *ppCP);
1285 TRACE(": IID = %s, IConnectionPoint = %p\n", debugstr_guid(riid), *ppCP);
1286 /* For now, return the same IConnectionPoint object for both
1287 * event interface requests.
1289 if (IsEqualGUID (&IID_INotifyDBEvents, riid))
1291 TRACE("Returning connection point %p for IID_INotifyDBEvents\n",
1292 &SHDOCVW_ConnectionPoint);
1293 *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
1296 else if (IsEqualGUID (&IID_IPropertyNotifySink, riid))
1298 TRACE("Returning connection point %p for IID_IPropertyNotifySink\n",
1299 &SHDOCVW_ConnectionPoint);
1300 *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
1308 /**********************************************************************
1309 * IConnectionPointContainer virtual function table for IE Web Browser component
1312 static ICOM_VTABLE(IConnectionPointContainer) WBCPC_Vtbl =
1314 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1315 WBCPC_QueryInterface,
1318 WBCPC_EnumConnectionPoints,
1319 WBCPC_FindConnectionPoint
1324 /***************************************************************************
1326 * new/delete CWebBrowserImpl
1330 static void CWebBrowserImpl_Destructor(IUnknown* iface)
1332 CWebBrowserImpl_THIS(iface,vfunk);
1334 FIXME("(%p)\n",This);
1339 HRESULT CWebBrowserImpl_AllocObj(IUnknown* punkOuter,void** ppobj)
1341 CWebBrowserImpl* This;
1343 This = (CWebBrowserImpl*)COMIMPL_AllocObj( sizeof(CWebBrowserImpl) );
1344 if ( This == NULL ) return E_OUTOFMEMORY;
1345 COMIMPL_IUnkInit( &This->vfunk, punkOuter );
1346 This->vfunk.pEntries = IFEntries;
1347 This->vfunk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
1348 This->vfunk.pOnFinalRelease = CWebBrowserImpl_Destructor;
1350 ICOM_VTBL(&This->vfoleobj) = &WBOOBJ_Vtbl;
1351 ICOM_VTBL(&This->vfoleinpobj) = &WBOIPO_Vtbl;
1352 ICOM_VTBL(&This->vfolectl) = &WBOC_Vtbl;
1353 ICOM_VTBL(&This->vfwbrowser) = &WB_Vtbl;
1354 ICOM_VTBL(&This->vfpcinfo) = &WBPCI2_Vtbl;
1355 ICOM_VTBL(&This->vfpstrg) = &WBPS_Vtbl;
1356 ICOM_VTBL(&This->vfpstrminit) = &WBPSI_Vtbl;
1357 ICOM_VTBL(&This->vfqactive) = &WBQA_Vtbl;
1358 ICOM_VTBL(&This->vfcpointcont) = &WBCPC_Vtbl;
1363 *ppobj = (void*)(&This->vfunk);