diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c index a080a8bbfad..d0520f35778 100644 --- a/dlls/msxml3/dispex.c +++ b/dlls/msxml3/dispex.c @@ -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; } diff --git a/dlls/msxml3/domimpl.c b/dlls/msxml3/domimpl.c index 7deb617b309..e286e57d716 100644 --- a/dlls/msxml3/domimpl.c +++ b/dlls/msxml3/domimpl.c @@ -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; } diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index d7014b60840..fb7ddd1022a 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -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; diff --git a/dlls/msxml3/mxnamespace.c b/dlls/msxml3/mxnamespace.c index 14dfdd77324..f114d973445 100644 --- a/dlls/msxml3/mxnamespace.c +++ b/dlls/msxml3/mxnamespace.c @@ -460,7 +460,6 @@ static ULONG WINAPI vbnamespacemanager_Release(IVBMXNamespaceManager *iface) free_ns_context(ctxt); } - release_dispex(&This->dispex); heap_free( This ); } diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index 6c2eeb857e0..5778345c0ea 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -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); } diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 8b067b6dc3e..aee38e08951 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -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) diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c index 94faf9faf81..1eed3d5fcde 100644 --- a/dlls/msxml3/nodemap.c +++ b/dlls/msxml3/nodemap.c @@ -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 ); } diff --git a/dlls/msxml3/parseerror.c b/dlls/msxml3/parseerror.c index b5c79480d7b..438c9eb3c49 100644 --- a/dlls/msxml3/parseerror.c +++ b/dlls/msxml3/parseerror.c @@ -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 ); } diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 3ba1c0c24e9..7a9e410ea38 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -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 ); } diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c index a310b4f91e3..5bfabb30718 100644 --- a/dlls/msxml3/schema.c +++ b/dlls/msxml3/schema.c @@ -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); } diff --git a/dlls/msxml3/selection.c b/dlls/msxml3/selection.c index bb0f42ecd6f..6a725502513 100644 --- a/dlls/msxml3/selection.c +++ b/dlls/msxml3/selection.c @@ -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); } diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c index 8073dde3498..e5761ded79d 100644 --- a/dlls/msxml3/stylesheet.c +++ b/dlls/msxml3/stylesheet.c @@ -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 ); } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 6af47e712ea..b5e744188d8 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -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(); } diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 42e4ec09eb3..c5fcaa767aa 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -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) diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c index ac3feade2dc..658b0d7f77f 100644 --- a/dlls/msxml3/tests/schema.c +++ b/dlls/msxml3/tests/schema.c @@ -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)