2 * Copyright 2010 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "mshtml_private.h"
32 #include "pluginhost.h"
34 #include "wine/debug.h"
35 #include "wine/unicode.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
39 static void activate_plugin(PluginHost *host)
41 IClientSecurity *client_security;
42 IQuickActivate *quick_activate;
48 /* Note native calls QI on plugin for an undocumented IID and CLSID_HTMLDocument */
50 /* FIXME: call FreezeEvents(TRUE) */
52 hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IClientSecurity, (void**)&client_security);
54 FIXME("Handle IClientSecurity\n");
55 IClientSecurity_Release(client_security);
59 hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IQuickActivate, (void**)&quick_activate);
61 QACONTAINER container = {sizeof(container)};
62 QACONTROL control = {sizeof(control)};
64 container.pClientSite = &host->IOleClientSite_iface;
65 container.dwAmbientFlags = QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE;
66 container.pAdviseSink = &host->IAdviseSinkEx_iface;
67 container.pPropertyNotifySink = &host->IPropertyNotifySink_iface;
69 hres = IQuickActivate_QuickActivate(quick_activate, &container, &control);
71 FIXME("QuickActivate failed: %08x\n", hres);
73 FIXME("No IQuickActivate\n");
77 void update_plugin_window(PluginHost *host, HWND hwnd, const RECT *rect)
79 if(!hwnd || (host->hwnd && host->hwnd != hwnd)) {
80 FIXME("unhandled hwnd\n");
86 activate_plugin(host);
90 static inline PluginHost *impl_from_IOleClientSite(IOleClientSite *iface)
92 return CONTAINING_RECORD(iface, PluginHost, IOleClientSite_iface);
95 static HRESULT WINAPI PHClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
97 PluginHost *This = impl_from_IOleClientSite(iface);
99 if(IsEqualGUID(&IID_IUnknown, riid)) {
100 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
101 *ppv = &This->IOleClientSite_iface;
102 }else if(IsEqualGUID(&IID_IOleClientSite, riid)) {
103 TRACE("(%p)->(IID_IOleClientSite %p)\n", This, ppv);
104 *ppv = &This->IOleClientSite_iface;
105 }else if(IsEqualGUID(&IID_IAdviseSink, riid)) {
106 TRACE("(%p)->(IID_IAdviseSink %p)\n", This, ppv);
107 *ppv = &This->IAdviseSinkEx_iface;
108 }else if(IsEqualGUID(&IID_IAdviseSinkEx, riid)) {
109 TRACE("(%p)->(IID_IAdviseSinkEx %p)\n", This, ppv);
110 *ppv = &This->IAdviseSinkEx_iface;
111 }else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
112 TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppv);
113 *ppv = &This->IPropertyNotifySink_iface;
114 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
115 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
116 *ppv = &This->IDispatch_iface;
117 }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
118 TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
119 *ppv = &This->IOleInPlaceSiteEx_iface;
120 }else if(IsEqualGUID(&IID_IOleInPlaceSite, riid)) {
121 TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This, ppv);
122 *ppv = &This->IOleInPlaceSiteEx_iface;
123 }else if(IsEqualGUID(&IID_IOleInPlaceSiteEx, riid)) {
124 TRACE("(%p)->(IID_IOleInPlaceSiteEx %p)\n", This, ppv);
125 *ppv = &This->IOleInPlaceSiteEx_iface;
126 }else if(IsEqualGUID(&IID_IOleControlSite, riid)) {
127 TRACE("(%p)->(IID_IOleControlSite %p)\n", This, ppv);
128 *ppv = &This->IOleControlSite_iface;
129 }else if(IsEqualGUID(&IID_IBindHost, riid)) {
130 TRACE("(%p)->(IID_IBindHost %p)\n", This, ppv);
131 *ppv = &This->IBindHost_iface;
132 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
133 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
134 *ppv = &This->IServiceProvider_iface;
136 WARN("Unsupported interface %s\n", debugstr_guid(riid));
138 return E_NOINTERFACE;
141 IOleClientSite_AddRef((IUnknown*)*ppv);
145 static ULONG WINAPI PHClientSite_AddRef(IOleClientSite *iface)
147 PluginHost *This = impl_from_IOleClientSite(iface);
148 LONG ref = InterlockedIncrement(&This->ref);
150 TRACE("(%p) ref=%d\n", This, ref);
155 static ULONG WINAPI PHClientSite_Release(IOleClientSite *iface)
157 PluginHost *This = impl_from_IOleClientSite(iface);
158 LONG ref = InterlockedDecrement(&This->ref);
160 TRACE("(%p) ref=%d\n", This, ref);
164 IUnknown_Release(This->plugin_unk);
171 static HRESULT WINAPI PHClientSite_SaveObject(IOleClientSite *iface)
173 PluginHost *This = impl_from_IOleClientSite(iface);
174 FIXME("(%p)\n", This);
178 static HRESULT WINAPI PHClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign,
179 DWORD dwWhichMoniker, IMoniker **ppmk)
181 PluginHost *This = impl_from_IOleClientSite(iface);
182 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
186 static HRESULT WINAPI PHClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
188 PluginHost *This = impl_from_IOleClientSite(iface);
189 FIXME("(%p)->(%p)\n", This, ppContainer);
193 static HRESULT WINAPI PHClientSite_ShowObject(IOleClientSite *iface)
195 PluginHost *This = impl_from_IOleClientSite(iface);
196 FIXME("(%p)\n", This);
200 static HRESULT WINAPI PHClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
202 PluginHost *This = impl_from_IOleClientSite(iface);
203 FIXME("(%p)->(%x)\n", This, fShow);
207 static HRESULT WINAPI PHClientSite_RequestNewObjectLayout(IOleClientSite *iface)
209 PluginHost *This = impl_from_IOleClientSite(iface);
210 FIXME("(%p)\n", This);
214 static const IOleClientSiteVtbl OleClientSiteVtbl = {
215 PHClientSite_QueryInterface,
217 PHClientSite_Release,
218 PHClientSite_SaveObject,
219 PHClientSite_GetMoniker,
220 PHClientSite_GetContainer,
221 PHClientSite_ShowObject,
222 PHClientSite_OnShowWindow,
223 PHClientSite_RequestNewObjectLayout
226 static inline PluginHost *impl_from_IAdviseSinkEx(IAdviseSinkEx *iface)
228 return CONTAINING_RECORD(iface, PluginHost, IAdviseSinkEx_iface);
231 static HRESULT WINAPI PHAdviseSinkEx_QueryInterface(IAdviseSinkEx *iface, REFIID riid, void **ppv)
233 PluginHost *This = impl_from_IAdviseSinkEx(iface);
234 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
237 static ULONG WINAPI PHAdviseSinkEx_AddRef(IAdviseSinkEx *iface)
239 PluginHost *This = impl_from_IAdviseSinkEx(iface);
240 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
243 static ULONG WINAPI PHAdviseSinkEx_Release(IAdviseSinkEx *iface)
245 PluginHost *This = impl_from_IAdviseSinkEx(iface);
246 return IOleClientSite_Release(&This->IOleClientSite_iface);
249 static void WINAPI PHAdviseSinkEx_OnDataChange(IAdviseSinkEx *iface, FORMATETC *pFormatetc, STGMEDIUM *pStgMedium)
251 PluginHost *This = impl_from_IAdviseSinkEx(iface);
252 FIXME("(%p)->(%p %p)\n", This, pFormatetc, pStgMedium);
255 static void WINAPI PHAdviseSinkEx_OnViewChange(IAdviseSinkEx *iface, DWORD dwAspect, LONG lindex)
257 PluginHost *This = impl_from_IAdviseSinkEx(iface);
258 FIXME("(%p)->(%d %d)\n", This, dwAspect, lindex);
261 static void WINAPI PHAdviseSinkEx_OnRename(IAdviseSinkEx *iface, IMoniker *pmk)
263 PluginHost *This = impl_from_IAdviseSinkEx(iface);
264 FIXME("(%p)->(%p)\n", This, pmk);
267 static void WINAPI PHAdviseSinkEx_OnSave(IAdviseSinkEx *iface)
269 PluginHost *This = impl_from_IAdviseSinkEx(iface);
270 FIXME("(%p)\n", This);
273 static void WINAPI PHAdviseSinkEx_OnClose(IAdviseSinkEx *iface)
275 PluginHost *This = impl_from_IAdviseSinkEx(iface);
276 FIXME("(%p)\n", This);
279 static void WINAPI PHAdviseSinkEx_OnViewStatusChange(IAdviseSinkEx *iface, DWORD dwViewStatus)
281 PluginHost *This = impl_from_IAdviseSinkEx(iface);
282 FIXME("(%p)->(%d)\n", This, dwViewStatus);
285 static const IAdviseSinkExVtbl AdviseSinkExVtbl = {
286 PHAdviseSinkEx_QueryInterface,
287 PHAdviseSinkEx_AddRef,
288 PHAdviseSinkEx_Release,
289 PHAdviseSinkEx_OnDataChange,
290 PHAdviseSinkEx_OnViewChange,
291 PHAdviseSinkEx_OnRename,
292 PHAdviseSinkEx_OnSave,
293 PHAdviseSinkEx_OnClose,
294 PHAdviseSinkEx_OnViewStatusChange
297 static inline PluginHost *impl_from_IPropertyNotifySink(IPropertyNotifySink *iface)
299 return CONTAINING_RECORD(iface, PluginHost, IPropertyNotifySink_iface);
302 static HRESULT WINAPI PHPropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, REFIID riid, void **ppv)
304 PluginHost *This = impl_from_IPropertyNotifySink(iface);
305 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
308 static ULONG WINAPI PHPropertyNotifySink_AddRef(IPropertyNotifySink *iface)
310 PluginHost *This = impl_from_IPropertyNotifySink(iface);
311 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
314 static ULONG WINAPI PHPropertyNotifySink_Release(IPropertyNotifySink *iface)
316 PluginHost *This = impl_from_IPropertyNotifySink(iface);
317 return IOleClientSite_Release(&This->IOleClientSite_iface);
320 static HRESULT WINAPI PHPropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
322 PluginHost *This = impl_from_IPropertyNotifySink(iface);
323 FIXME("(%p)->(%d)\n", This, dispID);
327 static HRESULT WINAPI PHPropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
329 PluginHost *This = impl_from_IPropertyNotifySink(iface);
330 FIXME("(%p)->(%d)\n", This, dispID);
334 static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
335 PHPropertyNotifySink_QueryInterface,
336 PHPropertyNotifySink_AddRef,
337 PHPropertyNotifySink_Release,
338 PHPropertyNotifySink_OnChanged,
339 PHPropertyNotifySink_OnRequestEdit
342 static inline PluginHost *impl_from_IDispatch(IDispatch *iface)
344 return CONTAINING_RECORD(iface, PluginHost, IDispatch_iface);
347 static HRESULT WINAPI PHDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
349 PluginHost *This = impl_from_IDispatch(iface);
350 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
353 static ULONG WINAPI PHDispatch_AddRef(IDispatch *iface)
355 PluginHost *This = impl_from_IDispatch(iface);
356 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
359 static ULONG WINAPI PHDispatch_Release(IDispatch *iface)
361 PluginHost *This = impl_from_IDispatch(iface);
362 return IOleClientSite_Release(&This->IOleClientSite_iface);
365 static HRESULT WINAPI PHDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
367 PluginHost *This = impl_from_IDispatch(iface);
368 FIXME("(%p)->(%p)\n", This, pctinfo);
372 static HRESULT WINAPI PHDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo,
373 LCID lcid, ITypeInfo **ppTInfo)
375 PluginHost *This = impl_from_IDispatch(iface);
376 FIXME("(%p)->(%d %d %p)\n", This, iTInfo, lcid, ppTInfo);
380 static HRESULT WINAPI PHDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid,
381 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
383 PluginHost *This = impl_from_IDispatch(iface);
384 FIXME("(%p)->(%s %p %d %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
388 static HRESULT WINAPI PHDispatch_Invoke(IDispatch *iface, DISPID dispid, REFIID riid, LCID lcid,
389 WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
391 PluginHost *This = impl_from_IDispatch(iface);
392 FIXME("(%p)->(%d %x %p %p)\n", This, dispid, wFlags, pDispParams, pVarResult);
396 static const IDispatchVtbl DispatchVtbl = {
397 PHDispatch_QueryInterface,
400 PHDispatch_GetTypeInfoCount,
401 PHDispatch_GetTypeInfo,
402 PHDispatch_GetIDsOfNames,
406 static inline PluginHost *impl_from_IOleInPlaceSiteEx(IOleInPlaceSiteEx *iface)
408 return CONTAINING_RECORD(iface, PluginHost, IOleInPlaceSiteEx_iface);
411 static HRESULT WINAPI PHInPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
413 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
414 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
417 static ULONG WINAPI PHInPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
419 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
420 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
423 static ULONG WINAPI PHInPlaceSite_Release(IOleInPlaceSiteEx *iface)
425 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
426 return IOleClientSite_Release(&This->IOleClientSite_iface);
429 static HRESULT WINAPI PHInPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
431 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
432 FIXME("(%p)->(%p)\n", This, phwnd);
436 static HRESULT WINAPI PHInPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
438 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
439 FIXME("(%p)->(%x)\n", This, fEnterMode);
443 static HRESULT WINAPI PHInPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
445 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
446 FIXME("(%p)\n", This);
450 static HRESULT WINAPI PHInPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
452 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
453 FIXME("(%p)\n", This);
457 static HRESULT WINAPI PHInPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
459 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
460 FIXME("(%p)\n", This);
464 static HRESULT WINAPI PHInPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
465 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, RECT *lprcPosRect,
466 RECT *lprcClipRect, OLEINPLACEFRAMEINFO *frame_info)
468 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
469 FIXME("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, frame_info);
473 static HRESULT WINAPI PHInPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtent)
475 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
476 FIXME("(%p)->({%d %d})\n", This, scrollExtent.cx, scrollExtent.cy);
480 static HRESULT WINAPI PHInPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
482 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
483 FIXME("(%p)->(%x)\n", This, fUndoable);
487 static HRESULT WINAPI PHInPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
489 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
490 FIXME("(%p)\n", This);
494 static HRESULT WINAPI PHInPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
496 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
497 FIXME("(%p)\n", This);
501 static HRESULT WINAPI PHInPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
503 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
504 FIXME("(%p)\n", This);
508 static HRESULT WINAPI PHInPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
510 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
511 FIXME("(%p)->(%p)\n", This, lprcPosRect);
515 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface, BOOL *pfNoRedraw, DWORD dwFlags)
517 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
518 FIXME("(%p)->(%p %x)\n", This, pfNoRedraw, dwFlags);
522 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface, BOOL fNoRedraw)
524 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
525 FIXME("(%p)->(%x)\n", This, fNoRedraw);
529 static HRESULT WINAPI PHInPlaceSiteEx_RequestUIActivate(IOleInPlaceSiteEx *iface)
531 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
532 FIXME("(%p)\n", This);
536 static const IOleInPlaceSiteExVtbl OleInPlaceSiteExVtbl = {
537 PHInPlaceSite_QueryInterface,
538 PHInPlaceSite_AddRef,
539 PHInPlaceSite_Release,
540 PHInPlaceSite_GetWindow,
541 PHInPlaceSite_ContextSensitiveHelp,
542 PHInPlaceSite_CanInPlaceActivate,
543 PHInPlaceSite_OnInPlaceActivate,
544 PHInPlaceSite_OnUIActivate,
545 PHInPlaceSite_GetWindowContext,
546 PHInPlaceSite_Scroll,
547 PHInPlaceSite_OnUIDeactivate,
548 PHInPlaceSite_OnInPlaceDeactivate,
549 PHInPlaceSite_DiscardUndoState,
550 PHInPlaceSite_DeactivateAndUndo,
551 PHInPlaceSite_OnPosRectChange,
552 PHInPlaceSiteEx_OnInPlaceActivateEx,
553 PHInPlaceSiteEx_OnInPlaceDeactivateEx,
554 PHInPlaceSiteEx_RequestUIActivate
557 static inline PluginHost *impl_from_IOleControlSite(IOleControlSite *iface)
559 return CONTAINING_RECORD(iface, PluginHost, IOleControlSite_iface);
562 static HRESULT WINAPI PHControlSite_QueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
564 PluginHost *This = impl_from_IOleControlSite(iface);
565 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
568 static ULONG WINAPI PHControlSite_AddRef(IOleControlSite *iface)
570 PluginHost *This = impl_from_IOleControlSite(iface);
571 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
574 static ULONG WINAPI PHControlSite_Release(IOleControlSite *iface)
576 PluginHost *This = impl_from_IOleControlSite(iface);
577 return IOleClientSite_Release(&This->IOleClientSite_iface);
580 static HRESULT WINAPI PHControlSite_OnControlInfoChanged(IOleControlSite *iface)
582 PluginHost *This = impl_from_IOleControlSite(iface);
583 FIXME("(%p)\n", This);
587 static HRESULT WINAPI PHControlSite_LockInPlaceActive(IOleControlSite *iface, BOOL fLock)
589 PluginHost *This = impl_from_IOleControlSite(iface);
590 FIXME("(%p)->(%x)\n", This, fLock);
594 static HRESULT WINAPI PHControlSite_GetExtendedControl(IOleControlSite *iface, IDispatch **ppDisp)
596 PluginHost *This = impl_from_IOleControlSite(iface);
597 FIXME("(%p)->(%p)\n", This, ppDisp);
601 static HRESULT WINAPI PHControlSite_TransformCoords(IOleControlSite *iface, POINTL *pPtlHimetric, POINTF *pPtfContainer, DWORD dwFlags)
603 PluginHost *This = impl_from_IOleControlSite(iface);
604 FIXME("(%p)->(%p %p %x)\n", This, pPtlHimetric, pPtfContainer, dwFlags);
608 static HRESULT WINAPI PHControlSite_TranslateAccelerator(IOleControlSite *iface, MSG *pMsg, DWORD grfModifiers)
610 PluginHost *This = impl_from_IOleControlSite(iface);
611 FIXME("(%p)->(%x)\n", This, grfModifiers);
615 static HRESULT WINAPI PHControlSite_OnFocus(IOleControlSite *iface, BOOL fGotFocus)
617 PluginHost *This = impl_from_IOleControlSite(iface);
618 FIXME("(%p)->(%x)\n", This, fGotFocus);
622 static HRESULT WINAPI PHControlSite_ShowPropertyFrame(IOleControlSite *iface)
624 PluginHost *This = impl_from_IOleControlSite(iface);
625 FIXME("(%p)\n", This);
629 static const IOleControlSiteVtbl OleControlSiteVtbl = {
630 PHControlSite_QueryInterface,
631 PHControlSite_AddRef,
632 PHControlSite_Release,
633 PHControlSite_OnControlInfoChanged,
634 PHControlSite_LockInPlaceActive,
635 PHControlSite_GetExtendedControl,
636 PHControlSite_TransformCoords,
637 PHControlSite_TranslateAccelerator,
638 PHControlSite_OnFocus,
639 PHControlSite_ShowPropertyFrame
642 static inline PluginHost *impl_from_IBindHost(IBindHost *iface)
644 return CONTAINING_RECORD(iface, PluginHost, IBindHost_iface);
647 static HRESULT WINAPI PHBindHost_QueryInterface(IBindHost *iface, REFIID riid, void **ppv)
649 PluginHost *This = impl_from_IBindHost(iface);
650 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
653 static ULONG WINAPI PHBindHost_AddRef(IBindHost *iface)
655 PluginHost *This = impl_from_IBindHost(iface);
656 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
659 static ULONG WINAPI PHBindHost_Release(IBindHost *iface)
661 PluginHost *This = impl_from_IBindHost(iface);
662 return IOleClientSite_Release(&This->IOleClientSite_iface);
665 static HRESULT WINAPI PHBindHost_CreateMoniker(IBindHost *iface, LPOLESTR szName, IBindCtx *pBC, IMoniker **ppmk, DWORD dwReserved)
667 PluginHost *This = impl_from_IBindHost(iface);
668 FIXME("(%p)->(%s %p %p %x)\n", This, debugstr_w(szName), pBC, ppmk, dwReserved);
672 static HRESULT WINAPI PHBindHost_MonikerBindToStorage(IBindHost *iface, IMoniker *pMk, IBindCtx *pBC,
673 IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
675 PluginHost *This = impl_from_IBindHost(iface);
676 FIXME("(%p)->(%p %p %p %s %p)\n", This, pMk, pBC, pBSC, debugstr_guid(riid), ppvObj);
680 static HRESULT WINAPI PHBindHost_MonikerBindToObject(IBindHost *iface, IMoniker *pMk, IBindCtx *pBC,
681 IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
683 PluginHost *This = impl_from_IBindHost(iface);
684 FIXME("(%p)->(%p %p %p %s %p)\n", This, pMk, pBC, pBSC, debugstr_guid(riid), ppvObj);
688 static const IBindHostVtbl BindHostVtbl = {
689 PHBindHost_QueryInterface,
692 PHBindHost_CreateMoniker,
693 PHBindHost_MonikerBindToStorage,
694 PHBindHost_MonikerBindToObject
697 static inline PluginHost *impl_from_IServiceProvider(IServiceProvider *iface)
699 return CONTAINING_RECORD(iface, PluginHost, IServiceProvider_iface);
702 static HRESULT WINAPI PHServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
704 PluginHost *This = impl_from_IServiceProvider(iface);
705 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
708 static ULONG WINAPI PHServiceProvider_AddRef(IServiceProvider *iface)
710 PluginHost *This = impl_from_IServiceProvider(iface);
711 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
714 static ULONG WINAPI PHServiceProvider_Release(IServiceProvider *iface)
716 PluginHost *This = impl_from_IServiceProvider(iface);
717 return IOleClientSite_Release(&This->IOleClientSite_iface);
720 static HRESULT WINAPI PHServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
722 PluginHost *This = impl_from_IServiceProvider(iface);
723 FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
724 return E_NOINTERFACE;
727 static const IServiceProviderVtbl ServiceProviderVtbl = {
728 PHServiceProvider_QueryInterface,
729 PHServiceProvider_AddRef,
730 PHServiceProvider_Release,
731 PHServiceProvider_QueryService
734 HRESULT create_plugin_host(IUnknown *unk, PluginHost **ret)
738 host = heap_alloc_zero(sizeof(*host));
740 return E_OUTOFMEMORY;
742 host->IOleClientSite_iface.lpVtbl = &OleClientSiteVtbl;
743 host->IAdviseSinkEx_iface.lpVtbl = &AdviseSinkExVtbl;
744 host->IPropertyNotifySink_iface.lpVtbl = &PropertyNotifySinkVtbl;
745 host->IDispatch_iface.lpVtbl = &DispatchVtbl;
746 host->IOleInPlaceSiteEx_iface.lpVtbl = &OleInPlaceSiteExVtbl;
747 host->IOleControlSite_iface.lpVtbl = &OleControlSiteVtbl;
748 host->IBindHost_iface.lpVtbl = &BindHostVtbl;
749 host->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
753 IUnknown_AddRef(unk);
754 host->plugin_unk = unk;