mshtml: Added fdexNameEnsure support to IDidpatchEx implementation.
This commit is contained in:
parent
1741e652b3
commit
32ac703e30
|
@ -45,6 +45,20 @@ struct dispex_data_t {
|
||||||
struct list entry;
|
struct list entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
VARIANT var;
|
||||||
|
LPWSTR name;
|
||||||
|
} dynamic_prop_t;
|
||||||
|
|
||||||
|
struct dispex_dynamic_data_t {
|
||||||
|
DWORD buf_size;
|
||||||
|
DWORD prop_cnt;
|
||||||
|
dynamic_prop_t *props;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DISPID_DYNPROP_0 0x50000000
|
||||||
|
#define DISPID_DYNPROP_MAX 0x5fffffff
|
||||||
|
|
||||||
static ITypeLib *typelib;
|
static ITypeLib *typelib;
|
||||||
static ITypeInfo *typeinfos[LAST_tid];
|
static ITypeInfo *typeinfos[LAST_tid];
|
||||||
static struct list dispex_data_list = LIST_INIT(dispex_data_list);
|
static struct list dispex_data_list = LIST_INIT(dispex_data_list);
|
||||||
|
@ -296,6 +310,11 @@ static inline BOOL is_custom_dispid(DISPID id)
|
||||||
return MSHTML_DISPID_CUSTOM_MIN <= id && id <= MSHTML_DISPID_CUSTOM_MAX;
|
return MSHTML_DISPID_CUSTOM_MIN <= id && id <= MSHTML_DISPID_CUSTOM_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline BOOL is_dynamic_dispid(DISPID id)
|
||||||
|
{
|
||||||
|
return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
#define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
|
#define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
|
||||||
|
|
||||||
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
|
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
|
||||||
|
@ -386,7 +405,7 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
|
||||||
|
|
||||||
TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
|
TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
|
||||||
|
|
||||||
if(grfdex & (~fdexNameCaseSensitive))
|
if(grfdex & ~(fdexNameCaseSensitive|fdexNameEnsure))
|
||||||
FIXME("Unsupported grfdex %x\n", grfdex);
|
FIXME("Unsupported grfdex %x\n", grfdex);
|
||||||
|
|
||||||
data = get_dispex_data(This);
|
data = get_dispex_data(This);
|
||||||
|
@ -414,6 +433,17 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
|
||||||
min = n+1;
|
min = n+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(This->dynamic_data) {
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for(i=0; i < This->dynamic_data->prop_cnt; i++) {
|
||||||
|
if(!strcmpW(This->dynamic_data->props[i].name, bstrName)) {
|
||||||
|
*pid = DISPID_DYNPROP_0 + i;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(This->data->vtbl && This->data->vtbl->get_dispid) {
|
if(This->data->vtbl && This->data->vtbl->get_dispid) {
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
|
@ -422,6 +452,23 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(grfdex & fdexNameEnsure) {
|
||||||
|
TRACE("creating dynamic prop %s\n", debugstr_w(bstrName));
|
||||||
|
|
||||||
|
if(!This->dynamic_data) {
|
||||||
|
This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
|
||||||
|
This->dynamic_data->props = heap_alloc(This->dynamic_data->buf_size = 4);
|
||||||
|
}else if(This->dynamic_data->buf_size == This->dynamic_data->prop_cnt) {
|
||||||
|
This->dynamic_data->props = heap_realloc(This->dynamic_data->props, This->dynamic_data->buf_size<<=1);
|
||||||
|
}
|
||||||
|
|
||||||
|
This->dynamic_data->props[This->dynamic_data->prop_cnt].name = heap_strdupW(bstrName);
|
||||||
|
VariantInit(&This->dynamic_data->props[This->dynamic_data->prop_cnt].var);
|
||||||
|
*pid = DISPID_DYNPROP_0 + This->dynamic_data->prop_cnt++;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
TRACE("not found %s\n", debugstr_w(bstrName));
|
TRACE("not found %s\n", debugstr_w(bstrName));
|
||||||
return DISP_E_UNKNOWNNAME;
|
return DISP_E_UNKNOWNNAME;
|
||||||
}
|
}
|
||||||
|
@ -447,6 +494,27 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(is_dynamic_dispid(id)) {
|
||||||
|
DWORD idx = id - DISPID_DYNPROP_0;
|
||||||
|
VARIANT *var;
|
||||||
|
|
||||||
|
if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx)
|
||||||
|
return DISP_E_UNKNOWNNAME;
|
||||||
|
|
||||||
|
var = &This->dynamic_data->props[idx].var;
|
||||||
|
|
||||||
|
switch(wFlags) {
|
||||||
|
case INVOKE_PROPERTYGET:
|
||||||
|
return VariantCopy(pvarRes, var);
|
||||||
|
case INVOKE_PROPERTYPUT:
|
||||||
|
VariantClear(var);
|
||||||
|
return VariantCopy(var, pdp->rgvarg);
|
||||||
|
default:
|
||||||
|
FIXME("unhandled wFlags %x\n", wFlags);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data = get_dispex_data(This);
|
data = get_dispex_data(This);
|
||||||
if(!data)
|
if(!data)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
|
@ -97,6 +97,7 @@ typedef enum {
|
||||||
} tid_t;
|
} tid_t;
|
||||||
|
|
||||||
typedef struct dispex_data_t dispex_data_t;
|
typedef struct dispex_data_t dispex_data_t;
|
||||||
|
typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
|
||||||
|
|
||||||
#define MSHTML_DISPID_CUSTOM_MIN 0x60000000
|
#define MSHTML_DISPID_CUSTOM_MIN 0x60000000
|
||||||
#define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff
|
#define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff
|
||||||
|
@ -119,6 +120,7 @@ typedef struct {
|
||||||
IUnknown *outer;
|
IUnknown *outer;
|
||||||
|
|
||||||
dispex_static_data_t *data;
|
dispex_static_data_t *data;
|
||||||
|
dispex_dynamic_data_t *dynamic_data;
|
||||||
} DispatchEx;
|
} DispatchEx;
|
||||||
|
|
||||||
void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*);
|
void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*);
|
||||||
|
|
Loading…
Reference in New Issue