]> Some of my projects - aniplayer.git/commitdiff
Redo PluginManager to support multiple plugin paths
authorAPTX <marek321@gmail.com>
Sun, 26 Feb 2017 14:38:12 +0000 (15:38 +0100)
committerAPTX <marek321@gmail.com>
Sun, 26 Feb 2017 14:38:12 +0000 (15:38 +0100)
On unix the path could be in /usr/lib if the player is installed
or a local path otherwise. This path should be made configurable
when settings are added.

core/player.cpp
core/pluginmanager.cpp
core/pluginmanager.h

index a1e4098006bc7f3d4152f06035fe555d17d5e026..f00f72dcaaeefd46fb19308ba6bd2e4fd85becff 100644 (file)
@@ -196,7 +196,13 @@ void Player::reqisterQmlTypes() {
 }
 
 void Player::loadBackend() {
-  m_pluginManager.setPluginDirectory("backendplugins");
+#ifdef Q_OS_WIN
+  QStringList pluginPaths{"backendplugins"};
+#else
+  QStringList pluginPaths{"/usr/lib/aniplayer/backendplugins",
+                          "backendplugins"};
+#endif
+  m_pluginManager.setPluginDirectories(pluginPaths);
   m_pluginManager.setPluginPrefix("backend");
   m_pluginManager.loadDefaultPlugin();
   m_backend = m_pluginManager.instance<BackendPluginBase>();
index cec097a55b6364b896f522b38dfe921fb2c01910..34328d7fa9e15345be45877c55f16bc7ab4e873a 100644 (file)
@@ -1,19 +1,25 @@
 #include "pluginmanager.h"
 
+#include <QLoggingCategory>
+
+Q_LOGGING_CATEGORY(pluginManagerCategory, "PluginManager")
+
 PluginManager::PluginManager() {}
 
 QString PluginManager::errorString() const { return m_loader.errorString(); }
 
-QString PluginManager::pluginDirectory() const { return m_pluginDirectory; }
+QStringList PluginManager::pluginDirectories() const {
+  return m_pluginDirectories;
+}
 
 QString PluginManager::pluginPrefix() const { return m_pluginPrefix; }
 
-void PluginManager::setPluginDirectory(QString pluginDirectory) {
-  if (m_pluginDirectory == pluginDirectory)
+void PluginManager::setPluginDirectories(QStringList pluginDirectories) {
+  if (m_pluginDirectories == pluginDirectories)
     return;
 
-  m_pluginDirectory = pluginDirectory;
-  emit pluginDirectoryChanged(pluginDirectory);
+  m_pluginDirectories = pluginDirectories;
+  emit pluginDirectoriesChanged(pluginDirectories);
 }
 
 void PluginManager::setPluginPrefix(QString pluginPrefix) {
@@ -29,13 +35,20 @@ bool PluginManager::load(const QString &plugin) {
     if (!m_loader.unload())
       return false;
 
-  QString pluginPath = QString{"%1/%2_%3"}
-                           .arg(m_pluginDirectory)
-                           .arg(m_pluginPrefix)
-                           .arg(plugin);
-  m_loader.setFileName(pluginPath);
+  for (const auto &path : m_pluginDirectories) {
+    const QString pluginPath =
+        QString{"%1/%2_%3"}.arg(path).arg(m_pluginPrefix).arg(plugin);
+    qCInfo(pluginManagerCategory) << "Trying to load plugin" << pluginPath;
+    m_loader.setFileName(pluginPath);
 
-  m_loader.load();
+    if (m_loader.load()) {
+      qCInfo(pluginManagerCategory) << "Load successful";
+      break;
+    }
+  }
+
+  if (!m_loader.isLoaded())
+    qCCritical(pluginManagerCategory) << "Failed to load plugin" << plugin;
 
   return m_loader.isLoaded();
 }
index 245e7d5995b0edbc05e1d8494eb23107d68cb7be..7c65b1717786abe04e31ca046b37df81e2a42a92 100644 (file)
@@ -3,11 +3,12 @@
 
 #include <QObject>
 #include <QPluginLoader>
+#include <QStringList>
 
 class PluginManager : public QObject {
   Q_OBJECT
-  Q_PROPERTY(QString pluginDirectory READ pluginDirectory WRITE
-                 setPluginDirectory NOTIFY pluginDirectoryChanged)
+  Q_PROPERTY(QStringList pluginDirectories READ pluginDirectories WRITE
+                 setPluginDirectories NOTIFY pluginDirectoriesChanged)
   Q_PROPERTY(QString pluginPrefix READ pluginPrefix WRITE setPluginPrefix NOTIFY
                  pluginPrefixChanged)
 public:
@@ -15,7 +16,7 @@ public:
 
   QString errorString() const;
 
-  QString pluginDirectory() const;
+  QStringList pluginDirectories() const;
   QString pluginPrefix() const;
 
   template <typename Interface> Interface *instance() {
@@ -23,7 +24,7 @@ public:
   }
 
 public slots:
-  void setPluginDirectory(QString pluginDirectory);
+  void setPluginDirectories(QStringList pluginDirectories);
   void setPluginPrefix(QString pluginPrefix);
 
   bool load(const QString &plugin);
@@ -32,11 +33,11 @@ public slots:
   void loadDefaultPlugin();
 
 signals:
-  void pluginDirectoryChanged(QString pluginDirectory);
+  void pluginDirectoriesChanged(QStringList pluginDirectories);
   void pluginPrefixChanged(QString pluginPrefix);
 
 private:
-  QString m_pluginDirectory;
+  QStringList m_pluginDirectories;
   QString m_pluginPrefix;
   QPluginLoader m_loader;
 };