Adam Martinson : msxml3: Add schema parse/validate error callbacks.
Alexandre Julliard
julliard at winehq.org
Wed Nov 24 11:28:39 CST 2010
Module: wine
Branch: master
Commit: 92bfadef7f27960c4e45a902f04f51e02e33b1b7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=92bfadef7f27960c4e45a902f04f51e02e33b1b7
Author: Adam Martinson <amartinson at codeweavers.com>
Date: Mon Nov 22 20:59:40 2010 -0600
msxml3: Add schema parse/validate error callbacks.
---
dlls/msxml3/schema.c | 146 ++++++++++++++++++++++++++++++++------------------
1 files changed, 93 insertions(+), 53 deletions(-)
diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c
index e602e29..17439a5 100644
--- a/dlls/msxml3/schema.c
+++ b/dlls/msxml3/schema.c
@@ -214,6 +214,87 @@ static const BYTE hash_assoc_values[] =
116, 116, 116, 116, 116, 116
};
+static void LIBXML2_LOG_CALLBACK parser_error(void* ctx, char const* msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+ LIBXML2_CALLBACK_ERR(Schema_parse, msg, ap);
+ va_end(ap);
+}
+
+static void LIBXML2_LOG_CALLBACK parser_warning(void* ctx, char const* msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+ LIBXML2_CALLBACK_WARN(Schema_parse, msg, ap);
+ va_end(ap);
+}
+
+#ifdef HAVE_XMLSCHEMASSETPARSERSTRUCTUREDERRORS
+static void parser_serror(void* ctx, xmlErrorPtr err)
+{
+ LIBXML2_CALLBACK_SERROR(Schema_parse, err);
+}
+#endif
+
+static inline xmlSchemaPtr Schema_parse(xmlSchemaParserCtxtPtr spctx)
+{
+ TRACE("(%p)\n", spctx);
+
+ xmlSchemaSetParserErrors(spctx, parser_error, parser_warning, NULL);
+#ifdef HAVE_XMLSCHEMASSETPARSERSTRUCTUREDERRORS
+ xmlSchemaSetParserStructuredErrors(spctx, parser_serror, NULL);
+#endif
+
+ return xmlSchemaParse(spctx);
+}
+
+static void LIBXML2_LOG_CALLBACK validate_error(void* ctx, char const* msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+ LIBXML2_CALLBACK_ERR(Schema_validate_tree, 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(Schema_validate_tree, msg, ap);
+ va_end(ap);
+}
+
+#ifdef HAVE_XMLSCHEMASSETVALIDSTRUCTUREDERRORS
+static void validate_serror(void* ctx, xmlErrorPtr err)
+{
+ LIBXML2_CALLBACK_SERROR(Schema_validate_tree, err);
+}
+#endif
+
+static inline HRESULT Schema_validate_tree(xmlSchemaPtr schema, xmlNodePtr tree)
+{
+ xmlSchemaValidCtxtPtr svctx;
+ int err;
+
+ TRACE("(%p, %p)\n", schema, tree);
+ /* TODO: if validateOnLoad property is false,
+ * we probably need to validate the schema here. */
+ svctx = xmlSchemaNewValidCtxt(schema);
+ xmlSchemaSetValidErrors(svctx, validate_error, validate_warning, NULL);
+#ifdef HAVE_XMLSCHEMASSETVALIDSTRUCTUREDERRORS
+ xmlSchemaSetValidStructuredErrors(svctx, validate_serror, NULL);
+#endif
+
+ if (tree->type == XML_DOCUMENT_NODE)
+ err = xmlSchemaValidateDoc(svctx, (xmlDocPtr)tree);
+ else
+ err = xmlSchemaValidateOneElement(svctx, tree);
+
+ xmlSchemaFreeValidCtxt(svctx);
+ return err? S_FALSE : S_OK;
+}
+
static DWORD dt_hash(xmlChar const* str, int len /* calculated if -1 */)
{
DWORD hval = (len == -1)? xmlStrlen(str) : len;
@@ -491,14 +572,16 @@ HRESULT dt_validate(XDR_DT dt, xmlChar const* content)
xmlDocPtr tmp_doc;
xmlNodePtr node;
xmlNsPtr ns;
- xmlSchemaValidCtxtPtr svctx;
- BOOL valid;
+ HRESULT hr;
+
+ TRACE("(dt:%s, %s)\n", dt_to_str(dt), wine_dbgstr_a((char const*)content));
+
if (!datatypes_schema)
{
xmlSchemaParserCtxtPtr spctx;
assert(datatypes_src != NULL);
spctx = xmlSchemaNewMemParserCtxt((char const*)datatypes_src, datatypes_len);
- datatypes_schema = xmlSchemaParse(spctx);
+ datatypes_schema = Schema_parse(spctx);
xmlSchemaFreeParserCtxt(spctx);
}
@@ -539,22 +622,20 @@ HRESULT dt_validate(XDR_DT dt, xmlChar const* content)
assert(datatypes_schema != NULL);
if (content && xmlStrlen(content))
{
- svctx = xmlSchemaNewValidCtxt(datatypes_schema);
tmp_doc = xmlNewDoc(NULL);
node = xmlNewChild((xmlNodePtr)tmp_doc, NULL, dt_to_str(dt), content);
ns = xmlNewNs(node, DT_nsURI, BAD_CAST "dt");
xmlSetNs(node, ns);
xmlDocSetRootElement(tmp_doc, node);
- valid = !xmlSchemaValidateDoc(svctx, tmp_doc);
- xmlSchemaFreeValidCtxt(svctx);
+ hr = Schema_validate_tree(datatypes_schema, (xmlNodePtr)tmp_doc);
xmlFreeDoc(tmp_doc);
}
else
{ /* probably the node is being created manually and has no content yet */
- valid = TRUE;
+ hr = S_OK;
}
- return valid? S_OK : S_FALSE;
+ return hr;
break;
default:
FIXME("need to handle dt:%s\n", dt_to_str(dt));
@@ -745,7 +826,7 @@ static cache_entry* cache_entry_from_url(char const* url, xmlChar const* nsURI)
entry->ref = 0;
if (spctx)
{
- if((entry->schema = xmlSchemaParse(spctx)))
+ if((entry->schema = Schema_parse(spctx)))
{
/* TODO: if the nsURI is different from the default xmlns or targetNamespace,
* do we need to do something special here? */
@@ -783,7 +864,7 @@ static cache_entry* cache_entry_from_xsd_doc(xmlDocPtr doc, xmlChar const* nsURI
entry->ref = 0;
spctx = xmlSchemaNewDocParserCtxt(new_doc);
- if ((entry->schema = xmlSchemaParse(spctx)))
+ if ((entry->schema = Schema_parse(spctx)))
{
xmldoc_init(entry->schema->doc, &CLSID_DOMDocument40);
entry->doc = entry->schema->doc;
@@ -812,7 +893,7 @@ static cache_entry* cache_entry_from_xdr_doc(xmlDocPtr doc, xmlChar const* nsURI
entry->ref = 0;
spctx = xmlSchemaNewDocParserCtxt(xsd_doc);
- if ((entry->schema = xmlSchemaParse(spctx)))
+ if ((entry->schema = Schema_parse(spctx)))
{
entry->doc = new_doc;
xmldoc_init(entry->schema->doc, &CLSID_DOMDocument30);
@@ -1257,29 +1338,6 @@ static inline xmlNodePtr lookup_schema_element(xmlSchemaPtr schema, xmlNodePtr n
return (decl != NULL)? decl->node : NULL;
}
-static void LIBXML2_LOG_CALLBACK validate_error(void* ctx, char const* msg, ...)
-{
- va_list ap;
- va_start(ap, msg);
- LIBXML2_CALLBACK_ERR(SchemaCache_validate_tree, 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(SchemaCache_validate_tree, msg, ap);
- va_end(ap);
-}
-
-#ifdef HAVE_XMLSCHEMASSETVALIDSTRUCTUREDERRORS
-static void validate_serror(void* ctx, xmlErrorPtr err)
-{
- LIBXML2_CALLBACK_SERROR(SchemaCache_validate_tree, err);
-}
-#endif
-
HRESULT SchemaCache_validate_tree(IXMLDOMSchemaCollection2* iface, xmlNodePtr tree)
{
schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
@@ -1297,25 +1355,7 @@ HRESULT SchemaCache_validate_tree(IXMLDOMSchemaCollection2* iface, xmlNodePtr tr
/* TODO: if the ns is not in the cache, and it's a URL,
* do we try to load from that? */
if (schema)
- {
- xmlSchemaValidCtxtPtr svctx;
- int err;
- /* TODO: if validateOnLoad property is false,
- * we probably need to validate the schema here. */
- svctx = xmlSchemaNewValidCtxt(schema);
- xmlSchemaSetValidErrors(svctx, validate_error, validate_warning, NULL);
-#ifdef HAVE_XMLSCHEMASSETVALIDSTRUCTUREDERRORS
- xmlSchemaSetValidStructuredErrors(svctx, validate_serror, NULL);
-#endif
-
- if ((xmlNodePtr)tree->doc == tree)
- err = xmlSchemaValidateDoc(svctx, (xmlDocPtr)tree);
- else
- err = xmlSchemaValidateOneElement(svctx, tree);
-
- xmlSchemaFreeValidCtxt(svctx);
- return err? S_FALSE : S_OK;
- }
+ return Schema_validate_tree(schema, tree);
return E_FAIL;
}
More information about the wine-cvs
mailing list