mshtml: IPropertyBag stub implementation.
[wine/wine-gecko.git] / dlls / mshtml / pluginhost.c
blobf58b765cd3151bbc5a5e2c9deeae53bf924bd180
1 /*
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
19 #include "config.h"
21 #include <stdarg.h>
23 #define COBJMACROS
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "ole2.h"
29 #include "shlobj.h"
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 const IID IID_HTMLPluginContainer =
40 {0xbd7a6050,0xb373,0x4f6f,{0xa4,0x93,0xdd,0x40,0xc5,0x23,0xa8,0x6a}};
42 static BOOL check_load_safety(PluginHost *host)
44 DWORD policy_size, policy;
45 struct CONFIRMSAFETY cs;
46 BYTE *ppolicy;
47 HRESULT hres;
49 cs.clsid = host->clsid;
50 cs.pUnk = host->plugin_unk;
51 cs.dwFlags = CONFIRMSAFETYACTION_LOADOBJECT;
53 hres = IInternetHostSecurityManager_QueryCustomPolicy(HOSTSECMGR(host->doc),
54 &GUID_CUSTOM_CONFIRMOBJECTSAFETY, &ppolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
55 if(FAILED(hres))
56 return FALSE;
58 policy = *(DWORD*)ppolicy;
59 CoTaskMemFree(ppolicy);
60 return policy == URLPOLICY_ALLOW;
63 static void load_prop_bag(PluginHost *host, IPersistPropertyBag *persist_prop_bag)
65 IPropertyBag *prop_bag;
66 HRESULT hres;
68 hres = create_param_prop_bag(&prop_bag);
69 if(FAILED(hres))
70 return;
72 if(prop_bag && !check_load_safety(host)) {
73 IPropertyBag_Release(prop_bag);
74 prop_bag = NULL;
77 if(prop_bag) {
78 hres = IPersistPropertyBag_Load(persist_prop_bag, prop_bag, NULL);
79 IPropertyBag_Release(prop_bag);
80 if(FAILED(hres))
81 WARN("Load failed: %08x\n", hres);
82 }else {
83 hres = IPersistPropertyBag_InitNew(persist_prop_bag);
84 if(FAILED(hres))
85 WARN("InitNew failed: %08x\n", hres);
89 static void load_plugin(PluginHost *host)
91 IPersistPropertyBag2 *persist_prop_bag2;
92 IPersistPropertyBag *persist_prop_bag;
93 HRESULT hres;
95 hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IPersistPropertyBag2, (void**)&persist_prop_bag2);
96 if(SUCCEEDED(hres)) {
97 FIXME("Use IPersistPropertyBag2 iface\n");
98 IPersistPropertyBag2_Release(persist_prop_bag2);
99 return;
102 hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IPersistPropertyBag, (void**)&persist_prop_bag);
103 if(SUCCEEDED(hres)) {
104 load_prop_bag(host, persist_prop_bag);
105 IPersistPropertyBag_Release(persist_prop_bag);
106 return;
109 FIXME("No IPersistPeropertyBag iface \n");
112 static void activate_plugin(PluginHost *host)
114 IClientSecurity *client_security;
115 IQuickActivate *quick_activate;
116 HRESULT hres;
118 if(!host->plugin_unk)
119 return;
121 /* Note native calls QI on plugin for an undocumented IID and CLSID_HTMLDocument */
123 /* FIXME: call FreezeEvents(TRUE) */
125 hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IClientSecurity, (void**)&client_security);
126 if(SUCCEEDED(hres)) {
127 FIXME("Handle IClientSecurity\n");
128 IClientSecurity_Release(client_security);
129 return;
132 hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IQuickActivate, (void**)&quick_activate);
133 if(SUCCEEDED(hres)) {
134 QACONTAINER container = {sizeof(container)};
135 QACONTROL control = {sizeof(control)};
137 container.pClientSite = &host->IOleClientSite_iface;
138 container.dwAmbientFlags = QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE;
139 container.pAdviseSink = &host->IAdviseSinkEx_iface;
140 container.pPropertyNotifySink = &host->IPropertyNotifySink_iface;
142 hres = IQuickActivate_QuickActivate(quick_activate, &container, &control);
143 if(FAILED(hres))
144 FIXME("QuickActivate failed: %08x\n", hres);
145 }else {
146 FIXME("No IQuickActivate\n");
147 return;
150 load_plugin(host);
153 void update_plugin_window(PluginHost *host, HWND hwnd, const RECT *rect)
155 if(!hwnd || (host->hwnd && host->hwnd != hwnd)) {
156 FIXME("unhandled hwnd\n");
157 return;
160 if(!host->hwnd) {
161 host->hwnd = hwnd;
162 activate_plugin(host);
166 static inline PluginHost *impl_from_IOleClientSite(IOleClientSite *iface)
168 return CONTAINING_RECORD(iface, PluginHost, IOleClientSite_iface);
171 static HRESULT WINAPI PHClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
173 PluginHost *This = impl_from_IOleClientSite(iface);
175 if(IsEqualGUID(&IID_IUnknown, riid)) {
176 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
177 *ppv = &This->IOleClientSite_iface;
178 }else if(IsEqualGUID(&IID_IOleClientSite, riid)) {
179 TRACE("(%p)->(IID_IOleClientSite %p)\n", This, ppv);
180 *ppv = &This->IOleClientSite_iface;
181 }else if(IsEqualGUID(&IID_IAdviseSink, riid)) {
182 TRACE("(%p)->(IID_IAdviseSink %p)\n", This, ppv);
183 *ppv = &This->IAdviseSinkEx_iface;
184 }else if(IsEqualGUID(&IID_IAdviseSinkEx, riid)) {
185 TRACE("(%p)->(IID_IAdviseSinkEx %p)\n", This, ppv);
186 *ppv = &This->IAdviseSinkEx_iface;
187 }else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
188 TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppv);
189 *ppv = &This->IPropertyNotifySink_iface;
190 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
191 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
192 *ppv = &This->IDispatch_iface;
193 }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
194 TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
195 *ppv = &This->IOleInPlaceSiteEx_iface;
196 }else if(IsEqualGUID(&IID_IOleInPlaceSite, riid)) {
197 TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This, ppv);
198 *ppv = &This->IOleInPlaceSiteEx_iface;
199 }else if(IsEqualGUID(&IID_IOleInPlaceSiteEx, riid)) {
200 TRACE("(%p)->(IID_IOleInPlaceSiteEx %p)\n", This, ppv);
201 *ppv = &This->IOleInPlaceSiteEx_iface;
202 }else if(IsEqualGUID(&IID_IOleControlSite, riid)) {
203 TRACE("(%p)->(IID_IOleControlSite %p)\n", This, ppv);
204 *ppv = &This->IOleControlSite_iface;
205 }else if(IsEqualGUID(&IID_IBindHost, riid)) {
206 TRACE("(%p)->(IID_IBindHost %p)\n", This, ppv);
207 *ppv = &This->IBindHost_iface;
208 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
209 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
210 *ppv = &This->IServiceProvider_iface;
211 }else {
212 WARN("Unsupported interface %s\n", debugstr_guid(riid));
213 *ppv = NULL;
214 return E_NOINTERFACE;
217 IOleClientSite_AddRef((IUnknown*)*ppv);
218 return S_OK;
221 static ULONG WINAPI PHClientSite_AddRef(IOleClientSite *iface)
223 PluginHost *This = impl_from_IOleClientSite(iface);
224 LONG ref = InterlockedIncrement(&This->ref);
226 TRACE("(%p) ref=%d\n", This, ref);
228 return ref;
231 static ULONG WINAPI PHClientSite_Release(IOleClientSite *iface)
233 PluginHost *This = impl_from_IOleClientSite(iface);
234 LONG ref = InterlockedDecrement(&This->ref);
236 TRACE("(%p) ref=%d\n", This, ref);
238 if(!ref) {
239 list_remove(&This->entry);
240 if(This->element)
241 This->element->plugin_host = NULL;
242 if(This->plugin_unk)
243 IUnknown_Release(This->plugin_unk);
244 heap_free(This);
247 return ref;
250 static HRESULT WINAPI PHClientSite_SaveObject(IOleClientSite *iface)
252 PluginHost *This = impl_from_IOleClientSite(iface);
253 FIXME("(%p)\n", This);
254 return E_NOTIMPL;
257 static HRESULT WINAPI PHClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign,
258 DWORD dwWhichMoniker, IMoniker **ppmk)
260 PluginHost *This = impl_from_IOleClientSite(iface);
261 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
262 return E_NOTIMPL;
265 static HRESULT WINAPI PHClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
267 PluginHost *This = impl_from_IOleClientSite(iface);
268 FIXME("(%p)->(%p)\n", This, ppContainer);
269 return E_NOTIMPL;
272 static HRESULT WINAPI PHClientSite_ShowObject(IOleClientSite *iface)
274 PluginHost *This = impl_from_IOleClientSite(iface);
275 FIXME("(%p)\n", This);
276 return E_NOTIMPL;
279 static HRESULT WINAPI PHClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
281 PluginHost *This = impl_from_IOleClientSite(iface);
282 FIXME("(%p)->(%x)\n", This, fShow);
283 return E_NOTIMPL;
286 static HRESULT WINAPI PHClientSite_RequestNewObjectLayout(IOleClientSite *iface)
288 PluginHost *This = impl_from_IOleClientSite(iface);
289 FIXME("(%p)\n", This);
290 return E_NOTIMPL;
293 static const IOleClientSiteVtbl OleClientSiteVtbl = {
294 PHClientSite_QueryInterface,
295 PHClientSite_AddRef,
296 PHClientSite_Release,
297 PHClientSite_SaveObject,
298 PHClientSite_GetMoniker,
299 PHClientSite_GetContainer,
300 PHClientSite_ShowObject,
301 PHClientSite_OnShowWindow,
302 PHClientSite_RequestNewObjectLayout
305 static inline PluginHost *impl_from_IAdviseSinkEx(IAdviseSinkEx *iface)
307 return CONTAINING_RECORD(iface, PluginHost, IAdviseSinkEx_iface);
310 static HRESULT WINAPI PHAdviseSinkEx_QueryInterface(IAdviseSinkEx *iface, REFIID riid, void **ppv)
312 PluginHost *This = impl_from_IAdviseSinkEx(iface);
313 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
316 static ULONG WINAPI PHAdviseSinkEx_AddRef(IAdviseSinkEx *iface)
318 PluginHost *This = impl_from_IAdviseSinkEx(iface);
319 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
322 static ULONG WINAPI PHAdviseSinkEx_Release(IAdviseSinkEx *iface)
324 PluginHost *This = impl_from_IAdviseSinkEx(iface);
325 return IOleClientSite_Release(&This->IOleClientSite_iface);
328 static void WINAPI PHAdviseSinkEx_OnDataChange(IAdviseSinkEx *iface, FORMATETC *pFormatetc, STGMEDIUM *pStgMedium)
330 PluginHost *This = impl_from_IAdviseSinkEx(iface);
331 FIXME("(%p)->(%p %p)\n", This, pFormatetc, pStgMedium);
334 static void WINAPI PHAdviseSinkEx_OnViewChange(IAdviseSinkEx *iface, DWORD dwAspect, LONG lindex)
336 PluginHost *This = impl_from_IAdviseSinkEx(iface);
337 FIXME("(%p)->(%d %d)\n", This, dwAspect, lindex);
340 static void WINAPI PHAdviseSinkEx_OnRename(IAdviseSinkEx *iface, IMoniker *pmk)
342 PluginHost *This = impl_from_IAdviseSinkEx(iface);
343 FIXME("(%p)->(%p)\n", This, pmk);
346 static void WINAPI PHAdviseSinkEx_OnSave(IAdviseSinkEx *iface)
348 PluginHost *This = impl_from_IAdviseSinkEx(iface);
349 FIXME("(%p)\n", This);
352 static void WINAPI PHAdviseSinkEx_OnClose(IAdviseSinkEx *iface)
354 PluginHost *This = impl_from_IAdviseSinkEx(iface);
355 FIXME("(%p)\n", This);
358 static void WINAPI PHAdviseSinkEx_OnViewStatusChange(IAdviseSinkEx *iface, DWORD dwViewStatus)
360 PluginHost *This = impl_from_IAdviseSinkEx(iface);
361 FIXME("(%p)->(%d)\n", This, dwViewStatus);
364 static const IAdviseSinkExVtbl AdviseSinkExVtbl = {
365 PHAdviseSinkEx_QueryInterface,
366 PHAdviseSinkEx_AddRef,
367 PHAdviseSinkEx_Release,
368 PHAdviseSinkEx_OnDataChange,
369 PHAdviseSinkEx_OnViewChange,
370 PHAdviseSinkEx_OnRename,
371 PHAdviseSinkEx_OnSave,
372 PHAdviseSinkEx_OnClose,
373 PHAdviseSinkEx_OnViewStatusChange
376 static inline PluginHost *impl_from_IPropertyNotifySink(IPropertyNotifySink *iface)
378 return CONTAINING_RECORD(iface, PluginHost, IPropertyNotifySink_iface);
381 static HRESULT WINAPI PHPropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, REFIID riid, void **ppv)
383 PluginHost *This = impl_from_IPropertyNotifySink(iface);
384 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
387 static ULONG WINAPI PHPropertyNotifySink_AddRef(IPropertyNotifySink *iface)
389 PluginHost *This = impl_from_IPropertyNotifySink(iface);
390 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
393 static ULONG WINAPI PHPropertyNotifySink_Release(IPropertyNotifySink *iface)
395 PluginHost *This = impl_from_IPropertyNotifySink(iface);
396 return IOleClientSite_Release(&This->IOleClientSite_iface);
399 static HRESULT WINAPI PHPropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
401 PluginHost *This = impl_from_IPropertyNotifySink(iface);
402 FIXME("(%p)->(%d)\n", This, dispID);
403 return E_NOTIMPL;
406 static HRESULT WINAPI PHPropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
408 PluginHost *This = impl_from_IPropertyNotifySink(iface);
409 FIXME("(%p)->(%d)\n", This, dispID);
410 return E_NOTIMPL;
413 static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
414 PHPropertyNotifySink_QueryInterface,
415 PHPropertyNotifySink_AddRef,
416 PHPropertyNotifySink_Release,
417 PHPropertyNotifySink_OnChanged,
418 PHPropertyNotifySink_OnRequestEdit
421 static inline PluginHost *impl_from_IDispatch(IDispatch *iface)
423 return CONTAINING_RECORD(iface, PluginHost, IDispatch_iface);
426 static HRESULT WINAPI PHDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
428 PluginHost *This = impl_from_IDispatch(iface);
429 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
432 static ULONG WINAPI PHDispatch_AddRef(IDispatch *iface)
434 PluginHost *This = impl_from_IDispatch(iface);
435 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
438 static ULONG WINAPI PHDispatch_Release(IDispatch *iface)
440 PluginHost *This = impl_from_IDispatch(iface);
441 return IOleClientSite_Release(&This->IOleClientSite_iface);
444 static HRESULT WINAPI PHDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
446 PluginHost *This = impl_from_IDispatch(iface);
447 FIXME("(%p)->(%p)\n", This, pctinfo);
448 return E_NOTIMPL;
451 static HRESULT WINAPI PHDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo,
452 LCID lcid, ITypeInfo **ppTInfo)
454 PluginHost *This = impl_from_IDispatch(iface);
455 FIXME("(%p)->(%d %d %p)\n", This, iTInfo, lcid, ppTInfo);
456 return E_NOTIMPL;
459 static HRESULT WINAPI PHDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid,
460 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
462 PluginHost *This = impl_from_IDispatch(iface);
463 FIXME("(%p)->(%s %p %d %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
464 return E_NOTIMPL;
467 static HRESULT WINAPI PHDispatch_Invoke(IDispatch *iface, DISPID dispid, REFIID riid, LCID lcid,
468 WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
470 PluginHost *This = impl_from_IDispatch(iface);
471 FIXME("(%p)->(%d %x %p %p)\n", This, dispid, wFlags, pDispParams, pVarResult);
472 return E_NOTIMPL;
475 static const IDispatchVtbl DispatchVtbl = {
476 PHDispatch_QueryInterface,
477 PHDispatch_AddRef,
478 PHDispatch_Release,
479 PHDispatch_GetTypeInfoCount,
480 PHDispatch_GetTypeInfo,
481 PHDispatch_GetIDsOfNames,
482 PHDispatch_Invoke
485 static inline PluginHost *impl_from_IOleInPlaceSiteEx(IOleInPlaceSiteEx *iface)
487 return CONTAINING_RECORD(iface, PluginHost, IOleInPlaceSiteEx_iface);
490 static HRESULT WINAPI PHInPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
492 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
493 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
496 static ULONG WINAPI PHInPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
498 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
499 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
502 static ULONG WINAPI PHInPlaceSite_Release(IOleInPlaceSiteEx *iface)
504 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
505 return IOleClientSite_Release(&This->IOleClientSite_iface);
508 static HRESULT WINAPI PHInPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
510 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
511 FIXME("(%p)->(%p)\n", This, phwnd);
512 return E_NOTIMPL;
515 static HRESULT WINAPI PHInPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
517 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
518 FIXME("(%p)->(%x)\n", This, fEnterMode);
519 return E_NOTIMPL;
522 static HRESULT WINAPI PHInPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
524 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
525 FIXME("(%p)\n", This);
526 return E_NOTIMPL;
529 static HRESULT WINAPI PHInPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
531 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
532 FIXME("(%p)\n", This);
533 return E_NOTIMPL;
536 static HRESULT WINAPI PHInPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
538 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
539 FIXME("(%p)\n", This);
540 return E_NOTIMPL;
543 static HRESULT WINAPI PHInPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
544 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, RECT *lprcPosRect,
545 RECT *lprcClipRect, OLEINPLACEFRAMEINFO *frame_info)
547 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
548 FIXME("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, frame_info);
549 return E_NOTIMPL;
552 static HRESULT WINAPI PHInPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtent)
554 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
555 FIXME("(%p)->({%d %d})\n", This, scrollExtent.cx, scrollExtent.cy);
556 return E_NOTIMPL;
559 static HRESULT WINAPI PHInPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
561 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
562 FIXME("(%p)->(%x)\n", This, fUndoable);
563 return E_NOTIMPL;
566 static HRESULT WINAPI PHInPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
568 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
569 FIXME("(%p)\n", This);
570 return E_NOTIMPL;
573 static HRESULT WINAPI PHInPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
575 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
576 FIXME("(%p)\n", This);
577 return E_NOTIMPL;
580 static HRESULT WINAPI PHInPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
582 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
583 FIXME("(%p)\n", This);
584 return E_NOTIMPL;
587 static HRESULT WINAPI PHInPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
589 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
590 FIXME("(%p)->(%p)\n", This, lprcPosRect);
591 return E_NOTIMPL;
594 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface, BOOL *pfNoRedraw, DWORD dwFlags)
596 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
597 FIXME("(%p)->(%p %x)\n", This, pfNoRedraw, dwFlags);
598 return E_NOTIMPL;
601 static HRESULT WINAPI PHInPlaceSiteEx_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface, BOOL fNoRedraw)
603 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
604 FIXME("(%p)->(%x)\n", This, fNoRedraw);
605 return E_NOTIMPL;
608 static HRESULT WINAPI PHInPlaceSiteEx_RequestUIActivate(IOleInPlaceSiteEx *iface)
610 PluginHost *This = impl_from_IOleInPlaceSiteEx(iface);
611 FIXME("(%p)\n", This);
612 return E_NOTIMPL;
615 static const IOleInPlaceSiteExVtbl OleInPlaceSiteExVtbl = {
616 PHInPlaceSite_QueryInterface,
617 PHInPlaceSite_AddRef,
618 PHInPlaceSite_Release,
619 PHInPlaceSite_GetWindow,
620 PHInPlaceSite_ContextSensitiveHelp,
621 PHInPlaceSite_CanInPlaceActivate,
622 PHInPlaceSite_OnInPlaceActivate,
623 PHInPlaceSite_OnUIActivate,
624 PHInPlaceSite_GetWindowContext,
625 PHInPlaceSite_Scroll,
626 PHInPlaceSite_OnUIDeactivate,
627 PHInPlaceSite_OnInPlaceDeactivate,
628 PHInPlaceSite_DiscardUndoState,
629 PHInPlaceSite_DeactivateAndUndo,
630 PHInPlaceSite_OnPosRectChange,
631 PHInPlaceSiteEx_OnInPlaceActivateEx,
632 PHInPlaceSiteEx_OnInPlaceDeactivateEx,
633 PHInPlaceSiteEx_RequestUIActivate
636 static inline PluginHost *impl_from_IOleControlSite(IOleControlSite *iface)
638 return CONTAINING_RECORD(iface, PluginHost, IOleControlSite_iface);
641 static HRESULT WINAPI PHControlSite_QueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
643 PluginHost *This = impl_from_IOleControlSite(iface);
644 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
647 static ULONG WINAPI PHControlSite_AddRef(IOleControlSite *iface)
649 PluginHost *This = impl_from_IOleControlSite(iface);
650 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
653 static ULONG WINAPI PHControlSite_Release(IOleControlSite *iface)
655 PluginHost *This = impl_from_IOleControlSite(iface);
656 return IOleClientSite_Release(&This->IOleClientSite_iface);
659 static HRESULT WINAPI PHControlSite_OnControlInfoChanged(IOleControlSite *iface)
661 PluginHost *This = impl_from_IOleControlSite(iface);
662 FIXME("(%p)\n", This);
663 return E_NOTIMPL;
666 static HRESULT WINAPI PHControlSite_LockInPlaceActive(IOleControlSite *iface, BOOL fLock)
668 PluginHost *This = impl_from_IOleControlSite(iface);
669 FIXME("(%p)->(%x)\n", This, fLock);
670 return E_NOTIMPL;
673 static HRESULT WINAPI PHControlSite_GetExtendedControl(IOleControlSite *iface, IDispatch **ppDisp)
675 PluginHost *This = impl_from_IOleControlSite(iface);
676 FIXME("(%p)->(%p)\n", This, ppDisp);
677 return E_NOTIMPL;
680 static HRESULT WINAPI PHControlSite_TransformCoords(IOleControlSite *iface, POINTL *pPtlHimetric, POINTF *pPtfContainer, DWORD dwFlags)
682 PluginHost *This = impl_from_IOleControlSite(iface);
683 FIXME("(%p)->(%p %p %x)\n", This, pPtlHimetric, pPtfContainer, dwFlags);
684 return E_NOTIMPL;
687 static HRESULT WINAPI PHControlSite_TranslateAccelerator(IOleControlSite *iface, MSG *pMsg, DWORD grfModifiers)
689 PluginHost *This = impl_from_IOleControlSite(iface);
690 FIXME("(%p)->(%x)\n", This, grfModifiers);
691 return E_NOTIMPL;
694 static HRESULT WINAPI PHControlSite_OnFocus(IOleControlSite *iface, BOOL fGotFocus)
696 PluginHost *This = impl_from_IOleControlSite(iface);
697 FIXME("(%p)->(%x)\n", This, fGotFocus);
698 return E_NOTIMPL;
701 static HRESULT WINAPI PHControlSite_ShowPropertyFrame(IOleControlSite *iface)
703 PluginHost *This = impl_from_IOleControlSite(iface);
704 FIXME("(%p)\n", This);
705 return E_NOTIMPL;
708 static const IOleControlSiteVtbl OleControlSiteVtbl = {
709 PHControlSite_QueryInterface,
710 PHControlSite_AddRef,
711 PHControlSite_Release,
712 PHControlSite_OnControlInfoChanged,
713 PHControlSite_LockInPlaceActive,
714 PHControlSite_GetExtendedControl,
715 PHControlSite_TransformCoords,
716 PHControlSite_TranslateAccelerator,
717 PHControlSite_OnFocus,
718 PHControlSite_ShowPropertyFrame
721 static inline PluginHost *impl_from_IBindHost(IBindHost *iface)
723 return CONTAINING_RECORD(iface, PluginHost, IBindHost_iface);
726 static HRESULT WINAPI PHBindHost_QueryInterface(IBindHost *iface, REFIID riid, void **ppv)
728 PluginHost *This = impl_from_IBindHost(iface);
729 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
732 static ULONG WINAPI PHBindHost_AddRef(IBindHost *iface)
734 PluginHost *This = impl_from_IBindHost(iface);
735 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
738 static ULONG WINAPI PHBindHost_Release(IBindHost *iface)
740 PluginHost *This = impl_from_IBindHost(iface);
741 return IOleClientSite_Release(&This->IOleClientSite_iface);
744 static HRESULT WINAPI PHBindHost_CreateMoniker(IBindHost *iface, LPOLESTR szName, IBindCtx *pBC, IMoniker **ppmk, DWORD dwReserved)
746 PluginHost *This = impl_from_IBindHost(iface);
747 FIXME("(%p)->(%s %p %p %x)\n", This, debugstr_w(szName), pBC, ppmk, dwReserved);
748 return E_NOTIMPL;
751 static HRESULT WINAPI PHBindHost_MonikerBindToStorage(IBindHost *iface, IMoniker *pMk, IBindCtx *pBC,
752 IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
754 PluginHost *This = impl_from_IBindHost(iface);
755 FIXME("(%p)->(%p %p %p %s %p)\n", This, pMk, pBC, pBSC, debugstr_guid(riid), ppvObj);
756 return E_NOTIMPL;
759 static HRESULT WINAPI PHBindHost_MonikerBindToObject(IBindHost *iface, IMoniker *pMk, IBindCtx *pBC,
760 IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
762 PluginHost *This = impl_from_IBindHost(iface);
763 FIXME("(%p)->(%p %p %p %s %p)\n", This, pMk, pBC, pBSC, debugstr_guid(riid), ppvObj);
764 return E_NOTIMPL;
767 static const IBindHostVtbl BindHostVtbl = {
768 PHBindHost_QueryInterface,
769 PHBindHost_AddRef,
770 PHBindHost_Release,
771 PHBindHost_CreateMoniker,
772 PHBindHost_MonikerBindToStorage,
773 PHBindHost_MonikerBindToObject
776 static inline PluginHost *impl_from_IServiceProvider(IServiceProvider *iface)
778 return CONTAINING_RECORD(iface, PluginHost, IServiceProvider_iface);
781 static HRESULT WINAPI PHServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
783 PluginHost *This = impl_from_IServiceProvider(iface);
784 return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppv);
787 static ULONG WINAPI PHServiceProvider_AddRef(IServiceProvider *iface)
789 PluginHost *This = impl_from_IServiceProvider(iface);
790 return IOleClientSite_AddRef(&This->IOleClientSite_iface);
793 static ULONG WINAPI PHServiceProvider_Release(IServiceProvider *iface)
795 PluginHost *This = impl_from_IServiceProvider(iface);
796 return IOleClientSite_Release(&This->IOleClientSite_iface);
799 static HRESULT WINAPI PHServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
801 PluginHost *This = impl_from_IServiceProvider(iface);
802 FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
803 return E_NOINTERFACE;
806 static const IServiceProviderVtbl ServiceProviderVtbl = {
807 PHServiceProvider_QueryInterface,
808 PHServiceProvider_AddRef,
809 PHServiceProvider_Release,
810 PHServiceProvider_QueryService
813 static HRESULT assoc_element(PluginHost *host, HTMLDocumentNode *doc, nsIDOMElement *nselem)
815 HTMLPluginContainer *container_elem;
816 HTMLDOMNode *node;
817 HRESULT hres;
819 hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node);
820 if(FAILED(hres))
821 return hres;
823 hres = IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_HTMLPluginContainer, (void**)&container_elem);
824 if(FAILED(hres)) {
825 ERR("Not an object element\n");
826 return hres;
829 container_elem->plugin_host = host;
830 host->element = container_elem;
831 return S_OK;
834 void detach_plugin_hosts(HTMLDocumentNode *doc)
836 PluginHost *iter;
838 while(!list_empty(&doc->plugin_hosts)) {
839 iter = LIST_ENTRY(list_head(&doc->plugin_hosts), PluginHost, entry);
840 list_remove(&iter->entry);
841 iter->doc = NULL;
845 HRESULT create_plugin_host(HTMLDocumentNode *doc, nsIDOMElement *nselem, IUnknown *unk, const CLSID *clsid, PluginHost **ret)
847 PluginHost *host;
848 HRESULT hres;
850 host = heap_alloc_zero(sizeof(*host));
851 if(!host)
852 return E_OUTOFMEMORY;
854 host->IOleClientSite_iface.lpVtbl = &OleClientSiteVtbl;
855 host->IAdviseSinkEx_iface.lpVtbl = &AdviseSinkExVtbl;
856 host->IPropertyNotifySink_iface.lpVtbl = &PropertyNotifySinkVtbl;
857 host->IDispatch_iface.lpVtbl = &DispatchVtbl;
858 host->IOleInPlaceSiteEx_iface.lpVtbl = &OleInPlaceSiteExVtbl;
859 host->IOleControlSite_iface.lpVtbl = &OleControlSiteVtbl;
860 host->IBindHost_iface.lpVtbl = &BindHostVtbl;
861 host->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
863 host->ref = 1;
865 hres = assoc_element(host, doc, nselem);
866 if(FAILED(hres)) {
867 heap_free(host);
868 return hres;
871 IUnknown_AddRef(unk);
872 host->plugin_unk = unk;
873 host->clsid = *clsid;
875 host->doc = doc;
876 list_add_tail(&doc->plugin_hosts, &host->entry);
878 *ret = host;
879 return S_OK;