summaryrefslogtreecommitdiff
path: root/src/utils/xml.cpp
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2010-08-05 16:28:30 -0600
committerJared Adams <jaxad0127@gmail.com>2010-08-05 16:42:54 -0600
commit6d315d0e61f419636021476582a49ab0b1f1b5e9 (patch)
tree38baba0bd749f2e36138f0119bfd13a4f9f1fcdb /src/utils/xml.cpp
parentc3e9fbfc9a92e5d75a0d1002cfba48947718dc4d (diff)
downloadmana-6d315d0e61f419636021476582a49ab0b1f1b5e9.tar.gz
mana-6d315d0e61f419636021476582a49ab0b1f1b5e9.tar.bz2
mana-6d315d0e61f419636021476582a49ab0b1f1b5e9.tar.xz
mana-6d315d0e61f419636021476582a49ab0b1f1b5e9.zip
Add better XML error logging and do some related cleanup
Error details from libxml2 are no longer ignored and are properly logged now. XML initialization code is now in the XML namespace. The XML::Document constructor that took a data pointer was removed because it wasn't being used and it would make the new logging less useful (no filename). Signed-off-by: Chuck Miller
Diffstat (limited to 'src/utils/xml.cpp')
-rw-r--r--src/utils/xml.cpp51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp
index 341f34c0..8d444fab 100644
--- a/src/utils/xml.cpp
+++ b/src/utils/xml.cpp
@@ -25,14 +25,30 @@
#include "resources/resourcemanager.h"
-#include <iostream>
+#include <libxml/parser.h>
+#include <libxml/xmlerror.h>
+
#include <fstream>
+#include <iostream>
namespace XML
{
+ static void xmlLogger(void *ctx, xmlErrorPtr error);
+
+ struct XMLContext
+ {
+ std::string file;
+ bool resman;
+ };
+
Document::Document(const std::string &filename, bool useResman):
mDoc(0)
{
+ XMLContext *ctx = new XMLContext();
+ ctx->file = filename;
+ ctx->resman = useResman;
+ xmlSetStructuredErrorFunc(ctx, xmlLogger);
+
int size;
char *data = NULL;
if (useResman)
@@ -75,11 +91,8 @@ namespace XML
{
logger->log("Error loading %s", filename.c_str());
}
- }
- Document::Document(const char *data, int size)
- {
- mDoc = xmlParseMemory(data, size);
+ xmlSetStructuredErrorFunc(NULL, xmlLogger);
}
Document::~Document()
@@ -144,4 +157,32 @@ namespace XML
return NULL;
}
+ static void xmlLogger(void *ctx, xmlErrorPtr error)
+ {
+ XMLContext *context = static_cast<XMLContext*>(ctx);
+
+ if (context)
+ logger->log("Error in XML file '%s' on line %d",
+ context->file.c_str(), error->line);
+ else
+ logger->log("Error in unknown xml file on line %d",
+ error->line);
+
+ logger->log(error->message);
+
+ // No need to keep errors around
+ xmlCtxtResetLastError(error->ctxt);
+ }
+
+ void init()
+ {
+ // Initialize libxml2 and check for potential ABI mismatches between
+ // compiled version and the shared library actually used.
+ xmlInitParser();
+ LIBXML_TEST_VERSION;
+
+ // Handle libxml2 error messages
+ xmlSetStructuredErrorFunc(NULL, xmlLogger);
+ }
+
} // namespace XML