Jacek Caban : mshtml: Don't use ITypeInfo for InvokeEx(DISPATCH_PROPERTYPUT ) implementation.

Alexandre Julliard julliard at winehq.org
Tue Mar 13 13:50:37 CDT 2012


Module: wine
Branch: master
Commit: ba1d4d71d8d89dd19d9a0d83b676f36036299423
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ba1d4d71d8d89dd19d9a0d83b676f36036299423

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Mar 13 11:46:55 2012 +0100

mshtml: Don't use ITypeInfo for InvokeEx(DISPATCH_PROPERTYPUT) implementation.

---

 dlls/mshtml/dispex.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 88f10c3..29628eb 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -810,6 +810,54 @@ static HRESULT builtin_propget(DispatchEx *This, func_info_t *func, DISPPARAMS *
     return S_OK;
 }
 
+static HRESULT builtin_propput(DispatchEx *This, func_info_t *func, DISPPARAMS *dp)
+{
+    VARIANT *v, tmpv;
+    IUnknown *iface;
+    HRESULT hres;
+
+    if(dp->cArgs != 1 || (dp->cNamedArgs == 1 && *dp->rgdispidNamedArgs != DISPID_PROPERTYPUT)
+            || dp->cNamedArgs > 1) {
+        FIXME("invalid args\n");
+        return E_INVALIDARG;
+    }
+
+    if(!func->put_vtbl_off) {
+        FIXME("No setter\n");
+        return E_FAIL;
+    }
+
+    v = dp->rgvarg;
+    if(func->prop_vt != VT_VARIANT && V_VT(v) != func->prop_vt) {
+        V_VT(&tmpv) = VT_EMPTY;
+        VariantChangeType(&tmpv, v, 0, func->prop_vt);
+        if(FAILED(hres))
+            return hres;
+        v = &tmpv;
+    }
+
+    hres = IUnknown_QueryInterface(This->outer, tid_ids[func->tid], (void**)&iface);
+    if(SUCCEEDED(hres)) {
+        switch(func->prop_vt) {
+#define CASE_VT(vt,type,access) \
+        case vt: \
+            hres = ((HRESULT (WINAPI*)(IUnknown*,type))((void**)iface->lpVtbl)[func->put_vtbl_off])(iface,access(v)); \
+            break
+        BUILTIN_TYPES_SWITCH;
+#undef CASE_VT
+        default:
+            FIXME("Unimplemented vt %d\n", func->prop_vt);
+            hres = E_NOTIMPL;
+        }
+
+        IUnknown_Release(iface);
+    }
+
+    if(v == &tmpv)
+        VariantClear(v);
+    return hres;
+}
+
 static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp,
         VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
 {
@@ -831,6 +879,11 @@ static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD
         return function_invoke(This, func, flags, dp, res, ei);
 
     switch(flags) {
+    case DISPATCH_PROPERTYPUT:
+        if(res)
+            V_VT(res) = VT_EMPTY;
+        hres = builtin_propput(This, func, dp);
+        break;
     case DISPATCH_PROPERTYGET:
         hres = builtin_propget(This, func, dp, res);
         break;




More information about the wine-cvs mailing list