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