From: APTX Date: Sun, 26 Feb 2017 14:38:12 +0000 (+0100) Subject: Redo PluginManager to support multiple plugin paths X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=8fcbcbd7da6080879a0ae0134dfde90d38c7824d;p=aniplayer.git Redo PluginManager to support multiple plugin paths 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. --- diff --git a/core/player.cpp b/core/player.cpp index a1e4098..f00f72d 100644 --- a/core/player.cpp +++ b/core/player.cpp @@ -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(); diff --git a/core/pluginmanager.cpp b/core/pluginmanager.cpp index cec097a..34328d7 100644 --- a/core/pluginmanager.cpp +++ b/core/pluginmanager.cpp @@ -1,19 +1,25 @@ #include "pluginmanager.h" +#include + +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(); } diff --git a/core/pluginmanager.h b/core/pluginmanager.h index 245e7d5..7c65b17 100644 --- a/core/pluginmanager.h +++ b/core/pluginmanager.h @@ -3,11 +3,12 @@ #include #include +#include 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 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; };