Module: wine Branch: master Commit: 03c772aaaeb12b80a9c29792afbbba2ce362a29c URL: https://gitlab.winehq.org/wine/wine/-/commit/03c772aaaeb12b80a9c29792afbbba2...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Jun 28 12:13:26 2024 +0200
mshtml: Factor out dispex_prop_call.
---
dlls/mshtml/dispex.c | 101 +++++++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 47 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index d21d9f20433..2e436b364c4 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1973,60 +1973,27 @@ static HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT } }
-static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, - VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +static HRESULT dispex_prop_call(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *r, + EXCEPINFO *ei, IServiceProvider *caller) { - DispatchEx *This = impl_from_IWineJSDispatchHost(iface); - HRESULT hres; - - TRACE("%s (%p)->(%lx %lx %x %p %p %p %p)\n", This->info->desc->name, This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); - - if(!ensure_real_info(This)) - return E_OUTOFMEMORY; - - if(wFlags == (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF)) - wFlags = DISPATCH_PROPERTYPUT; - - if(This->info->desc->vtbl->disp_invoke) { - hres = This->info->desc->vtbl->disp_invoke(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); - if(hres != S_FALSE) - return hres; - } - - switch(wFlags) { - case DISPATCH_PROPERTYGET: - if(!pvarRes) - return E_INVALIDARG; - return dispex_prop_get(This, id, lcid, pvarRes, pei, pspCaller); - - case DISPATCH_PROPERTYPUT: { - if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) - || pdp->cNamedArgs > 1) { - FIXME("invalid args\n"); - return E_INVALIDARG; - } - return dispex_prop_put(This, id, lcid, pdp->rgvarg, pei, pspCaller); - } - } - switch(get_dispid_type(id)) { case DISPEXPROP_CUSTOM: - if(!This->info->desc->vtbl->invoke) + if(!dispex->info->desc->vtbl->invoke) return DISP_E_MEMBERNOTFOUND; - return This->info->desc->vtbl->invoke(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return dispex->info->desc->vtbl->invoke(dispex, id, lcid, flags, dp, r, ei, caller);
case DISPEXPROP_DYNAMIC: { DWORD idx = id - DISPID_DYNPROP_0; dynamic_prop_t *prop;
- if(!get_dynamic_data(This) || This->dynamic_data->prop_cnt <= idx) + if(!get_dynamic_data(dispex) || dispex->dynamic_data->prop_cnt <= idx) return DISP_E_MEMBERNOTFOUND;
- prop = This->dynamic_data->props+idx; + prop = dispex->dynamic_data->props + idx;
- switch(wFlags) { + switch(flags) { case DISPATCH_METHOD|DISPATCH_PROPERTYGET: - if(!pvarRes) + if(!r) return E_INVALIDARG; /* fall through */ case DISPATCH_METHOD: @@ -2035,17 +2002,17 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, return E_NOTIMPL; }
- return invoke_disp_value(This, V_DISPATCH(&prop->var), lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return invoke_disp_value(dispex, V_DISPATCH(&prop->var), lcid, flags, dp, r, ei, caller); default: - FIXME("unhandled wFlags %x\n", wFlags); + FIXME("unhandled flags %x on dynamic property\n", flags); return E_NOTIMPL; } } case DISPEXPROP_BUILTIN: - if(wFlags == DISPATCH_CONSTRUCT) { + if(flags == DISPATCH_CONSTRUCT) { if(id == DISPID_VALUE) { - if(This->info->desc->vtbl->value) { - return This->info->desc->vtbl->value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + if(dispex->info->desc->vtbl->value) { + return dispex->info->desc->vtbl->value(dispex, lcid, flags, dp, r, ei, caller); } FIXME("DISPATCH_CONSTRUCT flag but missing value function\n"); return E_FAIL; @@ -2054,13 +2021,53 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, return E_FAIL; }
- return invoke_builtin_prop(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return invoke_builtin_prop(dispex, id, lcid, flags, dp, r, ei, caller); + default: assert(0); return E_FAIL; } }
+static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + TRACE("%s (%p)->(%lx %lx %x %p %p %p %p)\n", This->info->desc->name, This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + + if(!ensure_real_info(This)) + return E_OUTOFMEMORY; + + if(wFlags == (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF)) + wFlags = DISPATCH_PROPERTYPUT; + + if(This->info->desc->vtbl->disp_invoke) { + HRESULT hres = This->info->desc->vtbl->disp_invoke(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + if(hres != S_FALSE) + return hres; + } + + switch(wFlags) { + case DISPATCH_PROPERTYGET: + if(!pvarRes) + return E_INVALIDARG; + return dispex_prop_get(This, id, lcid, pvarRes, pei, pspCaller); + + case DISPATCH_PROPERTYPUT: { + if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) + || pdp->cNamedArgs > 1) { + FIXME("invalid args\n"); + return E_INVALIDARG; + } + return dispex_prop_put(This, id, lcid, pdp->rgvarg, pei, pspCaller); + } + + default: + return dispex_prop_call(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + } +} + static HRESULT WINAPI DispatchEx_DeleteMemberByName(IWineJSDispatchHost *iface, BSTR name, DWORD grfdex) { DispatchEx *This = impl_from_IWineJSDispatchHost(iface);