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