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