Module: wine Branch: master Commit: d7aee26d7fd012d9bbf810f8e85e7995a668cb67 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7aee26d7fd012d9bbf810f8e8...
Author: Nikolay Sivov nsivov@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);