diff --git a/src/lib/plugins/plugins.h b/src/lib/plugins/plugins.h index 9163a195..3f271bb3 100644 --- a/src/lib/plugins/plugins.h +++ b/src/lib/plugins/plugins.h @@ -1,143 +1,142 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2010-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef PLUGINLOADER_H #define PLUGINLOADER_H #include #include #include #include "qzcommon.h" #include "plugininterface.h" -#include "qml/qmlpluginloader.h" class QLibrary; class QPluginLoader; class SpeedDial; struct PluginSpec { QString name; QString description; QString author; QString version; QPixmap icon; bool hasSettings = false; bool operator==(const PluginSpec &other) const { return (this->name == other.name && this->description == other.description && this->author == other.author && this->version == other.version); } }; class FALKON_EXPORT Plugins : public QObject { Q_OBJECT public: struct Plugin { enum Type { Invalid = 0, InternalPlugin, SharedLibraryPlugin, PythonPlugin, QmlPlugin }; Type type = Invalid; QString pluginId; PluginSpec pluginSpec; PluginInterface *instance = nullptr; // InternalPlugin PluginInterface *internalInstance = nullptr; // SharedLibraryPlugin QString libraryPath; QPluginLoader *pluginLoader = nullptr; // Other QVariant data; bool isLoaded() const { return instance; } bool operator==(const Plugin &other) const { return this->type == other.type && this->pluginId == other.pluginId; } }; explicit Plugins(QObject* parent = 0); QList getAvailablePlugins(); bool loadPlugin(Plugin* plugin); void unloadPlugin(Plugin* plugin); void removePlugin(Plugin *plugin); void shutdown(); // SpeedDial SpeedDial* speedDial() { return m_speedDial; } static PluginSpec createSpec(const DesktopFile &metaData); public Q_SLOTS: void loadSettings(); void loadPlugins(); protected: QList m_loadedPlugins; Q_SIGNALS: void pluginUnloaded(PluginInterface* plugin); void refreshedLoadedPlugins(); private: void loadPythonSupport(); Plugin loadPlugin(const QString &id); Plugin loadInternalPlugin(const QString &name); Plugin loadSharedLibraryPlugin(const QString &name); Plugin loadPythonPlugin(const QString &name); bool initPlugin(PluginInterface::InitState state, Plugin *plugin); void initInternalPlugin(Plugin *plugin); void initSharedLibraryPlugin(Plugin *plugin); void initPythonPlugin(Plugin *plugin); void registerAvailablePlugin(const Plugin &plugin); void refreshLoadedPlugins(); void loadAvailablePlugins(); QList m_availablePlugins; QStringList m_allowedPlugins; bool m_pluginsLoaded; SpeedDial* m_speedDial; QList m_internalPlugins; QLibrary *m_pythonPlugin = nullptr; }; Q_DECLARE_METATYPE(Plugins::Plugin) #endif // PLUGINLOADER_H diff --git a/src/lib/plugins/qml/qmlplugin.cpp b/src/lib/plugins/qml/qmlplugin.cpp index 3b6915fe..3aeec86e 100644 --- a/src/lib/plugins/qml/qmlplugin.cpp +++ b/src/lib/plugins/qml/qmlplugin.cpp @@ -1,77 +1,78 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2018 Anmol Gautam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "qmlplugin.h" #include "qmlplugins.h" +#include "qmlpluginloader.h" #include "datapaths.h" #include "desktopfile.h" #include #include QmlPlugin::QmlPlugin() { } Plugins::Plugin QmlPlugin::loadPlugin(const QString &name) { static bool qmlSupportLoaded = false; if (!qmlSupportLoaded) { QmlPlugins::registerQmlTypes(); qmlSupportLoaded = true; } QString fullPath; if (QFileInfo(name).isAbsolute()) { fullPath = name; } else { fullPath = DataPaths::locate(DataPaths::Plugins, QSL("qml/") + name); if (fullPath.isEmpty()) { qWarning() << "Plugin" << name << "not found"; return Plugins::Plugin(); } } Plugins::Plugin plugin; plugin.type = Plugins::Plugin::QmlPlugin; plugin.pluginId = QSL("qml:%1").arg(QFileInfo(name).fileName()); DesktopFile desktopFile(fullPath + QSL("/metadata.desktop")); plugin.pluginSpec = Plugins::createSpec(desktopFile); QString entryPoint = desktopFile.value(QSL("X-Falkon-EntryPoint")).toString(); plugin.data = QVariant::fromValue(new QmlPluginLoader(plugin.pluginSpec.name, fullPath, entryPoint)); return plugin; } void QmlPlugin::initPlugin(Plugins::Plugin *plugin) { Q_ASSERT(plugin->type == Plugins::Plugin::QmlPlugin); const QString name = plugin->pluginSpec.name; auto qmlPluginLoader = plugin->data.value(); if (!qmlPluginLoader) { qWarning() << "Failed to cast from data"; return; } qmlPluginLoader->createComponent(); if (!qmlPluginLoader->instance()) { qWarning().noquote() << "Falied to create component for" << name << "plugin:" << qmlPluginLoader->component()->errorString(); return; } plugin->instance = qobject_cast(qmlPluginLoader->instance()); }