include: Define more wuapi interfaces to avoid undefined forward declarations.
[wine] / dlls / mshtml / pluginhost.c
1 /*
2  * Copyright 2010 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22
23 #define COBJMACROS
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "ole2.h"
29 #include "shlobj.h"
30
31 #include "mshtml_private.h"
32 #include "pluginhost.h"
33
34 #include "wine/debug.h"
35 #include "wine/unicode.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
38
39 static void activate_plugin(PluginHost *host)
40 {
41     IClientSecurity *client_security;
42     IQuickActivate *quick_activate;
43     HRESULT hres;
44
45     if(!host->plugin_unk)
46         return;
47
48     /* Note native calls QI on plugin for an undocumented IID and CLSID_HTMLDocument */
49
50     /* FIXME: call FreezeEvents(TRUE) */
51
52     hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IClientSecurity, (void**)&client_security);
53     if(SUCCEEDED(hres)) {
54         FIXME("Handle IClientSecurity\n");
55         IClientSecurity_Release(client_security);
56         return;
57     }
58
59     hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IQuickActivate, (void**)&quick_activate);
60     if(SUCCEEDED(hres)) {
61         QACONTAINER container = {sizeof(container)};
62         QACONTROL control = {sizeof(control)};
63
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;
68
69         hres = IQuickActivate_QuickActivate(quick_activate, &container, &control);
70         if(FAILED(hres))
71             FIXME("QuickActivate failed: %08x\n", hres);
72     }else {
73         FIXME("No IQuickActivate\n");
74     }
75 }
76
77 void update_plugin_window(PluginHost *host, HWND hwnd, const RECT *rect)
78 {
79     if(!hwnd || (host->hwnd && host->hwnd != hwnd)) {
80         FIXME("unhandled hwnd\n");
81         return;
82     }
83
84     if(!host->hwnd) {
85         host->hwnd = hwnd;
86         activate_plugin(host);
87     }
88 }
89
90 static inline PluginHost *impl_from_IOleClientSite(IOleClientSite *iface)
91 {
92     return CONTAINING_RECORD(iface, PluginHost, IOleClientSite_iface);
93 }
94
95 static HRESULT WINAPI PHClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
96 {
97     PluginHost *This = impl_from_IOleClientSite(iface);
98
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;
135     }else {
136         WARN("Unsupported interface %s\n", debugstr_guid(riid));
137         *ppv = NULL;
138         return E_NOINTERFACE;
139     }
140
141     IOleClientSite_AddRef((IUnknown*)*ppv);
142     return S_OK;
143 }
144
145 static ULONG WINAPI PHClientSite_AddRef(IOleClientSite *iface)
146 {
147     PluginHost *This = impl_from_IOleClientSite(iface);
148     LONG ref = InterlockedIncrement(&This->ref);
149
150     TRACE("(%p) ref=%d\n", This, ref);
151
152     return ref;
153 }
154
155 static ULONG WINAPI PHClientSite_Release(IOleClientSite *iface)
156 {
157     PluginHost *This = impl_from_IOleClientSite(iface);
158     LONG ref = InterlockedDecrement(&This->ref);
159
160     TRACE("(%p) ref=%d\n", This, ref);
161
162     if(!ref) {
163         if(This->plugin_unk)
164             IUnknown_Release(This->plugin_unk);
165         heap_free(This);
166     }
167
168     return ref;
169 }
170
171 static HRESULT WINAPI PHClientSite_SaveObject(IOleClientSite *iface)
172 {
173     PluginHost *This = impl_from_IOleClientSite(iface);
174     FIXME("(%p)\n", This);
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI PHClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign,
179                                             DWORD dwWhichMoniker, IMoniker **ppmk)
180 {
181     PluginHost *This = impl_from_IOleClientSite(iface);
182     FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
183     return E_NOTIMPL;
184 }
185
186 static HRESULT WINAPI PHClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
187 {
188     PluginHost *This = impl_from_IOleClientSite(iface);
189     FIXME("(%p)->(%p)\n", This, ppContainer);
190     return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI PHClientSite_ShowObject(IOleClientSite *iface)
194 {
195     PluginHost *This = impl_from_IOleClientSite(iface);
196     FIXME("(%p)\n", This);
197     return E_NOTIMPL;
198 }
199
200 static HRESULT WINAPI PHClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
201 {
202     PluginHost *This = impl_from_IOleClientSite(iface);
203     FIXME("(%p)->(%x)\n", This, fShow);
204     return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI PHClientSite_RequestNewObjectLayout(IOleClientSite *iface)
208 {
209     PluginHost *This = impl_from_IOleClientSite(iface);
210     FIXME("(%p)\n", This);
211     return E_NOTIMPL;
212 }
213
214 static const IOleClientSiteVtbl OleClientSiteVtbl = {
215     PHClientSite_QueryInterface,
216     PHClientSite_AddRef,
217     PHClientSite_Release,
218     PHClientSite_SaveObject,
219     PHClientSite_GetMoniker,
220     PHClientSite_GetContainer,
221     PHClientSite_ShowObject,
222     PHClientSite_OnShowWindow,
223     PHClientSite_RequestNewObjectLayout
224 };
225
226 static inline PluginHost *impl_from_IAdviseSinkEx(IAdviseSinkEx *iface)
227 {
228     return CONTAINING_RECORD(iface, PluginHost, IAdviseSinkEx_iface);
229 }
230
231 static HRESULT WINAPI PHAdviseSinkEx_QueryInterface(IAdviseSinkEx *iface, REFIID riid, void **ppv)
232 {
233     PluginHost *This = impl_from_IAdviseSinkEx(iface);
234     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
235 }
236
237 static ULONG WINAPI PHAdviseSinkEx_AddRef(IAdviseSinkEx *iface)
238 {
239     PluginHost *This = impl_from_IAdviseSinkEx(iface);
240     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
241 }
242
243 static ULONG WINAPI PHAdviseSinkEx_Release(IAdviseSinkEx *iface)
244 {
245     PluginHost *This = impl_from_IAdviseSinkEx(iface);
246     return IOleClientSite_Release(&This->IOleClientSite_iface);
247 }
248
249 static void WINAPI PHAdviseSinkEx_OnDataChange(IAdviseSinkEx *iface, FORMATETC *pFormatetc, STGMEDIUM *pStgMedium)
250 {
251     PluginHost *This = impl_from_IAdviseSinkEx(iface);
252     FIXME("(%p)->(%p %p)\n", This, pFormatetc, pStgMedium);
253 }
254
255 static void WINAPI PHAdviseSinkEx_OnViewChange(IAdviseSinkEx *iface, DWORD dwAspect, LONG lindex)
256 {
257     PluginHost *This = impl_from_IAdviseSinkEx(iface);
258     FIXME("(%p)->(%d %d)\n", This, dwAspect, lindex);
259 }
260
261 static void WINAPI PHAdviseSinkEx_OnRename(IAdviseSinkEx *iface, IMoniker *pmk)
262 {
263     PluginHost *This = impl_from_IAdviseSinkEx(iface);
264     FIXME("(%p)->(%p)\n", This, pmk);
265 }
266
267 static void WINAPI PHAdviseSinkEx_OnSave(IAdviseSinkEx *iface)
268 {
269     PluginHost *This = impl_from_IAdviseSinkEx(iface);
270     FIXME("(%p)\n", This);
271 }
272
273 static void WINAPI PHAdviseSinkEx_OnClose(IAdviseSinkEx *iface)
274 {
275     PluginHost *This = impl_from_IAdviseSinkEx(iface);
276     FIXME("(%p)\n", This);
277 }
278
279 static void WINAPI PHAdviseSinkEx_OnViewStatusChange(IAdviseSinkEx *iface, DWORD dwViewStatus)
280 {
281     PluginHost *This = impl_from_IAdviseSinkEx(iface);
282     FIXME("(%p)->(%d)\n", This, dwViewStatus);
283 }
284
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
295 };
296
297 static inline PluginHost *impl_from_IPropertyNotifySink(IPropertyNotifySink *iface)
298 {
299     return CONTAINING_RECORD(iface, PluginHost, IPropertyNotifySink_iface);
300 }
301
302 static HRESULT WINAPI PHPropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, REFIID riid, void **ppv)
303 {
304     PluginHost *This = impl_from_IPropertyNotifySink(iface);
305     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
306 }
307
308 static ULONG WINAPI PHPropertyNotifySink_AddRef(IPropertyNotifySink *iface)
309 {
310     PluginHost *This = impl_from_IPropertyNotifySink(iface);
311     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
312 }
313
314 static ULONG WINAPI PHPropertyNotifySink_Release(IPropertyNotifySink *iface)
315 {
316     PluginHost *This = impl_from_IPropertyNotifySink(iface);
317     return IOleClientSite_Release(&This->IOleClientSite_iface);
318 }
319
320 static HRESULT WINAPI PHPropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
321 {
322     PluginHost *This = impl_from_IPropertyNotifySink(iface);
323     FIXME("(%p)->(%d)\n", This, dispID);
324     return E_NOTIMPL;
325 }
326
327 static HRESULT WINAPI PHPropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
328 {
329     PluginHost *This = impl_from_IPropertyNotifySink(iface);
330     FIXME("(%p)->(%d)\n", This, dispID);
331     return E_NOTIMPL;
332 }
333
334 static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
335     PHPropertyNotifySink_QueryInterface,
336     PHPropertyNotifySink_AddRef,
337     PHPropertyNotifySink_Release,
338     PHPropertyNotifySink_OnChanged,
339     PHPropertyNotifySink_OnRequestEdit
340 };
341
342 static inline PluginHost *impl_from_IDispatch(IDispatch *iface)
343 {
344     return CONTAINING_RECORD(iface, PluginHost, IDispatch_iface);
345 }
346
347 static HRESULT WINAPI PHDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
348 {
349     PluginHost *This = impl_from_IDispatch(iface);
350     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
351 }
352
353 static ULONG WINAPI PHDispatch_AddRef(IDispatch *iface)
354 {
355     PluginHost *This = impl_from_IDispatch(iface);
356     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
357 }
358
359 static ULONG WINAPI PHDispatch_Release(IDispatch *iface)
360 {
361     PluginHost *This = impl_from_IDispatch(iface);
362     return IOleClientSite_Release(&This->IOleClientSite_iface);
363 }
364
365 static HRESULT WINAPI PHDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
366 {
367     PluginHost *This = impl_from_IDispatch(iface);
368     FIXME("(%p)->(%p)\n", This, pctinfo);
369     return E_NOTIMPL;
370 }
371
372 static HRESULT WINAPI PHDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo,
373         LCID lcid, ITypeInfo **ppTInfo)
374 {
375     PluginHost *This = impl_from_IDispatch(iface);
376     FIXME("(%p)->(%d %d %p)\n", This, iTInfo, lcid, ppTInfo);
377     return E_NOTIMPL;
378 }
379
380 static HRESULT WINAPI PHDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid,
381         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
382 {
383     PluginHost *This = impl_from_IDispatch(iface);
384     FIXME("(%p)->(%s %p %d %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
385     return E_NOTIMPL;
386 }
387
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)
390 {
391     PluginHost *This = impl_from_IDispatch(iface);
392     FIXME("(%p)->(%d %x %p %p)\n", This, dispid, wFlags, pDispParams, pVarResult);
393     return E_NOTIMPL;
394 }
395
396 static const IDispatchVtbl DispatchVtbl = {
397     PHDispatch_QueryInterface,
398     PHDispatch_AddRef,
399     PHDispatch_Release,
400     PHDispatch_GetTypeInfoCount,
401     PHDispatch_GetTypeInfo,
402     PHDispatch_GetIDsOfNames,
403     PHDispatch_Invoke
404 };
405
406 static inline PluginHost *impl_from_IOleInPlaceSiteEx(IOleInPlaceSiteEx *iface)
407 {
408     return CONTAINING_RECORD(iface, PluginHost, IOleInPlaceSiteEx_iface);
409 }
410
411 static HRESULT WINAPI PHInPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
412 {
413     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
414     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
415 }
416
417 static ULONG WINAPI PHInPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
418 {
419     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
420     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
421 }
422
423 static ULONG WINAPI PHInPlaceSite_Release(IOleInPlaceSiteEx *iface)
424 {
425     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
426     return IOleClientSite_Release(&This->IOleClientSite_iface);
427 }
428
429 static HRESULT WINAPI PHInPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
430 {
431     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
432     FIXME("(%p)->(%p)\n", This, phwnd);
433     return E_NOTIMPL;
434 }
435
436 static HRESULT WINAPI PHInPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
437 {
438     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
439     FIXME("(%p)->(%x)\n", This, fEnterMode);
440     return E_NOTIMPL;
441 }
442
443 static HRESULT WINAPI PHInPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
444 {
445     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
446     FIXME("(%p)\n", This);
447     return E_NOTIMPL;
448 }
449
450 static HRESULT WINAPI PHInPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
451 {
452     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
453     FIXME("(%p)\n", This);
454     return E_NOTIMPL;
455 }
456
457 static HRESULT WINAPI PHInPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
458 {
459     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
460     FIXME("(%p)\n", This);
461     return E_NOTIMPL;
462 }
463
464 static HRESULT WINAPI PHInPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
465         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, RECT *lprcPosRect,
466         RECT *lprcClipRect, OLEINPLACEFRAMEINFO *frame_info)
467 {
468     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
469     FIXME("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, frame_info);
470     return E_NOTIMPL;
471 }
472
473 static HRESULT WINAPI PHInPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtent)
474 {
475     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
476     FIXME("(%p)->({%d %d})\n", This, scrollExtent.cx, scrollExtent.cy);
477     return E_NOTIMPL;
478 }
479
480 static HRESULT WINAPI PHInPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
481 {
482     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
483     FIXME("(%p)->(%x)\n", This, fUndoable);
484     return E_NOTIMPL;
485 }
486
487 static HRESULT WINAPI PHInPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
488 {
489     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
490     FIXME("(%p)\n", This);
491     return E_NOTIMPL;
492 }
493
494 static HRESULT WINAPI PHInPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
495 {
496     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
497     FIXME("(%p)\n", This);
498     return E_NOTIMPL;
499 }
500
501 static HRESULT WINAPI PHInPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
502 {
503     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
504     FIXME("(%p)\n", This);
505     return E_NOTIMPL;
506 }
507
508 static HRESULT WINAPI PHInPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
509 {
510     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
511     FIXME("(%p)->(%p)\n", This, lprcPosRect);
512     return E_NOTIMPL;
513 }
514
515 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface, BOOL *pfNoRedraw, DWORD dwFlags)
516 {
517     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
518     FIXME("(%p)->(%p %x)\n", This, pfNoRedraw, dwFlags);
519     return E_NOTIMPL;
520 }
521
522 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface, BOOL fNoRedraw)
523 {
524     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
525     FIXME("(%p)->(%x)\n", This, fNoRedraw);
526     return E_NOTIMPL;
527 }
528
529 static HRESULT WINAPI PHInPlaceSiteEx_RequestUIActivate(IOleInPlaceSiteEx *iface)
530 {
531     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
532     FIXME("(%p)\n", This);
533     return E_NOTIMPL;
534 }
535
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
555 };
556
557 static inline PluginHost *impl_from_IOleControlSite(IOleControlSite *iface)
558 {
559     return CONTAINING_RECORD(iface, PluginHost, IOleControlSite_iface);
560 }
561
562 static HRESULT WINAPI PHControlSite_QueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
563 {
564     PluginHost *This = impl_from_IOleControlSite(iface);
565     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
566 }
567
568 static ULONG WINAPI PHControlSite_AddRef(IOleControlSite *iface)
569 {
570     PluginHost *This = impl_from_IOleControlSite(iface);
571     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
572 }
573
574 static ULONG WINAPI PHControlSite_Release(IOleControlSite *iface)
575 {
576     PluginHost *This = impl_from_IOleControlSite(iface);
577     return IOleClientSite_Release(&This->IOleClientSite_iface);
578 }
579
580 static HRESULT WINAPI PHControlSite_OnControlInfoChanged(IOleControlSite *iface)
581 {
582     PluginHost *This = impl_from_IOleControlSite(iface);
583     FIXME("(%p)\n", This);
584     return E_NOTIMPL;
585 }
586
587 static HRESULT WINAPI PHControlSite_LockInPlaceActive(IOleControlSite *iface, BOOL fLock)
588 {
589     PluginHost *This = impl_from_IOleControlSite(iface);
590     FIXME("(%p)->(%x)\n", This, fLock);
591     return E_NOTIMPL;
592 }
593
594 static HRESULT WINAPI PHControlSite_GetExtendedControl(IOleControlSite *iface, IDispatch **ppDisp)
595 {
596     PluginHost *This = impl_from_IOleControlSite(iface);
597     FIXME("(%p)->(%p)\n", This, ppDisp);
598     return E_NOTIMPL;
599 }
600
601 static HRESULT WINAPI PHControlSite_TransformCoords(IOleControlSite *iface, POINTL *pPtlHimetric, POINTF *pPtfContainer, DWORD dwFlags)
602 {
603     PluginHost *This = impl_from_IOleControlSite(iface);
604     FIXME("(%p)->(%p %p %x)\n", This, pPtlHimetric, pPtfContainer, dwFlags);
605     return E_NOTIMPL;
606 }
607
608 static HRESULT WINAPI PHControlSite_TranslateAccelerator(IOleControlSite *iface, MSG *pMsg, DWORD grfModifiers)
609 {
610     PluginHost *This = impl_from_IOleControlSite(iface);
611     FIXME("(%p)->(%x)\n", This, grfModifiers);
612     return E_NOTIMPL;
613 }
614
615 static HRESULT WINAPI PHControlSite_OnFocus(IOleControlSite *iface, BOOL fGotFocus)
616 {
617     PluginHost *This = impl_from_IOleControlSite(iface);
618     FIXME("(%p)->(%x)\n", This, fGotFocus);
619     return E_NOTIMPL;
620 }
621
622 static HRESULT WINAPI PHControlSite_ShowPropertyFrame(IOleControlSite *iface)
623 {
624     PluginHost *This = impl_from_IOleControlSite(iface);
625     FIXME("(%p)\n", This);
626     return E_NOTIMPL;
627 }
628
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
640 };
641
642 static inline PluginHost *impl_from_IBindHost(IBindHost *iface)
643 {
644     return CONTAINING_RECORD(iface, PluginHost, IBindHost_iface);
645 }
646
647 static HRESULT WINAPI PHBindHost_QueryInterface(IBindHost *iface, REFIID riid, void **ppv)
648 {
649     PluginHost *This = impl_from_IBindHost(iface);
650     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
651 }
652
653 static ULONG WINAPI PHBindHost_AddRef(IBindHost *iface)
654 {
655     PluginHost *This = impl_from_IBindHost(iface);
656     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
657 }
658
659 static ULONG WINAPI PHBindHost_Release(IBindHost *iface)
660 {
661     PluginHost *This = impl_from_IBindHost(iface);
662     return IOleClientSite_Release(&This->IOleClientSite_iface);
663 }
664
665 static HRESULT WINAPI PHBindHost_CreateMoniker(IBindHost *iface, LPOLESTR szName, IBindCtx *pBC, IMoniker **ppmk, DWORD dwReserved)
666 {
667     PluginHost *This = impl_from_IBindHost(iface);
668     FIXME("(%p)->(%s %p %p %x)\n", This, debugstr_w(szName), pBC, ppmk, dwReserved);
669     return E_NOTIMPL;
670 }
671
672 static HRESULT WINAPI PHBindHost_MonikerBindToStorage(IBindHost *iface, IMoniker *pMk, IBindCtx *pBC,
673         IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
674 {
675     PluginHost *This = impl_from_IBindHost(iface);
676     FIXME("(%p)->(%p %p %p %s %p)\n", This, pMk, pBC, pBSC, debugstr_guid(riid), ppvObj);
677     return E_NOTIMPL;
678 }
679
680 static HRESULT WINAPI PHBindHost_MonikerBindToObject(IBindHost *iface, IMoniker *pMk, IBindCtx *pBC,
681         IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
682 {
683     PluginHost *This = impl_from_IBindHost(iface);
684     FIXME("(%p)->(%p %p %p %s %p)\n", This, pMk, pBC, pBSC, debugstr_guid(riid), ppvObj);
685     return E_NOTIMPL;
686 }
687
688 static const IBindHostVtbl BindHostVtbl = {
689     PHBindHost_QueryInterface,
690     PHBindHost_AddRef,
691     PHBindHost_Release,
692     PHBindHost_CreateMoniker,
693     PHBindHost_MonikerBindToStorage,
694     PHBindHost_MonikerBindToObject
695 };
696
697 static inline PluginHost *impl_from_IServiceProvider(IServiceProvider *iface)
698 {
699     return CONTAINING_RECORD(iface, PluginHost, IServiceProvider_iface);
700 }
701
702 static HRESULT WINAPI PHServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
703 {
704     PluginHost *This = impl_from_IServiceProvider(iface);
705     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
706 }
707
708 static ULONG WINAPI PHServiceProvider_AddRef(IServiceProvider *iface)
709 {
710     PluginHost *This = impl_from_IServiceProvider(iface);
711     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
712 }
713
714 static ULONG WINAPI PHServiceProvider_Release(IServiceProvider *iface)
715 {
716     PluginHost *This = impl_from_IServiceProvider(iface);
717     return IOleClientSite_Release(&This->IOleClientSite_iface);
718 }
719
720 static HRESULT WINAPI PHServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
721 {
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;
725 }
726
727 static const IServiceProviderVtbl ServiceProviderVtbl = {
728     PHServiceProvider_QueryInterface,
729     PHServiceProvider_AddRef,
730     PHServiceProvider_Release,
731     PHServiceProvider_QueryService
732 };
733
734 HRESULT create_plugin_host(IUnknown *unk, PluginHost **ret)
735 {
736     PluginHost *host;
737
738     host = heap_alloc_zero(sizeof(*host));
739     if(!host)
740         return E_OUTOFMEMORY;
741
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;
750
751     host->ref = 1;
752
753     IUnknown_AddRef(unk);
754     host->plugin_unk = unk;
755
756     *ret = host;
757     return S_OK;
758 }