MSHMTL: Added QueryStatus implementation

Jacek Caban jack at itma.pwr.wroc.pl
Mon Aug 1 17:39:15 CDT 2005


Changelog:
    Added QueryStatus implementation
-------------- next part --------------
Index: dlls/mshtml/oleobj.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/oleobj.c,v
retrieving revision 1.10
diff -u -p -r1.10 oleobj.c
--- dlls/mshtml/oleobj.c	18 Jul 2005 09:13:32 -0000	1.10
+++ dlls/mshtml/oleobj.c	1 Aug 2005 22:33:36 -0000
@@ -464,6 +464,48 @@ static const IOleDocumentVtbl OleDocumen
 
 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
 
+static 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 WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
 {
     HTMLDocument *This = CMDTARGET_THIS(iface);
@@ -486,8 +528,33 @@ static HRESULT WINAPI OleCommandTarget_Q
         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
 {
     HTMLDocument *This = CMDTARGET_THIS(iface);
-    FIXME("(%p)->(%s %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
-    return E_NOTIMPL;
+    HRESULT hres = S_OK;
+
+    TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
+
+    if(!pguidCmdGroup) {
+        ULONG i;
+
+        for(i=0; i<cCmds; i++) {
+            if(prgCmds[i].cmdID<OLECMDID_OPEN || prgCmds[i].cmdID>OLECMDID_GETPRINTTEMPLATE) {
+                WARN("Unsupported cmdID = %ld\n", prgCmds[i].cmdID);
+                prgCmds[i].cmdf = 0;
+                hres = OLECMDERR_E_NOTSUPPORTED;
+            }else {
+                prgCmds[i].cmdf = status_table[prgCmds[i].cmdID];
+                TRACE("cmdID = %ld  returning %lx\n", prgCmds[i].cmdID, prgCmds[i].cmdID);
+                hres = S_OK;
+            }
+        }
+
+        if(pguidCmdGroup)
+            FIXME("Set pCmdText\n");
+    }else {
+        FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
+        hres = OLECMDERR_E_UNKNOWNGROUP;
+    }
+
+    return hres;
 }
 
 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
Index: dlls/mshtml/tests/htmldoc.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/tests/htmldoc.c,v
retrieving revision 1.5
diff -u -p -r1.5 htmldoc.c
--- dlls/mshtml/tests/htmldoc.c	26 Jul 2005 10:31:23 -0000	1.5
+++ dlls/mshtml/tests/htmldoc.c	1 Aug 2005 22:33:37 -0000
@@ -806,12 +806,76 @@ static void test_Persist()
     }
 }
 
+static OLECMDF expect_cmds[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 void test_OleCommandTarget(IOleCommandTarget *cmdtrg)
+{
+    OLECMD cmds[OLECMDID_GETPRINTTEMPLATE];
+    int i;
+    HRESULT hres;
+
+    for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
+        cmds[i].cmdID = i+1;
+        cmds[i].cmdf = 0xf0f0;
+    }
+
+    hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, sizeof(cmds)/sizeof(cmds[0]), cmds, NULL);
+    ok(hres == S_OK, "QueryStatus failed: %08lx\n", hres);
+
+    for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
+        ok(cmds[i].cmdID == i+1, "cmds[%d].cmdID canged to %lx\n", i, cmds[i].cmdID);
+        ok(cmds[i].cmdf == expect_cmds[i+1], "cmds[%d].cmdf=%lx, expected %x\n",
+                i+1, cmds[i].cmdf, expect_cmds[i+1]);
+    }
+}
+
 static void test_HTMLDocument(void)
 {
     IOleObject *oleobj = NULL;
     IOleClientSite *clientsite = (LPVOID)0xdeadbeef;
     IOleInPlaceObjectWindowless *windowlessobj = NULL;
     IOleInPlaceActiveObject *activeobject = NULL;
+    IOleCommandTarget *cmdtrg = NULL;
     GUID guid;
     RECT rect = {0,0,500,500};
     HRESULT hres;
@@ -844,7 +908,10 @@ static void test_HTMLDocument(void)
     hres = IUnknown_QueryInterface(htmldoc_unk, &IID_IOleInPlaceObjectWindowless,
             (void**)&windowlessobj);
     ok(hres == S_OK, "Could not get IOleInPlaceObjectWindowless interface: %08lx\n", hres);
-             
+
+    hres = IUnknown_QueryInterface(htmldoc_unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
+    ok(hres == S_OK, "could not get IOleCommandTarget: %08lx\n", hres);
+
     hres = IUnknown_QueryInterface(htmldoc_unk, &IID_IOleObject, (void**)&oleobj);
     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres);
     if(oleobj) {
@@ -890,6 +957,31 @@ static void test_HTMLDocument(void)
         CHECK_CALLED(ActivateMe);
     }
 
+    if(cmdtrg) {
+        OLECMD cmd[2] = {
+            {OLECMDID_OPEN, 0xf0f0},
+            {OLECMDID_GETPRINTTEMPLATE+1, 0xf0f0}
+        };
+    
+        hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 0, NULL, NULL);
+        ok(hres == S_OK, "QueryStatus failed: %08lx\n", hres);
+    
+        hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmd, NULL);
+        ok(hres == OLECMDERR_E_NOTSUPPORTED,
+                "QueryStatus failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
+        ok(cmd[1].cmdID == OLECMDID_GETPRINTTEMPLATE+1,
+                "cmd[0].cmdID=%ld, expected OLECMDID_GETPRINTTEMPLATE+1\n", cmd[0].cmdID);
+        ok(cmd[1].cmdf == 0, "cmd[0].cmdf=%lx, expected 0\n", cmd[0].cmdf);
+        ok(cmd[0].cmdf == OLECMDF_SUPPORTED,
+                "cmd[1].cmdf=%lx, expected OLECMDF_SUPPORTED\n", cmd[1].cmdf);
+
+        hres = IOleCommandTarget_QueryStatus(cmdtrg, &IID_IHTMLDocument2, 2, cmd, NULL);
+        ok(hres == OLECMDERR_E_UNKNOWNGROUP,
+                "QueryStatus failed: %08lx, expected OLECMDERR_E_UNKNOWNGROUP\n", hres);
+
+        test_OleCommandTarget(cmdtrg);
+    }
+
     hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobject);
     ok(hres == S_OK, "Could not get IOleInPlaceActiveObject interface: %08lx\n", hres);
 
@@ -912,6 +1004,9 @@ static void test_HTMLDocument(void)
         CHECK_CALLED(OnUIDeactivate);
     }
 
+    if(cmdtrg)
+        test_OleCommandTarget(cmdtrg);
+
     if(activeobject) {
         HWND tmp_hwnd;
         hres = IOleInPlaceActiveObject_GetWindow(activeobject, &tmp_hwnd);
@@ -926,6 +1021,9 @@ static void test_HTMLDocument(void)
         CHECK_CALLED(OnInPlaceDeactivate);
     }
 
+    /* Calling test_OleCommandTarget here couses Segmentation Fault with native
+     * MSHTML. It doesn't with Wine. */
+
     if(activeobject) {
         HWND tmp_hwnd;
         hres = IOleInPlaceActiveObject_GetWindow(activeobject, &tmp_hwnd);
@@ -1015,6 +1113,9 @@ static void test_HTMLDocument(void)
         ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
     }
 
+    if(cmdtrg)
+        test_OleCommandTarget(cmdtrg);
+
     if(view) {
         SET_EXPECT(SetActiveObject);
         SET_EXPECT(HideUI);
@@ -1067,6 +1168,8 @@ static void test_HTMLDocument(void)
         ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
     }
 
+    if(cmdtrg)
+        IOleCommandTarget_Release(cmdtrg);
     if(windowlessobj)
         IOleInPlaceObjectWindowless_Release(windowlessobj);
     if(oleobj)


More information about the wine-patches mailing list