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