Jacek Caban : mshtml: Use dispinterface DISPID_VALUE implementation if available.

Alexandre Julliard julliard at winehq.org
Fri Oct 2 11:02:24 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct  2 13:51:48 2009 +0200

mshtml: Use dispinterface DISPID_VALUE implementation if available.

---

 dlls/mshtml/dispex.c |   52 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 3cfae67..4092374 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -31,6 +31,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
+static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
+
 typedef struct {
     DISPID id;
     BSTR name;
@@ -244,10 +246,12 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
 
     TRACE("(%p)\n", This);
 
-    hres = get_typeinfo(This->data->disp_tid, &dti);
-    if(FAILED(hres)) {
-        ERR("Could not get disp type info: %08x\n", hres);
-        return NULL;
+    if(This->data->disp_tid) {
+        hres = get_typeinfo(This->data->disp_tid, &dti);
+        if(FAILED(hres)) {
+            ERR("Could not get disp type info: %08x\n", hres);
+            return NULL;
+        }
     }
 
     data = heap_alloc(sizeof(dispex_data_t));
@@ -421,8 +425,6 @@ HRESULT dispex_get_dprop_ref(DispatchEx *This, const WCHAR *name, BOOL alloc, VA
 static HRESULT dispex_value(DispatchEx *This, LCID lcid, WORD flags, DISPPARAMS *params,
         VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
 {
-    static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
-
     if(This->data->vtbl && This->data->vtbl->value)
         return This->data->vtbl->value(This->outer, lcid, flags, params, res, ei, caller);
 
@@ -537,11 +539,13 @@ static const dispex_static_data_vtbl_t function_dispex_vtbl = {
     NULL
 };
 
+static const tid_t function_iface_tids[] = {0};
+
 static dispex_static_data_t function_dispex = {
     &function_dispex_vtbl,
-    LAST_tid,
+    NULL_tid,
     NULL,
-    NULL
+    function_iface_tids
 };
 
 static func_disp_t *create_func_disp(DispatchEx *obj, func_info_t *info)
@@ -572,6 +576,18 @@ static HRESULT function_invoke(DispatchEx *This, func_info_t *func, WORD flags,
     case DISPATCH_PROPERTYGET: {
         dispex_dynamic_data_t *dynamic_data;
 
+        if(func->id == DISPID_VALUE) {
+            BSTR ret;
+
+            ret = SysAllocString(objectW);
+            if(!ret)
+                return E_OUTOFMEMORY;
+
+            V_VT(res) = VT_BSTR;
+            V_BSTR(res) = ret;
+            return S_OK;
+        }
+
         dynamic_data = get_dynamic_data(This, TRUE);
         if(!dynamic_data)
             return E_OUTOFMEMORY;
@@ -613,8 +629,10 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re
     while(min <= max) {
         n = (min+max)/2;
 
-        if(data->funcs[n].id == id)
-            break;
+        if(data->funcs[n].id == id) {
+            *ret = data->funcs+n;
+            return S_OK;
+        }
 
         if(data->funcs[n].id < id)
             min = n+1;
@@ -622,13 +640,8 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re
             max = n-1;
     }
 
-    if(min > max) {
-        WARN("invalid id %x\n", id);
-        return DISP_E_UNKNOWNNAME;
-    }
-
-    *ret = data->funcs+n;
-    return S_OK;
+    WARN("invalid id %x\n", id);
+    return DISP_E_UNKNOWNNAME;
 }
 
 #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
@@ -777,9 +790,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
 
     TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
 
-    if(id == DISPID_VALUE)
-        return dispex_value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
-
     if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke)
         return This->data->vtbl->invoke(This->outer, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
 
@@ -853,6 +863,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
         return E_FAIL;
 
     hres = get_builtin_func(data, id, &func);
+    if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME)
+        return dispex_value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
     if(FAILED(hres))
         return hres;
 




More information about the wine-cvs mailing list