From 3e7f27e1fedc011ca4ae4a315966168edb41ae88 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 7 Jan 2016 14:30:39 +0100 Subject: [PATCH] Added error handler for DOM parsers --- include/Engine/Core/EntityFile.h | 29 ++++++++++++++++++++ include/Engine/Core/EntityFilePreprocessor.h | 7 +++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/include/Engine/Core/EntityFile.h b/include/Engine/Core/EntityFile.h index 4c2c7b3e..42a3891d 100644 --- a/include/Engine/Core/EntityFile.h +++ b/include/Engine/Core/EntityFile.h @@ -237,6 +237,35 @@ private: } }; +class EntityFileXMLErrorHandler : public xercesc::ErrorHandler +{ +public: + void warning(const xercesc::SAXParseException& e) override + { + reportParseException("Warning", e); + } + void error(const xercesc::SAXParseException& e) override + { + reportParseException("Error", e); + } + void fatalError(const xercesc::SAXParseException& e) override + { + reportParseException("FATAL ERROR", e); + } + void resetErrors() override { } + +private: + void reportParseException(std::string type, const xercesc::SAXParseException& e) + { + char* message = xercesc::XMLString::transcode(e.getMessage()); + char* systemID = xercesc::XMLString::transcode(e.getSystemId()); + std::cerr << systemID << ":" << e.getLineNumber() << ":" << e.getColumnNumber() << std::endl; + std::cerr << type << ": " << message << std::endl; + xercesc::XMLString::release(&systemID); + xercesc::XMLString::release(&message); + } +}; + class EntityFile : public Resource { friend class ResourceManager; diff --git a/include/Engine/Core/EntityFilePreprocessor.h b/include/Engine/Core/EntityFilePreprocessor.h index e0e4cd52..6bee4636 100644 --- a/include/Engine/Core/EntityFilePreprocessor.h +++ b/include/Engine/Core/EntityFilePreprocessor.h @@ -66,6 +66,7 @@ private: void parseComponentInfo() { using namespace xercesc; + EntityFileXMLErrorHandler errorHandler; auto grammarPool = m_EntityFile->GrammarPool(); bool whateverTheFuckThisIs; auto xsModel = grammarPool->getXSModel(whateverTheFuckThisIs); @@ -95,7 +96,7 @@ private: char* annotationString = XMLString::transcode(componentAnnotation->getAnnotationString()); MemBufInputSource annotationInput(reinterpret_cast(annotationString), strlen(annotationString), "MemBuf: Annotation String"); XercesDOMParser parser(nullptr, XMLPlatformUtils::fgMemoryManager, grammarPool); - //parser.setErrorHandler(m_ErrorHandler); + parser.setErrorHandler(&errorHandler); parser.parse(annotationInput); XMLString::release(&annotationString); auto doc = parser.getDocument(); @@ -178,13 +179,15 @@ private: { using namespace xercesc; + EntityFileXMLErrorHandler errorHandler; + for (auto& ci : m_ComponentInfo) { // Allocate memory for default values ci.second.Defaults = std::shared_ptr(new char[ci.second.Meta.Stride]); memset(ci.second.Defaults.get(), 0, ci.second.Meta.Stride); XercesDOMParser parser(nullptr, XMLPlatformUtils::fgMemoryManager); - //parser.setErrorHandler(m_ErrorHandler); + parser.setErrorHandler(&errorHandler); std::string componentName = ci.first; LOG_DEBUG("Parsing defaults for component %s", componentName.c_str());