kernel: Check for an exe which is always present in a system dir.
[wine.git] / dlls / mshtml / olecmd.c
blob3ee069e31b31ce60d795f48ab2b9e3b3dee6a424
1 /*
2 * Copyright 2005-2006 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "config.h"
21 #include <stdarg.h>
22 #include <stdio.h>
24 #define COBJMACROS
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "ole2.h"
30 #include "shlguid.h"
31 #include "mshtmdid.h"
32 #include "idispids.h"
34 #include "wine/debug.h"
36 #include "mshtml_private.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
40 /**********************************************************
41 * IOleCommandTarget implementation
44 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
46 static HRESULT exec_open(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
48 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
49 return E_NOTIMPL;
52 static HRESULT exec_new(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
54 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
55 return E_NOTIMPL;
58 static HRESULT exec_save(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
60 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
61 return E_NOTIMPL;
64 static HRESULT exec_save_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
66 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
67 return E_NOTIMPL;
70 static HRESULT exec_save_copy_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
72 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
73 return E_NOTIMPL;
76 static HRESULT exec_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
78 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
79 return E_NOTIMPL;
82 static HRESULT exec_print_preview(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
84 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
85 return E_NOTIMPL;
88 static HRESULT exec_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
90 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
91 return E_NOTIMPL;
94 static HRESULT exec_spell(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
96 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
97 return E_NOTIMPL;
100 static HRESULT exec_properties(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
102 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
103 return E_NOTIMPL;
106 static HRESULT exec_cut(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
108 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
109 return E_NOTIMPL;
112 static HRESULT exec_copy(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
114 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
115 return E_NOTIMPL;
118 static HRESULT exec_paste(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
120 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
121 return E_NOTIMPL;
124 static HRESULT exec_paste_special(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
126 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
127 return E_NOTIMPL;
130 static HRESULT exec_undo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
132 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
133 return E_NOTIMPL;
136 static HRESULT exec_rendo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
138 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
139 return E_NOTIMPL;
142 static HRESULT exec_select_all(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
144 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
145 return E_NOTIMPL;
148 static HRESULT exec_clear_selection(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
150 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
151 return E_NOTIMPL;
154 static HRESULT exec_zoom(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
156 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
157 return E_NOTIMPL;
160 static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
162 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
163 return E_NOTIMPL;
166 static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
168 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
169 return E_NOTIMPL;
172 static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
174 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
175 return E_NOTIMPL;
178 static HRESULT exec_stop_download(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
180 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
181 return E_NOTIMPL;
184 static HRESULT exec_delete(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
186 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
187 return E_NOTIMPL;
190 static HRESULT exec_enable_interaction(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
192 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
193 return E_NOTIMPL;
196 static HRESULT exec_on_unload(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
198 TRACE("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
200 /* Tests show that we have nothing more to do here */
202 if(pvaOut) {
203 V_VT(pvaOut) = VT_BOOL;
204 V_BOOL(pvaOut) = VARIANT_TRUE;
207 return S_OK;
210 static HRESULT exec_show_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
212 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
213 return E_NOTIMPL;
216 static HRESULT exec_show_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
218 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
219 return E_NOTIMPL;
222 static HRESULT exec_close(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
224 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
225 return E_NOTIMPL;
228 static HRESULT exec_set_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
230 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
231 return E_NOTIMPL;
234 static HRESULT exec_get_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
236 FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
237 return E_NOTIMPL;
240 static const struct {
241 OLECMDF cmdf;
242 HRESULT (*func)(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
243 } exec_table[OLECMDID_GETPRINTTEMPLATE+1] = {
244 {0},
245 { OLECMDF_SUPPORTED, exec_open }, /* OLECMDID_OPEN */
246 { OLECMDF_SUPPORTED, exec_new }, /* OLECMDID_NEW */
247 { OLECMDF_SUPPORTED, exec_save }, /* OLECMDID_SAVE */
248 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_save_as }, /* OLECMDID_SAVEAS */
249 { OLECMDF_SUPPORTED, exec_save_copy_as }, /* OLECMDID_SAVECOPYAS */
250 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print }, /* OLECMDID_PRINT */
251 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_print_preview }, /* OLECMDID_PRINTPREVIEW */
252 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_page_setup }, /* OLECMDID_PAGESETUP */
253 { OLECMDF_SUPPORTED, exec_spell }, /* OLECMDID_SPELL */
254 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_properties }, /* OLECMDID_PROPERTIES */
255 { OLECMDF_SUPPORTED, exec_cut }, /* OLECMDID_CUT */
256 { OLECMDF_SUPPORTED, exec_copy }, /* OLECMDID_COPY */
257 { OLECMDF_SUPPORTED, exec_paste }, /* OLECMDID_PASTE */
258 { OLECMDF_SUPPORTED, exec_paste_special }, /* OLECMDID_PASTESPECIAL */
259 { OLECMDF_SUPPORTED, exec_undo }, /* OLECMDID_UNDO */
260 { OLECMDF_SUPPORTED, exec_rendo }, /* OLECMDID_REDO */
261 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_select_all }, /* OLECMDID_SELECTALL */
262 { OLECMDF_SUPPORTED, exec_clear_selection }, /* OLECMDID_CLEARSELECTION */
263 { OLECMDF_SUPPORTED, exec_zoom }, /* OLECMDID_ZOOM */
264 { OLECMDF_SUPPORTED, exec_get_zoom_range }, /* OLECMDID_GETZOOMRANGE */
265 {0},
266 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_refresh }, /* OLECMDID_REFRESH */
267 { OLECMDF_SUPPORTED|OLECMDF_ENABLED, exec_stop }, /* OLECMDID_STOP */
268 {0},{0},{0},{0},{0},{0},
269 { OLECMDF_SUPPORTED, exec_stop_download }, /* OLECMDID_STOPDOWNLOAD */
270 {0},{0},
271 { OLECMDF_SUPPORTED, exec_delete }, /* OLECMDID_DELETE */
272 {0},{0},
273 { OLECMDF_SUPPORTED, exec_enable_interaction }, /* OLECMDID_ENABLE_INTERACTION */
274 { OLECMDF_SUPPORTED, exec_on_unload }, /* OLECMDID_ONUNLOAD */
275 {0},{0},{0},{0},{0},
276 { OLECMDF_SUPPORTED, exec_show_page_setup }, /* OLECMDID_SHOWPAGESETUP */
277 { OLECMDF_SUPPORTED, exec_show_print }, /* OLECMDID_SHOWPRINT */
278 {0},{0},
279 { OLECMDF_SUPPORTED, exec_close }, /* OLECMDID_CLOSE */
280 {0},{0},{0},
281 { OLECMDF_SUPPORTED, exec_set_print_template }, /* OLECMDID_SETPRINTTEMPLATE */
282 { OLECMDF_SUPPORTED, exec_get_print_template } /* OLECMDID_GETPRINTTEMPLATE */
285 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
287 HTMLDocument *This = CMDTARGET_THIS(iface);
288 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
291 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
293 HTMLDocument *This = CMDTARGET_THIS(iface);
294 return IHTMLDocument2_AddRef(HTMLDOC(This));
297 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
299 HTMLDocument *This = CMDTARGET_THIS(iface);
300 return IHTMLDocument_Release(HTMLDOC(This));
303 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
304 ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
306 HTMLDocument *This = CMDTARGET_THIS(iface);
307 HRESULT hres = S_OK, hr;
309 TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
311 if(!pguidCmdGroup) {
312 ULONG i;
314 for(i=0; i<cCmds; i++) {
315 if(prgCmds[i].cmdID<OLECMDID_OPEN || prgCmds[i].cmdID>OLECMDID_GETPRINTTEMPLATE) {
316 WARN("Unsupported cmdID = %ld\n", prgCmds[i].cmdID);
317 prgCmds[i].cmdf = 0;
318 hres = OLECMDERR_E_NOTSUPPORTED;
319 }else {
320 if(prgCmds[i].cmdID == OLECMDID_OPEN || prgCmds[i].cmdID == OLECMDID_NEW) {
321 IOleCommandTarget *cmdtrg = NULL;
322 OLECMD olecmd;
324 prgCmds[i].cmdf = OLECMDF_SUPPORTED;
325 if(This->client) {
326 hr = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget,
327 (void**)&cmdtrg);
328 if(SUCCEEDED(hr)) {
329 olecmd.cmdID = prgCmds[i].cmdID;
330 olecmd.cmdf = 0;
332 hr = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &olecmd, NULL);
333 if(SUCCEEDED(hr) && olecmd.cmdf)
334 prgCmds[i].cmdf = olecmd.cmdf;
336 }else {
337 ERR("This->client == NULL, native would crash\n");
339 }else {
340 prgCmds[i].cmdf = exec_table[prgCmds[i].cmdID].cmdf;
341 TRACE("cmdID = %ld returning %lx\n", prgCmds[i].cmdID, prgCmds[i].cmdf);
343 hres = S_OK;
347 if(pCmdText)
348 FIXME("Set pCmdText\n");
349 }else {
350 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
351 hres = OLECMDERR_E_UNKNOWNGROUP;
354 return hres;
357 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
358 DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
360 HTMLDocument *This = CMDTARGET_THIS(iface);
362 if(!pguidCmdGroup) {
363 if(nCmdID<OLECMDID_OPEN || nCmdID>OLECMDID_GETPRINTTEMPLATE || !exec_table[nCmdID].func) {
364 WARN("Unsupported cmdID = %ld\n", nCmdID);
365 return OLECMDERR_E_NOTSUPPORTED;
368 return exec_table[nCmdID].func(This, nCmdexecopt, pvaIn, pvaOut);
369 }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
370 FIXME("unsupported nCmdID %ld of CGID_Explorer group\n", nCmdID);
371 TRACE("%p %p\n", pvaIn, pvaOut);
372 return OLECMDERR_E_NOTSUPPORTED;
373 }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
374 FIXME("unsupported nCmdID %ld of CGID_ShellDocView group\n", nCmdID);
375 return OLECMDERR_E_NOTSUPPORTED;
378 FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
379 return OLECMDERR_E_UNKNOWNGROUP;
382 #undef CMDTARGET_THIS
384 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
385 OleCommandTarget_QueryInterface,
386 OleCommandTarget_AddRef,
387 OleCommandTarget_Release,
388 OleCommandTarget_QueryStatus,
389 OleCommandTarget_Exec
392 void HTMLDocument_OleCmd_Init(HTMLDocument *This)
394 This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;