From a605b7bf740b9ea25dde771b541ebfa4cc44068a Mon Sep 17 00:00:00 2001 From: Andrey Rodionov Date: Tue, 12 May 2020 13:10:22 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/iplugin.cpp | 3 +- src/pluginmanager.cpp | 32 ++++++++----------- src/pluginmanager.h | 12 ++++--- .../tst_pluginmanager/tst_pluginmanager.cpp | 13 +++++--- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/iplugin.cpp b/src/iplugin.cpp index 89d27e9..1d07ddb 100644 --- a/src/iplugin.cpp +++ b/src/iplugin.cpp @@ -10,8 +10,7 @@ IPlugin::IPlugin(const QString& depInterfaces) if (!depPlugin.isEmpty()) pluginManager->nextLoadPlugins(depPlugin); } - if (pluginManager->settings()) - setSettings(pluginManager->settings()); + setSettings(pluginManager->settings()); } IPlugin::~IPlugin() diff --git a/src/pluginmanager.cpp b/src/pluginmanager.cpp index 71d3e7c..7555575 100644 --- a/src/pluginmanager.cpp +++ b/src/pluginmanager.cpp @@ -13,7 +13,6 @@ PluginManager::PluginManager(QObject *parent) : { m_instance = this; m_settings = nullptr; - m_lockFiles = nullptr; m_pluginsDir = QDir(qApp->applicationDirPath() + "/plugins/"); } @@ -42,7 +41,6 @@ PluginManager::~PluginManager() delete plug; plug = interfaceObject("IPlugin"); } - delete [] m_lockFiles; } QSettings *PluginManager::settings() const @@ -69,11 +67,11 @@ QList PluginManager::dependentPlugins(IPlugin *plugin) QHash pluginList; for (QObject *objPlug : m_interfaces.values("IPlugin")) { - IPlugin *plug = qobject_cast(objPlug); - if (plug && plug!=plugin) - for (IPlugin *interfacePlugin : dependPlugins(plug)) - if (plugin == interfacePlugin) - pluginList[objPlug->objectName()] = plug; + IPlugin *dependPlugin = qobject_cast(objPlug); + if (dependPlugin != nullptr && dependPlugin != plugin) { + if (dependPlugins(dependPlugin).contains(plugin)) + pluginList[objPlug->objectName()] = dependPlugin; + } } return pluginList.values(); } @@ -86,11 +84,9 @@ bool PluginManager::loadPlugins() + m_pluginsDir.absolutePath(); return false; } - m_fileList = m_pluginsDir.entryList(QDir::Files); - qint32 count = m_fileList.count(); - m_lockFiles = new bool[count]; - for (qint32 i = 0; i < count; ++i) m_lockFiles[i] = false; + for (const QString &filename : m_pluginsDir.entryList(QDir::Files)) + m_fileList.append({filename, false}); nextLoadPlugins(); emit endLoadingPlugins(); @@ -101,16 +97,14 @@ bool PluginManager::loadPlugins() bool PluginManager::nextLoadPlugins(QString iid) { bool result = false; - for (qint32 fileNum = m_fileList.count()-1; fileNum >= 0 ; --fileNum) - { - if (!m_lockFiles[fileNum]) { - m_lockFiles[fileNum] = true; - bool isLoad = loadPlugin(m_fileList.at(fileNum), iid); - if (!isLoad) - m_lockFiles[fileNum] = false; - result = result || isLoad; + for (FileList &file : m_fileList) { + if (!file.lock) { + file.lock = true; + file.lock = loadPlugin(file.filename, iid); + result = result || file.lock; } } + return result; } diff --git a/src/pluginmanager.h b/src/pluginmanager.h index 5130d3e..7da0363 100644 --- a/src/pluginmanager.h +++ b/src/pluginmanager.h @@ -64,7 +64,7 @@ public: QList dependentPlugins(IPlugin *plugin); //! Получить от каких плагинов зависит - /*! Позволяет получить список плагинов от которых зависит указанный плвгин + /*! Позволяет получить список плагинов от которых зависит указанный плагин */ QList dependPlugins(IPlugin *plugin); @@ -109,6 +109,11 @@ private slots: private: + struct FileList { + QString filename; + bool lock; + }; + //! Экземпляр менеджера плагинов static PluginManager *m_instance; @@ -125,10 +130,7 @@ private: QDir m_pluginsDir; //! Список файлов в каталоге плагина - QStringList m_fileList; - - //! Множество заблокированных файлов - bool *m_lockFiles; + QList m_fileList; }; }} diff --git a/tests/auto/tst_pluginmanager/tst_pluginmanager.cpp b/tests/auto/tst_pluginmanager/tst_pluginmanager.cpp index e0b0fef..1ae2327 100644 --- a/tests/auto/tst_pluginmanager/tst_pluginmanager.cpp +++ b/tests/auto/tst_pluginmanager/tst_pluginmanager.cpp @@ -211,12 +211,15 @@ void tst_PluginManager::loadPlugins() QVERIFY(plugins.at(0) == "tst_plugin3"); QVERIFY( - (plugins.at(1) == "tst_plugin2" - && (plugins.at(2) == "tst_plugin1" || plugins.at(3) == "tst_plugin1")) - || (plugins.at(2) == "tst_plugin2" && plugins.at(3) == "tst_plugin1") + ( plugins.at(1) == "tst_plugin2" && + plugins.at(2) == "tst_plugin4" && + plugins.at(3) == "tst_plugin1" + ) || + ( plugins.at(1) == "tst_plugin4" && ( + ( plugins.at(2) == "tst_plugin1" && plugins.at(3) == "tst_plugin2") || + ( plugins.at(2) == "tst_plugin2" && plugins.at(3) == "tst_plugin1")) + ) ); - - QVERIFY(plugins.at(3) == "tst_plugin1" || plugins.at(3) == "tst_plugin4"); } void tst_PluginManager::settings()