source: trunk/src/shdocvw/oleobject.c@ 6712

Last change on this file since 6712 was 6712, checked in by sandervl, 24 years ago

restored old version

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