mshtml: Added PluginHost's IOleInPlaceSite stub implementation.
[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 {
127         WARN("Unsupported interface %s\n", debugstr_guid(riid));
128         *ppv = NULL;
129         return E_NOINTERFACE;
130     }
131
132     IOleClientSite_AddRef((IUnknown*)*ppv);
133     return S_OK;
134 }
135
136 static ULONG WINAPI PHClientSite_AddRef(IOleClientSite *iface)
137 {
138     PluginHost *This = impl_from_IOleClientSite(iface);
139     LONG ref = InterlockedIncrement(&This->ref);
140
141     TRACE("(%p) ref=%d\n", This, ref);
142
143     return ref;
144 }
145
146 static ULONG WINAPI PHClientSite_Release(IOleClientSite *iface)
147 {
148     PluginHost *This = impl_from_IOleClientSite(iface);
149     LONG ref = InterlockedDecrement(&This->ref);
150
151     TRACE("(%p) ref=%d\n", This, ref);
152
153     if(!ref) {
154         if(This->plugin_unk)
155             IUnknown_Release(This->plugin_unk);
156         heap_free(This);
157     }
158
159     return ref;
160 }
161
162 static HRESULT WINAPI PHClientSite_SaveObject(IOleClientSite *iface)
163 {
164     PluginHost *This = impl_from_IOleClientSite(iface);
165     FIXME("(%p)\n", This);
166     return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI PHClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign,
170                                             DWORD dwWhichMoniker, IMoniker **ppmk)
171 {
172     PluginHost *This = impl_from_IOleClientSite(iface);
173     FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI PHClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
178 {
179     PluginHost *This = impl_from_IOleClientSite(iface);
180     FIXME("(%p)->(%p)\n", This, ppContainer);
181     return E_NOTIMPL;
182 }
183
184 static HRESULT WINAPI PHClientSite_ShowObject(IOleClientSite *iface)
185 {
186     PluginHost *This = impl_from_IOleClientSite(iface);
187     FIXME("(%p)\n", This);
188     return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI PHClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
192 {
193     PluginHost *This = impl_from_IOleClientSite(iface);
194     FIXME("(%p)->(%x)\n", This, fShow);
195     return E_NOTIMPL;
196 }
197
198 static HRESULT WINAPI PHClientSite_RequestNewObjectLayout(IOleClientSite *iface)
199 {
200     PluginHost *This = impl_from_IOleClientSite(iface);
201     FIXME("(%p)\n", This);
202     return E_NOTIMPL;
203 }
204
205 static const IOleClientSiteVtbl OleClientSiteVtbl = {
206     PHClientSite_QueryInterface,
207     PHClientSite_AddRef,
208     PHClientSite_Release,
209     PHClientSite_SaveObject,
210     PHClientSite_GetMoniker,
211     PHClientSite_GetContainer,
212     PHClientSite_ShowObject,
213     PHClientSite_OnShowWindow,
214     PHClientSite_RequestNewObjectLayout
215 };
216
217 static inline PluginHost *impl_from_IAdviseSinkEx(IAdviseSinkEx *iface)
218 {
219     return CONTAINING_RECORD(iface, PluginHost, IAdviseSinkEx_iface);
220 }
221
222 static HRESULT WINAPI PHAdviseSinkEx_QueryInterface(IAdviseSinkEx *iface, REFIID riid, void **ppv)
223 {
224     PluginHost *This = impl_from_IAdviseSinkEx(iface);
225     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
226 }
227
228 static ULONG WINAPI PHAdviseSinkEx_AddRef(IAdviseSinkEx *iface)
229 {
230     PluginHost *This = impl_from_IAdviseSinkEx(iface);
231     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
232 }
233
234 static ULONG WINAPI PHAdviseSinkEx_Release(IAdviseSinkEx *iface)
235 {
236     PluginHost *This = impl_from_IAdviseSinkEx(iface);
237     return IOleClientSite_Release(&This->IOleClientSite_iface);
238 }
239
240 static void WINAPI PHAdviseSinkEx_OnDataChange(IAdviseSinkEx *iface, FORMATETC *pFormatetc, STGMEDIUM *pStgMedium)
241 {
242     PluginHost *This = impl_from_IAdviseSinkEx(iface);
243     FIXME("(%p)->(%p %p)\n", This, pFormatetc, pStgMedium);
244 }
245
246 static void WINAPI PHAdviseSinkEx_OnViewChange(IAdviseSinkEx *iface, DWORD dwAspect, LONG lindex)
247 {
248     PluginHost *This = impl_from_IAdviseSinkEx(iface);
249     FIXME("(%p)->(%d %d)\n", This, dwAspect, lindex);
250 }
251
252 static void WINAPI PHAdviseSinkEx_OnRename(IAdviseSinkEx *iface, IMoniker *pmk)
253 {
254     PluginHost *This = impl_from_IAdviseSinkEx(iface);
255     FIXME("(%p)->(%p)\n", This, pmk);
256 }
257
258 static void WINAPI PHAdviseSinkEx_OnSave(IAdviseSinkEx *iface)
259 {
260     PluginHost *This = impl_from_IAdviseSinkEx(iface);
261     FIXME("(%p)\n", This);
262 }
263
264 static void WINAPI PHAdviseSinkEx_OnClose(IAdviseSinkEx *iface)
265 {
266     PluginHost *This = impl_from_IAdviseSinkEx(iface);
267     FIXME("(%p)\n", This);
268 }
269
270 static void WINAPI PHAdviseSinkEx_OnViewStatusChange(IAdviseSinkEx *iface, DWORD dwViewStatus)
271 {
272     PluginHost *This = impl_from_IAdviseSinkEx(iface);
273     FIXME("(%p)->(%d)\n", This, dwViewStatus);
274 }
275
276 static const IAdviseSinkExVtbl AdviseSinkExVtbl = {
277     PHAdviseSinkEx_QueryInterface,
278     PHAdviseSinkEx_AddRef,
279     PHAdviseSinkEx_Release,
280     PHAdviseSinkEx_OnDataChange,
281     PHAdviseSinkEx_OnViewChange,
282     PHAdviseSinkEx_OnRename,
283     PHAdviseSinkEx_OnSave,
284     PHAdviseSinkEx_OnClose,
285     PHAdviseSinkEx_OnViewStatusChange
286 };
287
288 static inline PluginHost *impl_from_IPropertyNotifySink(IPropertyNotifySink *iface)
289 {
290     return CONTAINING_RECORD(iface, PluginHost, IPropertyNotifySink_iface);
291 }
292
293 static HRESULT WINAPI PHPropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, REFIID riid, void **ppv)
294 {
295     PluginHost *This = impl_from_IPropertyNotifySink(iface);
296     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
297 }
298
299 static ULONG WINAPI PHPropertyNotifySink_AddRef(IPropertyNotifySink *iface)
300 {
301     PluginHost *This = impl_from_IPropertyNotifySink(iface);
302     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
303 }
304
305 static ULONG WINAPI PHPropertyNotifySink_Release(IPropertyNotifySink *iface)
306 {
307     PluginHost *This = impl_from_IPropertyNotifySink(iface);
308     return IOleClientSite_Release(&This->IOleClientSite_iface);
309 }
310
311 static HRESULT WINAPI PHPropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
312 {
313     PluginHost *This = impl_from_IPropertyNotifySink(iface);
314     FIXME("(%p)->(%d)\n", This, dispID);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI PHPropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
319 {
320     PluginHost *This = impl_from_IPropertyNotifySink(iface);
321     FIXME("(%p)->(%d)\n", This, dispID);
322     return E_NOTIMPL;
323 }
324
325 static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
326     PHPropertyNotifySink_QueryInterface,
327     PHPropertyNotifySink_AddRef,
328     PHPropertyNotifySink_Release,
329     PHPropertyNotifySink_OnChanged,
330     PHPropertyNotifySink_OnRequestEdit
331 };
332
333 static inline PluginHost *impl_from_IDispatch(IDispatch *iface)
334 {
335     return CONTAINING_RECORD(iface, PluginHost, IDispatch_iface);
336 }
337
338 static HRESULT WINAPI PHDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
339 {
340     PluginHost *This = impl_from_IDispatch(iface);
341     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
342 }
343
344 static ULONG WINAPI PHDispatch_AddRef(IDispatch *iface)
345 {
346     PluginHost *This = impl_from_IDispatch(iface);
347     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
348 }
349
350 static ULONG WINAPI PHDispatch_Release(IDispatch *iface)
351 {
352     PluginHost *This = impl_from_IDispatch(iface);
353     return IOleClientSite_Release(&This->IOleClientSite_iface);
354 }
355
356 static HRESULT WINAPI PHDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
357 {
358     PluginHost *This = impl_from_IDispatch(iface);
359     FIXME("(%p)->(%p)\n", This, pctinfo);
360     return E_NOTIMPL;
361 }
362
363 static HRESULT WINAPI PHDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo,
364         LCID lcid, ITypeInfo **ppTInfo)
365 {
366     PluginHost *This = impl_from_IDispatch(iface);
367     FIXME("(%p)->(%d %d %p)\n", This, iTInfo, lcid, ppTInfo);
368     return E_NOTIMPL;
369 }
370
371 static HRESULT WINAPI PHDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid,
372         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
373 {
374     PluginHost *This = impl_from_IDispatch(iface);
375     FIXME("(%p)->(%s %p %d %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
376     return E_NOTIMPL;
377 }
378
379 static HRESULT WINAPI PHDispatch_Invoke(IDispatch *iface, DISPID dispid,  REFIID riid, LCID lcid,
380         WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
381 {
382     PluginHost *This = impl_from_IDispatch(iface);
383     FIXME("(%p)->(%d %x %p %p)\n", This, dispid, wFlags, pDispParams, pVarResult);
384     return E_NOTIMPL;
385 }
386
387 static const IDispatchVtbl DispatchVtbl = {
388     PHDispatch_QueryInterface,
389     PHDispatch_AddRef,
390     PHDispatch_Release,
391     PHDispatch_GetTypeInfoCount,
392     PHDispatch_GetTypeInfo,
393     PHDispatch_GetIDsOfNames,
394     PHDispatch_Invoke
395 };
396
397 static inline PluginHost *impl_from_IOleInPlaceSiteEx(IOleInPlaceSiteEx *iface)
398 {
399     return CONTAINING_RECORD(iface, PluginHost, IOleInPlaceSiteEx_iface);
400 }
401
402 static HRESULT WINAPI PHInPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
403 {
404     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
405     return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
406 }
407
408 static ULONG WINAPI PHInPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
409 {
410     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
411     return IOleClientSite_AddRef(&This->IOleClientSite_iface);
412 }
413
414 static ULONG WINAPI PHInPlaceSite_Release(IOleInPlaceSiteEx *iface)
415 {
416     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
417     return IOleClientSite_Release(&This->IOleClientSite_iface);
418 }
419
420 static HRESULT WINAPI PHInPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
421 {
422     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
423     FIXME("(%p)->(%p)\n", This, phwnd);
424     return E_NOTIMPL;
425 }
426
427 static HRESULT WINAPI PHInPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
428 {
429     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
430     FIXME("(%p)->(%x)\n", This, fEnterMode);
431     return E_NOTIMPL;
432 }
433
434 static HRESULT WINAPI PHInPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
435 {
436     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
437     FIXME("(%p)\n", This);
438     return E_NOTIMPL;
439 }
440
441 static HRESULT WINAPI PHInPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
442 {
443     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
444     FIXME("(%p)\n", This);
445     return E_NOTIMPL;
446 }
447
448 static HRESULT WINAPI PHInPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
449 {
450     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
451     FIXME("(%p)\n", This);
452     return E_NOTIMPL;
453 }
454
455 static HRESULT WINAPI PHInPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
456         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, RECT *lprcPosRect,
457         RECT *lprcClipRect, OLEINPLACEFRAMEINFO *frame_info)
458 {
459     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
460     FIXME("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, frame_info);
461     return E_NOTIMPL;
462 }
463
464 static HRESULT WINAPI PHInPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtent)
465 {
466     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
467     FIXME("(%p)->({%d %d})\n", This, scrollExtent.cx, scrollExtent.cy);
468     return E_NOTIMPL;
469 }
470
471 static HRESULT WINAPI PHInPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
472 {
473     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
474     FIXME("(%p)->(%x)\n", This, fUndoable);
475     return E_NOTIMPL;
476 }
477
478 static HRESULT WINAPI PHInPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
479 {
480     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
481     FIXME("(%p)\n", This);
482     return E_NOTIMPL;
483 }
484
485 static HRESULT WINAPI PHInPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
486 {
487     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
488     FIXME("(%p)\n", This);
489     return E_NOTIMPL;
490 }
491
492 static HRESULT WINAPI PHInPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
493 {
494     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
495     FIXME("(%p)\n", This);
496     return E_NOTIMPL;
497 }
498
499 static HRESULT WINAPI PHInPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
500 {
501     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
502     FIXME("(%p)->(%p)\n", This, lprcPosRect);
503     return E_NOTIMPL;
504 }
505
506 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface, BOOL *pfNoRedraw, DWORD dwFlags)
507 {
508     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
509     FIXME("(%p)->(%p %x)\n", This, pfNoRedraw, dwFlags);
510     return E_NOTIMPL;
511 }
512
513 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface, BOOL fNoRedraw)
514 {
515     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
516     FIXME("(%p)->(%x)\n", This, fNoRedraw);
517     return E_NOTIMPL;
518 }
519
520 static HRESULT WINAPI PHInPlaceSiteEx_RequestUIActivate(IOleInPlaceSiteEx *iface)
521 {
522     PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
523     FIXME("(%p)\n", This);
524     return E_NOTIMPL;
525 }
526
527 static const IOleInPlaceSiteExVtbl OleInPlaceSiteExVtbl = {
528     PHInPlaceSite_QueryInterface,
529     PHInPlaceSite_AddRef,
530     PHInPlaceSite_Release,
531     PHInPlaceSite_GetWindow,
532     PHInPlaceSite_ContextSensitiveHelp,
533     PHInPlaceSite_CanInPlaceActivate,
534     PHInPlaceSite_OnInPlaceActivate,
535     PHInPlaceSite_OnUIActivate,
536     PHInPlaceSite_GetWindowContext,
537     PHInPlaceSite_Scroll,
538     PHInPlaceSite_OnUIDeactivate,
539     PHInPlaceSite_OnInPlaceDeactivate,
540     PHInPlaceSite_DiscardUndoState,
541     PHInPlaceSite_DeactivateAndUndo,
542     PHInPlaceSite_OnPosRectChange,
543     PHInPlaceSiteEx_OnInPlaceActivateEx,
544     PHInPlaceSiteEx_OnInPlaceDeactivateEx,
545     PHInPlaceSiteEx_RequestUIActivate
546 };
547
548 HRESULT create_plugin_host(IUnknown *unk, PluginHost **ret)
549 {
550     PluginHost *host;
551
552     host = heap_alloc_zero(sizeof(*host));
553     if(!host)
554         return E_OUTOFMEMORY;
555
556     host->IOleClientSite_iface.lpVtbl      = &OleClientSiteVtbl;
557     host->IAdviseSinkEx_iface.lpVtbl       = &AdviseSinkExVtbl;
558     host->IPropertyNotifySink_iface.lpVtbl = &PropertyNotifySinkVtbl;
559     host->IDispatch_iface.lpVtbl           = &DispatchVtbl;
560     host->IOleInPlaceSiteEx_iface.lpVtbl   = &OleInPlaceSiteExVtbl;
561
562     host->ref = 1;
563
564     IUnknown_AddRef(unk);
565     host->plugin_unk = unk;
566
567     *ret = host;
568     return S_OK;
569 }