2 * Implementation of IOleObject interfaces for IE Web Browser
8 * Copyright 2001 John R. Sheets (for CodeWeavers)
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.
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.
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
26 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw
);
32 /**********************************************************************
33 * IOleControl declaration for SHDOCVW.DLL
38 const IOleControlVtbl
*lpVtbl
;
42 static IOleControlImpl SHDOCVW_OleControl
;
44 /**********************************************************************
45 * IOleInPlaceObject declaration for SHDOCVW.DLL
50 const IOleInPlaceObjectVtbl
*lpVtbl
;
52 } IOleInPlaceObjectImpl
;
54 static IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject
;
56 /**********************************************************************
57 * Implement the IOleObject interface for the web browser component
59 * Based on DefaultHandler code in dlls/ole32/defaulthandler.c.
62 static ULONG WINAPI
WBOOBJ_AddRef(LPOLEOBJECT iface
);
63 static ULONG WINAPI
WBOOBJ_Release(LPOLEOBJECT iface
);
65 /************************************************************************
66 * WBOOBJ_QueryInterface (IUnknown)
68 * Interfaces we need to (at least pretend to) retrieve:
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
77 static HRESULT WINAPI
WBOOBJ_QueryInterface(LPOLEOBJECT iface
,
78 REFIID riid
, void** ppobj
)
80 IOleObjectImpl
*This
= (IOleObjectImpl
*)iface
;
83 * Perform a sanity check on the parameters.
85 if ((This
== NULL
) || (ppobj
== NULL
) )
88 if (IsEqualGUID (&IID_IPersistStorage
, riid
))
90 TRACE("Returning IID_IPersistStorage interface\n");
91 *ppobj
= (LPVOID
)&SHDOCVW_PersistStorage
;
92 WBOOBJ_AddRef (iface
);
95 else if (IsEqualGUID (&IID_IPersistStreamInit
, riid
))
97 TRACE("Returning IID_IPersistStreamInit interface\n");
98 *ppobj
= (LPVOID
)&SHDOCVW_PersistStreamInit
;
99 WBOOBJ_AddRef (iface
);
102 else if (IsEqualGUID (&IID_IProvideClassInfo
, riid
))
104 TRACE("Returning IID_IProvideClassInfo interface\n");
105 *ppobj
= (LPVOID
)&SHDOCVW_ProvideClassInfo
;
106 WBOOBJ_AddRef (iface
);
109 else if (IsEqualGUID (&IID_IProvideClassInfo2
, riid
))
111 TRACE("Returning IID_IProvideClassInfo2 interface %p\n",
112 &SHDOCVW_ProvideClassInfo2
);
113 *ppobj
= (LPVOID
)&SHDOCVW_ProvideClassInfo2
;
114 WBOOBJ_AddRef (iface
);
117 else if (IsEqualGUID (&IID_IQuickActivate
, riid
))
119 TRACE("Returning IID_IQuickActivate interface\n");
120 *ppobj
= (LPVOID
)&SHDOCVW_QuickActivate
;
121 WBOOBJ_AddRef (iface
);
124 else if (IsEqualGUID (&IID_IConnectionPointContainer
, riid
))
126 TRACE("Returning IID_IConnectionPointContainer interface\n");
127 *ppobj
= (LPVOID
)&SHDOCVW_ConnectionPointContainer
;
128 WBOOBJ_AddRef (iface
);
131 else if (IsEqualGUID (&IID_IOleInPlaceObject
, riid
))
133 TRACE("Returning IID_IOleInPlaceObject interface\n");
134 *ppobj
= (LPVOID
)&SHDOCVW_OleInPlaceObject
;
135 WBOOBJ_AddRef (iface
);
138 else if (IsEqualGUID (&IID_IOleControl
, riid
))
140 TRACE("Returning IID_IOleControl interface\n");
141 *ppobj
= (LPVOID
)&SHDOCVW_OleControl
;
142 WBOOBJ_AddRef (iface
);
145 else if (IsEqualGUID (&IID_IWebBrowser
, riid
))
147 TRACE("Returning IID_IWebBrowser interface\n");
148 *ppobj
= (LPVOID
)&SHDOCVW_WebBrowser
;
149 WBOOBJ_AddRef (iface
);
152 else if (IsEqualGUID (&IID_IDispatch
, riid
))
154 TRACE("Returning IID_IDispatch interface\n");
155 *ppobj
= (LPVOID
)&SHDOCVW_WebBrowser
;
156 WBOOBJ_AddRef (iface
);
160 TRACE ("Failed to find iid = %s\n", debugstr_guid(riid
));
162 return E_NOINTERFACE
;
165 /************************************************************************
166 * WBOOBJ_AddRef (IUnknown)
168 static ULONG WINAPI
WBOOBJ_AddRef(LPOLEOBJECT iface
)
170 SHDOCVW_LockModule();
172 return 2; /* non-heap based object */
175 /************************************************************************
176 * WBOOBJ_Release (IUnknown)
178 static ULONG WINAPI
WBOOBJ_Release(LPOLEOBJECT iface
)
180 SHDOCVW_UnlockModule();
182 return 1; /* non-heap based object */
185 /************************************************************************
186 * WBOOBJ_SetClientSite (IOleObject)
188 static HRESULT WINAPI
WBOOBJ_SetClientSite(LPOLEOBJECT iface
,
189 LPOLECLIENTSITE pClientSite
)
191 FIXME("stub: (%p, %p)\n", iface
, pClientSite
);
195 /************************************************************************
196 * WBOOBJ_GetClientSite (IOleObject)
198 static HRESULT WINAPI
WBOOBJ_GetClientSite(LPOLEOBJECT iface
,
199 LPOLECLIENTSITE
* ppClientSite
)
201 FIXME("stub: (%p)\n", *ppClientSite
);
205 /************************************************************************
206 * WBOOBJ_SetHostNames (IOleObject)
208 static HRESULT WINAPI
WBOOBJ_SetHostNames(LPOLEOBJECT iface
, LPCOLESTR szContainerApp
,
209 LPCOLESTR szContainerObj
)
211 FIXME("stub: (%p, %s, %s)\n", iface
, debugstr_w(szContainerApp
),
212 debugstr_w(szContainerObj
));
216 /************************************************************************
217 * WBOOBJ_Close (IOleObject)
219 static HRESULT WINAPI
WBOOBJ_Close(LPOLEOBJECT iface
, DWORD dwSaveOption
)
225 /************************************************************************
226 * WBOOBJ_SetMoniker (IOleObject)
228 static HRESULT WINAPI
WBOOBJ_SetMoniker(LPOLEOBJECT iface
,
229 DWORD dwWhichMoniker
, IMoniker
* pmk
)
231 FIXME("stub: (%p, %ld, %p)\n", iface
, dwWhichMoniker
, pmk
);
235 /************************************************************************
236 * WBOOBJ_GetMoniker (IOleObject)
238 * Delegate this request to the client site if we have one.
240 static HRESULT WINAPI
WBOOBJ_GetMoniker(LPOLEOBJECT iface
, DWORD dwAssign
,
241 DWORD dwWhichMoniker
, LPMONIKER
*ppmk
)
243 FIXME("stub (%p, %ld, %ld, %p)\n", iface
, dwAssign
, dwWhichMoniker
, ppmk
);
247 /************************************************************************
248 * WBOOBJ_InitFromData (IOleObject)
250 * This method is meaningless if the server is not running
252 static HRESULT WINAPI
WBOOBJ_InitFromData(LPOLEOBJECT iface
, LPDATAOBJECT pDataObject
,
253 BOOL fCreation
, DWORD dwReserved
)
255 FIXME("stub: (%p, %p, %d, %ld)\n", iface
, pDataObject
, fCreation
, dwReserved
);
256 return OLE_E_NOTRUNNING
;
259 /************************************************************************
260 * WBOOBJ_GetClipboardData (IOleObject)
262 * This method is meaningless if the server is not running
264 static HRESULT WINAPI
WBOOBJ_GetClipboardData(LPOLEOBJECT iface
, DWORD dwReserved
,
265 LPDATAOBJECT
*ppDataObject
)
267 FIXME("stub: (%p, %ld, %p)\n", iface
, dwReserved
, ppDataObject
);
268 return OLE_E_NOTRUNNING
;
271 /************************************************************************
272 * WBOOBJ_DoVerb (IOleObject)
274 static HRESULT WINAPI
WBOOBJ_DoVerb(LPOLEOBJECT iface
, LONG iVerb
, struct tagMSG
* lpmsg
,
275 LPOLECLIENTSITE pActiveSite
, LONG lindex
,
276 HWND hwndParent
, LPCRECT lprcPosRect
)
278 FIXME(": stub iVerb = %ld\n", iVerb
);
281 case OLEIVERB_INPLACEACTIVATE
:
282 FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
285 FIXME ("stub for OLEIVERB_HIDE\n");
292 /************************************************************************
293 * WBOOBJ_EnumVerbs (IOleObject)
295 * Delegate to OleRegEnumVerbs.
297 static HRESULT WINAPI
WBOOBJ_EnumVerbs(LPOLEOBJECT iface
,
298 IEnumOLEVERB
** ppEnumOleVerb
)
300 TRACE("(%p, %p)\n", iface
, ppEnumOleVerb
);
302 return OleRegEnumVerbs(&CLSID_WebBrowser
, ppEnumOleVerb
);
305 /************************************************************************
306 * WBOOBJ_EnumVerbs (IOleObject)
308 static HRESULT WINAPI
WBOOBJ_Update(LPOLEOBJECT iface
)
314 /************************************************************************
315 * WBOOBJ_IsUpToDate (IOleObject)
317 * This method is meaningless if the server is not running
319 static HRESULT WINAPI
WBOOBJ_IsUpToDate(LPOLEOBJECT iface
)
321 FIXME("(%p)\n", iface
);
322 return OLE_E_NOTRUNNING
;
325 /************************************************************************
326 * WBOOBJ_GetUserClassID (IOleObject)
328 static HRESULT WINAPI
WBOOBJ_GetUserClassID(LPOLEOBJECT iface
, CLSID
* pClsid
)
330 FIXME("stub: (%p, %p)\n", iface
, pClsid
);
334 /************************************************************************
335 * WBOOBJ_GetUserType (IOleObject)
337 * Delegate to OleRegGetUserType.
339 static HRESULT WINAPI
WBOOBJ_GetUserType(LPOLEOBJECT iface
, DWORD dwFormOfType
,
340 LPOLESTR
* pszUserType
)
342 TRACE("(%p, %ld, %p)\n", iface
, dwFormOfType
, pszUserType
);
344 return OleRegGetUserType(&CLSID_WebBrowser
, dwFormOfType
, pszUserType
);
347 /************************************************************************
348 * WBOOBJ_SetExtent (IOleObject)
350 * This method is meaningless if the server is not running
352 static HRESULT WINAPI
WBOOBJ_SetExtent(LPOLEOBJECT iface
, DWORD dwDrawAspect
,
355 FIXME("stub: (%p, %lx, (%ld x %ld))\n", iface
, dwDrawAspect
,
356 psizel
->cx
, psizel
->cy
);
357 return OLE_E_NOTRUNNING
;
360 /************************************************************************
361 * WBOOBJ_GetExtent (IOleObject)
363 static HRESULT WINAPI
WBOOBJ_GetExtent(LPOLEOBJECT iface
, DWORD dwDrawAspect
,
366 FIXME("stub: (%p, %lx, %p)\n", iface
, dwDrawAspect
, psizel
);
370 /************************************************************************
371 * WBOOBJ_Advise (IOleObject)
373 static HRESULT WINAPI
WBOOBJ_Advise(LPOLEOBJECT iface
, IAdviseSink
* pAdvSink
,
374 DWORD
* pdwConnection
)
376 FIXME("stub: (%p, %p, %p)\n", iface
, pAdvSink
, pdwConnection
);
380 /************************************************************************
381 * WBOOBJ_Unadvise (IOleObject)
383 static HRESULT WINAPI
WBOOBJ_Unadvise(LPOLEOBJECT iface
, DWORD dwConnection
)
385 FIXME("stub: (%p, %ld)\n", iface
, dwConnection
);
389 /************************************************************************
390 * WBOOBJ_EnumAdvise (IOleObject)
392 static HRESULT WINAPI
WBOOBJ_EnumAdvise(LPOLEOBJECT iface
, IEnumSTATDATA
** ppenumAdvise
)
394 FIXME("stub: (%p, %p)\n", iface
, ppenumAdvise
);
398 /************************************************************************
399 * WBOOBJ_GetMiscStatus (IOleObject)
401 * Delegate to OleRegGetMiscStatus.
403 static HRESULT WINAPI
WBOOBJ_GetMiscStatus(LPOLEOBJECT iface
, DWORD dwAspect
,
408 TRACE("(%p, %lx, %p)\n", iface
, dwAspect
, pdwStatus
);
410 hres
= OleRegGetMiscStatus(&CLSID_WebBrowser
, dwAspect
, pdwStatus
);
418 /************************************************************************
419 * WBOOBJ_SetColorScheme (IOleObject)
421 * This method is meaningless if the server is not running
423 static HRESULT WINAPI
WBOOBJ_SetColorScheme(LPOLEOBJECT iface
,
424 struct tagLOGPALETTE
* pLogpal
)
426 FIXME("stub: (%p, %p))\n", iface
, pLogpal
);
427 return OLE_E_NOTRUNNING
;
430 /**********************************************************************
431 * IOleObject virtual function table for IE Web Browser component
434 static const IOleObjectVtbl WBOOBJ_Vtbl
=
436 WBOOBJ_QueryInterface
,
439 WBOOBJ_SetClientSite
,
440 WBOOBJ_GetClientSite
,
446 WBOOBJ_GetClipboardData
,
451 WBOOBJ_GetUserClassID
,
458 WBOOBJ_GetMiscStatus
,
459 WBOOBJ_SetColorScheme
462 IOleObjectImpl SHDOCVW_OleObject
= {&WBOOBJ_Vtbl
};
465 /**********************************************************************
466 * Implement the IOleInPlaceObject interface
469 static HRESULT WINAPI
WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface
,
470 REFIID riid
, LPVOID
*ppobj
)
472 FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid
));
474 if (ppobj
== NULL
) return E_POINTER
;
476 return E_NOINTERFACE
;
479 static ULONG WINAPI
WBOIPO_AddRef(LPOLEINPLACEOBJECT iface
)
481 SHDOCVW_LockModule();
483 return 2; /* non-heap based object */
486 static ULONG WINAPI
WBOIPO_Release(LPOLEINPLACEOBJECT iface
)
488 SHDOCVW_UnlockModule();
490 return 1; /* non-heap based object */
493 static HRESULT WINAPI
WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface
, HWND
* phwnd
)
496 /* Create a fake window to fool MFC into believing that we actually
497 * have an implemented browser control. Avoids the assertion.
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
);
506 TRACE ("Returning hwnd = %d\n", hwnd
);
509 FIXME("stub HWND* = %p\n", phwnd
);
513 static HRESULT WINAPI
WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface
,
516 FIXME("stub fEnterMode = %d\n", fEnterMode
);
520 static HRESULT WINAPI
WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface
)
526 static HRESULT WINAPI
WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface
)
532 static HRESULT WINAPI
WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface
,
533 LPCRECT lprcPosRect
, LPCRECT lprcClipRect
)
535 FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect
, lprcClipRect
);
539 static HRESULT WINAPI
WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface
)
545 /**********************************************************************
546 * IOleInPlaceObject virtual function table for IE Web Browser component
549 static const IOleInPlaceObjectVtbl WBOIPO_Vtbl
=
551 WBOIPO_QueryInterface
,
555 WBOIPO_ContextSensitiveHelp
,
556 WBOIPO_InPlaceDeactivate
,
558 WBOIPO_SetObjectRects
,
559 WBOIPO_ReactivateAndUndo
562 static IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject
= {&WBOIPO_Vtbl
};
565 /**********************************************************************
566 * Implement the IOleControl interface
569 static HRESULT WINAPI
WBOC_QueryInterface(LPOLECONTROL iface
,
570 REFIID riid
, LPVOID
*ppobj
)
572 FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid
));
574 if (ppobj
== NULL
) return E_POINTER
;
576 return E_NOINTERFACE
;
579 static ULONG WINAPI
WBOC_AddRef(LPOLECONTROL iface
)
581 SHDOCVW_LockModule();
583 return 2; /* non-heap based object */
586 static ULONG WINAPI
WBOC_Release(LPOLECONTROL iface
)
588 SHDOCVW_UnlockModule();
590 return 1; /* non-heap based object */
593 static HRESULT WINAPI
WBOC_GetControlInfo(LPOLECONTROL iface
, LPCONTROLINFO pCI
)
595 FIXME("stub: LPCONTROLINFO = %p\n", pCI
);
599 static HRESULT WINAPI
WBOC_OnMnemonic(LPOLECONTROL iface
, struct tagMSG
*pMsg
)
601 FIXME("stub: MSG* = %p\n", pMsg
);
605 static HRESULT WINAPI
WBOC_OnAmbientPropertyChange(LPOLECONTROL iface
, DISPID dispID
)
607 FIXME("stub: DISPID = %ld\n", dispID
);
611 static HRESULT WINAPI
WBOC_FreezeEvents(LPOLECONTROL iface
, BOOL bFreeze
)
613 FIXME("stub: bFreeze = %d\n", bFreeze
);
617 /**********************************************************************
618 * IOleControl virtual function table for IE Web Browser component
621 static const IOleControlVtbl WBOC_Vtbl
=
628 WBOC_OnAmbientPropertyChange
,
632 static IOleControlImpl SHDOCVW_OleControl
= {&WBOC_Vtbl
};