msxml3: Basic put_input() method for IXSLProcessor.

This commit is contained in:
Nikolay Sivov 2011-02-16 16:44:04 +03:00 committed by Alexandre Julliard
parent 7a3226be46
commit 392934af90
2 changed files with 48 additions and 2 deletions

View File

@ -49,6 +49,8 @@ typedef struct _xslprocessor
{
IXSLProcessor IXSLProcessor_iface;
LONG ref;
IXMLDOMNode *input;
} xslprocessor;
static HRESULT XSLProcessor_create(IXSLProcessor**);
@ -302,7 +304,10 @@ static ULONG WINAPI xslprocessor_Release( IXSLProcessor *iface )
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
if (This->input) IXMLDOMNode_Release(This->input);
heap_free( This );
}
return ref;
}
@ -381,9 +386,39 @@ static HRESULT WINAPI xslprocessor_Invoke(
static HRESULT WINAPI xslprocessor_put_input( IXSLProcessor *iface, VARIANT input )
{
xslprocessor *This = impl_from_IXSLProcessor( iface );
IXMLDOMNode *input_node;
HRESULT hr;
FIXME("(%p): stub\n", This);
return E_NOTIMPL;
TRACE("(%p)->(%s)\n", This, debugstr_variant(&input));
/* try IXMLDOMNode directly first */
if (V_VT(&input) == VT_UNKNOWN)
hr = IUnknown_QueryInterface(V_UNKNOWN(&input), &IID_IXMLDOMNode, (void**)&input_node);
else if (V_VT(&input) == VT_DISPATCH)
hr = IDispatch_QueryInterface(V_DISPATCH(&input), &IID_IXMLDOMNode, (void**)&input_node);
else
{
IXMLDOMDocument *doc;
hr = DOMDocument_create(&CLSID_DOMDocument, NULL, (void**)&doc);
if (hr == S_OK)
{
VARIANT_BOOL b;
hr = IXMLDOMDocument_load(doc, input, &b);
if (hr == S_OK)
hr = IXMLDOMDocument_QueryInterface(doc, &IID_IXMLDOMNode, (void**)&input_node);
IXMLDOMDocument_Release(doc);
}
}
if (hr == S_OK)
{
if (This->input) IXMLDOMNode_Release(This->input);
This->input = input_node;
}
return hr;
}
static HRESULT WINAPI xslprocessor_get_input( IXSLProcessor *iface, VARIANT *input )
@ -554,6 +589,7 @@ HRESULT XSLProcessor_create(IXSLProcessor **ppObj)
This->IXSLProcessor_iface.lpVtbl = &xslprocessor_vtbl;
This->ref = 1;
This->input = NULL;
*ppObj = &This->IXSLProcessor_iface;

View File

@ -7666,6 +7666,7 @@ static void test_xsltemplate(void)
VARIANT_BOOL b;
HRESULT hr;
ULONG ref1, ref2;
VARIANT v;
template = create_xsltemplate(&IID_IXSLTemplate);
if (!template) return;
@ -7724,6 +7725,15 @@ static void test_xsltemplate(void)
hr = IXSLTemplate_createProcessor(template, &processor);
ok(hr == S_OK, "got 0x%08x\n", hr);
/* input no set yet */
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = NULL;
hr = IXSLProcessor_get_input(processor, &v);
todo_wine {
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(V_VT(&v) == VT_EMPTY, "got %d\n", V_VT(&v));
}
IXSLProcessor_Release(processor);
/* drop reference */