diff --git a/CMakeLists.txt b/CMakeLists.txt index 0739791..82031b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,95 +1,102 @@ cmake_minimum_required(VERSION 3.0) set(KF5_VERSION "5.51.0") # handled by release scripts set(KF5_DEP_VERSION "5.50.0") # handled by release scripts project(KParts VERSION ${KF5_VERSION}) include(FeatureSummary) find_package(ECM 5.50.0 NO_MODULE) set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://projects.kde.org/projects/kdesupport/extra-cmake-modules") feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) set(REQUIRED_QT_VERSION 5.8.0) find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Core Widgets Xml) include(KDEInstallDirs) include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) include(KDECMakeSettings) include(KDEPackageAppTemplates) include(ECMAddQch) include(GenerateExportHeader) include(ECMSetupVersion) option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF) add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)") ecm_setup_version(PROJECT VARIABLE_PREFIX KPARTS VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kparts_version.h" PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5PartsConfigVersion.cmake" SOVERSION 5) find_package(KF5Config ${KF5_DEP_VERSION} REQUIRED) find_package(KF5CoreAddons ${KF5_DEP_VERSION} REQUIRED) find_package(KF5I18n ${KF5_DEP_VERSION} REQUIRED) find_package(KF5IconThemes ${KF5_DEP_VERSION} REQUIRED) find_package(KF5KIO ${KF5_DEP_VERSION} REQUIRED) find_package(KF5JobWidgets ${KF5_DEP_VERSION} REQUIRED) find_package(KF5Service ${KF5_DEP_VERSION} REQUIRED) find_package(KF5TextWidgets ${KF5_DEP_VERSION} REQUIRED) find_package(KF5WidgetsAddons ${KF5_DEP_VERSION} REQUIRED) find_package(KF5XmlGui ${KF5_DEP_VERSION} REQUIRED) remove_definitions(-DQT_NO_CAST_FROM_ASCII) remove_definitions(-DQT_NO_CAST_FROM_BYTEARRAY) if(BUILD_TESTING) add_subdirectory( tests ) add_subdirectory( autotests ) endif() add_definitions(-DTRANSLATION_DOMAIN=\"kparts5\") if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po") ki18n_install(po) endif() +add_definitions(-DQT_NO_CAST_FROM_ASCII) +add_definitions(-DQT_NO_CAST_TO_ASCII) +add_definitions(-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT) +add_definitions(-DQT_NO_URL_CAST_FROM_STRING) +add_definitions(-DQT_USE_QSTRINGBUILDER) +#add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x060000) + add_subdirectory( src ) add_subdirectory(templates) # create a Config.cmake and a ConfigVersion.cmake file and install them set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Parts") if (BUILD_QCH) ecm_install_qch_export( TARGETS KF5Parts_QCH FILE KF5PartsQchTargets.cmake DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF5PartsQchTargets.cmake\")") endif() include(CMakePackageConfigHelpers) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/KF5PartsConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/KF5PartsConfig.cmake" INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/KF5PartsConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/KF5PartsConfigVersion.cmake" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) install(EXPORT KF5PartsTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5PartsTargets.cmake NAMESPACE KF5:: ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kparts_version.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel ) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/src/plugin.cpp b/src/plugin.cpp index 9c3c29d..7ac2446 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -1,300 +1,300 @@ /* This file is part of the KDE project Copyright (C) 1999 Simon Hausmann (C) 1999 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "plugin.h" #include "part.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace KParts; class Q_DECL_HIDDEN Plugin::PluginPrivate { public: QString m_parentInstance; QString m_library; // filename of the library }; Plugin::Plugin(QObject *parent) : QObject(parent), d(new PluginPrivate()) { //qDebug() << className(); } Plugin::~Plugin() { delete d; } QString Plugin::xmlFile() const { QString path = KXMLGUIClient::xmlFile(); if (d->m_parentInstance.isEmpty() || (!path.isEmpty() && QDir::isAbsolutePath(path))) { return path; } QString absPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, d->m_parentInstance + QLatin1Char('/') + path); Q_ASSERT(!absPath.isEmpty()); return absPath; } QString Plugin::localXMLFile() const { QString path = KXMLGUIClient::xmlFile(); if (d->m_parentInstance.isEmpty() || (!path.isEmpty() && QDir::isAbsolutePath(path))) { return path; } QString absPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1Char('/') + d->m_parentInstance + QLatin1Char('/') + path; return absPath; } //static QList Plugin::pluginInfos(const QString &componentName) { QList plugins; QMap sortedPlugins; const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, componentName + QStringLiteral("/kpartplugins"), QStandardPaths::LocateDirectory); Q_FOREACH (const QString &dir, dirs) { - Q_FOREACH (const QString &file, QDir(dir).entryList(QStringList("*.rc"))) { + Q_FOREACH (const QString &file, QDir(dir).entryList(QStringList(QStringLiteral("*.rc")))) { const QFileInfo fInfo(dir + QLatin1Char('/') + file); QMap::Iterator mapIt = sortedPlugins.find(fInfo.fileName()); if (mapIt == sortedPlugins.end()) { mapIt = sortedPlugins.insert(fInfo.fileName(), QStringList()); } mapIt.value().append(fInfo.absoluteFilePath()); } } QMap::ConstIterator mapIt = sortedPlugins.constBegin(); QMap::ConstIterator mapEnd = sortedPlugins.constEnd(); for (; mapIt != mapEnd; ++mapIt) { PluginInfo info; QString doc; info.m_absXMLFileName = KXMLGUIClient::findMostRecentXMLFile(mapIt.value(), doc); if (info.m_absXMLFileName.isEmpty()) { continue; } // qDebug() << "found KParts Plugin : " << info.m_absXMLFileName; info.m_relXMLFileName = QStringLiteral("kpartplugins/") + mapIt.key(); info.m_document.setContent(doc); if (info.m_document.documentElement().isNull()) { continue; } plugins.append(info); } return plugins; } void Plugin::loadPlugins(QObject *parent, const QString &componentName) { loadPlugins(parent, pluginInfos(componentName), componentName); } void Plugin::loadPlugins(QObject *parent, const QList &pluginInfos, const QString &componentName) { QList::ConstIterator pIt = pluginInfos.begin(); QList::ConstIterator pEnd = pluginInfos.end(); for (; pIt != pEnd; ++pIt) { QString library = (*pIt).m_document.documentElement().attribute(QStringLiteral("library")); if (library.isEmpty() || hasPlugin(parent, library)) { continue; } Plugin *plugin = loadPlugin(parent, library, (*pIt).m_document.documentElement().attribute(QStringLiteral("X-KDE-PluginKeyword"))); if (plugin) { plugin->d->m_parentInstance = componentName; plugin->setXMLFile((*pIt).m_relXMLFileName, false, false); plugin->setDOMDocument((*pIt).m_document); } } } void Plugin::loadPlugins(QObject *parent, const QList &pluginInfos) { loadPlugins(parent, pluginInfos, QString()); } // static Plugin *Plugin::loadPlugin(QObject *parent, const QString &libname, const QString &keyword) { KPluginLoader loader(libname); KPluginFactory *factory = loader.factory(); if (!factory) { return nullptr; } Plugin *plugin = factory->create(keyword, parent); if (!plugin) { return nullptr; } plugin->d->m_library = libname; return plugin; } QList Plugin::pluginObjects(QObject *parent) { QList objects; if (!parent) { return objects; } objects = parent->findChildren(QString(), Qt::FindDirectChildrenOnly); return objects; } bool Plugin::hasPlugin(QObject *parent, const QString &library) { const QObjectList plugins = parent->children(); QObjectList::ConstIterator it = plugins.begin(); for (; it != plugins.end(); ++it) { Plugin *plugin = qobject_cast(*it); if (plugin && plugin->d->m_library == library) { return true; } } return false; } void Plugin::setComponentData(const KAboutData &pluginData) { KAboutData::registerPluginData(pluginData); KXMLGUIClient::setComponentName(pluginData.componentName(), pluginData.displayName()); } void Plugin::loadPlugins(QObject *parent, KXMLGUIClient *parentGUIClient, const QString &componentName, bool enableNewPluginsByDefault, int interfaceVersionRequired) { KConfigGroup cfgGroup(KSharedConfig::openConfig(componentName + QStringLiteral("rc")), "KParts Plugins"); const QList plugins = pluginInfos(componentName); QList::ConstIterator pIt = plugins.begin(); const QList::ConstIterator pEnd = plugins.end(); for (; pIt != pEnd; ++pIt) { QDomElement docElem = (*pIt).m_document.documentElement(); QString library = docElem.attribute(QStringLiteral("library")); QString keyword; if (library.isEmpty()) { continue; } // Check configuration const QString name = docElem.attribute(QStringLiteral("name")); bool pluginEnabled = enableNewPluginsByDefault; if (cfgGroup.hasKey(name + QStringLiteral("Enabled"))) { pluginEnabled = cfgGroup.readEntry(name + QStringLiteral("Enabled"), false); } else { // no user-setting, load plugin default setting QString relPath = componentName + QLatin1Char('/') + (*pIt).m_relXMLFileName; relPath.truncate(relPath.lastIndexOf(QLatin1Char('.'))); // remove extension relPath += QStringLiteral(".desktop"); //qDebug() << "looking for " << relPath; const QString desktopfile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, relPath); if (!desktopfile.isEmpty()) { //qDebug() << "loadPlugins found desktop file for " << name << ": " << desktopfile; KDesktopFile _desktop(desktopfile); const KConfigGroup desktop = _desktop.desktopGroup(); keyword = desktop.readEntry("X-KDE-PluginKeyword", ""); pluginEnabled = desktop.readEntry("X-KDE-PluginInfo-EnabledByDefault", enableNewPluginsByDefault); if (interfaceVersionRequired != 0) { const int version = desktop.readEntry("X-KDE-InterfaceVersion", 1); if (version != interfaceVersionRequired) { // qDebug() << "Discarding plugin " << name << ", interface version " << version << ", expected " << interfaceVersionRequired; pluginEnabled = false; } } } else { //qDebug() << "loadPlugins no desktop file found in " << relPath; } } // search through already present plugins const QObjectList pluginList = parent->children(); bool pluginFound = false; for (QObjectList::ConstIterator it = pluginList.begin(); it != pluginList.end(); ++it) { Plugin *plugin = qobject_cast(*it); if (plugin && plugin->d->m_library == library) { // delete and unload disabled plugins if (!pluginEnabled) { // qDebug() << "remove plugin " << name; KXMLGUIFactory *factory = plugin->factory(); if (factory) { factory->removeClient(plugin); } delete plugin; } pluginFound = true; break; } } // if the plugin is already loaded or if it's disabled in the // configuration do nothing if (pluginFound || !pluginEnabled) { continue; } // qDebug() << "load plugin " << name << " " << library << " " << keyword; Plugin *plugin = loadPlugin(parent, library, keyword); if (plugin) { plugin->d->m_parentInstance = componentName; plugin->setXMLFile((*pIt).m_relXMLFileName, false, false); plugin->setDOMDocument((*pIt).m_document); parentGUIClient->insertChildClient(plugin); } } }