msxml3: Remove dynamic properties support.
This commit is contained in:
parent
86ee4e959a
commit
5b43c42c88
@ -86,20 +86,6 @@ struct dispex_data_t {
|
||||
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 struct list dispex_data_list = LIST_INIT(dispex_data_list);
|
||||
static ITypeLib *typelib[LibXml_Last];
|
||||
static ITypeInfo *typeinfos[LAST_tid];
|
||||
@ -341,11 +327,6 @@ static dispex_data_t *get_dispex_data(DispatchEx *This)
|
||||
return This->data->data;
|
||||
}
|
||||
|
||||
static inline BOOL is_dynamic_dispid(DISPID id)
|
||||
{
|
||||
return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX;
|
||||
}
|
||||
|
||||
static inline DispatchEx *impl_from_IDispatchEx(IDispatchEx *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, DispatchEx, IDispatchEx_iface);
|
||||
@ -461,17 +442,6 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
|
||||
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) {
|
||||
HRESULT hres;
|
||||
|
||||
@ -480,42 +450,6 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
|
||||
return hres;
|
||||
}
|
||||
|
||||
if(grfdex & fdexNameEnsure) {
|
||||
dispex_dynamic_data_t *dynamic_data;
|
||||
|
||||
TRACE("creating dynamic prop %s\n", debugstr_w(bstrName));
|
||||
|
||||
if(This->dynamic_data) {
|
||||
dynamic_data = This->dynamic_data;
|
||||
}else {
|
||||
dynamic_data = This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
|
||||
if(!dynamic_data)
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
if(!dynamic_data->buf_size) {
|
||||
dynamic_data->props = heap_alloc(sizeof(dynamic_prop_t)*4);
|
||||
if(!dynamic_data->props)
|
||||
return E_OUTOFMEMORY;
|
||||
dynamic_data->buf_size = 4;
|
||||
}else if(dynamic_data->buf_size == dynamic_data->prop_cnt) {
|
||||
dynamic_prop_t *new_props;
|
||||
|
||||
new_props = heap_realloc(dynamic_data->props, sizeof(dynamic_prop_t)*(dynamic_data->buf_size<<1));
|
||||
if(!new_props)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
dynamic_data->props = new_props;
|
||||
dynamic_data->buf_size <<= 1;
|
||||
}
|
||||
|
||||
dynamic_data->props[dynamic_data->prop_cnt].name = heap_strdupW(bstrName);
|
||||
VariantInit(&dynamic_data->props[dynamic_data->prop_cnt].var);
|
||||
*pid = DISPID_DYNPROP_0 + dynamic_data->prop_cnt++;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
TRACE("not found %s\n", debugstr_w(bstrName));
|
||||
return DISP_E_UNKNOWNNAME;
|
||||
}
|
||||
@ -567,28 +501,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
|
||||
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:
|
||||
V_VT(pvarRes) = VT_EMPTY;
|
||||
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);
|
||||
if(!data)
|
||||
return E_FAIL;
|
||||
@ -726,26 +638,9 @@ BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void release_dispex(DispatchEx *This)
|
||||
{
|
||||
dynamic_prop_t *prop;
|
||||
|
||||
if(!This->dynamic_data)
|
||||
return;
|
||||
|
||||
for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) {
|
||||
VariantClear(&prop->var);
|
||||
heap_free(prop->name);
|
||||
}
|
||||
|
||||
heap_free(This->dynamic_data->props);
|
||||
heap_free(This->dynamic_data);
|
||||
}
|
||||
|
||||
void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data)
|
||||
{
|
||||
dispex->IDispatchEx_iface.lpVtbl = &DispatchExVtbl;
|
||||
dispex->outer = outer;
|
||||
dispex->data = data;
|
||||
dispex->dynamic_data = NULL;
|
||||
}
|
||||
|
@ -101,10 +101,7 @@ static ULONG WINAPI dimimpl_Release(
|
||||
|
||||
TRACE("(%p)->(%d)\n", This, ref);
|
||||
if ( ref == 0 )
|
||||
{
|
||||
release_dispex(&This->dispex);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
@ -134,7 +134,6 @@ extern HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) DECLSPEC_HIDDEN;
|
||||
extern void release_typelib(void) DECLSPEC_HIDDEN;
|
||||
|
||||
typedef struct dispex_data_t dispex_data_t;
|
||||
typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
|
||||
|
||||
typedef struct {
|
||||
HRESULT (*get_dispid)(IUnknown*,BSTR,DWORD,DISPID*);
|
||||
@ -154,7 +153,6 @@ typedef struct {
|
||||
IUnknown *outer;
|
||||
|
||||
dispex_static_data_t *data;
|
||||
dispex_dynamic_data_t *dynamic_data;
|
||||
} DispatchEx;
|
||||
|
||||
extern HINSTANCE MSXML_hInstance DECLSPEC_HIDDEN;
|
||||
|
@ -460,7 +460,6 @@ static ULONG WINAPI vbnamespacemanager_Release(IVBMXNamespaceManager *iface)
|
||||
free_ns_context(ctxt);
|
||||
}
|
||||
|
||||
release_dispex(&This->dispex);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
|
@ -779,7 +779,6 @@ static ULONG WINAPI mxwriter_Release(IMXWriter *iface)
|
||||
SysFreeString(This->encoding);
|
||||
|
||||
SysFreeString(This->element);
|
||||
release_dispex(&This->dispex);
|
||||
heap_free(This);
|
||||
}
|
||||
|
||||
@ -2605,7 +2604,6 @@ static ULONG WINAPI MXAttributes_Release(IMXAttributes *iface)
|
||||
SysFreeString(This->attr[i].value);
|
||||
}
|
||||
|
||||
release_dispex(&This->dispex);
|
||||
heap_free(This->attr);
|
||||
heap_free(This);
|
||||
}
|
||||
|
@ -1198,7 +1198,6 @@ void destroy_xmlnode(xmlnode *This)
|
||||
xmlnode_release(This->node);
|
||||
xmldoc_release(This->node->doc);
|
||||
}
|
||||
release_dispex(&This->dispex);
|
||||
}
|
||||
|
||||
void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data)
|
||||
|
@ -142,7 +142,6 @@ static ULONG WINAPI xmlnodemap_Release(
|
||||
{
|
||||
xmldoc_release( This->node->doc );
|
||||
if (This->enumvariant) IEnumVARIANT_Release(This->enumvariant);
|
||||
release_dispex(&This->dispex);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,6 @@ static ULONG WINAPI parseError_Release(
|
||||
SysFreeString(This->url);
|
||||
SysFreeString(This->reason);
|
||||
SysFreeString(This->srcText);
|
||||
release_dispex(&This->dispex);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
|
@ -2934,7 +2934,6 @@ static ULONG WINAPI saxxmlreader_Release(
|
||||
SysFreeString(This->xmldecl_version);
|
||||
free_bstr_pool(&This->pool);
|
||||
|
||||
release_dispex(&This->dispex);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
|
@ -1149,7 +1149,6 @@ static ULONG WINAPI schema_cache_Release(IXMLDOMSchemaCollection2* iface)
|
||||
heap_free(This->uris[i]);
|
||||
heap_free(This->uris);
|
||||
xmlHashFree(This->cache, cache_free);
|
||||
release_dispex(&This->dispex);
|
||||
heap_free(This);
|
||||
}
|
||||
|
||||
|
@ -177,7 +177,6 @@ static ULONG WINAPI domselection_Release(
|
||||
xmlXPathFreeObject(This->result);
|
||||
xmldoc_release(This->node->doc);
|
||||
if (This->enumvariant) IEnumVARIANT_Release(This->enumvariant);
|
||||
release_dispex(&This->dispex);
|
||||
heap_free(This);
|
||||
}
|
||||
|
||||
|
@ -138,7 +138,6 @@ static ULONG WINAPI xsltemplate_Release( IXSLTemplate *iface )
|
||||
if ( ref == 0 )
|
||||
{
|
||||
if (This->node) IXMLDOMNode_Release( This->node );
|
||||
release_dispex(&This->dispex);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
@ -326,7 +325,6 @@ static ULONG WINAPI xslprocessor_Release( IXSLProcessor *iface )
|
||||
xslprocessor_par_free(&This->params, par);
|
||||
|
||||
IXSLTemplate_Release(&This->stylesheet->IXSLTemplate_iface);
|
||||
release_dispex(&This->dispex);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
|
@ -9734,6 +9734,7 @@ static void test_load(void)
|
||||
|
||||
static void test_domobj_dispex(IUnknown *obj)
|
||||
{
|
||||
static const WCHAR testW[] = {'t','e','s','t','p','r','o','p',0};
|
||||
DISPID dispid = DISPID_XMLDOM_NODELIST_RESET;
|
||||
IDispatchEx *dispex;
|
||||
IUnknown *unk;
|
||||
@ -9771,9 +9772,15 @@ static void test_domobj_dispex(IUnknown *obj)
|
||||
hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_NODELIST_RESET, &dispid);
|
||||
EXPECT_HR(hr, E_NOTIMPL);
|
||||
|
||||
unk = (IUnknown*)0xdeadbeef;
|
||||
hr = IDispatchEx_GetNameSpaceParent(dispex, &unk);
|
||||
EXPECT_HR(hr, E_NOTIMPL);
|
||||
if (hr == S_OK && unk) IUnknown_Release(unk);
|
||||
ok(unk == (IUnknown*)0xdeadbeef, "got %p\n", unk);
|
||||
|
||||
name = SysAllocString(testW);
|
||||
hr = IDispatchEx_GetDispID(dispex, name, fdexNameEnsure, &dispid);
|
||||
ok(hr == DISP_E_UNKNOWNNAME, "got 0x%08x\n", hr);
|
||||
SysFreeString(name);
|
||||
|
||||
IDispatchEx_Release(dispex);
|
||||
}
|
||||
@ -10670,6 +10677,13 @@ todo_wine {
|
||||
IXSLProcessor_Release(processor);
|
||||
IXSLTemplate_Release(template);
|
||||
|
||||
if (is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument))
|
||||
{
|
||||
doc = create_document_version(60, &IID_IXMLDOMDocument);
|
||||
test_domobj_dispex((IUnknown*)doc);
|
||||
IXMLDOMDocument_Release(doc);
|
||||
}
|
||||
|
||||
free_bstrs();
|
||||
}
|
||||
|
||||
|
@ -4387,6 +4387,7 @@ static void test_mxwriter_encoding(void)
|
||||
|
||||
static void test_obj_dispex(IUnknown *obj)
|
||||
{
|
||||
static const WCHAR testW[] = {'t','e','s','t','p','r','o','p',0};
|
||||
static const WCHAR starW[] = {'*',0};
|
||||
DISPID dispid = DISPID_SAX_XMLREADER_GETFEATURE;
|
||||
IDispatchEx *dispex;
|
||||
@ -4395,6 +4396,7 @@ static void test_obj_dispex(IUnknown *obj)
|
||||
UINT ticnt;
|
||||
HRESULT hr;
|
||||
BSTR name;
|
||||
DISPID did;
|
||||
|
||||
hr = IUnknown_QueryInterface(obj, &IID_IDispatchEx, (void**)&dispex);
|
||||
EXPECT_HR(hr, S_OK);
|
||||
@ -4425,9 +4427,15 @@ static void test_obj_dispex(IUnknown *obj)
|
||||
hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_SAX_XMLREADER_GETFEATURE, &dispid);
|
||||
EXPECT_HR(hr, E_NOTIMPL);
|
||||
|
||||
unk = (IUnknown*)0xdeadbeef;
|
||||
hr = IDispatchEx_GetNameSpaceParent(dispex, &unk);
|
||||
EXPECT_HR(hr, E_NOTIMPL);
|
||||
if (hr == S_OK && unk) IUnknown_Release(unk);
|
||||
ok(unk == (IUnknown*)0xdeadbeef, "got %p\n", unk);
|
||||
|
||||
name = SysAllocString(testW);
|
||||
hr = IDispatchEx_GetDispID(dispex, name, fdexNameEnsure, &did);
|
||||
ok(hr == DISP_E_UNKNOWNNAME, "got 0x%08x\n", hr);
|
||||
SysFreeString(name);
|
||||
|
||||
IDispatchEx_Release(dispex);
|
||||
}
|
||||
@ -4491,8 +4499,15 @@ static void test_saxreader_dispex(void)
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
IVBSAXXMLReader_Release(vbreader);
|
||||
|
||||
ISAXXMLReader_Release(reader);
|
||||
|
||||
if (is_clsid_supported(&CLSID_SAXXMLReader60, reader_support_data))
|
||||
{
|
||||
hr = CoCreateInstance(&CLSID_SAXXMLReader60, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&unk);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
test_obj_dispex(unk);
|
||||
IUnknown_Release(unk);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_mxwriter_dispex(void)
|
||||
@ -4512,8 +4527,15 @@ static void test_mxwriter_dispex(void)
|
||||
test_obj_dispex(unk);
|
||||
IUnknown_Release(unk);
|
||||
IDispatchEx_Release(dispex);
|
||||
|
||||
IMXWriter_Release(writer);
|
||||
|
||||
if (is_clsid_supported(&CLSID_MXXMLWriter60, mxwriter_support_data))
|
||||
{
|
||||
hr = CoCreateInstance(&CLSID_MXXMLWriter60, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&unk);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
test_obj_dispex(unk);
|
||||
IUnknown_Release(unk);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_mxwriter_comment(void)
|
||||
|
@ -1416,6 +1416,7 @@ static void test_validate_on_load(void)
|
||||
|
||||
static void test_obj_dispex(IUnknown *obj)
|
||||
{
|
||||
static const WCHAR testW[] = {'t','e','s','t','p','r','o','p',0};
|
||||
static const WCHAR starW[] = {'*',0};
|
||||
DISPID dispid = DISPID_SAX_XMLREADER_GETFEATURE;
|
||||
IDispatchEx *dispex;
|
||||
@ -1454,9 +1455,15 @@ static void test_obj_dispex(IUnknown *obj)
|
||||
hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_SCHEMACOLLECTION_ADD, &dispid);
|
||||
EXPECT_HR(hr, E_NOTIMPL);
|
||||
|
||||
unk = (IUnknown*)0xdeadbeef;
|
||||
hr = IDispatchEx_GetNameSpaceParent(dispex, &unk);
|
||||
EXPECT_HR(hr, E_NOTIMPL);
|
||||
if (hr == S_OK && unk) IUnknown_Release(unk);
|
||||
ok(unk == (IUnknown*)0xdeadbeef, "got %p\n", unk);
|
||||
|
||||
name = SysAllocString(testW);
|
||||
hr = IDispatchEx_GetDispID(dispex, name, fdexNameEnsure, &dispid);
|
||||
ok(hr == DISP_E_UNKNOWNNAME, "got 0x%08x\n", hr);
|
||||
SysFreeString(name);
|
||||
|
||||
IDispatchEx_Release(dispex);
|
||||
}
|
||||
@ -1496,8 +1503,14 @@ static void test_dispex(void)
|
||||
ok(V_DISPATCH(&ret) == (void*)0x1, "got %p\n", V_DISPATCH(&ret));
|
||||
|
||||
IDispatchEx_Release(dispex);
|
||||
|
||||
IXMLDOMSchemaCollection_Release(cache);
|
||||
|
||||
cache = create_cache_version(60, &IID_IXMLDOMSchemaCollection);
|
||||
if (cache)
|
||||
{
|
||||
test_obj_dispex((IUnknown*)cache);
|
||||
IXMLDOMSchemaCollection_Release(cache);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_get(void)
|
||||
|
Loading…
x
Reference in New Issue
Block a user