return hres;
}
-static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, DISPPARAMS *dp,
+static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, VARIANT *val,
jsexcept_t *ei, IServiceProvider *caller)
{
- DWORD i;
HRESULT hres;
switch(prop->type) {
case PROP_BUILTIN:
if(!(prop->flags & PROPF_METHOD)) {
+ DISPPARAMS dp = {val, NULL, 1, 0};
vdisp_t vthis;
set_jsdisp(&vthis, This);
- hres = prop->u.p->invoke(This->ctx, &vthis, DISPATCH_PROPERTYPUT, dp, NULL, ei, caller);
+ hres = prop->u.p->invoke(This->ctx, &vthis, DISPATCH_PROPERTYPUT, &dp, NULL, ei, caller);
vdisp_release(&vthis);
return hres;
}
return E_FAIL;
}
- for(i=0; i < dp->cNamedArgs; i++) {
- if(dp->rgdispidNamedArgs[i] == DISPID_PROPERTYPUT)
- break;
- }
-
- if(i == dp->cNamedArgs) {
- TRACE("no value to set\n");
- return DISP_E_PARAMNOTOPTIONAL;
- }
-
- hres = VariantCopy(&prop->u.var, dp->rgvarg+i);
+ hres = VariantCopy(&prop->u.var, val);
if(FAILED(hres))
return hres;
if(This->builtin_info->on_put)
This->builtin_info->on_put(This, prop->name);
- TRACE("%s = %s\n", debugstr_w(prop->name), debugstr_variant(dp->rgvarg+i));
+ TRACE("%s = %s\n", debugstr_w(prop->name), debugstr_variant(val));
return S_OK;
}
case DISPATCH_PROPERTYGET:
hres = prop_get(This, prop, pdp, pvarRes, &jsexcept, pspCaller);
break;
- case DISPATCH_PROPERTYPUT:
- hres = prop_put(This, prop, pdp, &jsexcept, pspCaller);
+ case DISPATCH_PROPERTYPUT: {
+ DWORD i;
+
+ for(i=0; i < pdp->cNamedArgs; i++) {
+ if(pdp->rgdispidNamedArgs[i] == DISPID_PROPERTYPUT)
+ break;
+ }
+
+ if(i == pdp->cNamedArgs) {
+ TRACE("no value to set\n");
+ return DISP_E_PARAMNOTOPTIONAL;
+ }
+
+ hres = prop_put(This, prop, pdp->rgvarg+i, &jsexcept, pspCaller);
break;
+ }
default:
FIXME("Unimplemented flags %x\n", wFlags);
return E_INVALIDARG;
HRESULT jsdisp_propput_name(DispatchEx *obj, const WCHAR *name, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller)
{
- DISPID named_arg = DISPID_PROPERTYPUT;
- DISPPARAMS dp = {val, &named_arg, 1, 1};
dispex_prop_t *prop;
HRESULT hres;
if(FAILED(hres))
return hres;
- return prop_put(obj, prop, &dp, ei, caller);
+ return prop_put(obj, prop, val, ei, caller);
}
HRESULT jsdisp_propput_idx(DispatchEx *obj, DWORD idx, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller)
HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller)
{
- DISPID dispid = DISPID_PROPERTYPUT;
- DISPPARAMS dp = {val, &dispid, 1, 1};
- IDispatchEx *dispex;
DispatchEx *jsdisp;
HRESULT hres;
prop = get_prop(jsdisp, id);
if(prop)
- hres = prop_put(jsdisp, prop, &dp, ei, caller);
+ hres = prop_put(jsdisp, prop, val, ei, caller);
else
hres = DISP_E_MEMBERNOTFOUND;
jsdisp_release(jsdisp);
- return hres;
- }
-
- hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
- if(FAILED(hres)) {
- ULONG err = 0;
+ }else {
+ DISPID dispid = DISPID_PROPERTYPUT;
+ DISPPARAMS dp = {val, &dispid, 1, 1};
+ IDispatchEx *dispex;
+
+ hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+ if(SUCCEEDED(hres)) {
+ hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, caller);
+ IDispatchEx_Release(dispex);
+ }else {
+ ULONG err = 0;
- TRACE("using IDispatch\n");
- return IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, &err);
+ TRACE("using IDispatch\n");
+ hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, &err);
+ }
}
- hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ei->ei, caller);
-
- IDispatchEx_Release(dispex);
return hres;
}