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);
74 IOleClientSite_Release(This->client);
77 IDocHostUIHandler_Release(This->hostui);
84 hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&pDocHostUIHandler);
86 DOCHOSTUIINFO hostinfo;
87 LPOLESTR key_path = NULL, override_key_path = NULL;
88 IDocHostUIHandler2 *pDocHostUIHandler2;
90 memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
91 hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
92 hres = IDocHostUIHandler_GetHostInfo(pDocHostUIHandler, &hostinfo);
94 /* FIXME: use hostinfo */
95 TRACE("hostinfo = {%lu %08lx %08lx %s %s}\n",
96 hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
97 debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
99 if(!This->has_key_path) {
100 hres = IDocHostUIHandler_GetOptionKeyPath(pDocHostUIHandler, &key_path, 0);
101 if(hres == S_OK && key_path) {
103 /* FIXME: use key_path */
104 TRACE("key_path = %s\n", debugstr_w(key_path));
106 CoTaskMemFree(key_path);
109 hres = IDocHostUIHandler_QueryInterface(pDocHostUIHandler, &IID_IDocHostUIHandler2,
110 (void**)&pDocHostUIHandler2);
111 if(SUCCEEDED(hres)) {
112 hres = IDocHostUIHandler2_GetOverrideKeyPath(pDocHostUIHandler2, &override_key_path, 0);
113 if(hres == S_OK && override_key_path && override_key_path[0]) {
114 if(override_key_path[0]) {
115 /*FIXME: use override_key_path */
116 TRACE("override_key_path = %s\n", debugstr_w(override_key_path));
118 CoTaskMemFree(override_key_path);
122 This->has_key_path = TRUE;
126 /* Native calls here GetWindow. What is it for?
127 * We don't have anything to do with it here (yet). */
129 IOleWindow *pOleWindow = NULL;
132 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&pOleWindow);
133 if(SUCCEEDED(hres)) {
134 IOleWindow_GetWindow(pOleWindow, &hwnd);
135 IOleWindow_Release(pOleWindow);
139 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg);
140 if(SUCCEEDED(hres)) {
142 OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0};
144 IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL);
148 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX, 0, &var, NULL);
149 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS, 0, &var, NULL);
151 IOleCommandTarget_Release(cmdtrg);
154 IOleClientSite_AddRef(pClientSite);
155 This->client = pClientSite;
156 This->hostui = pDocHostUIHandler;
158 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERMODE);
159 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
160 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_SILENT);
161 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERAGENT);
162 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_PALETTE);
167 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
169 HTMLDocument *This = OLEOBJ_THIS(iface);
171 TRACE("(%p)->(%p)\n", This, ppClientSite);
177 IOleClientSite_AddRef(This->client);
178 *ppClientSite = This->client;
183 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
185 HTMLDocument *This = OLEOBJ_THIS(iface);
186 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
190 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
192 HTMLDocument *This = OLEOBJ_THIS(iface);
195 TRACE("(%p)->(%08lx)\n", This, dwSaveOption);
197 if(dwSaveOption == OLECLOSE_PROMPTSAVE)
198 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
200 if(This->in_place_active)
201 IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This));
204 IOleContainer *container;
205 hres = IOleClientSite_GetContainer(This->client, &container);
206 if(SUCCEEDED(hres)) {
207 IOleContainer_LockContainer(container, FALSE);
208 IOleContainer_Release(container);
215 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
217 HTMLDocument *This = OLEOBJ_THIS(iface);
218 FIXME("(%p %ld %p)->()\n", This, dwWhichMoniker, pmk);
222 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
224 HTMLDocument *This = OLEOBJ_THIS(iface);
225 FIXME("(%p)->(%ld %ld %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
229 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
232 HTMLDocument *This = OLEOBJ_THIS(iface);
233 FIXME("(%p)->(%p %x %ld)\n", This, pDataObject, fCreation, dwReserved);
237 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
239 HTMLDocument *This = OLEOBJ_THIS(iface);
240 FIXME("(%p)->(%ld %p)\n", This, dwReserved, ppDataObject);
244 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
245 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
247 HTMLDocument *This = OLEOBJ_THIS(iface);
248 IOleDocumentSite *pDocSite;
251 TRACE("(%p)->(%ld %p %p %ld %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
253 if(iVerb != OLEIVERB_SHOW && iVerb != OLEIVERB_UIACTIVATE && iVerb != OLEIVERB_INPLACEACTIVATE) {
254 FIXME("iVerb = %ld not supported\n", iVerb);
259 pActiveSite = This->client;
261 hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleDocumentSite, (void**)&pDocSite);
262 if(SUCCEEDED(hres)) {
263 IOleContainer *pContainer;
264 hres = IOleClientSite_GetContainer(pActiveSite, &pContainer);
265 if(SUCCEEDED(hres)) {
266 IOleContainer_LockContainer(pContainer, TRUE);
267 IOleContainer_Release(pContainer);
269 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
270 hres = IOleDocumentSite_ActivateMe(pDocSite, DOCVIEW(This));
271 IOleDocumentSite_Release(pDocSite);
273 hres = IOleDocumentView_UIActivate(DOCVIEW(This), TRUE);
274 if(SUCCEEDED(hres)) {
276 RECT rect; /* We need to pass rect as not const pointer */
277 memcpy(&rect, lprcPosRect, sizeof(RECT));
278 IOleDocumentView_SetRect(DOCVIEW(This), &rect);
280 IOleDocumentView_Show(DOCVIEW(This), TRUE);
287 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
289 HTMLDocument *This = OLEOBJ_THIS(iface);
290 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
294 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
296 HTMLDocument *This = OLEOBJ_THIS(iface);
297 FIXME("(%p)\n", This);
301 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
303 HTMLDocument *This = OLEOBJ_THIS(iface);
304 FIXME("(%p)\n", This);
308 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
310 HTMLDocument *This = OLEOBJ_THIS(iface);
312 TRACE("(%p)->(%p)\n", This, pClsid);
317 memcpy(pClsid, &CLSID_HTMLDocument, sizeof(GUID));
321 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
323 HTMLDocument *This = OLEOBJ_THIS(iface);
324 FIXME("(%p)->(%ld %p)\n", This, dwFormOfType, pszUserType);
328 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
330 HTMLDocument *This = OLEOBJ_THIS(iface);
331 FIXME("(%p)->(%ld %p)\n", This, dwDrawAspect, psizel);
335 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
337 HTMLDocument *This = OLEOBJ_THIS(iface);
338 FIXME("(%p)->(%ld %p)\n", This, dwDrawAspect, psizel);
342 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
344 HTMLDocument *This = OLEOBJ_THIS(iface);
345 FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
349 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
351 HTMLDocument *This = OLEOBJ_THIS(iface);
352 FIXME("(%p)->(%ld)\n", This, dwConnection);
356 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
358 HTMLDocument *This = OLEOBJ_THIS(iface);
359 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
363 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
365 HTMLDocument *This = OLEOBJ_THIS(iface);
366 FIXME("(%p)->(%ld %p)\n", This, dwAspect, pdwStatus);
370 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
372 HTMLDocument *This = OLEOBJ_THIS(iface);
373 FIXME("(%p)->(%p)\n", This, pLogpal);
379 static const IOleObjectVtbl OleObjectVtbl = {
380 OleObject_QueryInterface,
383 OleObject_SetClientSite,
384 OleObject_GetClientSite,
385 OleObject_SetHostNames,
387 OleObject_SetMoniker,
388 OleObject_GetMoniker,
389 OleObject_InitFromData,
390 OleObject_GetClipboardData,
394 OleObject_IsUpToDate,
395 OleObject_GetUserClassID,
396 OleObject_GetUserType,
401 OleObject_EnumAdvise,
402 OleObject_GetMiscStatus,
403 OleObject_SetColorScheme
406 /**********************************************************
407 * IOleDocument implementation
410 #define OLEDOC_THIS(iface) DEFINE_THIS(HTMLDocument, OleDocument, iface)
412 static HRESULT WINAPI OleDocument_QueryInterface(IOleDocument *iface, REFIID riid, void **ppvObject)
414 HTMLDocument *This = OLEDOC_THIS(iface);
415 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
418 static ULONG WINAPI OleDocument_AddRef(IOleDocument *iface)
420 HTMLDocument *This = OLEDOC_THIS(iface);
421 return IHTMLDocument2_AddRef(HTMLDOC(This));
424 static ULONG WINAPI OleDocument_Release(IOleDocument *iface)
426 HTMLDocument *This = OLEDOC_THIS(iface);
427 return IHTMLDocument2_Release(HTMLDOC(This));
430 static HRESULT WINAPI OleDocument_CreateView(IOleDocument *iface, IOleInPlaceSite *pIPSite, IStream *pstm,
431 DWORD dwReserved, IOleDocumentView **ppView)
433 HTMLDocument *This = OLEDOC_THIS(iface);
436 TRACE("(%p)->(%p %p %ld %p)\n", This, pIPSite, pstm, dwReserved, ppView);
442 * Windows implementation creates new IOleDocumentView when function is called for the
443 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
444 * if the application uses returned interfaces, passed to ActivateMe or returned by
445 * QueryInterface, so there is no reason to create new interface. This needs more testing.
449 hres = IOleDocumentView_SetInPlaceSite(DOCVIEW(This), pIPSite);
455 FIXME("pstm is not supported\n");
457 IOleDocumentView_AddRef(DOCVIEW(This));
458 *ppView = DOCVIEW(This);
462 static HRESULT WINAPI OleDocument_GetDocMiscStatus(IOleDocument *iface, DWORD *pdwStatus)
464 HTMLDocument *This = OLEDOC_THIS(iface);
465 FIXME("(%p)->(%p)\n", This, pdwStatus);
469 static HRESULT WINAPI OleDocument_EnumViews(IOleDocument *iface, IEnumOleDocumentViews **ppEnum,
470 IOleDocumentView **ppView)
472 HTMLDocument *This = OLEDOC_THIS(iface);
473 FIXME("(%p)->(%p %p)\n", This, ppEnum, ppView);
479 static const IOleDocumentVtbl OleDocumentVtbl = {
480 OleDocument_QueryInterface,
483 OleDocument_CreateView,
484 OleDocument_GetDocMiscStatus,
485 OleDocument_EnumViews
488 /**********************************************************
489 * IOleCommandTarget implementation
492 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
494 static HRESULT exec_open(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
496 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
500 static HRESULT exec_new(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
502 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
506 static HRESULT exec_save(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
508 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
512 static HRESULT exec_save_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
514 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
518 static HRESULT exec_save_copy_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
520 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
524 static HRESULT exec_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
526 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
530 static HRESULT exec_print_preview(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
532 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
536 static HRESULT exec_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
538 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
542 static HRESULT exec_spell(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
544 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
548 static HRESULT exec_properties(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
550 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
554 static HRESULT exec_cut(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
556 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
560 static HRESULT exec_copy(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
562 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
566 static HRESULT exec_paste(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
568 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
572 static HRESULT exec_paste_special(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
574 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
578 static HRESULT exec_undo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
580 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
584 static HRESULT exec_rendo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
586 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
590 static HRESULT exec_select_all(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
592 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
596 static HRESULT exec_clear_selection(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
598 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
602 static HRESULT exec_zoom(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
604 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
608 static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
610 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
614 static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
616 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
620 static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
622 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
626 static HRESULT exec_stop_download(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
628 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
632 static HRESULT exec_delete(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
634 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
638 static HRESULT exec_enable_interaction(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
640 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
644 static HRESULT exec_on_unload(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
646 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
650 static HRESULT exec_show_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
652 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
656 static HRESULT exec_show_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
658 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
662 static HRESULT exec_close(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
664 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
668 static HRESULT exec_set_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
670 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
674 static HRESULT exec_get_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
676 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
680 static const struct {
682 HRESULT (*func)(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
683 } exec_table[OLECMDID_GETPRINTTEMPLATE+1] = {
685 { OLECMDF_SUPPORTED, exec_open }, /* OLECMDID_OPEN */
686 { OLECMDF_SUPPORTED, exec_new }, /* OLECMDID_NEW */
687 { OLECMDF_SUPPORTED, exec_save }, /* OLECMDID_SAVE */
688 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_save_as }, /* OLECMDID_SAVEAS */
689 { OLECMDF_SUPPORTED, exec_save_copy_as }, /* OLECMDID_SAVECOPYAS */
690 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print }, /* OLECMDID_PRINT */
691 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print_preview }, /* OLECMDID_PRINTPREVIEW */
692 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_page_setup }, /* OLECMDID_PAGESETUP */
693 { OLECMDF_SUPPORTED, exec_spell }, /* OLECMDID_SPELL */
694 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_properties }, /* OLECMDID_PROPERTIES */
695 { OLECMDF_SUPPORTED, exec_cut }, /* OLECMDID_CUT */
696 { OLECMDF_SUPPORTED, exec_copy }, /* OLECMDID_COPY */
697 { OLECMDF_SUPPORTED, exec_paste }, /* OLECMDID_PASTE */
698 { OLECMDF_SUPPORTED, exec_paste_special }, /* OLECMDID_PASTESPECIAL */
699 { OLECMDF_SUPPORTED, exec_undo }, /* OLECMDID_UNDO */
700 { OLECMDF_SUPPORTED, exec_rendo }, /* OLECMDID_REDO */
701 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_select_all }, /* OLECMDID_SELECTALL */
702 { OLECMDF_SUPPORTED, exec_clear_selection }, /* OLECMDID_CLEARSELECTION */
703 { OLECMDF_SUPPORTED, exec_zoom }, /* OLECMDID_ZOOM */
704 { OLECMDF_SUPPORTED, exec_get_zoom_range }, /* OLECMDID_GETZOOMRANGE */
706 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_refresh }, /* OLECMDID_REFRESH */
707 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_stop }, /* OLECMDID_STOP */
708 {0},{0},{0},{0},{0},{0},
709 { OLECMDF_SUPPORTED, exec_stop_download }, /* OLECMDID_STOPDOWNLOAD */
711 { OLECMDF_SUPPORTED, exec_delete }, /* OLECMDID_DELETE */
713 { OLECMDF_SUPPORTED, exec_enable_interaction }, /* OLECMDID_ENABLE_INTERACTION */
714 { OLECMDF_SUPPORTED, exec_on_unload }, /* OLECMDID_ONUNLOAD */
716 { OLECMDF_SUPPORTED, exec_show_page_setup }, /* OLECMDID_SHOWPAGESETUP */
717 { OLECMDF_SUPPORTED, exec_show_print }, /* OLECMDID_SHOWPRINT */
719 { OLECMDF_SUPPORTED, exec_close }, /* OLECMDID_CLOSE */
721 { OLECMDF_SUPPORTED, exec_set_print_template }, /* OLECMDID_SETPRINTTEMPLATE */
722 { OLECMDF_SUPPORTED, exec_get_print_template } /* OLECMDID_GETPRINTTEMPLATE */
725 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
727 HTMLDocument *This = CMDTARGET_THIS(iface);
728 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
731 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
733 HTMLDocument *This = CMDTARGET_THIS(iface);
734 return IHTMLDocument2_AddRef(HTMLDOC(This));
737 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
739 HTMLDocument *This = CMDTARGET_THIS(iface);
740 return IHTMLDocument_Release(HTMLDOC(This));
743 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
744 ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
746 HTMLDocument *This = CMDTARGET_THIS(iface);
747 HRESULT hres = S_OK, hr;
749 TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
754 for(i=0; i<cCmds; i++) {
755 if(prgCmds[i].cmdID<OLECMDID_OPEN || prgCmds[i].cmdID>OLECMDID_GETPRINTTEMPLATE) {
756 WARN("Unsupported cmdID = %ld\n", prgCmds[i].cmdID);
758 hres = OLECMDERR_E_NOTSUPPORTED;
760 if(prgCmds[i].cmdID == OLECMDID_OPEN || prgCmds[i].cmdID == OLECMDID_NEW) {
761 IOleCommandTarget *cmdtrg = NULL;
764 prgCmds[i].cmdf = OLECMDF_SUPPORTED;
766 hr = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget,
769 olecmd.cmdID = prgCmds[i].cmdID;
772 hr = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &olecmd, NULL);
773 if(SUCCEEDED(hr) && olecmd.cmdf)
774 prgCmds[i].cmdf = olecmd.cmdf;
777 ERR("This->client == NULL, native would crash\n");
780 prgCmds[i].cmdf = exec_table[prgCmds[i].cmdID].cmdf;
781 TRACE("cmdID = %ld returning %lx\n", prgCmds[i].cmdID, prgCmds[i].cmdf);
788 FIXME("Set pCmdText\n");
790 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
791 hres = OLECMDERR_E_UNKNOWNGROUP;
797 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
798 DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
800 HTMLDocument *This = CMDTARGET_THIS(iface);
803 if(nCmdID<OLECMDID_OPEN || nCmdID>OLECMDID_GETPRINTTEMPLATE || !exec_table[nCmdID].func) {
804 WARN("Unsupported cmdID = %ld\n", nCmdID);
805 return OLECMDERR_E_NOTSUPPORTED;
808 return exec_table[nCmdID].func(This, nCmdexecopt, pvaIn, pvaOut);
809 }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
810 FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID);
811 return OLECMDERR_E_UNKNOWNGROUP;
814 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
815 return OLECMDERR_E_UNKNOWNGROUP;
818 #undef CMDTARGET_THIS
820 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
821 OleCommandTarget_QueryInterface,
822 OleCommandTarget_AddRef,
823 OleCommandTarget_Release,
824 OleCommandTarget_QueryStatus,
825 OleCommandTarget_Exec
828 /**********************************************************
829 * IOleControl implementation
832 #define CONTROL_THIS(iface) DEFINE_THIS(HTMLDocument, OleControl, iface)
834 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
836 HTMLDocument *This = CONTROL_THIS(iface);
837 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
840 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
842 HTMLDocument *This = CONTROL_THIS(iface);
843 return IHTMLDocument2_AddRef(HTMLDOC(This));
846 static ULONG WINAPI OleControl_Release(IOleControl *iface)
848 HTMLDocument *This = CONTROL_THIS(iface);
849 return IHTMLDocument_Release(HTMLDOC(This));
852 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
854 HTMLDocument *This = CONTROL_THIS(iface);
855 FIXME("(%p)->(%p)\n", This, pCI);
859 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *pMsg)
861 HTMLDocument *This = CONTROL_THIS(iface);
862 FIXME("(%p)->(%p)\n", This, pMsg);
866 static HRESULT get_property(IOleClientSite *client, DISPID dispid, VARIANT *res)
868 IDispatch *disp = NULL;
869 DISPPARAMS dispparams = {NULL, 0};
873 hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp);
875 TRACE("Could not get IDispatch\n");
881 hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
882 DISPATCH_PROPERTYGET, &dispparams, res, NULL, &err);
884 IDispatch_Release(disp);
889 static HRESULT on_change_dlcontrol(HTMLDocument *This)
894 hres = get_property(This->client, DISPID_AMBIENT_DLCONTROL, &res);
896 FIXME("unsupported dlcontrol %08lx\n", V_I4(&res));
901 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
903 HTMLDocument *This = CONTROL_THIS(iface);
908 TRACE("This->client = NULL\n");
913 case DISPID_AMBIENT_USERMODE:
914 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This);
915 hres = get_property(This->client, DISPID_AMBIENT_USERMODE, &res);
919 if(V_VT(&res) == VT_BOOL) {
921 FIXME("edit mode is not supported\n");
925 FIXME("V_VT(res)=%d\n", V_VT(&res));
928 case DISPID_AMBIENT_DLCONTROL:
929 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This);
930 return on_change_dlcontrol(This);
931 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
932 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This);
933 on_change_dlcontrol(This);
934 hres = get_property(This->client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &res);
938 if(V_VT(&res) == VT_BOOL) {
940 FIXME("offline connection is not supported\n");
944 FIXME("V_VT(res)=%d\n", V_VT(&res));
947 case DISPID_AMBIENT_SILENT:
948 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This);
949 on_change_dlcontrol(This);
950 hres = get_property(This->client, DISPID_AMBIENT_SILENT, &res);
954 if(V_VT(&res) == VT_BOOL) {
956 FIXME("silent mode is not supported\n");
960 FIXME("V_VT(res)=%d\n", V_VT(&res));
963 case DISPID_AMBIENT_USERAGENT:
964 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This);
965 hres = get_property(This->client, DISPID_AMBIENT_USERAGENT, &res);
969 FIXME("not supported AMBIENT_USERAGENT\n");
972 case DISPID_AMBIENT_PALETTE:
973 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This);
974 hres = get_property(This->client, DISPID_AMBIENT_PALETTE, &res);
978 FIXME("not supported AMBIENT_PALETTE\n");
983 FIXME("(%p) unsupported dispID=%ld\n", This, dispID);
987 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
989 HTMLDocument *This = CONTROL_THIS(iface);
990 FIXME("(%p)->(%x)\n", This, bFreeze);
996 static const IOleControlVtbl OleControlVtbl = {
997 OleControl_QueryInterface,
1000 OleControl_GetControlInfo,
1001 OleControl_OnMnemonic,
1002 OleControl_OnAmbientPropertyChange,
1003 OleControl_FreezeEvents
1006 void HTMLDocument_OleObj_Init(HTMLDocument *This)
1008 This->lpOleObjectVtbl = &OleObjectVtbl;
1009 This->lpOleDocumentVtbl = &OleDocumentVtbl;
1010 This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
1011 This->lpOleControlVtbl = &OleControlVtbl;
1013 This->client = NULL;
1014 This->hostui = NULL;
1016 This->has_key_path = FALSE;