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

Last change on this file since 6649 was 6649, checked in by bird, 24 years ago

Added $Id:$ keyword.

File size: 17.1 KB
Line 
1/* $Id: oleobject.c,v 1.2 2001-09-05 13:39:12 bird Exp $ */
2/*
3 * Implementation of IOleObject interfaces for IE Web Browser
4 *
5 * - IOleObject
6 * - IOleInPlaceObject
7 * - IOleControl
8 *
9 * 2001 John R. Sheets (for CodeWeavers)
10 */
11
12#include "debugtools.h"
13#include "shdocvw.h"
14#include "ole2.h"
15
16DEFAULT_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
24static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface);
25static 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 */
39static 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 */
130static 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 */
141static 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 */
153static 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 */
163static 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 */
173static 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 */
184static 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 */
193static 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 */
205static 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 */
217static 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 */
229static 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 */
239static 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 */
262static 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 */
273static 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 */
284static 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 */
293static 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 */
304static 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 */
317static 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 */
328static 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 */
338static 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 */
348static 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 */
357static 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 */
368static 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 */
388static 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
399static 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
428IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };
429
430
431/**********************************************************************
432 * Implement the IOleInPlaceObject interface
433 */
434
435static 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
444static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
445{
446 ICOM_THIS(IOleInPlaceObjectImpl, iface);
447
448 TRACE("\n");
449 return ++(This->ref);
450}
451
452static 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
461static 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
481static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
482 BOOL fEnterMode)
483{
484 FIXME("stub fEnterMode = %d\n", fEnterMode);
485 return S_OK;
486}
487
488static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
489{
490 FIXME("stub \n");
491 return S_OK;
492}
493
494static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
495{
496 FIXME("stub \n");
497 return S_OK;
498}
499
500static 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
507static 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
517static 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
531IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };
532
533
534/**********************************************************************
535 * Implement the IOleControl interface
536 */
537
538static 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
547static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
548{
549 ICOM_THIS(IOleControlImpl, iface);
550
551 TRACE("\n");
552 return ++(This->ref);
553}
554
555static 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
564static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
565{
566 FIXME("stub: LPCONTROLINFO = %p\n", pCI);
567 return S_OK;
568}
569
570static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
571{
572 FIXME("stub: MSG* = %p\n", pMsg);
573 return S_OK;
574}
575
576static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
577{
578 FIXME("stub: DISPID = %ld\n", dispID);
579 return S_OK;
580}
581
582static 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
592static 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
604IOleControlImpl SHDOCVW_OleControl = { &WBOC_Vtbl, 1 };
Note: See TracBrowser for help on using the repository browser.