Plugin: Drop PluginLoader
authorChristian Kamm <mail@ckamm.de>
Thu, 15 Nov 2018 08:24:24 +0000 (09:24 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:25 +0000 (10:58 +0100)
src/common/plugin.cpp
src/common/plugin.h
src/common/vfs.cpp

index a8709a3e29ecc6e894d19aa4fc869511e3e3c758..eb705822f33e51ab3e511406128cabcb5d4e5d6d 100644 (file)
 
 #include "config.h"
 
-#include <QPluginLoader>
-#include <QDir>
-#include <QLoggingCategory>
-
-Q_LOGGING_CATEGORY(lcPluginLoader, "pluginLoader", QtInfoMsg)
-
 namespace OCC {
 
 PluginFactory::~PluginFactory() = default;
 
-QString PluginLoader::pluginName(const QString &type, const QString &name)
+QString pluginFileName(const QString &type, const QString &name)
 {
     return QString(QLatin1String("%1sync_%2_%3"))
             .arg(APPLICATION_EXECUTABLE, type, name);
 }
 
-bool PluginLoader::isAvailable(const QString &type, const QString &name)
-{
-    QPluginLoader loader(pluginName(type, name));
-    return loader.load();
-}
-
-QObject *PluginLoader::load(const QString &type, const QString &name)
-{
-    QString fileName = pluginName(type, name);
-    QPluginLoader pluginLoader(fileName);
-    if (pluginLoader.load()) {
-        qCInfo(lcPluginLoader) << "Loaded plugin" << fileName;
-    } else {
-        qCWarning(lcPluginLoader) << "Could not load plugin"
-                                  << fileName <<":"
-                                  << pluginLoader.errorString()
-                                  << "from" << QDir::currentPath();
-    }
-
-    return pluginLoader.instance();
-}
-
-QObject *PluginLoader::create(const QString &type, const QString &name, QObject *parent)
-{
-    auto factory = qobject_cast<PluginFactory *>(load(type, name));
-    if (!factory) {
-        return nullptr;
-    } else {
-        return factory->create(parent);
-    }
-}
-
 }
index c9f9fc918e606f67037766ed1d074221aa3038fb..df17ccc5c5b4fa0b8f72f96119df431dedb73810 100644 (file)
@@ -20,7 +20,6 @@
 
 #include "ocsynclib.h"
 #include <QObject>
-#include <QPluginLoader>
 
 namespace OCC {
 
@@ -41,15 +40,8 @@ public:
     }
 };
 
-class OCSYNC_EXPORT PluginLoader
-{
-public:
-    static QString pluginName(const QString &type, const QString &name);
-
-    bool isAvailable(const QString &type, const QString &name);
-    QObject *load(const QString &type, const QString &name);
-    QObject *create(const QString &type, const QString &name, QObject *parent = nullptr);
-};
+/// Return the expected name of a plugin, for use with QPluginLoader
+QString pluginFileName(const QString &type, const QString &name);
 
 }
 
index 896b31db021ac179fa76358794ce130d8d86a64a..9809ff4a692d9c1380947df7b06d152d54b21a80 100644 (file)
@@ -19,6 +19,9 @@
 #include "vfs.h"
 #include "plugin.h"
 
+#include <QPluginLoader>
+#include <QLoggingCategory>
+
 using namespace OCC;
 
 Vfs::Vfs(QObject* parent)
@@ -69,7 +72,7 @@ bool OCC::isVfsPluginAvailable(Vfs::Mode mode)
     auto name = modeToPluginName(mode);
     if (name.isEmpty())
         return false;
-    return PluginLoader().load("vfs", name);
+    return QPluginLoader(pluginFileName("vfs", name)).load();
 }
 
 Vfs::Mode OCC::bestAvailableVfsMode()
@@ -82,10 +85,34 @@ Vfs::Mode OCC::bestAvailableVfsMode()
     return Vfs::Off;
 }
 
+Q_LOGGING_CATEGORY(lcPlugin, "plugins", QtInfoMsg)
+
 Vfs *OCC::createVfsFromPlugin(Vfs::Mode mode, QObject *parent)
 {
     auto name = modeToPluginName(mode);
     if (name.isEmpty())
         return nullptr;
-    return qobject_cast<Vfs *>(PluginLoader().create("vfs", name, parent));
+
+    auto pluginPath = pluginFileName("vfs", name);
+    QPluginLoader loader(pluginPath);
+    auto plugin = loader.instance();
+    if (!plugin) {
+        qCWarning(lcPlugin) << "Could not load plugin" << pluginPath << loader.errorString();
+        return nullptr;
+    }
+
+    auto factory = qobject_cast<PluginFactory *>(plugin);
+    if (!factory) {
+        qCWarning(lcPlugin) << "Plugin" << pluginPath << "does not implement PluginFactory";
+        return nullptr;
+    }
+
+    auto vfs = qobject_cast<Vfs *>(factory->create(parent));
+    if (!vfs) {
+        qCWarning(lcPlugin) << "Plugin" << pluginPath << "does not create a Vfs instance";
+        return nullptr;
+    }
+
+    qCInfo(lcPlugin) << "Created VFS instance from plugin" << pluginPath;
+    return vfs;
 }