From 112cb5bb5475afec1c1cbf1d6728ce4880d0fee8 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Tue, 12 Jul 2005 19:58:48 +0000 Subject: Load /tmp/tmp.zfIyNk/libxml2-2.6.20 into packages/libxml2/branches/upstream/current. --- xmlreader.c | 266 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 254 insertions(+), 12 deletions(-) (limited to 'xmlreader.c') diff --git a/xmlreader.c b/xmlreader.c index 54a6bf8..14843eb 100644 --- a/xmlreader.c +++ b/xmlreader.c @@ -32,7 +32,10 @@ #include #include #include +#ifdef LIBXML_SCHEMAS_ENABLED #include +#include +#endif #include #ifdef LIBXML_XINCLUDE_ENABLED #include @@ -85,7 +88,8 @@ typedef enum { typedef enum { XML_TEXTREADER_NOT_VALIDATE = 0, XML_TEXTREADER_VALIDATE_DTD = 1, - XML_TEXTREADER_VALIDATE_RNG = 2 + XML_TEXTREADER_VALIDATE_RNG = 2, + XML_TEXTREADER_VALIDATE_XSD = 4 } xmlTextReaderValidate; struct _xmlTextReader { @@ -129,6 +133,11 @@ struct _xmlTextReader { xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */ int rngValidErrors;/* The number of errors detected */ xmlNodePtr rngFullNode; /* the node if RNG not progressive */ + /* Handling of Schemas validation */ + xmlSchemaPtr xsdSchemas; /* The Schemas schemas */ + xmlSchemaValidCtxtPtr xsdValidCtxt;/* The Schemas validation context */ + int xsdValidErrors;/* The number of errors detected */ + xmlSchemaSAXPlugPtr xsdPlug; /* the schemas plug in SAX pipeline */ #endif #ifdef LIBXML_XINCLUDE_ENABLED /* Handling of XInclude processing */ @@ -1522,6 +1531,13 @@ node_found: } } } +#endif /* LIBXML_PATTERN_ENABLED */ +#ifdef LIBXML_SCHEMAS_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_XSD) && + (reader->xsdValidErrors == 0) && + (reader->xsdValidCtxt != NULL)) { + reader->xsdValidErrors = !xmlSchemaIsValid(reader->xsdValidCtxt); + } #endif /* LIBXML_PATTERN_ENABLED */ return(1); node_end: @@ -1612,9 +1628,34 @@ xmlTextReaderNext(xmlTextReaderPtr reader) { * string must be deallocated by the caller. */ xmlChar * -xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { - TODO - return(NULL); +xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) +{ + xmlChar *resbuf; + xmlNodePtr node, cur_node; + xmlBufferPtr buff, buff2; + xmlDocPtr doc; + + if (xmlTextReaderExpand(reader) == NULL) { + return NULL; + } + doc = reader->doc; + buff = xmlBufferCreate(); + for (cur_node = reader->node->children; cur_node != NULL; + cur_node = cur_node->next) { + node = xmlDocCopyNode(cur_node, doc, 1); + buff2 = xmlBufferCreate(); + if (xmlNodeDump(buff2, doc, node, 0, 0) == -1) { + xmlFreeNode(node); + xmlBufferFree(buff2); + xmlBufferFree(buff); + return NULL; + } + xmlBufferCat(buff, buff2->content); + xmlFreeNode(node); + xmlBufferFree(buff2); + } + resbuf = buff->content; + return resbuf; } /** @@ -1628,9 +1669,32 @@ xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { * string must be deallocated by the caller. */ xmlChar * -xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { - TODO - return(NULL); +xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) +{ + xmlChar *resbuf; + xmlNodePtr node; + xmlBufferPtr buff; + xmlDocPtr doc; + + node = reader->node; + doc = reader->doc; + if (xmlTextReaderExpand(reader) == NULL) { + return NULL; + } + node = xmlDocCopyNode(node, doc, 1); + buff = xmlBufferCreate(); + if (xmlNodeDump(buff, doc, node, 0, 0) == -1) { + xmlFreeNode(node); + xmlBufferFree(buff); + return NULL; + } + + resbuf = buff->content; + buff->content = NULL; + + xmlFreeNode(node); + xmlBufferFree(buff); + return resbuf; } /** @@ -2070,6 +2134,18 @@ xmlFreeTextReader(xmlTextReaderPtr reader) { xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); reader->rngValidCtxt = NULL; } + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } #endif #ifdef LIBXML_XINCLUDE_ENABLED if (reader->xincctxt != NULL) @@ -3858,6 +3934,80 @@ xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) { return(0); } +/** + * xmlTextReaderSetSchema: + * @reader: the xmlTextReaderPtr used + * @schema: a precompiled Schema schema + * + * Use XSD Schema to validate the document as it is processed. + * Activation is only possible before the first Read(). + * if @schema is NULL, then Schema validation is desactivated. + @ The @schema should not be freed until the reader is deallocated + * or its use has been deactivated. + * + * Returns 0 in case the Schema validation could be (des)activated and + * -1 in case of error. + */ +int +xmlTextReaderSetSchema(xmlTextReaderPtr reader, xmlSchemaPtr schema) { + if (reader == NULL) + return(-1); + if (schema == NULL) { + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } + return(0); + } + if (reader->mode != XML_TEXTREADER_MODE_INITIAL) + return(-1); + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } + reader->xsdValidCtxt = xmlSchemaNewValidCtxt(schema); + if (reader->xsdValidCtxt == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + return(-1); + } + reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, + &(reader->ctxt->sax), + &(reader->ctxt->userData)); + if (reader->xsdPlug == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + return(-1); + } + if (reader->errorFunc != NULL) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, + (xmlSchemaValidityErrorFunc)reader->errorFunc, + (xmlSchemaValidityWarningFunc) reader->errorFunc, + reader->errorFuncArg); + } + reader->xsdValidErrors = 0; + reader->validate = XML_TEXTREADER_VALIDATE_XSD; + return(0); +} + /** * xmlTextReaderRelaxNGValidate: * @reader: the xmlTextReaderPtr used @@ -3878,14 +4028,14 @@ xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { return(-1); if (rng == NULL) { - if (reader->rngSchemas != NULL) { - xmlRelaxNGFree(reader->rngSchemas); - reader->rngSchemas = NULL; - } if (reader->rngValidCtxt != NULL) { xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); reader->rngValidCtxt = NULL; } + if (reader->rngSchemas != NULL) { + xmlRelaxNGFree(reader->rngSchemas); + reader->rngSchemas = NULL; + } return(0); } if (reader->mode != XML_TEXTREADER_MODE_INITIAL) @@ -3910,8 +4060,11 @@ xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { if (reader->rngSchemas == NULL) return(-1); reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); - if (reader->rngValidCtxt == NULL) + if (reader->rngValidCtxt == NULL) { + xmlRelaxNGFree(reader->rngSchemas); + reader->rngSchemas = NULL; return(-1); + } if (reader->errorFunc != NULL) { xmlRelaxNGSetValidErrors(reader->rngValidCtxt, (xmlRelaxNGValidityErrorFunc)reader->errorFunc, @@ -3923,6 +4076,93 @@ xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { reader->validate = XML_TEXTREADER_VALIDATE_RNG; return(0); } + +/** + * xmlTextReaderSchemaValidate: + * @reader: the xmlTextReaderPtr used + * @xsd: the path to a W3C XSD schema or NULL + * + * Use W3C XSD schema to validate the document as it is processed. + * Activation is only possible before the first Read(). + * if @xsd is NULL, then RelaxNG validation is desactivated. + * + * Returns 0 in case the schemas validation could be (des)activated and + * -1 in case of error. + */ +int +xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) { + xmlSchemaParserCtxtPtr ctxt; + + if (reader == NULL) + return(-1); + + if (xsd == NULL) { + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } + if (reader->xsdValidCtxt != NULL) { + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + return(0); + } + if ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || + (reader->ctxt == NULL)) + return(-1); + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } + ctxt = xmlSchemaNewParserCtxt(xsd); + if (reader->errorFunc != NULL) { + xmlSchemaSetParserErrors(ctxt, + (xmlSchemaValidityErrorFunc) reader->errorFunc, + (xmlSchemaValidityWarningFunc) reader->errorFunc, + reader->errorFuncArg); + } + reader->xsdSchemas = xmlSchemaParse(ctxt); + xmlSchemaFreeParserCtxt(ctxt); + if (reader->xsdSchemas == NULL) + return(-1); + reader->xsdValidCtxt = xmlSchemaNewValidCtxt(reader->xsdSchemas); + if (reader->xsdValidCtxt == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + return(-1); + } + reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, + &(reader->ctxt->sax), + &(reader->ctxt->userData)); + if (reader->xsdPlug == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + return(-1); + } + if (reader->errorFunc != NULL) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, + (xmlSchemaValidityErrorFunc)reader->errorFunc, + (xmlSchemaValidityWarningFunc) reader->errorFunc, + reader->errorFuncArg); + } + reader->xsdValidErrors = 0; + reader->validate = XML_TEXTREADER_VALIDATE_XSD; + return(0); +} #endif /** @@ -4291,6 +4531,8 @@ xmlTextReaderIsValid(xmlTextReaderPtr reader) { #ifdef LIBXML_SCHEMAS_ENABLED if (reader->validate == XML_TEXTREADER_VALIDATE_RNG) return(reader->rngValidErrors == 0); + if (reader->validate == XML_TEXTREADER_VALIDATE_XSD) + return(reader->xsdValidErrors == 0); #endif if ((reader->ctxt != NULL) && (reader->ctxt->validate == 1)) return(reader->ctxt->valid); -- cgit v1.2.3