[PATCH 2/5] Add a stub IXSLProcessor
Nikolay Sivov
nsivov at codeweavers.com
Sat Feb 12 07:40:36 CST 2011
---
dlls/msxml3/dispex.c | 1 +
dlls/msxml3/msxml_private.h | 1 +
dlls/msxml3/stylesheet.c | 318 ++++++++++++++++++++++++++++++++++++++++++-
dlls/msxml3/tests/domdoc.c | 9 ++
4 files changed, 327 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c
index e155db1..1b8afb5 100644
--- a/dlls/msxml3/dispex.c
+++ b/dlls/msxml3/dispex.c
@@ -96,6 +96,7 @@ static REFIID tid_ids[] = {
&IID_IXMLElement,
&IID_IXMLDOMDocument,
&IID_IXMLHTTPRequest,
+ &IID_IXSLProcessor,
&IID_IXSLTemplate,
&IID_IVBSAXAttributes,
&IID_IVBSAXContentHandler,
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 431b2ba..8d9d8dd 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -59,6 +59,7 @@ typedef enum tid_t {
IXMLElement_tid,
IXMLDocument_tid,
IXMLHTTPRequest_tid,
+ IXSLProcessor_tid,
IXSLTemplate_tid,
IVBSAXAttributes_tid,
IVBSAXContentHandler_tid,
diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c
index 446a97f..1add7db 100644
--- a/dlls/msxml3/stylesheet.c
+++ b/dlls/msxml3/stylesheet.c
@@ -45,11 +45,24 @@ typedef struct _xsltemplate
IXMLDOMNode *node;
} xsltemplate;
+typedef struct _xslprocessor
+{
+ IXSLProcessor IXSLProcessor_iface;
+ LONG ref;
+} xslprocessor;
+
+static HRESULT XSLProcessor_create(IXSLProcessor**);
+
static inline xsltemplate *impl_from_IXSLTemplate( IXSLTemplate *iface )
{
return CONTAINING_RECORD(iface, xsltemplate, IXSLTemplate_iface);
}
+static inline xslprocessor *impl_from_IXSLProcessor( IXSLProcessor *iface )
+{
+ return CONTAINING_RECORD(iface, xslprocessor, IXSLProcessor_iface);
+}
+
static void xsltemplate_set_node( xsltemplate *This, IXMLDOMNode *node )
{
if (This->node) IXMLDOMNode_Release(This->node);
@@ -206,8 +219,11 @@ static HRESULT WINAPI xsltemplate_createProcessor( IXSLTemplate *iface,
{
xsltemplate *This = impl_from_IXSLTemplate( iface );
- FIXME("(%p)->(%p)\n", This, processor);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, processor);
+
+ if (!processor) return E_INVALIDARG;
+
+ return XSLProcessor_create(processor);
}
static const struct IXSLTemplateVtbl xsltemplate_vtbl =
@@ -248,6 +264,304 @@ HRESULT XSLTemplate_create(IUnknown *pUnkOuter, void **ppObj)
return S_OK;
}
+/*** IXSLProcessor ***/
+static HRESULT WINAPI xslprocessor_QueryInterface(
+ IXSLProcessor *iface,
+ REFIID riid,
+ void** ppvObject )
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+ if ( IsEqualGUID( riid, &IID_IXSLProcessor ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("Unsupported interface %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppvObject);
+ return S_OK;
+}
+
+static ULONG WINAPI xslprocessor_AddRef( IXSLProcessor *iface )
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+ return InterlockedIncrement( &This->ref );
+}
+
+static ULONG WINAPI xslprocessor_Release( IXSLProcessor *iface )
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+ ULONG ref;
+
+ ref = InterlockedDecrement( &This->ref );
+ if ( ref == 0 )
+ heap_free( This );
+
+ return ref;
+}
+
+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;
+}
+
+static HRESULT WINAPI xslprocessor_GetTypeInfo(
+ IXSLProcessor *iface,
+ UINT iTInfo, LCID lcid,
+ ITypeInfo** ppTInfo )
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+
+ return get_typeinfo(IXSLProcessor_tid, ppTInfo);
+}
+
+static HRESULT WINAPI xslprocessor_GetIDsOfNames(
+ IXSLProcessor *iface,
+ REFIID riid, LPOLESTR* rgszNames,
+ 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;
+}
+
+static HRESULT WINAPI xslprocessor_Invoke(
+ IXSLProcessor *iface,
+ DISPID dispIdMember, REFIID riid, LCID lcid,
+ WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
+ 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;
+}
+
+static HRESULT WINAPI xslprocessor_put_input( IXSLProcessor *iface, VARIANT input )
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_get_input( IXSLProcessor *iface, VARIANT *input )
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, input);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_get_ownerTemplate(
+ IXSLProcessor *iface,
+ IXSLTemplate **template)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, template);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_setStartMode(
+ IXSLProcessor *iface,
+ BSTR p,
+ BSTR uri)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%s %s): stub\n", This, wine_dbgstr_w(p), wine_dbgstr_w(uri));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_get_startMode(
+ IXSLProcessor *iface,
+ BSTR *p)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_get_startModeURI(
+ IXSLProcessor *iface,
+ BSTR *uri)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, uri);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_put_output(
+ IXSLProcessor *iface,
+ VARIANT output)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_get_output(
+ IXSLProcessor *iface,
+ VARIANT *output)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, output);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_transform(
+ IXSLProcessor *iface,
+ VARIANT_BOOL *pbool)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, pbool);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_reset( IXSLProcessor *iface )
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_get_readyState(
+ IXSLProcessor *iface,
+ LONG *state)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, state);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_addParameter(
+ IXSLProcessor *iface,
+ BSTR p,
+ VARIANT var,
+ BSTR uri)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%s %s): stub\n", This, wine_dbgstr_w(p), wine_dbgstr_w(uri));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_addObject(
+ IXSLProcessor *iface,
+ IDispatch *obj,
+ BSTR uri)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p %s): stub\n", This, obj, wine_dbgstr_w(uri));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xslprocessor_get_stylesheet(
+ IXSLProcessor *iface,
+ IXMLDOMNode **node)
+{
+ xslprocessor *This = impl_from_IXSLProcessor( iface );
+
+ FIXME("(%p)->(%p): stub\n", This, node);
+ return E_NOTIMPL;
+}
+
+static const struct IXSLProcessorVtbl xslprocessor_vtbl =
+{
+ xslprocessor_QueryInterface,
+ xslprocessor_AddRef,
+ xslprocessor_Release,
+ xslprocessor_GetTypeInfoCount,
+ xslprocessor_GetTypeInfo,
+ xslprocessor_GetIDsOfNames,
+ xslprocessor_Invoke,
+
+ xslprocessor_put_input,
+ xslprocessor_get_input,
+ xslprocessor_get_ownerTemplate,
+ xslprocessor_setStartMode,
+ xslprocessor_get_startMode,
+ xslprocessor_get_startModeURI,
+ xslprocessor_put_output,
+ xslprocessor_get_output,
+ xslprocessor_transform,
+ xslprocessor_reset,
+ xslprocessor_get_readyState,
+ xslprocessor_addParameter,
+ xslprocessor_addObject,
+ xslprocessor_get_stylesheet
+};
+
+HRESULT XSLProcessor_create(IXSLProcessor **ppObj)
+{
+ xslprocessor *This;
+
+ TRACE("(%p)\n", ppObj);
+
+ This = heap_alloc( sizeof (*This) );
+ if(!This)
+ return E_OUTOFMEMORY;
+
+ This->IXSLProcessor_iface.lpVtbl = &xslprocessor_vtbl;
+ This->ref = 1;
+
+ *ppObj = &This->IXSLProcessor_iface;
+
+ TRACE("returning iface %p\n", *ppObj);
+
+ return S_OK;
+}
+
#else
HRESULT XSLTemplate_create(IUnknown *pUnkOuter, void **ppObj)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index c1b5bb4..b4dc2e1 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -7661,6 +7661,7 @@ static void test_get_xml(void)
static void test_xsltemplate(void)
{
IXSLTemplate *template;
+ IXSLProcessor *processor;
IXMLDOMDocument *doc;
VARIANT_BOOL b;
HRESULT hr;
@@ -7717,6 +7718,14 @@ static void test_xsltemplate(void)
IXMLDOMDocument_Release(doc);
ok(ref2 > ref1, "got %d\n", ref2);
+ /* processor */
+ hr = IXSLTemplate_createProcessor(template, NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ hr = IXSLTemplate_createProcessor(template, &processor);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ IXSLProcessor_Release(processor);
+
/* drop reference */
hr = IXSLTemplate_putref_stylesheet(template, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
--
1.5.6.5
--------------060408090303010802050303--
More information about the wine-patches
mailing list