From ba1d4d71d8d89dd19d9a0d83b676f36036299423 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 13 Mar 2012 11:46:55 +0100 Subject: [PATCH] mshtml: Don't use ITypeInfo for InvokeEx(DISPATCH_PROPERTYPUT) implementation. --- dlls/mshtml/dispex.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 88f10c3b48e..29628eb1b95 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; -- 2.11.4.GIT