Correct size check.
[wine/dcerpc.git] / dlls / shdocvw / oleobject.c
blob824b7cad24cdb73638d34cf533b2eee6cf90b98d
1 /*
2 * Implementation of IOleObject interfaces for IE Web Browser
4 * - IOleObject
5 * - IOleInPlaceObject
6 * - IOleControl
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
25 #include <string.h>
26 #include "wine/debug.h"
27 #include "shdocvw.h"
28 #include "ole2.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
32 /**********************************************************************
33 * IOleControl declaration for SHDOCVW.DLL
35 typedef struct
37 /* IUnknown fields */
38 const IOleControlVtbl *lpVtbl;
39 DWORD ref;
40 } IOleControlImpl;
42 static IOleControlImpl SHDOCVW_OleControl;
44 /**********************************************************************
45 * IOleInPlaceObject declaration for SHDOCVW.DLL
47 typedef struct
49 /* IUnknown fields */
50 const IOleInPlaceObjectVtbl *lpVtbl;
51 DWORD ref;
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) )
86 return E_INVALIDARG;
88 if (IsEqualGUID (&IID_IPersistStorage, riid))
90 TRACE("Returning IID_IPersistStorage interface\n");
91 *ppobj = (LPVOID)&SHDOCVW_PersistStorage;
92 WBOOBJ_AddRef (iface);
93 return S_OK;
95 else if (IsEqualGUID (&IID_IPersistStreamInit, riid))
97 TRACE("Returning IID_IPersistStreamInit interface\n");
98 *ppobj = (LPVOID)&SHDOCVW_PersistStreamInit;
99 WBOOBJ_AddRef (iface);
100 return S_OK;
102 else if (IsEqualGUID (&IID_IProvideClassInfo, riid))
104 TRACE("Returning IID_IProvideClassInfo interface\n");
105 *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo;
106 WBOOBJ_AddRef (iface);
107 return S_OK;
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);
115 return S_OK;
117 else if (IsEqualGUID (&IID_IQuickActivate, riid))
119 TRACE("Returning IID_IQuickActivate interface\n");
120 *ppobj = (LPVOID)&SHDOCVW_QuickActivate;
121 WBOOBJ_AddRef (iface);
122 return S_OK;
124 else if (IsEqualGUID (&IID_IConnectionPointContainer, riid))
126 TRACE("Returning IID_IConnectionPointContainer interface\n");
127 *ppobj = (LPVOID)&SHDOCVW_ConnectionPointContainer;
128 WBOOBJ_AddRef (iface);
129 return S_OK;
131 else if (IsEqualGUID (&IID_IOleInPlaceObject, riid))
133 TRACE("Returning IID_IOleInPlaceObject interface\n");
134 *ppobj = (LPVOID)&SHDOCVW_OleInPlaceObject;
135 WBOOBJ_AddRef (iface);
136 return S_OK;
138 else if (IsEqualGUID (&IID_IOleControl, riid))
140 TRACE("Returning IID_IOleControl interface\n");
141 *ppobj = (LPVOID)&SHDOCVW_OleControl;
142 WBOOBJ_AddRef (iface);
143 return S_OK;
145 else if (IsEqualGUID (&IID_IWebBrowser, riid))
147 TRACE("Returning IID_IWebBrowser interface\n");
148 *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
149 WBOOBJ_AddRef (iface);
150 return S_OK;
152 else if (IsEqualGUID (&IID_IDispatch, riid))
154 TRACE("Returning IID_IDispatch interface\n");
155 *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
156 WBOOBJ_AddRef (iface);
157 return S_OK;
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);
192 return S_OK;
195 /************************************************************************
196 * WBOOBJ_GetClientSite (IOleObject)
198 static HRESULT WINAPI WBOOBJ_GetClientSite(LPOLEOBJECT iface,
199 LPOLECLIENTSITE* ppClientSite)
201 FIXME("stub: (%p)\n", *ppClientSite);
202 return S_OK;
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));
213 return S_OK;
216 /************************************************************************
217 * WBOOBJ_Close (IOleObject)
219 static HRESULT WINAPI WBOOBJ_Close(LPOLEOBJECT iface, DWORD dwSaveOption)
221 FIXME("stub: ()\n");
222 return S_OK;
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);
232 return S_OK;
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);
244 return E_FAIL;
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);
279 switch (iVerb)
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;
289 return S_OK;
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)
310 FIXME(": Stub\n");
311 return E_NOTIMPL;
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);
331 return S_OK;
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,
353 SIZEL* psizel)
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,
364 SIZEL* psizel)
366 FIXME("stub: (%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
367 return S_OK;
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);
377 return S_OK;
380 /************************************************************************
381 * WBOOBJ_Unadvise (IOleObject)
383 static HRESULT WINAPI WBOOBJ_Unadvise(LPOLEOBJECT iface, DWORD dwConnection)
385 FIXME("stub: (%p, %ld)\n", iface, dwConnection);
386 return S_OK;
389 /************************************************************************
390 * WBOOBJ_EnumAdvise (IOleObject)
392 static HRESULT WINAPI WBOOBJ_EnumAdvise(LPOLEOBJECT iface, IEnumSTATDATA** ppenumAdvise)
394 FIXME("stub: (%p, %p)\n", iface, ppenumAdvise);
395 return S_OK;
398 /************************************************************************
399 * WBOOBJ_GetMiscStatus (IOleObject)
401 * Delegate to OleRegGetMiscStatus.
403 static HRESULT WINAPI WBOOBJ_GetMiscStatus(LPOLEOBJECT iface, DWORD dwAspect,
404 DWORD* pdwStatus)
406 HRESULT hres;
408 TRACE("(%p, %lx, %p)\n", iface, dwAspect, pdwStatus);
410 hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
412 if (FAILED(hres))
413 *pdwStatus = 0;
415 return S_OK;
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,
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
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)
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.
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);
505 *phwnd = hwnd;
506 TRACE ("Returning hwnd = %d\n", hwnd);
507 #endif
509 FIXME("stub HWND* = %p\n", phwnd);
510 return S_OK;
513 static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
514 BOOL fEnterMode)
516 FIXME("stub fEnterMode = %d\n", fEnterMode);
517 return S_OK;
520 static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
522 FIXME("stub \n");
523 return S_OK;
526 static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
528 FIXME("stub \n");
529 return S_OK;
532 static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
533 LPCRECT lprcPosRect, LPCRECT lprcClipRect)
535 FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
536 return S_OK;
539 static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
541 FIXME("stub \n");
542 return S_OK;
545 /**********************************************************************
546 * IOleInPlaceObject virtual function table for IE Web Browser component
549 static const IOleInPlaceObjectVtbl WBOIPO_Vtbl =
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
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);
596 return S_OK;
599 static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
601 FIXME("stub: MSG* = %p\n", pMsg);
602 return S_OK;
605 static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
607 FIXME("stub: DISPID = %ld\n", dispID);
608 return S_OK;
611 static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
613 FIXME("stub: bFreeze = %d\n", bFreeze);
614 return S_OK;
617 /**********************************************************************
618 * IOleControl virtual function table for IE Web Browser component
621 static const IOleControlVtbl WBOC_Vtbl =
623 WBOC_QueryInterface,
624 WBOC_AddRef,
625 WBOC_Release,
626 WBOC_GetControlInfo,
627 WBOC_OnMnemonic,
628 WBOC_OnAmbientPropertyChange,
629 WBOC_FreezeEvents
632 static IOleControlImpl SHDOCVW_OleControl = {&WBOC_Vtbl};