Nikolay Sivov : msxml3: Make propputref methods invocable with DISPATCH_PROPERTYPUT.
Alexandre Julliard
julliard at winehq.org
Fri Mar 7 11:02:57 CST 2014
Module: wine
Branch: master
Commit: d7aee26d7fd012d9bbf810f8e85e7995a668cb67
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7aee26d7fd012d9bbf810f8e85e7995a668cb67
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Mar 7 12:07:27 2014 +0400
msxml3: Make propputref methods invocable with DISPATCH_PROPERTYPUT.
---
dlls/msxml3/dispex.c | 27 ++++++++++++++
dlls/msxml3/tests/saxreader.c | 82 +++++++++++++++++++++++++++++------------
2 files changed, 86 insertions(+), 23 deletions(-)
diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c
index 78d4c0c..a080a8b 100644
--- a/dlls/msxml3/dispex.c
+++ b/dlls/msxml3/dispex.c
@@ -32,6 +32,7 @@
#include "winnls.h"
#include "ole2.h"
#include "msxml6.h"
+#include "msxml6did.h"
#include "wininet.h"
#include "urlmon.h"
#include "winreg.h"
@@ -519,6 +520,30 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
return DISP_E_UNKNOWNNAME;
}
+static BOOL is_propputref_id(DISPID id)
+{
+ switch (id)
+ {
+ case DISPID_DOM_DOCUMENT_DOCUMENTELEMENT:
+ case DISPID_XMLDOM_DOCUMENT2_SCHEMAS:
+ case DISPID_XMLDOM_SELECTION_CONTEXT:
+ case DISPID_XMLDOM_TEMPLATE_STYLESHEET:
+ case DISPID_SAX_CONTENTHANDLER_DOCUMENTLOCATOR:
+ case DISPID_SAX_XMLFILTER_PARENT:
+ case DISPID_SAX_XMLREADER_ENTITYRESOLVER:
+ case DISPID_SAX_XMLREADER_CONTENTHANDLER:
+ case DISPID_SAX_XMLREADER_DTDHANDLER:
+ case DISPID_SAX_XMLREADER_ERRORHANDLER:
+ case DISPID_MXXML_FILTER_ENTITYRESOLVER:
+ case DISPID_MXXML_FILTER_CONTENTHANDLER:
+ case DISPID_MXXML_FILTER_DTDHANDLER:
+ case DISPID_MXXML_FILTER_ERRORHANDLER:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{
@@ -601,6 +626,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
return E_FAIL;
}
+ if (is_propputref_id(id) && wFlags == DISPATCH_PROPERTYPUT)
+ wFlags = DISPATCH_PROPERTYPUTREF;
hres = ITypeInfo_Invoke(ti, unk, id, wFlags, pdp, pvarRes, pei, &argerr);
ITypeInfo_Release(ti);
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 5891b55..42e4ec0 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -4432,31 +4432,67 @@ static void test_obj_dispex(IUnknown *obj)
IDispatchEx_Release(dispex);
}
-static void test_dispex(void)
+static void test_saxreader_dispex(void)
{
- IVBSAXXMLReader *vbreader;
- ISAXXMLReader *reader;
- IUnknown *unk;
- HRESULT hr;
+ IVBSAXXMLReader *vbreader;
+ ISAXXMLReader *reader;
+ DISPPARAMS dispparams;
+ DISPID dispid;
+ IUnknown *unk;
+ VARIANT arg;
+ HRESULT hr;
- hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER,
+ hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER,
&IID_ISAXXMLReader, (void**)&reader);
- EXPECT_HR(hr, S_OK);
-
- hr = ISAXXMLReader_QueryInterface(reader, &IID_IUnknown, (void**)&unk);
- EXPECT_HR(hr, S_OK);
- test_obj_dispex(unk);
- IUnknown_Release(unk);
-
- hr = ISAXXMLReader_QueryInterface(reader, &IID_IVBSAXXMLReader, (void**)&vbreader);
- EXPECT_HR(hr, S_OK);
- hr = IVBSAXXMLReader_QueryInterface(vbreader, &IID_IUnknown, (void**)&unk);
- EXPECT_HR(hr, S_OK);
- test_obj_dispex(unk);
- IUnknown_Release(unk);
- IVBSAXXMLReader_Release(vbreader);
-
- ISAXXMLReader_Release(reader);
+ EXPECT_HR(hr, S_OK);
+
+ hr = ISAXXMLReader_QueryInterface(reader, &IID_IUnknown, (void**)&unk);
+ EXPECT_HR(hr, S_OK);
+ test_obj_dispex(unk);
+ IUnknown_Release(unk);
+
+ hr = ISAXXMLReader_QueryInterface(reader, &IID_IVBSAXXMLReader, (void**)&vbreader);
+ EXPECT_HR(hr, S_OK);
+ hr = IVBSAXXMLReader_QueryInterface(vbreader, &IID_IUnknown, (void**)&unk);
+ EXPECT_HR(hr, S_OK);
+ test_obj_dispex(unk);
+ IUnknown_Release(unk);
+
+ dispid = DISPID_PROPERTYPUT;
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 1;
+ dispparams.rgdispidNamedArgs = &dispid;
+ dispparams.rgvarg = &arg;
+
+ V_VT(&arg) = VT_DISPATCH;
+ V_DISPATCH(&arg) = NULL;
+
+ /* propputref is callable as PROPERTYPUT and PROPERTYPUTREF */
+ hr = IVBSAXXMLReader_Invoke(vbreader,
+ DISPID_SAX_XMLREADER_CONTENTHANDLER,
+ &IID_NULL,
+ 0,
+ DISPATCH_PROPERTYPUT,
+ &dispparams,
+ NULL,
+ NULL,
+ NULL);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = IVBSAXXMLReader_Invoke(vbreader,
+ DISPID_SAX_XMLREADER_CONTENTHANDLER,
+ &IID_NULL,
+ 0,
+ DISPATCH_PROPERTYPUTREF,
+ &dispparams,
+ NULL,
+ NULL,
+ NULL);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ IVBSAXXMLReader_Release(vbreader);
+
+ ISAXXMLReader_Release(reader);
}
static void test_mxwriter_dispex(void)
@@ -5518,7 +5554,7 @@ START_TEST(saxreader)
test_saxreader_properties();
test_saxreader_features();
test_saxreader_encoding();
- test_dispex();
+ test_saxreader_dispex();
/* MXXMLWriter tests */
get_class_support_data(mxwriter_support_data, &IID_IMXWriter);
More information about the wine-cvs
mailing list