Module: wine Branch: master Commit: e18d99da74a18d3e3a1d3e420d5c318da7d068a2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e18d99da74a18d3e3a1d3e420d...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Dec 7 00:22:34 2011 +0300
msxml3: Added IDispatchEx for IXSLProcessor.
---
dlls/msxml3/stylesheet.c | 71 +++++++++++++++++-------------------------- dlls/msxml3/tests/domdoc.c | 25 +++++++++++++++ 2 files changed, 53 insertions(+), 43 deletions(-)
diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c index 43607f5..716ebba 100644 --- a/dlls/msxml3/stylesheet.c +++ b/dlls/msxml3/stylesheet.c @@ -53,6 +53,7 @@ typedef struct _xsltemplate
typedef struct _xslprocessor { + DispatchEx dispex; IXSLProcessor IXSLProcessor_iface; LONG ref;
@@ -276,6 +277,10 @@ static HRESULT WINAPI xslprocessor_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)); @@ -305,6 +310,7 @@ static ULONG WINAPI xslprocessor_Release( IXSLProcessor *iface ) if (This->output) IStream_Release(This->output); SysFreeString(This->outstr); IXSLTemplate_Release(&This->stylesheet->IXSLTemplate_iface); + release_dispex(&This->dispex); heap_free( This ); }
@@ -314,11 +320,7 @@ static ULONG WINAPI xslprocessor_Release( IXSLProcessor *iface ) static HRESULT WINAPI xslprocessor_GetTypeInfoCount( IXSLProcessor *iface, UINT* pctinfo ) { xslprocessor *This = impl_from_IXSLProcessor( iface ); - - TRACE("(%p)->(%p)\n", This, pctinfo); - - *pctinfo = 1; - return S_OK; + return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo); }
static HRESULT WINAPI xslprocessor_GetTypeInfo( @@ -327,10 +329,8 @@ static HRESULT WINAPI xslprocessor_GetTypeInfo( ITypeInfo** ppTInfo ) { xslprocessor *This = impl_from_IXSLProcessor( iface ); - - TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); - - return get_typeinfo(IXSLProcessor_tid, ppTInfo); + return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, + iTInfo, lcid, ppTInfo); }
static HRESULT WINAPI xslprocessor_GetIDsOfNames( @@ -339,23 +339,8 @@ static HRESULT WINAPI xslprocessor_GetIDsOfNames( UINT cNames, LCID lcid, DISPID* rgDispId ) { xslprocessor *This = impl_from_IXSLProcessor( 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(IXSLProcessor_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 xslprocessor_Invoke( @@ -365,21 +350,8 @@ static HRESULT WINAPI xslprocessor_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr ) { xslprocessor *This = impl_from_IXSLProcessor( 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(IXSLProcessor_tid, &typeinfo); - if(SUCCEEDED(hr)) - { - hr = ITypeInfo_Invoke(typeinfo, &This->IXSLProcessor_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 xslprocessor_put_input( IXSLProcessor *iface, VARIANT input ) @@ -610,7 +582,7 @@ static HRESULT WINAPI xslprocessor_get_stylesheet( return E_NOTIMPL; }
-static const struct IXSLProcessorVtbl xslprocessor_vtbl = +static const struct IXSLProcessorVtbl XSLProcessorVtbl = { xslprocessor_QueryInterface, xslprocessor_AddRef, @@ -636,6 +608,18 @@ static const struct IXSLProcessorVtbl xslprocessor_vtbl = xslprocessor_get_stylesheet };
+static const tid_t xslprocessor_iface_tids[] = { + IXSLProcessor_tid, + 0 +}; + +static dispex_static_data_t xslprocessor_dispex = { + NULL, + IXSLProcessor_tid, + NULL, + xslprocessor_iface_tids +}; + HRESULT XSLProcessor_create(xsltemplate *template, IXSLProcessor **ppObj) { xslprocessor *This; @@ -646,13 +630,14 @@ HRESULT XSLProcessor_create(xsltemplate *template, IXSLProcessor **ppObj) if(!This) return E_OUTOFMEMORY;
- This->IXSLProcessor_iface.lpVtbl = &xslprocessor_vtbl; + This->IXSLProcessor_iface.lpVtbl = &XSLProcessorVtbl; This->ref = 1; This->input = NULL; This->output = NULL; This->outstr = NULL; This->stylesheet = template; IXSLTemplate_AddRef(&template->IXSLTemplate_iface); + init_dispex(&This->dispex, (IUnknown*)&This->IXSLProcessor_iface, &xslprocessor_dispex);
*ppObj = &This->IXSLProcessor_iface;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 6357814..ba32411 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; + IXSLProcessor *processor; IXSLTemplate *template; IXMLDOMDocument *doc; IXMLHTTPRequest *req; @@ -10826,6 +10827,30 @@ static void test_dispex(void) test_domobj_dispex(unk); IUnknown_Release(unk); IDispatchEx_Release(dispex); + + /* IXSLProcessor */ + hr = CoCreateInstance(&CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc); + EXPECT_HR(hr, S_OK); + b = VARIANT_FALSE; + hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformSSXML), &b); + EXPECT_HR(hr, S_OK); + ok(b == VARIANT_TRUE, "got %d\n", b); + + hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc); + EXPECT_HR(hr, S_OK); + IXMLDOMDocument_Release(doc); + + hr = IXSLTemplate_createProcessor(template, &processor); + EXPECT_HR(hr, S_OK); + hr = IXSLProcessor_QueryInterface(processor, &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); + + IXSLProcessor_Release(processor); IXSLTemplate_Release(template);
free_bstrs();