|
Packit |
712bc5 |
/*
|
|
Packit |
712bc5 |
* Copyright (C) 2012 Intel Corporation
|
|
Packit |
712bc5 |
*
|
|
Packit |
712bc5 |
* Authors: Krzesimir Nowak <krnowak@openismus.com>
|
|
Packit |
712bc5 |
*
|
|
Packit |
712bc5 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
712bc5 |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
712bc5 |
* License as published by the Free Software Foundation; either
|
|
Packit |
712bc5 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
712bc5 |
*
|
|
Packit |
712bc5 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
712bc5 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
712bc5 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
712bc5 |
* Library General Public License for more details.
|
|
Packit |
712bc5 |
*
|
|
Packit |
712bc5 |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
712bc5 |
* License along with this library; if not, write to the
|
|
Packit |
712bc5 |
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Packit |
712bc5 |
* Boston, MA 02110-1301, USA.
|
|
Packit |
712bc5 |
*/
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
#include <libxml/parser.h>
|
|
Packit |
712bc5 |
#include <libxml/xmlschemas.h>
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
#include "xsd-data.h"
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
struct _XSDData {
|
|
Packit |
712bc5 |
xmlSchemaPtr schema;
|
|
Packit |
712bc5 |
xmlSchemaValidCtxtPtr valid_context;
|
|
Packit |
712bc5 |
};
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
XSDData *
|
|
Packit |
712bc5 |
xsd_data_new (const gchar *xsd_file)
|
|
Packit |
712bc5 |
{
|
|
Packit |
712bc5 |
XSDData *xsd_data = g_slice_new0 (XSDData);
|
|
Packit |
712bc5 |
gboolean failed = TRUE;
|
|
Packit |
712bc5 |
xmlSchemaParserCtxtPtr context = xmlSchemaNewParserCtxt (xsd_file);
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
if (context == NULL)
|
|
Packit |
712bc5 |
/* unable to create a parser context for the schema */
|
|
Packit |
712bc5 |
goto out;
|
|
Packit |
712bc5 |
xsd_data->schema = xmlSchemaParse (context);
|
|
Packit |
712bc5 |
if (xsd_data->schema == NULL)
|
|
Packit |
712bc5 |
/* the schema itself is not valid */
|
|
Packit |
712bc5 |
goto out;
|
|
Packit |
712bc5 |
xsd_data->valid_context = xmlSchemaNewValidCtxt (xsd_data->schema);
|
|
Packit |
712bc5 |
if (xsd_data->valid_context == NULL)
|
|
Packit |
712bc5 |
/* unable to create a validation context for the schema */
|
|
Packit |
712bc5 |
goto out;
|
|
Packit |
712bc5 |
failed = FALSE;
|
|
Packit |
712bc5 |
out:
|
|
Packit |
712bc5 |
if (context != NULL)
|
|
Packit |
712bc5 |
xmlSchemaFreeParserCtxt (context);
|
|
Packit |
712bc5 |
if (failed) {
|
|
Packit |
712bc5 |
xsd_data_free (xsd_data);
|
|
Packit |
712bc5 |
xsd_data = NULL;
|
|
Packit |
712bc5 |
}
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
return xsd_data;
|
|
Packit |
712bc5 |
}
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
void
|
|
Packit |
712bc5 |
xsd_data_free (XSDData *xsd_data)
|
|
Packit |
712bc5 |
{
|
|
Packit |
712bc5 |
if (xsd_data == NULL)
|
|
Packit |
712bc5 |
return;
|
|
Packit |
712bc5 |
if (xsd_data->valid_context != NULL)
|
|
Packit |
712bc5 |
xmlSchemaFreeValidCtxt (xsd_data->valid_context);
|
|
Packit |
712bc5 |
if (xsd_data->schema != NULL)
|
|
Packit |
712bc5 |
xmlSchemaFree (xsd_data->schema);
|
|
Packit |
712bc5 |
g_slice_free (XSDData, xsd_data);
|
|
Packit |
712bc5 |
}
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
gboolean
|
|
Packit |
712bc5 |
xsd_data_validate_doc (XSDData *xsd_data,
|
|
Packit |
712bc5 |
xmlDoc *doc)
|
|
Packit |
712bc5 |
{
|
|
Packit |
712bc5 |
static xmlSAXHandler empty_handler = {
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
XML_SAX2_MAGIC,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL,
|
|
Packit |
712bc5 |
NULL
|
|
Packit |
712bc5 |
};
|
|
Packit |
712bc5 |
xmlChar *dump = NULL;
|
|
Packit |
712bc5 |
int size = 0;
|
|
Packit |
712bc5 |
xmlParserInputBufferPtr buffer = NULL;
|
|
Packit |
712bc5 |
gboolean result = FALSE;
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
if (xsd_data == NULL)
|
|
Packit |
712bc5 |
return TRUE;
|
|
Packit |
712bc5 |
|
|
Packit |
712bc5 |
xmlDocDumpMemory (doc, &dump, &size);
|
|
Packit |
712bc5 |
if (dump == NULL)
|
|
Packit |
712bc5 |
goto out;
|
|
Packit |
712bc5 |
g_debug ("Doc dump:\n%s", dump);
|
|
Packit |
712bc5 |
buffer = xmlParserInputBufferCreateMem ((char *) dump,
|
|
Packit |
712bc5 |
size,
|
|
Packit |
712bc5 |
XML_CHAR_ENCODING_NONE);
|
|
Packit |
712bc5 |
if (buffer == NULL)
|
|
Packit |
712bc5 |
goto out;
|
|
Packit |
712bc5 |
if (!xmlSchemaValidateStream (xsd_data->valid_context,
|
|
Packit |
712bc5 |
buffer,
|
|
Packit |
712bc5 |
XML_CHAR_ENCODING_NONE,
|
|
Packit |
712bc5 |
&empty_handler,
|
|
Packit |
712bc5 |
NULL))
|
|
Packit |
712bc5 |
result = TRUE;
|
|
Packit |
712bc5 |
out:
|
|
Packit |
712bc5 |
/* Commented out, because it crashes because of double free. I
|
|
Packit |
712bc5 |
* suppose that it is freed by xmlSchemaValidateStream.
|
|
Packit |
712bc5 |
*/
|
|
Packit |
712bc5 |
/*
|
|
Packit |
712bc5 |
if (buffer)
|
|
Packit |
712bc5 |
xmlFreeParserInputBuffer (buffer);
|
|
Packit |
712bc5 |
*/
|
|
Packit |
712bc5 |
if (dump != NULL)
|
|
Packit |
712bc5 |
xmlFree (dump);
|
|
Packit |
712bc5 |
return result;
|
|
Packit |
712bc5 |
}
|