msxml3: IDispatchEx support for MXNamespaceManager.

This commit is contained in:
Nikolay Sivov 2011-12-11 14:31:05 +03:00 committed by Alexandre Julliard
parent 01ed475c7c
commit e191b051b1
2 changed files with 110 additions and 117 deletions

View File

@ -66,6 +66,7 @@ static const WCHAR xmluriW[] = {'h','t','t','p',':','/','/','w','w','w','.','w',
typedef struct
{
DispatchEx dispex;
IMXNamespaceManager IMXNamespaceManager_iface;
IVBMXNamespaceManager IVBMXNamespaceManager_iface;
LONG ref;
@ -351,25 +352,29 @@ static const struct IMXNamespaceManagerVtbl MXNamespaceManagerVtbl =
namespacemanager_getURI
};
static HRESULT WINAPI vbnamespacemanager_QueryInterface(IVBMXNamespaceManager *iface, REFIID riid, void **ppvObject)
static HRESULT WINAPI vbnamespacemanager_QueryInterface(IVBMXNamespaceManager *iface, REFIID riid, void **obj)
{
namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
if ( IsEqualGUID( riid, &IID_IMXNamespaceManager) ||
IsEqualGUID( riid, &IID_IUnknown) )
{
*ppvObject = &This->IMXNamespaceManager_iface;
*obj = &This->IMXNamespaceManager_iface;
}
else if ( IsEqualGUID( riid, &IID_IVBMXNamespaceManager) ||
IsEqualGUID( riid, &IID_IDispatch) )
{
*ppvObject = &This->IVBMXNamespaceManager_iface;
*obj = &This->IVBMXNamespaceManager_iface;
}
else if (dispex_query_interface(&This->dispex, riid, obj))
{
return *obj ? S_OK : E_NOINTERFACE;
}
else
{
TRACE("Unsupported interface %s\n", debugstr_guid(riid));
*ppvObject = NULL;
*obj = NULL;
return E_NOINTERFACE;
}
@ -403,6 +408,7 @@ static ULONG WINAPI vbnamespacemanager_Release(IVBMXNamespaceManager *iface)
free_ns_context(ctxt);
}
release_dispex(&This->dispex);
heap_free( This );
}
@ -412,44 +418,23 @@ static ULONG WINAPI vbnamespacemanager_Release(IVBMXNamespaceManager *iface)
static HRESULT WINAPI vbnamespacemanager_GetTypeInfoCount(IVBMXNamespaceManager *iface, UINT *pctinfo)
{
namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
TRACE("(%p)->(%p)\n", This, pctinfo);
*pctinfo = 1;
return S_OK;
return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
}
static HRESULT WINAPI vbnamespacemanager_GetTypeInfo(IVBMXNamespaceManager *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return get_typeinfo(IVBMXNamespaceManager_tid, ppTInfo);
return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface,
iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI vbnamespacemanager_GetIDsOfNames(IVBMXNamespaceManager *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
ITypeInfo *typeinfo;
HRESULT hr;
TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
if(!rgszNames || cNames == 0 || !rgDispId)
return E_INVALIDARG;
hr = get_typeinfo(IVBMXNamespaceManager_tid, &typeinfo);
if(SUCCEEDED(hr))
{
hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
ITypeInfo_Release(typeinfo);
}
return hr;
return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface,
riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI vbnamespacemanager_Invoke(IVBMXNamespaceManager *iface, DISPID dispIdMember, REFIID riid,
@ -457,21 +442,8 @@ static HRESULT WINAPI vbnamespacemanager_Invoke(IVBMXNamespaceManager *iface, DI
EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
ITypeInfo *typeinfo;
HRESULT hr;
TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
hr = get_typeinfo(IVBMXNamespaceManager_tid, &typeinfo);
if(SUCCEEDED(hr))
{
hr = ITypeInfo_Invoke(typeinfo, &This->IVBMXNamespaceManager_iface, dispIdMember, wFlags,
pDispParams, pVarResult, pExcepInfo, puArgErr);
ITypeInfo_Release(typeinfo);
}
return hr;
return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface,
dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI vbnamespacemanager_put_allowOverride(IVBMXNamespaceManager *iface,
@ -588,28 +560,40 @@ static const struct IVBMXNamespaceManagerVtbl VBMXNamespaceManagerVtbl =
vbnamespacemanager_getURIFromNode
};
static const tid_t namespacemanager_iface_tids[] = {
IVBMXNamespaceManager_tid,
0
};
static dispex_static_data_t namespacemanager_dispex = {
NULL,
IVBMXNamespaceManager_tid,
NULL,
namespacemanager_iface_tids
};
HRESULT MXNamespaceManager_create(IUnknown *outer, void **obj)
{
namespacemanager *ns;
namespacemanager *This;
struct nscontext *ctxt;
TRACE("(%p, %p)\n", outer, obj);
ns = heap_alloc( sizeof (*ns) );
if( !ns )
This = heap_alloc( sizeof (*This) );
if( !This )
return E_OUTOFMEMORY;
ns->IMXNamespaceManager_iface.lpVtbl = &MXNamespaceManagerVtbl;
ns->IVBMXNamespaceManager_iface.lpVtbl = &VBMXNamespaceManagerVtbl;
ns->ref = 1;
This->IMXNamespaceManager_iface.lpVtbl = &MXNamespaceManagerVtbl;
This->IVBMXNamespaceManager_iface.lpVtbl = &VBMXNamespaceManagerVtbl;
This->ref = 1;
init_dispex(&This->dispex, (IUnknown*)&This->IVBMXNamespaceManager_iface, &namespacemanager_dispex);
list_init(&ns->ctxts);
list_init(&This->ctxts);
ctxt = alloc_ns_context();
list_add_head(&ns->ctxts, &ctxt->entry);
list_add_head(&This->ctxts, &ctxt->entry);
ns->override = VARIANT_TRUE;
This->override = VARIANT_TRUE;
*obj = &ns->IMXNamespaceManager_iface;
*obj = &This->IMXNamespaceManager_iface;
TRACE("returning iface %p\n", *obj);

View File

@ -10378,23 +10378,66 @@ static void test_load(void)
free_bstrs();
}
static void test_domobj_dispex(IUnknown *obj)
{
DISPID dispid = DISPID_XMLDOM_NODELIST_RESET;
IDispatchEx *dispex;
IUnknown *unk;
DWORD props;
UINT ticnt;
HRESULT hr;
BSTR name;
hr = IUnknown_QueryInterface(obj, &IID_IDispatchEx, (void**)&dispex);
EXPECT_HR(hr, S_OK);
if (FAILED(hr)) return;
ticnt = 0;
hr = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
EXPECT_HR(hr, S_OK);
ok(ticnt == 1, "ticnt=%u\n", ticnt);
name = SysAllocString(szstar);
hr = IDispatchEx_DeleteMemberByName(dispex, name, fdexNameCaseSensitive);
EXPECT_HR(hr, E_NOTIMPL);
SysFreeString(name);
hr = IDispatchEx_DeleteMemberByDispID(dispex, dispid);
EXPECT_HR(hr, E_NOTIMPL);
props = 0;
hr = IDispatchEx_GetMemberProperties(dispex, dispid, grfdexPropCanAll, &props);
EXPECT_HR(hr, E_NOTIMPL);
ok(props == 0, "expected 0 got %d\n", props);
hr = IDispatchEx_GetMemberName(dispex, dispid, &name);
EXPECT_HR(hr, E_NOTIMPL);
if (SUCCEEDED(hr)) SysFreeString(name);
hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_NODELIST_RESET, &dispid);
EXPECT_HR(hr, E_NOTIMPL);
hr = IDispatchEx_GetNameSpaceParent(dispex, &unk);
EXPECT_HR(hr, E_NOTIMPL);
if (hr == S_OK && unk) IUnknown_Release(unk);
IDispatchEx_Release(dispex);
}
static void test_nsnamespacemanager(void)
{
static const char xmluriA[] = "http://www.w3.org/XML/1998/namespace";
IMXNamespaceManager *nsmgr;
IVBMXNamespaceManager *mgr2;
IDispatch *disp;
HRESULT hr;
IMXNamespaceManager *nsmgr;
WCHAR buffW[250];
IDispatch *disp;
IUnknown *unk;
HRESULT hr;
INT len;
hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
&IID_IMXNamespaceManager, (void**)&nsmgr);
if (hr != S_OK)
{
win_skip("MXNamespaceManager is not available\n");
return;
}
EXPECT_HR(hr, S_OK);
/* IMXNamespaceManager inherits from IUnknown */
hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IDispatch, (void**)&disp);
@ -10491,6 +10534,12 @@ todo_wine {
ok(buffW[0] == 0, "got %x\n", buffW[0]);
ok(len == 0, "got %d\n", len);
/* IDispatchEx tests */
hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IUnknown, (void**)&unk);
EXPECT_HR(hr, S_OK);
test_domobj_dispex(unk);
IUnknown_Release(unk);
IMXNamespaceManager_Release(nsmgr);
free_bstrs();
@ -10506,11 +10555,7 @@ static void test_nsnamespacemanager_override(void)
hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
&IID_IMXNamespaceManager, (void**)&nsmgr);
if (hr != S_OK)
{
win_skip("MXNamespaceManager is not available\n");
return;
}
EXPECT_HR(hr, S_OK);
len = sizeof(buffW)/sizeof(WCHAR);
buffW[0] = 0;
@ -10606,52 +10651,6 @@ static void test_nsnamespacemanager_override(void)
free_bstrs();
}
static void test_domobj_dispex(IUnknown *obj)
{
DISPID dispid = DISPID_XMLDOM_NODELIST_RESET;
IDispatchEx *dispex;
IUnknown *unk;
DWORD props;
UINT ticnt;
HRESULT hr;
BSTR name;
hr = IUnknown_QueryInterface(obj, &IID_IDispatchEx, (void**)&dispex);
EXPECT_HR(hr, S_OK);
if (FAILED(hr)) return;
ticnt = 0;
hr = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
EXPECT_HR(hr, S_OK);
ok(ticnt == 1, "ticnt=%u\n", ticnt);
name = SysAllocString(szstar);
hr = IDispatchEx_DeleteMemberByName(dispex, name, fdexNameCaseSensitive);
EXPECT_HR(hr, E_NOTIMPL);
SysFreeString(name);
hr = IDispatchEx_DeleteMemberByDispID(dispex, dispid);
EXPECT_HR(hr, E_NOTIMPL);
props = 0;
hr = IDispatchEx_GetMemberProperties(dispex, dispid, grfdexPropCanAll, &props);
EXPECT_HR(hr, E_NOTIMPL);
ok(props == 0, "expected 0 got %d\n", props);
hr = IDispatchEx_GetMemberName(dispex, dispid, &name);
EXPECT_HR(hr, E_NOTIMPL);
if (SUCCEEDED(hr)) SysFreeString(name);
hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_NODELIST_RESET, &dispid);
EXPECT_HR(hr, E_NOTIMPL);
hr = IDispatchEx_GetNameSpaceParent(dispex, &unk);
EXPECT_HR(hr, E_NOTIMPL);
if (hr == S_OK && unk) IUnknown_Release(unk);
IDispatchEx_Release(dispex);
}
static const DOMNodeType nodetypes_test[] =
{
NODE_ELEMENT,
@ -11155,6 +11154,7 @@ static void test_nodeValue(void)
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
IUnknown *unk;
HRESULT hr;
hr = CoInitialize( NULL );
@ -11231,8 +11231,17 @@ START_TEST(domdoc)
test_xsltemplate();
test_nsnamespacemanager();
test_nsnamespacemanager_override();
hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
&IID_IMXNamespaceManager, (void**)&unk);
if (hr == S_OK)
{
test_nsnamespacemanager();
test_nsnamespacemanager_override();
IUnknown_Release(unk);
}
else
win_skip("MXNamespaceManager is not available\n");
CoUninitialize();
}