Kaydet (Commit) d181d8ac authored tarafından Fyodor Yemelyanenko's avatar Fyodor Yemelyanenko Kaydeden (comit) Michael Stahl

tdf#84237 use XErrorHandler in CDocumentBuilder

In documentbuilder.cxx added code to call XErrorHandler::warning and XErrorHandler::error functions (from DOM::warning_func and DOM::error_func)
In domtest.cxx added try {} catch () block to BasicTest::validInputTest, BasicTest::warningInputTest and BasicTest::errorInputTest and to SerializerTest::serializerTest. Also uncommented lines CPPUNIT_TEST(warningInputTest); and CPPUNIT_TEST(errorInputTest);

Unit tests are now working
(FatalError test removed, as lib2xml doesn't distinguish between error and fatal error and counts everything as error).

Change-Id: I27c5036df6a1cc5bef5dbb8171c201d81bae2ccd
Reviewed-on: https://gerrit.libreoffice.org/41376Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
Tested-by: 's avatarMichael Stahl <mstahl@redhat.com>
üst 3aab0593
This diff is collapsed.
......@@ -269,21 +269,71 @@ namespace DOM
// default warning handler does not trigger assertion
static void warning_func(void * ctx, const char * /*msg*/, ...)
{
SAL_INFO(
"unoxml",
"libxml2 warning: "
<< make_error_message(static_cast<xmlParserCtxtPtr>(ctx)));
try
{
xmlParserCtxtPtr const pctx = static_cast<xmlParserCtxtPtr>(ctx);
SAL_INFO(
"unoxml",
"libxml2 warning: "
<< make_error_message(pctx));
CDocumentBuilder * const pDocBuilder = static_cast<CDocumentBuilder*>(pctx->_private);
if (pDocBuilder->getErrorHandler().is()) // if custom error handler is set (using setErrorHandler ())
{
// Prepare SAXParseException to be passed to custom XErrorHandler::warning function
css::xml::sax::SAXParseException saxex;
saxex.Message = make_error_message(pctx);
saxex.LineNumber = static_cast<sal_Int32>(pctx->lastError.line);
saxex.ColumnNumber = static_cast<sal_Int32>(pctx->lastError.int2);
// Call custom warning function
pDocBuilder->getErrorHandler()->warning(::css::uno::Any(saxex));
}
}
catch (const css::uno::RuntimeException &e)
{
// Protect lib2xml from UNO Exception
SAL_WARN("unoxml",
"DOM::warning_func: caught RuntimeException"
<< e.Message);
}
}
// default error handler triggers assertion
static void error_func(void * ctx, const char * /*msg*/, ...)
{
SAL_WARN(
"unoxml",
"libxml2 error: "
<< make_error_message(static_cast<xmlParserCtxtPtr>(ctx)));
try
{
xmlParserCtxtPtr const pctx = static_cast<xmlParserCtxtPtr>(ctx);
SAL_WARN(
"unoxml",
"libxml2 error: "
<< make_error_message(pctx));
CDocumentBuilder * const pDocBuilder = static_cast<CDocumentBuilder*>(pctx->_private);
if (pDocBuilder->getErrorHandler().is()) // if custom error handler is set (using setErrorHandler ())
{
// Prepare SAXParseException to be passed to custom XErrorHandler::error function
css::xml::sax::SAXParseException saxex;
saxex.Message = make_error_message(pctx);
saxex.LineNumber = static_cast<sal_Int32>(pctx->lastError.line);
saxex.ColumnNumber = static_cast<sal_Int32>(pctx->lastError.int2);
// Call custom warning function
pDocBuilder->getErrorHandler()->error(::css::uno::Any(saxex));
}
}
catch (const css::uno::RuntimeException &e)
{
// Protect lib2xml from UNO Exception
SAL_WARN("unoxml",
"DOM::error_func: caught RuntimeException"
<< e.Message);
}
}
} // extern "C"
void throwEx(xmlParserCtxtPtr ctxt)
......
......@@ -123,6 +123,17 @@ namespace DOM
the XML document to be parsed.
*/
virtual void SAL_CALL setErrorHandler(const css::uno::Reference< css::xml::sax::XErrorHandler >& eh) override;
/*
Get the ErrorHandler to be used to report errors present in
the XML document to be parsed.
*/
const css::uno::Reference< css::xml::sax::XErrorHandler >& getErrorHandler()
{
return m_xErrorHandler;
}
};
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment