Nikolay Sivov : msxml3: Pass XSL processor parameters to libxml2.

Alexandre Julliard julliard at winehq.org
Fri Feb 14 15:02:10 CST 2014


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Feb 14 09:52:56 2014 +0400

msxml3: Pass XSL processor parameters to libxml2.

---

 dlls/msxml3/dispex.c        |    1 -
 dlls/msxml3/domdoc.c        |    1 -
 dlls/msxml3/httprequest.c   |    1 -
 dlls/msxml3/main.c          |    9 ++++++++
 dlls/msxml3/msxml_private.h |   16 ++++++++++++++
 dlls/msxml3/mxnamespace.c   |    1 -
 dlls/msxml3/node.c          |   49 +++++++++++++++++++++++++++++++++++++++++--
 dlls/msxml3/saxreader.c     |    1 -
 dlls/msxml3/stylesheet.c    |   22 +++++++------------
 9 files changed, 79 insertions(+), 22 deletions(-)

diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c
index 3c84e09..272f302 100644
--- a/dlls/msxml3/dispex.c
+++ b/dlls/msxml3/dispex.c
@@ -38,7 +38,6 @@
 #include "shlwapi.h"
 
 #include "wine/debug.h"
-#include "wine/list.h"
 #include "wine/unicode.h"
 
 #include "msxml_private.h"
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index b094b58..e981b94 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -49,7 +49,6 @@
 #include "objsafe.h"
 
 #include "wine/debug.h"
-#include "wine/list.h"
 
 #include "msxml_private.h"
 
diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 0fe36ed..cf53db4 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -47,7 +47,6 @@
 #include "msxml_private.h"
 
 #include "wine/debug.h"
-#include "wine/list.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c
index ae93ec9..1381904 100644
--- a/dlls/msxml3/main.c
+++ b/dlls/msxml3/main.c
@@ -36,6 +36,7 @@
 #   include <libxslt/transform.h>
 #  endif
 #  include <libxslt/xsltutils.h>
+#  include <libxslt/variables.h>
 #  include <libxslt/xsltInternals.h>
 # endif
 #endif
@@ -165,9 +166,13 @@ void* libxslt_handle = NULL;
 #ifdef SONAME_LIBXSLT
 # define DECL_FUNCPTR(f) typeof(f) * p##f = NULL
 DECL_FUNCPTR(xsltApplyStylesheet);
+DECL_FUNCPTR(xsltApplyStylesheetUser);
 DECL_FUNCPTR(xsltCleanupGlobals);
 DECL_FUNCPTR(xsltFreeStylesheet);
+DECL_FUNCPTR(xsltFreeTransformContext);
+DECL_FUNCPTR(xsltNewTransformContext);
 DECL_FUNCPTR(xsltParseStylesheetDoc);
+DECL_FUNCPTR(xsltQuoteUserParams);
 # undef DECL_FUNCPTR
 #endif
 
@@ -185,9 +190,13 @@ static void init_libxslt(void)
         if (needed) { WARN("Can't find symbol %s\n", #f); goto sym_not_found; }
     LOAD_FUNCPTR(xsltInit, 0);
     LOAD_FUNCPTR(xsltApplyStylesheet, 1);
+    LOAD_FUNCPTR(xsltApplyStylesheetUser, 1);
     LOAD_FUNCPTR(xsltCleanupGlobals, 1);
     LOAD_FUNCPTR(xsltFreeStylesheet, 1);
+    LOAD_FUNCPTR(xsltFreeTransformContext, 1);
+    LOAD_FUNCPTR(xsltNewTransformContext, 1);
     LOAD_FUNCPTR(xsltParseStylesheetDoc, 1);
+    LOAD_FUNCPTR(xsltQuoteUserParams, 1);
 #undef LOAD_FUNCPTR
 
     if (pxsltInit)
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index e584d99..5d2010f 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -24,6 +24,7 @@
 #include "dispex.h"
 
 #include "wine/unicode.h"
+#include "wine/list.h"
 
 #ifndef __WINE_CONFIG_H
 # error You must include config.h to use this header
@@ -217,6 +218,20 @@ static inline LPSTR heap_strdupWtoA(LPCWSTR str)
     return ret;
 }
 
+/* XSLProcessor parameter list */
+struct xslprocessor_par
+{
+    struct list entry;
+    BSTR name;
+    BSTR value;
+};
+
+struct xslprocessor_params
+{
+    struct list  list;
+    unsigned int count;
+};
+
 #ifdef HAVE_LIBXML2
 
 extern void schemasInit(void) DECLSPEC_HIDDEN;
@@ -354,6 +369,7 @@ extern HRESULT node_get_text(const xmlnode*,BSTR*) DECLSPEC_HIDDEN;
 extern HRESULT node_select_nodes(const xmlnode*,BSTR,IXMLDOMNodeList**) DECLSPEC_HIDDEN;
 extern HRESULT node_select_singlenode(const xmlnode*,BSTR,IXMLDOMNode**) DECLSPEC_HIDDEN;
 extern HRESULT node_transform_node(const xmlnode*,IXMLDOMNode*,BSTR*) DECLSPEC_HIDDEN;
+extern HRESULT node_transform_node_params(const xmlnode*,IXMLDOMNode*,BSTR*,const struct xslprocessor_params*) DECLSPEC_HIDDEN;
 extern HRESULT node_create_supporterrorinfo(const tid_t*,void**) DECLSPEC_HIDDEN;
 
 extern HRESULT get_domdoc_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document) DECLSPEC_HIDDEN;
diff --git a/dlls/msxml3/mxnamespace.c b/dlls/msxml3/mxnamespace.c
index c2d9cc3..14dfdd7 100644
--- a/dlls/msxml3/mxnamespace.c
+++ b/dlls/msxml3/mxnamespace.c
@@ -39,7 +39,6 @@
 #include "msxml_private.h"
 
 #include "wine/debug.h"
-#include "wine/list.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 4c03571..8b067b6 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -35,6 +35,7 @@
 #  ifdef HAVE_LIBXSLT_TRANSFORM_H
 #   include <libxslt/transform.h>
 #  endif
+#  include <libxslt/variables.h>
 #  include <libxslt/xsltutils.h>
 #  include <libxslt/xsltInternals.h>
 # endif
@@ -59,9 +60,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 extern void* libxslt_handle;
 # define MAKE_FUNCPTR(f) extern typeof(f) * p##f
 MAKE_FUNCPTR(xsltApplyStylesheet);
+MAKE_FUNCPTR(xsltApplyStylesheetUser);
 MAKE_FUNCPTR(xsltCleanupGlobals);
 MAKE_FUNCPTR(xsltFreeStylesheet);
+MAKE_FUNCPTR(xsltFreeTransformContext);
+MAKE_FUNCPTR(xsltNewTransformContext);
 MAKE_FUNCPTR(xsltParseStylesheetDoc);
+MAKE_FUNCPTR(xsltQuoteUserParams);
 # undef MAKE_FUNCPTR
 #endif
 
@@ -996,7 +1001,8 @@ static const xmlChar *get_output_buffer_content(xmlOutputBufferPtr output)
 #endif
 }
 
-HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *p)
+HRESULT node_transform_node_params(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *p,
+    const struct xslprocessor_params *params)
 {
 #ifdef SONAME_LIBXSLT
     xsltStylesheetPtr xsltSS;
@@ -1013,7 +1019,41 @@ HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *
     xsltSS = pxsltParseStylesheetDoc(sheet->node->doc);
     if(xsltSS)
     {
-        xmlDocPtr result = pxsltApplyStylesheet(xsltSS, This->node->doc, NULL);
+        const char **xslparams = NULL;
+        xmlDocPtr result;
+        unsigned int i;
+
+        /* convert our parameter list to libxml2 format */
+        if (params && params->count)
+        {
+            struct xslprocessor_par *par;
+
+            i = 0;
+            xslparams = heap_alloc((params->count*2 + 1)*sizeof(char*));
+            LIST_FOR_EACH_ENTRY(par, &params->list, struct xslprocessor_par, entry)
+            {
+                xslparams[i++] = (char*)xmlchar_from_wchar(par->name);
+                xslparams[i++] = (char*)xmlchar_from_wchar(par->value);
+            }
+            xslparams[i] = NULL;
+        }
+
+        if (xslparams)
+        {
+            xsltTransformContextPtr ctxt = pxsltNewTransformContext(xsltSS, This->node->doc);
+
+            /* push parameters to user context */
+            pxsltQuoteUserParams(ctxt, xslparams);
+            result = pxsltApplyStylesheetUser(xsltSS, This->node->doc, NULL, NULL, NULL, ctxt);
+            pxsltFreeTransformContext(ctxt);
+
+            for (i = 0; i < params->count*2; i++)
+                heap_free((char*)xslparams[i]);
+            heap_free(xslparams);
+        }
+        else
+            result = pxsltApplyStylesheet(xsltSS, This->node->doc, NULL);
+
         if(result)
         {
             const xmlChar *content;
@@ -1060,6 +1100,11 @@ HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *
 #endif
 }
 
+HRESULT node_transform_node(const xmlnode *node, IXMLDOMNode *stylesheet, BSTR *p)
+{
+    return node_transform_node_params(node, stylesheet, p, NULL);
+}
+
 HRESULT node_select_nodes(const xmlnode *This, BSTR query, IXMLDOMNodeList **nodes)
 {
     xmlChar* str;
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 8c407bd..baabdd4 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -42,7 +42,6 @@
 #include "shlwapi.h"
 
 #include "wine/debug.h"
-#include "wine/list.h"
 
 #include "msxml_private.h"
 
diff --git a/dlls/msxml3/stylesheet.c b/dlls/msxml3/stylesheet.c
index f0fa299..8073dde 100644
--- a/dlls/msxml3/stylesheet.c
+++ b/dlls/msxml3/stylesheet.c
@@ -37,7 +37,6 @@
 #include "msxml_private.h"
 
 #include "wine/debug.h"
-#include "wine/list.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
@@ -50,19 +49,6 @@ typedef struct
     IXMLDOMNode *node;
 } xsltemplate;
 
-struct xslprocessor_par
-{
-    struct list entry;
-    BSTR name;
-    BSTR value;
-};
-
-struct xslprocessor_params
-{
-    struct list  list;
-    unsigned int count;
-};
-
 typedef struct
 {
     DispatchEx dispex;
@@ -534,6 +520,7 @@ static HRESULT WINAPI xslprocessor_transform(
     IXSLProcessor *iface,
     VARIANT_BOOL  *ret)
 {
+#ifdef HAVE_LIBXML2
     xslprocessor *This = impl_from_IXSLProcessor( iface );
     HRESULT hr;
 
@@ -542,7 +529,8 @@ static HRESULT WINAPI xslprocessor_transform(
     if (!ret) return E_INVALIDARG;
 
     SysFreeString(This->outstr);
-    hr = IXMLDOMNode_transformNode(This->input, This->stylesheet->node, &This->outstr);
+
+    hr = node_transform_node_params(get_node_obj(This->input), This->stylesheet->node, &This->outstr, &This->params);
     if (hr == S_OK)
     {
         if (This->output)
@@ -558,6 +546,10 @@ static HRESULT WINAPI xslprocessor_transform(
         *ret = VARIANT_FALSE;
 
     return hr;
+#else
+    FIXME("libxml2 is required but wasn't present at compile time\n");
+    return E_NOTIMPL;
+#endif
 }
 
 static HRESULT WINAPI xslprocessor_reset( IXSLProcessor *iface )




More information about the wine-cvs mailing list