Nikolay Sivov : msxml3: Basic put_input() method for IXSLProcessor.

Alexandre Julliard julliard at winehq.org
Wed Feb 16 11:14:12 CST 2011


Module: wine
Branch: master
Commit: 392934af901223ae5f0a0d1e83d69c270721ddc8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=392934af901223ae5f0a0d1e83d69c270721ddc8

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Feb 16 16:44:04 2011 +0300

msxml3: Basic put_input() method for IXSLProcessor.

---

 dlls/msxml3/stylesheet.c   |   40 ++++++++++++++++++++++++++++++++++++++--
 dlls/msxml3/tests/domdoc.c |   10 ++++++++++
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c
index 1add7db..6d7507e 100644
--- a/dlls/msxml3/stylesheet.c
+++ b/dlls/msxml3/stylesheet.c
@@ -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;
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index b4dc2e1..0c8fff2 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -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 */




More information about the wine-cvs mailing list