MSHMTL: Added IOleCommandTarget::Exec implementation

Jacek Caban jack at itma.pwr.wroc.pl
Wed Aug 3 14:40:15 CDT 2005


Changelog:
    Added IOleCommandTarget::Exec implementation
-------------- next part --------------
Index: dlls/mshtml/oleobj.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/oleobj.c,v
retrieving revision 1.11
diff -u -p -r1.11 oleobj.c
--- dlls/mshtml/oleobj.c	2 Aug 2005 09:50:20 -0000	1.11
+++ dlls/mshtml/oleobj.c	3 Aug 2005 19:34:03 -0000
@@ -464,46 +464,235 @@ static const IOleDocumentVtbl OleDocumen
 
 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
 
-static const OLECMDF status_table[OLECMDID_GETPRINTTEMPLATE+1] = {
-    0,
-    OLECMDF_SUPPORTED,                  /* OLECMDID_OPEN */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_NEW */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_SAVE */
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SAVEAS */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_SAVECOPYAS */
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINT */
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINTPREVIEW */
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PAGESETUP */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_SPELL */
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PROPERTIES */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_CUT */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_COPY */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_PASTE */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_PASTESPECIAL */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_UNDO */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_RENDO */
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SELECTALL */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_CLEARSELECTION */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_ZOOM */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_GETZOOMRANGE */
-    0,
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_REFRESH */
-    OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_STOP */
-    0,0,0,0,0,0,
-    OLECMDF_SUPPORTED,                  /* OLECMDID_STOPDOWNLOAD */
-    0,0,
-    OLECMDF_SUPPORTED,                  /* OLECMDID_DELETE */
-    0,0,
-    OLECMDF_SUPPORTED,                  /* OLECMDID_ENABLE_INTERACTION */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_ONUNLOAD */
-    0,0,0,0,0,
-    OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPAGESETUP */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPRINT */
-    0,0,
-    OLECMDF_SUPPORTED,                  /* OLECMDID_CLOSE */
-    0,0,0,
-    OLECMDF_SUPPORTED,                  /* OLECMDID_SETPRINTTEMPLATE */
-    OLECMDF_SUPPORTED                   /* OLECMDID_GETPRINTTEMPLATE */
+static HRESULT exec_open(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_new(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_save(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_save_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_save_copy_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_print_preview(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_spell(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_properties(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_cut(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_copy(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_paste(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_paste_special(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_undo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_rendo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_select_all(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_clear_selection(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_zoom(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_stop_download(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_delete(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_enable_interaction(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_on_unload(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_show_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_show_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_close(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_set_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static HRESULT exec_get_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
+{
+    FIXME("(%p)->(%ld %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
+    return E_NOTIMPL;
+}
+
+static const struct {
+    OLECMDF cmdf;
+    HRESULT (*func)(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
+} exec_table[OLECMDID_GETPRINTTEMPLATE+1] = {
+    {0},
+    { OLECMDF_SUPPORTED,                  exec_open                 }, /* OLECMDID_OPEN */
+    { OLECMDF_SUPPORTED,                  exec_new                  }, /* OLECMDID_NEW */
+    { OLECMDF_SUPPORTED,                  exec_save                 }, /* OLECMDID_SAVE */
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_save_as              }, /* OLECMDID_SAVEAS */
+    { OLECMDF_SUPPORTED,                  exec_save_copy_as         }, /* OLECMDID_SAVECOPYAS */
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_print                }, /* OLECMDID_PRINT */
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_print_preview        }, /* OLECMDID_PRINTPREVIEW */
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_page_setup           }, /* OLECMDID_PAGESETUP */
+    { OLECMDF_SUPPORTED,                  exec_spell                }, /* OLECMDID_SPELL */
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_properties           }, /* OLECMDID_PROPERTIES */
+    { OLECMDF_SUPPORTED,                  exec_cut                  }, /* OLECMDID_CUT */
+    { OLECMDF_SUPPORTED,                  exec_copy                 }, /* OLECMDID_COPY */
+    { OLECMDF_SUPPORTED,                  exec_paste                }, /* OLECMDID_PASTE */
+    { OLECMDF_SUPPORTED,                  exec_paste_special        }, /* OLECMDID_PASTESPECIAL */
+    { OLECMDF_SUPPORTED,                  exec_undo                 }, /* OLECMDID_UNDO */
+    { OLECMDF_SUPPORTED,                  exec_rendo                }, /* OLECMDID_REDO */
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_select_all           }, /* OLECMDID_SELECTALL */
+    { OLECMDF_SUPPORTED,                  exec_clear_selection      }, /* OLECMDID_CLEARSELECTION */
+    { OLECMDF_SUPPORTED,                  exec_zoom                 }, /* OLECMDID_ZOOM */
+    { OLECMDF_SUPPORTED,                  exec_get_zoom_range       }, /* OLECMDID_GETZOOMRANGE */
+    {0},
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_refresh              }, /* OLECMDID_REFRESH */
+    { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_stop                 }, /* OLECMDID_STOP */
+    {0},{0},{0},{0},{0},{0},
+    { OLECMDF_SUPPORTED,                  exec_stop_download        }, /* OLECMDID_STOPDOWNLOAD */
+    {0},{0},
+    { OLECMDF_SUPPORTED,                  exec_delete               }, /* OLECMDID_DELETE */
+    {0},{0},
+    { OLECMDF_SUPPORTED,                  exec_enable_interaction   }, /* OLECMDID_ENABLE_INTERACTION */
+    { OLECMDF_SUPPORTED,                  exec_on_unload            }, /* OLECMDID_ONUNLOAD */
+    {0},{0},{0},{0},{0},
+    { OLECMDF_SUPPORTED,                  exec_show_page_setup      }, /* OLECMDID_SHOWPAGESETUP */
+    { OLECMDF_SUPPORTED,                  exec_show_print           }, /* OLECMDID_SHOWPRINT */
+    {0},{0},
+    { OLECMDF_SUPPORTED,                  exec_close                }, /* OLECMDID_CLOSE */
+    {0},{0},{0},
+    { OLECMDF_SUPPORTED,                  exec_set_print_template   }, /* OLECMDID_SETPRINTTEMPLATE */
+    { OLECMDF_SUPPORTED,                  exec_get_print_template   }  /* OLECMDID_GETPRINTTEMPLATE */
 };
 
 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
@@ -541,7 +730,7 @@ static HRESULT WINAPI OleCommandTarget_Q
                 prgCmds[i].cmdf = 0;
                 hres = OLECMDERR_E_NOTSUPPORTED;
             }else {
-                prgCmds[i].cmdf = status_table[prgCmds[i].cmdID];
+                prgCmds[i].cmdf = exec_table[prgCmds[i].cmdID].cmdf;
                 TRACE("cmdID = %ld  returning %lx\n", prgCmds[i].cmdID, prgCmds[i].cmdID);
                 hres = S_OK;
             }
@@ -561,9 +750,18 @@ static HRESULT WINAPI OleCommandTarget_E
         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
 {
     HTMLDocument *This = CMDTARGET_THIS(iface);
-    FIXME("(%p)->(%s %ld %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID, nCmdexecopt,
-            pvaIn, pvaOut);
-    return E_NOTIMPL;
+
+    if(!pguidCmdGroup) {
+        if(nCmdID<OLECMDID_OPEN || nCmdID>OLECMDID_GETPRINTTEMPLATE || !exec_table[nCmdID].func) {
+            WARN("Unsupported cmdID = %ld\n", nCmdID);
+            return OLECMDERR_E_NOTSUPPORTED;
+        }
+
+        return exec_table[nCmdID].func(This, nCmdexecopt, pvaIn, pvaOut);
+    }
+
+    FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
+    return OLECMDERR_E_UNKNOWNGROUP;
 }
 
 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
Index: dlls/mshtml/tests/htmldoc.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/tests/htmldoc.c,v
retrieving revision 1.6
diff -u -p -r1.6 htmldoc.c
--- dlls/mshtml/tests/htmldoc.c	2 Aug 2005 09:50:19 -0000	1.6
+++ dlls/mshtml/tests/htmldoc.c	3 Aug 2005 19:34:03 -0000
@@ -823,7 +823,7 @@ static const OLECMDF expect_cmds[OLECMDI
     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTE */
     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTESPECIAL */
     OLECMDF_SUPPORTED,                  /* OLECMDID_UNDO */
-    OLECMDF_SUPPORTED,                  /* OLECMDID_RENDO */
+    OLECMDF_SUPPORTED,                  /* OLECMDID_REDO */
     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SELECTALL */
     OLECMDF_SUPPORTED,                  /* OLECMDID_CLEARSELECTION */
     OLECMDF_SUPPORTED,                  /* OLECMDID_ZOOM */
@@ -958,6 +958,8 @@ static void test_HTMLDocument(void)
     }
 
     if(cmdtrg) {
+        int i;
+    
         OLECMD cmd[2] = {
             {OLECMDID_OPEN, 0xf0f0},
             {OLECMDID_GETPRINTTEMPLATE+1, 0xf0f0}
@@ -978,6 +980,20 @@ static void test_HTMLDocument(void)
         hres = IOleCommandTarget_QueryStatus(cmdtrg, &IID_IHTMLDocument2, 2, cmd, NULL);
         ok(hres == OLECMDERR_E_UNKNOWNGROUP,
                 "QueryStatus failed: %08lx, expected OLECMDERR_E_UNKNOWNGROUP\n", hres);
+
+        for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
+            if(!expect_cmds[i]) {
+                hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_UPDATECOMMANDS,
+                    OLECMDEXECOPT_DODEFAULT, NULL, NULL);
+                ok(hres == OLECMDERR_E_NOTSUPPORTED,
+                        "Exec failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
+            }
+        }
+
+        hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_GETPRINTTEMPLATE+1, 
+                OLECMDEXECOPT_DODEFAULT, NULL, NULL);
+        ok(hres == OLECMDERR_E_NOTSUPPORTED,
+                "Exec failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
 
         test_OleCommandTarget(cmdtrg);
     }


More information about the wine-patches mailing list