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
32 #include "shdeprecated.h"
36 #include "wine/debug.h"
38 #include "mshtml_private.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
42 #define DOCHOST_DOCCANNAVIGATE 0
45 IEnumUnknown IEnumUnknown_iface
;
49 static inline EnumUnknown
*impl_from_IEnumUnknown(IEnumUnknown
*iface
)
51 return CONTAINING_RECORD(iface
, EnumUnknown
, IEnumUnknown_iface
);
54 static HRESULT WINAPI
EnumUnknown_QueryInterface(IEnumUnknown
*iface
, REFIID riid
, void **ppv
)
56 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
58 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
59 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
60 *ppv
= &This
->IEnumUnknown_iface
;
61 }else if(IsEqualGUID(&IID_IEnumUnknown
, riid
)) {
62 TRACE("(%p)->(IID_IEnumUnknown %p)\n", This
, ppv
);
63 *ppv
= &This
->IEnumUnknown_iface
;
65 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
70 IUnknown_AddRef((IUnknown
*)*ppv
);
74 static ULONG WINAPI
EnumUnknown_AddRef(IEnumUnknown
*iface
)
76 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
77 LONG ref
= InterlockedIncrement(&This
->ref
);
79 TRACE("(%p) ref=%d\n", This
, ref
);
84 static ULONG WINAPI
EnumUnknown_Release(IEnumUnknown
*iface
)
86 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
87 LONG ref
= InterlockedDecrement(&This
->ref
);
89 TRACE("(%p) ref=%d\n", This
, ref
);
97 static HRESULT WINAPI
EnumUnknown_Next(IEnumUnknown
*iface
, ULONG celt
, IUnknown
**rgelt
, ULONG
*pceltFetched
)
99 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
101 TRACE("(%p)->(%u %p %p)\n", This
, celt
, rgelt
, pceltFetched
);
103 /* FIXME: It's not clear if we should ever return something here */
109 static HRESULT WINAPI
EnumUnknown_Skip(IEnumUnknown
*iface
, ULONG celt
)
111 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
112 FIXME("(%p)->(%u)\n", This
, celt
);
116 static HRESULT WINAPI
EnumUnknown_Reset(IEnumUnknown
*iface
)
118 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
119 FIXME("(%p)\n", This
);
123 static HRESULT WINAPI
EnumUnknown_Clone(IEnumUnknown
*iface
, IEnumUnknown
**ppenum
)
125 EnumUnknown
*This
= impl_from_IEnumUnknown(iface
);
126 FIXME("(%p)->(%p)\n", This
, ppenum
);
130 static const IEnumUnknownVtbl EnumUnknownVtbl
= {
131 EnumUnknown_QueryInterface
,
140 /**********************************************************
141 * IOleObject implementation
144 static inline HTMLDocument
*impl_from_IOleObject(IOleObject
*iface
)
146 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleObject_iface
);
149 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **ppv
)
151 HTMLDocument
*This
= impl_from_IOleObject(iface
);
152 return htmldoc_query_interface(This
, riid
, ppv
);
155 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
157 HTMLDocument
*This
= impl_from_IOleObject(iface
);
158 return htmldoc_addref(This
);
161 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
163 HTMLDocument
*This
= impl_from_IOleObject(iface
);
164 return htmldoc_release(This
);
167 static void update_hostinfo(HTMLDocumentObj
*This
, DOCHOSTUIINFO
*hostinfo
)
169 nsIScrollable
*scrollable
;
172 if(!This
->nscontainer
)
175 nsres
= nsIWebBrowser_QueryInterface(This
->nscontainer
->webbrowser
, &IID_nsIScrollable
, (void**)&scrollable
);
176 if(NS_SUCCEEDED(nsres
)) {
177 nsres
= nsIScrollable_SetDefaultScrollbarPreferences(scrollable
, ScrollOrientation_Y
,
178 (hostinfo
->dwFlags
& DOCHOSTUIFLAG_SCROLL_NO
) ? Scrollbar_Never
: Scrollbar_Always
);
180 ERR("Could not set default Y scrollbar prefs: %08x\n", nsres
);
182 nsres
= nsIScrollable_SetDefaultScrollbarPreferences(scrollable
, ScrollOrientation_X
,
183 hostinfo
->dwFlags
& DOCHOSTUIFLAG_SCROLL_NO
? Scrollbar_Never
: Scrollbar_Auto
);
185 ERR("Could not set default X scrollbar prefs: %08x\n", nsres
);
187 nsIScrollable_Release(scrollable
);
189 ERR("Could not get nsIScrollable: %08x\n", nsres
);
193 /* Calls undocumented 84 cmd of CGID_ShellDocView */
194 void call_docview_84(HTMLDocumentObj
*doc
)
196 IOleCommandTarget
*olecmd
;
203 hres
= IOleClientSite_QueryInterface(doc
->client
, &IID_IOleCommandTarget
, (void**)&olecmd
);
208 hres
= IOleCommandTarget_Exec(olecmd
, &CGID_ShellDocView
, 84, 0, NULL
, &var
);
209 IOleCommandTarget_Release(olecmd
);
210 if(SUCCEEDED(hres
) && V_VT(&var
) != VT_NULL
)
211 FIXME("handle result\n");
214 void set_document_navigation(HTMLDocumentObj
*doc
, BOOL doc_can_navigate
)
218 if(!doc
->client_cmdtrg
)
221 if(doc_can_navigate
) {
222 V_VT(&var
) = VT_UNKNOWN
;
223 V_UNKNOWN(&var
) = (IUnknown
*)&doc
->basedoc
.window
->base
.IHTMLWindow2_iface
;
226 IOleCommandTarget_Exec(doc
->client_cmdtrg
, &CGID_DocHostCmdPriv
, DOCHOST_DOCCANNAVIGATE
, 0,
227 doc_can_navigate
? &var
: NULL
, NULL
);
230 static void load_settings(HTMLDocumentObj
*doc
)
232 nsIMarkupDocumentViewer
*markup_document_viewer
;
233 nsIContentViewer
*content_viewer
;
234 nsIDocShell
*doc_shell
;
240 static const WCHAR ie_keyW
[] = {
241 'S','O','F','T','W','A','R','E','\\',
242 'M','i','c','r','o','s','o','f','t','\\',
243 'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',0};
244 static const WCHAR zoomW
[] = {'Z','o','o','m',0};
245 static const WCHAR zoom_factorW
[] = {'Z','o','o','m','F','a','c','t','o','r',0};
247 res
= RegOpenKeyW(HKEY_CURRENT_USER
, ie_keyW
, &settings_key
);
248 if(res
!= ERROR_SUCCESS
)
252 res
= RegGetValueW(settings_key
, zoomW
, zoom_factorW
, RRF_RT_REG_DWORD
, NULL
, &val
, &size
);
253 RegCloseKey(settings_key
);
254 if(res
!= ERROR_SUCCESS
)
257 TRACE("Setting ZoomFactor to %u\n", val
);
259 nsres
= get_nsinterface((nsISupports
*)doc
->nscontainer
->navigation
, &IID_nsIDocShell
, (void**)&doc_shell
);
260 assert(nsres
== NS_OK
);
262 nsres
= nsIDocShell_GetContentViewer(doc_shell
, &content_viewer
);
263 assert(nsres
== NS_OK
&& content_viewer
);
265 nsres
= nsISupports_QueryInterface(content_viewer
, &IID_nsIMarkupDocumentViewer
, (void**)&markup_document_viewer
);
266 nsISupports_Release(content_viewer
);
267 assert(nsres
== NS_OK
);
269 nsres
= nsIMarkupDocumentViewer_SetFullZoom(markup_document_viewer
, (float)val
/100000);
271 ERR("SetFullZoom failed: %08x\n", nsres
);
273 nsIDocShell_Release(doc_shell
);
276 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, IOleClientSite
*pClientSite
)
278 HTMLDocument
*This
= impl_from_IOleObject(iface
);
279 IOleCommandTarget
*cmdtrg
= NULL
;
280 IOleWindow
*ole_window
;
281 IBrowserService
*browser_service
;
287 TRACE("(%p)->(%p)\n", This
, pClientSite
);
289 if(pClientSite
== This
->doc_obj
->client
)
292 if(This
->doc_obj
->client
) {
293 IOleClientSite_Release(This
->doc_obj
->client
);
294 This
->doc_obj
->client
= NULL
;
295 This
->doc_obj
->usermode
= UNKNOWN_USERMODE
;
298 if(This
->doc_obj
->client_cmdtrg
) {
299 IOleCommandTarget_Release(This
->doc_obj
->client_cmdtrg
);
300 This
->doc_obj
->client_cmdtrg
= NULL
;
303 if(This
->doc_obj
->hostui
&& !This
->doc_obj
->custom_hostui
) {
304 IDocHostUIHandler_Release(This
->doc_obj
->hostui
);
305 This
->doc_obj
->hostui
= NULL
;
308 if(This
->doc_obj
->doc_object_service
) {
309 IDocObjectService_Release(This
->doc_obj
->doc_object_service
);
310 This
->doc_obj
->doc_object_service
= NULL
;
313 if(This
->doc_obj
->webbrowser
) {
314 IUnknown_Release(This
->doc_obj
->webbrowser
);
315 This
->doc_obj
->webbrowser
= NULL
;
318 if(This
->doc_obj
->browser_service
) {
319 IUnknown_Release(This
->doc_obj
->browser_service
);
320 This
->doc_obj
->browser_service
= NULL
;
323 if(This
->doc_obj
->travel_log
) {
324 ITravelLog_Release(This
->doc_obj
->travel_log
);
325 This
->doc_obj
->travel_log
= NULL
;
328 memset(&This
->doc_obj
->hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
333 IOleClientSite_AddRef(pClientSite
);
334 This
->doc_obj
->client
= pClientSite
;
336 hostui_setup
= This
->doc_obj
->hostui_setup
;
338 if(!This
->doc_obj
->hostui
) {
339 IDocHostUIHandler
*uihandler
;
341 This
->doc_obj
->custom_hostui
= FALSE
;
343 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IDocHostUIHandler
, (void**)&uihandler
);
345 This
->doc_obj
->hostui
= uihandler
;
348 if(This
->doc_obj
->hostui
) {
349 DOCHOSTUIINFO hostinfo
;
350 LPOLESTR key_path
= NULL
, override_key_path
= NULL
;
351 IDocHostUIHandler2
*uihandler2
;
353 memset(&hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
354 hostinfo
.cbSize
= sizeof(DOCHOSTUIINFO
);
355 hres
= IDocHostUIHandler_GetHostInfo(This
->doc_obj
->hostui
, &hostinfo
);
356 if(SUCCEEDED(hres
)) {
357 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
358 hostinfo
.cbSize
, hostinfo
.dwFlags
, hostinfo
.dwDoubleClick
,
359 debugstr_w(hostinfo
.pchHostCss
), debugstr_w(hostinfo
.pchHostNS
));
360 update_hostinfo(This
->doc_obj
, &hostinfo
);
361 This
->doc_obj
->hostinfo
= hostinfo
;
365 hres
= IDocHostUIHandler_GetOptionKeyPath(This
->doc_obj
->hostui
, &key_path
, 0);
366 if(hres
== S_OK
&& key_path
) {
368 /* FIXME: use key_path */
369 FIXME("key_path = %s\n", debugstr_w(key_path
));
371 CoTaskMemFree(key_path
);
374 hres
= IDocHostUIHandler_QueryInterface(This
->doc_obj
->hostui
, &IID_IDocHostUIHandler2
,
375 (void**)&uihandler2
);
376 if(SUCCEEDED(hres
)) {
377 hres
= IDocHostUIHandler2_GetOverrideKeyPath(uihandler2
, &override_key_path
, 0);
378 if(hres
== S_OK
&& override_key_path
) {
379 if(override_key_path
[0]) {
380 /*FIXME: use override_key_path */
381 FIXME("override_key_path = %s\n", debugstr_w(override_key_path
));
383 CoTaskMemFree(override_key_path
);
385 IDocHostUIHandler2_Release(uihandler2
);
388 This
->doc_obj
->hostui_setup
= TRUE
;
392 load_settings(This
->doc_obj
);
394 /* Native calls here GetWindow. What is it for?
395 * We don't have anything to do with it here (yet). */
396 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IOleWindow
, (void**)&ole_window
);
397 if(SUCCEEDED(hres
)) {
398 IOleWindow_GetWindow(ole_window
, &hwnd
);
399 IOleWindow_Release(ole_window
);
402 hres
= do_query_service((IUnknown
*)pClientSite
, &IID_IShellBrowser
,
403 &IID_IBrowserService
, (void**)&browser_service
);
404 if(SUCCEEDED(hres
)) {
405 ITravelLog
*travel_log
;
407 This
->doc_obj
->browser_service
= (IUnknown
*)browser_service
;
409 hres
= IBrowserService_GetTravelLog(browser_service
, &travel_log
);
411 This
->doc_obj
->travel_log
= travel_log
;
413 browser_service
= NULL
;
416 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IOleCommandTarget
, (void**)&cmdtrg
);
417 if(SUCCEEDED(hres
)) {
419 OLECMD cmd
= {OLECMDID_SETPROGRESSTEXT
, 0};
421 This
->doc_obj
->client_cmdtrg
= cmdtrg
;
424 IDocObjectService
*doc_object_service
;
427 set_document_navigation(This
->doc_obj
, TRUE
);
429 if(browser_service
) {
430 hres
= IBrowserService_QueryInterface(browser_service
,
431 &IID_IDocObjectService
, (void**)&doc_object_service
);
432 if(SUCCEEDED(hres
)) {
433 This
->doc_obj
->doc_object_service
= doc_object_service
;
436 * Some embedding routines, esp. in regards to use of IDocObjectService, differ if
437 * embedder supports IWebBrowserApp.
439 hres
= do_query_service((IUnknown
*)pClientSite
, &IID_IWebBrowserApp
, &IID_IWebBrowser2
, (void**)&wb
);
441 This
->doc_obj
->webbrowser
= (IUnknown
*)wb
;
446 call_docview_84(This
->doc_obj
);
448 IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &cmd
, NULL
);
452 IOleCommandTarget_Exec(cmdtrg
, NULL
, OLECMDID_SETPROGRESSMAX
,
453 OLECMDEXECOPT_DONTPROMPTUSER
, &var
, NULL
);
454 IOleCommandTarget_Exec(cmdtrg
, NULL
, OLECMDID_SETPROGRESSPOS
,
455 OLECMDEXECOPT_DONTPROMPTUSER
, &var
, NULL
);
458 if(This
->doc_obj
->usermode
== UNKNOWN_USERMODE
)
459 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
, DISPID_AMBIENT_USERMODE
);
461 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
,
462 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
);
464 hres
= get_client_disp_property(This
->doc_obj
->client
, DISPID_AMBIENT_SILENT
, &silent
);
465 if(SUCCEEDED(hres
)) {
466 if(V_VT(&silent
) != VT_BOOL
)
467 WARN("silent = %s\n", debugstr_variant(&silent
));
468 else if(V_BOOL(&silent
))
469 FIXME("silent == true\n");
472 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
, DISPID_AMBIENT_USERAGENT
);
473 IOleControl_OnAmbientPropertyChange(&This
->IOleControl_iface
, DISPID_AMBIENT_PALETTE
);
478 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, IOleClientSite
**ppClientSite
)
480 HTMLDocument
*This
= impl_from_IOleObject(iface
);
482 TRACE("(%p)->(%p)\n", This
, ppClientSite
);
487 if(This
->doc_obj
->client
)
488 IOleClientSite_AddRef(This
->doc_obj
->client
);
489 *ppClientSite
= This
->doc_obj
->client
;
494 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR szContainerApp
, LPCOLESTR szContainerObj
)
496 HTMLDocument
*This
= impl_from_IOleObject(iface
);
497 FIXME("(%p)->(%s %s)\n", This
, debugstr_w(szContainerApp
), debugstr_w(szContainerObj
));
501 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD dwSaveOption
)
503 HTMLDocument
*This
= impl_from_IOleObject(iface
);
505 TRACE("(%p)->(%08x)\n", This
, dwSaveOption
);
507 if(dwSaveOption
== OLECLOSE_PROMPTSAVE
)
508 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
510 if(This
->doc_obj
->in_place_active
)
511 IOleInPlaceObjectWindowless_InPlaceDeactivate(&This
->IOleInPlaceObjectWindowless_iface
);
513 HTMLDocument_LockContainer(This
->doc_obj
, FALSE
);
515 if(This
->advise_holder
)
516 IOleAdviseHolder_SendOnClose(This
->advise_holder
);
521 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD dwWhichMoniker
, IMoniker
*pmk
)
523 HTMLDocument
*This
= impl_from_IOleObject(iface
);
524 FIXME("(%p %d %p)->()\n", This
, dwWhichMoniker
, pmk
);
528 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD dwAssign
, DWORD dwWhichMoniker
, IMoniker
**ppmk
)
530 HTMLDocument
*This
= impl_from_IOleObject(iface
);
531 FIXME("(%p)->(%d %d %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
535 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, IDataObject
*pDataObject
, BOOL fCreation
,
538 HTMLDocument
*This
= impl_from_IOleObject(iface
);
539 FIXME("(%p)->(%p %x %d)\n", This
, pDataObject
, fCreation
, dwReserved
);
543 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD dwReserved
, IDataObject
**ppDataObject
)
545 HTMLDocument
*This
= impl_from_IOleObject(iface
);
546 FIXME("(%p)->(%d %p)\n", This
, dwReserved
, ppDataObject
);
550 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG iVerb
, LPMSG lpmsg
, IOleClientSite
*pActiveSite
,
551 LONG lindex
, HWND hwndParent
, LPCRECT lprcPosRect
)
553 HTMLDocument
*This
= impl_from_IOleObject(iface
);
554 IOleDocumentSite
*pDocSite
;
557 TRACE("(%p)->(%d %p %p %d %p %p)\n", This
, iVerb
, lpmsg
, pActiveSite
, lindex
, hwndParent
, lprcPosRect
);
559 if(iVerb
!= OLEIVERB_SHOW
&& iVerb
!= OLEIVERB_UIACTIVATE
&& iVerb
!= OLEIVERB_INPLACEACTIVATE
) {
560 FIXME("iVerb = %d not supported\n", iVerb
);
565 pActiveSite
= This
->doc_obj
->client
;
567 hres
= IOleClientSite_QueryInterface(pActiveSite
, &IID_IOleDocumentSite
, (void**)&pDocSite
);
568 if(SUCCEEDED(hres
)) {
569 HTMLDocument_LockContainer(This
->doc_obj
, TRUE
);
571 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
572 hres
= IOleDocumentSite_ActivateMe(pDocSite
, &This
->IOleDocumentView_iface
);
573 IOleDocumentSite_Release(pDocSite
);
575 hres
= IOleDocumentView_UIActivate(&This
->IOleDocumentView_iface
, TRUE
);
576 if(SUCCEEDED(hres
)) {
578 RECT rect
; /* We need to pass rect as not const pointer */
580 IOleDocumentView_SetRect(&This
->IOleDocumentView_iface
, &rect
);
582 IOleDocumentView_Show(&This
->IOleDocumentView_iface
, TRUE
);
589 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**ppEnumOleVerb
)
591 HTMLDocument
*This
= impl_from_IOleObject(iface
);
592 FIXME("(%p)->(%p)\n", This
, ppEnumOleVerb
);
596 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
598 HTMLDocument
*This
= impl_from_IOleObject(iface
);
599 FIXME("(%p)\n", This
);
603 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
605 HTMLDocument
*This
= impl_from_IOleObject(iface
);
606 FIXME("(%p)\n", This
);
610 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
*pClsid
)
612 HTMLDocument
*This
= impl_from_IOleObject(iface
);
614 TRACE("(%p)->(%p)\n", This
, pClsid
);
619 *pClsid
= CLSID_HTMLDocument
;
623 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD dwFormOfType
, LPOLESTR
*pszUserType
)
625 HTMLDocument
*This
= impl_from_IOleObject(iface
);
626 FIXME("(%p)->(%d %p)\n", This
, dwFormOfType
, pszUserType
);
630 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
632 HTMLDocument
*This
= impl_from_IOleObject(iface
);
633 FIXME("(%p)->(%d %p)\n", This
, dwDrawAspect
, psizel
);
637 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
639 HTMLDocument
*This
= impl_from_IOleObject(iface
);
640 FIXME("(%p)->(%d %p)\n", This
, dwDrawAspect
, psizel
);
644 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*pAdvSink
, DWORD
*pdwConnection
)
646 HTMLDocument
*This
= impl_from_IOleObject(iface
);
647 TRACE("(%p)->(%p %p)\n", This
, pAdvSink
, pdwConnection
);
657 if(!This
->advise_holder
) {
658 CreateOleAdviseHolder(&This
->advise_holder
);
659 if(!This
->advise_holder
)
660 return E_OUTOFMEMORY
;
663 return IOleAdviseHolder_Advise(This
->advise_holder
, pAdvSink
, pdwConnection
);
666 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD dwConnection
)
668 HTMLDocument
*This
= impl_from_IOleObject(iface
);
669 TRACE("(%p)->(%d)\n", This
, dwConnection
);
671 if(!This
->advise_holder
)
672 return OLE_E_NOCONNECTION
;
674 return IOleAdviseHolder_Unadvise(This
->advise_holder
, dwConnection
);
677 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**ppenumAdvise
)
679 HTMLDocument
*This
= impl_from_IOleObject(iface
);
681 if(!This
->advise_holder
) {
682 *ppenumAdvise
= NULL
;
686 return IOleAdviseHolder_EnumAdvise(This
->advise_holder
, ppenumAdvise
);
689 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD dwAspect
, DWORD
*pdwStatus
)
691 HTMLDocument
*This
= impl_from_IOleObject(iface
);
692 FIXME("(%p)->(%d %p)\n", This
, dwAspect
, pdwStatus
);
696 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
*pLogpal
)
698 HTMLDocument
*This
= impl_from_IOleObject(iface
);
699 FIXME("(%p)->(%p)\n", This
, pLogpal
);
703 static const IOleObjectVtbl OleObjectVtbl
= {
704 OleObject_QueryInterface
,
707 OleObject_SetClientSite
,
708 OleObject_GetClientSite
,
709 OleObject_SetHostNames
,
711 OleObject_SetMoniker
,
712 OleObject_GetMoniker
,
713 OleObject_InitFromData
,
714 OleObject_GetClipboardData
,
718 OleObject_IsUpToDate
,
719 OleObject_GetUserClassID
,
720 OleObject_GetUserType
,
725 OleObject_EnumAdvise
,
726 OleObject_GetMiscStatus
,
727 OleObject_SetColorScheme
730 /**********************************************************
731 * IOleDocument implementation
734 static inline HTMLDocument
*impl_from_IOleDocument(IOleDocument
*iface
)
736 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleDocument_iface
);
739 static HRESULT WINAPI
OleDocument_QueryInterface(IOleDocument
*iface
, REFIID riid
, void **ppv
)
741 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
742 return htmldoc_query_interface(This
, riid
, ppv
);
745 static ULONG WINAPI
OleDocument_AddRef(IOleDocument
*iface
)
747 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
748 return htmldoc_addref(This
);
751 static ULONG WINAPI
OleDocument_Release(IOleDocument
*iface
)
753 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
754 return htmldoc_release(This
);
757 static HRESULT WINAPI
OleDocument_CreateView(IOleDocument
*iface
, IOleInPlaceSite
*pIPSite
, IStream
*pstm
,
758 DWORD dwReserved
, IOleDocumentView
**ppView
)
760 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
763 TRACE("(%p)->(%p %p %d %p)\n", This
, pIPSite
, pstm
, dwReserved
, ppView
);
769 * Windows implementation creates new IOleDocumentView when function is called for the
770 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
771 * if the application uses returned interfaces, passed to ActivateMe or returned by
772 * QueryInterface, so there is no reason to create new interface. This needs more testing.
776 hres
= IOleDocumentView_SetInPlaceSite(&This
->IOleDocumentView_iface
, pIPSite
);
782 FIXME("pstm is not supported\n");
784 IOleDocumentView_AddRef(&This
->IOleDocumentView_iface
);
785 *ppView
= &This
->IOleDocumentView_iface
;
789 static HRESULT WINAPI
OleDocument_GetDocMiscStatus(IOleDocument
*iface
, DWORD
*pdwStatus
)
791 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
792 FIXME("(%p)->(%p)\n", This
, pdwStatus
);
796 static HRESULT WINAPI
OleDocument_EnumViews(IOleDocument
*iface
, IEnumOleDocumentViews
**ppEnum
,
797 IOleDocumentView
**ppView
)
799 HTMLDocument
*This
= impl_from_IOleDocument(iface
);
800 FIXME("(%p)->(%p %p)\n", This
, ppEnum
, ppView
);
804 static const IOleDocumentVtbl OleDocumentVtbl
= {
805 OleDocument_QueryInterface
,
808 OleDocument_CreateView
,
809 OleDocument_GetDocMiscStatus
,
810 OleDocument_EnumViews
813 /**********************************************************
814 * IOleControl implementation
817 static inline HTMLDocument
*impl_from_IOleControl(IOleControl
*iface
)
819 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleControl_iface
);
822 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
, REFIID riid
, void **ppv
)
824 HTMLDocument
*This
= impl_from_IOleControl(iface
);
825 return htmldoc_query_interface(This
, riid
, ppv
);
828 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
830 HTMLDocument
*This
= impl_from_IOleControl(iface
);
831 return htmldoc_addref(This
);
834 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
836 HTMLDocument
*This
= impl_from_IOleControl(iface
);
837 return htmldoc_release(This
);
840 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, CONTROLINFO
*pCI
)
842 HTMLDocument
*This
= impl_from_IOleControl(iface
);
843 FIXME("(%p)->(%p)\n", This
, pCI
);
847 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, MSG
*pMsg
)
849 HTMLDocument
*This
= impl_from_IOleControl(iface
);
850 FIXME("(%p)->(%p)\n", This
, pMsg
);
854 HRESULT
get_client_disp_property(IOleClientSite
*client
, DISPID dispid
, VARIANT
*res
)
856 IDispatch
*disp
= NULL
;
857 DISPPARAMS dispparams
= {NULL
, 0};
861 hres
= IOleClientSite_QueryInterface(client
, &IID_IDispatch
, (void**)&disp
);
863 TRACE("Could not get IDispatch\n");
869 hres
= IDispatch_Invoke(disp
, dispid
, &IID_NULL
, LOCALE_SYSTEM_DEFAULT
,
870 DISPATCH_PROPERTYGET
, &dispparams
, res
, NULL
, &err
);
872 IDispatch_Release(disp
);
877 static HRESULT
on_change_dlcontrol(HTMLDocument
*This
)
882 hres
= get_client_disp_property(This
->doc_obj
->client
, DISPID_AMBIENT_DLCONTROL
, &res
);
884 FIXME("unsupported dlcontrol %08x\n", V_I4(&res
));
889 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispID
)
891 HTMLDocument
*This
= impl_from_IOleControl(iface
);
892 IOleClientSite
*client
;
896 client
= This
->doc_obj
->client
;
898 TRACE("client = NULL\n");
903 case DISPID_AMBIENT_USERMODE
:
904 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This
);
905 hres
= get_client_disp_property(client
, DISPID_AMBIENT_USERMODE
, &res
);
909 if(V_VT(&res
) == VT_BOOL
) {
911 This
->doc_obj
->usermode
= BROWSEMODE
;
913 FIXME("edit mode is not supported\n");
914 This
->doc_obj
->usermode
= EDITMODE
;
917 FIXME("usermode=%s\n", debugstr_variant(&res
));
920 case DISPID_AMBIENT_DLCONTROL
:
921 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This
);
922 return on_change_dlcontrol(This
);
923 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
924 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This
);
925 on_change_dlcontrol(This
);
926 hres
= get_client_disp_property(client
, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
, &res
);
930 if(V_VT(&res
) == VT_BOOL
) {
932 FIXME("offline connection is not supported\n");
936 FIXME("offlineconnected=%s\n", debugstr_variant(&res
));
939 case DISPID_AMBIENT_SILENT
:
940 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This
);
941 on_change_dlcontrol(This
);
942 hres
= get_client_disp_property(client
, DISPID_AMBIENT_SILENT
, &res
);
946 if(V_VT(&res
) == VT_BOOL
) {
948 FIXME("silent mode is not supported\n");
952 FIXME("silent=%s\n", debugstr_variant(&res
));
955 case DISPID_AMBIENT_USERAGENT
:
956 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This
);
957 hres
= get_client_disp_property(client
, DISPID_AMBIENT_USERAGENT
, &res
);
961 FIXME("not supported AMBIENT_USERAGENT\n");
964 case DISPID_AMBIENT_PALETTE
:
965 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This
);
966 hres
= get_client_disp_property(client
, DISPID_AMBIENT_PALETTE
, &res
);
970 FIXME("not supported AMBIENT_PALETTE\n");
975 FIXME("(%p) unsupported dispID=%d\n", This
, dispID
);
979 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL bFreeze
)
981 HTMLDocument
*This
= impl_from_IOleControl(iface
);
982 FIXME("(%p)->(%x)\n", This
, bFreeze
);
986 static const IOleControlVtbl OleControlVtbl
= {
987 OleControl_QueryInterface
,
990 OleControl_GetControlInfo
,
991 OleControl_OnMnemonic
,
992 OleControl_OnAmbientPropertyChange
,
993 OleControl_FreezeEvents
996 /**********************************************************
997 * IObjectWithSite implementation
1000 static inline HTMLDocument
*impl_from_IObjectWithSite(IObjectWithSite
*iface
)
1002 return CONTAINING_RECORD(iface
, HTMLDocument
, IObjectWithSite_iface
);
1005 static HRESULT WINAPI
ObjectWithSite_QueryInterface(IObjectWithSite
*iface
, REFIID riid
, void **ppv
)
1007 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
1008 return htmldoc_query_interface(This
, riid
, ppv
);
1011 static ULONG WINAPI
ObjectWithSite_AddRef(IObjectWithSite
*iface
)
1013 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
1014 return htmldoc_addref(This
);
1017 static ULONG WINAPI
ObjectWithSite_Release(IObjectWithSite
*iface
)
1019 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
1020 return htmldoc_release(This
);
1023 static HRESULT WINAPI
ObjectWithSite_SetSite(IObjectWithSite
*iface
, IUnknown
*pUnkSite
)
1025 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
1026 FIXME("(%p)->(%p)\n", This
, pUnkSite
);
1030 static HRESULT WINAPI
ObjectWithSite_GetSite(IObjectWithSite
* iface
, REFIID riid
, PVOID
*ppvSite
)
1032 HTMLDocument
*This
= impl_from_IObjectWithSite(iface
);
1033 FIXME("(%p)->(%p)\n", This
, ppvSite
);
1037 static const IObjectWithSiteVtbl ObjectWithSiteVtbl
= {
1038 ObjectWithSite_QueryInterface
,
1039 ObjectWithSite_AddRef
,
1040 ObjectWithSite_Release
,
1041 ObjectWithSite_SetSite
,
1042 ObjectWithSite_GetSite
1045 /**********************************************************
1046 * IOleContainer implementation
1049 static inline HTMLDocument
*impl_from_IOleContainer(IOleContainer
*iface
)
1051 return CONTAINING_RECORD(iface
, HTMLDocument
, IOleContainer_iface
);
1054 static HRESULT WINAPI
OleContainer_QueryInterface(IOleContainer
*iface
, REFIID riid
, void **ppv
)
1056 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1057 return htmldoc_query_interface(This
, riid
, ppv
);
1060 static ULONG WINAPI
OleContainer_AddRef(IOleContainer
*iface
)
1062 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1063 return htmldoc_addref(This
);
1066 static ULONG WINAPI
OleContainer_Release(IOleContainer
*iface
)
1068 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1069 return htmldoc_release(This
);
1072 static HRESULT WINAPI
OleContainer_ParseDisplayName(IOleContainer
*iface
, IBindCtx
*pbc
, LPOLESTR pszDisplayName
,
1073 ULONG
*pchEaten
, IMoniker
**ppmkOut
)
1075 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1076 FIXME("(%p)->(%p %s %p %p)\n", This
, pbc
, debugstr_w(pszDisplayName
), pchEaten
, ppmkOut
);
1080 static HRESULT WINAPI
OleContainer_EnumObjects(IOleContainer
*iface
, DWORD grfFlags
, IEnumUnknown
**ppenum
)
1082 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1085 TRACE("(%p)->(%x %p)\n", This
, grfFlags
, ppenum
);
1087 ret
= heap_alloc(sizeof(*ret
));
1089 return E_OUTOFMEMORY
;
1091 ret
->IEnumUnknown_iface
.lpVtbl
= &EnumUnknownVtbl
;
1094 *ppenum
= &ret
->IEnumUnknown_iface
;
1098 static HRESULT WINAPI
OleContainer_LockContainer(IOleContainer
*iface
, BOOL fLock
)
1100 HTMLDocument
*This
= impl_from_IOleContainer(iface
);
1101 FIXME("(%p)->(%x)\n", This
, fLock
);
1105 static const IOleContainerVtbl OleContainerVtbl
= {
1106 OleContainer_QueryInterface
,
1107 OleContainer_AddRef
,
1108 OleContainer_Release
,
1109 OleContainer_ParseDisplayName
,
1110 OleContainer_EnumObjects
,
1111 OleContainer_LockContainer
1114 static inline HTMLDocumentObj
*impl_from_ITargetContainer(ITargetContainer
*iface
)
1116 return CONTAINING_RECORD(iface
, HTMLDocumentObj
, ITargetContainer_iface
);
1119 static HRESULT WINAPI
TargetContainer_QueryInterface(ITargetContainer
*iface
, REFIID riid
, void **ppv
)
1121 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1122 return ICustomDoc_QueryInterface(&This
->ICustomDoc_iface
, riid
, ppv
);
1125 static ULONG WINAPI
TargetContainer_AddRef(ITargetContainer
*iface
)
1127 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1128 return ICustomDoc_AddRef(&This
->ICustomDoc_iface
);
1131 static ULONG WINAPI
TargetContainer_Release(ITargetContainer
*iface
)
1133 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1134 return ICustomDoc_Release(&This
->ICustomDoc_iface
);
1137 static HRESULT WINAPI
TargetContainer_GetFrameUrl(ITargetContainer
*iface
, LPWSTR
*ppszFrameSrc
)
1139 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1140 FIXME("(%p)->(%p)\n", This
, ppszFrameSrc
);
1144 static HRESULT WINAPI
TargetContainer_GetFramesContainer(ITargetContainer
*iface
, IOleContainer
**ppContainer
)
1146 HTMLDocumentObj
*This
= impl_from_ITargetContainer(iface
);
1148 TRACE("(%p)->(%p)\n", This
, ppContainer
);
1150 /* NOTE: we should return wrapped interface here */
1151 IOleContainer_AddRef(&This
->basedoc
.IOleContainer_iface
);
1152 *ppContainer
= &This
->basedoc
.IOleContainer_iface
;
1156 static const ITargetContainerVtbl TargetContainerVtbl
= {
1157 TargetContainer_QueryInterface
,
1158 TargetContainer_AddRef
,
1159 TargetContainer_Release
,
1160 TargetContainer_GetFrameUrl
,
1161 TargetContainer_GetFramesContainer
1164 void TargetContainer_Init(HTMLDocumentObj
*This
)
1166 This
->ITargetContainer_iface
.lpVtbl
= &TargetContainerVtbl
;
1169 /**********************************************************
1170 * IObjectSafety implementation
1173 static inline HTMLDocument
*impl_from_IObjectSafety(IObjectSafety
*iface
)
1175 return CONTAINING_RECORD(iface
, HTMLDocument
, IObjectSafety_iface
);
1178 static HRESULT WINAPI
ObjectSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
1180 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1181 return htmldoc_query_interface(This
, riid
, ppv
);
1184 static ULONG WINAPI
ObjectSafety_AddRef(IObjectSafety
*iface
)
1186 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1187 return htmldoc_addref(This
);
1190 static ULONG WINAPI
ObjectSafety_Release(IObjectSafety
*iface
)
1192 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1193 return htmldoc_release(This
);
1196 static HRESULT WINAPI
ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
,
1197 REFIID riid
, DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
1199 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1200 FIXME("(%p)->(%s %p %p)\n", This
, debugstr_guid(riid
), pdwSupportedOptions
, pdwEnabledOptions
);
1204 static HRESULT WINAPI
ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
,
1205 REFIID riid
, DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
1207 HTMLDocument
*This
= impl_from_IObjectSafety(iface
);
1208 FIXME("(%p)->(%s %x %x)\n", This
, debugstr_guid(riid
), dwOptionSetMask
, dwEnabledOptions
);
1210 if(IsEqualGUID(&IID_IPersistMoniker
, riid
) &&
1211 dwOptionSetMask
==INTERFACESAFE_FOR_UNTRUSTED_DATA
&&
1212 dwEnabledOptions
==INTERFACESAFE_FOR_UNTRUSTED_DATA
)
1218 static const IObjectSafetyVtbl ObjectSafetyVtbl
= {
1219 ObjectSafety_QueryInterface
,
1220 ObjectSafety_AddRef
,
1221 ObjectSafety_Release
,
1222 ObjectSafety_GetInterfaceSafetyOptions
,
1223 ObjectSafety_SetInterfaceSafetyOptions
1226 void HTMLDocument_LockContainer(HTMLDocumentObj
*This
, BOOL fLock
)
1228 IOleContainer
*container
;
1231 if(!This
->client
|| This
->container_locked
== fLock
)
1234 hres
= IOleClientSite_GetContainer(This
->client
, &container
);
1235 if(SUCCEEDED(hres
)) {
1236 IOleContainer_LockContainer(container
, fLock
);
1237 This
->container_locked
= fLock
;
1238 IOleContainer_Release(container
);
1242 void HTMLDocument_OleObj_Init(HTMLDocument
*This
)
1244 This
->IOleObject_iface
.lpVtbl
= &OleObjectVtbl
;
1245 This
->IOleDocument_iface
.lpVtbl
= &OleDocumentVtbl
;
1246 This
->IOleControl_iface
.lpVtbl
= &OleControlVtbl
;
1247 This
->IObjectWithSite_iface
.lpVtbl
= &ObjectWithSiteVtbl
;
1248 This
->IOleContainer_iface
.lpVtbl
= &OleContainerVtbl
;
1249 This
->IObjectSafety_iface
.lpVtbl
= &ObjectSafetyVtbl
;