Nikolay Sivov : msxml3: Added IDispatchEx support for IXSLTemplate.
Alexandre Julliard
julliard at winehq.org
Thu Dec 8 13:43:38 CST 2011
Module: wine
Branch: master
Commit: f88ea3d2a76af998b2118ec823852af19f13aaf8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f88ea3d2a76af998b2118ec823852af19f13aaf8
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Dec 7 00:06:31 2011 +0300
msxml3: Added IDispatchEx support for IXSLTemplate.
---
dlls/msxml3/stylesheet.c | 77 +++++++++++++++++--------------------------
dlls/msxml3/tests/domdoc.c | 12 +++++++
2 files changed, 43 insertions(+), 46 deletions(-)
diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c
index 5a21d65..43607f5 100644
--- a/dlls/msxml3/stylesheet.c
+++ b/dlls/msxml3/stylesheet.c
@@ -44,6 +44,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
typedef struct _xsltemplate
{
+ DispatchEx dispex;
IXSLTemplate IXSLTemplate_iface;
LONG ref;
@@ -95,6 +96,10 @@ static HRESULT WINAPI xsltemplate_QueryInterface(
{
*ppvObject = iface;
}
+ else if (dispex_query_interface(&This->dispex, riid, ppvObject))
+ {
+ return *ppvObject ? S_OK : E_NOINTERFACE;
+ }
else
{
FIXME("Unsupported interface %s\n", debugstr_guid(riid));
@@ -121,6 +126,7 @@ static ULONG WINAPI xsltemplate_Release( IXSLTemplate *iface )
if ( ref == 0 )
{
if (This->node) IXMLDOMNode_Release( This->node );
+ release_dispex(&This->dispex);
heap_free( This );
}
@@ -130,11 +136,7 @@ static ULONG WINAPI xsltemplate_Release( IXSLTemplate *iface )
static HRESULT WINAPI xsltemplate_GetTypeInfoCount( IXSLTemplate *iface, UINT* pctinfo )
{
xsltemplate *This = impl_from_IXSLTemplate( iface );
-
- TRACE("(%p)->(%p)\n", This, pctinfo);
-
- *pctinfo = 1;
- return S_OK;
+ return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
}
static HRESULT WINAPI xsltemplate_GetTypeInfo(
@@ -143,10 +145,8 @@ static HRESULT WINAPI xsltemplate_GetTypeInfo(
ITypeInfo** ppTInfo )
{
xsltemplate *This = impl_from_IXSLTemplate( iface );
-
- TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
-
- return get_typeinfo(IXSLTemplate_tid, ppTInfo);
+ return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface,
+ iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI xsltemplate_GetIDsOfNames(
@@ -155,23 +155,8 @@ static HRESULT WINAPI xsltemplate_GetIDsOfNames(
UINT cNames, LCID lcid, DISPID* rgDispId )
{
xsltemplate *This = impl_from_IXSLTemplate( 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(IXSLTemplate_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 xsltemplate_Invoke(
@@ -181,21 +166,8 @@ static HRESULT WINAPI xsltemplate_Invoke(
EXCEPINFO* pExcepInfo, UINT* puArgErr )
{
xsltemplate *This = impl_from_IXSLTemplate( 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(IXSLTemplate_tid, &typeinfo);
- if(SUCCEEDED(hr))
- {
- hr = ITypeInfo_Invoke(typeinfo, &This->IXSLTemplate_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 xsltemplate_putref_stylesheet( IXSLTemplate *iface,
@@ -238,7 +210,7 @@ static HRESULT WINAPI xsltemplate_createProcessor( IXSLTemplate *iface,
return XSLProcessor_create(This, processor);
}
-static const struct IXSLTemplateVtbl xsltemplate_vtbl =
+static const struct IXSLTemplateVtbl XSLTemplateVtbl =
{
xsltemplate_QueryInterface,
xsltemplate_AddRef,
@@ -253,21 +225,34 @@ static const struct IXSLTemplateVtbl xsltemplate_vtbl =
xsltemplate_createProcessor
};
-HRESULT XSLTemplate_create(IUnknown *pUnkOuter, void **ppObj)
+static const tid_t xsltemplate_iface_tids[] = {
+ IXSLTemplate_tid,
+ 0
+};
+
+static dispex_static_data_t xsltemplate_dispex = {
+ NULL,
+ IXSLTemplate_tid,
+ NULL,
+ xsltemplate_iface_tids
+};
+
+HRESULT XSLTemplate_create(IUnknown *outer, void **ppObj)
{
xsltemplate *This;
- TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+ TRACE("(%p, %p)\n", outer, ppObj);
- if(pUnkOuter) FIXME("support aggregation, outer\n");
+ if(outer) FIXME("support aggregation, outer\n");
This = heap_alloc( sizeof (*This) );
if(!This)
return E_OUTOFMEMORY;
- This->IXSLTemplate_iface.lpVtbl = &xsltemplate_vtbl;
+ This->IXSLTemplate_iface.lpVtbl = &XSLTemplateVtbl;
This->ref = 1;
This->node = NULL;
+ init_dispex(&This->dispex, (IUnknown*)&This->IXSLTemplate_iface, &xsltemplate_dispex);
*ppObj = &This->IXSLTemplate_iface;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index b2a229b..6357814 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -10672,6 +10672,7 @@ static void test_dispex(void)
IXMLDOMNodeList *node_list;
IXMLDOMParseError *error;
IXMLDOMNamedNodeMap *map;
+ IXSLTemplate *template;
IXMLDOMDocument *doc;
IXMLHTTPRequest *req;
IXMLDOMElement *elem;
@@ -10816,6 +10817,17 @@ static void test_dispex(void)
IXMLHTTPRequest_Release(req);
}
+ /* IXSLTemplate */
+ template = create_xsltemplate(&IID_IXSLTemplate);
+ hr = IXSLTemplate_QueryInterface(template, &IID_IDispatchEx, (void**)&dispex);
+ EXPECT_HR(hr, S_OK);
+ hr = IDispatchEx_QueryInterface(dispex, &IID_IUnknown, (void**)&unk);
+ EXPECT_HR(hr, S_OK);
+ test_domobj_dispex(unk);
+ IUnknown_Release(unk);
+ IDispatchEx_Release(dispex);
+ IXSLTemplate_Release(template);
+
free_bstrs();
}
More information about the wine-cvs
mailing list