2 * Copyright 2005 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
26 #include "wine/debug.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(ieframe
);
30 static inline DocHost
*impl_from_IOleClientSite(IOleClientSite
*iface
)
32 return CONTAINING_RECORD(iface
, DocHost
, IOleClientSite_iface
);
35 static HRESULT WINAPI
ClientSite_QueryInterface(IOleClientSite
*iface
, REFIID riid
, void **ppv
)
37 DocHost
*This
= impl_from_IOleClientSite(iface
);
39 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
40 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
41 *ppv
= &This
->IOleClientSite_iface
;
42 }else if(IsEqualGUID(&IID_IOleClientSite
, riid
)) {
43 TRACE("(%p)->(IID_IOleClientSite %p)\n", This
, ppv
);
44 *ppv
= &This
->IOleClientSite_iface
;
45 }else if(IsEqualGUID(&IID_IOleWindow
, riid
)) {
46 TRACE("(%p)->(IID_IOleWindow %p)\n", This
, ppv
);
47 *ppv
= &This
->IOleInPlaceSiteEx_iface
;
48 }else if(IsEqualGUID(&IID_IOleInPlaceSite
, riid
)) {
49 TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This
, ppv
);
50 *ppv
= &This
->IOleInPlaceSiteEx_iface
;
51 }else if(IsEqualGUID(&IID_IOleInPlaceSiteEx
, riid
)) {
52 TRACE("(%p)->(IID_IOleInPlaceSiteEx %p)\n", This
, ppv
);
53 *ppv
= &This
->IOleInPlaceSiteEx_iface
;
54 }else if(IsEqualGUID(&IID_IDocHostUIHandler
, riid
)) {
55 TRACE("(%p)->(IID_IDocHostUIHandler %p)\n", This
, ppv
);
56 *ppv
= &This
->IDocHostUIHandler2_iface
;
57 }else if(IsEqualGUID(&IID_IDocHostUIHandler2
, riid
)) {
58 TRACE("(%p)->(IID_IDocHostUIHandler2 %p)\n", This
, ppv
);
59 *ppv
= &This
->IDocHostUIHandler2_iface
;
60 }else if(IsEqualGUID(&IID_IOleDocumentSite
, riid
)) {
61 TRACE("(%p)->(IID_IOleDocumentSite %p)\n", This
, ppv
);
62 *ppv
= &This
->IOleDocumentSite_iface
;
63 }else if(IsEqualGUID(&IID_IOleControlSite
, riid
)) {
64 TRACE("(%p)->(IID_IOleControlSite %p)\n", This
, ppv
);
65 *ppv
= &This
->IOleControlSite_iface
;
66 }else if(IsEqualGUID(&IID_IOleCommandTarget
, riid
)) {
67 TRACE("(%p)->(IID_IOleCommandTarget %p)\n", This
, ppv
);
68 *ppv
= &This
->IOleCommandTarget_iface
;
69 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
70 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
71 *ppv
= &This
->IDispatch_iface
;
72 }else if(IsEqualGUID(&IID_IPropertyNotifySink
, riid
)) {
73 TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This
, ppv
);
74 *ppv
= &This
->IPropertyNotifySink_iface
;
75 }else if(IsEqualGUID(&IID_IServiceProvider
, riid
)) {
76 TRACE("(%p)->(IID_IServiceProvider %p)\n", This
, ppv
);
77 *ppv
= &This
->IServiceProvider_iface
;
80 WARN("Unsupported interface %s\n", debugstr_guid(riid
));
84 IUnknown_AddRef((IUnknown
*)*ppv
);
88 static ULONG WINAPI
ClientSite_AddRef(IOleClientSite
*iface
)
90 DocHost
*This
= impl_from_IOleClientSite(iface
);
91 return This
->container_vtbl
->addref(This
);
94 static ULONG WINAPI
ClientSite_Release(IOleClientSite
*iface
)
96 DocHost
*This
= impl_from_IOleClientSite(iface
);
97 return This
->container_vtbl
->release(This
);
100 static HRESULT WINAPI
ClientSite_SaveObject(IOleClientSite
*iface
)
102 DocHost
*This
= impl_from_IOleClientSite(iface
);
103 FIXME("(%p)\n", This
);
107 static HRESULT WINAPI
ClientSite_GetMoniker(IOleClientSite
*iface
, DWORD dwAssign
,
108 DWORD dwWhichMoniker
, IMoniker
**ppmk
)
110 DocHost
*This
= impl_from_IOleClientSite(iface
);
111 FIXME("(%p)->(%ld %ld %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
115 static HRESULT WINAPI
ClientSite_GetContainer(IOleClientSite
*iface
, IOleContainer
**ppContainer
)
117 DocHost
*This
= impl_from_IOleClientSite(iface
);
118 FIXME("(%p)->(%p)\n", This
, ppContainer
);
122 static HRESULT WINAPI
ClientSite_ShowObject(IOleClientSite
*iface
)
124 DocHost
*This
= impl_from_IOleClientSite(iface
);
125 FIXME("(%p)\n", This
);
129 static HRESULT WINAPI
ClientSite_OnShowWindow(IOleClientSite
*iface
, BOOL fShow
)
131 DocHost
*This
= impl_from_IOleClientSite(iface
);
132 FIXME("(%p)->(%x)\n", This
, fShow
);
136 static HRESULT WINAPI
ClientSite_RequestNewObjectLayout(IOleClientSite
*iface
)
138 DocHost
*This
= impl_from_IOleClientSite(iface
);
139 FIXME("(%p)\n", This
);
143 static const IOleClientSiteVtbl OleClientSiteVtbl
= {
144 ClientSite_QueryInterface
,
147 ClientSite_SaveObject
,
148 ClientSite_GetMoniker
,
149 ClientSite_GetContainer
,
150 ClientSite_ShowObject
,
151 ClientSite_OnShowWindow
,
152 ClientSite_RequestNewObjectLayout
155 static inline DocHost
*impl_from_IOleInPlaceSiteEx(IOleInPlaceSiteEx
*iface
)
157 return CONTAINING_RECORD(iface
, DocHost
, IOleInPlaceSiteEx_iface
);
160 static HRESULT WINAPI
InPlaceSite_QueryInterface(IOleInPlaceSiteEx
*iface
, REFIID riid
, void **ppv
)
162 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
163 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
166 static ULONG WINAPI
InPlaceSite_AddRef(IOleInPlaceSiteEx
*iface
)
168 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
169 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
172 static ULONG WINAPI
InPlaceSite_Release(IOleInPlaceSiteEx
*iface
)
174 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
175 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
178 static HRESULT WINAPI
InPlaceSite_GetWindow(IOleInPlaceSiteEx
*iface
, HWND
*phwnd
)
180 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
182 TRACE("(%p)->(%p)\n", This
, phwnd
);
188 static HRESULT WINAPI
InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx
*iface
, BOOL fEnterMode
)
190 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
191 FIXME("(%p)->(%x)\n", This
, fEnterMode
);
195 static HRESULT WINAPI
InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx
*iface
)
197 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
199 TRACE("(%p)\n", This
);
201 /* Nothing to do here */
205 static HRESULT WINAPI
InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx
*iface
)
207 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
209 TRACE("(%p)\n", This
);
211 /* Nothing to do here */
215 static HRESULT WINAPI
InPlaceSite_OnUIActivate(IOleInPlaceSiteEx
*iface
)
217 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
218 FIXME("(%p)\n", This
);
222 static HRESULT WINAPI
InPlaceSite_GetWindowContext(IOleInPlaceSiteEx
*iface
,
223 IOleInPlaceFrame
**ppFrame
, IOleInPlaceUIWindow
**ppDoc
, LPRECT lprcPosRect
,
224 LPRECT lprcClipRect
, LPOLEINPLACEFRAMEINFO lpFrameInfo
)
226 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
228 TRACE("(%p)->(%p %p %p %p %p)\n", This
, ppFrame
, ppDoc
, lprcPosRect
,
229 lprcClipRect
, lpFrameInfo
);
231 IOleInPlaceFrame_AddRef(&This
->IOleInPlaceFrame_iface
);
232 *ppFrame
= &This
->IOleInPlaceFrame_iface
;
235 GetClientRect(This
->hwnd
, lprcPosRect
);
236 *lprcClipRect
= *lprcPosRect
;
238 lpFrameInfo
->fMDIApp
= FALSE
;
239 lpFrameInfo
->hwndFrame
= This
->frame_hwnd
;
240 lpFrameInfo
->haccel
= NULL
;
241 lpFrameInfo
->cAccelEntries
= 0; /* FIXME: should be 5 */
246 static HRESULT WINAPI
InPlaceSite_Scroll(IOleInPlaceSiteEx
*iface
, SIZE scrollExtent
)
248 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
249 FIXME("(%p)->({%ld %ld})\n", This
, scrollExtent
.cx
, scrollExtent
.cy
);
253 static HRESULT WINAPI
InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx
*iface
, BOOL fUndoable
)
255 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
256 FIXME("(%p)->(%x)\n", This
, fUndoable
);
260 static HRESULT WINAPI
InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx
*iface
)
262 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
264 TRACE("(%p)\n", This
);
266 /* Nothing to do here */
270 static HRESULT WINAPI
InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx
*iface
)
272 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
273 FIXME("(%p)\n", This
);
277 static HRESULT WINAPI
InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx
*iface
)
279 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
280 FIXME("(%p)\n", This
);
284 static HRESULT WINAPI
InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx
*iface
,
287 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
288 FIXME("(%p)->(%p)\n", This
, lprcPosRect
);
292 static HRESULT WINAPI
InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx
*iface
,
293 BOOL
*pfNoRedraw
, DWORD dwFlags
)
295 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
297 TRACE("(%p)->(%p, %lx)\n", This
, pfNoRedraw
, dwFlags
);
299 /* FIXME: Avoid redraw, when possible */
303 FIXME("dwFlags not supported (%lx)\n", dwFlags
);
306 /* Nothing to do here */
310 static HRESULT WINAPI
InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx
*iface
, BOOL fNoRedraw
)
312 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
314 TRACE("(%p)->(%x)\n", This
, fNoRedraw
);
317 FIXME("fNoRedraw (%x) ignored\n", fNoRedraw
);
320 /* Nothing to do here */
324 static HRESULT WINAPI
InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx
*iface
)
326 DocHost
*This
= impl_from_IOleInPlaceSiteEx(iface
);
327 TRACE("(%p)\n", This
);
329 /* OnUIActivate is always possible */
333 static const IOleInPlaceSiteExVtbl OleInPlaceSiteExVtbl
= {
334 InPlaceSite_QueryInterface
,
337 InPlaceSite_GetWindow
,
338 InPlaceSite_ContextSensitiveHelp
,
339 InPlaceSite_CanInPlaceActivate
,
340 InPlaceSite_OnInPlaceActivate
,
341 InPlaceSite_OnUIActivate
,
342 InPlaceSite_GetWindowContext
,
344 InPlaceSite_OnUIDeactivate
,
345 InPlaceSite_OnInPlaceDeactivate
,
346 InPlaceSite_DiscardUndoState
,
347 InPlaceSite_DeactivateAndUndo
,
348 InPlaceSite_OnPosRectChange
,
349 /* OleInPlaceSiteEx */
350 InPlaceSite_OnInPlaceActivateEx
,
351 InPlaceSite_OnInPlaceDeactivateEx
,
352 InPlaceSite_RequestUIActivate
355 static inline DocHost
*impl_from_IOleDocumentSite(IOleDocumentSite
*iface
)
357 return CONTAINING_RECORD(iface
, DocHost
, IOleDocumentSite_iface
);
360 static HRESULT WINAPI
OleDocumentSite_QueryInterface(IOleDocumentSite
*iface
,
361 REFIID riid
, void **ppv
)
363 DocHost
*This
= impl_from_IOleDocumentSite(iface
);
364 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
367 static ULONG WINAPI
OleDocumentSite_AddRef(IOleDocumentSite
*iface
)
369 DocHost
*This
= impl_from_IOleDocumentSite(iface
);
370 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
373 static ULONG WINAPI
OleDocumentSite_Release(IOleDocumentSite
*iface
)
375 DocHost
*This
= impl_from_IOleDocumentSite(iface
);
376 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
379 static HRESULT WINAPI
OleDocumentSite_ActivateMe(IOleDocumentSite
*iface
,
380 IOleDocumentView
*pViewToActivate
)
382 DocHost
*This
= impl_from_IOleDocumentSite(iface
);
383 IOleDocument
*oledoc
;
387 TRACE("(%p)->(%p)\n", This
, pViewToActivate
);
389 hres
= IUnknown_QueryInterface(This
->document
, &IID_IOleDocument
, (void**)&oledoc
);
393 hres
= IOleDocument_CreateView(oledoc
, (IOleInPlaceSite
*) &This
->IOleInPlaceSiteEx_iface
, NULL
, 0, &This
->view
);
394 IOleDocument_Release(oledoc
);
398 GetClientRect(This
->hwnd
, &rect
);
399 IOleDocumentView_SetRect(This
->view
, &rect
);
401 hres
= IOleDocumentView_Show(This
->view
, TRUE
);
406 static const IOleDocumentSiteVtbl OleDocumentSiteVtbl
= {
407 OleDocumentSite_QueryInterface
,
408 OleDocumentSite_AddRef
,
409 OleDocumentSite_Release
,
410 OleDocumentSite_ActivateMe
413 static inline DocHost
*impl_from_IOleControlSite(IOleControlSite
*iface
)
415 return CONTAINING_RECORD(iface
, DocHost
, IOleControlSite_iface
);
418 static HRESULT WINAPI
ControlSite_QueryInterface(IOleControlSite
*iface
, REFIID riid
, void **ppv
)
420 DocHost
*This
= impl_from_IOleControlSite(iface
);
421 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
424 static ULONG WINAPI
ControlSite_AddRef(IOleControlSite
*iface
)
426 DocHost
*This
= impl_from_IOleControlSite(iface
);
427 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
430 static ULONG WINAPI
ControlSite_Release(IOleControlSite
*iface
)
432 DocHost
*This
= impl_from_IOleControlSite(iface
);
433 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
436 static HRESULT WINAPI
ControlSite_OnControlInfoChanged(IOleControlSite
*iface
)
438 DocHost
*This
= impl_from_IOleControlSite(iface
);
439 FIXME("(%p)\n", This
);
443 static HRESULT WINAPI
ControlSite_LockInPlaceActive(IOleControlSite
*iface
, BOOL fLock
)
445 DocHost
*This
= impl_from_IOleControlSite(iface
);
446 FIXME("(%p)->(%d)\n", This
, fLock
);
450 static HRESULT WINAPI
ControlSite_GetExtendedControl(IOleControlSite
*iface
, IDispatch
**ppDisp
)
452 DocHost
*This
= impl_from_IOleControlSite(iface
);
453 FIXME("(%p)->(%p)\n", This
, ppDisp
);
457 static HRESULT WINAPI
ControlSite_TransformCoords(IOleControlSite
*iface
, POINTL
*pPtlHimetric
,
458 POINTF
*pPtfContainer
, DWORD dwFlags
)
460 DocHost
*This
= impl_from_IOleControlSite(iface
);
461 FIXME("(%p)->(%p, %p, %08lx)\n", This
, pPtlHimetric
, pPtfContainer
, dwFlags
);
465 static HRESULT WINAPI
ControlSite_TranslateAccelerator(IOleControlSite
*iface
, MSG
*pMsg
,
468 DocHost
*This
= impl_from_IOleControlSite(iface
);
470 IOleClientSite
*clientsite
;
471 IOleControlSite
*controlsite
;
474 TRACE("(%p)->(%p, %08lx)\n", This
, pMsg
, grfModifiers
);
476 hr
= IWebBrowser2_QueryInterface(This
->wb
, &IID_IOleObject
, (void**)&wb_obj
);
478 hr
= IOleObject_GetClientSite(wb_obj
, &clientsite
);
480 hr
= IOleClientSite_QueryInterface(clientsite
, &IID_IOleControlSite
, (void**)&controlsite
);
482 hr
= IOleControlSite_TranslateAccelerator(controlsite
, pMsg
, grfModifiers
);
483 IOleControlSite_Release(controlsite
);
485 IOleClientSite_Release(clientsite
);
487 IOleObject_Release(wb_obj
);
496 static HRESULT WINAPI
ControlSite_OnFocus(IOleControlSite
*iface
, BOOL fGotFocus
)
498 DocHost
*This
= impl_from_IOleControlSite(iface
);
499 FIXME("(%p)->(%d)\n", This
, fGotFocus
);
503 static HRESULT WINAPI
ControlSite_ShowPropertyFrame(IOleControlSite
*iface
)
505 DocHost
*This
= impl_from_IOleControlSite(iface
);
506 FIXME("(%p)\n", This
);
510 static IOleControlSiteVtbl OleControlSiteVtbl
= {
511 ControlSite_QueryInterface
,
514 ControlSite_OnControlInfoChanged
,
515 ControlSite_LockInPlaceActive
,
516 ControlSite_GetExtendedControl
,
517 ControlSite_TransformCoords
,
518 ControlSite_TranslateAccelerator
,
520 ControlSite_ShowPropertyFrame
523 static inline DocHost
*impl_from_IDispatch(IDispatch
*iface
)
525 return CONTAINING_RECORD(iface
, DocHost
, IDispatch_iface
);
528 static HRESULT WINAPI
ClDispatch_QueryInterface(IDispatch
*iface
, REFIID riid
, void **ppv
)
530 DocHost
*This
= impl_from_IDispatch(iface
);
531 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
534 static ULONG WINAPI
ClDispatch_AddRef(IDispatch
*iface
)
536 DocHost
*This
= impl_from_IDispatch(iface
);
537 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
540 static ULONG WINAPI
ClDispatch_Release(IDispatch
*iface
)
542 DocHost
*This
= impl_from_IDispatch(iface
);
543 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
546 static HRESULT WINAPI
ClDispatch_GetTypeInfoCount(IDispatch
*iface
, UINT
*pctinfo
)
548 DocHost
*This
= impl_from_IDispatch(iface
);
550 TRACE("(%p)->(%p)\n", This
, pctinfo
);
555 static HRESULT WINAPI
ClDispatch_GetTypeInfo(IDispatch
*iface
, UINT iTInfo
, LCID lcid
,
558 DocHost
*This
= impl_from_IDispatch(iface
);
560 TRACE("(%p)->(%u %ld %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
565 static HRESULT WINAPI
ClDispatch_GetIDsOfNames(IDispatch
*iface
, REFIID riid
, LPOLESTR
*rgszNames
,
566 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
568 DocHost
*This
= impl_from_IDispatch(iface
);
570 TRACE("(%p)->(%s %p %u %ld %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
576 static const char *debugstr_dispid(DISPID dispid
)
580 #define CASE_DISPID(did) case did: return #did
582 CASE_DISPID(DISPID_AMBIENT_USERMODE
);
583 CASE_DISPID(DISPID_AMBIENT_DLCONTROL
);
584 CASE_DISPID(DISPID_AMBIENT_USERAGENT
);
585 CASE_DISPID(DISPID_AMBIENT_PALETTE
);
586 CASE_DISPID(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
);
587 CASE_DISPID(DISPID_AMBIENT_SILENT
);
591 sprintf(buf
, "%ld", dispid
);
595 static HRESULT WINAPI
ClDispatch_Invoke(IDispatch
*iface
, DISPID dispIdMember
, REFIID riid
,
596 LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
597 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
599 DocHost
*This
= impl_from_IDispatch(iface
);
601 TRACE("(%p)->(%s %s %ld %04x %p %p %p %p)\n", This
, debugstr_dispid(dispIdMember
),
602 debugstr_guid(riid
), lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
604 switch(dispIdMember
) {
605 case DISPID_AMBIENT_USERMODE
:
606 case DISPID_AMBIENT_DLCONTROL
:
607 case DISPID_AMBIENT_USERAGENT
:
608 case DISPID_AMBIENT_PALETTE
:
609 if(!This
->client_disp
)
611 return IDispatch_Invoke(This
->client_disp
, dispIdMember
, riid
, lcid
, wFlags
,
612 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
613 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
614 V_VT(pVarResult
) = VT_BOOL
;
615 V_BOOL(pVarResult
) = This
->offline
;
617 case DISPID_AMBIENT_SILENT
:
618 V_VT(pVarResult
) = VT_BOOL
;
619 V_BOOL(pVarResult
) = This
->offline
;
623 FIXME("unhandled dispid %ld\n", dispIdMember
);
627 static const IDispatchVtbl DispatchVtbl
= {
628 ClDispatch_QueryInterface
,
631 ClDispatch_GetTypeInfoCount
,
632 ClDispatch_GetTypeInfo
,
633 ClDispatch_GetIDsOfNames
,
637 static inline DocHost
*impl_from_IServiceProvider(IServiceProvider
*iface
)
639 return CONTAINING_RECORD(iface
, DocHost
, IServiceProvider_iface
);
642 static HRESULT WINAPI
ClServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
,
645 DocHost
*This
= impl_from_IServiceProvider(iface
);
646 return IOleClientSite_QueryInterface(&This
->IOleClientSite_iface
, riid
, ppv
);
649 static ULONG WINAPI
ClServiceProvider_AddRef(IServiceProvider
*iface
)
651 DocHost
*This
= impl_from_IServiceProvider(iface
);
652 return IOleClientSite_AddRef(&This
->IOleClientSite_iface
);
655 static ULONG WINAPI
ClServiceProvider_Release(IServiceProvider
*iface
)
657 DocHost
*This
= impl_from_IServiceProvider(iface
);
658 return IOleClientSite_Release(&This
->IOleClientSite_iface
);
661 static HRESULT WINAPI
ClServiceProvider_QueryService(IServiceProvider
*iface
, REFGUID guidService
,
662 REFIID riid
, void **ppv
)
664 DocHost
*This
= impl_from_IServiceProvider(iface
);
666 if(IsEqualGUID(&IID_IHlinkFrame
, guidService
)) {
667 TRACE("(%p)->(IID_IHlinkFrame %s %p)\n", This
, debugstr_guid(riid
), ppv
);
668 return IWebBrowser2_QueryInterface(This
->wb
, riid
, ppv
);
671 if(IsEqualGUID(&IID_ITargetFrame
, guidService
)) {
672 TRACE("(%p)->(IID_ITargetFrame %s %p)\n", This
, debugstr_guid(riid
), ppv
);
673 return IWebBrowser2_QueryInterface(This
->wb
, riid
, ppv
);
676 if(IsEqualGUID(&IID_IWebBrowserApp
, guidService
)) {
677 TRACE("IWebBrowserApp service\n");
678 return IWebBrowser2_QueryInterface(This
->wb
, riid
, ppv
);
681 if(IsEqualGUID(&IID_IShellBrowser
, guidService
)) {
682 TRACE("(%p)->(IID_IShellBrowser %s %p)\n", This
, debugstr_guid(riid
), ppv
);
684 if(!This
->browser_service
) {
687 hres
= create_browser_service(This
, &This
->browser_service
);
692 return IShellBrowser_QueryInterface(&This
->browser_service
->IShellBrowser_iface
, riid
, ppv
);
695 if(IsEqualGUID(&SID_SNewWindowManager
, guidService
)) {
696 TRACE("SID_SNewWindowManager service\n");
697 return INewWindowManager_QueryInterface(&This
->nwm
.INewWindowManager_iface
, riid
, ppv
);
700 FIXME("(%p)->(%s %s %p)\n", This
, debugstr_guid(guidService
), debugstr_guid(riid
), ppv
);
702 return E_NOINTERFACE
;
705 static const IServiceProviderVtbl ServiceProviderVtbl
= {
706 ClServiceProvider_QueryInterface
,
707 ClServiceProvider_AddRef
,
708 ClServiceProvider_Release
,
709 ClServiceProvider_QueryService
712 void DocHost_ClientSite_Init(DocHost
*This
)
714 This
->IOleClientSite_iface
.lpVtbl
= &OleClientSiteVtbl
;
715 This
->IOleInPlaceSiteEx_iface
.lpVtbl
= &OleInPlaceSiteExVtbl
;
716 This
->IOleDocumentSite_iface
.lpVtbl
= &OleDocumentSiteVtbl
;
717 This
->IOleControlSite_iface
.lpVtbl
= &OleControlSiteVtbl
;
718 This
->IDispatch_iface
.lpVtbl
= &DispatchVtbl
;
719 This
->IServiceProvider_iface
.lpVtbl
= &ServiceProviderVtbl
;
722 void DocHost_ClientSite_Release(DocHost
*This
)
724 if(This
->browser_service
)
725 detach_browser_service(This
->browser_service
);
727 IOleDocumentView_Release(This
->view
);