Adam Martinson : msxml3: libxml2 error/warning callback functions.

Alexandre Julliard julliard at winehq.org
Thu Oct 28 12:19:53 CDT 2010


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

Author: Adam Martinson <amartinson at codeweavers.com>
Date:   Wed Oct 27 09:35:56 2010 -0500

msxml3: libxml2 error/warning callback functions.

---

 dlls/msxml3/domdoc.c        |   53 ++++++++++++++++++++++++++++++++++++------
 dlls/msxml3/main.c          |   44 ++++++++++++++++++++++++++++++++++-
 dlls/msxml3/msxml_private.h |   17 +++++++++++++
 dlls/msxml3/queryresult.c   |    8 +++++-
 4 files changed, 112 insertions(+), 10 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 78500e6..8a21402 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -356,6 +356,27 @@ static void sax_characters(void *ctx, const xmlChar *ch, int len)
     xmlSAX2Characters(ctx, ch, len);
 }
 
+static void LIBXML2_LOG_CALLBACK sax_error(void* ctx, char const* msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg);
+    LIBXML2_CALLBACK_ERR(doparse, msg, ap);
+    va_end(ap);
+}
+
+static void LIBXML2_LOG_CALLBACK sax_warning(void* ctx, char const* msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg);
+    LIBXML2_CALLBACK_WARN(doparse, msg, ap);
+    va_end(ap);
+}
+
+static void sax_serror(void* ctx, xmlErrorPtr err)
+{
+    LIBXML2_CALLBACK_SERROR(doparse, err);
+}
+
 static xmlDocPtr doparse(domdoc* This, char *ptr, int len, xmlChar const* encoding)
 {
     xmlDocPtr doc = NULL;
@@ -382,9 +403,9 @@ static xmlDocPtr doparse(domdoc* This, char *ptr, int len, xmlChar const* encodi
         sax_characters,                 /* ignorableWhitespace */
         xmlSAX2ProcessingInstruction,   /* processingInstruction */
         xmlSAX2Comment,                 /* comment */
-        NULL,                           /* TODO: warning */
-        NULL,                           /* TODO: error */
-        NULL,                           /* TODO: fatalError */
+        sax_warning,                    /* warning */
+        sax_error,                      /* error */
+        sax_error,                      /* fatalError */
         xmlSAX2GetParameterEntity,      /* getParameterEntity */
         xmlSAX2CDataBlock,              /* cdataBlock */
         xmlSAX2ExternalSubset,          /* externalSubset */
@@ -392,7 +413,7 @@ static xmlDocPtr doparse(domdoc* This, char *ptr, int len, xmlChar const* encodi
         NULL,                           /* _private */
         xmlSAX2StartElementNs,          /* startElementNs */
         xmlSAX2EndElementNs,            /* endElementNs */
-        NULL                            /* TODO: serror */
+        sax_serror                      /* serror */
     };
     xmlInitParser();
 
@@ -403,9 +424,9 @@ static xmlDocPtr doparse(domdoc* This, char *ptr, int len, xmlChar const* encodi
         return NULL;
     }
 
-	if (pctx->sax) xmlFree(pctx->sax);
+    if (pctx->sax) xmlFree(pctx->sax);
     pctx->sax = &sax_handler;
-	pctx->_private = This;
+    pctx->_private = This;
     pctx->recovery = 0;
     pctx->encoding = xmlStrdup(encoding);
     xmlParseDocument(pctx);
@@ -2417,6 +2438,22 @@ static HRESULT WINAPI domdoc_putref_schemas(
     return hr;
 }
 
+static void LIBXML2_LOG_CALLBACK validate_error(void* ctx, char const* msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg);
+    LIBXML2_CALLBACK_ERR(domdoc_validate, msg, ap);
+    va_end(ap);
+}
+
+static void LIBXML2_LOG_CALLBACK validate_warning(void* ctx, char const* msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg);
+    LIBXML2_CALLBACK_WARN(domdoc_validate, msg, ap);
+    va_end(ap);
+}
+
 static HRESULT WINAPI domdoc_validate(
     IXMLDOMDocument3* iface,
     IXMLDOMParseError** err)
@@ -2435,8 +2472,8 @@ static HRESULT WINAPI domdoc_validate(
     }
 
     vctx = xmlNewValidCtxt();
-    vctx->error = NULL; /* TODO: error callback */
-    vctx->warning = NULL; /* TODO: warning callback */
+    vctx->error = validate_error;
+    vctx->warning = validate_warning;
 
     if (xmlValidateDocument(vctx, get_doc(This)))
     {
diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c
index a7c35f9..133a914 100644
--- a/dlls/msxml3/main.c
+++ b/dlls/msxml3/main.c
@@ -42,6 +42,48 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 
 #ifdef HAVE_LIBXML2
 
+void wineXmlCallbackLog(char const* caller, xmlErrorLevel lvl, char const* msg, va_list ap)
+{
+    char* buf = NULL;
+    int len = 32, needed;
+    enum __wine_debug_class dbcl = __WINE_DBCL_ERR;
+    switch (lvl)
+    {
+        case XML_ERR_NONE:
+            dbcl = __WINE_DBCL_TRACE;
+            break;
+        case XML_ERR_WARNING:
+            dbcl = __WINE_DBCL_WARN;
+            break;
+        default:
+            break;
+    }
+
+    if (ap)
+    {
+        do
+        {
+            heap_free(buf);
+            buf = heap_alloc(len);
+            needed = vsnprintf(buf, len, msg, ap);
+            if (needed == -1)
+                len *= 2;
+            else if (needed >= len)
+                len = needed + 1;
+            else
+                needed = 0;
+        }
+        while (needed);
+
+        wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, buf);
+        heap_free(buf);
+    }
+    else
+    {
+        wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, msg);
+    }
+}
+
 /* Support for loading xml files from a Wine Windows drive */
 static int wineXmlMatchCallback (char const * filename)
 {
@@ -115,7 +157,7 @@ DECL_FUNCPTR(xsltApplyStylesheet);
 DECL_FUNCPTR(xsltCleanupGlobals);
 DECL_FUNCPTR(xsltFreeStylesheet);
 DECL_FUNCPTR(xsltParseStylesheetDoc);
-# undef MAKE_FUNCPTR
+# undef DECL_FUNCPTR
 #endif
 
 static void init_libxslt(void)
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index bccce1c..7fcfea7 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -106,6 +106,8 @@ BOOL dispex_query_interface(DispatchEx*,REFIID,void**);
 #include <libxml/parser.h>
 #endif
 
+#include <libxml/xmlerror.h>
+
 /* constructors */
 extern IUnknown         *create_domdoc( xmlNodePtr document );
 extern IUnknown         *create_xmldoc( void );
@@ -140,6 +142,21 @@ extern xmlNodePtr xmldoc_unlink_xmldecl(xmlDocPtr doc);
 
 extern HRESULT XMLElement_create( IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj, BOOL own );
 
+extern void wineXmlCallbackLog(char const* caller, xmlErrorLevel lvl, char const* msg, va_list ap);
+
+#define LIBXML2_LOG_CALLBACK __WINE_PRINTF_ATTR(2,3)
+
+#define LIBXML2_CALLBACK_TRACE(caller, msg, ap) \
+        wineXmlCallbackLog(#caller, XML_ERR_NONE, msg, ap)
+
+#define LIBXML2_CALLBACK_WARN(caller, msg, ap) \
+        wineXmlCallbackLog(#caller, XML_ERR_WARNING, msg, ap)
+
+#define LIBXML2_CALLBACK_ERR(caller, msg, ap) \
+        wineXmlCallbackLog(#caller, XML_ERR_ERROR, msg, ap)
+
+#define LIBXML2_CALLBACK_SERROR(caller, err) \
+        wineXmlCallbackLog(#caller, err->level, err->message, NULL)
 
 /* IXMLDOMNode Internal Structure */
 typedef struct _xmlnode
diff --git a/dlls/msxml3/queryresult.c b/dlls/msxml3/queryresult.c
index ffb16fc..70848d4 100644
--- a/dlls/msxml3/queryresult.c
+++ b/dlls/msxml3/queryresult.c
@@ -491,6 +491,11 @@ void XSLPattern_OP_IGEq(xmlXPathParserContextPtr pctx, int nargs)
     xmlFree(arg2);
 }
 
+static void query_serror(void* ctx, xmlErrorPtr err)
+{
+    LIBXML2_CALLBACK_SERROR(queryresult_create, err);
+}
+
 HRESULT queryresult_create(xmlNodePtr node, LPCWSTR szQuery, IXMLDOMNodeList **out)
 {
     queryresult *This = heap_alloc_zero(sizeof(queryresult));
@@ -513,6 +518,7 @@ HRESULT queryresult_create(xmlNodePtr node, LPCWSTR szQuery, IXMLDOMNodeList **o
     This->node = node;
     xmldoc_add_ref(This->node->doc);
 
+    ctxt->error = query_serror;
     ctxt->node = node;
     registerNamespaces(ctxt);
 
@@ -545,7 +551,7 @@ HRESULT queryresult_create(xmlNodePtr node, LPCWSTR szQuery, IXMLDOMNodeList **o
         xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_IGEq", XSLPattern_OP_IGEq);
     }
 
-    This->result = xmlXPathEval(str, ctxt);
+    This->result = xmlXPathEvalExpression(str, ctxt);
     if (!This->result || This->result->type != XPATH_NODESET)
     {
         hr = E_FAIL;




More information about the wine-cvs mailing list