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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
34 #include "wine/debug.h"
36 #include "mshtml_private.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
40 /**********************************************************
41 * IOleObject implementation
44 #define OLEOBJ_THIS(iface) DEFINE_THIS(HTMLDocument, OleObject, iface)
46 static HRESULT WINAPI
OleObject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **ppvObject
)
48 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
49 return IHTMLDocument2_QueryInterface(HTMLDOC(This
), riid
, ppvObject
);
52 static ULONG WINAPI
OleObject_AddRef(IOleObject
*iface
)
54 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
55 return IHTMLDocument2_AddRef(HTMLDOC(This
));
58 static ULONG WINAPI
OleObject_Release(IOleObject
*iface
)
60 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
61 return IHTMLDocument2_Release(HTMLDOC(This
));
64 static HRESULT WINAPI
OleObject_SetClientSite(IOleObject
*iface
, IOleClientSite
*pClientSite
)
66 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
67 IDocHostUIHandler
*pDocHostUIHandler
= NULL
;
68 IOleCommandTarget
*cmdtrg
= NULL
;
71 TRACE("(%p)->(%p)\n", This
, pClientSite
);
73 if(pClientSite
== This
->client
)
77 IOleClientSite_Release(This
->client
);
82 IDocHostUIHandler_Release(This
->hostui
);
89 hres
= IOleObject_QueryInterface(pClientSite
, &IID_IDocHostUIHandler
, (void**)&pDocHostUIHandler
);
91 DOCHOSTUIINFO hostinfo
;
92 LPOLESTR key_path
= NULL
, override_key_path
= NULL
;
93 IDocHostUIHandler2
*pDocHostUIHandler2
;
95 memset(&hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
96 hostinfo
.cbSize
= sizeof(DOCHOSTUIINFO
);
97 hres
= IDocHostUIHandler_GetHostInfo(pDocHostUIHandler
, &hostinfo
);
99 /* FIXME: use hostinfo */
100 TRACE("hostinfo = {%lu %08lx %08lx %s %s}\n",
101 hostinfo
.cbSize
, hostinfo
.dwFlags
, hostinfo
.dwDoubleClick
,
102 debugstr_w(hostinfo
.pchHostCss
), debugstr_w(hostinfo
.pchHostNS
));
104 if(!This
->has_key_path
) {
105 hres
= IDocHostUIHandler_GetOptionKeyPath(pDocHostUIHandler
, &key_path
, 0);
106 if(hres
== S_OK
&& key_path
) {
108 /* FIXME: use key_path */
109 TRACE("key_path = %s\n", debugstr_w(key_path
));
111 CoTaskMemFree(key_path
);
114 hres
= IDocHostUIHandler_QueryInterface(pDocHostUIHandler
, &IID_IDocHostUIHandler2
,
115 (void**)&pDocHostUIHandler2
);
116 if(SUCCEEDED(hres
)) {
117 hres
= IDocHostUIHandler2_GetOverrideKeyPath(pDocHostUIHandler2
, &override_key_path
, 0);
118 if(hres
== S_OK
&& override_key_path
&& override_key_path
[0]) {
119 if(override_key_path
[0]) {
120 /*FIXME: use override_key_path */
121 TRACE("override_key_path = %s\n", debugstr_w(override_key_path
));
123 CoTaskMemFree(override_key_path
);
125 IDocHostUIHandler2_Release(pDocHostUIHandler2
);
128 This
->has_key_path
= TRUE
;
132 /* Native calls here GetWindow. What is it for?
133 * We don't have anything to do with it here (yet). */
135 IOleWindow
*pOleWindow
= NULL
;
138 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IOleWindow
, (void**)&pOleWindow
);
139 if(SUCCEEDED(hres
)) {
140 IOleWindow_GetWindow(pOleWindow
, &hwnd
);
141 IOleWindow_Release(pOleWindow
);
145 hres
= IOleClientSite_QueryInterface(pClientSite
, &IID_IOleCommandTarget
, (void**)&cmdtrg
);
146 if(SUCCEEDED(hres
)) {
148 OLECMD cmd
= {OLECMDID_SETPROGRESSTEXT
, 0};
150 IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &cmd
, NULL
);
154 IOleCommandTarget_Exec(cmdtrg
, NULL
, OLECMDID_SETPROGRESSMAX
, 0, &var
, NULL
);
155 IOleCommandTarget_Exec(cmdtrg
, NULL
, OLECMDID_SETPROGRESSPOS
, 0, &var
, NULL
);
157 IOleCommandTarget_Release(cmdtrg
);
160 IOleClientSite_AddRef(pClientSite
);
161 This
->client
= pClientSite
;
162 This
->hostui
= pDocHostUIHandler
;
164 IOleControl_OnAmbientPropertyChange(CONTROL(This
), DISPID_AMBIENT_USERMODE
);
165 IOleControl_OnAmbientPropertyChange(CONTROL(This
), DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
);
166 IOleControl_OnAmbientPropertyChange(CONTROL(This
), DISPID_AMBIENT_SILENT
);
167 IOleControl_OnAmbientPropertyChange(CONTROL(This
), DISPID_AMBIENT_USERAGENT
);
168 IOleControl_OnAmbientPropertyChange(CONTROL(This
), DISPID_AMBIENT_PALETTE
);
173 static HRESULT WINAPI
OleObject_GetClientSite(IOleObject
*iface
, IOleClientSite
**ppClientSite
)
175 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
177 TRACE("(%p)->(%p)\n", This
, ppClientSite
);
183 IOleClientSite_AddRef(This
->client
);
184 *ppClientSite
= This
->client
;
189 static HRESULT WINAPI
OleObject_SetHostNames(IOleObject
*iface
, LPCOLESTR szContainerApp
, LPCOLESTR szContainerObj
)
191 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
192 FIXME("(%p)->(%s %s)\n", This
, debugstr_w(szContainerApp
), debugstr_w(szContainerObj
));
196 static HRESULT WINAPI
OleObject_Close(IOleObject
*iface
, DWORD dwSaveOption
)
198 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
200 TRACE("(%p)->(%08lx)\n", This
, dwSaveOption
);
202 if(dwSaveOption
== OLECLOSE_PROMPTSAVE
)
203 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
205 if(This
->in_place_active
)
206 IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This
));
208 HTMLDocument_LockContainer(This
, FALSE
);
213 static HRESULT WINAPI
OleObject_SetMoniker(IOleObject
*iface
, DWORD dwWhichMoniker
, IMoniker
*pmk
)
215 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
216 FIXME("(%p %ld %p)->()\n", This
, dwWhichMoniker
, pmk
);
220 static HRESULT WINAPI
OleObject_GetMoniker(IOleObject
*iface
, DWORD dwAssign
, DWORD dwWhichMoniker
, IMoniker
**ppmk
)
222 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
223 FIXME("(%p)->(%ld %ld %p)\n", This
, dwAssign
, dwWhichMoniker
, ppmk
);
227 static HRESULT WINAPI
OleObject_InitFromData(IOleObject
*iface
, IDataObject
*pDataObject
, BOOL fCreation
,
230 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
231 FIXME("(%p)->(%p %x %ld)\n", This
, pDataObject
, fCreation
, dwReserved
);
235 static HRESULT WINAPI
OleObject_GetClipboardData(IOleObject
*iface
, DWORD dwReserved
, IDataObject
**ppDataObject
)
237 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
238 FIXME("(%p)->(%ld %p)\n", This
, dwReserved
, ppDataObject
);
242 static HRESULT WINAPI
OleObject_DoVerb(IOleObject
*iface
, LONG iVerb
, LPMSG lpmsg
, IOleClientSite
*pActiveSite
,
243 LONG lindex
, HWND hwndParent
, LPCRECT lprcPosRect
)
245 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
246 IOleDocumentSite
*pDocSite
;
249 TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This
, iVerb
, lpmsg
, pActiveSite
, lindex
, hwndParent
, lprcPosRect
);
251 if(iVerb
!= OLEIVERB_SHOW
&& iVerb
!= OLEIVERB_UIACTIVATE
&& iVerb
!= OLEIVERB_INPLACEACTIVATE
) {
252 FIXME("iVerb = %ld not supported\n", iVerb
);
257 pActiveSite
= This
->client
;
259 hres
= IOleClientSite_QueryInterface(pActiveSite
, &IID_IOleDocumentSite
, (void**)&pDocSite
);
260 if(SUCCEEDED(hres
)) {
261 HTMLDocument_LockContainer(This
, TRUE
);
263 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
264 hres
= IOleDocumentSite_ActivateMe(pDocSite
, DOCVIEW(This
));
265 IOleDocumentSite_Release(pDocSite
);
267 hres
= IOleDocumentView_UIActivate(DOCVIEW(This
), TRUE
);
268 if(SUCCEEDED(hres
)) {
270 RECT rect
; /* We need to pass rect as not const pointer */
271 memcpy(&rect
, lprcPosRect
, sizeof(RECT
));
272 IOleDocumentView_SetRect(DOCVIEW(This
), &rect
);
274 IOleDocumentView_Show(DOCVIEW(This
), TRUE
);
281 static HRESULT WINAPI
OleObject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**ppEnumOleVerb
)
283 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
284 FIXME("(%p)->(%p)\n", This
, ppEnumOleVerb
);
288 static HRESULT WINAPI
OleObject_Update(IOleObject
*iface
)
290 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
291 FIXME("(%p)\n", This
);
295 static HRESULT WINAPI
OleObject_IsUpToDate(IOleObject
*iface
)
297 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
298 FIXME("(%p)\n", This
);
302 static HRESULT WINAPI
OleObject_GetUserClassID(IOleObject
*iface
, CLSID
*pClsid
)
304 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
306 TRACE("(%p)->(%p)\n", This
, pClsid
);
311 memcpy(pClsid
, &CLSID_HTMLDocument
, sizeof(GUID
));
315 static HRESULT WINAPI
OleObject_GetUserType(IOleObject
*iface
, DWORD dwFormOfType
, LPOLESTR
*pszUserType
)
317 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
318 FIXME("(%p)->(%ld %p)\n", This
, dwFormOfType
, pszUserType
);
322 static HRESULT WINAPI
OleObject_SetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
324 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
325 FIXME("(%p)->(%ld %p)\n", This
, dwDrawAspect
, psizel
);
329 static HRESULT WINAPI
OleObject_GetExtent(IOleObject
*iface
, DWORD dwDrawAspect
, SIZEL
*psizel
)
331 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
332 FIXME("(%p)->(%ld %p)\n", This
, dwDrawAspect
, psizel
);
336 static HRESULT WINAPI
OleObject_Advise(IOleObject
*iface
, IAdviseSink
*pAdvSink
, DWORD
*pdwConnection
)
338 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
339 FIXME("(%p)->(%p %p)\n", This
, pAdvSink
, pdwConnection
);
343 static HRESULT WINAPI
OleObject_Unadvise(IOleObject
*iface
, DWORD dwConnection
)
345 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
346 FIXME("(%p)->(%ld)\n", This
, dwConnection
);
350 static HRESULT WINAPI
OleObject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**ppenumAdvise
)
352 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
353 FIXME("(%p)->(%p)\n", This
, ppenumAdvise
);
357 static HRESULT WINAPI
OleObject_GetMiscStatus(IOleObject
*iface
, DWORD dwAspect
, DWORD
*pdwStatus
)
359 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
360 FIXME("(%p)->(%ld %p)\n", This
, dwAspect
, pdwStatus
);
364 static HRESULT WINAPI
OleObject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
*pLogpal
)
366 HTMLDocument
*This
= OLEOBJ_THIS(iface
);
367 FIXME("(%p)->(%p)\n", This
, pLogpal
);
373 static const IOleObjectVtbl OleObjectVtbl
= {
374 OleObject_QueryInterface
,
377 OleObject_SetClientSite
,
378 OleObject_GetClientSite
,
379 OleObject_SetHostNames
,
381 OleObject_SetMoniker
,
382 OleObject_GetMoniker
,
383 OleObject_InitFromData
,
384 OleObject_GetClipboardData
,
388 OleObject_IsUpToDate
,
389 OleObject_GetUserClassID
,
390 OleObject_GetUserType
,
395 OleObject_EnumAdvise
,
396 OleObject_GetMiscStatus
,
397 OleObject_SetColorScheme
400 /**********************************************************
401 * IOleDocument implementation
404 #define OLEDOC_THIS(iface) DEFINE_THIS(HTMLDocument, OleDocument, iface)
406 static HRESULT WINAPI
OleDocument_QueryInterface(IOleDocument
*iface
, REFIID riid
, void **ppvObject
)
408 HTMLDocument
*This
= OLEDOC_THIS(iface
);
409 return IHTMLDocument2_QueryInterface(HTMLDOC(This
), riid
, ppvObject
);
412 static ULONG WINAPI
OleDocument_AddRef(IOleDocument
*iface
)
414 HTMLDocument
*This
= OLEDOC_THIS(iface
);
415 return IHTMLDocument2_AddRef(HTMLDOC(This
));
418 static ULONG WINAPI
OleDocument_Release(IOleDocument
*iface
)
420 HTMLDocument
*This
= OLEDOC_THIS(iface
);
421 return IHTMLDocument2_Release(HTMLDOC(This
));
424 static HRESULT WINAPI
OleDocument_CreateView(IOleDocument
*iface
, IOleInPlaceSite
*pIPSite
, IStream
*pstm
,
425 DWORD dwReserved
, IOleDocumentView
**ppView
)
427 HTMLDocument
*This
= OLEDOC_THIS(iface
);
430 TRACE("(%p)->(%p %p %ld %p)\n", This
, pIPSite
, pstm
, dwReserved
, ppView
);
436 * Windows implementation creates new IOleDocumentView when function is called for the
437 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
438 * if the application uses returned interfaces, passed to ActivateMe or returned by
439 * QueryInterface, so there is no reason to create new interface. This needs more testing.
443 hres
= IOleDocumentView_SetInPlaceSite(DOCVIEW(This
), pIPSite
);
449 FIXME("pstm is not supported\n");
451 IOleDocumentView_AddRef(DOCVIEW(This
));
452 *ppView
= DOCVIEW(This
);
456 static HRESULT WINAPI
OleDocument_GetDocMiscStatus(IOleDocument
*iface
, DWORD
*pdwStatus
)
458 HTMLDocument
*This
= OLEDOC_THIS(iface
);
459 FIXME("(%p)->(%p)\n", This
, pdwStatus
);
463 static HRESULT WINAPI
OleDocument_EnumViews(IOleDocument
*iface
, IEnumOleDocumentViews
**ppEnum
,
464 IOleDocumentView
**ppView
)
466 HTMLDocument
*This
= OLEDOC_THIS(iface
);
467 FIXME("(%p)->(%p %p)\n", This
, ppEnum
, ppView
);
473 static const IOleDocumentVtbl OleDocumentVtbl
= {
474 OleDocument_QueryInterface
,
477 OleDocument_CreateView
,
478 OleDocument_GetDocMiscStatus
,
479 OleDocument_EnumViews
482 /**********************************************************
483 * IOleCommandTarget implementation
486 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
488 static HRESULT
exec_open(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
490 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
494 static HRESULT
exec_new(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
496 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
500 static HRESULT
exec_save(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
502 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
506 static HRESULT
exec_save_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
508 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
512 static HRESULT
exec_save_copy_as(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
514 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
518 static HRESULT
exec_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
520 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
524 static HRESULT
exec_print_preview(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
526 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
530 static HRESULT
exec_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
532 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
536 static HRESULT
exec_spell(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
538 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
542 static HRESULT
exec_properties(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
544 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
548 static HRESULT
exec_cut(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
550 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
554 static HRESULT
exec_copy(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
556 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
560 static HRESULT
exec_paste(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
562 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
566 static HRESULT
exec_paste_special(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
568 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
572 static HRESULT
exec_undo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
574 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
578 static HRESULT
exec_rendo(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
580 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
584 static HRESULT
exec_select_all(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
586 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
590 static HRESULT
exec_clear_selection(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
592 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
596 static HRESULT
exec_zoom(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
598 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
602 static HRESULT
exec_get_zoom_range(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
604 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
608 static HRESULT
exec_refresh(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
610 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
614 static HRESULT
exec_stop(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
616 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
620 static HRESULT
exec_stop_download(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
622 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
626 static HRESULT
exec_delete(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
628 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
632 static HRESULT
exec_enable_interaction(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
634 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
638 static HRESULT
exec_on_unload(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
640 TRACE("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
642 /* Tests show that we have nothing more to do here */
645 V_VT(pvaOut
) = VT_BOOL
;
646 V_BOOL(pvaOut
) = VARIANT_TRUE
;
652 static HRESULT
exec_show_page_setup(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
654 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
658 static HRESULT
exec_show_print(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
660 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
664 static HRESULT
exec_close(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
666 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
670 static HRESULT
exec_set_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
672 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
676 static HRESULT
exec_get_print_template(HTMLDocument
*This
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
678 FIXME("(%p)->(%ld %p %p)\n", This
, nCmdexecopt
, pvaIn
, pvaOut
);
682 static const struct {
684 HRESULT (*func
)(HTMLDocument
*,DWORD
,VARIANT
*,VARIANT
*);
685 } exec_table
[OLECMDID_GETPRINTTEMPLATE
+1] = {
687 { OLECMDF_SUPPORTED
, exec_open
}, /* OLECMDID_OPEN */
688 { OLECMDF_SUPPORTED
, exec_new
}, /* OLECMDID_NEW */
689 { OLECMDF_SUPPORTED
, exec_save
}, /* OLECMDID_SAVE */
690 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_save_as
}, /* OLECMDID_SAVEAS */
691 { OLECMDF_SUPPORTED
, exec_save_copy_as
}, /* OLECMDID_SAVECOPYAS */
692 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print
}, /* OLECMDID_PRINT */
693 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_print_preview
}, /* OLECMDID_PRINTPREVIEW */
694 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_page_setup
}, /* OLECMDID_PAGESETUP */
695 { OLECMDF_SUPPORTED
, exec_spell
}, /* OLECMDID_SPELL */
696 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_properties
}, /* OLECMDID_PROPERTIES */
697 { OLECMDF_SUPPORTED
, exec_cut
}, /* OLECMDID_CUT */
698 { OLECMDF_SUPPORTED
, exec_copy
}, /* OLECMDID_COPY */
699 { OLECMDF_SUPPORTED
, exec_paste
}, /* OLECMDID_PASTE */
700 { OLECMDF_SUPPORTED
, exec_paste_special
}, /* OLECMDID_PASTESPECIAL */
701 { OLECMDF_SUPPORTED
, exec_undo
}, /* OLECMDID_UNDO */
702 { OLECMDF_SUPPORTED
, exec_rendo
}, /* OLECMDID_REDO */
703 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_select_all
}, /* OLECMDID_SELECTALL */
704 { OLECMDF_SUPPORTED
, exec_clear_selection
}, /* OLECMDID_CLEARSELECTION */
705 { OLECMDF_SUPPORTED
, exec_zoom
}, /* OLECMDID_ZOOM */
706 { OLECMDF_SUPPORTED
, exec_get_zoom_range
}, /* OLECMDID_GETZOOMRANGE */
708 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_refresh
}, /* OLECMDID_REFRESH */
709 { OLECMDF_SUPPORTED
|OLECMDF_ENABLED
, exec_stop
}, /* OLECMDID_STOP */
710 {0},{0},{0},{0},{0},{0},
711 { OLECMDF_SUPPORTED
, exec_stop_download
}, /* OLECMDID_STOPDOWNLOAD */
713 { OLECMDF_SUPPORTED
, exec_delete
}, /* OLECMDID_DELETE */
715 { OLECMDF_SUPPORTED
, exec_enable_interaction
}, /* OLECMDID_ENABLE_INTERACTION */
716 { OLECMDF_SUPPORTED
, exec_on_unload
}, /* OLECMDID_ONUNLOAD */
718 { OLECMDF_SUPPORTED
, exec_show_page_setup
}, /* OLECMDID_SHOWPAGESETUP */
719 { OLECMDF_SUPPORTED
, exec_show_print
}, /* OLECMDID_SHOWPRINT */
721 { OLECMDF_SUPPORTED
, exec_close
}, /* OLECMDID_CLOSE */
723 { OLECMDF_SUPPORTED
, exec_set_print_template
}, /* OLECMDID_SETPRINTTEMPLATE */
724 { OLECMDF_SUPPORTED
, exec_get_print_template
} /* OLECMDID_GETPRINTTEMPLATE */
727 static HRESULT WINAPI
OleCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
729 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
730 return IHTMLDocument2_QueryInterface(HTMLDOC(This
), riid
, ppv
);
733 static ULONG WINAPI
OleCommandTarget_AddRef(IOleCommandTarget
*iface
)
735 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
736 return IHTMLDocument2_AddRef(HTMLDOC(This
));
739 static ULONG WINAPI
OleCommandTarget_Release(IOleCommandTarget
*iface
)
741 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
742 return IHTMLDocument_Release(HTMLDOC(This
));
745 static HRESULT WINAPI
OleCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
746 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
748 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
749 HRESULT hres
= S_OK
, hr
;
751 TRACE("(%p)->(%s %ld %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
756 for(i
=0; i
<cCmds
; i
++) {
757 if(prgCmds
[i
].cmdID
<OLECMDID_OPEN
|| prgCmds
[i
].cmdID
>OLECMDID_GETPRINTTEMPLATE
) {
758 WARN("Unsupported cmdID = %ld\n", prgCmds
[i
].cmdID
);
760 hres
= OLECMDERR_E_NOTSUPPORTED
;
762 if(prgCmds
[i
].cmdID
== OLECMDID_OPEN
|| prgCmds
[i
].cmdID
== OLECMDID_NEW
) {
763 IOleCommandTarget
*cmdtrg
= NULL
;
766 prgCmds
[i
].cmdf
= OLECMDF_SUPPORTED
;
768 hr
= IOleClientSite_QueryInterface(This
->client
, &IID_IOleCommandTarget
,
771 olecmd
.cmdID
= prgCmds
[i
].cmdID
;
774 hr
= IOleCommandTarget_QueryStatus(cmdtrg
, NULL
, 1, &olecmd
, NULL
);
775 if(SUCCEEDED(hr
) && olecmd
.cmdf
)
776 prgCmds
[i
].cmdf
= olecmd
.cmdf
;
779 ERR("This->client == NULL, native would crash\n");
782 prgCmds
[i
].cmdf
= exec_table
[prgCmds
[i
].cmdID
].cmdf
;
783 TRACE("cmdID = %ld returning %lx\n", prgCmds
[i
].cmdID
, prgCmds
[i
].cmdf
);
790 FIXME("Set pCmdText\n");
792 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
793 hres
= OLECMDERR_E_UNKNOWNGROUP
;
799 static HRESULT WINAPI
OleCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
800 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
802 HTMLDocument
*This
= CMDTARGET_THIS(iface
);
805 if(nCmdID
<OLECMDID_OPEN
|| nCmdID
>OLECMDID_GETPRINTTEMPLATE
|| !exec_table
[nCmdID
].func
) {
806 WARN("Unsupported cmdID = %ld\n", nCmdID
);
807 return OLECMDERR_E_NOTSUPPORTED
;
810 return exec_table
[nCmdID
].func(This
, nCmdexecopt
, pvaIn
, pvaOut
);
811 }else if(IsEqualGUID(&CGID_Explorer
, pguidCmdGroup
)) {
812 FIXME("unsupported nCmdID %ld of CGID_Explorer group\n", nCmdID
);
813 TRACE("%p %p\n", pvaIn
, pvaOut
);
814 return OLECMDERR_E_NOTSUPPORTED
;
815 }else if(IsEqualGUID(&CGID_ShellDocView
, pguidCmdGroup
)) {
816 FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID
);
817 return OLECMDERR_E_NOTSUPPORTED
;
820 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup
));
821 return OLECMDERR_E_UNKNOWNGROUP
;
824 #undef CMDTARGET_THIS
826 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
827 OleCommandTarget_QueryInterface
,
828 OleCommandTarget_AddRef
,
829 OleCommandTarget_Release
,
830 OleCommandTarget_QueryStatus
,
831 OleCommandTarget_Exec
834 /**********************************************************
835 * IOleControl implementation
838 #define CONTROL_THIS(iface) DEFINE_THIS(HTMLDocument, OleControl, iface)
840 static HRESULT WINAPI
OleControl_QueryInterface(IOleControl
*iface
, REFIID riid
, void **ppv
)
842 HTMLDocument
*This
= CONTROL_THIS(iface
);
843 return IHTMLDocument2_QueryInterface(HTMLDOC(This
), riid
, ppv
);
846 static ULONG WINAPI
OleControl_AddRef(IOleControl
*iface
)
848 HTMLDocument
*This
= CONTROL_THIS(iface
);
849 return IHTMLDocument2_AddRef(HTMLDOC(This
));
852 static ULONG WINAPI
OleControl_Release(IOleControl
*iface
)
854 HTMLDocument
*This
= CONTROL_THIS(iface
);
855 return IHTMLDocument_Release(HTMLDOC(This
));
858 static HRESULT WINAPI
OleControl_GetControlInfo(IOleControl
*iface
, CONTROLINFO
*pCI
)
860 HTMLDocument
*This
= CONTROL_THIS(iface
);
861 FIXME("(%p)->(%p)\n", This
, pCI
);
865 static HRESULT WINAPI
OleControl_OnMnemonic(IOleControl
*iface
, MSG
*pMsg
)
867 HTMLDocument
*This
= CONTROL_THIS(iface
);
868 FIXME("(%p)->(%p)\n", This
, pMsg
);
872 static HRESULT
get_property(IOleClientSite
*client
, DISPID dispid
, VARIANT
*res
)
874 IDispatch
*disp
= NULL
;
875 DISPPARAMS dispparams
= {NULL
, 0};
879 hres
= IOleClientSite_QueryInterface(client
, &IID_IDispatch
, (void**)&disp
);
881 TRACE("Could not get IDispatch\n");
887 hres
= IDispatch_Invoke(disp
, dispid
, &IID_NULL
, LOCALE_SYSTEM_DEFAULT
,
888 DISPATCH_PROPERTYGET
, &dispparams
, res
, NULL
, &err
);
890 IDispatch_Release(disp
);
895 static HRESULT
on_change_dlcontrol(HTMLDocument
*This
)
900 hres
= get_property(This
->client
, DISPID_AMBIENT_DLCONTROL
, &res
);
902 FIXME("unsupported dlcontrol %08lx\n", V_I4(&res
));
907 static HRESULT WINAPI
OleControl_OnAmbientPropertyChange(IOleControl
*iface
, DISPID dispID
)
909 HTMLDocument
*This
= CONTROL_THIS(iface
);
914 TRACE("This->client = NULL\n");
919 case DISPID_AMBIENT_USERMODE
:
920 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This
);
921 hres
= get_property(This
->client
, DISPID_AMBIENT_USERMODE
, &res
);
925 if(V_VT(&res
) == VT_BOOL
) {
927 FIXME("edit mode is not supported\n");
931 FIXME("V_VT(res)=%d\n", V_VT(&res
));
934 case DISPID_AMBIENT_DLCONTROL
:
935 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This
);
936 return on_change_dlcontrol(This
);
937 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
938 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This
);
939 on_change_dlcontrol(This
);
940 hres
= get_property(This
->client
, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
, &res
);
944 if(V_VT(&res
) == VT_BOOL
) {
946 FIXME("offline connection is not supported\n");
950 FIXME("V_VT(res)=%d\n", V_VT(&res
));
953 case DISPID_AMBIENT_SILENT
:
954 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This
);
955 on_change_dlcontrol(This
);
956 hres
= get_property(This
->client
, DISPID_AMBIENT_SILENT
, &res
);
960 if(V_VT(&res
) == VT_BOOL
) {
962 FIXME("silent mode is not supported\n");
966 FIXME("V_VT(res)=%d\n", V_VT(&res
));
969 case DISPID_AMBIENT_USERAGENT
:
970 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This
);
971 hres
= get_property(This
->client
, DISPID_AMBIENT_USERAGENT
, &res
);
975 FIXME("not supported AMBIENT_USERAGENT\n");
978 case DISPID_AMBIENT_PALETTE
:
979 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This
);
980 hres
= get_property(This
->client
, DISPID_AMBIENT_PALETTE
, &res
);
984 FIXME("not supported AMBIENT_PALETTE\n");
989 FIXME("(%p) unsupported dispID=%ld\n", This
, dispID
);
993 static HRESULT WINAPI
OleControl_FreezeEvents(IOleControl
*iface
, BOOL bFreeze
)
995 HTMLDocument
*This
= CONTROL_THIS(iface
);
996 FIXME("(%p)->(%x)\n", This
, bFreeze
);
1002 static const IOleControlVtbl OleControlVtbl
= {
1003 OleControl_QueryInterface
,
1006 OleControl_GetControlInfo
,
1007 OleControl_OnMnemonic
,
1008 OleControl_OnAmbientPropertyChange
,
1009 OleControl_FreezeEvents
1012 void HTMLDocument_LockContainer(HTMLDocument
*This
, BOOL fLock
)
1014 IOleContainer
*container
;
1017 if(!This
->client
|| This
->container_locked
== fLock
)
1020 hres
= IOleClientSite_GetContainer(This
->client
, &container
);
1021 if(SUCCEEDED(hres
)) {
1022 IOleContainer_LockContainer(container
, fLock
);
1023 This
->container_locked
= fLock
;
1024 IOleContainer_Release(container
);
1028 void HTMLDocument_OleObj_Init(HTMLDocument
*This
)
1030 This
->lpOleObjectVtbl
= &OleObjectVtbl
;
1031 This
->lpOleDocumentVtbl
= &OleDocumentVtbl
;
1032 This
->lpOleCommandTargetVtbl
= &OleCommandTargetVtbl
;
1033 This
->lpOleControlVtbl
= &OleControlVtbl
;
1035 This
->client
= NULL
;
1036 This
->hostui
= NULL
;
1038 This
->has_key_path
= FALSE
;
1039 This
->container_locked
= FALSE
;