Added msvcrt/eh.h.
[wine] / dlls / shdocvw / oleobject.c
1 /*
2  * Implementation of IOleObject interfaces for IE Web Browser
3  *
4  * - IOleObject
5  * - IOleInPlaceObject
6  * - IOleControl
7  *
8  * 2001 John R. Sheets (for CodeWeavers)
9  */
10
11 #include <string.h>
12 #include "debugtools.h"
13 #include "shdocvw.h"
14 #include "ole2.h"
15
16 DEFAULT_DEBUG_CHANNEL(shdocvw);
17
18 /**********************************************************************
19  * Implement the IOleObject interface for the web browser component
20  *
21  * Based on DefaultHandler code in dlls/ole32/defaulthandler.c.
22  */
23
24 static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface);
25 static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface);
26
27 /************************************************************************
28  * WBOOBJ_QueryInterface (IUnknown)
29  *
30  * Interfaces we need to (at least pretend to) retrieve:
31  *
32  *   a6bc3ac0-dbaa-11ce-9de3-00aa004bb851  IID_IProvideClassInfo2
33  *   b196b283-bab4-101a-b69c-00aa00341d07  IID_IProvideClassInfo
34  *   cf51ed10-62fe-11cf-bf86-00a0c9034836  IID_IQuickActivate
35  *   7fd52380-4e07-101b-ae2d-08002b2ec713  IID_IPersistStreamInit
36  *   0000010a-0000-0000-c000-000000000046  IID_IPersistStorage
37  *   b196b284-bab4-101a-b69c-00aa00341d07  IID_IConnectionPointContainer
38  */
39 static HRESULT WINAPI WBOOBJ_QueryInterface(LPOLEOBJECT iface,
40                                             REFIID riid, void** ppobj)
41 {
42     ICOM_THIS(IOleObjectImpl, iface);
43
44     /*
45      * Perform a sanity check on the parameters.
46      */
47     if ((This == NULL) || (ppobj == NULL) )
48         return E_INVALIDARG;
49
50     if (IsEqualGUID (&IID_IPersistStorage, riid))
51     {
52         TRACE("Returning IID_IPersistStorage interface\n");
53         *ppobj = (LPVOID)&SHDOCVW_PersistStorage;
54         WBOOBJ_AddRef (iface);
55         return S_OK;
56     }
57     else if (IsEqualGUID (&IID_IPersistStreamInit, riid))
58     {
59         TRACE("Returning IID_IPersistStreamInit interface\n");
60         *ppobj = (LPVOID)&SHDOCVW_PersistStreamInit;
61         WBOOBJ_AddRef (iface);
62         return S_OK;
63     }
64     else if (IsEqualGUID (&IID_IProvideClassInfo, riid))
65     {
66         TRACE("Returning IID_IProvideClassInfo interface\n");
67         *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo;
68         WBOOBJ_AddRef (iface);
69         return S_OK;
70     }
71     else if (IsEqualGUID (&IID_IProvideClassInfo2, riid))
72     {
73         TRACE("Returning IID_IProvideClassInfo2 interface %p\n",
74               &SHDOCVW_ProvideClassInfo2);
75         *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo2;
76         WBOOBJ_AddRef (iface);
77         return S_OK;
78     }
79     else if (IsEqualGUID (&IID_IQuickActivate, riid))
80     {
81         TRACE("Returning IID_IQuickActivate interface\n");
82         *ppobj = (LPVOID)&SHDOCVW_QuickActivate;
83         WBOOBJ_AddRef (iface);
84         return S_OK;
85     }
86     else if (IsEqualGUID (&IID_IConnectionPointContainer, riid))
87     {
88         TRACE("Returning IID_IConnectionPointContainer interface\n");
89         *ppobj = (LPVOID)&SHDOCVW_ConnectionPointContainer;
90         WBOOBJ_AddRef (iface);
91         return S_OK;
92     }
93     else if (IsEqualGUID (&IID_IOleInPlaceObject, riid))
94     {
95         TRACE("Returning IID_IOleInPlaceObject interface\n");
96         *ppobj = (LPVOID)&SHDOCVW_OleInPlaceObject;
97         WBOOBJ_AddRef (iface);
98         return S_OK;
99     }
100     else if (IsEqualGUID (&IID_IOleControl, riid))
101     {
102         TRACE("Returning IID_IOleControl interface\n");
103         *ppobj = (LPVOID)&SHDOCVW_OleControl;
104         WBOOBJ_AddRef (iface);
105         return S_OK;
106     }
107     else if (IsEqualGUID (&IID_IWebBrowser, riid))
108     {
109         TRACE("Returning IID_IWebBrowser interface\n");
110         *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
111         WBOOBJ_AddRef (iface);
112         return S_OK;
113     }
114     else if (IsEqualGUID (&IID_IDispatch, riid))
115     {
116         TRACE("Returning IID_IDispatch interface\n");
117         *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
118         WBOOBJ_AddRef (iface);
119         return S_OK;
120     }
121
122     TRACE ("Failed to find iid = %s\n", debugstr_guid(riid));
123
124     return E_NOINTERFACE;
125 }
126
127 /************************************************************************
128  * WBOOBJ_AddRef (IUnknown)
129  */
130 static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)
131 {
132     ICOM_THIS(IOleObjectImpl, iface);
133
134     TRACE("\n");
135     return ++(This->ref);
136 }
137
138 /************************************************************************
139  * WBOOBJ_Release (IUnknown)
140  */
141 static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)
142 {
143     ICOM_THIS(IOleObjectImpl, iface);
144
145     /* static class, won't be freed */
146     TRACE("\n");
147     return --(This->ref);
148 }
149
150 /************************************************************************
151  * WBOOBJ_SetClientSite (IOleObject)
152  */
153 static HRESULT WINAPI WBOOBJ_SetClientSite(LPOLEOBJECT iface,
154                                            LPOLECLIENTSITE pClientSite)
155 {
156     FIXME("stub: (%p, %p)\n", iface, pClientSite);
157     return S_OK;
158 }
159
160 /************************************************************************
161  * WBOOBJ_GetClientSite (IOleObject)
162  */
163 static HRESULT WINAPI WBOOBJ_GetClientSite(LPOLEOBJECT iface,
164                                            LPOLECLIENTSITE* ppClientSite)
165 {
166     FIXME("stub: (%p)\n", *ppClientSite);
167     return S_OK;
168 }
169
170 /************************************************************************
171  * WBOOBJ_SetHostNames (IOleObject)
172  */
173 static HRESULT WINAPI WBOOBJ_SetHostNames(LPOLEOBJECT iface, LPCOLESTR szContainerApp,
174                                           LPCOLESTR szContainerObj)
175 {
176     FIXME("stub: (%p, %s, %s)\n", iface, debugstr_w(szContainerApp),
177           debugstr_w(szContainerObj));
178     return S_OK;
179 }
180
181 /************************************************************************
182  * WBOOBJ_Close (IOleObject)
183  */
184 static HRESULT WINAPI WBOOBJ_Close(LPOLEOBJECT iface, DWORD dwSaveOption)
185 {
186     FIXME("stub: ()\n");
187     return S_OK;
188 }
189
190 /************************************************************************
191  * WBOOBJ_SetMoniker (IOleObject)
192  */
193 static HRESULT WINAPI WBOOBJ_SetMoniker(LPOLEOBJECT iface,
194                                         DWORD dwWhichMoniker, IMoniker* pmk)
195 {
196     FIXME("stub: (%p, %ld, %p)\n", iface, dwWhichMoniker, pmk);
197     return S_OK;
198 }
199
200 /************************************************************************
201  * WBOOBJ_GetMoniker (IOleObject)
202  *
203  * Delegate this request to the client site if we have one.
204  */
205 static HRESULT WINAPI WBOOBJ_GetMoniker(LPOLEOBJECT iface, DWORD dwAssign,
206                                         DWORD dwWhichMoniker, LPMONIKER *ppmk)
207 {
208     FIXME("stub (%p, %ld, %ld, %p)\n", iface, dwAssign, dwWhichMoniker, ppmk);
209     return E_UNSPEC;
210 }
211
212 /************************************************************************
213  * WBOOBJ_InitFromData (IOleObject)
214  *
215  * This method is meaningless if the server is not running
216  */
217 static HRESULT WINAPI WBOOBJ_InitFromData(LPOLEOBJECT iface, LPDATAOBJECT pDataObject,
218                                           BOOL fCreation, DWORD dwReserved)
219 {
220     FIXME("stub: (%p, %p, %d, %ld)\n", iface, pDataObject, fCreation, dwReserved);
221     return OLE_E_NOTRUNNING;
222 }
223
224 /************************************************************************
225  * WBOOBJ_GetClipboardData (IOleObject)
226  *
227  * This method is meaningless if the server is not running
228  */
229 static HRESULT WINAPI WBOOBJ_GetClipboardData(LPOLEOBJECT iface, DWORD dwReserved,
230                                               LPDATAOBJECT *ppDataObject)
231 {
232     FIXME("stub: (%p, %ld, %p)\n", iface, dwReserved, ppDataObject);
233     return OLE_E_NOTRUNNING;
234 }
235
236 /************************************************************************
237  * WBOOBJ_DoVerb (IOleObject)
238  */
239 static HRESULT WINAPI WBOOBJ_DoVerb(LPOLEOBJECT iface, LONG iVerb, struct tagMSG* lpmsg,
240                                     LPOLECLIENTSITE pActiveSite, LONG lindex,
241                                     HWND hwndParent, LPCRECT lprcPosRect)
242 {
243     FIXME(": stub iVerb = %ld\n", iVerb);
244     switch (iVerb)
245     {
246     case OLEIVERB_INPLACEACTIVATE:
247         FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
248         break;
249     case OLEIVERB_HIDE:
250         FIXME ("stub for OLEIVERB_HIDE\n");
251         break;
252     }
253
254     return S_OK;
255 }
256
257 /************************************************************************
258  * WBOOBJ_EnumVerbs (IOleObject)
259  *
260  * Delegate to OleRegEnumVerbs.
261  */
262 static HRESULT WINAPI WBOOBJ_EnumVerbs(LPOLEOBJECT iface,
263                                        IEnumOLEVERB** ppEnumOleVerb)
264 {
265     TRACE("(%p, %p)\n", iface, ppEnumOleVerb);
266
267     return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
268 }
269
270 /************************************************************************
271  * WBOOBJ_EnumVerbs (IOleObject)
272  */
273 static HRESULT WINAPI WBOOBJ_Update(LPOLEOBJECT iface)
274 {
275     FIXME(": Stub\n");
276     return E_NOTIMPL;
277 }
278
279 /************************************************************************
280  * WBOOBJ_IsUpToDate (IOleObject)
281  *
282  * This method is meaningless if the server is not running
283  */
284 static HRESULT WINAPI WBOOBJ_IsUpToDate(LPOLEOBJECT iface)
285 {
286     FIXME("(%p)\n", iface);
287     return OLE_E_NOTRUNNING;
288 }
289
290 /************************************************************************
291  * WBOOBJ_GetUserClassID (IOleObject)
292  */
293 static HRESULT WINAPI WBOOBJ_GetUserClassID(LPOLEOBJECT iface, CLSID* pClsid)
294 {
295     FIXME("stub: (%p, %p)\n", iface, pClsid);
296     return S_OK;
297 }
298
299 /************************************************************************
300  * WBOOBJ_GetUserType (IOleObject)
301  *
302  * Delegate to OleRegGetUserType.
303  */
304 static HRESULT WINAPI WBOOBJ_GetUserType(LPOLEOBJECT iface, DWORD dwFormOfType,
305                                          LPOLESTR* pszUserType)
306 {
307     TRACE("(%p, %ld, %p)\n", iface, dwFormOfType, pszUserType);
308
309     return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
310 }
311
312 /************************************************************************
313  * WBOOBJ_SetExtent (IOleObject)
314  *
315  * This method is meaningless if the server is not running
316  */
317 static HRESULT WINAPI WBOOBJ_SetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
318                                        SIZEL* psizel)
319 {
320     FIXME("stub: (%p, %lx, (%ld x %ld))\n", iface, dwDrawAspect,
321           psizel->cx, psizel->cy);
322     return OLE_E_NOTRUNNING;
323 }
324
325 /************************************************************************
326  * WBOOBJ_GetExtent (IOleObject)
327  */
328 static HRESULT WINAPI WBOOBJ_GetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
329                                        SIZEL* psizel)
330 {
331     FIXME("stub: (%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
332     return S_OK;
333 }
334
335 /************************************************************************
336  * WBOOBJ_Advise (IOleObject)
337  */
338 static HRESULT WINAPI WBOOBJ_Advise(LPOLEOBJECT iface, IAdviseSink* pAdvSink,
339                                     DWORD* pdwConnection)
340 {
341     FIXME("stub: (%p, %p, %p)\n", iface, pAdvSink, pdwConnection);
342     return S_OK;
343 }
344
345 /************************************************************************
346  * WBOOBJ_Unadvise (IOleObject)
347  */
348 static HRESULT WINAPI WBOOBJ_Unadvise(LPOLEOBJECT iface, DWORD dwConnection)
349 {
350     FIXME("stub: (%p, %ld)\n", iface, dwConnection);
351     return S_OK;
352 }
353
354 /************************************************************************
355  * WBOOBJ_EnumAdvise (IOleObject)
356  */
357 static HRESULT WINAPI WBOOBJ_EnumAdvise(LPOLEOBJECT iface, IEnumSTATDATA** ppenumAdvise)
358 {
359     FIXME("stub: (%p, %p)\n", iface, ppenumAdvise);
360     return S_OK;
361 }
362
363 /************************************************************************
364  * WBOOBJ_GetMiscStatus (IOleObject)
365  *
366  * Delegate to OleRegGetMiscStatus.
367  */
368 static HRESULT WINAPI WBOOBJ_GetMiscStatus(LPOLEOBJECT iface, DWORD dwAspect,
369                                            DWORD* pdwStatus)
370 {
371     HRESULT hres;
372
373     TRACE("(%p, %lx, %p)\n", iface, dwAspect, pdwStatus);
374
375     hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
376
377     if (FAILED(hres))
378         *pdwStatus = 0;
379
380     return S_OK;
381 }
382
383 /************************************************************************
384  * WBOOBJ_SetColorScheme (IOleObject)
385  *
386  * This method is meaningless if the server is not running
387  */
388 static HRESULT WINAPI WBOOBJ_SetColorScheme(LPOLEOBJECT iface,
389                                             struct tagLOGPALETTE* pLogpal)
390 {
391     FIXME("stub: (%p, %p))\n", iface, pLogpal);
392     return OLE_E_NOTRUNNING;
393 }
394
395 /**********************************************************************
396  * IOleObject virtual function table for IE Web Browser component
397  */
398
399 static ICOM_VTABLE(IOleObject) WBOOBJ_Vtbl = 
400 {
401     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
402     WBOOBJ_QueryInterface,
403     WBOOBJ_AddRef,
404     WBOOBJ_Release,
405     WBOOBJ_SetClientSite,
406     WBOOBJ_GetClientSite,
407     WBOOBJ_SetHostNames,
408     WBOOBJ_Close,
409     WBOOBJ_SetMoniker,
410     WBOOBJ_GetMoniker,
411     WBOOBJ_InitFromData,
412     WBOOBJ_GetClipboardData,
413     WBOOBJ_DoVerb,
414     WBOOBJ_EnumVerbs,
415     WBOOBJ_Update,
416     WBOOBJ_IsUpToDate,
417     WBOOBJ_GetUserClassID,
418     WBOOBJ_GetUserType,
419     WBOOBJ_SetExtent,
420     WBOOBJ_GetExtent,
421     WBOOBJ_Advise,
422     WBOOBJ_Unadvise,
423     WBOOBJ_EnumAdvise,
424     WBOOBJ_GetMiscStatus,
425     WBOOBJ_SetColorScheme
426 };
427
428 IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };
429
430
431 /**********************************************************************
432  * Implement the IOleInPlaceObject interface
433  */
434
435 static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,
436                                             REFIID riid, LPVOID *ppobj)
437 {
438     ICOM_THIS(IOleInPlaceObjectImpl, iface);
439
440     FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
441     return E_NOINTERFACE;
442 }
443
444 static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
445 {
446     ICOM_THIS(IOleInPlaceObjectImpl, iface);
447
448     TRACE("\n");
449     return ++(This->ref);
450 }
451
452 static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)
453 {
454     ICOM_THIS(IOleInPlaceObjectImpl, iface);
455
456     /* static class, won't be freed */
457     TRACE("\n");
458     return --(This->ref);
459 }
460
461 static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)
462 {
463 #if 0
464     /* Create a fake window to fool MFC into believing that we actually
465      * have an implemented browser control.  Avoids the assertion.
466      */
467     HWND hwnd;
468     hwnd = CreateWindowA("BUTTON", "Web Control",
469                         WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW,
470                         CW_USEDEFAULT, CW_USEDEFAULT, 600,
471                         400, NULL, NULL, NULL, NULL);
472
473     *phwnd = hwnd;
474     TRACE ("Returning hwnd = %d\n", hwnd);
475 #endif
476
477     FIXME("stub HWND* = %p\n", phwnd);
478     return S_OK;
479 }
480
481 static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
482                                                   BOOL fEnterMode)
483 {
484     FIXME("stub fEnterMode = %d\n", fEnterMode);
485     return S_OK;
486 }
487
488 static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
489 {
490     FIXME("stub \n");
491     return S_OK;
492 }
493
494 static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
495 {
496     FIXME("stub \n");
497     return S_OK;
498 }
499
500 static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
501                                             LPCRECT lprcPosRect, LPCRECT lprcClipRect)
502 {
503     FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
504     return S_OK;
505 }
506
507 static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
508 {
509     FIXME("stub \n");
510     return S_OK;
511 }
512
513 /**********************************************************************
514  * IOleInPlaceObject virtual function table for IE Web Browser component
515  */
516
517 static ICOM_VTABLE(IOleInPlaceObject) WBOIPO_Vtbl = 
518 {
519     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
520     WBOIPO_QueryInterface,
521     WBOIPO_AddRef,
522     WBOIPO_Release,
523     WBOIPO_GetWindow,
524     WBOIPO_ContextSensitiveHelp,
525     WBOIPO_InPlaceDeactivate,
526     WBOIPO_UIDeactivate,
527     WBOIPO_SetObjectRects,
528     WBOIPO_ReactivateAndUndo
529 };
530
531 IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };
532
533
534 /**********************************************************************
535  * Implement the IOleControl interface
536  */
537
538 static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,
539                                           REFIID riid, LPVOID *ppobj)
540 {
541     ICOM_THIS(IOleControlImpl, iface);
542
543     FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
544     return E_NOINTERFACE;
545 }
546
547 static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
548 {
549     ICOM_THIS(IOleControlImpl, iface);
550
551     TRACE("\n");
552     return ++(This->ref);
553 }
554
555 static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)
556 {
557     ICOM_THIS(IOleControlImpl, iface);
558
559     /* static class, won't be freed */
560     TRACE("\n");
561     return --(This->ref);
562 }
563
564 static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
565 {
566     FIXME("stub: LPCONTROLINFO = %p\n", pCI);
567     return S_OK;
568 }
569
570 static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
571 {
572     FIXME("stub: MSG* = %p\n", pMsg);
573     return S_OK;
574 }
575
576 static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
577 {
578     FIXME("stub: DISPID = %ld\n", dispID);
579     return S_OK;
580 }
581
582 static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
583 {
584     FIXME("stub: bFreeze = %d\n", bFreeze);
585     return S_OK;
586 }
587
588 /**********************************************************************
589  * IOleControl virtual function table for IE Web Browser component
590  */
591
592 static ICOM_VTABLE(IOleControl) WBOC_Vtbl = 
593 {
594     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
595     WBOC_QueryInterface,
596     WBOC_AddRef,
597     WBOC_Release,
598     WBOC_GetControlInfo,
599     WBOC_OnMnemonic,
600     WBOC_OnAmbientPropertyChange,
601     WBOC_FreezeEvents
602 };
603
604 IOleControlImpl SHDOCVW_OleControl = { &WBOC_Vtbl, 1 };