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