Added a framework for testing CreateProcess and a few tests.
[wine] / dlls / shdocvw / browser.c
1 /*
2  *      CLSID_WebBrowser
3  *      FIXME - stub
4  *
5  * Copyright 2001 John R. Sheets (for CodeWeavers)
6  * Copyright 2002 Hidenori Takeshima
7  *
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.
12  *
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.
17  *
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
21  */
22
23 #include "config.h"
24
25 #include <string.h>
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "wingdi.h"
29 #include "ole2.h"
30
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"
47
48 #include "wine/debug.h"
49 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
50
51 #include "shdocvw.h"
52
53
54 typedef struct CWebBrowserImpl
55 {
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;
66
67         /* CWebBrowserImpl variables */
68
69 } CWebBrowserImpl;
70
71 #define CWebBrowserImpl_THIS(iface,member)      CWebBrowserImpl* This = ((CWebBrowserImpl*)(((char*)iface)-offsetof(CWebBrowserImpl,member)))
72
73
74 static COMIMPL_IFEntry IFEntries[] =
75 {
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) },
89 };
90
91 /***************************************************************************
92  *
93  *      CWebBrowserImpl::IOleObject
94  */
95
96 /**********************************************************************
97  * Implement the IOleObject interface for the web browser component
98  *
99  * Based on DefaultHandler code in dlls/ole32/defaulthandler.c.
100  */
101 /************************************************************************
102  * WBOOBJ_QueryInterface (IUnknown)
103  *
104  * Interfaces we need to (at least pretend to) retrieve:
105  *
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
112  */
113 static HRESULT WINAPI WBOOBJ_QueryInterface(LPOLEOBJECT iface,
114                                             REFIID riid, void** ppobj)
115 {
116         CWebBrowserImpl_THIS(iface,vfoleobj);
117
118         TRACE("(%p)->()\n",This);
119
120         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
121 }
122
123 /************************************************************************
124  * WBOOBJ_AddRef (IUnknown)
125  */
126 static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)
127 {
128         CWebBrowserImpl_THIS(iface,vfoleobj);
129
130         TRACE("(%p)->()\n",This);
131
132         return IUnknown_AddRef(This->vfunk.punkControl);
133 }
134
135 /************************************************************************
136  * WBOOBJ_Release (IUnknown)
137  */
138 static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)
139 {
140         CWebBrowserImpl_THIS(iface,vfoleobj);
141
142         TRACE("(%p)->()\n",This);
143
144         return IUnknown_Release(This->vfunk.punkControl);
145 }
146
147 /************************************************************************
148  * WBOOBJ_SetClientSite (IOleObject)
149  */
150 static HRESULT WINAPI WBOOBJ_SetClientSite(LPOLEOBJECT iface,
151                                            LPOLECLIENTSITE pClientSite)
152 {
153     FIXME("stub: (%p, %p)\n", iface, pClientSite);
154     return E_NOTIMPL;
155 }
156
157 /************************************************************************
158  * WBOOBJ_GetClientSite (IOleObject)
159  */
160 static HRESULT WINAPI WBOOBJ_GetClientSite(LPOLEOBJECT iface,
161                                            LPOLECLIENTSITE* ppClientSite)
162 {
163     FIXME("stub: (%p)\n", *ppClientSite);
164     return E_NOTIMPL;
165 }
166
167 /************************************************************************
168  * WBOOBJ_SetHostNames (IOleObject)
169  */
170 static HRESULT WINAPI WBOOBJ_SetHostNames(LPOLEOBJECT iface, LPCOLESTR szContainerApp,
171                                           LPCOLESTR szContainerObj)
172 {
173     FIXME("stub: (%p, %s, %s)\n", iface, debugstr_w(szContainerApp),
174           debugstr_w(szContainerObj));
175     return E_NOTIMPL;
176 }
177
178 /************************************************************************
179  * WBOOBJ_Close (IOleObject)
180  */
181 static HRESULT WINAPI WBOOBJ_Close(LPOLEOBJECT iface, DWORD dwSaveOption)
182 {
183     FIXME("stub: ()\n");
184     return E_NOTIMPL;
185 }
186
187 /************************************************************************
188  * WBOOBJ_SetMoniker (IOleObject)
189  */
190 static HRESULT WINAPI WBOOBJ_SetMoniker(LPOLEOBJECT iface,
191                                         DWORD dwWhichMoniker, IMoniker* pmk)
192 {
193     FIXME("stub: (%p, %ld, %p)\n", iface, dwWhichMoniker, pmk);
194     return E_NOTIMPL;
195 }
196
197 /************************************************************************
198  * WBOOBJ_GetMoniker (IOleObject)
199  *
200  * Delegate this request to the client site if we have one.
201  */
202 static HRESULT WINAPI WBOOBJ_GetMoniker(LPOLEOBJECT iface, DWORD dwAssign,
203                                         DWORD dwWhichMoniker, LPMONIKER *ppmk)
204 {
205     FIXME("stub (%p, %ld, %ld, %p)\n", iface, dwAssign, dwWhichMoniker, ppmk);
206     return E_UNSPEC;
207 }
208
209 /************************************************************************
210  * WBOOBJ_InitFromData (IOleObject)
211  *
212  * This method is meaningless if the server is not running
213  */
214 static HRESULT WINAPI WBOOBJ_InitFromData(LPOLEOBJECT iface, LPDATAOBJECT pDataObject,
215                                           BOOL fCreation, DWORD dwReserved)
216 {
217     FIXME("stub: (%p, %p, %d, %ld)\n", iface, pDataObject, fCreation, dwReserved);
218     return OLE_E_NOTRUNNING;
219 }
220
221 /************************************************************************
222  * WBOOBJ_GetClipboardData (IOleObject)
223  *
224  * This method is meaningless if the server is not running
225  */
226 static HRESULT WINAPI WBOOBJ_GetClipboardData(LPOLEOBJECT iface, DWORD dwReserved,
227                                               LPDATAOBJECT *ppDataObject)
228 {
229     FIXME("stub: (%p, %ld, %p)\n", iface, dwReserved, ppDataObject);
230     return OLE_E_NOTRUNNING;
231 }
232
233 /************************************************************************
234  * WBOOBJ_DoVerb (IOleObject)
235  */
236 static HRESULT WINAPI WBOOBJ_DoVerb(LPOLEOBJECT iface, LONG iVerb, struct tagMSG* lpmsg,
237                                     LPOLECLIENTSITE pActiveSite, LONG lindex,
238                                     HWND hwndParent, LPCRECT lprcPosRect)
239 {
240     FIXME(": stub iVerb = %ld\n", iVerb);
241     switch (iVerb)
242     {
243     case OLEIVERB_INPLACEACTIVATE:
244         FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
245         break;
246     case OLEIVERB_HIDE:
247         FIXME ("stub for OLEIVERB_HIDE\n");
248         break;
249     }
250
251     return E_NOTIMPL;
252 }
253
254 /************************************************************************
255  * WBOOBJ_EnumVerbs (IOleObject)
256  *
257  * Delegate to OleRegEnumVerbs.
258  */
259 static HRESULT WINAPI WBOOBJ_EnumVerbs(LPOLEOBJECT iface,
260                                        IEnumOLEVERB** ppEnumOleVerb)
261 {
262     TRACE("(%p, %p)\n", iface, ppEnumOleVerb);
263
264     return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
265 }
266
267 /************************************************************************
268  * WBOOBJ_EnumVerbs (IOleObject)
269  */
270 static HRESULT WINAPI WBOOBJ_Update(LPOLEOBJECT iface)
271 {
272     FIXME(": Stub\n");
273     return E_NOTIMPL;
274 }
275
276 /************************************************************************
277  * WBOOBJ_IsUpToDate (IOleObject)
278  *
279  * This method is meaningless if the server is not running
280  */
281 static HRESULT WINAPI WBOOBJ_IsUpToDate(LPOLEOBJECT iface)
282 {
283     FIXME("(%p)\n", iface);
284     return OLE_E_NOTRUNNING;
285 }
286
287 /************************************************************************
288  * WBOOBJ_GetUserClassID (IOleObject)
289  */
290 static HRESULT WINAPI WBOOBJ_GetUserClassID(LPOLEOBJECT iface, CLSID* pClsid)
291 {
292     FIXME("stub: (%p, %p)\n", iface, pClsid);
293     return E_NOTIMPL;
294 }
295
296 /************************************************************************
297  * WBOOBJ_GetUserType (IOleObject)
298  *
299  * Delegate to OleRegGetUserType.
300  */
301 static HRESULT WINAPI WBOOBJ_GetUserType(LPOLEOBJECT iface, DWORD dwFormOfType,
302                                          LPOLESTR* pszUserType)
303 {
304     TRACE("(%p, %ld, %p)\n", iface, dwFormOfType, pszUserType);
305
306     return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
307 }
308
309 /************************************************************************
310  * WBOOBJ_SetExtent (IOleObject)
311  *
312  * This method is meaningless if the server is not running
313  */
314 static HRESULT WINAPI WBOOBJ_SetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
315                                        SIZEL* psizel)
316 {
317     FIXME("stub: (%p, %lx, (%ld x %ld))\n", iface, dwDrawAspect,
318           psizel->cx, psizel->cy);
319     return OLE_E_NOTRUNNING;
320 }
321
322 /************************************************************************
323  * WBOOBJ_GetExtent (IOleObject)
324  */
325 static HRESULT WINAPI WBOOBJ_GetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
326                                        SIZEL* psizel)
327 {
328     FIXME("stub: (%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
329     return E_NOTIMPL;
330 }
331
332 /************************************************************************
333  * WBOOBJ_Advise (IOleObject)
334  */
335 static HRESULT WINAPI WBOOBJ_Advise(LPOLEOBJECT iface, IAdviseSink* pAdvSink,
336                                     DWORD* pdwConnection)
337 {
338     FIXME("stub: (%p, %p, %p)\n", iface, pAdvSink, pdwConnection);
339     return E_NOTIMPL;
340 }
341
342 /************************************************************************
343  * WBOOBJ_Unadvise (IOleObject)
344  */
345 static HRESULT WINAPI WBOOBJ_Unadvise(LPOLEOBJECT iface, DWORD dwConnection)
346 {
347     FIXME("stub: (%p, %ld)\n", iface, dwConnection);
348     return E_NOTIMPL;
349 }
350
351 /************************************************************************
352  * WBOOBJ_EnumAdvise (IOleObject)
353  */
354 static HRESULT WINAPI WBOOBJ_EnumAdvise(LPOLEOBJECT iface, IEnumSTATDATA** ppenumAdvise)
355 {
356     FIXME("stub: (%p, %p)\n", iface, ppenumAdvise);
357     return E_NOTIMPL;
358 }
359
360 /************************************************************************
361  * WBOOBJ_GetMiscStatus (IOleObject)
362  *
363  * Delegate to OleRegGetMiscStatus.
364  */
365 static HRESULT WINAPI WBOOBJ_GetMiscStatus(LPOLEOBJECT iface, DWORD dwAspect,
366                                            DWORD* pdwStatus)
367 {
368     HRESULT hres;
369
370     TRACE("(%p, %lx, %p)\n", iface, dwAspect, pdwStatus);
371
372     hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
373
374     if (FAILED(hres))
375         *pdwStatus = 0;
376
377     return hres;
378 }
379
380 /************************************************************************
381  * WBOOBJ_SetColorScheme (IOleObject)
382  *
383  * This method is meaningless if the server is not running
384  */
385 static HRESULT WINAPI WBOOBJ_SetColorScheme(LPOLEOBJECT iface,
386                                             struct tagLOGPALETTE* pLogpal)
387 {
388     FIXME("stub: (%p, %p))\n", iface, pLogpal);
389     return OLE_E_NOTRUNNING;
390 }
391
392 /**********************************************************************
393  * IOleObject virtual function table for IE Web Browser component
394  */
395
396 static ICOM_VTABLE(IOleObject) WBOOBJ_Vtbl = 
397 {
398     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
399     WBOOBJ_QueryInterface,
400     WBOOBJ_AddRef,
401     WBOOBJ_Release,
402     WBOOBJ_SetClientSite,
403     WBOOBJ_GetClientSite,
404     WBOOBJ_SetHostNames,
405     WBOOBJ_Close,
406     WBOOBJ_SetMoniker,
407     WBOOBJ_GetMoniker,
408     WBOOBJ_InitFromData,
409     WBOOBJ_GetClipboardData,
410     WBOOBJ_DoVerb,
411     WBOOBJ_EnumVerbs,
412     WBOOBJ_Update,
413     WBOOBJ_IsUpToDate,
414     WBOOBJ_GetUserClassID,
415     WBOOBJ_GetUserType,
416     WBOOBJ_SetExtent,
417     WBOOBJ_GetExtent,
418     WBOOBJ_Advise,
419     WBOOBJ_Unadvise,
420     WBOOBJ_EnumAdvise,
421     WBOOBJ_GetMiscStatus,
422     WBOOBJ_SetColorScheme
423 };
424
425
426 /***************************************************************************
427  *
428  *      CWebBrowserImpl::IOleInPlaceObject
429  */
430
431
432 /**********************************************************************
433  * Implement the IOleInPlaceObject interface
434  */
435
436 static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,
437                                             REFIID riid, LPVOID *ppobj)
438 {
439         CWebBrowserImpl_THIS(iface,vfoleinpobj);
440
441         TRACE("(%p)->()\n",This);
442
443         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
444 }
445
446 static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
447 {
448         CWebBrowserImpl_THIS(iface,vfoleinpobj);
449
450         TRACE("(%p)->()\n",This);
451
452         return IUnknown_AddRef(This->vfunk.punkControl);
453 }
454
455 static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)
456 {
457         CWebBrowserImpl_THIS(iface,vfoleinpobj);
458
459         TRACE("(%p)->()\n",This);
460
461         return IUnknown_Release(This->vfunk.punkControl);
462 }
463
464 static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)
465 {
466 #if 0
467     /* Create a fake window to fool MFC into believing that we actually
468      * have an implemented browser control.  Avoids the assertion.
469      */
470     HWND hwnd;
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);
475
476     *phwnd = hwnd;
477     TRACE ("Returning hwnd = %d\n", hwnd);
478 #endif
479
480     FIXME("stub HWND* = %p\n", phwnd);
481     return E_NOTIMPL;
482 }
483
484 static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
485                                                   BOOL fEnterMode)
486 {
487     FIXME("stub fEnterMode = %d\n", fEnterMode);
488     return E_NOTIMPL;
489 }
490
491 static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
492 {
493     FIXME("stub \n");
494     return E_NOTIMPL;
495 }
496
497 static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
498 {
499     FIXME("stub \n");
500     return E_NOTIMPL;
501 }
502
503 static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
504                                             LPCRECT lprcPosRect, LPCRECT lprcClipRect)
505 {
506     FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
507     return E_NOTIMPL;
508 }
509
510 static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
511 {
512     FIXME("stub \n");
513     return E_NOTIMPL;
514 }
515
516 /**********************************************************************
517  * IOleInPlaceObject virtual function table for IE Web Browser component
518  */
519
520 static ICOM_VTABLE(IOleInPlaceObject) WBOIPO_Vtbl = 
521 {
522     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
523     WBOIPO_QueryInterface,
524     WBOIPO_AddRef,
525     WBOIPO_Release,
526     WBOIPO_GetWindow,
527     WBOIPO_ContextSensitiveHelp,
528     WBOIPO_InPlaceDeactivate,
529     WBOIPO_UIDeactivate,
530     WBOIPO_SetObjectRects,
531     WBOIPO_ReactivateAndUndo
532 };
533
534
535
536
537 /***************************************************************************
538  *
539  *      CWebBrowserImpl::IOleControl
540  */
541
542 /**********************************************************************
543  * Implement the IOleControl interface
544  */
545
546 static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,
547                                           REFIID riid, LPVOID *ppobj)
548 {
549         CWebBrowserImpl_THIS(iface,vfolectl);
550
551         TRACE("(%p)->()\n",This);
552
553         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
554 }
555
556 static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
557 {
558         CWebBrowserImpl_THIS(iface,vfolectl);
559
560         TRACE("(%p)->()\n",This);
561
562         return IUnknown_AddRef(This->vfunk.punkControl);
563 }
564
565 static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)
566 {
567         CWebBrowserImpl_THIS(iface,vfolectl);
568
569         TRACE("(%p)->()\n",This);
570
571         return IUnknown_Release(This->vfunk.punkControl);
572 }
573
574 static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
575 {
576     FIXME("stub: LPCONTROLINFO = %p\n", pCI);
577     return E_NOTIMPL;
578 }
579
580 static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
581 {
582     FIXME("stub: MSG* = %p\n", pMsg);
583     return E_NOTIMPL;
584 }
585
586 static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
587 {
588     FIXME("stub: DISPID = %ld\n", dispID);
589     return E_NOTIMPL;
590 }
591
592 static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
593 {
594     FIXME("stub: bFreeze = %d\n", bFreeze);
595     return E_NOTIMPL;
596 }
597
598 /**********************************************************************
599  * IOleControl virtual function table for IE Web Browser component
600  */
601
602 static ICOM_VTABLE(IOleControl) WBOC_Vtbl = 
603 {
604     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
605     WBOC_QueryInterface,
606     WBOC_AddRef,
607     WBOC_Release,
608     WBOC_GetControlInfo,
609     WBOC_OnMnemonic,
610     WBOC_OnAmbientPropertyChange,
611     WBOC_FreezeEvents
612 };
613
614 /***************************************************************************
615  *
616  *      CWebBrowserImpl::IWebBrowser
617  */
618
619 /**********************************************************************
620  * Implement the IWebBrowser interface
621  */
622
623 static HRESULT WINAPI WB_QueryInterface(LPWEBBROWSER iface, REFIID riid, LPVOID *ppobj)
624 {
625         CWebBrowserImpl_THIS(iface,vfwbrowser);
626
627         TRACE("(%p)->()\n",This);
628
629         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
630 }
631
632 static ULONG WINAPI WB_AddRef(LPWEBBROWSER iface)
633 {
634         CWebBrowserImpl_THIS(iface,vfwbrowser);
635
636         TRACE("(%p)->()\n",This);
637
638         return IUnknown_AddRef(This->vfunk.punkControl);
639 }
640
641 static ULONG WINAPI WB_Release(LPWEBBROWSER iface)
642 {
643         CWebBrowserImpl_THIS(iface,vfwbrowser);
644
645         TRACE("(%p)->()\n",This);
646
647         return IUnknown_Release(This->vfunk.punkControl);
648 }
649
650 /* IDispatch methods */
651 static HRESULT WINAPI WB_GetTypeInfoCount(LPWEBBROWSER iface, UINT *pctinfo)
652 {
653     FIXME("stub \n");
654     return E_NOTIMPL;
655 }
656
657 static HRESULT WINAPI WB_GetTypeInfo(LPWEBBROWSER iface, UINT iTInfo, LCID lcid,
658                                      LPTYPEINFO *ppTInfo)
659 {
660     FIXME("stub \n");
661     return E_NOTIMPL;
662 }
663
664 static HRESULT WINAPI WB_GetIDsOfNames(LPWEBBROWSER iface, REFIID riid,
665                                        LPOLESTR *rgszNames, UINT cNames,
666                                        LCID lcid, DISPID *rgDispId)
667 {
668     FIXME("stub \n");
669     return E_NOTIMPL;
670 }
671
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)
676 {
677     FIXME("stub dispIdMember = %d, IID = %s\n", (int)dispIdMember, debugstr_guid(riid));
678     return E_NOTIMPL;
679 }
680
681 /* IWebBrowser methods */
682 static HRESULT WINAPI WB_GoBack(LPWEBBROWSER iface)
683 {
684     FIXME("stub \n");
685     return E_NOTIMPL;
686 }
687
688 static HRESULT WINAPI WB_GoForward(LPWEBBROWSER iface)
689 {
690     FIXME("stub \n");
691     return E_NOTIMPL;
692 }
693
694 static HRESULT WINAPI WB_GoHome(LPWEBBROWSER iface)
695 {
696     FIXME("stub \n");
697     return E_NOTIMPL;
698 }
699
700 static HRESULT WINAPI WB_GoSearch(LPWEBBROWSER iface)
701 {
702     FIXME("stub \n");
703     return E_NOTIMPL;
704 }
705
706 static HRESULT WINAPI WB_Navigate(LPWEBBROWSER iface, BSTR *URL,
707                                   VARIANT *Flags, VARIANT *TargetFrameName,
708                                   VARIANT *PostData, VARIANT *Headers)
709 {
710     FIXME("stub: URL = %p (%p, %p, %p, %p)\n", URL, Flags, TargetFrameName,
711           PostData, Headers);
712     return E_NOTIMPL;
713 }
714
715 static HRESULT WINAPI WB_Refresh(LPWEBBROWSER iface)
716 {
717     FIXME("stub \n");
718     return E_NOTIMPL;
719 }
720
721 static HRESULT WINAPI WB_Refresh2(LPWEBBROWSER iface, VARIANT *Level)
722 {
723     FIXME("stub: %p\n", Level);
724     return E_NOTIMPL;
725 }
726
727 static HRESULT WINAPI WB_Stop(LPWEBBROWSER iface)
728 {
729     FIXME("stub \n");
730     return E_NOTIMPL;
731 }
732
733 static HRESULT WINAPI WB_get_Application(LPWEBBROWSER iface, LPVOID *ppDisp)
734 {
735     FIXME("stub \n");
736     return E_NOTIMPL;
737 }
738
739 static HRESULT WINAPI WB_get_Parent(LPWEBBROWSER iface, LPVOID *ppDisp)
740 {
741     FIXME("stub \n");
742     return E_NOTIMPL;
743 }
744
745 static HRESULT WINAPI WB_get_Container(LPWEBBROWSER iface, LPVOID *ppDisp)
746 {
747     FIXME("stub \n");
748     return E_NOTIMPL;
749 }
750
751 static HRESULT WINAPI WB_get_Document(LPWEBBROWSER iface, LPVOID *ppDisp)
752 {
753     FIXME("stub \n");
754     return E_NOTIMPL;
755 }
756
757 static HRESULT WINAPI WB_get_TopLevelContainer(LPWEBBROWSER iface, VARIANT *pBool)
758 {
759     FIXME("stub \n");
760     return E_NOTIMPL;
761 }
762
763 static HRESULT WINAPI WB_get_Type(LPWEBBROWSER iface, BSTR *Type)
764 {
765     FIXME("stub \n");
766     return E_NOTIMPL;
767 }
768
769 static HRESULT WINAPI WB_get_Left(LPWEBBROWSER iface, long *pl)
770 {
771     FIXME("stub \n");
772     return E_NOTIMPL;
773 }
774
775 static HRESULT WINAPI WB_put_Left(LPWEBBROWSER iface, long Left)
776 {
777     FIXME("stub \n");
778     return E_NOTIMPL;
779 }
780
781 static HRESULT WINAPI WB_get_Top(LPWEBBROWSER iface, long *pl)
782 {
783     FIXME("stub \n");
784     return E_NOTIMPL;
785 }
786
787 static HRESULT WINAPI WB_put_Top(LPWEBBROWSER iface, long Top)
788 {
789     FIXME("stub \n");
790     return E_NOTIMPL;
791 }
792
793 static HRESULT WINAPI WB_get_Width(LPWEBBROWSER iface, long *pl)
794 {
795     FIXME("stub \n");
796     return E_NOTIMPL;
797 }
798
799 static HRESULT WINAPI WB_put_Width(LPWEBBROWSER iface, long Width)
800 {
801     FIXME("stub \n");
802     return E_NOTIMPL;
803 }
804
805 static HRESULT WINAPI WB_get_Height(LPWEBBROWSER iface, long *pl)
806 {
807     FIXME("stub \n");
808     return E_NOTIMPL;
809 }
810
811 static HRESULT WINAPI WB_put_Height(LPWEBBROWSER iface, long Height)
812 {
813     FIXME("stub \n");
814     return E_NOTIMPL;
815 }
816
817 static HRESULT WINAPI WB_get_LocationName(LPWEBBROWSER iface, BSTR *LocationName)
818 {
819     FIXME("stub \n");
820     return E_NOTIMPL;
821 }
822
823 static HRESULT WINAPI WB_get_LocationURL(LPWEBBROWSER iface, BSTR *LocationURL)
824 {
825     FIXME("stub \n");
826     return E_NOTIMPL;
827 }
828
829 static HRESULT WINAPI WB_get_Busy(LPWEBBROWSER iface, VARIANT *pBool)
830 {
831     FIXME("stub \n");
832     return E_NOTIMPL;
833 }
834
835 /**********************************************************************
836  * IWebBrowser virtual function table for IE Web Browser component
837  */
838
839 static ICOM_VTABLE(IWebBrowser) WB_Vtbl = 
840 {
841     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
842     WB_QueryInterface,
843     WB_AddRef,
844     WB_Release,
845     WB_GetTypeInfoCount,
846     WB_GetTypeInfo,
847     WB_GetIDsOfNames,
848     WB_Invoke,
849     WB_GoBack,
850     WB_GoForward,
851     WB_GoHome,
852     WB_GoSearch,
853     WB_Navigate,
854     WB_Refresh,
855     WB_Refresh2,
856     WB_Stop,
857     WB_get_Application,
858     WB_get_Parent,
859     WB_get_Container,
860     WB_get_Document,
861     WB_get_TopLevelContainer,
862     WB_get_Type,
863     WB_get_Left,
864     WB_put_Left,
865     WB_get_Top,
866     WB_put_Top,
867     WB_get_Width,
868     WB_put_Width,
869     WB_get_Height,
870     WB_put_Height,
871     WB_get_LocationName,
872     WB_get_LocationURL,
873     WB_get_Busy
874 };
875
876
877 /***************************************************************************
878  *
879  *      CWebBrowserImpl::IProvideClassInfo2
880  */
881
882 /**********************************************************************
883  * Implement the IProvideClassInfo2 interface (inherits from
884  * IProvideClassInfo).
885  */
886
887 static HRESULT WINAPI WBPCI2_QueryInterface(LPPROVIDECLASSINFO2 iface,
888                                             REFIID riid, LPVOID *ppobj)
889 {
890         CWebBrowserImpl_THIS(iface,vfpcinfo);
891
892         TRACE("(%p)->()\n",This);
893
894         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
895 }
896
897 static ULONG WINAPI WBPCI2_AddRef(LPPROVIDECLASSINFO2 iface)
898 {
899         CWebBrowserImpl_THIS(iface,vfpcinfo);
900
901         TRACE("(%p)->()\n",This);
902
903         return IUnknown_AddRef(This->vfunk.punkControl);
904 }
905
906 static ULONG WINAPI WBPCI2_Release(LPPROVIDECLASSINFO2 iface)
907 {
908         CWebBrowserImpl_THIS(iface,vfpcinfo);
909
910         TRACE("(%p)->()\n",This);
911
912         return IUnknown_Release(This->vfunk.punkControl);
913 }
914
915 /* Return an ITypeInfo interface to retrieve type library info about
916  * this control.
917  */
918 static HRESULT WINAPI WBPCI2_GetClassInfo(LPPROVIDECLASSINFO2 iface, LPTYPEINFO *ppTI)
919 {
920     FIXME("stub: LPTYPEINFO = %p\n", *ppTI);
921     return E_NOTIMPL;
922 }
923
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)
927  * to this control.
928 */
929 static HRESULT WINAPI WBPCI2_GetGUID(LPPROVIDECLASSINFO2 iface,
930                                      DWORD dwGuidKind, GUID *pGUID)
931 {
932     FIXME("stub: dwGuidKind = %ld, pGUID = %s\n", dwGuidKind, debugstr_guid(pGUID));
933 #if 0
934     if (dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID)
935     {
936         FIXME ("Requested unsupported GUID type: %ld\n", dwGuidKind);
937         return E_FAIL;  /* Is there a better return type here? */
938     }
939
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).
945      */
946     memcpy(pGUID, &IID_IPropertyNotifySink, sizeof(GUID));
947     FIXME("Wrongly returning IPropertyNotifySink interface %s\n",
948           debugstr_guid(pGUID));
949 #endif
950
951     return E_NOTIMPL;
952 }
953
954 /**********************************************************************
955  * IProvideClassInfo virtual function table for IE Web Browser component
956  */
957
958 static ICOM_VTABLE(IProvideClassInfo2) WBPCI2_Vtbl = 
959 {
960     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
961     WBPCI2_QueryInterface,
962     WBPCI2_AddRef,
963     WBPCI2_Release,
964     WBPCI2_GetClassInfo,
965     WBPCI2_GetGUID
966 };
967
968 /***************************************************************************
969  *
970  *      CWebBrowserImpl::IPersistStorage
971  */
972
973 /**********************************************************************
974  * Implement the IPersistStorage interface
975  */
976
977 static HRESULT WINAPI WBPS_QueryInterface(LPPERSISTSTORAGE iface,
978                                           REFIID riid, LPVOID *ppobj)
979 {
980         CWebBrowserImpl_THIS(iface,vfpstrg);
981
982         TRACE("(%p)->()\n",This);
983
984         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
985 }
986
987 static ULONG WINAPI WBPS_AddRef(LPPERSISTSTORAGE iface)
988 {
989         CWebBrowserImpl_THIS(iface,vfpstrg);
990
991         TRACE("(%p)->()\n",This);
992
993         return IUnknown_AddRef(This->vfunk.punkControl);
994 }
995
996 static ULONG WINAPI WBPS_Release(LPPERSISTSTORAGE iface)
997 {
998         CWebBrowserImpl_THIS(iface,vfpstrg);
999
1000         TRACE("(%p)->()\n",This);
1001
1002         return IUnknown_Release(This->vfunk.punkControl);
1003 }
1004
1005 static HRESULT WINAPI WBPS_GetClassID(LPPERSISTSTORAGE iface, CLSID *pClassID)
1006 {
1007     FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
1008     return E_NOTIMPL;
1009 }
1010
1011 static HRESULT WINAPI WBPS_IsDirty(LPPERSISTSTORAGE iface)
1012 {
1013     FIXME("stub\n");
1014     return E_NOTIMPL;
1015 }
1016
1017 static HRESULT WINAPI WBPS_InitNew(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
1018 {
1019     FIXME("stub: LPSTORAGE = %p\n", pStg);
1020     return E_NOTIMPL;
1021 }
1022
1023 static HRESULT WINAPI WBPS_Load(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
1024 {
1025     FIXME("stub: LPSTORAGE = %p\n", pStg);
1026     return E_NOTIMPL;
1027 }
1028
1029 static HRESULT WINAPI WBPS_Save(LPPERSISTSTORAGE iface, LPSTORAGE pStg,
1030                                 BOOL fSameAsLoad)
1031 {
1032     FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
1033     return E_NOTIMPL;
1034 }
1035
1036 static HRESULT WINAPI WBPS_SaveCompleted(LPPERSISTSTORAGE iface, LPSTORAGE pStgNew)
1037 {
1038     FIXME("stub: LPSTORAGE = %p\n", pStgNew);
1039     return E_NOTIMPL;
1040 }
1041
1042 /**********************************************************************
1043  * IPersistStorage virtual function table for IE Web Browser component
1044  */
1045
1046 static ICOM_VTABLE(IPersistStorage) WBPS_Vtbl = 
1047 {
1048     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1049     WBPS_QueryInterface,
1050     WBPS_AddRef,
1051     WBPS_Release,
1052     WBPS_GetClassID,
1053     WBPS_IsDirty,
1054     WBPS_InitNew,
1055     WBPS_Load,
1056     WBPS_Save,
1057     WBPS_SaveCompleted
1058 };
1059
1060
1061 /***************************************************************************
1062  *
1063  *      CWebBrowserImpl::IPersistStreamInit
1064  */
1065
1066
1067
1068 /**********************************************************************
1069  * Implement the IPersistStreamInit interface
1070  */
1071
1072 static HRESULT WINAPI WBPSI_QueryInterface(LPPERSISTSTREAMINIT iface,
1073                                            REFIID riid, LPVOID *ppobj)
1074 {
1075         CWebBrowserImpl_THIS(iface,vfpstrminit);
1076
1077         TRACE("(%p)->()\n",This);
1078
1079         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
1080 }
1081
1082 static ULONG WINAPI WBPSI_AddRef(LPPERSISTSTREAMINIT iface)
1083 {
1084         CWebBrowserImpl_THIS(iface,vfpstrminit);
1085
1086         TRACE("(%p)->()\n",This);
1087
1088         return IUnknown_AddRef(This->vfunk.punkControl);
1089 }
1090
1091 static ULONG WINAPI WBPSI_Release(LPPERSISTSTREAMINIT iface)
1092 {
1093         CWebBrowserImpl_THIS(iface,vfpstrminit);
1094
1095         TRACE("(%p)->()\n",This);
1096
1097         return IUnknown_Release(This->vfunk.punkControl);
1098 }
1099
1100 static HRESULT WINAPI WBPSI_GetClassID(LPPERSISTSTREAMINIT iface, CLSID *pClassID)
1101 {
1102     FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
1103     return E_NOTIMPL;
1104 }
1105
1106 static HRESULT WINAPI WBPSI_IsDirty(LPPERSISTSTREAMINIT iface)
1107 {
1108     FIXME("stub\n");
1109     return E_NOTIMPL;
1110 }
1111
1112 static HRESULT WINAPI WBPSI_Load(LPPERSISTSTREAMINIT iface, LPSTREAM pStg)
1113 {
1114     FIXME("stub: LPSTORAGE = %p\n", pStg);
1115     return E_NOTIMPL;
1116 }
1117
1118 static HRESULT WINAPI WBPSI_Save(LPPERSISTSTREAMINIT iface, LPSTREAM pStg,
1119                                 BOOL fSameAsLoad)
1120 {
1121     FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
1122     return E_NOTIMPL;
1123 }
1124
1125 static HRESULT WINAPI WBPSI_GetSizeMax(LPPERSISTSTREAMINIT iface,
1126                                        ULARGE_INTEGER *pcbSize)
1127 {
1128     FIXME("stub: ULARGE_INTEGER = %p\n", pcbSize);
1129     return E_NOTIMPL;
1130 }
1131
1132 static HRESULT WINAPI WBPSI_InitNew(LPPERSISTSTREAMINIT iface)
1133 {
1134     FIXME("stub\n");
1135     return E_NOTIMPL;
1136 }
1137
1138 /**********************************************************************
1139  * IPersistStreamInit virtual function table for IE Web Browser component
1140  */
1141
1142 static ICOM_VTABLE(IPersistStreamInit) WBPSI_Vtbl = 
1143 {
1144     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1145     WBPSI_QueryInterface,
1146     WBPSI_AddRef,
1147     WBPSI_Release,
1148     WBPSI_GetClassID,
1149     WBPSI_IsDirty,
1150     WBPSI_Load,
1151     WBPSI_Save,
1152     WBPSI_GetSizeMax,
1153     WBPSI_InitNew
1154 };
1155
1156 /***************************************************************************
1157  *
1158  *      CWebBrowserImpl::IQuickActivate
1159  */
1160
1161 /**********************************************************************
1162  * Implement the IQuickActivate interface
1163  */
1164
1165 static HRESULT WINAPI WBQA_QueryInterface(LPQUICKACTIVATE iface,
1166                                           REFIID riid, LPVOID *ppobj)
1167 {
1168         CWebBrowserImpl_THIS(iface,vfqactive);
1169
1170         TRACE("(%p)->()\n",This);
1171
1172         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
1173 }
1174
1175 static ULONG WINAPI WBQA_AddRef(LPQUICKACTIVATE iface)
1176 {
1177         CWebBrowserImpl_THIS(iface,vfqactive);
1178
1179         TRACE("(%p)->()\n",This);
1180
1181         return IUnknown_AddRef(This->vfunk.punkControl);
1182 }
1183
1184 static ULONG WINAPI WBQA_Release(LPQUICKACTIVATE iface)
1185 {
1186         CWebBrowserImpl_THIS(iface,vfqactive);
1187
1188         TRACE("(%p)->()\n",This);
1189
1190         return IUnknown_Release(This->vfunk.punkControl);
1191 }
1192
1193 /* Alternative interface for quicker, easier activation of a control. */
1194 static HRESULT WINAPI WBQA_QuickActivate(LPQUICKACTIVATE iface,
1195                                          QACONTAINER *pQaContainer,
1196                                          QACONTROL *pQaControl)
1197 {
1198     FIXME("stub: QACONTAINER = %p, QACONTROL = %p\n", pQaContainer, pQaControl);
1199     return E_NOTIMPL;
1200 }
1201
1202 static HRESULT WINAPI WBQA_SetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
1203 {
1204     FIXME("stub: LPSIZEL = %p\n", pSizel);
1205     return E_NOTIMPL;
1206 }
1207
1208 static HRESULT WINAPI WBQA_GetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
1209 {
1210     FIXME("stub: LPSIZEL = %p\n", pSizel);
1211     return E_NOTIMPL;
1212 }
1213
1214 /**********************************************************************
1215  * IQuickActivate virtual function table for IE Web Browser component
1216  */
1217
1218 static ICOM_VTABLE(IQuickActivate) WBQA_Vtbl = 
1219 {
1220     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1221     WBQA_QueryInterface,
1222     WBQA_AddRef,
1223     WBQA_Release,
1224     WBQA_QuickActivate,
1225     WBQA_SetContentExtent,
1226     WBQA_GetContentExtent
1227 };
1228
1229
1230 /***************************************************************************
1231  *
1232  *      CWebBrowserImpl::IConnectionPointContainer
1233  */
1234
1235 /**********************************************************************
1236  * Implement the IConnectionPointContainer interface
1237  */
1238
1239 static HRESULT WINAPI WBCPC_QueryInterface(LPCONNECTIONPOINTCONTAINER iface,
1240                                            REFIID riid, LPVOID *ppobj)
1241 {
1242         CWebBrowserImpl_THIS(iface,vfcpointcont);
1243
1244         TRACE("(%p)->()\n",This);
1245
1246         return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
1247 }
1248
1249 static ULONG WINAPI WBCPC_AddRef(LPCONNECTIONPOINTCONTAINER iface)
1250 {
1251         CWebBrowserImpl_THIS(iface,vfcpointcont);
1252
1253         TRACE("(%p)->()\n",This);
1254
1255         return IUnknown_AddRef(This->vfunk.punkControl);
1256 }
1257
1258 static ULONG WINAPI WBCPC_Release(LPCONNECTIONPOINTCONTAINER iface)
1259 {
1260         CWebBrowserImpl_THIS(iface,vfcpointcont);
1261
1262         TRACE("(%p)->()\n",This);
1263
1264         return IUnknown_Release(This->vfunk.punkControl);
1265 }
1266
1267 /* Get a list of connection points inside this container. */
1268 static HRESULT WINAPI WBCPC_EnumConnectionPoints(LPCONNECTIONPOINTCONTAINER iface,
1269                                                  LPENUMCONNECTIONPOINTS *ppEnum)
1270 {
1271     FIXME("stub: IEnumConnectionPoints = %p\n", *ppEnum);
1272     return E_NOTIMPL;
1273 }
1274
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.
1278  */
1279 static HRESULT WINAPI WBCPC_FindConnectionPoint(LPCONNECTIONPOINTCONTAINER iface,
1280                                                 REFIID riid, LPCONNECTIONPOINT *ppCP)
1281 {
1282     FIXME(": IID = %s, IConnectionPoint = %p\n", debugstr_guid(riid), *ppCP);
1283
1284 #if 0
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.
1288      */
1289     if (IsEqualGUID (&IID_INotifyDBEvents, riid))
1290     {
1291         TRACE("Returning connection point %p for IID_INotifyDBEvents\n",
1292               &SHDOCVW_ConnectionPoint);
1293         *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
1294         return S_OK;
1295     }
1296     else if (IsEqualGUID (&IID_IPropertyNotifySink, riid))
1297     {
1298         TRACE("Returning connection point %p for IID_IPropertyNotifySink\n",
1299               &SHDOCVW_ConnectionPoint);
1300         *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
1301         return S_OK;
1302     }
1303 #endif
1304
1305     return E_NOTIMPL;
1306 }
1307
1308 /**********************************************************************
1309  * IConnectionPointContainer virtual function table for IE Web Browser component
1310  */
1311
1312 static ICOM_VTABLE(IConnectionPointContainer) WBCPC_Vtbl =
1313 {
1314     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1315     WBCPC_QueryInterface,
1316     WBCPC_AddRef,
1317     WBCPC_Release,
1318     WBCPC_EnumConnectionPoints,
1319     WBCPC_FindConnectionPoint
1320 };
1321
1322
1323
1324 /***************************************************************************
1325  *
1326  *      new/delete CWebBrowserImpl
1327  *
1328  */
1329
1330 static void CWebBrowserImpl_Destructor(IUnknown* iface)
1331 {
1332         CWebBrowserImpl_THIS(iface,vfunk);
1333
1334         FIXME("(%p)\n",This);
1335
1336         /* destructor */
1337 }
1338
1339 HRESULT CWebBrowserImpl_AllocObj(IUnknown* punkOuter,void** ppobj)
1340 {
1341         CWebBrowserImpl*        This;
1342
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;
1349
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;
1359
1360         /* constructor */
1361         FIXME("()\n");
1362
1363         *ppobj = (void*)(&This->vfunk);
1364
1365         return S_OK;
1366 }
1367
1368