2 * Copyright 2005 Jacek Caban
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "shdeprecated.h"
35 #include "wine/debug.h"
37 #include "mshtml_private.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
41 #define DOCHOST_DOCCANNAVIGATE 0
44 IEnumUnknown IEnumUnknown_iface
;
48 static inline EnumUnknown
*impl_from_IEnumUnknown(IEnumUnknown
*iface
)
50 return CONTAINING_RECORD(iface
, EnumUnknown
, IEnumUnknown_iface
);
53 static HRESULT WINAPI
EnumUnknown_QueryInterface(IEnumUnknown
*iface
, REFIID riid
, void **ppv
)
55 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
57 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
58 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
59 *ppv
= &This
->IEnumUnknown_iface
;
60 }else if(IsEqualGUID(&IID_IEnumUnknown
, riid
)) {
61 TRACE("(%p)->(IID_IEnumUnknown %p)\n", This
, ppv
);
62 *ppv
= &This
->IEnumUnknown_iface
;
64 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
69 IUnknown_AddRef((IUnknown
*)*ppv
);
73 static ULONG WINAPI
EnumUnknown_AddRef(IEnumUnknown
*iface
)
75 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
76 LONG ref
= InterlockedIncrement(&This
->ref
);
78 TRACE("(%p) ref=%d\n", This
, ref
);
83 static ULONG WINAPI
EnumUnknown_Release(IEnumUnknown
*iface
)
85 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
86 LONG ref
= InterlockedDecrement(&This
->ref
);
88 TRACE("(%p) ref=%d\n", This
, ref
);
96 static HRESULT WINAPI
EnumUnknown_Next(IEnumUnknown
*iface
, ULONG celt
, IUnknown
**rgelt
, ULONG
*pceltFetched
)
98 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
100 TRACE("(%p)->(%u %p %p)\n", This
, celt
, rgelt
, pceltFetched
);
102 /* FIXME: It's not clear if we should ever return something here */
108 static HRESULT WINAPI
EnumUnknown_Skip(IEnumUnknown
*iface
, ULONG celt
)
110 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
111 FIXME("(%p)->(%u)\n", This
, celt
);
115 static HRESULT WINAPI
EnumUnknown_Reset(IEnumUnknown
*iface
)
117 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
118 FIXME("(%p)\n", This
);
122 static HRESULT WINAPI
EnumUnknown_Clone(IEnumUnknown
*iface
, IEnumUnknown
**ppenum
)
124 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
125 FIXME("(%p)->(%p)\n", This
, ppenum
);
129 static const IEnumUnknownVtbl EnumUnknownVtbl
= {
130 EnumUnknown_QueryInterface
,
139 /**********************************************************
140 * IOleObject implementation
143 static inline HTMLDocument
*impl_from_IOleObject(IOleObject
*iface
)
145 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleObject_iface
);
148 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **ppv
)
150 HTMLDocument
*This
= impl_from_IOleObject(iface
);
151 return htmldoc_query_interface(This
, riid
, ppv
);
154 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
156 HTMLDocument
*This
= impl_from_IOleObject(iface
);
157 return htmldoc_addref(This
);
160 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
162 HTMLDocument
*This
= impl_from_IOleObject(iface
);
163 return htmldoc_release(This
);
166 static void update_hostinfo(HTMLDocumentObj
*This
, DOCHOSTUIINFO
*hostinfo
)
168 nsIScrollable
*scrollable
;
171 if(!This
->nscontainer
)
174 nsres
= nsIWebBrowser_QueryInterface(This
->nscontainer
->webbrowser
, &IID_nsIScrollable
, (void**)&scrollable
);
175 if(NS_SUCCEEDED(nsres
)) {
176 nsres
= nsIScrollable_SetDefaultScrollbarPreferences(scrollable
, ScrollOrientation_Y
,
177 (hostinfo
->dwFlags
& DOCHOSTUIFLAG_SCROLL_NO
) ? Scrollbar_Never
: Scrollbar_Always
);
179 ERR("Could not set default Y scrollbar prefs: %08x\n", nsres
);
181 nsres
= nsIScrollable_SetDefaultScrollbarPreferences(scrollable
, ScrollOrientation_X
,
182 hostinfo
->dwFlags
& DOCHOSTUIFLAG_SCROLL_NO
? Scrollbar_Never
: Scrollbar_Auto
);
184 ERR("Could not set default X scrollbar prefs: %08x\n", nsres
);
186 nsIScrollable_Release(scrollable
);
188 ERR("Could not get nsIScrollable: %08x\n", nsres
);
192 /* Calls undocumented 84 cmd of CGID_ShellDocView */
193 void call_docview_84(HTMLDocumentObj
*doc
)
195 IOleCommandTarget
*olecmd
;
202 hres
= IOleClientSite_QueryInterface(doc
->client
, &IID_IOleCommandTarget
, (void**)&olecmd
);
207 hres
= IOleCommandTarget_Exec(olecmd
, &CGID_ShellDocView
, 84, 0, NULL
, &var
);
208 IOleCommandTarget_Release(olecmd
);
209 if(SUCCEEDED(hres
) && V_VT(&var
) != VT_NULL
)
210 FIXME("handle result\n");
213 static void set_document_navigation(HTMLDocumentObj
*doc
, BOOL doc_can_navigate
)
217 if(!doc
->client_cmdtrg
)
220 if(doc_can_navigate
) {
221 V_VT(&var
) = VT_UNKNOWN
;
222 V_UNKNOWN(&var
) = (IUnknown
*)&doc
->basedoc
.window
->base
.IHTMLWindow2_iface
;
225 IOleCommandTarget_Exec(doc
->client_cmdtrg
, &CGID_DocHostCmdPriv
, DOCHOST_DOCCANNAVIGATE
, 0,
226 doc_can_navigate
? &var
: NULL
, NULL
);
229 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, IOleClientSite
*pClientSite
)
231 HTMLDocument
*This
= impl_from_IOleObject(iface
);
232 IOleCommandTarget
*cmdtrg
= NULL
;
233 IOleWindow
*ole_window
;
234 IBrowserService
*browser_service
;
240 TRACE("(%p)->(%p)\n", This
, pClientSite
);
242 if(pClientSite
== This
->doc_obj
->client
)
245 if(This
->doc_obj
->client
) {
246 IOleClientSite_Release(This
->doc_obj
->client
);
247 This
->doc_obj
->client
= NULL
;
248 This
->doc_obj
->usermode
= UNKNOWN_USERMODE
;
251 if(This
->doc_obj
->client_cmdtrg
) {
252 IOleCommandTarget_Release(This
->doc_obj
->client_cmdtrg
);
253 This
->doc_obj
->client_cmdtrg
= NULL
;
256 if(This
->doc_obj
->hostui
&& !This
->doc_obj
->custom_hostui
) {
257 IDocHostUIHandler_Release(This
->doc_obj
->hostui
);
258 This
->doc_obj
->hostui
= NULL
;
261 if(This
->doc_obj
->doc_object_service
) {
262 IDocObjectService_Release(This
->doc_obj
->doc_object_service
);
263 This
->doc_obj
->doc_object_service
= NULL
;
266 if(This
->doc_obj
->webbrowser
) {
267 IUnknown_Release(This
->doc_obj
->webbrowser
);
268 This
->doc_obj
->webbrowser
= NULL
;
271 if(This
->doc_obj
->browser_service
) {
272 IUnknown_Release(This
->doc_obj
->browser_service
);
273 This
->doc_obj
->browser_service
= NULL
;
276 if(This
->doc_obj
->travel_log
) {
277 ITravelLog_Release(This
->doc_obj
->travel_log
);
278 This
->doc_obj
->travel_log
= NULL
;
281 memset(&This
->doc_obj
->hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
286 IOleClientSite_AddRef(pClientSite
);
287 This
->doc_obj
->client
= pClientSite
;
289 hostui_setup
= This
->doc_obj
->hostui_setup
;
291 if(!This
->doc_obj
->hostui
) {
292 IDocHostUIHandler
*uihandler
;
294 This
->doc_obj
->custom_hostui
= FALSE
;
296 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IDocHostUIHandler
, (void**)&uihandler
);
298 This
->doc_obj
->hostui
= uihandler
;
301 if(This
->doc_obj
->hostui
) {
302 DOCHOSTUIINFO hostinfo
;
303 LPOLESTR key_path
= NULL
, override_key_path
= NULL
;
304 IDocHostUIHandler2
*uihandler2
;
306 memset(&hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
307 hostinfo
.cbSize
= sizeof(DOCHOSTUIINFO
);
308 hres
= IDocHostUIHandler_GetHostInfo(This
->doc_obj
->hostui
, &hostinfo
);
309 if(SUCCEEDED(hres
)) {
310 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
311 hostinfo
.cbSize
, hostinfo
.dwFlags
, hostinfo
.dwDoubleClick
,
312 debugstr_w(hostinfo
.pchHostCss
), debugstr_w(hostinfo
.pchHostNS
));
313 update_hostinfo(This
->doc_obj
, &hostinfo
);
314 This
->doc_obj
->hostinfo
= hostinfo
;
318 hres
= IDocHostUIHandler_GetOptionKeyPath(This
->doc_obj
->hostui
, &key_path
, 0);
319 if(hres
== S_OK
&& key_path
) {
321 /* FIXME: use key_path */
322 TRACE("key_path = %s\n", debugstr_w(key_path
));
324 CoTaskMemFree(key_path
);
327 hres
= IDocHostUIHandler_QueryInterface(This
->doc_obj
->hostui
, &IID_IDocHostUIHandler2
,
328 (void**)&uihandler2
);
329 if(SUCCEEDED(hres
)) {
330 hres
= IDocHostUIHandler2_GetOverrideKeyPath(uihandler2
, &override_key_path
, 0);
331 if(hres
== S_OK
&& override_key_path
&& override_key_path
[0]) {
332 if(override_key_path
[0]) {
333 /*FIXME: use override_key_path */
334 TRACE("override_key_path = %s\n", debugstr_w(override_key_path
));
336 CoTaskMemFree(override_key_path
);
338 IDocHostUIHandler2_Release(uihandler2
);
341 This
->doc_obj
->hostui_setup
= TRUE
;
345 /* Native calls here GetWindow. What is it for?
346 * We don't have anything to do with it here (yet). */
347 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IOleWindow
, (void**)&ole_window
);
348 if(SUCCEEDED(hres
)) {
349 IOleWindow_GetWindow(ole_window
, &hwnd
);
350 IOleWindow_Release(ole_window
);
353 hres
= do_query_service((IUnknown
*)pClientSite
, &IID_IShellBrowser
,
354 &IID_IBrowserService
, (void**)&browser_service
);
355 if(SUCCEEDED(hres
)) {
356 ITravelLog
*travel_log
;
358 This
->doc_obj
->browser_service
= (IUnknown
*)browser_service
;
360 hres
= IBrowserService_GetTravelLog(browser_service
, &travel_log
);
362 This
->doc_obj
->travel_log
= travel_log
;
364 browser_service
= NULL
;
367 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IOleCommandTarget
, (void**)&cmdtrg
);
368 if(SUCCEEDED(hres
)) {
370 OLECMD cmd
= {OLECMDID_SETPROGRESSTEXT
, 0};
372 This
->doc_obj
->client_cmdtrg
= cmdtrg
;
375 IDocObjectService
*doc_object_service
;
378 set_document_navigation(This
->doc_obj
, TRUE
);
380 if(browser_service
) {
381 hres
= IBrowserService_QueryInterface(browser_service
,
382 &IID_IDocObjectService
, (void**)&doc_object_service
);
383 if(SUCCEEDED(hres
)) {
384 This
->doc_obj
->doc_object_service
= doc_object_service
;
387 * Some embedding routines, esp. in regards to use of IDocObjectService, differ if
388 * embedder supports IWebBrowserApp.
390 hres
= do_query_service((IUnknown
*)pClientSite
, &IID_IWebBrowserApp
, &IID_IWebBrowser2
, (void**)&wb
);
392 This
->doc_obj
->webbrowser
= (IUnknown
*)wb
;
397 call_docview_84(This
->doc_obj
);
399 IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &cmd
, NULL
);
403 IOleCommandTarget_Exec(cmdtrg
, NULL
, OLECMDID_SETPROGRESSMAX
,
404 OLECMDEXECOPT_DONTPROMPTUSER
, &var
, NULL
);
405 IOleCommandTarget_Exec(cmdtrg
, NULL
, OLECMDID_SETPROGRESSPOS
,
406 OLECMDEXECOPT_DONTPROMPTUSER
, &var
, NULL
);
409 if(This
->doc_obj
->usermode
== UNKNOWN_USERMODE
)
410 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
, DISPID_AMBIENT_USERMODE
);
412 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
,
413 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
);
415 hres
= get_client_disp_property(This
->doc_obj
->client
, DISPID_AMBIENT_SILENT
, &silent
);
416 if(SUCCEEDED(hres
)) {
417 if(V_VT(&silent
) != VT_BOOL
)
418 WARN("silent = %s\n", debugstr_variant(&silent
));
419 else if(V_BOOL(&silent
))
420 FIXME("silent == true\n");
423 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
, DISPID_AMBIENT_USERAGENT
);
424 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
, DISPID_AMBIENT_PALETTE
);
429 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, IOleClientSite
**ppClientSite
)
431 HTMLDocument
*This
= impl_from_IOleObject(iface
);
433 TRACE("(%p)->(%p)\n", This
, ppClientSite
);
438 if(This
->doc_obj
->client
)
439 IOleClientSite_AddRef(This
->doc_obj
->client
);
440 *ppClientSite
= This
->doc_obj
->client
;
445 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR szContainerApp
, LPCOLESTR szContainerObj
)
447 HTMLDocument
*This
= impl_from_IOleObject(iface
);
448 FIXME("(%p)->(%s %s)\n", This
, debugstr_w(szContainerApp
), debugstr_w(szContainerObj
));
452 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD dwSaveOption
)
454 HTMLDocument
*This
= impl_from_IOleObject(iface
);
456 TRACE("(%p)->(%08x)\n", This
, dwSaveOption
);
458 if(dwSaveOption
== OLECLOSE_PROMPTSAVE
)
459 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
461 if(This
->doc_obj
->in_place_active
)
462 IOleInPlaceObjectWindowless_InPlaceDeactivate(&This
->IOleInPlaceObjectWindowless_iface
);
464 HTMLDocument_LockContainer(This
->doc_obj
, FALSE
);
466 if(This
->advise_holder
)
467 IOleAdviseHolder_SendOnClose(This
->advise_holder
);
472 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD dwWhichMoniker
, IMoniker
*pmk
)
474 HTMLDocument
*This
= impl_from_IOleObject(iface
);
475 FIXME("(%p %d %p)->()\n", This
, dwWhichMoniker
, pmk
);
479 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD dwAssign
, DWORD dwWhichMoniker
, IMoniker
**ppmk
)
481 HTMLDocument
*This
= impl_from_IOleObject(iface
);
482 FIXME("(%p)->(%d %d %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
486 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, IDataObject
*pDataObject
, BOOL fCreation
,
489 HTMLDocument
*This
= impl_from_IOleObject(iface
);
490 FIXME("(%p)->(%p %x %d)\n", This
, pDataObject
, fCreation
, dwReserved
);
494 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD dwReserved
, IDataObject
**ppDataObject
)
496 HTMLDocument
*This
= impl_from_IOleObject(iface
);
497 FIXME("(%p)->(%d %p)\n", This
, dwReserved
, ppDataObject
);
501 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG iVerb
, LPMSG lpmsg
, IOleClientSite
*pActiveSite
,
502 LONG lindex
, HWND hwndParent
, LPCRECT lprcPosRect
)
504 HTMLDocument
*This
= impl_from_IOleObject(iface
);
505 IOleDocumentSite
*pDocSite
;
508 TRACE("(%p)->(%d %p %p %d %p %p)\n", This
, iVerb
, lpmsg
, pActiveSite
, lindex
, hwndParent
, lprcPosRect
);
510 if(iVerb
!= OLEIVERB_SHOW
&& iVerb
!= OLEIVERB_UIACTIVATE
&& iVerb
!= OLEIVERB_INPLACEACTIVATE
) {
511 FIXME("iVerb = %d not supported\n", iVerb
);
516 pActiveSite
= This
->doc_obj
->client
;
518 hres
= IOleClientSite_QueryInterface(pActiveSite
, &IID_IOleDocumentSite
, (void**)&pDocSite
);
519 if(SUCCEEDED(hres
)) {
520 HTMLDocument_LockContainer(This
->doc_obj
, TRUE
);
522 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
523 hres
= IOleDocumentSite_ActivateMe(pDocSite
, &This
->IOleDocumentView_iface
);
524 IOleDocumentSite_Release(pDocSite
);
526 hres
= IOleDocumentView_UIActivate(&This
->IOleDocumentView_iface
, TRUE
);
527 if(SUCCEEDED(hres
)) {
529 RECT rect
; /* We need to pass rect as not const pointer */
531 IOleDocumentView_SetRect(&This
->IOleDocumentView_iface
, &rect
);
533 IOleDocumentView_Show(&This
->IOleDocumentView_iface
, TRUE
);
540 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**ppEnumOleVerb
)
542 HTMLDocument
*This
= impl_from_IOleObject(iface
);
543 FIXME("(%p)->(%p)\n", This
, ppEnumOleVerb
);
547 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
549 HTMLDocument
*This
= impl_from_IOleObject(iface
);
550 FIXME("(%p)\n", This
);
554 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
556 HTMLDocument
*This
= impl_from_IOleObject(iface
);
557 FIXME("(%p)\n", This
);
561 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
*pClsid
)
563 HTMLDocument
*This
= impl_from_IOleObject(iface
);
565 TRACE("(%p)->(%p)\n", This
, pClsid
);
570 *pClsid
= CLSID_HTMLDocument
;
574 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD dwFormOfType
, LPOLESTR
*pszUserType
)
576 HTMLDocument
*This
= impl_from_IOleObject(iface
);
577 FIXME("(%p)->(%d %p)\n", This
, dwFormOfType
, pszUserType
);
581 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
583 HTMLDocument
*This
= impl_from_IOleObject(iface
);
584 FIXME("(%p)->(%d %p)\n", This
, dwDrawAspect
, psizel
);
588 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
590 HTMLDocument
*This
= impl_from_IOleObject(iface
);
591 FIXME("(%p)->(%d %p)\n", This
, dwDrawAspect
, psizel
);
595 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*pAdvSink
, DWORD
*pdwConnection
)
597 HTMLDocument
*This
= impl_from_IOleObject(iface
);
598 TRACE("(%p)->(%p %p)\n", This
, pAdvSink
, pdwConnection
);
608 if(!This
->advise_holder
) {
609 CreateOleAdviseHolder(&This
->advise_holder
);
610 if(!This
->advise_holder
)
611 return E_OUTOFMEMORY
;
614 return IOleAdviseHolder_Advise(This
->advise_holder
, pAdvSink
, pdwConnection
);
617 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD dwConnection
)
619 HTMLDocument
*This
= impl_from_IOleObject(iface
);
620 TRACE("(%p)->(%d)\n", This
, dwConnection
);
622 if(!This
->advise_holder
)
623 return OLE_E_NOCONNECTION
;
625 return IOleAdviseHolder_Unadvise(This
->advise_holder
, dwConnection
);
628 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**ppenumAdvise
)
630 HTMLDocument
*This
= impl_from_IOleObject(iface
);
632 if(!This
->advise_holder
) {
633 *ppenumAdvise
= NULL
;
637 return IOleAdviseHolder_EnumAdvise(This
->advise_holder
, ppenumAdvise
);
640 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD dwAspect
, DWORD
*pdwStatus
)
642 HTMLDocument
*This
= impl_from_IOleObject(iface
);
643 FIXME("(%p)->(%d %p)\n", This
, dwAspect
, pdwStatus
);
647 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
*pLogpal
)
649 HTMLDocument
*This
= impl_from_IOleObject(iface
);
650 FIXME("(%p)->(%p)\n", This
, pLogpal
);
654 static const IOleObjectVtbl OleObjectVtbl
= {
655 OleObject_QueryInterface
,
658 OleObject_SetClientSite
,
659 OleObject_GetClientSite
,
660 OleObject_SetHostNames
,
662 OleObject_SetMoniker
,
663 OleObject_GetMoniker
,
664 OleObject_InitFromData
,
665 OleObject_GetClipboardData
,
669 OleObject_IsUpToDate
,
670 OleObject_GetUserClassID
,
671 OleObject_GetUserType
,
676 OleObject_EnumAdvise
,
677 OleObject_GetMiscStatus
,
678 OleObject_SetColorScheme
681 /**********************************************************
682 * IOleDocument implementation
685 static inline HTMLDocument
*impl_from_IOleDocument(IOleDocument
*iface
)
687 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleDocument_iface
);
690 static HRESULT WINAPI
OleDocument_QueryInterface(IOleDocument
*iface
, REFIID riid
, void **ppv
)
692 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
693 return htmldoc_query_interface(This
, riid
, ppv
);
696 static ULONG WINAPI
OleDocument_AddRef(IOleDocument
*iface
)
698 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
699 return htmldoc_addref(This
);
702 static ULONG WINAPI
OleDocument_Release(IOleDocument
*iface
)
704 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
705 return htmldoc_release(This
);
708 static HRESULT WINAPI
OleDocument_CreateView(IOleDocument
*iface
, IOleInPlaceSite
*pIPSite
, IStream
*pstm
,
709 DWORD dwReserved
, IOleDocumentView
**ppView
)
711 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
714 TRACE("(%p)->(%p %p %d %p)\n", This
, pIPSite
, pstm
, dwReserved
, ppView
);
720 * Windows implementation creates new IOleDocumentView when function is called for the
721 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
722 * if the application uses returned interfaces, passed to ActivateMe or returned by
723 * QueryInterface, so there is no reason to create new interface. This needs more testing.
727 hres
= IOleDocumentView_SetInPlaceSite(&This
->IOleDocumentView_iface
, pIPSite
);
733 FIXME("pstm is not supported\n");
735 IOleDocumentView_AddRef(&This
->IOleDocumentView_iface
);
736 *ppView
= &This
->IOleDocumentView_iface
;
740 static HRESULT WINAPI
OleDocument_GetDocMiscStatus(IOleDocument
*iface
, DWORD
*pdwStatus
)
742 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
743 FIXME("(%p)->(%p)\n", This
, pdwStatus
);
747 static HRESULT WINAPI
OleDocument_EnumViews(IOleDocument
*iface
, IEnumOleDocumentViews
**ppEnum
,
748 IOleDocumentView
**ppView
)
750 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
751 FIXME("(%p)->(%p %p)\n", This
, ppEnum
, ppView
);
755 static const IOleDocumentVtbl OleDocumentVtbl
= {
756 OleDocument_QueryInterface
,
759 OleDocument_CreateView
,
760 OleDocument_GetDocMiscStatus
,
761 OleDocument_EnumViews
764 /**********************************************************
765 * IOleControl implementation
768 static inline HTMLDocument
*impl_from_IOleControl(IOleControl
*iface
)
770 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleControl_iface
);
773 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
, REFIID riid
, void **ppv
)
775 HTMLDocument
*This
= impl_from_IOleControl(iface
);
776 return htmldoc_query_interface(This
, riid
, ppv
);
779 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
781 HTMLDocument
*This
= impl_from_IOleControl(iface
);
782 return htmldoc_addref(This
);
785 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
787 HTMLDocument
*This
= impl_from_IOleControl(iface
);
788 return htmldoc_release(This
);
791 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, CONTROLINFO
*pCI
)
793 HTMLDocument
*This
= impl_from_IOleControl(iface
);
794 FIXME("(%p)->(%p)\n", This
, pCI
);
798 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, MSG
*pMsg
)
800 HTMLDocument
*This
= impl_from_IOleControl(iface
);
801 FIXME("(%p)->(%p)\n", This
, pMsg
);
805 HRESULT
get_client_disp_property(IOleClientSite
*client
, DISPID dispid
, VARIANT
*res
)
807 IDispatch
*disp
= NULL
;
808 DISPPARAMS dispparams
= {NULL
, 0};
812 hres
= IOleClientSite_QueryInterface(client
, &IID_IDispatch
, (void**)&disp
);
814 TRACE("Could not get IDispatch\n");
820 hres
= IDispatch_Invoke(disp
, dispid
, &IID_NULL
, LOCALE_SYSTEM_DEFAULT
,
821 DISPATCH_PROPERTYGET
, &dispparams
, res
, NULL
, &err
);
823 IDispatch_Release(disp
);
828 static HRESULT
on_change_dlcontrol(HTMLDocument
*This
)
833 hres
= get_client_disp_property(This
->doc_obj
->client
, DISPID_AMBIENT_DLCONTROL
, &res
);
835 FIXME("unsupported dlcontrol %08x\n", V_I4(&res
));
840 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispID
)
842 HTMLDocument
*This
= impl_from_IOleControl(iface
);
843 IOleClientSite
*client
;
847 client
= This
->doc_obj
->client
;
849 TRACE("client = NULL\n");
854 case DISPID_AMBIENT_USERMODE
:
855 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This
);
856 hres
= get_client_disp_property(client
, DISPID_AMBIENT_USERMODE
, &res
);
860 if(V_VT(&res
) == VT_BOOL
) {
862 This
->doc_obj
->usermode
= BROWSEMODE
;
864 FIXME("edit mode is not supported\n");
865 This
->doc_obj
->usermode
= EDITMODE
;
868 FIXME("usermode=%s\n", debugstr_variant(&res
));
871 case DISPID_AMBIENT_DLCONTROL
:
872 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This
);
873 return on_change_dlcontrol(This
);
874 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
875 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This
);
876 on_change_dlcontrol(This
);
877 hres
= get_client_disp_property(client
, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
, &res
);
881 if(V_VT(&res
) == VT_BOOL
) {
883 FIXME("offline connection is not supported\n");
887 FIXME("offlineconnected=%s\n", debugstr_variant(&res
));
890 case DISPID_AMBIENT_SILENT
:
891 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This
);
892 on_change_dlcontrol(This
);
893 hres
= get_client_disp_property(client
, DISPID_AMBIENT_SILENT
, &res
);
897 if(V_VT(&res
) == VT_BOOL
) {
899 FIXME("silent mode is not supported\n");
903 FIXME("silent=%s\n", debugstr_variant(&res
));
906 case DISPID_AMBIENT_USERAGENT
:
907 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This
);
908 hres
= get_client_disp_property(client
, DISPID_AMBIENT_USERAGENT
, &res
);
912 FIXME("not supported AMBIENT_USERAGENT\n");
915 case DISPID_AMBIENT_PALETTE
:
916 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This
);
917 hres
= get_client_disp_property(client
, DISPID_AMBIENT_PALETTE
, &res
);
921 FIXME("not supported AMBIENT_PALETTE\n");
926 FIXME("(%p) unsupported dispID=%d\n", This
, dispID
);
930 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL bFreeze
)
932 HTMLDocument
*This
= impl_from_IOleControl(iface
);
933 FIXME("(%p)->(%x)\n", This
, bFreeze
);
937 static const IOleControlVtbl OleControlVtbl
= {
938 OleControl_QueryInterface
,
941 OleControl_GetControlInfo
,
942 OleControl_OnMnemonic
,
943 OleControl_OnAmbientPropertyChange
,
944 OleControl_FreezeEvents
947 /**********************************************************
948 * IObjectWithSite implementation
951 static inline HTMLDocument
*impl_from_IObjectWithSite(IObjectWithSite
*iface
)
953 return CONTAINING_RECORD(iface
, HTMLDocument
, IObjectWithSite_iface
);
956 static HRESULT WINAPI
ObjectWithSite_QueryInterface(IObjectWithSite
*iface
, REFIID riid
, void **ppv
)
958 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
959 return htmldoc_query_interface(This
, riid
, ppv
);
962 static ULONG WINAPI
ObjectWithSite_AddRef(IObjectWithSite
*iface
)
964 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
965 return htmldoc_addref(This
);
968 static ULONG WINAPI
ObjectWithSite_Release(IObjectWithSite
*iface
)
970 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
971 return htmldoc_release(This
);
974 static HRESULT WINAPI
ObjectWithSite_SetSite(IObjectWithSite
*iface
, IUnknown
*pUnkSite
)
976 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
977 FIXME("(%p)->(%p)\n", This
, pUnkSite
);
981 static HRESULT WINAPI
ObjectWithSite_GetSite(IObjectWithSite
* iface
, REFIID riid
, PVOID
*ppvSite
)
983 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
984 FIXME("(%p)->(%p)\n", This
, ppvSite
);
988 static const IObjectWithSiteVtbl ObjectWithSiteVtbl
= {
989 ObjectWithSite_QueryInterface
,
990 ObjectWithSite_AddRef
,
991 ObjectWithSite_Release
,
992 ObjectWithSite_SetSite
,
993 ObjectWithSite_GetSite
996 /**********************************************************
997 * IOleContainer implementation
1000 static inline HTMLDocument
*impl_from_IOleContainer(IOleContainer
*iface
)
1002 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleContainer_iface
);
1005 static HRESULT WINAPI
OleContainer_QueryInterface(IOleContainer
*iface
, REFIID riid
, void **ppv
)
1007 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1008 return htmldoc_query_interface(This
, riid
, ppv
);
1011 static ULONG WINAPI
OleContainer_AddRef(IOleContainer
*iface
)
1013 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1014 return htmldoc_addref(This
);
1017 static ULONG WINAPI
OleContainer_Release(IOleContainer
*iface
)
1019 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1020 return htmldoc_release(This
);
1023 static HRESULT WINAPI
OleContainer_ParseDisplayName(IOleContainer
*iface
, IBindCtx
*pbc
, LPOLESTR pszDisplayName
,
1024 ULONG
*pchEaten
, IMoniker
**ppmkOut
)
1026 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1027 FIXME("(%p)->(%p %s %p %p)\n", This
, pbc
, debugstr_w(pszDisplayName
), pchEaten
, ppmkOut
);
1031 static HRESULT WINAPI
OleContainer_EnumObjects(IOleContainer
*iface
, DWORD grfFlags
, IEnumUnknown
**ppenum
)
1033 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1036 TRACE("(%p)->(%x %p)\n", This
, grfFlags
, ppenum
);
1038 ret
= heap_alloc(sizeof(*ret
));
1040 return E_OUTOFMEMORY
;
1042 ret
->IEnumUnknown_iface
.lpVtbl
= &EnumUnknownVtbl
;
1045 *ppenum
= &ret
->IEnumUnknown_iface
;
1049 static HRESULT WINAPI
OleContainer_LockContainer(IOleContainer
*iface
, BOOL fLock
)
1051 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1052 FIXME("(%p)->(%x)\n", This
, fLock
);
1056 static const IOleContainerVtbl OleContainerVtbl
= {
1057 OleContainer_QueryInterface
,
1058 OleContainer_AddRef
,
1059 OleContainer_Release
,
1060 OleContainer_ParseDisplayName
,
1061 OleContainer_EnumObjects
,
1062 OleContainer_LockContainer
1065 static inline HTMLDocumentObj
*impl_from_ITargetContainer(ITargetContainer
*iface
)
1067 return CONTAINING_RECORD(iface
, HTMLDocumentObj
, ITargetContainer_iface
);
1070 static HRESULT WINAPI
TargetContainer_QueryInterface(ITargetContainer
*iface
, REFIID riid
, void **ppv
)
1072 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1073 return ICustomDoc_QueryInterface(&This
->ICustomDoc_iface
, riid
, ppv
);
1076 static ULONG WINAPI
TargetContainer_AddRef(ITargetContainer
*iface
)
1078 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1079 return ICustomDoc_AddRef(&This
->ICustomDoc_iface
);
1082 static ULONG WINAPI
TargetContainer_Release(ITargetContainer
*iface
)
1084 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1085 return ICustomDoc_Release(&This
->ICustomDoc_iface
);
1088 static HRESULT WINAPI
TargetContainer_GetFrameUrl(ITargetContainer
*iface
, LPWSTR
*ppszFrameSrc
)
1090 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1091 FIXME("(%p)->(%p)\n", This
, ppszFrameSrc
);
1095 static HRESULT WINAPI
TargetContainer_GetFramesContainer(ITargetContainer
*iface
, IOleContainer
**ppContainer
)
1097 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1099 TRACE("(%p)->(%p)\n", This
, ppContainer
);
1101 /* NOTE: we should return wrapped interface here */
1102 IOleContainer_AddRef(&This
->basedoc
.IOleContainer_iface
);
1103 *ppContainer
= &This
->basedoc
.IOleContainer_iface
;
1107 static const ITargetContainerVtbl TargetContainerVtbl
= {
1108 TargetContainer_QueryInterface
,
1109 TargetContainer_AddRef
,
1110 TargetContainer_Release
,
1111 TargetContainer_GetFrameUrl
,
1112 TargetContainer_GetFramesContainer
1115 void TargetContainer_Init(HTMLDocumentObj
*This
)
1117 This
->ITargetContainer_iface
.lpVtbl
= &TargetContainerVtbl
;
1120 /**********************************************************
1121 * IObjectSafety implementation
1124 static inline HTMLDocument
*impl_from_IObjectSafety(IObjectSafety
*iface
)
1126 return CONTAINING_RECORD(iface
, HTMLDocument
, IObjectSafety_iface
);
1129 static HRESULT WINAPI
ObjectSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
1131 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1132 return htmldoc_query_interface(This
, riid
, ppv
);
1135 static ULONG WINAPI
ObjectSafety_AddRef(IObjectSafety
*iface
)
1137 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1138 return htmldoc_addref(This
);
1141 static ULONG WINAPI
ObjectSafety_Release(IObjectSafety
*iface
)
1143 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1144 return htmldoc_release(This
);
1147 static HRESULT WINAPI
ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
,
1148 REFIID riid
, DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
1150 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1151 FIXME("(%p)->(%s %p %p)\n", This
, debugstr_guid(riid
), pdwSupportedOptions
, pdwEnabledOptions
);
1155 static HRESULT WINAPI
ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
,
1156 REFIID riid
, DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
1158 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1159 FIXME("(%p)->(%s %x %x)\n", This
, debugstr_guid(riid
), dwOptionSetMask
, dwEnabledOptions
);
1161 if(IsEqualGUID(&IID_IPersistMoniker
, riid
) &&
1162 dwOptionSetMask
==INTERFACESAFE_FOR_UNTRUSTED_DATA
&&
1163 dwEnabledOptions
==INTERFACESAFE_FOR_UNTRUSTED_DATA
)
1169 static const IObjectSafetyVtbl ObjectSafetyVtbl
= {
1170 ObjectSafety_QueryInterface
,
1171 ObjectSafety_AddRef
,
1172 ObjectSafety_Release
,
1173 ObjectSafety_GetInterfaceSafetyOptions
,
1174 ObjectSafety_SetInterfaceSafetyOptions
1177 void HTMLDocument_LockContainer(HTMLDocumentObj
*This
, BOOL fLock
)
1179 IOleContainer
*container
;
1182 if(!This
->client
|| This
->container_locked
== fLock
)
1185 hres
= IOleClientSite_GetContainer(This
->client
, &container
);
1186 if(SUCCEEDED(hres
)) {
1187 IOleContainer_LockContainer(container
, fLock
);
1188 This
->container_locked
= fLock
;
1189 IOleContainer_Release(container
);
1193 void HTMLDocument_OleObj_Init(HTMLDocument
*This
)
1195 This
->IOleObject_iface
.lpVtbl
= &OleObjectVtbl
;
1196 This
->IOleDocument_iface
.lpVtbl
= &OleDocumentVtbl
;
1197 This
->IOleControl_iface
.lpVtbl
= &OleControlVtbl
;
1198 This
->IObjectWithSite_iface
.lpVtbl
= &ObjectWithSiteVtbl
;
1199 This
->IOleContainer_iface
.lpVtbl
= &OleContainerVtbl
;
1200 This
->IObjectSafety_iface
.lpVtbl
= &ObjectSafetyVtbl
;