From bc6c9619b24929efda3f71224bef3702619849f0 Mon Sep 17 00:00:00 2001 From: Julien Schueller Date: Wed, 3 Apr 2024 18:38:47 +0200 Subject: [PATCH] OMEdit: Add support for LibXml2 instead of XmlPatterns (#11569) Closes #11558 --- OMEdit/CMakeLists.txt | 11 ++++- OMEdit/OMEditLIB/CMakeLists.txt | 18 +++++--- OMEdit/OMEditLIB/MainWindow.cpp | 1 + .../OMEditLIB/Modeling/ModelWidgetContainer.h | 1 - OMEdit/OMEditLIB/Util/Utilities.cpp | 42 ++++++++++++++++++- OMEdit/OMEditLIB/Util/Utilities.h | 26 +++++++++++- 6 files changed, 88 insertions(+), 11 deletions(-) diff --git a/OMEdit/CMakeLists.txt b/OMEdit/CMakeLists.txt index 316c8952195..2e358db7acc 100644 --- a/OMEdit/CMakeLists.txt +++ b/OMEdit/CMakeLists.txt @@ -8,15 +8,22 @@ set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME omedit) omc_option(OM_OMEDIT_INSTALL_RUNTIME_DLLS "Install the required runtime dll dependency DLLs to the binary directory. Valid only for Windows builds." ON) omc_option(OM_OMEDIT_ENABLE_TESTS "Enable building of OMEdit Testsuite tests." OFF) omc_option(OM_OMEDIT_ENABLE_QTWEBENGINE "Enable building of OMEdit with QtWebEngine instead of QtWebkit" OFF) +omc_option(OM_OMEDIT_ENABLE_LIBXML2 "Enable building of OMEdit with LibXml2 instead of XmlPatterns." OFF) set (OM_QT_MAJOR_VERSION 5 CACHE STRING "Qt version") -find_package(Qt${OM_QT_MAJOR_VERSION} COMPONENTS Widgets PrintSupport Xml XmlPatterns OpenGL Network Svg REQUIRED) -if (OM_OMEDIT_ENABLE_QTWEBENGINE) +find_package(Qt${OM_QT_MAJOR_VERSION} COMPONENTS Widgets PrintSupport Xml OpenGL Network Svg REQUIRED) +if (OM_OMEDIT_ENABLE_QTWEBENGINE OR OM_QT_MAJOR_VERSION VERSION_GREATER_EQUAL 6) find_package(Qt${OM_QT_MAJOR_VERSION} COMPONENTS WebEngineWidgets REQUIRED) else () find_package(Qt${OM_QT_MAJOR_VERSION} COMPONENTS WebKitWidgets REQUIRED) endif () +if (OM_OMEDIT_ENABLE_LIBXML2 OR OM_QT_MAJOR_VERSION VERSION_GREATER_EQUAL 6) + find_package(LibXml2 REQUIRED) +else () + find_package(Qt${OM_QT_MAJOR_VERSION} COMPONENTS XmlPatterns REQUIRED) +endif () + find_package(OpenSceneGraph COMPONENTS osg osgViewer osgUtil osgDB osgGA REQUIRED) find_package(OpenGL REQUIRED) diff --git a/OMEdit/OMEditLIB/CMakeLists.txt b/OMEdit/OMEditLIB/CMakeLists.txt index 2ff22ede681..911d615dcbe 100644 --- a/OMEdit/OMEditLIB/CMakeLists.txt +++ b/OMEdit/OMEditLIB/CMakeLists.txt @@ -311,16 +311,24 @@ target_link_libraries(OMEditLib PUBLIC omedit::debugger::parser) target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::Xml) target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::Widgets) target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::PrintSupport) -if (OM_OMEDIT_ENABLE_QTWEBENGINE) +target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::OpenGL) +target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::Network) +target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::Svg) + +if (OM_OMEDIT_ENABLE_QTWEBENGINE OR OM_QT_MAJOR_VERSION VERSION_GREATER_EQUAL 6) target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::WebEngineWidgets) target_compile_definitions(OMEditLib PUBLIC OM_OMEDIT_ENABLE_QTWEBENGINE) else () target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::WebKitWidgets) endif () -target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::OpenGL) -target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::Network) -target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::Svg) -target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::XmlPatterns) + +if (OM_OMEDIT_ENABLE_LIBXML2 OR OM_QT_MAJOR_VERSION VERSION_GREATER_EQUAL 6) + target_link_libraries(OMEditLib PUBLIC LibXml2::LibXml2) + target_compile_definitions(OMEditLib PUBLIC OM_OMEDIT_ENABLE_LIBXML2) +else () + target_link_libraries(OMEditLib PUBLIC Qt${OM_QT_MAJOR_VERSION}::XmlPatterns) +endif () + target_link_libraries(OMEditLib PUBLIC omc::3rd::opcua) target_link_libraries(OMEditLib PUBLIC OMPlotLib) target_link_libraries(OMEditLib PUBLIC OpenModelicaCompiler) diff --git a/OMEdit/OMEditLIB/MainWindow.cpp b/OMEdit/OMEditLIB/MainWindow.cpp index 997c792c7bd..42e2e0740e0 100644 --- a/OMEdit/OMEditLIB/MainWindow.cpp +++ b/OMEdit/OMEditLIB/MainWindow.cpp @@ -82,6 +82,7 @@ #include "CrashReport/CrashReportDialog.h" #include +#include namespace ToolBars { QString welcomePerspective = "welcomePerspective"; diff --git a/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h b/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h index 61c7476c3be..b5318ccf08a 100644 --- a/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h +++ b/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h @@ -59,7 +59,6 @@ #ifndef OM_OMEDIT_ENABLE_QTWEBENGINE #include #endif -#include #include #include #include diff --git a/OMEdit/OMEditLIB/Util/Utilities.cpp b/OMEdit/OMEditLIB/Util/Utilities.cpp index 6c5524fd36a..6a53750b4da 100644 --- a/OMEdit/OMEditLIB/Util/Utilities.cpp +++ b/OMEdit/OMEditLIB/Util/Utilities.cpp @@ -49,9 +49,16 @@ #include #include #include +#include +#include +#ifdef OM_OMEDIT_ENABLE_LIBXML2 +#include +#include +#else #include #include -#include +#endif + extern "C" { extern const char* System_openModelicaPlatform(); @@ -616,6 +623,38 @@ void Utilities::parseCompositeModelText(MessageHandler *pMessageHandler, QString schemaFile.close(); const QByteArray schemaData = schemaText.toUtf8(); +#ifdef OM_OMEDIT_ENABLE_LIBXML2 + xmlDocPtr doc; + QByteArray contentsArray(contents.toLocal8Bit()); + doc = xmlParseDoc((const xmlChar *)contentsArray.data()); + if (doc) + { + xmlParserInputBufferPtr buf = xmlParserInputBufferCreateMem(schemaData.data(), schemaData.size(), XML_CHAR_ENCODING_UTF8); + xmlDtdPtr dtd = xmlIOParseDTD(NULL, buf, XML_CHAR_ENCODING_UTF8); + xmlFreeParserInputBuffer(buf); + if (dtd) + { + xmlValidCtxtPtr vctxt; + vctxt = xmlNewValidCtxt(); + if (vctxt) + { + int ok = xmlValidateDtd(vctxt, doc, dtd); + if (!ok) + pMessageHandler->setFailed(true); + xmlFreeValidCtxt(vctxt); + } + else + pMessageHandler->setFailed(true); + xmlFreeDtd(dtd); + } + else + pMessageHandler->setFailed(true); + xmlFreeDoc(doc); + } + else + pMessageHandler->setFailed(true); + +#else QXmlSchema schema; schema.setMessageHandler(pMessageHandler); schema.load(schemaData); @@ -627,6 +666,7 @@ void Utilities::parseCompositeModelText(MessageHandler *pMessageHandler, QString pMessageHandler->setFailed(true); } } +#endif } /*! diff --git a/OMEdit/OMEditLIB/Util/Utilities.h b/OMEdit/OMEditLIB/Util/Utilities.h index 689693c0ef3..143190ce3a1 100644 --- a/OMEdit/OMEditLIB/Util/Utilities.h +++ b/OMEdit/OMEditLIB/Util/Utilities.h @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -60,6 +59,10 @@ #include #include +#ifndef OM_OMEDIT_ENABLE_LIBXML2 +#include +#endif + #if defined(_WIN32) #include #include @@ -334,10 +337,28 @@ inline QDataStream& operator>>(QDataStream& in, DebuggerConfiguration& configura * \brief Defines the appropriate error message of the parsed XML validated againast the XML Schema.\n * The class implementation and logic is inspired from Qt Creator sources. */ +#ifdef OM_OMEDIT_ENABLE_LIBXML2 +class MessageHandler +{ +public: + MessageHandler() {} + QString statusMessage() const { return mDescription;} + int line() const { return mLine;} + int column() const { return mColumn;} + void setFailed(bool failed) {mFailed = failed;} + bool isFailed() {return mFailed;} +private: + QString mDescription; + int mLine = 0; + int mColumn = 0; + bool mFailed = false; +}; +#else class MessageHandler : public QAbstractMessageHandler { public: - MessageHandler() : QAbstractMessageHandler(0) {mFailed = false;} + MessageHandler() + : QAbstractMessageHandler(0) {mFailed = false;} QString statusMessage() const { return mDescription;} int line() const { return mSourceLocation.line();} int column() const { return mSourceLocation.column();} @@ -356,6 +377,7 @@ class MessageHandler : public QAbstractMessageHandler QSourceLocation mSourceLocation; bool mFailed; }; +#endif typedef struct { QString mDelay;